<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>kNOw self</title>
  <subtitle>Tsan-Kuang Lee&#39;s Blog</subtitle>
  <link href="https://blog.tklee.org/en/feed.xml" rel="self"/>
  <link href="https://blog.tklee.org/en/"/>
  <updated>2026-08-24T00:00:00Z</updated>
  <id>https://blog.tklee.org/en/</id>
  <author>
    <name>Tsan-Kuang &quot;TK&quot; Lee 李璨光</name>
  </author><entry>
    <title>About</title>
    <link href="https://blog.tklee.org/en/posts/0748-about-關於本站/"/>
    <updated>2026-08-24T07:48:15Z</updated>
    <id>https://blog.tklee.org/en/posts/0748-about-關於本站/</id>
    <content type="html"><![CDATA[
      <p></p>

<div class="post-teaser-box" data-lang="en">
<p>Welcome to Tsan-Kuang &quot;TK&quot; Lee's blog, <strong>kNOw self</strong>. You can read <a href="https://blog.tklee.org/posts/2026-08-17-2307-kNOw-self-%E8%AD%98%E7%84%A1%E5%90%BE/">my other post about the site's namesake and history</a>. This post is an overview of what this blog is about.</p>
<p>For the tutorial of this site's design, please see <a href="https://blog.tklee.org/posts/2026-08-22-2212-site-help-and-usage-guide-%E7%B6%B2%E7%AB%99%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/">Help &amp; Usage Guide</a>.<br />
</p></div><p></p>
<h1>Site Content</h1>
<p>This is a repository of my writing since 1990. Each post is tagged according to <a href="https://blog.tklee.org/tags/">its topics</a>.</p>
<p>My main profession is software engineering; my side profession is music composition; I was immersed and trained in literature and linguistics in higher ed; later in my life I have also undergone profound transformation via meditation. Therefore, the topics I share the most are technology, music, cultural observations and commentary, and personal introspection.</p>
<p>In addition, years of writing and sharing have also prompted some <a href="https://blog.tklee.org/tags/meta-blog/">meta-thinking</a> regarding interactions across media, platforms, and communities.</p>
<h1>Keeping Up with the Times</h1>
<p>Early versions of the site reflected the internet ecology of their times, both in content and meta-content: what I wrote, what I wrote about, why I wrote, how I presented it, and how my writing interacted with the world—all of these have changed over time.</p>
<p>For example, in the infant era of the internet, much of what I wrote was to disseminate <a href="https://blog.tklee.org/posts/1990-01-01-2334-complete-list-of-mozart-s-works-%E8%8E%AB%E6%9C%AD%E7%89%B9%E4%BD%9C%E5%93%81%E7%B8%BD%E8%A1%A8/">information that was not easily accessible to the general public</a>. When the internet later became slightly more widespread, full-text search engines were still not yet mature, and online resources had to be manually compiled into <a href="https://en.wikipedia.org/wiki/Yahoo_Directory">directories</a>. During this period, my content also included <a href="https://blog.tklee.org/posts/1998-06-30-1305-%E8%8E%AB%E6%9C%AD%E7%89%B9%E9%80%A3%E7%B5%90%E5%8F%8A%E8%B3%87%E6%BA%90/">curation of useful web links</a>.</p>
<p>While the web technology kept evolving, I also aspired to contribute to user education in those early days. For example , I wrote about <a href="https://blog.tklee.org/posts/1999-10-14-0508-%E7%94%A8%E9%BB%9E%E5%BF%83-%E4%BF%9D%E8%AD%B7%E6%9C%8B%E5%8F%8B%E7%9A%84%E7%B6%B2%E8%B7%AF%E9%9A%B1%E7%A7%81/">blocking spam emails</a>, <a href="https://blog.tklee.org/posts/1999-10-27-0510-%E5%88%A4%E6%96%B7%E6%98%AF%E5%90%A6%E4%B8%ADpretty-park-exe%E7%97%85%E6%AF%90%E5%8F%8A%E8%A7%A3%E6%AF%90%E6%B3%95/">solutions for specific computer viruses</a>, my <a href="https://blog.tklee.org/posts/2003-01-20-0516-qa-%E5%9C%8B%E4%B8%AD%E9%9F%B3%E6%A8%82%E8%80%81%E5%B8%AB%E4%BE%86%E4%BF%A1%E8%A8%8E%E8%AB%96%E5%AD%B8%E7%94%9F%E6%8A%84%E8%A5%B2%E5%95%8F%E9%A1%8C/">discussion on plagiarism issues</a> with teachers, and my <a href="https://blog.tklee.org/posts/2002-11-01-1536-qa-%E8%8E%AB%E6%9C%AD%E7%89%B9%E6%AD%8C%E5%8A%87%E9%AD%94%E7%AC%9B%E7%9A%84%E8%A7%92%E8%89%B2-%E8%81%B2%E6%A8%82%E5%AE%B6%E5%88%86%E9%A1%9E-%E6%AD%8C%E5%8A%87%E5%88%86%E6%AE%B5%E6%B3%95-%E8%8A%B1%E8%85%94-%E5%A4%9C%E5%90%8E%E8%A9%A0%E5%98%86%E8%AA%BF/">exchanges</a> with students.</p>
<p>Once the full-text search engines became mature enough for the public to find raw information, the focus of my sharing shifted to more complex, integrated content that was harder to find online. For instance, <a href="https://blog.tklee.org/posts/2010-11-24-0850-%E6%97%A9%E6%9C%9F%E4%B8%AD%E6%96%87%E7%B7%A8%E7%A2%BC%E8%BD%89%E6%8F%9B/">solutions</a> for early Chinese character <a href="https://en.wikipedia.org/wiki/Mojibake">encoding issues</a>, <a href="https://blog.tklee.org/posts/2008-09-19-2103-modifiers-across-keyboards/">a driver I wrote for multiple keyboards</a>, how to allow two local users to <a href="https://blog.tklee.org/posts/2015-05-07-0243-x11-multi-seat-running-kde-and-gnome/">use the same computer independently and simultaneously</a>, or the sheet music <a href="https://blog.tklee.org/posts/2009-03-31-0425-practical-tips-for-score-part-preparation/">preparation tips</a> for composers.</p>
<p>Today, as AI can directly solve many problems, I am re-contemplating on what, how, and why I share.</p>
<h1>Site Design Philosophy: Preserving History</h1>
<p>These evolutions have been recorded by the site. It witnesses the changes of the world as well as records my personal growth.</p>
<p>This site preserves this history through a <strong>post-centric</strong> design—everything is a post with a date. For example, this &quot;About&quot; page you are reading is a dated post; if I write a new &quot;About&quot; page, the old post will still be preserved, and the menu will simply link to the new one. The &quot;Contact&quot; form is a post, and the &quot;Help &amp; Usage Guide&quot; is also a post. Posts like these are mostly tagged with the <a href="https://blog.tklee.org/tags/meta-blog/">Meta-Blog</a> topic.</p>
<p>Realistically, my preservation efforts can only cover my own site; many external resources referenced in my posts have long been gone. Fortunately, <a href="https://archive.org/">Archive.org</a> has preserved quite a lot (though not all) for nostalgic archaeologists to dig through.</p>
<p>Therefore, <strong>dead links are preserved as they are</strong>.</p>
<p>Older posts have gone through different editors, systems, platforms, and formats, so they inevitably suffer some loss of form; I am less insistent on preserving this aspect. I also try to correct typos in my own posts whenever possible.</p>
<p>However, the immature content and clumsy writing of my early days are preserved as part of my personal history.</p>
<h1>The Completion Project</h1>
<p>Over the past decade or so, social media has become the primary mode of public communication. I moved most of my intellectual exchanges to social media, resulting in a long hiatus on my own blog.</p>
<p>There are also some articles that I never published.</p>
<p>I intend to gradually migrate those, and keep their actual authoring dates. Such newly collected old articles will be marked &quot;✨ Recently Added&quot; and show up in a recent slot in the post list.</p>
<h1>Interaction and Moderation</h1>
<p>Early on, readers wrote directly to me, and I would re-post our exchanges. In later iterations of the site, readers could leave comments directly, which appeared instantly, making interaction much more convenient.</p>
<p>Over the years, however, this convenience was abused -- spams, scams, and malicious links for password theft filled my comment section. One countermeasure is to require readers to log in with real names before commenting, but such friction would discourage some readers from speaking freely.</p>
<p>Therefore, for this new generation of the system, I ask readers to use a contact form to leave comments. I will moderate the messages before making them public.</p>
<p>I hope such necessary evil is only needed in this transitinoal phase of human civilization when we are still learning to respect and care for one another.<br />
</p>

    ]]></content>
  </entry><entry>
    <title>Site Help &amp; Usage Guide</title>
    <link href="https://blog.tklee.org/en/posts/2212-site-help-and-usage-guide-網站使用指南/"/>
    <updated>2026-08-22T22:12:09Z</updated>
    <id>https://blog.tklee.org/en/posts/2212-site-help-and-usage-guide-網站使用指南/</id>
    <content type="html"><![CDATA[
      

<p>Welcome to my blog! Here are some tips for a better reading experience.</p>
<h2>❓ Help Page</h2>
<p>Clicking the question mark icon (?) in the upper-right corner of the page takes you to this help page. You can return to where you were using your browser's Back function.</p>
<h2>🌐 Language Settings</h2>
<p>Because I write in multiple languages, I ended up translating some of my own posts (they are marked &quot;translated by author&quot;), but often times I couldn't afford to do so. Now with modern technology, I don't have to.</p>
<p>Functionally, this blog is fully bilingual (English and Traditional Chinese), and supports real-time translation into many other languages. You can switch languages at any time using <svg xmlns="http://www.w3.org/2005/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="display: inline; vertical-align: -3px; margin-right: 2px;"><circle cx="12" cy="12" r="10"></circle><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path><path d="M2 12h20"></path></svg> (the globe icon) at the top of the page. By the way, clicking on that icon will minimize the widget for a cleaner layout.</p>
<p>Your last choice of language will stick until you change again.</p>
<h2>☰ Menu</h2>
<p>The hamburger icon ☰ in the upper-left toggles the site menu, granting access to:</p>
<ul>
<li><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="menu-icon"><circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line></svg> Search (powered by Google)</li>
<li><svg xmlns="http://www.w3.org/2005/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="display: inline; vertical-align: -3px; margin-right: 2px;"><circle cx="12" cy="12" r="10"></circle><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path><path d="M2 12h20"></path></svg> Language toggle (see above)</li>
<li><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="menu-icon"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg> Posts (list of posts with summaries, ordered by the time they were added here. Articles written long ago but added recently are marked &quot;✨ Recently Added&quot;)</li>
<li><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="menu-icon"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg> Timeline (chronological list of all posts on a timeline, based on their authoring time)</li>
<li><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="menu-icon"><path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"></path><line x1="7" y1="7" x2="7.01" y2="7"></line></svg> Tags (find posts by topic)</li>
<li><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="menu-icon"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="16" x2="12" y2="12"></line><line x1="12" y1="8" x2="12.01" y2="8"></line></svg> About (background and overview of this generation of the blog)</li>
<li><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="menu-icon"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg> Contact</li>
<li><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="menu-icon"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><line x1="12" y1="17" x2="12.01" y2="17"></line></svg> Help (this page)</li>
<li><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="menu-icon"><path d="M4 11a9 9 0 0 1 9 9"></path><path d="M4 4a16 16 0 0 1 16 16"></path><circle cx="5" cy="19" r="1"></circle></svg> Subscribe (RSS feed)</li>
</ul>
<h2>The Unique Design of This Site</h2>
<p>This site is a repository of my writing since 1990. In my post <a href="https://blog.tklee.org/posts/2026-08-24-0748-about-%E9%97%9C%E6%96%BC%E6%9C%AC%E7%AB%99/">about the site</a>, I explain its design philosophy, topics, history, and how outdated contents are handled.</p>


    ]]></content>
  </entry><entry>
    <title>Contact or Comment</title>
    <link href="https://blog.tklee.org/en/posts/1830-contact-comment-聯絡留言/"/>
    <updated>2026-08-22T18:30:00Z</updated>
    <id>https://blog.tklee.org/en/posts/1830-contact-comment-聯絡留言/</id>
    <content type="html"><![CDATA[
      

<p>To respond to one of my posts, please leave your comments there. For generic communication, please use the form below.</p>


    ]]></content>
  </entry><entry>
    <title>kNOw self</title>
    <link href="https://blog.tklee.org/en/posts/2307-kNOw-self-識無吾/"/>
    <updated>2026-08-17T23:07:00Z</updated>
    <id>https://blog.tklee.org/en/posts/2307-kNOw-self-識無吾/</id>
    <content type="html"><![CDATA[
      

<p>Whether you have followed my writing since 1990 or are just finding it now, welcome to my blog <em>kNOw self</em>.</p>
<p>The name of this incarnation carries a threefold meaning that has anchored my life's journey. First, it is a nod to the ancient Greek philosophy to &quot;<a href="https://en.wikipedia.org/wiki/Know_thyself">know thyself</a>.&quot; Second, it is an invitation for friends to know me better, so that we might build meaningful connections. Finally, it reflects the Buddhist concept of &quot;no self&quot; (<em><a href="https://en.wikipedia.org/wiki/Anatt%C4%81">anattā</a></em>). This is a reminder to embrace the fluid nature of the self, reduce my own ego, and share my journey with interconnected beings everywhere.</p>
<p>In the past decade, my blogging became sporadic. The current of social media had pulled me away from a dedicated, self-managed space. The convenience of exchanging fleeting thoughts in crowded digital squares replaced my long-form reflection. But I now realize the necessity of returning to a self-owned platform. I want a quiet place for me (and readers) to focus on the signal rather than the noise.</p>
<p>This return is accompanied by a technical reset. I have been publishing my writing since 1990, witnessing the entire evolution of our communication mediums. My words have lived through traditional paper media, email lists, newsletters, and BBS, before I rode the wave of Web 1.0, carving out corners in academic mainframe user spaces, <a href="https://en.wikipedia.org/wiki/GeoCities">GeoCities</a>, and pure hand-written HTML on self-hosted servers, eventually syndicating through <a href="https://en.wikipedia.org/wiki/RSS">RSS</a>. Then came Web 2.0—the era of interactive CMS platforms and countless blogging engines—before social media swallowed the web whole.</p>
<p>After wandering through all those generations of platforms, I have finally settled on something refreshingly foundational: static files, powered by a custom rendering engine to cleanly separate the content from the presentation. It is a return to the roots of the web, but with the <a href="https://blog.tklee.org/tags/meta-blog/">experience</a> of decades of software engineering and sharing my writing behind it.</p>
<p>The medium isn't the only thing that has evolved; the landscape of global communication has completely transformed. When I began, navigating the web as a multi-lingual writer was a very different experience. Today, <a href="https://en.wikipedia.org/wiki/Unicode">Unicode</a> is standard, the internet has elevated global English literacy, and machine translation is instantly accessible. My own primary audience has shifted from Chinese to English readers over the years. And my own English proficiency and cultural awareness have also grown a bit.</p>
<p>At the same time, the fundamental utility of writing on the internet has shifted. We now have smart search and AI-driven solutions that can synthesize answers in seconds. Readers' attention spans have shortened drastically, and multimedia is rapidly replacing text consumption. Why write long-form text on a personal site when AI can answer questions and video dominates our screens?</p>
<p>Because the purpose of this space isn't merely to distribute data; it is to share my deeply personal journey of self-observation, self-correction, and ultimately, self-liberation.</p>
<p>This blog is a living record of my growth across all facets of my life: as a software professional and a technology tinkerer; as a composer and a music enthusiast; as a multi-lingual writer navigating nuance; and, most importantly, as a layperson who simply wishes to be a better being tomorrow than I am today.</p>
<p><em>kNOw self</em> is a return to that core pursuit. I am glad to be back on track, and I am glad you are here with me.</p>


    ]]></content>
  </entry><entry>
    <title>Enemy</title>
    <link href="https://blog.tklee.org/en/posts/0716-敵人-enemy/"/>
    <updated>2023-10-11T07:16:00.003Z</updated>
    <id>https://blog.tklee.org/en/posts/0716-敵人-enemy/</id>
    <content type="html"><![CDATA[
      <p></p>

<p>A friend lost one of her family members to the recent war bombing. Others had to leave that disabled member behind.</p>
<p>Taiwan experienced a devastating earthquake in 1999, during which a lot of people also had to leave their loved ones behind in their narrow escape. On top of the loss, they also have to carry the survivor guilt.</p>
<p>Facing natural disasters is part of life and we do not have other choices but to face them, but wars happen because somebody prioritizes their interest over other people's lives. The pain brought by the war is therefore on another level.</p>
<p>Many people's birthday wishes include world peace. Who are we hoping to grant these wishes? I am unaware of any deity who specializes in granting birthday wishes.</p>
<p>Perhaps birthday wishes should not be wishes asked of a genie, but rather, resolutions, like the New Year ones, which are more like goals that we work hard to achieve.</p>
<p>In hoping for the world peace, perhaps we should start from improving our own personal relationships, by at least reducing our hostility toward others, and ourselves.</p>
<p>Today I make a wish to honor that lost life by starting a new journey to reduce my negativity.<br />
</p>

    ]]></content>
  </entry><entry>
    <title>Streaming Custom Videos in Google Hangouts</title>
    <link href="https://blog.tklee.org/en/posts/0635-streaming-custom-videos-in-google-hangouts/"/>
    <updated>2019-04-30T06:35:00.002Z</updated>
    <id>https://blog.tklee.org/en/posts/0635-streaming-custom-videos-in-google-hangouts/</id>
    <content type="html"><![CDATA[
      <p>With this method, I was able to send Google Hangouts any video contents, such as me with a news broadcast background, while the small TV in that background is showing my desktop playing a live Youtube video.</p>
<p><a href="https://obsproject.com/">OBS</a> is a fine tool that enables us to overlay various visual/audio sources, on the fly, for streaming and/or recording. Unfortunately, it doesn't support a virtual cam under Linux (there <em>is</em> <a href="https://github.com/CatxFish/obs-virtual-cam">a plugin</a> that only works under Windows), i.e. I can't send a complex composition of a live desktop screen, webcam, video, etc. to Google Hangouts.</p>
<p><a href="https://webcamoid.github.io/">Webcamoid</a> is another fine tool that supports output to a virtual cam under Linux, which Google Hangouts can directly use.</p>
<p><a href="https://github.com/CatxFish/obs-virtual-cam/issues/17">Several attempts</a> were made, but I wasn't able to get a result with low enough latency for video conferencing. The video latency caused an unacceptable out-of-sync problem with the audio.</p>
<p>I reached an easy workaround, which is resource heavy, but works quite well.</p>
<ol>
<li>Use OBS to construct the target scene, say, a chroma keyed webcam, with a video background, and a logo foreground, as well as a live chat overlay.</li>
<li>In OBS, right click on the preview, and project it under a separate screen.</li>
<li>In Webcamoid, choose that screen as the source.</li>
<li>In Google Hangouts, choose Webcamoid's virtual cam instead of the real webcam.</li>
<li>Voila! Now I have full control of what others see in my video conferencing.</li>
</ol>
<p>This solution needs one whole screen just to link OBS and webcamoid. Any of the following improvement of either project will make this workflow even better:</p>
<ul>
<li>When Webcamoid supports <a href="https://github.com/webcamoid/webcamoid/issues/180">a window as a source</a> (right now only whole screens can be sources), we can hide the window so it doesn't take up our screen real estate.</li>
<li>When OBS can <a href="https://github.com/CatxFish/obs-virtual-cam/issues/17#issuecomment-486121295">correctly piping a video stream into a linux virtual cam</a>, or even better, correctly implements its own virtual cam.</li>
</ul>
<p>Hopefully either will come soon.</p>
<p>Update: now there's an easier way: use OBS's v4l2sink plugin + v4l2loopback kernel module. See this <a href="https://srcco.de/posts/using-obs-studio-with-v4l2-for-google-hangouts-meet.html">article</a>.</p>

    ]]></content>
  </entry><entry>
    <title>uwsgi wrong python interpreter</title>
    <link href="https://blog.tklee.org/en/posts/2102-uwsgi-wrong-python-interpreter/"/>
    <updated>2017-10-13T21:02:00Z</updated>
    <id>https://blog.tklee.org/en/posts/2102-uwsgi-wrong-python-interpreter/</id>
    <content type="html"><![CDATA[
      <p>In some projects, I use uwsgi behind nginx to drive Django. I also use virtualenv to manage my environments (by the way, Panda's introducing .ix and then deprecating it wasn't fun). In a recent update, I was pulling my hair out trying to figure out why I'm getting the following error message, and a wrong Python interpreter.</p>
<pre class="language-text"><code class="language-text">Could not find platform independent libraries 
  
Could not find platform dependent libraries 
  
Consider setting $PYTHONHOME to [:]
  
Python version: 3.5.4 |Continuum Analytics, Inc.| (default, Aug 14 2017, 13:26:58)  [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
  
Set PythonHome to /opt/anaconda
  
Fatal Python error: Py_Initialize: Unable to get the locale encoding
  
ImportError: No module named 'encodings'</code></pre>
<p>It turned out that the problem was in the binary code of uwsgi in my environment. It was compiled for another environment, with the environment path hard-coded in. Yes, in the binary. I had done that in another environment and the compiled package stayed in the pip cache, and the new environment just picked it up from the cache, causing inconsistency!</p>
<p>The solution:</p>
<pre class="language-bash"><code class="language-bash">pip <span class="token function">install</span> --no-cache uwsgi</code></pre>

    ]]></content>
  </entry><entry>
    <title>Ergodox EZ Configurator Layer Manipulation</title>
    <link href="https://blog.tklee.org/en/posts/0300-ergodox-ez-configurator-layer-manipulation/"/>
    <updated>2017-07-12T03:00:00Z</updated>
    <id>https://blog.tklee.org/en/posts/0300-ergodox-ez-configurator-layer-manipulation/</id>
    <content type="html"><![CDATA[
      <p>Ergodox EZ provides a great <a href="http://configure.ergodox-ez.com/keyboard_layouts/qgbavy/edit">configurator</a>; however, it doesn't provide all editing functions I need. Unfortunately, the source code <a href="https://github.com/ErgoDox-EZ/fusion">disappeared</a> from github (multiple unofficial documents have links to that repo so I assume the source was once available; this is rather disappointing, since the company made it <a href="https://ergodox-ez.com/pages/our-firmware">look like</a> that they are using all open source resources.)</p>
<p>One of the functions that I need the most is swapping the layers.</p>
<p>Here's what I did to achieve it:</p>
<p>Upon examining the minimized javascript, it was written against the <a href="https://facebook.github.io/react/">React</a> framework. Therefore, I installed the <a href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en">React debugger extension for chrome</a>, in order to find and manipulate the variable that stores the layer information.</p>
<p>Once the extension is installed, reload the page, and open up the Developer Tools in Chrome.</p>
<p>Click on React to open the debugging panel.</p>
<p>Make sure the correct scope &quot;App&quot; is selected.</p>
<p>Now the variable $r will contain the React object, including the state, for editing.</p>
<p>The layers (including all key assignment) information is in the array: <code>$r.state.layout.layers</code></p>
<p>Here's an example of swapping layer 3 and 4.</p>
<pre class="language-javascript"><code class="language-javascript">$r<span class="token punctuation">.</span>state<span class="token punctuation">.</span>layout<span class="token punctuation">.</span>layers <span class="token operator">=</span> <span class="token punctuation">[</span>
  $r<span class="token punctuation">.</span>state<span class="token punctuation">.</span>layout<span class="token punctuation">.</span>layers<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
  $r<span class="token punctuation">.</span>state<span class="token punctuation">.</span>layout<span class="token punctuation">.</span>layers<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
  $r<span class="token punctuation">.</span>state<span class="token punctuation">.</span>layout<span class="token punctuation">.</span>layers<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
  $r<span class="token punctuation">.</span>state<span class="token punctuation">.</span>layout<span class="token punctuation">.</span>layers<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">,</span>  <span class="token comment">// notice the swapping</span>
  $r<span class="token punctuation">.</span>state<span class="token punctuation">.</span>layout<span class="token punctuation">.</span>layers<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span>  <span class="token comment">// notice the swapping</span>
  $r<span class="token punctuation">.</span>state<span class="token punctuation">.</span>layout<span class="token punctuation">.</span>layers<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
  $r<span class="token punctuation">.</span>state<span class="token punctuation">.</span>layout<span class="token punctuation">.</span>layers<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
  $r<span class="token punctuation">.</span>state<span class="token punctuation">.</span>layout<span class="token punctuation">.</span>layers<span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span></code></pre>
<p>Note that if there are layer switching keys, you'll also need to manually modify those from the GUI.</p>
<p>I also did some batch editing offline, and then re-assign the whole <code>$r.state.layout.layers</code> by first converting the variable to JSON and write it to a local file, with <a href="http://bgrins.github.io/devtools-snippets/#console-save">this snippet</a>.</p>
<p>Also when you copy/create a layer, make sure to use the GUI to first allocate the variable <code>$r.state.layout.layers[x].keyboard_layout_id</code> on their server and then carefully copy those values.</p>
<p>Here's my <a href="http://configure.ergodox-ez.com/keyboard_layouts/qbbndp/edit">current setup</a>, if you are interested.</p>
<p><a href="https://blog.tklee.org/assets/2017-07-12-0300/ergodox_layers_manipulation.png"><img src="https://blog.tklee.org/assets/2017-07-12-0300/ergodox_layers_manipulation.png" alt="" /></a></p>

    ]]></content>
  </entry><entry>
    <title>[QA] Socio-economic class</title>
    <link href="https://blog.tklee.org/en/posts/1657-socio-economic-class-社經地位/"/>
    <updated>2016-08-02T16:57:00Z</updated>
    <id>https://blog.tklee.org/en/posts/1657-socio-economic-class-社經地位/</id>
    <content type="html"><![CDATA[
      

<div class="post-teaser-box" data-lang="en">
A Taiwanese netizen asks about professions with lower socio-economic class (in Taiwan) but with stable income even higher than average people.
</div>
<div class="conversation-other">
Quote from omare:  
Do you know if there are any professions with socio-economic class in the middle or lower, but with stable income even higher than average people? Any gossips?
</div>
<div class="conversation-author">
Almost all the professions that our culture looks down upon can we find wealthy ones. Some examples around me are the funeral industry, resource recycling, fruit farmers, and dairy farmers.
<p>Back then, all the people I knew started from the bottom, but each of them had an entrepreneurial talent. I believe that no matter which industry they were thrown into, they would be able to manage it well.</p>
<p>&quot;Low socio-economic class&quot; is an inaccurate term to use here, since it already implies a low income. However, the term itself ties social and economic status together, actually pointing out the blind spots of our culture, the narrowness of our values, and the contradictions in the ratio of effort and reward between managers and laborers under capitalism.</p>
<p>It is a pity that our culture rarely notices those who live truly peaceful and happy lives. Even if they occasionally make the news, the focus is on the contrast between their low social status, presenting a superficial attitude of &quot;it is rare for someone with low social status to be content and happy.&quot; Unexpectedly, the quality of life of these people is actually beyond the reach of ordinary people.</p>
</div>


    ]]></content>
  </entry><entry>
    <title>Fixing Lenovo U31-70 Wi Fi Problem</title>
    <link href="https://blog.tklee.org/en/posts/0624-fixing-lenovo-u31-70-wifi-problem/"/>
    <updated>2016-02-06T06:24:00Z</updated>
    <id>https://blog.tklee.org/en/posts/0624-fixing-lenovo-u31-70-wifi-problem/</id>
    <content type="html"><![CDATA[
      
<div class="post-teaser-box" data-lang="en">
<p>Lenovo U31-70 is a lightweight laptop. Its Wi Fi performance has been a headache to many people. Most people report unstable signal dropping. For those who use Windows and are experiencing unstable Wi Fi problem, you just need to solve the hardware problem. I use Linux, so I had to go a different route to solve my driver problem.<br />
</p></div><p></p>
<h2>The Hardware Problem</h2>
<p>I opened up the laptop, and found that the two antenna cables were not properly attached to the card. There was a tape (not shown in the picture) trying to keep the two cables attached, but failed due to the tension from the bending; also, the screw to attach the card onto the main board is too close to one of the antenna contacts so it automatically grounds it, making that antenna useless. This is a design problem.</p>
<p><a href="https://blog.tklee.org/assets/2016-02-06-0624/original_wifi_card.jpg"><img src="https://blog.tklee.org/assets/2016-02-06-0624/original_wifi_card.jpg" alt="" /></a></p>
<p>I first re-attached the two cables back to their contacts and re-tape them, and put some non-conductive material between the screw and the contact to prevent the grounding. It helped.</p>
<h2>The Atheros 10K Driver Problem under Linux</h2>
<p>I had used several Thinkpads since its IBM days, so I was quite surprised to have found that this Lenovo's Atheros 10K chip was not supported under Linux. People were reporting stable driver performance under Windows, and some efforts were made to bring the firmware from Windows driver to Linux. I waited a few months for Linux kernel to come to version 4.3 and spent a lot of time trying various hacks to get the driver working. I was never able to get stable performance.</p>
<p>I decided to replace the card with Intel Dual Band Wireless AC 3160, which is well supported by native Linux.</p>
<p><a href="https://blog.tklee.org/assets/2016-02-06-0624/replaced_wifi.jpg"><img src="https://blog.tklee.org/assets/2016-02-06-0624/replaced_wifi.jpg" alt="" /></a></p>
<p>(I have no idea which antenna cable is intended for Wi Fi and which is for bluetooth, but this works for me; besides, tension-wise, this is the only way I could keep the contacts isolated.)</p>
<p>It has been working flawlessly.<br />
</p>
<div class="post-comments" style="margin-top: 4rem; padding-top: 2rem; border-top: 2px dashed var(--glass-border);">
<h3 class="comments-title" style="font-size: 1.5rem; margin-bottom: 2rem; color: var(--primary-color); text-shadow: 0 0 10px rgba(56,189,248,0.2);">Comments</h3>

<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11849094639209265284" target="_blank" rel="nofollow">Rui Ramos</a></strong> <span class="comment-date" style="opacity: 0.7;">on Sunday, July 21, 2019 at 10:25:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Hi there,</p><p></p>
<p>I am doing the same thing.<br />
But I have found 2 models of 3160:</p>
<ul>
<li>NGW</li>
<li>NGFF<br />
How can I know which is right for my u31-70?</li>
</ul>
<p>Thank you.</p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-author"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11411703278692679285" target="_blank" rel="nofollow">TK</a></strong> <span class="comment-date" style="opacity: 0.7;">on Tuesday, July 23, 2019 at 3:32:00 PM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>If you click on the photo that shows the new card, it's the NGW version. I have no idea what the differences are between the two models. I'm using the NGW and it works. Good luck.</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11849094639209265284" target="_blank" rel="nofollow">Rui Ramos</a></strong> <span class="comment-date" style="opacity: 0.7;">on Tuesday, July 23, 2019 at 5:04:00 PM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Yup, I see it now.<br /><br />
I will test mine when it gets home.<br /><br />
Thank you!</p><p></p>
<p></p></div><br />
</div><p></p>
</div>

    ]]></content>
  </entry><entry>
    <title>Coordinate Transformation Matrix for Touchscreen in multi-screen setup in X11</title>
    <link href="https://blog.tklee.org/en/posts/0831-coordinate-transformation-matrix-for-touchscreen-in-multi-screen-setup-in-x11/"/>
    <updated>2016-01-30T08:31:00.002Z</updated>
    <id>https://blog.tklee.org/en/posts/0831-coordinate-transformation-matrix-for-touchscreen-in-multi-screen-setup-in-x11/</id>
    <content type="html"><![CDATA[
      <p>Currently I have a twin screen setup in Arch Linux, like this:</p>
<p><a href="https://blog.tklee.org/assets/2016-01-30-0831/arrangement_of_screens.png"><img src="https://blog.tklee.org/assets/2016-01-30-0831/arrangement_of_screens.png" alt="" /></a></p>
<p>On the left, DELL 1901FP is turned 90 degree counter-clockwise in its portrait mode. On the right, DELL P2314T, a touch screen, is in its regular landscape orientation, with its bottom line aligning with the bottom of the rotated screen on the left.</p>
<p>Here's my xorg.conf for that. (Although one can also setup screen arrangement in KDE/Plasma/Gnome/etc., for KDM/SDDM/GDM/etc. to recognize it in the login screen, it's important to put this in xorg.conf)</p>
<pre class="language-apacheconf"><code class="language-apacheconf"><span class="token comment"># /etc/X11/xorg.conf</span>
<span class="token comment"># relevant section of screen rotation</span>
Section <span class="token string">"Screen"</span>
Identifier     <span class="token string">"Screen0"</span>
Device         <span class="token string">"Device0"</span>
Monitor        <span class="token string">"Monitor0"</span>
DefaultDepth    24
Option         <span class="token string">"Stereo" "0"</span>
Option         <span class="token string">"nvidiaXineramaInfoOrder" "DFP-2"</span>
Option         <span class="token string">"metamodes" "DVI-I-1: 1280x1024_75 +0+0 {rotation=right}, HDMI-0: nvidia-auto-select +1024+200"</span>
Option         <span class="token string">"SLI" "Off"</span>
Option         <span class="token string">"MultiGPU" "Off"</span>
Option         <span class="token string">"BaseMosaic" "off"</span>
SubSection     <span class="token string">"Display"</span>
Depth       24
EndSubSection
EndSection</code></pre>
<p>X11 sees a <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>1024</mn><mo>+</mo><mn>1920</mn><mo stretchy="false">)</mo><mtext> wide</mtext><mo>×</mo><mn>1280</mn><mtext> high</mtext></mrow><annotation encoding="application/x-tex">(1024+1920) \text{ wide} \times 1280 \text{ high}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mord">9</span><span class="mord">2</span><span class="mord">0</span><span class="mclose">)</span><span class="mord text"><span class="mord"> wide</span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mord">2</span><span class="mord">8</span><span class="mord">0</span><span class="mord text"><span class="mord"> high</span></span></span></span></span> DISPLAY, with an upper-right corner being invisible.</p>
<p>Since the touchscreen is just a regular pointer device (through its driver), when I put my finger on the left border of the touchscreen on the right, the cursor goes all the way to the very left of the DISPLAY. Touchscreen is only useful if the cursor follows my finger. Therefore, we need to do some Input Coordinate Transformation.</p>
<p><a href="https://wiki.ubuntu.com/X/InputCoordinateTransformation">Coordinate Transformation Matrix</a> is precisely the needed configuration.</p>
<p>From the documentation above, our goal is to map the following coordinates <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x, y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span> on the left (X11's default behavior) to the ones on the right:</p>
<p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.15999999999999992em" columnalign="right left center right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mn>0</mn><mo separator="true">,</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>0</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⇒</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mn>1024</mn><mo separator="true">,</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>1280</mn><mo>−</mo><mn>1080</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mn>1024</mn><mo>+</mo><mn>1920</mn><mo>−</mo><mn>1</mn><mo separator="true">,</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>1280</mn><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⇒</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mn>1024</mn><mo>+</mo><mn>1920</mn><mo>−</mo><mn>1</mn><mo separator="true">,</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>1280</mn><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mn>1024</mn><mo>+</mo><mn>1920</mn><mo>−</mo><mn>1</mn><mo separator="true">,</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>0</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⇒</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mn>1024</mn><mo>+</mo><mn>1920</mn><mo>−</mo><mn>1</mn><mo separator="true">,</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>1280</mn><mo>−</mo><mn>1080</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mn>0</mn><mo separator="true">,</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>1280</mn><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⇒</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mn>1024</mn><mo separator="true">,</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>1280</mn><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{array}{r l c r l}
(0, &amp; 0) &amp; \Rightarrow &amp; (1024, &amp; 1280-1080) \\
(1024+1920-1, &amp; 1280-1) &amp; \Rightarrow &amp; (1024+1920-1, &amp; 1280-1) \\
(1024+1920-1, &amp; 0) &amp; \Rightarrow &amp; (1024+1920-1, &amp; 1280-1080) \\
(0, &amp; 1280-1) &amp; \Rightarrow &amp; (1024, &amp; 1280-1)
\end{array}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:4.800000000000001em;vertical-align:-2.1500000000000004em;"></span><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.6500000000000004em;"><span style="top:-4.8100000000000005em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">0</span><span class="mpunct">,</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">9</span><span class="mord">2</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mpunct">,</span></span></span><span style="top:-2.4099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">9</span><span class="mord">2</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mpunct">,</span></span></span><span style="top:-1.2099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">0</span><span class="mpunct">,</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.1500000000000004em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.6500000000000004em;"><span style="top:-4.8100000000000005em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span><span class="mclose">)</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span><span class="mord">8</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span><span style="top:-2.4099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span><span class="mclose">)</span></span></span><span style="top:-1.2099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span><span class="mord">8</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.1500000000000004em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.6500000000000004em;"><span style="top:-4.8100000000000005em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">⇒</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">⇒</span></span></span><span style="top:-2.4099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">⇒</span></span></span><span style="top:-1.2099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">⇒</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.1500000000000004em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.6500000000000004em;"><span style="top:-4.8100000000000005em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span><span class="mpunct">,</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">9</span><span class="mord">2</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mpunct">,</span></span></span><span style="top:-2.4099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">9</span><span class="mord">2</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mpunct">,</span></span></span><span style="top:-1.2099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span><span class="mpunct">,</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.1500000000000004em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.6500000000000004em;"><span style="top:-4.8100000000000005em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span><span class="mord">8</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">8</span><span class="mord">0</span><span class="mclose">)</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span><span class="mord">8</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span><span style="top:-2.4099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span><span class="mord">8</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">8</span><span class="mord">0</span><span class="mclose">)</span></span></span><span style="top:-1.2099999999999997em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span><span class="mord">8</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.1500000000000004em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span></span></span></p>
<p>So that means we are solving the following system:</p>
<p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mrow><mo fence="true">[</mo><mtable rowspacing="0.15999999999999992em" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>a</mi><mn>1</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>b</mi><mn>1</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>c</mi><mn>1</mn></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>a</mi><mn>2</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>b</mi><mn>2</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>c</mi><mn>2</mn></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>a</mi><mn>3</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>b</mi><mn>3</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>c</mi><mn>3</mn></msub></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow><mrow><mo fence="true">[</mo><mtable rowspacing="0.15999999999999992em" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>2943</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>2943</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1279</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1279</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow><mo>=</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.15999999999999992em" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1024</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>2943</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>2943</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1024</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>200</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1279</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>200</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1279</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow></mrow><annotation encoding="application/x-tex">\begin{bmatrix}
a_1 &amp; b_1 &amp; c_1 \\
a_2 &amp; b_2 &amp; c_2 \\
a_3 &amp; b_3 &amp; c_3
\end{bmatrix}
\begin{bmatrix}
0 &amp; 2943 &amp; 2943 &amp; 0 \\
0 &amp; 1279 &amp; 0    &amp; 1279 \\
1 &amp; 1    &amp; 1    &amp; 1
\end{bmatrix}
=
\begin{bmatrix}
1024 &amp; 2943 &amp; 2943 &amp; 1024 \\
200  &amp; 1279 &amp;  200 &amp; 1279 \\
1 &amp; 1    &amp; 1    &amp; 1
\end{bmatrix}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0510099999999998em;"><span style="top:-2.2500000000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎣</span></span></span><span style="top:-2.8099900000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-4.05101em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎡</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55002em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0510099999999998em;"><span style="top:-2.2500000000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎦</span></span></span><span style="top:-2.8099900000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-4.05101em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎤</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55002em;"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0510099999999998em;"><span style="top:-2.2500000000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎣</span></span></span><span style="top:-2.8099900000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-4.05101em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎡</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55002em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">9</span><span class="mord">4</span><span class="mord">3</span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span><span class="mord">7</span><span class="mord">9</span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">9</span><span class="mord">4</span><span class="mord">3</span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span><span class="mord">7</span><span class="mord">9</span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0510099999999998em;"><span style="top:-2.2500000000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎦</span></span></span><span style="top:-2.8099900000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-4.05101em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎤</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55002em;"><span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.6010299999999997em;vertical-align:-1.55002em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0510099999999998em;"><span style="top:-2.2500000000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎣</span></span></span><span style="top:-2.8099900000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-4.05101em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎡</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55002em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">0</span><span class="mord">0</span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">9</span><span class="mord">4</span><span class="mord">3</span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span><span class="mord">7</span><span class="mord">9</span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">9</span><span class="mord">4</span><span class="mord">3</span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">0</span><span class="mord">0</span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span><span class="mord">7</span><span class="mord">9</span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0510099999999998em;"><span style="top:-2.2500000000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎦</span></span></span><span style="top:-2.8099900000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-4.05101em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎤</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55002em;"><span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>Here's the solution and the approximate float values:</p>
<p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.24999999999999992em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mo fence="true">[</mo><mtable rowspacing="0.15999999999999992em" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>a</mi><mn>1</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>b</mi><mn>1</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>c</mi><mn>1</mn></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>a</mi><mn>2</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>b</mi><mn>2</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>c</mi><mn>2</mn></msub></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>a</mi><mn>3</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>b</mi><mn>3</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>c</mi><mn>3</mn></msub></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.15999999999999992em" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mn>1919</mn><mn>2943</mn></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1024</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mn>1079</mn><mn>1279</mn></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>200</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>≈</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.15999999999999992em" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0.652055725450221</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1024</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0.843627834245504</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>200</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}
\begin{bmatrix}
a_1 &amp; b_1 &amp; c_1 \\
a_2 &amp; b_2 &amp; c_2 \\
a_3 &amp; b_3 &amp; c_3
\end{bmatrix}
&amp;=
\begin{bmatrix}
\frac{1919}{2943} &amp; 0                 &amp; 1024 \\
0                 &amp; \frac{1079}{1279} &amp; 200 \\
0                 &amp; 0                 &amp; 1
\end{bmatrix}
\\
&amp;\approx
\begin{bmatrix}
0.652055725450221 &amp; 0                 &amp; 1024 \\
0                 &amp; 0.843627834245504 &amp; 200  \\
0                 &amp; 0                 &amp; 1
\end{bmatrix}
\end{aligned}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:7.811246em;vertical-align:-3.6556229999999994em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.155623em;"><span style="top:-6.155623em;"><span class="pstrut" style="height:4.055108em;"></span><span class="mord"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0510099999999998em;"><span style="top:-2.2500000000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎣</span></span></span><span style="top:-2.8099900000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-4.05101em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎡</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55002em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0510099999999998em;"><span style="top:-2.2500000000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎦</span></span></span><span style="top:-2.8099900000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-4.05101em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎤</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55002em;"><span></span></span></span></span></span></span></span></span></span><span style="top:-2.249505em;"><span class="pstrut" style="height:4.055108em;"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.6556229999999994em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.155623em;"><span style="top:-6.155623em;"><span class="pstrut" style="height:4.055108em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0510099999999998em;"><span style="top:-2.2500000000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎣</span></span></span><span style="top:-2.8099900000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-4.05101em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎡</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55002em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0551079999999997em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mord mtight">9</span><span class="mord mtight">4</span><span class="mord mtight">3</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">9</span><span class="mord mtight">1</span><span class="mord mtight">9</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-3.0048919999999995em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span><span style="top:-1.8048919999999995em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5551080000000006em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0551079999999997em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span><span style="top:-3.0048919999999995em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">2</span><span class="mord mtight">7</span><span class="mord mtight">9</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">0</span><span class="mord mtight">7</span><span class="mord mtight">9</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-1.8048919999999995em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5551080000000006em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0551079999999997em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span></span></span><span style="top:-3.0048919999999995em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">0</span><span class="mord">0</span></span></span><span style="top:-1.8048919999999995em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5551080000000006em;"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0510099999999998em;"><span style="top:-2.2500000000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎦</span></span></span><span style="top:-2.8099900000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-4.05101em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎤</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55002em;"><span></span></span></span></span></span></span></span></span></span><span style="top:-2.249505em;"><span class="pstrut" style="height:4.055108em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0510099999999998em;"><span style="top:-2.2500000000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎣</span></span></span><span style="top:-2.8099900000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎢</span></span></span><span style="top:-4.05101em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎡</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55002em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span><span class="mord">.</span><span class="mord">6</span><span class="mord">5</span><span class="mord">2</span><span class="mord">0</span><span class="mord">5</span><span class="mord">5</span><span class="mord">7</span><span class="mord">2</span><span class="mord">5</span><span class="mord">4</span><span class="mord">5</span><span class="mord">0</span><span class="mord">2</span><span class="mord">2</span><span class="mord">1</span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span><span class="mord">.</span><span class="mord">8</span><span class="mord">4</span><span class="mord">3</span><span class="mord">6</span><span class="mord">2</span><span class="mord">7</span><span class="mord">8</span><span class="mord">3</span><span class="mord">4</span><span class="mord">2</span><span class="mord">4</span><span class="mord">5</span><span class="mord">5</span><span class="mord">0</span><span class="mord">4</span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em;"><span style="top:-4.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span></span></span><span style="top:-3.0099999999999993em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">0</span><span class="mord">0</span></span></span><span style="top:-1.8099999999999994em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.5500000000000007em;"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0510099999999998em;"><span style="top:-2.2500000000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎦</span></span></span><span style="top:-2.8099900000000004em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎥</span></span></span><span style="top:-4.05101em;"><span class="pstrut" style="height:3.1550000000000002em;"></span><span class="delimsizinginner delim-size4"><span>⎤</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55002em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.6556229999999994em;"><span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>Now we can put these numbers into the configuration, as the document instructed.</p>
<pre class="language-bash"><code class="language-bash"><span class="token comment"># This does NOT work</span>
xinput set-prop <span class="token string">"Advanced Silicon S.A CoolTouch(TM) System"</span> <span class="token parameter variable">--type</span><span class="token operator">=</span>float <span class="token string">"Coordinate Transformation Matrix"</span> .652056 <span class="token number">0</span> <span class="token number">1024</span> <span class="token number">0</span> .8436278 <span class="token number">200</span> <span class="token number">0</span> <span class="token number">0</span> <span class="token number">1</span></code></pre>
<p>However, it doesn't work. The cursor stays on the lower right. After some debugging, I found the offsets 1024 and 200 were the culprit. They need to be a percentage, i.e. relative to the full width and height:</p>
<p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.24999999999999992em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mfrac><mn>1024</mn><mrow><mn>1024</mn><mo>+</mo><mn>1920</mn></mrow></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mn>0.3478261</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mfrac><mn>200</mn><mn>1280</mn></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mn>0.15625</mn></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}
\dfrac{1024}{1024+1920} &amp;= 0.3478261 \\[1em]
\dfrac{200}{1280} &amp;= 0.15625
\end{aligned}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:5.288880000000001em;vertical-align:-2.394440000000001em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.89444em;"><span style="top:-4.8944399999999995em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord">1</span><span class="mord">9</span><span class="mord">2</span><span class="mord">0</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693300000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-1.9129999999999994em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span><span class="mord">8</span><span class="mord">0</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">0</span><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.394440000000001em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.89444em;"><span style="top:-4.8944399999999995em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">3</span><span class="mord">4</span><span class="mord">7</span><span class="mord">8</span><span class="mord">2</span><span class="mord">6</span><span class="mord">1</span></span></span><span style="top:-1.9129999999999994em;"><span class="pstrut" style="height:3.32144em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">1</span><span class="mord">5</span><span class="mord">6</span><span class="mord">2</span><span class="mord">5</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.394440000000001em;"><span></span></span></span></span></span></span></span></span></span></span></span></p>
<pre class="language-bash"><code class="language-bash"><span class="token comment"># This works</span>
xinput set-prop <span class="token string">"Advanced Silicon S.A CoolTouch(TM) System"</span> <span class="token parameter variable">--type</span><span class="token operator">=</span>float <span class="token string">"Coordinate Transformation Matrix"</span> .652056 <span class="token number">0</span> .3478261 <span class="token number">0</span> .8436278 .15625 <span class="token number">0</span> <span class="token number">0</span> <span class="token number">1</span></code></pre>
<p>I put it in <code>/usr/share/sddm/scripts/Xsetup</code> (or <code>/usr/share/config/kdm/Xsetup</code> if you haven't upgraded to plasma) as well as <code>~/.xprofile</code> so it automatically runs every time.</p>
<p>Edit 2016-02-22: I ended up having 3 screens with two in the portrait orientation. SDDM correctly uses metamodes setting in xorg.conf, regardless of the screen power. However, KDE is more sensitive to that so sometimes the layout is messed up. Here's a script to quickly correct that.</p>
<pre class="language-bash"><code class="language-bash"><span class="token shebang important">#!/bin/sh</span>
<span class="token comment"># my xorg.conf has this line:</span>
<span class="token comment"># Option "metamodes" "DVI-I-1: 1280x1024_75 +0+0 {rotation=right}, HDMI-0: nvidia-auto-select +2944+0 {rotation=right}, DP-1: nvidia-auto-select +1024+200"</span>

gksu <span class="token string">"xrandr --output DP-1 --primary --auto --pos 1024x200 --output DVI-I-1 --auto --pos 0x0 --rotation right --output HDMI-0 --auto --pos 2944x0 --rotation right"</span></code></pre>

    ]]></content>
  </entry><entry>
    <title>Install Sibelius 8.0.1 on a non-C drive in Windows</title>
    <link href="https://blog.tklee.org/en/posts/2243-install-sibelius-8-0-1-on-a-non-c-drive-in-windows/"/>
    <updated>2015-10-19T22:43:00.002Z</updated>
    <id>https://blog.tklee.org/en/posts/2243-install-sibelius-8-0-1-on-a-non-c-drive-in-windows/</id>
    <content type="html"><![CDATA[
      <p>Since Sibelius 8.0.0, Avid changed the installer, and it has a serious bug -- it assumes you have a <code>C:</code> drive before letting you choose the installation destination. I figured out <a href="https://blog.tklee.org/posts/2015-08-05-2359-sibelius-8-installation-on-non-standard-windows-system-drive/">a hack to install it</a>. However, it doesn't work for Sibelius 8.0.1, so here's another way to approach it, before Avid's Sibelius team fixes the bug.</p>
<p>I don't have a <code>C:</code> drive, but Sibelius insists that I must do, so what we are trying to do here is to temporarily create a <code>C:</code> drive, and then create a link pointing crucial directories back to my system drive, K:. After Sibelius is successfully installed, we can then safely remove the temporary <code>C:</code> drive.</p>
<p>First, we need to create a Virtual Hard Drive (VHD) as our <code>C:\</code> drive. I learned how to do this via <a href="https://stackoverflow.com/a/18112515/701284">this answer</a>:</p>
<ul>
<li>Start → run → diskmgmt.msc (accept all defaults... I'm not doing anything special below)</li>
<li>From the menu bar select Action → Create VHD</li>
<li>Choose the location and name the file (which will be the vhd) and specify the size and click OK. My file is <code>K:\virtual_drive_c.vhd</code> and the size is 1G, but I made it dynamic so it's actual size is around 16MB.</li>
<li>Right click on the Disk # (underneath will be Unknown and the size and &quot;Not Initialized&quot;). Select &quot;Initialize Disk&quot; and click OK</li>
<li>Right click on the black bar of the unallocated disk space and select &quot;new simple volume&quot;. A wizard opens up an on the second page it lets you assign the drive letter. We want <code>C:</code> here. Complete the wizard and you're done!</li>
</ul>
<p>Now that we have a <code>C:</code> drive, we can link the important folders. I learned how to do that from <a href="http://www.sevenforums.com/tutorials/278262-mklink-create-use-links-windows.html">this post</a>:</p>
<ul>
<li>Start → run → cmd, then right click and choose &quot;Run as Administrator&quot;.</li>
<li>In the prompt, type the following:</li>
</ul>
<pre class="language-cmd"><code class="language-cmd">K:\>mklink /j "C:\Program Files" "K:\Program Files"
Junction created for C:\Program Files <<===>> K:\Program Files

K:\>mklink /j "C:\Program Files (x86)" "K:\Program Files (x86)"
Junction created for C:\Program Files (x86) <<===>> K:\Program Files (x86)</code></pre>
<p>After that, Sibelius installation should run normally. In the installer, I still choose to install the program to K:, to avoid future problems running Sibelius, since the bug is on the installer, not Sibelius itself.</p>
<p>Afterwards, you can reboot, and safely delete the vhd file.</p>

    ]]></content>
  </entry><entry>
    <title></title>
    <link href="https://blog.tklee.org/en/posts/0519-大易二十七年-行列二十七小時/"/>
    <updated>2015-09-24T05:19:00Z</updated>
    <id>https://blog.tklee.org/en/posts/0519-大易二十七年-行列二十七小時/</id>
    <content type="html"><![CDATA[
      

    ]]></content>
  </entry><entry>
    <title>Sibelius 8 Installation on Non-standard Windows System Drive</title>
    <link href="https://blog.tklee.org/en/posts/2359-sibelius-8-installation-on-non-standard-windows-system-drive/"/>
    <updated>2015-08-05T23:59:00.001Z</updated>
    <id>https://blog.tklee.org/en/posts/2359-sibelius-8-installation-on-non-standard-windows-system-drive/</id>
    <content type="html"><![CDATA[
      <p>UPDATE: This doesn't work for Sibelius 8.0.1. See <a href="https://blog.tklee.org/posts/2015-10-19-2243-install-sibelius-8-0-1-on-a-non-c-drive-in-windows/">this post</a> instead for that.</p>
<p>Over the years I have many generations of audio software and plugins installed on Windows, which itself has gone through many version upgrades. I can't remember why but one upgrade called for changing the system drive from C: to K: (probably for a backup reason), and ever since then K: has been my system drive.</p>
<p>Between projects, I decided to give Sibelius 8 a try. However, the installation file (<code>Install_Sibelius.exe</code>, unpacked from <code>Sibelius_8.0.0_Win.zip</code>) downloaded from Avid gave me this error:</p>
<p><code>Error 1327 invalid drive C:\.</code></p>
<p>By inspecting the log, I concluded that was hard-coded in the installer (FAIL! To tell the truth, it has been a familiar feeling ever since Avid acquired Sibelius).</p>
<p>I really don't want to change the system drive again, since it would involve the painful process of re-configuring a million things. It's also after their support hours so I did some <a href="http://avid.force.com/pkb/articles/en_US/How_To/Sibelius-Silent-Install-Procedure">research</a>, and after some trial and error, this is what worked for me:</p>
<ol>
<li>run cmd.exe as Administrator.</li>
<li>Change into the directory where Install_Sibelius.exe resides</li>
<li>Run the following command</li>
</ol>
<p><code>J:\Users\composer\Desktop&gt;J:\Install_Sibelius.exe /s /v&quot;/qn /l*v %temp%\AvidSibeliusx64.log&quot;</code></p>
<ol start="4">
<li>Follow the standard procedure to activate the software</li>
</ol>
<p>That's it.</p>
<p>PS: I very much look forward to <a href="http://blog.steinberg.net/2015/06/development-diary-part-11/">Daniel Spreadbury's new score writer</a>.</p>
<div class="post-comments" style="margin-top: 4rem; padding-top: 2rem; border-top: 2px dashed var(--glass-border);">
<h3 class="comments-title" style="font-size: 1.5rem; margin-bottom: 2rem; color: var(--primary-color); text-shadow: 0 0 10px rgba(56,189,248,0.2);">Comments</h3>

<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/14976089532177772917" target="_blank" rel="nofollow">Ralph</a></strong> <span class="comment-date" style="opacity: 0.7;">on Monday, August 19, 2019 at 6:16:00 PM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>I'm still getting this error every time I need to update Sibelius.  It doesn't like ANY of the windows locations (e.g. DOcuments, Photos, Music) being mapped to a NAS drive.  It is massively frustrating and doesn't apply to any other piece of software I use!</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-author"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11411703278692679285" target="_blank" rel="nofollow">TK</a></strong> <span class="comment-date" style="opacity: 0.7;">on Tuesday, August 27, 2019 at 12:12:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>This seems to be such a common requirement and yet they still haven't fixed the installation process.</p><p></p>
<p>However, I do have my score files on a NAS over the years but haven't got problems accessing them. What error messages are you getting?</p>
<p></p></div><br />
</div><p></p>
</div>

    ]]></content>
  </entry><entry>
    <title>X11 Multi-seat running KDE and GNOME</title>
    <link href="https://blog.tklee.org/en/posts/0243-x11-multi-seat-running-kde-and-gnome/"/>
    <updated>2015-05-07T02:43:00Z</updated>
    <id>https://blog.tklee.org/en/posts/0243-x11-multi-seat-running-kde-and-gnome/</id>
    <content type="html"><![CDATA[
      <p>I was archiving data on my old machine and decided to share my old multi-seat configurations (I don't need multi-seat anymore), in case somebody out there is trying to do the same thing.</p>
<p>It was a 7-year-old Dell PowerEdge server SC-1430 running dual Xeon (8 virtual cores), excellent for compiling, number crunching (machine learning), and video processing (Cinelerra), and on top of all that, it served as a file/media server running RAID 5 over RAID 0.</p>
<p>It was a power beast, in another sense, too, though -- it consumed a lot of power.</p>
<p>Since it was consuming power anyway, I decided to get rid of other computers and maximize its use, by setting up a multi-seat X11, so two users could use it at the same time. There were two sets of everything: two screens (on two NVIDIA cards), two keyboards, two mouses, and two USB sound cards. It worked just like two independent machines. In fact, one seat ran KDE and the other one ran GNOME. The login screen ran KDM, with two login boxes (default to the regular user login name) on respective screens and matching wallpapers. We were even able to play &quot;networked&quot; game against each other.</p>
<p>(Actually I had three sets of xorg.conf to support multi-seat, left-side dual screen, and right-side dual screen, and I used symlinks to dynamically switch to a different configuration. However, there's more info on dual screen setups out there so I skipped those here.)</p>
<p>For me, there were a few files to configure. These are the ones relevant to most people:</p>
<ul>
<li>/etc/X11/xorg.conf</li>
<li>/etc/kde/kdm/kdmrc</li>
<li>/etc/kde/kdm/backgroundrc.seat0</li>
<li>/etc/kde/kdm/backgroundrc.seat1</li>
<li>/etc/udev/rules.d/60-dell-keyboards.rules (omit here; see my <a href="https://blog.tklee.org/posts/2011-09-25-0400-create-distinguishable-device-ids-for-two-dell-keyboards/">other post on udev</a> for that)</li>
<li>/etc/udev/rules.d/90-creative-xmod.rules</li>
</ul>
<p>For the sound cards, I just used the GUI setup in KDM and Gnome, respectively, to choose the right pulse audio sound device. I did use the udev to make the names easier to tell them apart.</p>
<p>I ran Arch Linux 64 on that one so the paths may be different if you use a different distro. I apologize in advance for not explaining the details here, many of which were specific to my system back then. I also wish I had time to dig out the document sources for these configs.</p>
<details>
<summary>/etc/X11/xorg.conf</summary>
<pre class="language-apacheconf"><code class="language-apacheconf"><span class="token comment"># File: /etc/X11/xorg.conf</span>

<span class="token comment"># nvidia-settings: X configuration file generated by nvidia-settings</span>
<span class="token comment"># nvidia-settings:  version 280.11  (mockbuild@hephaestus.wilsonet.com)  Sun Jul 31 18:18:43 EDT 2011</span>

<span class="token comment">#Section "ServerLayout"</span>
<span class="token comment">#    Identifier     "Layout0"</span>
<span class="token comment">#    Screen      0  "Screen0" 0 0</span>
<span class="token comment">#    Screen      1  "Screen1" RightOf "Screen0"</span>
<span class="token comment">#    InputDevice    "Keyboard0" "CoreKeyboard"</span>
<span class="token comment">#    InputDevice    "Mouse0" "CorePointer"</span>
<span class="token comment">#    Option         "Xinerama" "0"</span>
<span class="token comment">#EndSection</span>

Section <span class="token string">"ServerLayout"</span>
Identifier     <span class="token string">"Seat0"</span>
Screen      0  <span class="token string">"Screen0"</span> 0 0
InputDevice    <span class="token string">"Keyboard0" "CoreKeyboard"</span>
InputDevice    <span class="token string">"Keyboard0.1"</span>
InputDevice    <span class="token string">"webcam_Button"</span>
<span class="token comment">#InputDevice    "X10_Lola.keyboard"</span>
InputDevice    <span class="token string">"XmodControl.0"</span>
InputDevice    <span class="token string">"Mouse0.Naga" "CorePointer"</span>
InputDevice    <span class="token string">"MouseKeys0a.Naga"</span>
InputDevice    <span class="token string">"Mouse0.1"</span>
<span class="token comment">#InputDevice    "MouseKeys0b.Naga"</span>
Option         <span class="token string">"Xinerama" "0"</span>
Option         <span class="token string">"AutoEnableDevices" "false"</span>
Option         <span class="token string">"AutoAddDevices"   "false"</span>
Option         <span class="token string">"AllowEmptyInput" "true"</span>
EndSection

Section <span class="token string">"ServerLayout"</span>
Identifier     <span class="token string">"Seat1"</span>
Screen      0  <span class="token string">"Screen1"</span> 0 0
InputDevice    <span class="token string">"Keyboard1" "CoreKeyboard"</span>
InputDevice    <span class="token string">"XmodControl.1"</span>
InputDevice    <span class="token string">"Mouse1.Salmosa" "CorePointer"</span>
Option         <span class="token string">"Xinerama" "0"</span>
Option         <span class="token string">"AutoEnableDevices" "false"</span>
Option         <span class="token string">"AutoAddDevices"   "false"</span>
Option         <span class="token string">"AllowEmptyInput" "true"</span>
EndSection

Section <span class="token string">"Files"</span>
FontPath        <span class="token string">"/usr/share/fonts/default/Type1"</span>
EndSection

Section <span class="token string">"InputDevice"</span>
Identifier     <span class="token string">"Mouse0.Naga"</span>
Driver         <span class="token string">"evdev"</span>
Option         <span class="token string">"GrabDevice" "true"</span>
Option         <span class="token string">"Protocol" "auto"</span>
Option   <span class="token string">"Device" "/dev/input/by-id/usb-Razer_Razer_Naga-event-mouse"</span>
Option         <span class="token string">"Emulate3Buttons" "no"</span>
Option         <span class="token string">"ZAxisMapping" "4 5"</span>
EndSection
Section <span class="token string">"InputDevice"</span>
Identifier     <span class="token string">"MouseKeys0a.Naga"</span>
Driver         <span class="token string">"evdev"</span>
Option     <span class="token string">"Device" "/dev/input/by-id/usb-Razer_Razer_Naga-event-kbd"</span>
EndSection
Section <span class="token string">"InputDevice"</span>
Identifier     <span class="token string">"MouseKeys0b.Naga"</span>
Driver         <span class="token string">"evdev"</span>
Option     <span class="token string">"Device" "/dev/input/by-id/usb-Razer_Razer_Naga-if01-event-kbd"</span>
EndSection
Section <span class="token string">"InputDevice"</span>
Identifier     <span class="token string">"Mouse0.1"</span>
Driver         <span class="token string">"evdev"</span>
Option     <span class="token string">"Device" "/dev/input/by-id/usb-Logitech_USB_Receiver-event-mouse"</span>
EndSection

Section <span class="token string">"InputDevice"</span>
Identifier     <span class="token string">"Mouse1.Salmosa"</span>
Driver         <span class="token string">"evdev"</span>
Option         <span class="token string">"GrabDevice" "true"</span>
Option         <span class="token string">"Protocol" "auto"</span>
Option   <span class="token string">"Device" "/dev/input/by-id/usb-Razer_Razer_Salmosa-event-mouse"</span>
Option         <span class="token string">"Emulate3Buttons" "no"</span>
Option         <span class="token string">"ZAxisMapping" "4 5"</span>
EndSection

<span class="token comment">#Section "InputDevice"</span>
<span class="token comment">#    # generated from data in "/etc/sysconfig/keyboard"</span>
<span class="token comment">#    Identifier     "Keyboard0"</span>
<span class="token comment">#    Driver         "keyboard"</span>
<span class="token comment">#    Option         "XkbLayout" "us"</span>
<span class="token comment">#    Option         "XkbModel" "pc105"</span>
<span class="token comment">#EndSection</span>


Section <span class="token string">"InputDevice"</span>
Identifier     <span class="token string">"Keyboard0"</span>
Driver         <span class="token string">"evdev"</span>
Option     <span class="token string">"Device" "/dev/input/dell_keyboard_2003"</span>
Option         <span class="token string">"XkbLayout" "us"</span>
Option         <span class="token string">"XkbModel" "pc105"</span>
EndSection

Section <span class="token string">"InputDevice"</span>
Identifier     <span class="token string">"Keyboard0.1"</span>
Driver         <span class="token string">"evdev"</span>
Option     <span class="token string">"Device" "/dev/input/by-id/usb-Logitech_USB_Receiver-event-kbd"</span>
Option         <span class="token string">"XkbLayout" "us"</span>
Option         <span class="token string">"XkbModel" "pc105"</span>
EndSection

Section <span class="token string">"InputDevice"</span>
Identifier     <span class="token string">"Keyboard1"</span>
Driver         <span class="token string">"evdev"</span>
Option     <span class="token string">"Device" "/dev/input/dell_keyboard_2105"</span>
Option         <span class="token string">"XkbLayout" "us"</span>
Option         <span class="token string">"XkbModel" "pc105"</span>
EndSection

Section <span class="token string">"InputDevice"</span>
Identifier     <span class="token string">"webcam_Button"</span>
Driver         <span class="token string">"evdev"</span>
Option     <span class="token string">"Device" "/dev/input/by-id/usb-046d_0809_BD4BC0AA-event-if00"</span>
EndSection

Section <span class="token string">"InputDevice"</span>
Identifier     <span class="token string">"X10_Lola.keyboard"</span>
Driver         <span class="token string">"evdev"</span>
Option     <span class="token string">"Device" "/dev/input/x10_lola"</span>
EndSection
Section <span class="token string">"InputDevice"</span>
Identifier     <span class="token string">"XmodControl.0"</span>
Driver         <span class="token string">"evdev"</span>
Option     <span class="token string">"Device" "/dev/input/by-path/pci-0000:00:1d.2-usb-0:1.2:1.3-event"</span>
EndSection

Section <span class="token string">"InputDevice"</span>
Identifier     <span class="token string">"XmodControl.1"</span>
Driver         <span class="token string">"evdev"</span>
Option     <span class="token string">"Device" "/dev/input/by-path/pci-0000:00:1d.0-usb-0:1:1.3-event"</span>
EndSection

<span class="token comment">#Section "Monitor"</span>
<span class="token comment">#    # HorizSync source: edid, VertRefresh source: edid</span>
<span class="token comment">#    Identifier     "Monitor0"</span>
<span class="token comment">#    VendorName     "Unknown"</span>
<span class="token comment">#    ModelName      "DELL 1907FP"</span>
<span class="token comment">#    HorizSync       30.0 - 81.0</span>
<span class="token comment">#    VertRefresh     56.0 - 76.0</span>
<span class="token comment">#    Option         "DPMS"</span>
<span class="token comment">#EndSection</span>
Section <span class="token string">"Monitor"</span>
<span class="token comment"># HorizSync source: edid, VertRefresh source: edid</span>
Identifier     <span class="token string">"Monitor0"</span>
VendorName     <span class="token string">"Unknown"</span>
ModelName      <span class="token string">"ViewSonic VA2431 Series"</span>
HorizSync       24.0 - 82.0
VertRefresh     50.0 - 75.0
Option         <span class="token string">"DPMS"</span>
<span class="token comment">#Option          "BlankTime"     "4"</span>
<span class="token comment">#Option          "StandbyTime"   "1"</span>
<span class="token comment">#Option          "SuspendTime"   "1"</span>
<span class="token comment">#Option          "OffTime"       "5"</span>
EndSection

Section <span class="token string">"Monitor"</span>
<span class="token comment"># HorizSync source: edid, VertRefresh source: edid</span>
Identifier     <span class="token string">"Monitor1"</span>
VendorName     <span class="token string">"Unknown"</span>
ModelName      <span class="token string">"DELL 1901FP"</span>
HorizSync       30.0 - 80.0
VertRefresh     56.0 - 76.0
Option         <span class="token string">"DPMS"</span>
Option          <span class="token string">"BlankTime"     "4"</span>
Option          <span class="token string">"StandbyTime"   "1"</span>
Option          <span class="token string">"SuspendTime"   "1"</span>
Option          <span class="token string">"OffTime"       "5"</span>

EndSection

Section <span class="token string">"Device"</span>
Identifier     <span class="token string">"Device0"</span>
Driver         <span class="token string">"nvidia"</span>
VendorName     <span class="token string">"NVIDIA Corporation"</span>
BoardName      <span class="token string">"GeForce 8500 GT"</span>
BusID          <span class="token string">"PCI:4:0:0"</span>
EndSection

Section <span class="token string">"Device"</span>
Identifier     <span class="token string">"Device1"</span>
Driver         <span class="token string">"nvidia"</span>
VendorName     <span class="token string">"NVIDIA Corporation"</span>
BoardName      <span class="token string">"ION"</span>
BusID          <span class="token string">"PCI:7:0:0"</span>
EndSection

Section <span class="token string">"Screen"</span>
Identifier     <span class="token string">"Screen0"</span>
Device         <span class="token string">"Device0"</span>
Monitor        <span class="token string">"Monitor0"</span>
DefaultDepth    24
Option         <span class="token string">"TwinView" "0"</span>
Option         <span class="token string">"metamodes" "nvidia-auto-select +0+0"</span>
SubSection     <span class="token string">"Display"</span>
Depth       24
EndSubSection
EndSection

Section <span class="token string">"Screen"</span>
Identifier     <span class="token string">"Screen1"</span>
Device         <span class="token string">"Device1"</span>
Monitor        <span class="token string">"Monitor1"</span>
DefaultDepth    24
Option         <span class="token string">"TwinView" "0"</span>
Option         <span class="token string">"metamodes" "nvidia-auto-select +0+0"</span>
SubSection     <span class="token string">"Display"</span>
Depth       24
EndSubSection
EndSection

<span class="token comment">#Section "ServerFlags"</span>
<span class="token comment"># # Even if mouse detection fails, X will start</span>
<span class="token comment"># Option "AllowMouseOpenFail" "yes"</span>
<span class="token comment">#</span>
<span class="token comment"># # VT switching is disabled</span>
<span class="token comment"># Option "DontVTSwitch" "yes"</span>
<span class="token comment">#</span>
<span class="token comment"># # X restart (Ctrl+Alt+Backspace) is disabled</span>
<span class="token comment"># # For some reason, this would cause Ctrl-C to terminate X</span>
<span class="token comment"># #Option "DontZap" "yes"</span>
<span class="token comment">#EndSection</span></code></pre>
</details>
<details>
<summary>/usr/share/config/kdm/kdmrc</summary>
<pre class="language-apacheconf"><code class="language-apacheconf"><span class="token comment"># File: /usr/share/config/kdm/kdmrc</span>
<span class="token comment">#</span>
<span class="token comment"># KDM master configuration file</span>
<span class="token comment">#</span>
<span class="token comment"># Definition: the greeter is the login dialog, i.e., the part of KDM</span>
<span class="token comment"># which the user sees.</span>
<span class="token comment">#</span>
<span class="token comment"># You can configure every X-display individually.</span>
<span class="token comment"># Every display has a display name, which consists of a host name</span>
<span class="token comment"># (which is empty for local displays specified in {Static|Reserve}Servers),</span>
<span class="token comment"># a colon, and a display number. Additionally, a display belongs to a</span>
<span class="token comment"># display class (which can be ignored in most cases; the control center</span>
<span class="token comment"># does not support this feature at all).</span>
<span class="token comment"># Sections with display-specific settings have the formal syntax</span>
<span class="token comment"># "[X-" host [":" number [ "_" class ]] "-" sub-section "]"</span>
<span class="token comment"># You can use the "*" wildcard for host, number, and class. You may omit</span>
<span class="token comment"># trailing components; they are assumed to be "*" then.</span>
<span class="token comment"># The host part may be a domain specification like ".inf.tu-dresden.de".</span>
<span class="token comment"># It may also be "+", which means non-empty, i.e. remote displays only.</span>
<span class="token comment"># From which section a setting is actually taken is determined by these</span>
<span class="token comment"># rules:</span>
<span class="token comment"># - an exact match takes precedence over a partial match (for the host part),</span>
<span class="token comment">#   which in turn takes precedence over a wildcard ("+" taking precedence</span>
<span class="token comment">#   over "*")</span>
<span class="token comment"># - precedence decreases from left to right for equally exact matches</span>
<span class="token comment"># Example: display name "myhost:0", class "dpy".</span>
<span class="token comment"># [X-myhost:0_dpy] precedes</span>
<span class="token comment"># [X-myhost:0_*] (same as [X-myhost:0]) precedes</span>
<span class="token comment"># [X-myhost:*_dpy] precedes</span>
<span class="token comment"># [X-myhost:*_*] (same as [X-myhost]) precedes</span>
<span class="token comment"># [X-+:0_dpy] precedes</span>
<span class="token comment"># [X-*:0_dpy] precedes</span>
<span class="token comment"># [X-*:0_*] (same as [X-*:0]) precedes</span>
<span class="token comment"># [X-*:*_*] (same as [X-*])</span>
<span class="token comment"># These sections do NOT match this display:</span>
<span class="token comment"># [X-hishost], [X-myhost:0_dec], [X-*:1], [X-:*]</span>
<span class="token comment"># If a setting is not found in any matching section, the default is used.</span>
<span class="token comment">#</span>
<span class="token comment"># Every comment applies to the following section or key. Note that all</span>
<span class="token comment"># comments will be lost if you change this file with the systemsettings frontend.</span>
<span class="token comment"># The defaults refer to KDM's built-in values, not anything set in this file.</span>
<span class="token comment">#</span>
<span class="token comment"># Special characters need to be backslash-escaped (leading and trailing</span>
<span class="token comment"># spaces (\s), tab (\t), linefeed (\n), carriage return (\r) and the</span>
<span class="token comment"># backslash itself (\\)).</span>
<span class="token comment"># In lists, fields are separated with commas without whitespace in between.</span>
<span class="token comment"># Some command strings are subject to simplified sh-style word splitting:</span>
<span class="token comment"># single quotes (') and double quotes (") have the usual meaning; the backslash</span>
<span class="token comment"># quotes everything (not only special characters). Note that the backslashes</span>
<span class="token comment"># need to be doubled because of the two levels of quoting.</span>

<span class="token directive-flags keyword">[General]</span>
<span class="token comment"># This option exists solely for the purpose of a clean automatic upgrade.</span>
<span class="token comment"># Do not even think about changing it!</span>
ConfigVersion=2.4
<span class="token comment"># List of permanent displays. Displays with a hostname are foreign. A display</span>
<span class="token comment"># class may be specified separated by an underscore.</span>
<span class="token comment"># Default is ":0"</span>
StaticServers=:0,:1
<span class="token comment"># List of on-demand displays. See StaticServers for syntax.</span>
<span class="token comment"># Default is ""</span>
ReserveServers=:2,:3,:4
<span class="token comment"># VTs to allocate to X-servers. A negative number means that the VT will be</span>
<span class="token comment"># used only if it is free. If all VTs in this list are used up, the next free</span>
<span class="token comment"># one greater than the last one in this list will be allocated.</span>
<span class="token comment"># Default is ""</span>
ServerVTs=-1
<span class="token comment"># TTYs (without /dev/) to monitor for activity while in console mode.</span>
<span class="token comment"># Default is ""</span>
ConsoleTTYs=tty1,tty2,tty3,tty4,tty5,tty6
<span class="token comment"># Where KDM should store its PID (do not store if empty).</span>
<span class="token comment"># Default is ""</span>
<span class="token directive-inline property">PidFile</span>=/var/run/kdm.pid
<span class="token comment"># Whether KDM should lock the PID file to prevent having multiple KDM</span>
<span class="token comment"># instances running at once. Do not change unless you are brave.</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#LockPidFile=false</span>
<span class="token comment"># Where to store authorization files.</span>
<span class="token comment"># Default is "/var/run/xauth"</span>
<span class="token comment">#AuthDir=/tmp</span>
<span class="token comment"># Whether KDM should automatically re-read configuration files, if it</span>
<span class="token comment"># finds them having changed.</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#AutoRescan=false</span>
<span class="token comment"># Additional environment variables KDM should pass on to all programs it runs.</span>
<span class="token comment"># LD_LIBRARY_PATH and XCURSOR_THEME are good candidates;</span>
<span class="token comment"># otherwise, it should not be necessary very often.</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#ExportList=LD_LIBRARY_PATH,ANOTHER_IMPORTANT_VAR</span>
<span class="token comment"># A character device KDM should read entropy from.</span>
<span class="token comment"># Empty means use the system's preferred entropy device.</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#RandomDevice=/dev/altrandom</span>
<span class="token comment"># Where the command sockets should be created; make it empty to disable</span>
<span class="token comment"># them.</span>
<span class="token comment"># Default is "/var/run/xdmctl"</span>
<span class="token comment">#FifoDir=/tmp</span>
<span class="token comment"># The group to which the global command socket should belong;</span>
<span class="token comment"># can be either a name or a numerical ID.</span>
<span class="token comment"># Default is 0</span>
<span class="token comment">#FifoGroup=xdmctl</span>
<span class="token comment"># The user the greeter should run as. Empty results in root.</span>
<span class="token comment"># Consider the impact on LogSource when setting it.</span>
<span class="token comment"># Default is ""</span>
GreeterUID=kdm
<span class="token comment"># The directory in which KDM should store persistent working data.</span>
<span class="token comment"># Default is "/var/lib/kdm"</span>
<span class="token comment">#DataDir=</span>
<span class="token comment"># The directory in which KDM should store users' .dmrc files. This is only</span>
<span class="token comment"># needed if the home directories are not readable before actually logging in</span>
<span class="token comment"># (like with AFS).</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#DmrcDir=/nfs-shared/var/dmrcs</span>

<span class="token directive-flags keyword">[Xdmcp]</span>
<span class="token comment"># Whether KDM should listen to incoming XDMCP requests.</span>
<span class="token comment"># Default is true</span>
Enable=false
<span class="token comment"># The UDP port on which KDM should listen for XDMCP requests. Do not change.</span>
<span class="token comment"># Default is 177</span>
<span class="token comment">#Port=177</span>
<span class="token comment"># File with the private keys of X-terminals. Required for XDM authentication.</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#KeyFile=/usr/share/config/kdm/kdmkeys</span>
<span class="token comment"># XDMCP access control file in the usual XDM-Xaccess format.</span>
<span class="token comment"># Default is "/usr/share/config/kdm/Xaccess"</span>
Xaccess=/usr/share/config/kdm/Xaccess
<span class="token comment"># Number of seconds to wait for display to respond after the user has</span>
<span class="token comment"># selected a host from the chooser.</span>
<span class="token comment"># Default is 15</span>
<span class="token comment">#ChoiceTimeout=10</span>
<span class="token comment"># Strip domain name from remote display names if it is equal to the local</span>
<span class="token comment"># domain.</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#RemoveDomainname=false</span>
<span class="token comment"># Use the numeric IP address of the incoming connection on multihomed hosts</span>
<span class="token comment"># instead of the host name.</span>
<span class="token comment"># Default is false</span>
<span class="token comment">#SourceAddress=true</span>
<span class="token comment"># The program which is invoked to dynamically generate replies to XDMCP</span>
<span class="token comment"># DirectQuery or BroadcastQuery requests.</span>
<span class="token comment"># If empty, no program is invoked and "Willing to manage" is sent.</span>
<span class="token comment"># Default is ""</span>
Willing=/usr/share/config/kdm/Xwilling

<span class="token directive-flags keyword">[Shutdown]</span>
<span class="token comment"># The command (subject to word splitting) to run to halt the system.</span>
<span class="token comment"># Default is "/sbin/shutdown -h -P now"</span>
HaltCmd=/sbin/poweroff
<span class="token comment"># The command (subject to word splitting) to run to reboot the system.</span>
<span class="token comment"># Default is "/sbin/shutdown -r now"</span>
RebootCmd=/sbin/shutdown -r now
<span class="token comment"># Whether it is allowed to shut down the system via the global command socket.</span>
<span class="token comment"># Default is false</span>
<span class="token comment">#AllowFifo=true</span>
<span class="token comment"># Whether it is allowed to abort active sessions when shutting down the</span>
<span class="token comment"># system via the global command socket.</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#AllowFifoNow=false</span>
<span class="token comment"># The boot manager KDM should use for offering boot options in the</span>
<span class="token comment"># shutdown dialog.</span>
<span class="token comment"># "None" - no boot manager</span>
<span class="token comment"># "Grub" - Grub boot manager</span>
<span class="token comment"># "Grub2" - Grub2 boot manager</span>
<span class="token comment"># "Burg" - Burg boot manager</span>
<span class="token comment"># "Lilo" - Lilo boot manager (Linux on i386 &amp; x86-64 only)</span>
<span class="token comment"># Default is None</span>
<span class="token comment">#BootManager=Grub</span>

<span class="token comment"># Rough estimations about how many seconds KDM will spend at most on</span>
<span class="token comment"># - opening a connection to the X-server (OpenTime) if the attempt</span>
<span class="token comment">#   - times out: OpenTimeout</span>
<span class="token comment">#   - is refused: OpenRepeat * OpenDelay</span>
<span class="token comment"># - starting a local X-server (ServerTime):</span>
<span class="token comment">#   ServerAttempts * (ServerTimeout + OpenDelay)</span>
<span class="token comment"># - starting a display:</span>
<span class="token comment">#   - local display: ServerTime + OpenTime</span>
<span class="token comment">#   - foreign display: StartAttempts * OpenTime</span>
<span class="token comment">#   - XDMCP display: OpenTime (repeated indefinitely by client)</span>

<span class="token comment"># Core config for all displays</span>
[X-*-Core]
<span class="token comment"># How long to wait before retrying to connect a display.</span>
<span class="token comment"># Default is 15</span>
<span class="token comment">#OpenDelay=15</span>
<span class="token comment"># How long to wait before timing out a display connection attempt.</span>
<span class="token comment"># Default is 120</span>
<span class="token comment">#OpenTimeout=120</span>
<span class="token comment"># How many connection attempts to make during a start attempt. Note that</span>
<span class="token comment"># a timeout aborts the entire start attempt.</span>
<span class="token comment"># Default is 5</span>
<span class="token comment">#OpenRepeat=5</span>
<span class="token comment"># Try at most that many times to start a display. If this fails, the display</span>
<span class="token comment"># is disabled.</span>
<span class="token comment"># Default is 4</span>
<span class="token comment">#StartAttempts=4</span>
<span class="token comment"># Ping remote display every that many minutes.</span>
<span class="token comment"># Default is 5</span>
<span class="token comment">#PingInterval=5</span>
<span class="token comment"># Wait for a Pong that many minutes.</span>
<span class="token comment"># Default is 5</span>
<span class="token comment">#PingTimeout=5</span>
<span class="token comment"># The name of this X-server's Xauth file.</span>
<span class="token comment"># If empty, a random name in the AuthDir directory will be used.</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#AuthFile=</span>
<span class="token comment"># Specify a file with X-resources for the greeter, chooser and background.</span>
<span class="token comment"># The KDE frontend does not use this file, so you do not need it unless you</span>
<span class="token comment"># use another background generator than krootimage.</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#Resources=</span>
<span class="token comment"># The xrdb program to use to read the above specified recources.</span>
<span class="token comment"># Subject to word splitting.</span>
<span class="token comment"># Default is "/usr/bin/xrdb"</span>
<span class="token comment">#Xrdb=</span>
<span class="token comment"># A program to run before the greeter is shown. Can be used to start an</span>
<span class="token comment"># xconsole or an alternative background generator. Subject to word splitting.</span>
<span class="token comment"># Default is ""</span>
Setup=/usr/share/config/kdm/Xsetup
<span class="token comment"># A program to run before a user session starts. Subject to word splitting.</span>
<span class="token comment"># Default is ""</span>
Startup=/usr/share/config/kdm/Xstartup
<span class="token comment"># A program to run after a user session exits. Subject to word splitting.</span>
<span class="token comment"># Default is ""</span>
Reset=/usr/share/config/kdm/Xreset
<span class="token comment"># The program which is run as the user which logs in. It is supposed to</span>
<span class="token comment"># interpret the session argument (see SessionsDirs) and start an appropriate</span>
<span class="token comment"># session according to it. Subject to word splitting.</span>
<span class="token comment"># Default is "/usr/bin/xterm -ls -T"</span>
<span class="token directive-inline property">Session</span>=/usr/share/config/kdm/Xsession
<span class="token comment"># The program to run if Session fails.</span>
<span class="token comment"># Default is "/usr/bin/xterm"</span>
<span class="token comment">#FailsafeClient=</span>
<span class="token comment"># The PATH for the Session program.</span>
<span class="token comment"># Default is "/usr/local/bin:/usr/bin:/bin:/usr/games"</span>
<span class="token comment">#UserPath=</span>
<span class="token comment"># The PATH for Setup, Startup and Reset, etc.</span>
<span class="token comment"># Default is "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"</span>
<span class="token comment">#SystemPath=</span>
<span class="token comment"># The default system shell.</span>
<span class="token comment"># Default is "/bin/sh"</span>
<span class="token comment">#SystemShell=/bin/bash</span>
<span class="token comment"># Where to put the user's X-server authorization file if ~/.Xauthority</span>
<span class="token comment"># cannot be created.</span>
<span class="token comment"># Default is "/tmp"</span>
<span class="token comment">#UserAuthDir=</span>
<span class="token comment"># If true, UserAuthDir will be used unconditionally.</span>
<span class="token comment"># Default is false</span>
<span class="token comment">#ForceUserAuthDir=true</span>
<span class="token comment"># Whether to automatically restart sessions after X-server crashes.</span>
<span class="token comment"># Note that enabling this makes circumventing screen lockers other than</span>
<span class="token comment"># KDE's built-in one possible!</span>
<span class="token comment"># Default is false</span>
<span class="token comment">#AutoReLogin=true</span>
<span class="token comment"># Allow root logins?</span>
<span class="token comment"># Default is true</span>
AllowRootLogin=false
<span class="token comment"># Allow to log in, when user has set an empty password?</span>
<span class="token comment"># Default is true</span>
AllowNullPasswd=false
<span class="token comment"># Who is allowed to shut down the system. This applies both to the</span>
<span class="token comment"># greeter and to the command sockets.</span>
<span class="token comment"># "None" - no "Shutdown..." menu entry is shown at all</span>
<span class="token comment"># "Root" - the root password must be entered to shut down</span>
<span class="token comment"># "All" - everybody can shut down the machine</span>
<span class="token comment"># Default is All</span>
AllowShutdown=Root
<span class="token comment"># Who is allowed to abort active sessions when shutting down.</span>
<span class="token comment"># "None" - no forced shutdown is allowed at all</span>
<span class="token comment"># "Root" - the root password must be entered to shut down forcibly</span>
<span class="token comment"># "All" - everybody can shut down the machine forcibly</span>
<span class="token comment"># Default is All</span>
<span class="token comment">#AllowSdForceNow=Root</span>
<span class="token comment"># The default choice for the shutdown condition/timing.</span>
<span class="token comment"># "Schedule" - shut down after all active sessions exit (possibly at once)</span>
<span class="token comment"># "TryNow" - shut down, if no active sessions are open; otherwise, do nothing</span>
<span class="token comment"># "ForceNow" - shut down unconditionally</span>
<span class="token comment"># Default is Schedule</span>
<span class="token comment">#DefaultSdMode=ForceNow</span>
<span class="token comment"># How to offer shutdown scheduling options:</span>
<span class="token comment"># "Never" - not at all</span>
<span class="token comment"># "Optional" - as a button in the simple shutdown dialogs</span>
<span class="token comment"># "Always" - instead of the simple shutdown dialogs</span>
<span class="token comment"># Default is Never</span>
<span class="token comment">#ScheduledSd=Optional</span>
<span class="token comment"># The directories containing session type definitions in .desktop format,</span>
<span class="token comment"># ordered by falling priority.</span>
<span class="token comment"># Default is "/usr/share/apps/kdm/sessions"</span>
SessionsDirs=/usr/share/config/kdm/sessions,/usr/share/apps/kdm/sessions
<span class="token comment"># The file (relative to $HOME) to redirect the session output to. The</span>
<span class="token comment"># following character pairs are replaced:</span>
<span class="token comment"># - %d -> current display</span>
<span class="token comment"># - %u -> current user</span>
<span class="token comment"># - %r -> empty at first. See below.</span>
<span class="token comment"># - %% -> a single %</span>
<span class="token comment"># When the constructed filename cannot be used safely and the specification</span>
<span class="token comment"># contains %&lt;stuff>r, other names will be tried - this time expanding %&lt;stuff>r</span>
<span class="token comment"># to &lt;stuff> followed by a random number.</span>
<span class="token comment"># Default is ".xsession-errors"</span>
ClientLogFile=.xsession-errors-<span class="token variable">%d</span>
<span class="token comment"># Fallback when ClientLogFile cannot be used. The same expansions are</span>
<span class="token comment"># supported. DO NOT use relative paths here.</span>
<span class="token comment"># Default is "/tmp/xerr-%u-%d%-r"</span>
<span class="token comment">#ClientLogFallback=/var/log/xsession-errors/%u-%d%-r</span>
<span class="token comment"># Whether KDM's built-in utmp/wtmp/lastlog registration should be used.</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#UseSessReg=false</span>

<span class="token comment"># Greeter config for all displays</span>
[X-*-Greeter]
<span class="token comment"># Specify the widget style for the greeter. Empty means to use the</span>
<span class="token comment"># built-in default which currently is "Oxygen-air".</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#GUIStyle=Plastique</span>
<span class="token comment"># Specify the widget color scheme for the greeter. Empty means to use the</span>
<span class="token comment"># built-in default which currently is "Oxygen-air".</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#ColorScheme=MidnightMeadow</span>
<span class="token comment"># What should be shown in the greeter's logo are:</span>
<span class="token comment"># "None" - nothing</span>
<span class="token comment"># "Logo" - the image specified by LogoPixmap</span>
<span class="token comment"># "Clock" - a neat analog clock</span>
<span class="token comment"># Default is Clock</span>
LogoArea=Logo
<span class="token comment"># The image to show when LogoArea=Logo.</span>
<span class="token comment"># Default is ""</span>
LogoPixmap=/usr/share/apps/kdm/pics/kdelogo.png
<span class="token comment"># The relative coordinates (X,Y in percent) of the center of the greeter.</span>
<span class="token comment"># Default is "50,50"</span>
<span class="token comment">#GreeterPos=30,40</span>
<span class="token comment"># The screen the greeter should be displayed on in multi-headed and Xinerama</span>
<span class="token comment"># setups. The numbering starts with 0. For Xinerama, it corresponds to the</span>
<span class="token comment"># listing order in the active ServerLayout section of XF86Config; -1 means</span>
<span class="token comment"># to use the upper-left screen, -2 means to use the upper-right screen.</span>
<span class="token comment"># Default is 0</span>
<span class="token comment">#GreeterScreen=-1</span>
<span class="token comment"># The headline in the greeter. The following character pairs are replaced:</span>
<span class="token comment"># - %d -> current display</span>
<span class="token comment"># - %h -> host name, possibly with domain name</span>
<span class="token comment"># - %n -> node name, most probably the host name without domain name</span>
<span class="token comment"># - %s -> the operating system</span>
<span class="token comment"># - %r -> the operating system's version</span>
<span class="token comment"># - %m -> the machine (hardware) type</span>
<span class="token comment"># - %% -> a single %</span>
<span class="token comment"># Default is "Welcome to %s at %n"</span>
GreetString=Bending Fern Glade
<span class="token comment"># Whether the fonts used in the greeter should be antialiased.</span>
<span class="token comment"># Default is false</span>
AntiAliasing=true
<span class="token comment"># The font for the greeter headline. The value is encoded.</span>
<span class="token comment"># Default is "Serif 20pt bold"</span>
GreetFont=Serif,16,-1,5,50,0,0,0,0,0
<span class="token comment"># The normal font used in the greeter. The value is encoded.</span>
<span class="token comment"># Default is "Sans Serif 10pt"</span>
StdFont=Sans Serif,10,-1,5,50,0,0,0,0,0
<span class="token comment"># The font used for the "Login Failed" message. The value is encoded.</span>
<span class="token comment"># Default is "Sans Serif 10pt bold"</span>
FailFont=Sans Serif,10,-1,5,75,0,0,0,0,0
<span class="token comment"># What to do with the Num Lock modifier for the time the greeter is running:</span>
<span class="token comment"># "Off" - turn off</span>
<span class="token comment"># "On" - turn on</span>
<span class="token comment"># "Keep" - do not change the state</span>
<span class="token comment"># Default is Keep</span>
<span class="token comment">#NumLock=Off</span>
<span class="token comment"># Language and locale to use in the greeter, encoded like $LANGUAGE.</span>
<span class="token comment"># If empty, the settings from the environment are used.</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#Language=de_DE</span>
<span class="token comment"># Enable autocompletion in the username line edit.</span>
<span class="token comment"># Default is false</span>
UserCompletion=true
<span class="token comment"># Enable user list (names along with images) in the greeter.</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#UserList=false</span>
<span class="token comment"># User selection for UserCompletion and UserList:</span>
<span class="token comment"># "NotHidden" - all users except those listed in HiddenUsers</span>
<span class="token comment"># "Selected" - only the users listed in SelectedUsers</span>
<span class="token comment"># Default is NotHidden</span>
<span class="token comment">#ShowUsers=Selected</span>
<span class="token comment"># For ShowUsers=Selected. @&lt;group> means all users in that group.</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#SelectedUsers=root,johndoe</span>
<span class="token comment"># For ShowUsers=NotHidden. @&lt;group> means all users in that group.</span>
<span class="token comment"># Default is ""</span>
HiddenUsers=root
<span class="token comment"># Special case of HiddenUsers: users with a non-zero UID less than this number</span>
<span class="token comment"># will not be shown as well.</span>
<span class="token comment"># Default is 0</span>
MinShowUID=1000
<span class="token comment"># Complement to MinShowUID: users with a UID greater than this number will</span>
<span class="token comment"># not be shown as well.</span>
<span class="token comment"># Default is 65535</span>
MaxShowUID=65000
<span class="token comment"># If false, the users are listed in the order they appear in /etc/passwd.</span>
<span class="token comment"># If true, they are sorted alphabetically.</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#SortUsers=false</span>
<span class="token comment"># Specify, where the users' pictures should be taken from.</span>
<span class="token comment"># "AdminOnly" - from &lt;facedir>/$USER.face[.icon]</span>
<span class="token comment"># "PreferAdmin" - prefer &lt;facedir>, fallback on $HOME</span>
<span class="token comment"># "PreferUser" - ... and the other way round</span>
<span class="token comment"># "UserOnly" - from the user's $HOME/.face[.icon]</span>
<span class="token comment"># Default is AdminOnly</span>
FaceSource=PreferUser
<span class="token comment"># The directory containing the user images if FaceSource is not UserOnly.</span>
<span class="token comment"># Default is "/usr/share/apps/kdm/faces"</span>
<span class="token comment">#FaceDir=/usr/share/faces</span>
<span class="token comment"># Specify, if/which user should be preselected for log in.</span>
<span class="token comment"># "None" - do not preselect any user</span>
<span class="token comment"># "Previous" - the user which successfully logged in last time</span>
<span class="token comment"># "Default" - the user specified in the DefaultUser option</span>
<span class="token comment"># Default is None</span>
<span class="token comment">#PreselectUser=Previous</span>
<span class="token comment"># If this is true, the password input line is focused automatically if</span>
<span class="token comment"># a user is preselected.</span>
<span class="token comment"># Default is false</span>
FocusPasswd=true
<span class="token comment"># If this is true, the entered password is echoed as bullets. Otherwise,</span>
<span class="token comment"># no feedback is given at all.</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#EchoPasswd=false</span>
<span class="token comment"># If true, krootimage will be automatically started by KDM; otherwise, the</span>
<span class="token comment"># Setup script should be used to setup the background.</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#UseBackground=false</span>
<span class="token comment"># The configuration file to be used by krootimage.</span>
<span class="token comment"># Default is "/usr/share/config/kdm/backgroundrc"</span>
BackgroundCfg=/usr/share/config/kdm/backgroundrc
<span class="token comment"># Whether to grab keyboard and mouse while the greeter is visible. Grabs</span>
<span class="token comment"># may improve security, but make on-screen keyboards, etc. unusable.</span>
<span class="token comment"># "Never" - never grab</span>
<span class="token comment"># "IfNoAuth" - grab if the display requires no X authorization</span>
<span class="token comment"># "Always" - always grab</span>
<span class="token comment"># Default is IfNoAuth</span>
<span class="token comment">#GrabInput=Always</span>
<span class="token comment"># Hold the X-server grabbed the whole time the greeter is visible. This</span>
<span class="token comment"># may be more secure, but it will disable any background and other</span>
<span class="token comment"># X-clients started from the Setup script.</span>
<span class="token comment"># Default is false</span>
<span class="token comment">#GrabServer=true</span>
<span class="token comment"># How many seconds to wait for grab to succeed.</span>
<span class="token comment"># Default is 3</span>
<span class="token comment">#GrabTimeout=3</span>
<span class="token comment"># Warn, if display has no X-authorization (local auth cannot be created,</span>
<span class="token comment"># XDMCP display wants no auth, or display is foreign from StaticServers).</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#AuthComplain=false</span>
<span class="token comment"># Random seed for forging saved session types, etc. of unknown users.</span>
<span class="token comment"># This value should be random but constant across the login domain.</span>
<span class="token comment"># Default is 0</span>
ForgingSeed=1386325123
<span class="token comment"># Specify conversation plugins for the login dialog. Each plugin can be</span>
<span class="token comment"># specified as a base name (which expands to $kde_modulesdir/kgreet_$base)</span>
<span class="token comment"># or as a full pathname.</span>
<span class="token comment"># Default is "classic"</span>
<span class="token comment">#PluginsLogin=sign</span>
<span class="token comment"># Same as PluginsLogin, but for the shutdown dialog.</span>
<span class="token comment"># Default is "classic"</span>
<span class="token comment">#PluginsShutdown=modern</span>
<span class="token comment"># A list of options of the form Key=Value. The conversation plugins can query</span>
<span class="token comment"># these settings; it is up to them what possible keys are.</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#PluginOptions=SomeKey=randomvalue,Foo=bar</span>
<span class="token comment"># Show the "Console Login" action in the greeter (if ServerTTY/ConsoleTTYs</span>
<span class="token comment"># is configured).</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#AllowConsole=false</span>
<span class="token comment"># A program to run while the greeter is visible. It is supposed to preload</span>
<span class="token comment"># as much as possible of the session that is going to be started (most</span>
<span class="token comment"># probably).</span>
<span class="token comment"># Default is ""</span>
Preloader=/usr/bin/preloadkde
<span class="token comment"># Whether the greeter should be themed.</span>
<span class="token comment"># Default is false</span>
UseTheme=true
<span class="token comment"># The theme to use for the greeter. Can point to either a directory or an XML</span>
<span class="token comment"># file.</span>
<span class="token comment"># Default is ""</span>
Theme=/usr/share/apps/kdm/themes/elarun
<span class="token comment"># Enable the Alt-Ctrl-D shortcut to toggle greeter theme debugging.</span>
<span class="token comment"># Default is false</span>
<span class="token comment">#AllowThemeDebug=true</span>

<span class="token comment"># Core config for local displays</span>
[X-:*-Core]
<span class="token comment"># How often to try to run the X-server. Running includes executing it and</span>
<span class="token comment"># waiting for it to come up.</span>
<span class="token comment"># Default is 1</span>
<span class="token comment">#ServerAttempts=1</span>
<span class="token comment"># How long to wait for a local X-server to come up.</span>
<span class="token comment"># Default is 30</span>
<span class="token comment">#ServerTimeout=30</span>
<span class="token comment"># The command line to start the X-server, without display number and VT spec.</span>
<span class="token comment"># This string is subject to word splitting.</span>
<span class="token comment"># Default is "/usr/bin/X"</span>
ServerCmd=/usr/bin/X -br -novtswitch -quiet
<span class="token comment"># Additional arguments for the X-servers for local sessions.</span>
<span class="token comment"># This string is subject to word splitting.</span>
<span class="token comment"># Default is ""</span>
ServerArgsLocal=-background none -nolisten tcp
<span class="token comment"># Additional arguments for the X-servers for remote sessions.</span>
<span class="token comment"># This string is subject to word splitting.</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#ServerArgsRemote=</span>
<span class="token comment"># The user the X-server should run as. Empty results in root.</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#ServerUID=_x11</span>
<span class="token comment"># Restart instead of resetting the local X-server after session exit.</span>
<span class="token comment"># Use it if the server leaks memory etc.</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#TerminateServer=false</span>
<span class="token comment"># Create X-authorizations for local displays.</span>
<span class="token comment"># Default is true</span>
<span class="token comment">#Authorize=false</span>
<span class="token comment"># Which X-authorization mechanisms should be used.</span>
<span class="token comment"># Default is "MIT-MAGIC-COOKIE-1"</span>
<span class="token comment">#AuthNames=</span>
<span class="token comment"># Need to reset the X-server to make it read initial Xauth file.</span>
<span class="token comment"># Default is false</span>
<span class="token comment">#ResetForAuth=true</span>
<span class="token comment"># See above</span>
AllowNullPasswd=false
<span class="token comment"># See above</span>
AllowShutdown=All
<span class="token comment"># Enable password-less logins on this display. USE WITH EXTREME CARE!</span>
<span class="token comment"># Default is false</span>
<span class="token comment">#NoPassEnable=true</span>
<span class="token comment"># The users that do not need to provide a password to log in. NEVER list root!</span>
<span class="token comment"># "*" means all non-root users. @&lt;group> means all users in that group.</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#NoPassUsers=fred,ethel</span>

<span class="token comment"># Greeter config for local displays</span>
[X-:*-Greeter]
<span class="token comment"># See above</span>
PreselectUser=Previous
<span class="token comment"># See above</span>
FocusPasswd=true
<span class="token comment"># Specify whether the greeter of local displays should start up in host chooser</span>
<span class="token comment"># (remote) or login (local) mode and whether it is allowed to switch to the</span>
<span class="token comment"># other mode.</span>
<span class="token comment"># "LocalOnly" - only local login possible</span>
<span class="token comment"># "DefaultLocal" - start up in local mode, but allow switching to remote mode</span>
<span class="token comment"># "DefaultRemote" - ... and the other way round</span>
<span class="token comment"># "RemoteOnly" - only choice of remote host possible</span>
<span class="token comment"># Default is LocalOnly</span>
LoginMode=DefaultLocal
<span class="token comment"># A list of hosts to be automatically added to the remote login menu. The</span>
<span class="token comment"># special name "*" means broadcast.</span>
<span class="token comment"># Default is "*"</span>
<span class="token comment">#ChooserHosts=*,host1,host2,host3.local,login.domain.com</span>
<span class="token comment"># Show the "Restart X Server"/"Close Connection" action in the greeter.</span>
<span class="token comment"># Default is true</span>
AllowClose=false

<span class="token comment"># Core config for 1st local display</span>
[X-:0-Core]
<span class="token comment"># The VT the X-server should run on; auto-assign if zero, don't assign if -1.</span>
<span class="token comment"># Better leave it zero and use ServerVTs.</span>
<span class="token comment"># Default is 0</span>
ServerVT=7
<span class="token comment"># Enable automatic login. USE WITH EXTREME CARE!</span>
<span class="token comment"># Default is false</span>
<span class="token comment">#AutoLoginEnable=true</span>
<span class="token comment"># If true, auto-login after logout. If false, auto-login is performed only</span>
<span class="token comment"># when a display session starts up.</span>
<span class="token comment"># Default is false</span>
<span class="token comment">#AutoLoginAgain=true</span>
<span class="token comment"># The delay in seconds before automatic login kicks in.</span>
<span class="token comment"># Default is 0</span>
<span class="token comment">#AutoLoginDelay=10</span>
<span class="token comment"># The user to log in automatically. NEVER specify root!</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#AutoLoginUser=fred</span>
<span class="token comment"># The password for the user to log in automatically. This is NOT required</span>
<span class="token comment"># unless the user is logged into a NIS or Kerberos domain. If you use this</span>
<span class="token comment"># option, you should "chmod 600 kdmrc" for obvious reasons.</span>
<span class="token comment"># Default is ""</span>
<span class="token comment">#AutoLoginPass=secret!</span>
<span class="token comment"># Immediately lock the automatically started session. This works only with</span>
<span class="token comment"># KDE sessions.</span>
<span class="token comment"># Default is false</span>
<span class="token comment">#AutoLoginLocked=true</span>
<span class="token comment"># See above</span>
ClientLogFile=.xsession-errors
<span class="token comment"># See above</span>
ServerArgsLocal=-nolisten tcp -novtswitch -keeptty -config xorg.conf -layout Seat0

<span class="token comment"># Greeter config for 1st local display</span>
[X-:0-Greeter]
<span class="token comment"># See above</span>
PreselectUser=Default
<span class="token comment"># The user to preselect if PreselectUser=Default.</span>
<span class="token comment"># Default is ""</span>
DefaultUser=user1
<span class="token comment"># See above</span>
BackgroundCfg=/usr/share/config/kdm/backgroundrc.seat0
<span class="token comment"># See above</span>
FocusPasswd=true
<span class="token comment"># See above</span>
GreeterPos=0,100
<span class="token comment"># See above</span>
LoginMode=DefaultLocal
<span class="token comment"># See above</span>
LogoArea=None
<span class="token comment"># See above</span>
UserCompletion=false
<span class="token comment"># See above</span>
UserList=false
<span class="token comment"># See above</span>
Preloader=/usr/bin/preloadkde

[X-:1-Greeter]
<span class="token comment"># See above</span>
BackgroundCfg=/usr/share/config/kdm/backgroundrc.seat1
<span class="token comment"># See above</span>
DefaultUser=user2
<span class="token comment"># See above</span>
FocusPasswd=true
<span class="token comment"># See above</span>
GreeterPos=100,100
<span class="token comment"># See above</span>
LoginMode=DefaultLocal
<span class="token comment"># See above</span>
LogoArea=None
<span class="token comment"># See above</span>
PreselectUser=Default
<span class="token comment"># See above</span>
UserCompletion=false
<span class="token comment"># See above</span>
UserList=false

[X-:1-Core]
<span class="token comment"># See above</span>
AutoLoginEnable=false
<span class="token comment"># See above</span>
AutoLoginLocked=false
<span class="token comment"># See above</span>
AutoLoginUser=
<span class="token comment"># See above</span>
ServerArgsLocal=-nolisten tcp -sharevts -keeptty -config xorg.conf -layout Seat1
<span class="token comment"># See above</span>
ServerVT=9</code></pre>
</details>
<details>
<summary>/usr/share/config/kdm/backgroundrc.seat0</summary>
<pre class="language-apacheconf"><code class="language-apacheconf"><span class="token comment"># File: /usr/share/config/kdm/backgroundrc.seat0</span>

<span class="token directive-flags keyword">[Desktop0]</span>
BackgroundMode=Flat
BlendBalance=100
BlendMode=NoBlending
ChangeInterval=60
Color1=0,0,200
Color2=192,192,0
CurrentWallpaper=/usr/share/config/kdm/20100519-190000.jpg
LastChange=0
MinOptimizationDepth=1
MultiWallpaperMode=NoMulti
Pattern=fish
Program=
ReverseBlending=false
UseSHM=false
Wallpaper=/usr/share/config/kdm/20100519-190000.jpg
WallpaperMode=ScaleAndCrop</code></pre>
</details>
<details>
<summary>/usr/share/config/kdm/backgroundrc.seat1</summary>
<pre class="language-apacheconf"><code class="language-apacheconf"><span class="token comment"># File: /usr/share/config/kdm/backgroundrc.seat1</span>

<span class="token directive-flags keyword">[Desktop0]</span>
BackgroundMode=Flat
BlendBalance=100
BlendMode=NoBlending
ChangeInterval=60
Color1=0,0,200
Color2=192,192,192
CurrentWallpaper=/usr/share/config/kdm/20100519-185835.jpg
LastChange=0
MinOptimizationDepth=1
MultiWallpaperMode=NoMulti
Pattern=fish
Program=
ReverseBlending=false
UseSHM=false
Wallpaper=/usr/share/config/kdm/20100519-185835.jpg
WallpaperMode=ScaleAndCrop</code></pre>
</details>
<details>
<summary>/etc/udev/rules.d/90-creative-xmod.rules</summary>
<pre class="language-apacheconf"><code class="language-apacheconf"><span class="token comment"># File: /etc/udev/rules.d/90-creative-xmod.rules</span>

<span class="token comment"># udev rules to disginguish the two Creative usb sound cards that plug into the usb hub</span>

<span class="token comment">#DEVPATH=="/devices/pci0000:00/0000:00:1d.7/usb1/1-6/1-6.7/1-6.7.1*", GOTO="CreativeXmodLEFT"</span>
<span class="token comment">#DEVPATH=="/devices/pci0000:00/0000:00:1d.7/usb1/1-6/1-6.4*", GOTO="CreativeXmodRIGHT"</span>

DEVPATH==<span class="token string">"/devices/pci0000:00/0000:00:1d.7/usb*/*-6/*-6.7/*-6.7.1*", GOTO="CreativeXmodLEFT"</span>
DEVPATH==<span class="token string">"/devices/pci0000:00/0000:00:1d.7/usb*/*-6/*-6.4*", GOTO="CreativeXmodRIGHT"</span>

GOTO=<span class="token string">"CreativeXmodEnd"</span>

<span class="token comment">##### LEFT SEAT</span>
LABEL=<span class="token string">"CreativeXmodLEFT"</span>

ENV{ID_MODEL}=<span class="token string">"Creative_Xmod_LeftSeat", ENV{ID_MODEL_ENC}="Creative\x20Xmod\x20LeftSeat", ENV{ID_SERIAL}="Creative_Technology_Ltd_Creative_Xmod_LeftSeat", ENV{NAME}="Creative Xmod leftSeat"</span>
SYMLINK==<span class="token string">"input/by-path/pci-0000:00:1d.7-usb-0:6.7.1:1.3-event", SYMLINK+="input/by-id/CreativeXmod-Button-LeftSeat"</span>
SYMLINK==<span class="token string">"snd/by-path/pci-0000:00:1d.7-usb-0:6.7.1:1.0", SYMLINK+="snd/by-id/usb-Creative_Technology_Ltd_Creative_Xmod-LeftSeat"</span>

<span class="token comment">#ENV{ID_MODEL}="Creative_Xmod", SYMLINK+="snd/by-id/usb-Creative_Technology_Ltd_Creative_Xmod-LeftSeat"</span>

GOTO=<span class="token string">"CreativeXmodEnd"</span>
<span class="token comment">### END LEFT ###</span>

<span class="token comment"># RIGHT SEAT</span>
LABEL=<span class="token string">"CreativeXmodRIGHT"</span>

ENV{ID_MODEL}=<span class="token string">"Creative_Xmod_RightSeat", ENV{ID_MODEL_ENC}="Creative\x20Xmod\x20RightSeat", ENV{ID_SERIAL}="Creative_Technology_Ltd_Creative_Xmod_RightSeat", NAME="Creative Xmod RightSeat"</span>
SYMLINK==<span class="token string">"input/by-path/pci-0000:00:1d.7-usb-0:6.4:1.3-event", SYMLINK+="input/by-id/CreativeXmod-Button-RightSeat"</span>
SYMLINK==<span class="token string">"snd/by-path/pci-0000:00:1d.7-usb-0:6.4:1.0", SYMLINK+="snd/by-id/usb-Creative_Technology_Ltd_Creative_Xmod-RightSeat"</span>

<span class="token comment">### END RIGHT ###</span>

<span class="token comment">### common ened</span>

LABEL=<span class="token string">"CreativeXmodEnd"</span></code></pre>
</details>

    ]]></content>
  </entry><entry>
    <title>憶老方</title>
    <link href="https://blog.tklee.org/en/posts/0543-憶老方/"/>
    <updated>2015-03-06T05:43:00.001Z</updated>
    <id>https://blog.tklee.org/en/posts/0543-憶老方/</id>
    <content type="html"><![CDATA[
      <div class="post-teaser-box" data-lang="en">
老方是我師大附中三年的導師。年初他病逝，我們694班同學在臉書上私人社團裡，紛紛表達對他的懷念。我人在遠方，無法親自參加公祭，託同學把我對他的懷念和感謝帶上。
</div>
<p>憶老方</p>
<p>老方是我師大附中三年的導師。年初他病逝，我們694班同學在臉書上私人社團裡，紛紛表達對他的懷念。我人在遠方，無法親自參加公祭，託同學把我對他的懷念和感謝帶上。</p>
<p>在那個時代，給老師取綽號算是不敬。老方知道我們在背後這麼叫他，卻一笑置之。回想起來，「老方」的暱稱，和益師益友的他其實很相襯。</p>
<p>老方教數學，扎實的數學底子，讓我一生受益無窮。但我特別欣賞的，是他在課堂上不做作的態度。有時候他導公式寫了滿黑板，最後發現結果不對，他會請同學幫忙一起看，然後發現之前錯了一步時，他會拍頭一笑，回過重來。這種和學生一起探索的態度，和我與國外博士班指導教授討論想法，竟有異曲同工之妙。後來在工作上，我也用一樣的態度來帶新進的人員。我帶出來的人，特別有實驗精神，敢於表達意見，也讓我的團隊贏得最有創意的名聲。</p>
<p>老方對同學們一視同仁，但我個人有個印象深刻的小故事。</p>
<p>社團是附中特色之一。學生們在社團裡學習經營，發揮創意，結交朋友。但不少社團幹部會因此而影響學業，所以如果成績太離譜，學校會發一張「紅單子」，讓學業成績太離譜的學生不得再擔任幹部。有趣的是，在社聯會（所有社團幹部的聯誼會）裡，「拿紅單子」有時候反而被視為努力經營社團的光榮象徵。</p>
<p>高二時我擔任社團社長，把大部分心力都用在社團經營上，成績一度跌落谷底。有一天，老方把我叫到他辦公室；我當然知道他要說什麼，但我覺得反正他不可能了解社團人的執著，準備好硬著頭皮聽訓，聽完就算了。</p>
<p>進到他辦公室，他看著我笑了笑，問我知不知道他為什麼叫我來。我點了點頭。沒想到他說，「那就好。沒其他事了。」</p>
<p>霎時間，所有我事前的心戰策略全無用武之地。他輕輕一點，讓簡單的真理乍現：你成績怎樣是你的事，你知道自己在幹什麼就好。</p>
<p>雖然這好像是廢話，但我之前在一個逼讀文化（不管是當面逼，還是用制度逼）下成長學習，這是第一次看到師長直接移步側站，讓我自己去面對問題、抉擇及後果。</p>
<p>老方那句話，是我這輩子最後一次讓別人來擔心我的學業。</p>
<p>傳道，授業，解惑，老方也。</p>
<p>(My high school homeroom teacher passed away, and this is my tribute and eulogy to him. There's no English translation from me, yet.)</p>

    ]]></content>
  </entry><entry>
    <title>Sage Math Live CD for VirtualBox</title>
    <link href="https://blog.tklee.org/en/posts/0624-sage-math-live-cd-for-virtualbox/"/>
    <updated>2015-02-21T06:24:00.003Z</updated>
    <id>https://blog.tklee.org/en/posts/0624-sage-math-live-cd-for-virtualbox/</id>
    <content type="html"><![CDATA[
      <p><a href="http://www.sagemath.org/">Sage Math</a> consists of many mathematical and scientific tools and therefore the library dependencies can be quite hairy. Live CD makes it easier to do some quick and dirty job. However, booting into a live CD is quite inconvenient as far as data transportation goes, so I was trying to use VirtualBox to run a server and connect to it from the host computer.</p>
<p>There's a slight problem though. The <a href="http://www.sagemath.org/download-livecd.html">Live CD image listed on the official download page</a> is actually a raw image to write into a USB thumb drive. VirtualBox does not support mounting a image as a USB drive. Therefore, we need to convert the bootable USB thumb drive image to another format. I converted it to a hard drive image for more flexibility.</p>
<p>Here's how (I found it in <a href="http://www.macfreek.nl/memory/Mounting_a_USB_stick_with_VirtualBox">this guide</a>):</p>
<pre><code>$ VBoxManage convertfromraw -format VDI 2014-11-16-sage_6.4-debian_wheezy-live_3.0.5-1.img 2014-11-16-sage_6.4-debian_wheezy-live_3.0.5-1.vdi
</code></pre>
<p>By the way, 2014-11-16-sage_6.4-debian_wheezy-live_3.0.5-1.img is a 64-bit Debian image, which needs to be configured properly in VirtualBox.</p>

    ]]></content>
  </entry><entry>
    <title>Use 802.11n on Asus RT-N16 with OpenWrt</title>
    <link href="https://blog.tklee.org/en/posts/0300-use-802-11n-on-asus-rt-n16-with-openwrt/"/>
    <updated>2014-11-28T03:00:00Z</updated>
    <id>https://blog.tklee.org/en/posts/0300-use-802-11n-on-asus-rt-n16-with-openwrt/</id>
    <content type="html"><![CDATA[
      
<p>(If you come from OpenWrt's <a href="http://wiki.openwrt.org/toh/asus/rt-n16?&amp;#other_info">official wiki</a>, skip forward to the section &quot;802.11n&quot; for your answer.)</p>
<h2>Overview</h2>
<p>It took me a while to figure out how to setup 802.11n in OpenWrt on Asus RT-N16 so I figured I'd share the process, hopefully to save somebody's time.</p>
<h2>Background</h2>
<p>I've used <a href="http://www.dd-wrt.com/">dd-wrt</a> for a long time (on 4 wireless routers over the years). However, my network setup is getting more and more complex. While dd-wrt allows some customization, the inconsistency between GUI and the command-line configuration made it very hard for me to maintain. For example, editing the DHCP static address table from the GUI is a tedious process because it doesn't sort so it's very hard to detect duplication. I could edit the configuration file directly but the GUI does not reflect my changes correctly. Saving from the GUI can easily overwrite my manually edited config files.</p>
<h2>Choosing Alternatives</h2>
<p>Therefore, I started to look for an alternative. Besides dd-wrt, <a href="http://tomatousb.org/mods">Tomato and it's family</a>, and <a href="https://openwrt.org/">OpenWrt</a> are the other two high-profile router firmware development efforts. And both lineages provide very customizable environment.</p>
<p>However, there are two things I'm looking for.</p>
<ol>
<li>
<p>I am looking for a project that's still actively maintained, especially after <a href="http://en.wikipedia.org/wiki/Heartbleed">Heart Bleed</a>, <a href="http://en.wikipedia.org/wiki/Shellshock_(software_bug)">Shell Shock</a>, and <a href="http://en.wikipedia.org/wiki/POODLE">Poodle</a>. (Note that these vulnerabilities don't necessarily compromise home routers, but in my environment, I'd rather not take the chance.) While a repository system allows individual package upgrade, I want the base developers to still be around.</p>
</li>
<li>
<p>I'm looking for a project that's owned by a team rather than individuals. In the WRT history, there have been many brilliant individuals that made crucial advances for everyone. However, it has happened a few times when these individuals moved on, their projects died, too.</p>
</li>
</ol>
<p>Therefore, I ended up choosing OpenWrt.</p>
<h2>Installation</h2>
<p>It was quite straightforward to switch to OpenWrt from dd-wrt, as instructed in <a href="http://wiki.openwrt.org/toh/asus/rt-n16">the official guide</a>.</p>
<p>Securing the admin access was obvious. However, it took me a while to realize that I also needed to reboot my Cable Modem for it to reset its DHCP. If you are also doing this, I suggest you open all installation guides in the browser first before you flash your new firmware. I had to use my phone to check the guides before my internet was up.</p>
<h2>802.11n</h2>
<p>This took me a while because <a href="http://wiki.openwrt.org/doc/hardware/soc/soc.broadcom.bcm47xx">the guide</a> is not very obvious. Anyway, after some trials and errors, broadcom-wl was the only one that worked for me (thanks to <a href="https://blog.tklee.org/posts/2014-11-28-0300-use-802-11n-on-asus-rt-n16-with-openwrt/">Stratos</a> about the dependency nas. I already had that so I didn't realize that dependency).</p>
<pre class="language-bash"><code class="language-bash">opkg update
opkg <span class="token function">install</span> kmod-brcm-wl wl wlc
<span class="token function">rm</span> /etc/config/wireless
opkg <span class="token function">install</span> nas
<span class="token function">reboot</span></code></pre>
<p>Then login to shell again to edit /etc/config/wireless . This is mine.</p>
<pre class="language-ini"><code class="language-ini">config wifi-device  wl0
        option type       broadcom
        option channel    1
        option txantenna  3
        option rxantenna  3
        option txpower    '20'
        option plcphdr    'auto'
        option frameburst 1
        option disabled   0
config wifi-iface
        option device     wl0
        option network    lan
        option mode       ap
        option ssid       YOUR\_SSID
        option key        YOUR\_KEY
        option wmm        1
        option encryption 'psk2'
        option disabled   '0'</code></pre>
<p>I added plcphdr and frameburst after reading <a href="http://www.linksysinfo.org/index.php?threads/my-asus-rt-n16-wireless-transmission-speed-useless.37412/">this discussion thread</a>.</p>
<p>Another strange thing to work around is that after reboot, while a client can connect to the router with 802.11n, the DHCP failed to issue IPs. I had to turn the wifi off and on for it to work properly.</p>
<pre class="language-bash"><code class="language-bash">wifi down
wifi up</code></pre>
<p>I did not spend time debugging. Instead, as a temporary workaround, I added that to /etc/rc.local, which now looks like this:</p>
<pre class="language-bash"><code class="language-bash"><span class="token comment"># Put your custom commands here that should be executed once</span>
<span class="token comment"># the system init finished. By default this file does nothing.</span>
<span class="token comment"># workaround for Broadcom proprietary driver problem</span>
/sbin/wifi down
/bin/sleep <span class="token number">1</span>
/sbin/wifi up
<span class="token builtin class-name">exit</span> <span class="token number">0</span></code></pre>
<p>Update: <a href="https://blog.tklee.org/posts/2014-11-28-0300-use-802-11n-on-asus-rt-n16-with-openwrt/">badineu in the comment</a> mentioned that he also needed to manually select the wifi frequency. You may also have to do so if, for some reason, it's not already properly set.<br />
</p>
<div class="post-comments" style="margin-top: 4rem; padding-top: 2rem; border-top: 2px dashed var(--glass-border);">
<h3 class="comments-title" style="font-size: 1.5rem; margin-bottom: 2rem; color: var(--primary-color); text-shadow: 0 0 10px rgba(56,189,248,0.2);">Comments</h3>

<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;">Anonymous</strong> <span class="comment-date" style="opacity: 0.7;">on Sunday, March 22, 2015 at 3:15:00 PM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Thank you!  Your workaround for the Broadcom proprietary driver helped me finish my configuration.</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-author"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11411703278692679285" target="_blank" rel="nofollow">TK</a></strong> <span class="comment-date" style="opacity: 0.7;">on Thursday, March 26, 2015 at 12:19:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>I'm glad that this guide helped you. Thank you for letting me know.</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;">StratoS</strong> <span class="comment-date" style="opacity: 0.7;">on Monday, March 30, 2015 at 7:22:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>You have to install utility called nas to get wifi authentication working:</p><p></p>
<pre><code>opkg update
opkg install nas
</code></pre>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-author"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11411703278692679285" target="_blank" rel="nofollow">TK</a></strong> <span class="comment-date" style="opacity: 0.7;">on Monday, April 13, 2015 at 12:40:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Thanks a lot, StratoS. I've updated the post to include your info. I already had that installed so I didn't realize its dependency.</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;">Anonymous</strong> <span class="comment-date" style="opacity: 0.7;">on Wednesday, June 10, 2015 at 3:36:00 PM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Thank you for the info! I was not able to get a stable connection using the kmod-brcmsmac driver but 'kmod-brcm-wl' driver is rock solid!</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;">Anonymous</strong> <span class="comment-date" style="opacity: 0.7;">on Friday, June 26, 2015 at 1:37:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Thank you! I also had to switch the operating frequency in the wifi settings<br /><br />
<a href="https://i.imgur.com/IIqwRfI.png">https://i.imgur.com/IIqwRfI.png</a></p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-author"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11411703278692679285" target="_blank" rel="nofollow">TK</a></strong> <span class="comment-date" style="opacity: 0.7;">on Saturday, June 27, 2015 at 3:05:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Thanks for letting me know, my anonymous friend.</p><p></p>
<p>badineu, I added a note at the end of the post to mention that. Thank you for adding that info.</p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;">Anonymous</strong> <span class="comment-date" style="opacity: 0.7;">on Saturday, September 12, 2015 at 1:13:00 PM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Directions worked perfectly on the latest release, Chaos Calmer 15.05. Thanks for the info!</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-author"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11411703278692679285" target="_blank" rel="nofollow">TK</a></strong> <span class="comment-date" style="opacity: 0.7;">on Sunday, September 13, 2015 at 7:33:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Wonderful. Glad it helped.</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/05147563059517422720" target="_blank" rel="nofollow">Unknown</a></strong> <span class="comment-date" style="opacity: 0.7;">on Monday, October 12, 2015 at 10:11:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Thank u, it is working great!!</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-author"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11411703278692679285" target="_blank" rel="nofollow">TK</a></strong> <span class="comment-date" style="opacity: 0.7;">on Sunday, October 25, 2015 at 3:01:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>You are welcome! Glad I could help.</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/09148945559718153623" target="_blank" rel="nofollow">Unknown</a></strong> <span class="comment-date" style="opacity: 0.7;">on Thursday, October 15, 2015 at 8:45:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>I use N16 both as Client and Master. With what you gave</p><p></p>
<pre><code>/sbin/wifi down
/bin/sleep 1
/sbin/wifi up
</code></pre>
<p>Client mode works perfectly after reboot but Master mode does not. As you said, while a client can connect to the router with 802.11n, the DHCP failed to issue IPs.</p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-author"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11411703278692679285" target="_blank" rel="nofollow">TK</a></strong> <span class="comment-date" style="opacity: 0.7;">on Thursday, October 22, 2015 at 7:25:00 PM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Hero, my setting works for me on the Master (AP) mode, which is probably what most people use here, so I assume it works for most people on the Master mode. I'm therefore a bit surprised that you client mode works but master doesn't. I wish I could be of more help.</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/09148945559718153623" target="_blank" rel="nofollow">Unknown</a></strong> <span class="comment-date" style="opacity: 0.7;">on Thursday, October 15, 2015 at 9:01:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p><a href="http://screenshot.net/y2jolsp.jpg">http://screenshot.net/y2jolsp.jpg</a></p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/07747476594484639108" target="_blank" rel="nofollow">Brain2000</a></strong> <span class="comment-date" style="opacity: 0.7;">on Sunday, February 7, 2016 at 6:43:00 PM EST</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Be careful using kmod-brcmsmac with the RT-N16.  It uses 100% of the CPU at under 20mbits.  The kmod-b43 works perfectly at 5% at about 20mbits, but unfortunately it doesn't support N.  For me the Broadcom-wl proprietary driver isn't a solution because it doesn't support 802.1X authentication.</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-author"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11411703278692679285" target="_blank" rel="nofollow">TK</a></strong> <span class="comment-date" style="opacity: 0.7;">on Tuesday, February 9, 2016 at 10:29:00 PM EST</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Thanks for the information. My router CPU level is very low though. I wonder what made the difference on your side.</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/16442311390044085557" target="_blank" rel="nofollow">Chen</a></strong> <span class="comment-date" style="opacity: 0.7;">on Wednesday, July 13, 2016 at 1:40:00 AM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Thanks. You saved my day. Unable to get 11n has been a huge trouble since i flashed my RT-N16 to OpenWrt</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-author"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11411703278692679285" target="_blank" rel="nofollow">TK</a></strong> <span class="comment-date" style="opacity: 0.7;">on Friday, July 15, 2016 at 2:13:00 PM EDT</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>You are welcome. I'm glad it was helpful for you.</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/13627121710692026878" target="_blank" rel="nofollow">Garrett</a></strong> <span class="comment-date" style="opacity: 0.7;">on Tuesday, December 27, 2016 at 12:12:00 PM EST</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>works with current release of 15.05.1. Thank you!</p><p></p>
<p>Note: the 2nd line of your instructions is missing 'install' after opkg...</p>
<p>opkg install kmod-brcm-wl wl wlc</p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-author"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/11411703278692679285" target="_blank" rel="nofollow">TK</a></strong> <span class="comment-date" style="opacity: 0.7;">on Sunday, January 1, 2017 at 10:35:00 PM EST</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>Thank you! Updated.</p><p></p>
<p></p></div><br />
</div><p></p>
<p></p><div class="conversation-other"><br />
<div class="comment-meta" style="font-size: 0.9em; color: var(--text-muted); margin-bottom: 0.8rem; display: flex; gap: 0.5rem; align-items: center;"><br />
<strong style="color: var(--text-main); font-weight: 600;"><a href="https://www.blogger.com/profile/15762438477235511121" target="_blank" rel="nofollow">Gene</a></strong> <span class="comment-date" style="opacity: 0.7;">on Sunday, February 20, 2022 at 5:26:00 PM EST</span><br />
</div><br />
<div class="comment-body" style="line-height: 1.6; color: var(--text-main); opacity: 0.9;"><br />
<p>plcphdr makes absolutely no sense as it's absent from broadcom.sh script, that is mapping uci config to wlc command.</p><p></p>
<p></p></div><br />
</div><p></p>
</div>

    ]]></content>
  </entry><entry>
    <title>Arduino IDE 1.5.8 on Banana Pi</title>
    <link href="https://blog.tklee.org/en/posts/0438-arduino-ide-1-5-8-on-banana-pi/"/>
    <updated>2014-10-12T04:38:00Z</updated>
    <id>https://blog.tklee.org/en/posts/0438-arduino-ide-1-5-8-on-banana-pi/</id>
    <content type="html"><![CDATA[
      
<p>I use Arch Linux on Banana Pi. In my <a href="https://blog.tklee.org/posts/2014-10-11-0013-control-arduino-ide-1-5-8-with-command-line/">previous post</a>, I used a workaround to compile Arduino code on an x86_64 platform and then copy the <code>*.hex</code> file to upload to Arduino from Banana Pi. While i7-4770 is very fast, it's also very power hungry. I dug a little bit and managed to get Arduino IDE 1.5.8 running on my Banana Pi.</p>
<p>If you want to install Arduino 1.0.5-1, Arch Assault Repo has an <a href="https://archassault.org/packages/archassault/armv7h/arduino/">almost working version</a>. To make it work, you'll need to install java-rxtx, and replace <code>/usr/share/arduino/lib/librxtxSerial.so</code> with a symlink to <code>/usr/lib/librxtxSerial.so</code> , and also <code>RXTXcomm.jar</code> -&gt; <code>/usr/share/java/rxtx/RXTXcomm.jar</code></p>
<p>Now, this is how I got version 1.5.8 working (thanks to <a href="http://forum.arduino.cc/index.php?topic=190163.0">this post</a> for a pointer):</p>
<p>Use the following PKGBULID (modified from <a href="https://aur.archlinux.org/packages/arduino-beta/">its AUR</a> for x86 and x86_64) to build and install a package:</p>
<pre class="language-bash"><code class="language-bash"><span class="token comment"># Maintainer: Lauri Hakko</span>
<span class="token comment"># Contributor: PyroPeter</span>
<span class="token comment"># Contributor: darkapex</span>

<span class="token assign-left variable">pkgname</span><span class="token operator">=</span>arduino-beta
<span class="token assign-left variable">epoch</span><span class="token operator">=</span><span class="token number">1</span>
<span class="token assign-left variable">pkgver</span><span class="token operator">=</span><span class="token number">1.5</span>.8
<span class="token assign-left variable">pkgrel</span><span class="token operator">=</span><span class="token number">1</span>
<span class="token assign-left variable">pkgdesc</span><span class="token operator">=</span><span class="token string">"Arduino SDK Beta release"</span>
<span class="token assign-left variable">arch</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token string">'armv7h'</span><span class="token punctuation">)</span>
<span class="token assign-left variable">url</span><span class="token operator">=</span><span class="token string">"http://arduino.cc/en/Main/Software"</span>
<span class="token assign-left variable">options</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token operator">!</span>strip<span class="token punctuation">)</span>
<span class="token assign-left variable">license</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token string">'GPL'</span><span class="token punctuation">)</span>
<span class="token assign-left variable">depends</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token string">'avr-libc'</span> <span class="token string">'libusb-compat'</span> <span class="token string">'java-runtime'</span><span class="token punctuation">)</span>
<span class="token assign-left variable">install</span><span class="token operator">=</span><span class="token string">"arduino.install"</span>
<span class="token assign-left variable">conflicts</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token string">'arduino'</span> <span class="token string">'arduino-toolchain'</span><span class="token punctuation">)</span>
<span class="token assign-left variable">provides</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token string">'arduino'</span><span class="token punctuation">)</span>
<span class="token assign-left variable">source</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token string">"http://downloads.arduino.cc/arduino-<span class="token variable">${pkgver<span class="token operator">/</span><span class="token operator">/</span>_<span class="token operator">/</span>-}</span>-linux32.tgz"</span>
    <span class="token string">'arduino'</span>
    <span class="token string">'arduino.png'</span>
    <span class="token string">'arduino.desktop'</span><span class="token punctuation">)</span>
<span class="token assign-left variable">md5sums</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token string">'289b1e3ad64f29db3ed13b06880dce40'</span>
         <span class="token string">'5e385c8cba80ca1b4227b162e4cad5cd'</span>
         <span class="token string">'9e36d33891d5e68d38ec55d1494499a5'</span>
         <span class="token string">'eebc4d6495864bea99ad057af801afb9'</span><span class="token punctuation">)</span>

<span class="token function-name function">package</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token builtin class-name">cd</span> <span class="token string">"<span class="token variable">$srcdir</span>/arduino-<span class="token variable">${pkgver<span class="token operator">/</span><span class="token operator">/</span>_<span class="token operator">/</span>-}</span>"</span>

  <span class="token comment"># arduino excutable should accept arguments</span>
  <span class="token function">sed</span> <span class="token parameter variable">-i</span> <span class="token string">'s/^java .* processing.app.Base$/\0 "$*"/'</span> arduino

  <span class="token function">mkdir</span> <span class="token parameter variable">-p</span> <span class="token string">"<span class="token variable">$pkgdir</span>"</span>/usr/<span class="token punctuation">{</span>bin,share/<span class="token punctuation">{</span>doc,applications,pixmaps<span class="token punctuation">}</span><span class="token punctuation">}</span>

  <span class="token comment"># copy the whole SDK to /usr/share/arduino/</span>
  <span class="token function">cp</span> <span class="token parameter variable">-r</span> <span class="token builtin class-name">.</span> <span class="token string">"<span class="token variable">$pkgdir</span>/usr/share/arduino"</span>

  <span class="token comment"># at least support the FHS a little bit:</span>
  <span class="token function">install</span> <span class="token parameter variable">-m755</span> <span class="token string">"<span class="token variable">$srcdir</span>/arduino"</span> <span class="token string">"<span class="token variable">$pkgdir</span>/usr/bin/arduino"</span>
  <span class="token function">ln</span> <span class="token parameter variable">-s</span> /usr/share/arduino/reference <span class="token string">"<span class="token variable">$pkgdir</span>/usr/share/doc/arduino"</span>

  <span class="token comment"># desktop icon</span>
  <span class="token function">install</span> <span class="token parameter variable">-m644</span> <span class="token string">"<span class="token variable">$srcdir</span>/arduino.desktop"</span> <span class="token string">"<span class="token variable">$pkgdir</span>/usr/share/applications/"</span>
  <span class="token function">install</span> <span class="token parameter variable">-m644</span> <span class="token string">"<span class="token variable">$srcdir</span>/arduino.png"</span> <span class="token string">"<span class="token variable">$pkgdir</span>/usr/share/pixmaps/"</span>
<span class="token punctuation">}</span></code></pre>
<p>This version won't run because <code>/usr/share/arduino/hardware/tools/*</code> are compiled for x86. We need those files compiled for Arm7. Let's remove <code>/usr/share/arduino/hardware/tools</code> now.</p>
<p>Download a pre-compiled version 1.5.4 by UDOO folks (big thanks for their efforts!). Go to their <a href="http://www.udoo.org/downloads">download page</a>, click on Driver &amp; Tools, and click on <a href="http://udoo.org/download/assets/2014-10-12-0438/arduino-1.5.4-for_UDOO.tar.gz">Arduino IDE for UDOO</a>. Unpack the archive. We only need <code>arduino/hardware/tools</code>. Move it to <code>/usr/share/arduino/hardware/tools</code>.</p>
<p>Since 1.5.8 above expects avr tools in <code>/usr/share/arduino/hardware/tools/avr</code>, and Arch installs it separately, so we need to make another two symlinks.</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">ln</span> <span class="token parameter variable">-s</span> /usr/bin /usr/share/arduino/hardware/tools/avr/
<span class="token function">ln</span> <span class="token parameter variable">-s</span> /etc /usr/share/arduino/hardware/tools/avr/</code></pre>
<p>There's one more file we need to replace: <code>arduino/lib/libastylej.so</code> . I just installed a style from archlinuxarm.org and do a symlink <code>libastylej.so</code> -&gt; <code>/usr/lib/libastyle.so</code></p>
<p>That's it.<br />
</p>

    ]]></content>
  </entry><entry>
    <title>Control Arduino IDE 1.5.8 with command line</title>
    <link href="https://blog.tklee.org/en/posts/0013-control-arduino-ide-1-5-8-with-command-line/"/>
    <updated>2014-10-11T00:13:00Z</updated>
    <id>https://blog.tklee.org/en/posts/0013-control-arduino-ide-1-5-8-with-command-line/</id>
    <content type="html"><![CDATA[
      <p>My workbench for Arduino development does not have enough space for a high power PC so I use lower power Arm devices (<a href="http://www.raspberrypi.org/">Raspberry Pi</a>, <a href="http://www.bananapi.org/">Banana Pi</a>, and <a href="http://www.dragino.com/products/yunshield/item/86-yun-shield.html">Yun Shield</a>) instead. However, Arduino IDE 1.5.x is not well supported yet (Raspbery Pi has a working version but not the other two, which I prefer. UPDATE: I <a href="https://blog.tklee.org/posts/2014-10-12-0438-arduino-ide-1-5-8-on-banana-pi/">figured it out</a>.), and several Makefile solutions are still buggy against 1.5.x's libraries.</p>
<p>My temporary solution is to outsource the compiling to the more powerful machine (my i7-4770 running Arch 64 finishes compilation almost instantly, as opposed to 40 seconds on Raspberry Pi), and grab the compiled *.hex file back to these Arm devices to upload to Arduino via the USB serial connection.</p>
<p>As of October 4, 2014, Arduino IDE 1.5.8 has a buggy command line parameter passing, so I cannot compile the code remotely without doing a remote X session, and I want to avoid having to run an X server on these Arm devices (although Banana Pi actually runs X quite well). Therefore, I use the following hack to trigger the compiling via the command line.</p>
<pre><code>DISPLAY=:0 xdotool search --name &quot;Arduino 1.5.8&quot; windowactivate --sync windowfocus mousemove --window %1 10 30 click 1
</code></pre>
<p><em>xdotool</em> searches for a window whose title contains &quot;Arduino 1.5.8&quot;, activates the virtual desktop it's on, focuses on the window, moves the mouse cursor to coordinates (10,30) relative to the application window (where the &quot;Verify/Compile&quot; button is) and then click on it to trigger the compilation.</p>
<p>For some reason sending <kbd>ctrl</kbd>+<kbd>R</kbd> doesn't work for me. If anyone knows why, I'd love to know.</p>
<pre><code># this doesn't work
DISPLAY=:0 xdotool search --name &quot;Arduino 1.5.8&quot; windowactivate --sync windowfocus key ctrl+r
</code></pre>

    ]]></content>
  </entry>
</feed>
