<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Order from Chaos</title>
    <link rel="self" type="application/atom+xml" href="https://blog.wiwie.dk/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://blog.wiwie.dk"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2025-09-22T22:34:58+00:00</updated>
    <id>https://blog.wiwie.dk/atom.xml</id>
    <entry xml:lang="en">
        <title>Take Time for the Important Things 2.0</title>
        <published>2025-09-22T22:34:58+00:00</published>
        <updated>2025-09-22T22:34:58+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/zeit-wichtige-dinge-2-0/"/>
        <id>https://blog.wiwie.dk/zeit-wichtige-dinge-2-0/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/zeit-wichtige-dinge-2-0/">&lt;h1 id=&quot;ten-years-later-work-family-and-the-digital-swamp&quot;&gt;Ten Years Later: Work, Family, and the Digital Swamp&lt;&#x2F;h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This post is a follow-up to &lt;a href=&quot;https:&#x2F;&#x2F;blog.wiwie.dk&#x2F;zeit-wichtige-dinge&#x2F;&quot;&gt;a post I wrote back in 2014&lt;&#x2F;a&gt;. Back then, I explored my struggles with spending too much time at the computer and not enough on what I truly valued. More than ten years have passed since then, and I want to look back, reflect on what has changed, and acknowledge what has stayed the same.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;In 2014, I wrote about the gap between how I wanted to spend my days and how I actually did. Back then, I noticed myself sinking into what I called a digital &quot;swamp&quot; - binging series, losing evenings to screens, and feeling stuck between my intentions and my actions.&lt;&#x2F;p&gt;
&lt;p&gt;It’s now more than a decade later, and while much has changed in my life, I still recognize many of the same struggles.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;leaving-academia-and-changing-careers&quot;&gt;Leaving Academia and Changing Careers&lt;&#x2F;h2&gt;
&lt;p&gt;After finishing my PhD and working as a PostDoc for some time, I moved from academia into private industry. My first job was still close to my academic field - bioinformatics - but later I shifted further away, into software engineering in the media sector. This transition had a big impact on my work-life balance.&lt;&#x2F;p&gt;
&lt;p&gt;The media industry, at least where I work now, feels far less academic in culture than my first private-sector job. The people around me seem to maintain healthier boundaries. Interestingly, I&#x27;ve noticed that colleagues with primarily academic backgrounds - PhDs and higher - often struggle more with work-life balance, even outside of academia.&lt;&#x2F;p&gt;
&lt;p&gt;At the same time, I’ve had to confront some of my own tendencies that make balance difficult. I am deeply perfectionistic, I commit myself 100% to goals, and I find it extremely difficult to &lt;em&gt;not&lt;&#x2F;em&gt; achieve something once I’ve set my mind to it. In software design, the &quot;fail fast&quot; principle is celebrated - test ideas quickly, discard what doesn’t work, and move on. For me, that mindset is hard to adopt. I tend to overinvest, sometimes long past the point when it would have been wiser to stop. This drive has served me at times - without it I probably  never would have finished my PhD - but it also risks tipping me into unhealthy overcommitment.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;family-life-and-new-priorities&quot;&gt;Family Life and New Priorities&lt;&#x2F;h2&gt;
&lt;p&gt;In 2017 and 2019, my two boys were born, and life changed completely. The demands of family life reshaped my days and priorities.&lt;&#x2F;p&gt;
&lt;p&gt;One clear consequence is that I lost the running habit I had built in my twenties. Back then, I would go running every other day, and it was a core part of how I stayed balanced. Over time, the habit slowly faded, replaced by increasingly bad excuses. Since then, I’ve struggled to bring it back. Every now and then I manage to go for a single run, but often several weeks pass in between. I do cycle more frequently these days - when picking up the kids from school or taking them to soccer practice - but it rarely feels like a real substitute. Running was more demanding, more exhausting in the good sense, and gave me a stronger sense of balance than the practical trips on the bike ever do.&lt;&#x2F;p&gt;
&lt;p&gt;At the same time, family life has filled much of my social bandwidth. I feel socially &quot;saturated&quot; at home, and as an introvert that often means I have little energy left for maintaining friendships. I regret how much these relationships have faded, but it is a reality I haven’t found a good solution for yet.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;persistent-struggles&quot;&gt;Persistent Struggles&lt;&#x2F;h2&gt;
&lt;p&gt;Even with these changes in work and family life, I can’t say that much has changed since my 2014 post. I have periods where I manage better, but also long stretches where I feel stuck. The digital &quot;swamp&quot; is still very real - though instead of TV series, it’s now mostly YouTube and gaming. These habits are deeply entrenched and hard to replace.&lt;&#x2F;p&gt;
&lt;p&gt;Losing my running routine made this even harder. Back when I ran every other day, I had a built-in outlet for stress and a way to recharge. Without it, I often fall back into the easy comfort of screens. Cycling to pick up the kids or bring them to soccer practice helps me move, but it doesn’t give me the same sense of balance or release that running once did.&lt;&#x2F;p&gt;
&lt;p&gt;Part of this also ties into how I manage my energy as an introvert. Family life already fills me up socially, and I am easily overstimulated by noise and constant interaction. After a full day, I often retreat into digital spaces to recharge and enjoy some solitude. Too often, though, that &quot;me time&quot; turns into hours online. It provides quick relief, but rarely matches the deeper goals I wish to pursue - like writing, reading, or creating.&lt;&#x2F;p&gt;
&lt;p&gt;This tension also affects my friendships. Since becoming a parent, I’ve become much worse at maintaining them. After giving so much socially at home, I often have little left for friends. Combined with the pull of digital habits, it becomes all too easy to retreat into the screen instead of choosing the slower, more effortful, but ultimately more fulfilling alternatives.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;possible-related-ideas-for-future-reading&quot;&gt;Possible Related Ideas for Future Reading&lt;&#x2F;h2&gt;
&lt;p&gt;I haven’t read the following references yet, so I can’t say for sure how well they apply. But they could be related to the struggles I’ve described - so stay tuned for the next update ... in 10 years - he he he:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;on-workaholism-and-perfectionism&quot;&gt;On Workaholism and Perfectionism&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Regulatory Focus Theory (Higgins, 1997):&lt;&#x2F;strong&gt; Describes how people pursue goals with either a “promotion” focus (striving for gains) or a “prevention” focus (avoiding losses). My tendency to overcommit and struggle to let go of projects might connect here.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Goal Disengagement and Reengagement (Wrosch et al., 2003):&lt;&#x2F;strong&gt; Research shows that the ability to let go of unattainable goals and reinvest in new ones is linked to better well-being. This is very close to the &quot;fail fast&quot; principle, which I often struggle to apply in practice.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Error Management and Growth Mindset (Frese &amp;amp; Keith, 2015; Dweck, 2006):&lt;&#x2F;strong&gt; Both highlight the importance of treating mistakes not as failures but as learning opportunities. This resonates with the &lt;em&gt;fail fast&lt;&#x2F;em&gt; idea and contrasts with my perfectionistic tendency to overinvest rather than move on.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;on-digital-habits-self-regulation-and-introversion&quot;&gt;On Digital Habits, Self-Regulation, and Introversion&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Self-Discrepancy Theory (Higgins, 1987):&lt;&#x2F;strong&gt; Explores the gap between our “actual self” and &quot;ideal self&quot;. This might connect to the way my evenings often drift into YouTube or gaming rather than the creative or fulfilling activities I’d prefer.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compensatory Internet Use Theory (Kardefelt-Winther, 2014):&lt;&#x2F;strong&gt; Suggests that people turn to the internet to cope with stress, loneliness, or unmet needs. This could relate to how I retreat into digital activities as a way of unwinding when I feel drained.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Person–Environment Fit Theory (Caplan, 1987):&lt;&#x2F;strong&gt; Focuses on the alignment between individual traits (like introversion) and environmental demands. This may help explain why I get easily overstimulated socially and then withdraw into digital alone-time.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Automatic mounting of all NFS shares of an NFS server with autofs</title>
        <published>2023-02-18T22:52:17+01:00</published>
        <updated>2023-02-18T22:52:17+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/automatic-nfs-mounting/"/>
        <id>https://blog.wiwie.dk/automatic-nfs-mounting/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/automatic-nfs-mounting/">&lt;p&gt;autofs can be used to automatically mount file systems when they are accessed. autofs can either&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;read mount pairs that are explicitly specified in &lt;code&gt;auto.XXX&lt;&#x2F;code&gt; files that are added to the &lt;code&gt;auto.master&lt;&#x2F;code&gt; file, or&lt;&#x2F;li&gt;
&lt;li&gt;it can also execute a script that dynamically generates a mount command that is then executed by autofs.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The advantage of the latter is, that specified mount pairs do not need to be adapted each time the shares on the target change, but instead the script can read these changes automatically and feed them to autofs. Renaming a share on the target would then lead to a renamed mount point.&lt;&#x2F;p&gt;
&lt;p&gt;For automatically mounting CIFS shares this way, there is already a auto.smb script included in the autofs packages (at least on Ubuntu). However, for nfs I could not find such a script.&lt;&#x2F;p&gt;
&lt;p&gt;That is why I wrote it myself:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#!&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;key=&amp;quot;$1&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;opts=&amp;quot;-defaults,fstype=nfs4&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;for P in &#x2F;bin &#x2F;sbin &#x2F;usr&#x2F;bin &#x2F;usr&#x2F;sbin
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;do
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        if [ -x $P&#x2F;showmount ]
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        then
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                SHOWMOUNT=$P&#x2F;showmount
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                break
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        fi
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;done
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;[ -x $SHOWMOUNT ] || exit 1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;$SHOWMOUNT -e &amp;quot;$key&amp;quot; 2&amp;gt;&#x2F;dev&#x2F;null | awk -v &amp;quot;key=$key&amp;quot; -v &amp;quot;opts=$opts&amp;quot; -F &amp;#39; &amp;#39; -- &amp;#39;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        BEGIN   { ORS=&amp;quot;&amp;quot;; first=1 }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        &#x2F;\&#x2F;&#x2F;  {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                  if (first)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                        print opts; first=0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                  dir = $1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                  gsub(&#x2F;.*\&#x2F;&#x2F;, &amp;quot;&#x2F;&amp;quot;, dir)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                  loc = $1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                  # Enclose mount dir and location in quotes
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                  print &amp;quot; \\\n\t \&amp;quot;&amp;quot; dir &amp;quot;\&amp;quot;&amp;quot;, &amp;quot;\&amp;quot;&amp;quot; key &amp;quot;:&amp;quot; loc &amp;quot;\&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;                }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        END     { if (!first) print &amp;quot;\n&amp;quot;; else exit 1 }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        &amp;#39;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The script takes one parameter (which is the hostname of the NFS server). It then uses the showmount command, to retrieve a list of NFS shares and formats them in a way, that autofs can understand.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hugo Embeds</title>
        <published>2022-02-16T21:26:49+01:00</published>
        <updated>2022-02-16T21:26:49+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/hugo-oembed/"/>
        <id>https://blog.wiwie.dk/hugo-oembed/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/hugo-oembed/">&lt;p&gt;I was looking into how one can make use of oEmbeds within hugo. It did work using some Javascript plus a server-side component that would do the actual oembed resolution. I dropped the idea again though, mostly because I didn&#x27;t like the way oembeds of random sites in my posts would look different, how my visitor&#x27;s privacy would be given away, and how it would require sideloading all kinds of creepy javascript and css files.&lt;&#x2F;p&gt;
&lt;p&gt;Currently, I&#x27;m instead using &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jacktuck&#x2F;unfurl&#x2F;&quot;&gt;this scraper library&lt;&#x2F;a&gt; to retrieve metadata from the linked pages on hugo-build-time, and use the resolved opengraph, twitter-card, or generic metadata to generate my own custom styled embed widget. This approach doesn&#x27;t require any client side magic and everything happens in a privacy-friendly manner when this site is generated.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;github.com&#x2F;jacktuck&#x2F;unfurl&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;github.com&#x2F;nfl&#x2F;jquery-oembed-all&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;bofh.org.uk&#x2F;2020&#x2F;05&#x2F;12&#x2F;oembed-for-hugo&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;discourse.gohugo.io&#x2F;t&#x2F;oembed-support&#x2F;185&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Our Electricity Plan</title>
        <published>2021-10-01T00:00:00+00:00</published>
        <updated>2021-10-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/electricity-plan/"/>
        <id>https://blog.wiwie.dk/electricity-plan/</id>
        
        <summary type="html">&lt;p&gt;Recently we changed to an electricity plan at our energy provider that is 100% wind power (Energi Fyn - &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.energifyn.dk&#x2F;privat&#x2F;el&#x2F;naturel&#x2F;&quot;&gt;NaturEl&lt;&#x2F;a&gt;). The cost difference from our previous plan was comparably small (41 vs 37 øre&#x2F;kWh), while this significantly reduces emissions.&lt;&#x2F;p&gt;
&lt;p&gt;While I disagree with calling the wind power plan emission free as Energi Fyn does (since production and maintenance for wind turbines should be incorporated into this value), average co2 emission levels of offshore wind power is denoted as 12g&#x2F;kWh &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Life-cycle_greenhouse_gas_emissions_of_energy_sources&quot;&gt;on Wikipedia&lt;&#x2F;a&gt; - so are still pretty low.&lt;&#x2F;p&gt;
&lt;p&gt;Thus, assuming that Energi Fyn mostly uses offshore wind parks with a technological level causing median levels of emission, this still corresponds to a highly significant decrease in caused co2 emissions per kWh from 383g (our previous plan) to just 12g.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Firefox Rant</title>
        <published>2021-08-05T23:05:00+00:00</published>
        <updated>2021-08-05T23:05:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/firefox-rant/"/>
        <id>https://blog.wiwie.dk/firefox-rant/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/firefox-rant/">&lt;p&gt;I believe I have been using #Firefox continuously since my Bachelors starting in 2005. And now that I think about it, very likely even before that.&lt;&#x2F;p&gt;
&lt;p&gt;For a very long time it fit my desires: tweakable, customizable and opportunistic (suck it G*).&lt;&#x2F;p&gt;
&lt;p&gt;After they slimmed down, streamlined and squeezed Firefox into the corset of Chromium&#x2F;WebExtensionsism together with all the other browser-bunch it had lost all its appeal in terms of tweakability, customizability for me. Extension APIs on Desktop are way too restricted compared to before, and the number of extensions for the new and shiny Firefox Android speaks for itself. Seriously, it&#x27;s a joke.&lt;&#x2F;p&gt;
&lt;p&gt;But I still felt, privacy is important enough to stick to it. So I kept using it. Recently though I got increasingly more frustrated using it, one eye always on the competition. Not really any particular reason, just that I feel that since those major changes it had lost its only unique selling point (Alleinstellungsmerkmal) I guess. Now it&#x27;s just one of many browsers, and not really better at any of the tasks than any of the other browsers anymore. Plus, I increasingly feel its development turns slower and slower. Which makes sense in light of news about cutdowns at Mozilla.&lt;&#x2F;p&gt;
&lt;p&gt;Tried several Chromium-based browsers in recent weeks, and it&#x27;s shocking how many really good features and good UI decisions other browsers have.&lt;&#x2F;p&gt;
&lt;p&gt;Well, no particular reason why I&#x27;m writing this. I guess it&#x27;s that I&#x27;d love to stay with Firefox and that it feels like betrayel if I switched to another.&lt;&#x2F;p&gt;
&lt;p&gt;I still do have my doubts about most other browsers (especially when using sync features), but seriously as soon as a #browser comes along that combines the chrome engine&#x27;s snapiness with Firefox&#x27;s privacy and Vivaldi&#x27;s (former Firefox&#x27;s) customizability I&#x27;ll be gone.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Attributes I thought I had, parenthood proved me wrong</title>
        <published>2020-09-15T23:10:20+01:00</published>
        <updated>2020-09-15T23:10:20+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/attributes-parenting/"/>
        <id>https://blog.wiwie.dk/attributes-parenting/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/attributes-parenting/">&lt;p&gt;An excerpt of attributes I was convinced I had, where parenthood proved me wrong:
patient&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;calm&lt;&#x2F;li&gt;
&lt;li&gt;flexible&lt;&#x2F;li&gt;
&lt;li&gt;consequent&lt;&#x2F;li&gt;
&lt;li&gt;convincing&lt;&#x2F;li&gt;
&lt;li&gt;clear at communicating&lt;&#x2F;li&gt;
&lt;li&gt;... (There are for sure more)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I see more and more clearly that these attributes i believed to have were mere wishes of how I would like to be. I was always striving to achieve these, but parenthood made it impossible to pretend that I had fully succeeded.&lt;&#x2F;p&gt;
&lt;p&gt;I feel parenthood teaches me something new about myself and others each day. I feel it makes me a better person and helps me grow. Can really only encourage everyone, especially those in doubt about the own adequacy to raising kids. It&#x27;s an extremely valuable life lesson that affects all aspects, not only those of being a parent.&lt;&#x2F;p&gt;
&lt;p&gt;&#x2F;christian&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Filtering CO2 out of the atmosphere?</title>
        <published>2020-08-23T00:12:43+01:00</published>
        <updated>2020-08-23T00:12:43+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/filtering-co2/"/>
        <id>https://blog.wiwie.dk/filtering-co2/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/filtering-co2/">&lt;p&gt;Recently something got me thinking: Could we filter out co2 from the atmosphere and somehow transform it into something solid to keep it out of there?&lt;&#x2F;p&gt;
&lt;p&gt;But then again: would this help us in any way or wouldn&#x27;t it probably just make us even more lazy and unambitious in solving the core problem - the production and emission of co2?&lt;&#x2F;p&gt;
&lt;p&gt;Also, I read frequently that technological solutions can&#x27;t help us out of the situation technology got us into in the first place.&lt;&#x2F;p&gt;
&lt;p&gt;But I&#x27;m still sceptical. Really not? Are we absolutely sure there is not an awesome approach we are overlooking?&lt;&#x2F;p&gt;
&lt;p&gt;Well anyways, some guys at Climeworks, Carbon engineering, Global thermostat, and Ineratec (and probably others) are trying to do it. Reading a bit about Climeworks however makes me feel these probably come too late. If they can install an overly ambitious number of their filter plants they can filter out 1% of the global emissions by 2025. Even though all this leaves me quite sceptical, I&#x27;m still surprised though that there isn&#x27;t more momentum in this research area. Maybe one could achieve something using such a technology, and why is not more money invested into this? It seems at least that all our efforts of reducing co2 emissions come &lt;strong&gt;too late&lt;&#x2F;strong&gt; and &lt;strong&gt;too little&lt;&#x2F;strong&gt;. So why not trying to remove it in retrospect? Maybe a major contributor to our last chance?&lt;&#x2F;p&gt;
&lt;p&gt;&#x2F;christian&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Respect for The US of A? Less and less.</title>
        <published>2020-08-20T00:16:13+01:00</published>
        <updated>2020-08-20T00:16:13+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/respect-usa/"/>
        <id>https://blog.wiwie.dk/respect-usa/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/respect-usa/">&lt;p&gt;5 years ago I had a lot of respect for the USA and Americans. I felt that they positively contributed to humankind - my view was mostly based on impressive research they did as this is the area I was coming from.&lt;&#x2F;p&gt;
&lt;p&gt;I guess about 2 years ago I realized that I was surprised and shocked that Americans decided to choose someone as their leader that would directly contradict anything I had so far believed the USA to be: tolerant, eloquent, educated, honest, reliable. I was mad at Trump for being so numb and couldn&#x27;t grasp why the &quot;majority&quot; of Americans voted for him.&lt;&#x2F;p&gt;
&lt;p&gt;I think about one year ago my anger turned into pity. Poor Americans that have to suffer him, and poor him for not knowing better. They didn&#x27;t know any better but now they can see what they got by voting him. They are not going to do that mistake again.&lt;&#x2F;p&gt;
&lt;p&gt;Well, I guess I was too native there. Now I&#x27;m seriously losing my patience with you Americans. Reading on and on about how good chances this idiot has to being reelected - seriously if this happens I will have close to zero respect left for you guys for not being able to deal with him. You don&#x27;t seem to fully realize how much damage it does to your reputation having him as president.&lt;&#x2F;p&gt;
&lt;p&gt;You are literally losing friends all over the world every day as long he is in power. Soon probably only the ones he bought with money are going to volunteer to help you in time of need. Get your act together and remove him already. Convince the people you know of doing so. Get political.&lt;&#x2F;p&gt;
&lt;p&gt;As long as Trump is your president I want as little as possible to do with your country. And if that should really happen - Trump being reelected - I seriously hope that policy makers all over the world are going to strive to becoming more independent of the USA, thereby reducing your power and influence. The more that is the case, the less harm he can do.&lt;&#x2F;p&gt;
&lt;p&gt;&#x2F;christian&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Powerless Against the Climate Crisis?!</title>
        <published>2020-08-09T15:08:45+01:00</published>
        <updated>2020-08-09T15:08:45+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/powerless-climate/"/>
        <id>https://blog.wiwie.dk/powerless-climate/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/powerless-climate/">&lt;p&gt;My guess is that 95% of all people that accept that the climate crisis is real and rolling onto us feel as powerless about it as me:&lt;&#x2F;p&gt;
&lt;p&gt;What can I achieve?&lt;&#x2F;p&gt;
&lt;p&gt;With just a handful of friends, close to no audience, with weekdays so fully packed, when at home constantly occupied by the family.&lt;&#x2F;p&gt;
&lt;p&gt;Seriously, what can I do? I&#x27;m really trying, using my education (computer scientist) to trying to make software that can make a change, but I feel no resonance. And definitely not enough impact to achieve anything. I talk to my friends and family. Everyone is as caught up in their lives as I am, so what&#x27;s it gonna do?&lt;&#x2F;p&gt;
&lt;p&gt;Why does everyone around me seem so indifferent? How can anyone just proceed as normal?&lt;&#x2F;p&gt;
&lt;p&gt;Just. Feel. So. Powerless.&lt;&#x2F;p&gt;
&lt;p&gt;Why do mainstream media and mainstream political parties still think that saving the planet is less important than their own success? Why are they still not strongly recommending to everyone changes to our everyday that bring sustainable change in our everyday lives? Just because they are unpopular and inconvenient? F*** that you crybabies! Why don&#x27;t you suggest to stop eating meat? To reduce&#x2F;stop eating dairy? To use public transportation&#x2F; cycle instead of taking the car? To stop buying cars altogether? To look for jobs close by? To buy less products? To buy products that are more sustainable? To stop using all that crap that makes our planet go down the drain right this moment?&lt;&#x2F;p&gt;
&lt;p&gt;Why is this gigantic challenge not met with the same kind of force as covid19 is? Seriously, this is ridiculous. Who cares about a vaccine for Covid 19 in 10 years if our global ecosystem is going to collapse and the planet can only sustain 1bio people and hunger, thirst, and suffering is present everywhere? None of this Covid 19 vaccine research effort will matter anymore because global production chains for e.g. vaccines are going to collapse as well and anyways, nothing is going to be as it was.&lt;&#x2F;p&gt;
&lt;p&gt;Why are not all the people talking about the climate crisis as they are talking about Covid19?&lt;&#x2F;p&gt;
&lt;p&gt;Is the climate crisis too big a challenge for the human intellect? Can we just not grasp it if the deadly consequences are not imminent but will follow in maybe 15 years instead? Are our minds really that primitive?&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CO2 Footprinting - Progress and Insights: Transportation and Food Overshadow Everything Else</title>
        <published>2020-07-02T00:22:23+01:00</published>
        <updated>2020-07-02T00:22:23+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/co2-tracker-3/"/>
        <id>https://blog.wiwie.dk/co2-tracker-3/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/co2-tracker-3/">&lt;p&gt;[cont. from &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;blog.cwiwie.org&#x2F;software-framework-for-co2-footprint&quot;&gt;Software Framework for CO2 Footprinting&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;blog.cwiwie.org&#x2F;co2-tracker-some-progress&quot;&gt;co2 tracker: some progress&lt;&#x2F;a&gt;]&lt;&#x2F;p&gt;
&lt;p&gt;My CO2 footprinting app in its current state allows me to model the things I do everyday and annotate my &quot;events&quot; with emitted CO2.&lt;&#x2F;p&gt;
&lt;p&gt;So one could say I advanced from the development stage to a data curation stage. Because what I have to do now is mostly to look up the emission data of the everyday things I do, up to a point to which they can be resolved and cast them into a couple of numerical values that can be passed to the emission functions of my actions to calculate emission values. Examples are, the ingredients of meals I ate, those ingredients&#x27; amounts and their respective production emission, distances between places I drove, the emission of our car per km, power consumption of the devices I use, or emission per kWh of our electricity plan.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;some-surprises&quot;&gt;Some surprises&lt;&#x2F;h2&gt;
&lt;p&gt;I made some surprising observations on the way that put some of the things I do into perspective. Before I continue describing them though, I have to put out a disclaimer, which I&#x27;m going to motivate in the paragraphs below: &lt;strong&gt;The data I have in my app is of course highly incomplete! Thus, conclusions drawn from it may be highly biased. I do however think, that some general trends can be seen.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;First of all, I always thought my computers&#x27; power consumption was one of the major drivers of my emissions. However, putting in the numbers I can clearly see that those are significantly lower than the ones of the true main factors. And those are: food and transportation. Since food is something one really consumes regularly, many times a day, this accumulates to much. And some of the things I eat are causing a surprisingly high amount of emissions. I underestimated the amount of variation between the different foods, and was most of all &lt;em&gt;shocked&lt;&#x2F;em&gt; by how much emissions are caused by dairy products. Also was I shocked by the amount of emissions caused by car transportation, even if driving short distance and using a small car.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;computers-and-such&quot;&gt;Computers and such&lt;&#x2F;h3&gt;
&lt;p&gt;We have an Intel NUC, Synology NAS (including 4 disks), 1x raspberry pi2 and 1x pi3 running 24h a day. The emissions of these were the first things I calculated using my app, as I assumed they were the biggest factors. They amounted to about 220-370g co2e daily (and this is a range because this is as accurate an emission value I could find for power providers in Denmark). There are also other factors I neglected because of lack of time, such as electrical consumer devices running in standby. I did investigate one other device though, and that was my stereo which uses 30W when I just let it be turned on when I&#x27;m not actually using it. Doing this 24h a day, would cause 115.20-209.52g co2e. I started switching it into standby immediately, where it then uses less than 1W. Another thing I calculated were the LED lamps in our living room. We have them turned on in the evenings. Assuming that they are turned on for about 5h, this causes 20.00-36.38g co2e per day.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;eating&quot;&gt;Eating&lt;&#x2F;h3&gt;
&lt;p&gt;I use to eat a bowl of yogurt most evenings. That bowl causes an estimated 520g co2e daily. In comparison, that is more than my NUC, NAS (Including 4 disks), 1x raspberry pi3 and 1x pi3 produce together daily when running 24h (~220-370g)! This really shocked me. A similar story is the daily oat meal I eat in the morning. It&#x27;s nothing fancy: oat flakes, raisins and milk. ~311g co2e. And I didn&#x27;t stop here. Another finding that didn&#x27;t actually surprise me too much but rather confirmed my bad expectations is the emissions caused by my coffee consumption. Since I couldn&#x27;t find emission values for the exact coffee bean I use to buy, I had to calculate a rather rough estimate across all kinds of possible coffee beans and producers. Here, the caused emissions vary extremely. When putting in all these numbers, a liter of coffee, including bean production and power consumption of grinding and brewing causes emissions somewhere between 130-900g! So even if I assume that the fair trade ecological coffee bean I buy is somewhere in the average, it&#x27;s still causing around ~500g&#x2F;L. And these days I - unfortunately - drink about two liters a day. So that is also quite the sizable sum of 1kg co2e daily. Damn.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;transportation&quot;&gt;Transportation&lt;&#x2F;h3&gt;
&lt;p&gt;The most surprising - and at the same time shocking - insight though was, that transportation easily overshadowed all of the other things of my everyday life. Taking a comparably small Aygo 1.0i for a 5km ride to the grocery store and back causes between 515.27-567.32g co2. Averaging it out and assuming we do this tour three times a week, this would cause around 270g co2 daily. This feels like an insane amount for just 5km! Then I wanted to know how much a drive of about 140km to the family from Jydland to Odense and back causes: 28-31&lt;strong&gt;kg&lt;&#x2F;strong&gt; co2. Assuming we did this drive maybe once a month, it would still mean it caused about 1kg co2 per day when averaging it out. Lastly, I calculated how much it causes when we visit my family in Germany (with the Aygo 1.0i). One trip is around 900km, and driving there and back causes between 180-200kg co2. Before Covid19 we did this trip once every half year, leading to a daily average of around 1-1.5kg co2. Summing all these transportations up I was left baffled when seeing how few such drives already cause emissions to climb up rapidly.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-much-is-ok&quot;&gt;How much is OK?&lt;&#x2F;h2&gt;
&lt;p&gt;After calculating all those numbers I was quite puzzled, as to whether they would leave me in the low or high end of the range - and whether the number I got out would possibly even be unsustainable. I googled, and found &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.ecocivilization.info&#x2F;three-tons-carbon-dioxide-per-person-per-year.html&quot;&gt;a page&lt;&#x2F;a&gt; that claimed, that 3t per person per year are sustainable. OK. Other than that page, I only found pages that said, &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;e360.yale.edu&#x2F;features&#x2F;what_is_the_carbon_limit_that_depends_who_you_ask&quot;&gt;that the exact limit was not known&lt;&#x2F;a&gt;. Which I also believe to be the true answer here. But for the sake of my argument, I would assume that 3t are the correct value. If I sum up all the values I outlined above, I would end up at about 5kg per day (correct me if I&#x27;m wrong). That equates to ca. 1,8t per year. Wow. That is already quite a lot, considering that I wasn&#x27;t even close to having put in all my data into the app. So I fear that it it actually ends up being a lot higher.&lt;&#x2F;p&gt;
&lt;p&gt;These things made several things quite clear to me that we (I and everyone) have to achieve if we want to solve this climate crisis:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;all of us need to reconsider and rethink how and what we are eating. Obviously, dairy and meat are the biggest emitters foodwise so it can&#x27;t possibly be sustainable if many of us eat these things on a daily basis in large quantities.&lt;&#x2F;li&gt;
&lt;li&gt;transportation needs to be minimized, at least as long as the co2e&#x2F;km is as high as with today&#x27;s cars (and I believe that to include electrical cars, as their production footprint is so much higher). This is something, that has to be tackled on the political level by governments: jobs and families have to be located close together. I don&#x27;t see this working out, if people need to commute and drive long ways with their cars.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ok-what-are-the-challenges&quot;&gt;Ok. What are the challenges?&lt;&#x2F;h2&gt;
&lt;p&gt;While using the app and filling it with life by putting in the emission values and functions, I stumbled over several challenges.&lt;&#x2F;p&gt;
&lt;p&gt;The biggest one is clearly, that emission data is only available up to a certain degree and resolution. The emission of our car for instance is only given as a single average emission value, but not as a function of the speed. Hence, assuming this value for a fast ride will underestimate the emitted co2.&lt;&#x2F;p&gt;
&lt;p&gt;Also, some data is simply not available at all. While I could find production emissions for the basic foods, for more complex composite foods such as Prinzenrolle there is simply no value available. My solution here is that I calculate the emission as the sum of the production emissions of the food&#x27;s individual ingredients.&lt;&#x2F;p&gt;
&lt;p&gt;Another example is, that I couldn&#x27;t find an emission value per kWh for our exact electricity provider and power plan, but only a general average one for whole Denmark. This completely neglects that some people intentionally pay more for a regenerative power plan.&lt;&#x2F;p&gt;
&lt;p&gt;The same lack of data resolution was present also for other things:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;imported vs. local foods: the transportation chain seems to be mostly neglected by the sources&#x2F;databases for emission values. Here it will make a huge difference whether a food is consumed locally or after export&lt;&#x2F;li&gt;
&lt;li&gt;same type of food but of different producers: most databases provide a general value per food production, completely independent of where it is being produced or by which company&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;So generally, there is only so much one can do in terms of tracking the own emissions, simply because for many things there is no emission data available. I would love to build this project up and provide producers of goods with an API that they can use to feed in their emission data directly. Right now they don&#x27;t even have this kind of data themselves, and hence I do think that this is another aspect governments should put focus on. Being able to trace the caused emissions as far down these complex paths, would allow consumers to make more sustainable life decisions about what to eat, where to live, how often to drive, or where to look for a work place.&lt;&#x2F;p&gt;
&lt;p&gt;Apart from the data availability and quality problem, another problem is the usability of the app. It&#x27;s simply not motivating, having to go through an unresponsive website to fill in complex data about what one eats, where one drivers or which device one uses. This process should be much simpler, for people to actually keep using it. I observed this with myself. Once I reached an OK level, I just stopped filling in data because it was too tedious.&lt;&#x2F;p&gt;
&lt;p&gt;Despite these challenges though, I would still claim that I gained valuable insights into my emission footprint caused by things I do everyday. I don&#x27;t think this idea is a dead end, but of course its accuracy is bound by the resolution and accuracy of the data it curates. But if people only got as many insights into where their emissions are coming from as I did, that would already be a huge success for me.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-next&quot;&gt;What next?&lt;&#x2F;h2&gt;
&lt;p&gt;There are many things one could do next. They basically follow from the challenges outlined above.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Manual data curation: Filling in more data, and thereby making my own footprint more complete and accurate&lt;&#x2F;li&gt;
&lt;li&gt;Mobile app: Using the website to fill in the things while I&#x27;m doing them is unacceptable and inaccessible. I would love to develop a mobile app to be able to connect to the website. Doing data curation on the fly, when only one hand is free would automatically boost step 1. (at least for me)&lt;&#x2F;li&gt;
&lt;li&gt;Connecting this project with other emission data providers, providing query interfaces, maybe importers.&lt;&#x2F;li&gt;
&lt;li&gt;Getting good producers on board, that could directly contribute emission data for their products.&lt;&#x2F;li&gt;
&lt;li&gt;Making the project public and getting in touch with other developers that see a prospect in the project&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;As of now, I&#x27;m undecided what I will do next. I put the project on hold for about a month now, due to personal and professional stress levels. I&#x27;ll have to see, when I&#x27;ll have the energy to do some more work on it.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Photoprism Sponsoring</title>
        <published>2020-06-08T00:22:23+01:00</published>
        <updated>2020-06-08T00:22:23+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/photoprism-sponsor/"/>
        <id>https://blog.wiwie.dk/photoprism-sponsor/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/photoprism-sponsor/">&lt;p&gt;I have been looking for a photo management software for a long time, that allows me to manage our pictures, host and share them, provides a sleek UI, and has some cool features that make my life easier.&lt;&#x2F;p&gt;
&lt;p&gt;For quite some time (and still), I am using Nextcloud to do this, but I always disliked its inferior performance due to PHP. Recently, they also completely replaced their pictures app by a new one, which, apart from the fact that the app seems far from feature-complete and polished to me, made me realize (again) that photos are not a first class citizen in the Nextcloud universe. It&#x27;s just one of many aspects, that Nextcloud wishes to provide.&lt;&#x2F;p&gt;
&lt;p&gt;I have been trying alternatives in the past as well, but Piwigo&#x27;s development is too slow for my taste and they do make the impression on me that they feel rather cozy in the place they are in now and don&#x27;t seem to be looking for cool ways to expand upon Piwigo&#x27;s feature-set. The main thing that annoyed me with Piwigo was its lack of a proper Android mobile app, and its UI.&lt;&#x2F;p&gt;
&lt;p&gt;Up to recently, I exclusively looked for open-source solutions that could fill my photo org void. During the last days I played around with the Moments app of my Synology NAS, and was actually quite fixed by some of its features. It provides AI-supported auto-tagging and classification of pictures. It can detect faces. It provides a sleek timeline of pictures, which is nice to browse through. Generally, I felt its feature-set came pretty close to what I was looking for. Unfortunately, I very much dislike the fact that it is closed-source and that I am not entirely convinced of the quality of Synology&#x27;s support. Also, performance on my NAS (which is intentionally chosen power-consumption friendly) is subpar.&lt;&#x2F;p&gt;
&lt;p&gt;Then, some days ago I stumbled over #photoprism, which is a relatively new project but it already now seems like a really promising candidate. It has AI-driven classification&#x2F;tagging of pictures, has facial recognition as well as web-sharing on its roadmap. Most importantly, the project&#x27;s main developer (lastzero) seems extremely motivated and has a clear perspective for the project that aligns very well with how I wish my picture org software to be. This is awesome and clearly something that the other projects I tried so far were lacking. The fact that then completely won me over as a fan was that he created &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;photoprism&#x2F;photoprism&#x2F;issues&#x2F;316&quot;&gt;a ticket to add ActivityPub support&lt;&#x2F;a&gt; to the project. So obviously, this is a really cool project that I would love to continue evolving and succeeding in finishing its roadmaps.&lt;&#x2F;p&gt;
&lt;p&gt;I have it installed locally now, but it&#x27;s not yet feature-complete enough to replace Nextcloud for us. Nevertheless, I want to give photoprism&#x27;s development a boost and hope I can do so by sponsoring lastzero on GitHub sponsors.&lt;&#x2F;p&gt;
&lt;p&gt;Check the project out &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;photoprism.org&quot;&gt;here&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;photoprism&#x2F;photoprism&quot;&gt;here&lt;&#x2F;a&gt; and become a sponsor &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sponsors&#x2F;photoprism&quot;&gt;as well&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>co2 tracker: some progress</title>
        <published>2020-05-22T00:22:23+01:00</published>
        <updated>2020-05-22T00:22:23+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/co2-tracker-2/"/>
        <id>https://blog.wiwie.dk/co2-tracker-2/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/co2-tracker-2/">&lt;p&gt;[cont. from [Software Framework for CO2 Footprinting](https:&#x2F;&#x2F;blog.wiwie dk&#x2F;posts&#x2F;software-framework-for-co2-footprint)]&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve been coding on my #co2 #emission #tracker project for about a month now and there has been some (limited) progress, that my (limited) available time would allow.&lt;&#x2F;p&gt;
&lt;p&gt;First of all, I feel very positive about what level of insight and awareness the project could already give me despite the early stage it is in.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve started by evaluating some web frameworks&#x27; facilities for quick prototyping and iterating. I looked at Spring Boot, Groovy on Grails, and #Django. I had worked with all of these before, not extensively though. I decided for Django in the end, as I knew it was pretty straight forward and quick to get a project started, so perfect for my purpose. Groovy on Grails seems okay in that regard as well, but I am hesitant to use it in any of my projects, as I&#x27;ve heard negatively about it&#x27;s lead developer and the project&#x27;s community generally seems to have trouble with breaking core changes in releases and keeping up with adapting their plugins without which grails is pretty bare-stripped. Lastly, I also looked at Spring boot and while it seems good for sophisticated projects, it is also A MONSTER in complexity and it felt not well suited to quickly get a project up and running and iterating on it&#x27;s code.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;use-cases&quot;&gt;Use cases&lt;&#x2F;h2&gt;
&lt;p&gt;Then, I decided on some core use-cases I wanted the project to be able to handle and started fleshing out data structures to model these:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Driving car $c$ with average speed $s$ km&#x2F;h over a distance of $d$ km. Car $c$ having an engine that produces $e$ g co2&#x2F;km&lt;&#x2F;li&gt;
&lt;li&gt;eating $x$ kg of $f$, $f$ being produced with $e$ kg co2e.&lt;&#x2F;li&gt;
&lt;li&gt;using electrical device $d$ for $h$ hours which uses $p$ kW. Having an electricity provider which produces $e$ g co2e &#x2F; kWh&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;django-models&quot;&gt;Django Models&lt;&#x2F;h2&gt;
&lt;p&gt;With these first use cases I started designing my Django app. However, I realized early that I didn&#x27;t want to hardcode the available domains (e.g Car or Device), but that I wanted the user to be able to specify them via the UI. This prevented me from just defining all domains involved in my use cases as Django models. This would be the easiest solution by far, since I could then have leveraged the typing system of Django to describe properties of domains and such. But a tool where one needed to migrate changes to the database schema and restart the whole app each time the user wanted to add, delete or alter a domain, was a deal-breaker to me.&lt;&#x2F;p&gt;
&lt;p&gt;Hence, I came up with the following Django models, which would allow the user to define domains, actions, variables, values, events, all via the UI without needing to change the DB:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;action&lt;&#x2F;strong&gt; describes one particular or a class of emission-producing real world actions a user can perform.&lt;&#x2F;li&gt;
&lt;li&gt;actions have &lt;strong&gt;variables&lt;&#x2F;strong&gt; which allow them to describe multiple real world actions. For instance, the action &quot;use electrical device (device:Device)&quot; can describe both using a coffee machine, or a laptop.&lt;&#x2F;li&gt;
&lt;li&gt;variables are typed, i.e. are assigned one particular &lt;strong&gt;domain&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;an &lt;strong&gt;event&lt;&#x2F;strong&gt; takes an action and binds all its variables to values. This describes a user performing a specific real world action at a certain time, producing a computable amount of emissions.&lt;&#x2F;li&gt;
&lt;li&gt;a &lt;strong&gt;value&lt;&#x2F;strong&gt; is a concrete object from a domain, which can be bound to a variable of that domain. In fact, several values of the same type can be bound to one variable (if the variable is defined as such).&lt;&#x2F;li&gt;
&lt;li&gt;a value can have typed subvalues which can be interpreted as properties of the value itself. For instance, values of the domain Car must have a subvalue of domain Engine, which in turn must have a subvalue of domain Emission g&#x2F;km.&lt;&#x2F;li&gt;
&lt;li&gt;an action has an &lt;strong&gt;emission function&lt;&#x2F;strong&gt; that describes how an amount of emission (in g) can be calculated from values assigned to its variables. This emission function is evaluated for each event of that action.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;using-the-app-filling-the-models-with-flesh&quot;&gt;Using the app - filling the models with flesh&lt;&#x2F;h2&gt;
&lt;p&gt;I started using the app and filling the DB with domains, values, actions, variables, events, and some other supplementing types of models, that would describe the things I had been doing, eating, or using these days. That this turned out to be more tricky than expected and what sort of things I could learn from it nevertheless I&#x27;ll describe in the next post (cliffhanger). Da da bum! :-)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Software Framework for CO2 Footprinting</title>
        <published>2020-04-11T00:22:23+01:00</published>
        <updated>2020-04-11T00:22:23+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/co2-footprinting-software/"/>
        <id>https://blog.wiwie.dk/co2-footprinting-software/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/co2-footprinting-software/">&lt;p&gt;I feel everyone should contribute to finding solutions to the climate crisis in the way that optimally uses their abilities. Honestly, I often think that I should go out and demonstrate on the streets as well. But somehow I feel, that this is not the best way for me to contribute to the solution. As educated computer scientist I believe, that the best way for me has to be through making software.&lt;&#x2F;p&gt;
&lt;p&gt;Writing software that enables people to help themselves and thereby everyone else on this planet and the planet itself is my dream. I am a person, that believes in the good of the people more than into restraint and punishment. But I also believe, that people, nay all organisms are notouriously lazy as they have to manage the energy they have available in the optimal way in order to survive.&lt;&#x2F;p&gt;
&lt;p&gt;So in a way I sincerely believe that the problem is not that (most) humans don&#x27;t want to safe this planet, but that they are just lazy, caught up in their everyday, and slow in adapting to the changing system. I see this in my own everyday life every single day: The descrepancy between what I would like to do to protect the environment, and what I actually do is too large most of the days.&lt;&#x2F;p&gt;
&lt;p&gt;Recently though, I started working on a software project in my freetime that should help me and hopefully also others to #track #emission #footprints through daily routines. The project idea is broad, and I have yet only started working on a single aspect of it: A website with database backend that would allow to collect and curate emission data for various products and actions and connect this data with daily routines of the user to calculate an approximate carbon footprint. Not only that, but it should also provide the user with tools to investigate and understand the main sources of their emissions. Ideally, even make AI supported suggestions on how to improve upon them.&lt;&#x2F;p&gt;
&lt;p&gt;The core website should provide a RESTful API that can connect with mobile clients, allowing users to easily navigate their data and quickly enter data of the current day. Repetitive daily routines should be easily put into the system, without much hassle, as this makes up a large proportion of many of our activities. Typical examples could be: Commuting 25km to work daily, taking the car to do the groceries 5km away, ordering from that favorite pizza delivery place, heating those buns in the oven (model manufactured in 1998), or playing PS3 4hours a day.&lt;&#x2F;p&gt;
&lt;p&gt;The plan is to initially make a comparably simple prototype of the web app that is easy to try out in everyday life to see whether the core use-case is translatable as intended to software. For this I&#x27;d use a probably quite limited framework that allows for quick prototyping and iterating. This is to identify all my use cases important to be covered.&lt;&#x2F;p&gt;
&lt;p&gt;This probably means that the framework used in the beginning may be switched out for something more sophisticated later if the initial implementation looks promising.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ll keep posting updates on my progress here.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Build maven project despite unavailable remote repository</title>
        <published>2019-01-07T00:22:23+01:00</published>
        <updated>2019-01-07T00:22:23+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/maven-build-offline/"/>
        <id>https://blog.wiwie.dk/maven-build-offline/</id>
        
        <summary type="html">&lt;p&gt;A temporary workaround for building a maven project despite an
unavailable remote repository is running the build in offline mode:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;mvn&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;o&lt;&#x2F;span&gt;&#x2F;--offline&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This prevents any remote repository communication and only locally cached
artifacts will be used. Thus, this only works if all dependencies are
actually locally available.&lt;&#x2F;p&gt;
&lt;p&gt;Only recommended, if you are sure that the locally cached artifacts are up-to-date.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>My new running shoe with stability - Asics Gel Kayano 25</title>
        <published>2018-12-02T00:22:23+01:00</published>
        <updated>2018-12-02T00:22:23+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/asics-kayano/"/>
        <id>https://blog.wiwie.dk/asics-kayano/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/asics-kayano/">&lt;p&gt;Today I had it confirmed yet again that I am a heavy #pronator (not to be confused with donator), i.e. my angle &quot;breaks in&quot; towards the inside when putting the foot on the ground while #running.&lt;&#x2F;p&gt;
&lt;p&gt;Upon recommendation, I bought an #Asics Gel Kayano 25 shoe with stability.&lt;&#x2F;p&gt;
&lt;p&gt;Went on my first test run earlier, and it really feels like a huge difference to my previous shoe. My whole movement feels more stable, less &quot;sluggish&quot;, but it seems my body mechanics have to adapt to the change. For starters, I felt slightly uncomfy on the insides of my lower legs and for a short while also in my lower back. Anyone can confirm that this is normal?&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>My online social networking after Facebook</title>
        <published>2018-11-17T00:22:23+01:00</published>
        <updated>2018-11-17T00:22:23+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/fuckfacebook/"/>
        <id>https://blog.wiwie.dk/fuckfacebook/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/fuckfacebook/">&lt;p&gt;Some time ago I decided to delete my Facebook account and to use the fediverse (short for the federation universe) as my main online social network as a replacement.&lt;&#x2F;p&gt;
&lt;p&gt;In my previous such attempts I tried out the diaspora network in the hope it could replace Facebook. However, back in the days the connections I made there were mostly to techies (like me), and hence gave me little inspiration beyond my own horizon. The opinions present there seemed to be very similar to my own, but what I like about social networks is not only to share my interests with others, but also read interesting, unknown, or creative stuff.&lt;&#x2F;p&gt;
&lt;p&gt;Due to these experiences, I was a bit skeptical whether I would find enough &quot;non-tech&quot; users in the fediverse:&lt;&#x2F;p&gt;
&lt;p&gt;So far it works out well and I&#x27;m very satisfied with the connections I have made. There are dedicated science and creative federation instances, to which I have initially connected to via some major &quot;introducers&quot;, people that know many others on the instance. Via those I was able to find more contacts, so far mostly artists posting there own creations. These are almost exclusively paintings, sketches, but I also got some posts about their latest craftsmanship projects.&lt;&#x2F;p&gt;
&lt;p&gt;This is amazing! This is exactly the kind of inspiration I like getting from a social network. And in fact, such direct contact to artists was or felt never possible on Facebook.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ll continue to post about my worth-mentioning experiences in the fediverse in the future.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Denmark&#x27;s Nature</title>
        <published>2018-06-16T00:22:23+01:00</published>
        <updated>2018-06-16T00:22:23+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/denmarks-nature/"/>
        <id>https://blog.wiwie.dk/denmarks-nature/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/denmarks-nature/">&lt;p&gt;Before I moved from the Eifel region in Germany with all its mountains, valleys, forests and small rivers to Denmark, I was afraid it was this boring flat country, without any interesting nature.&lt;&#x2F;p&gt;
&lt;p&gt;For the most part I was right. just kidding :-) I learned that one just has to look for the nice spots. They can be found everywhere.&lt;&#x2F;p&gt;
&lt;p&gt;Here are some impressions of the Danish flora and fauna. These first ones are at a small lake just around the corner:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;photo.cwiwie.org&#x2F;api&#x2F;v1&#x2F;t&#x2F;5cd922af67a0f013e945f3828bc38c9b46c20c51&#x2F;73a2b7b3&#x2F;fit_1280&quot; alt=&quot;Svanesø 1&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;photo.cwiwie.org&#x2F;api&#x2F;v1&#x2F;t&#x2F;ad8228ae7fc50ec96242243f10b55cf67ff8749a&#x2F;73a2b7b3&#x2F;fit_1280&quot; alt=&quot;Svanesø 2&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;And these I took at a lake half an hour by car from Odense (yes, Denmark has tons of lakes):&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;photo.cwiwie.org&#x2F;api&#x2F;v1&#x2F;t&#x2F;7182ebc15fa466881fbeca51ed817ca179406ddf&#x2F;73a2b7b3&#x2F;fit_1280&quot; alt=&quot;Langesø 1&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;photo.cwiwie.org&#x2F;api&#x2F;v1&#x2F;t&#x2F;be62cf3b5362c4334d5309c52c9ed0756747cd83&#x2F;73a2b7b3&#x2F;fit_1280&quot; alt=&quot;Langesø 2&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;photo.cwiwie.org&#x2F;api&#x2F;v1&#x2F;t&#x2F;862eba2f54934a70a4f7dd05434cf70129e86c7f&#x2F;73a2b7b3&#x2F;fit_1280&quot; alt=&quot;Langesø 3&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;photo.cwiwie.org&#x2F;api&#x2F;v1&#x2F;t&#x2F;1b055e527b29211e1bae31853c086f9ba61f42ca&#x2F;73a2b7b3&#x2F;fit_1280&quot; alt=&quot;Langesø 4&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;photo.cwiwie.org&#x2F;api&#x2F;v1&#x2F;t&#x2F;c37eab5d69755cdd11b1f48765bc63b43cf2b362&#x2F;73a2b7b3&#x2F;fit_1280&quot; alt=&quot;Langesø 5&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;photo.cwiwie.org&#x2F;api&#x2F;v1&#x2F;t&#x2F;74caf3da96da8485cdb699fbd021f94b0a2ce362&#x2F;73a2b7b3&#x2F;fit_1280&quot; alt=&quot;Langesø 6&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Blog renaming</title>
        <published>2018-06-16T00:20:21+01:00</published>
        <updated>2018-06-16T00:20:21+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/rename-blog/"/>
        <id>https://blog.wiwie.dk/rename-blog/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/rename-blog/">&lt;p&gt;I renamed my&#x2F;this blog. Simply, because the focus of it does not fit the old title (a pristine way) anymore.&lt;&#x2F;p&gt;
&lt;p&gt;After some, rather short, thinking I decided to go with my name as the blog title, and a pretty generic subtitle. Generic, because generic is good if you don&#x27;t really have a plan about what the main focus of the blog should be. I pretty much just want to spontanuously blog here and there when and about what I feel like.&lt;&#x2F;p&gt;
&lt;p&gt;And even though the renaming of my blog wouldn&#x27;t really deserve its own dedicated blog post, I wanted to write a short note to avoid confusion amongst people when they suddenly see a weird, unknown blog in their blog role ;-)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Word 2017 Please unprotect this document</title>
        <published>2017-12-18T00:12:03+01:00</published>
        <updated>2017-12-18T00:12:03+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/word-unprotect/"/>
        <id>https://blog.wiwie.dk/word-unprotect/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/word-unprotect/">&lt;p&gt;Recently, I was working on a manuscript in Word 2017 that should contain an Endnote bibliography of citations contained both in itself and also in a supplement document. After some googling I found advice, that this can be achieved using the master-&#x2F;subdocument feature. There are guides online on how to achieve this exactly, so I am not going into detail there.&lt;&#x2F;p&gt;
&lt;p&gt;In the process of updating or inserting the EndNote bibliography into the master document, I kept getting weird errors such as &quot;Please unprotect this document&quot; or &quot;This part of the document is locked&quot;. Sometimes, Word crashed alltogether. However, none of any of the involved documents was locked and all of them had correct write permissions.&lt;&#x2F;p&gt;
&lt;p&gt;Eventually, I discovered that the problem was that I had &quot;track changes&quot; enabled for one of the subdocuments, but not in the master document. After disabling track changes in all documents it magically started working.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tracking Atopic Dermatitis Severity on Your Phone</title>
        <published>2017-06-18T23:31:35+01:00</published>
        <updated>2017-06-18T23:31:35+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/neurodermitis/"/>
        <id>https://blog.wiwie.dk/neurodermitis/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/neurodermitis/">&lt;p&gt;SCORAD (SCORing Atopic Dermatitis) is a score that quantifies the severity of atopic dermatitis as a numerical value. SCORAD was published in 1993 by the European Task Force on Atopic Dermatitis. &lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The SCORAD score takes into account the severity of atopic dermatitis (“Intensity”), the extent of its spread over the body (“Extent”), as well as the severity of insomnia and itching. The SCORAD score can also be calculated online. &lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Normally, the SCORAD score should be calculated and interpreted by a doctor, as patients might find it difficult to determine the values objectively. To allow patients to calculate SCORAD themselves, the European Task Force on Atopic Dermatitis published a patient-oriented version in 2011, called PO-SCORAD. &lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-3-1&quot;&gt;&lt;a href=&quot;#fn-3&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This PO-SCORAD can be calculated by patients using forms or software. &lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-4-1&quot;&gt;&lt;a href=&quot;#fn-4&quot;&gt;4&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Some available programs for calculating PO-SCORAD also allow patients to keep a time log of their atopic dermatitis severity—for example, the Android app PO-Scorad. &lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-5-1&quot;&gt;&lt;a href=&quot;#fn-5&quot;&gt;5&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;further-information&quot;&gt;Further Information&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;SCORAD&quot;&gt;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;SCORAD&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.poscorad.com&#x2F;page_uk.html&quot;&gt;http:&#x2F;&#x2F;www.poscorad.com&#x2F;page_uk.html&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.fondation-dermatite-atopique.org&#x2F;en&#x2F;healthcare-professionals-space&#x2F;po-scorad&quot;&gt;http:&#x2F;&#x2F;www.fondation-dermatite-atopique.org&#x2F;en&#x2F;healthcare-professionals-space&#x2F;po-scorad&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;https:&#x2F;&#x2F;www.ncbi.nlm.nih.gov&#x2F;pubmed&#x2F;8435513 &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;http:&#x2F;&#x2F;adserver.sante.univ-nantes.fr&#x2F;Compute.html &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-3&quot;&gt;
&lt;p&gt;https:&#x2F;&#x2F;www.ncbi.nlm.nih.gov&#x2F;pubmed&#x2F;21414011 &lt;a href=&quot;#fr-3-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-4&quot;&gt;
&lt;p&gt;http:&#x2F;&#x2F;www.fondation-dermatite-atopique.org&#x2F;en&#x2F;healthcare-professionals-space&#x2F;po-scorad &lt;a href=&quot;#fr-4-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-5&quot;&gt;
&lt;p&gt;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.myguard.poscorad.pad&amp;amp;hl=en &lt;a href=&quot;#fr-5-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Extending powernapd with a &#x27;File-Change-Monitor&#x27;</title>
        <published>2017-02-25T23:34:42+01:00</published>
        <updated>2017-02-25T23:34:42+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/powernapd/"/>
        <id>https://blog.wiwie.dk/powernapd/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/powernapd/">&lt;p&gt;I currently have an old laptop set up as a server in my home. I use it as a file server and media server. It&#x27;s already relatively energy-efficient, but I also have three USB hard drives connected to it and all in all, the laptop and drives consume about 35 watts when idle. Therefore, I found it desirable to put the laptop into standby mode when not in use.&lt;&#x2F;p&gt;
&lt;p&gt;The problem is that it should not go into standby mode if I&#x27;m streaming media from it or using any other services.&lt;&#x2F;p&gt;
&lt;p&gt;The small tool powernapd is perfectly suited for this. It allows you to link the standby mode to certain conditions. For example, that the server load must not exceed a certain threshold or no incoming SSH connection must exist.&lt;&#x2F;p&gt;
&lt;p&gt;One of my services that I host on the laptop is &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;tt-rss.org&quot;&gt;tt-rss&lt;&#x2F;a&gt;, a feed aggregator that brings along a web service. Unfortunately, there&#x27;s no monitor included in the functionality of powernapd that monitors web server activity.&lt;&#x2F;p&gt;
&lt;p&gt;Therefore, I&#x27;ve &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;wiwie&#x2F;powernap&quot;&gt;written a monitor&lt;&#x2F;a&gt; that watches the change date of a file and only puts the computer into standby mode if the file does not change.&lt;&#x2F;p&gt;
&lt;p&gt;With this monitor, I now monitor the access log of my tt-rss Apache VirtualHost and can thus read feeds without time pressure and without the laptop going into standby mode :-)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Proud 31</title>
        <published>2015-12-06T23:51:23+01:00</published>
        <updated>2015-12-06T23:51:23+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/tolerance-proud-31/"/>
        <id>https://blog.wiwie.dk/tolerance-proud-31/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/tolerance-proud-31/">&lt;p&gt;In the meantime, 31 people took part in tolerance (again) (after we had to encourage you to do it again, as our first version had a bug and didn’t store your nationality tipps):&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;1 Dutch&lt;&#x2F;li&gt;
&lt;li&gt;1 Brazilian&lt;&#x2F;li&gt;
&lt;li&gt;2 Swiss&lt;&#x2F;li&gt;
&lt;li&gt;1 British&lt;&#x2F;li&gt;
&lt;li&gt;1 Australian&lt;&#x2F;li&gt;
&lt;li&gt;1 Canadian&lt;&#x2F;li&gt;
&lt;li&gt;1 French&lt;&#x2F;li&gt;
&lt;li&gt;and the rest Germans.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Now, the percentages of guesses look as follows:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;rnd.cwiwie.org&#x2F;assets&#x2F;writefreely&#x2F;tolerance.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The percentages of correct guesses are definitely higher than we expected. And that has a simple explanation: Up to now approximately 95% of all participants originate from Germany, Denmark, Switzerland and Austria. That is, because Yannic and I spread the message only in our social networks.&lt;&#x2F;p&gt;
&lt;p&gt;We are currently thinking how we can spread the message better to other countries.&lt;&#x2F;p&gt;
&lt;p&gt;We already took another step: We improved part of tolerances code and made it easy to extend with new languages. We started (of course) by adding a German translation (additionally to previously existing English). We will put the new version up during the next days, until then the version hosted under &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;tolerance.cwiwie.org&quot;&gt;https:&#x2F;&#x2F;tolerance.cwiwie.org&lt;&#x2F;a&gt; &lt;del&gt;and &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;tolerance.yhaupenthal.org&quot;&gt;https:&#x2F;&#x2F;tolerance.yhaupenthal.org&lt;&#x2F;a&gt;&lt;&#x2F;del&gt; are still providing the original version. Soon we will also add Danish as another language. These languages will help mostly help the older generation to also take part.&lt;&#x2F;p&gt;
&lt;p&gt;However, we are aware, that the weakest point is not yet tackled. We need more participants of non-EU-countries, if tolerance should be representative at some point. Soon, we will publish more details about the nationalities of participants so far; at this point I can already so as much: non-EU-participants can be counted on one hand.&lt;&#x2F;p&gt;
&lt;p&gt;To make tolerance more known in non-EU-countries, we plan to translate it into even more languages. We could start with&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Spanish&lt;&#x2F;li&gt;
&lt;li&gt;Arabic&lt;&#x2F;li&gt;
&lt;li&gt;Syrian&lt;&#x2F;li&gt;
&lt;li&gt;Chinese&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;And for that we need your help! If you speak a language not yet integrated into tolerance (so almost any :-D), contact us or send us a pull request on GitHub.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tolerance (Open Borders)</title>
        <published>2015-11-22T23:55:37+01:00</published>
        <updated>2015-11-22T23:55:37+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/tolerance/"/>
        <id>https://blog.wiwie.dk/tolerance/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/tolerance/">&lt;h2 id=&quot;update&quot;&gt;Update:&lt;&#x2F;h2&gt;
&lt;p&gt;Unfortunately, due to a bug (shit happens), your entered nationalities weren’t saved in the database—only your answers to the questions. We’d really appreciate it if you could go through the questionnaire again. Don’t worry—you still remember your answers, so it should be quick. Sorry &amp;amp; thank you!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-idea&quot;&gt;The Idea&lt;&#x2F;h2&gt;
&lt;p&gt;A month or two ago, I had this idea:&lt;&#x2F;p&gt;
&lt;p&gt;Build a website with a survey where people from all over the world answer questions describing life-threatening situations, with multiple-choice responses. The goal was simple: to show that everyone would behave in ways similar to the refugees currently fleeing war-torn countries.&lt;&#x2F;p&gt;
&lt;p&gt;The twist: After answering 10 questions, you’re shown 10 question-answer pairs from another participant and asked to guess their nationality (or corresponding continent).&lt;&#x2F;p&gt;
&lt;p&gt;I pitched the idea to &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;yhaupenthal.org&quot;&gt;Y.&lt;&#x2F;a&gt;, thinking we could build it together :-) He loved the idea, and we brainstormed the best way to bring it to life.&lt;&#x2F;p&gt;
&lt;p&gt;In essence, our goal was to demonstrate that it’s basically impossible to deduce someone’s nationality from their answers, and to show that people from different countries tend to share similar opinions on life-and-death situations.&lt;&#x2F;p&gt;
&lt;p&gt;To make this even clearer, we visualize the percentage of correctly and incorrectly guessed nationalities (by continent) in a chart:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;rnd.cwiwie.org&#x2F;assets&#x2F;writefreely&#x2F;tolerance.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;open-borders&quot;&gt;Open Borders&lt;&#x2F;h2&gt;
&lt;p&gt;Since we plan to launch more projects like this, we quickly dubbed ourselves “Open Borders.” Under this name, we’ll release other projects in the future:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;wolke.cwiwie.org&#x2F;s&#x2F;DqJLANn4YFa3xKL&#x2F;preview&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;design-phase&quot;&gt;Design Phase&lt;&#x2F;h2&gt;
&lt;p&gt;The idea was fairly clear, so we started sketching some scenarios and answer options on a &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;pad.riseup.net&#x2F;&quot;&gt;Riseup pad&lt;&#x2F;a&gt;.
On the same day, we debated which system to use and where to host it. Yannic suggested &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.limesurvey.org&#x2F;&quot;&gt;Limesurvey&lt;&#x2F;a&gt; on his server. Done and done—we installed it, but quickly realized it wasn’t the right tool. Limesurvey is built for traditional surveys, and we wanted to describe situations in detail to evoke empathy before asking questions—something Limesurvey couldn’t handle.&lt;&#x2F;p&gt;
&lt;p&gt;So, over the next few days, I decided to build it myself in Ruby on Rails and created a repository &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;openborders&#x2F;tolerance&quot;&gt;on GitHub&lt;&#x2F;a&gt;. After a few days of coding, we had a first local version, which we tested and really liked. Due to time constraints, I continued development a few weeks later and soon had a version ready to go live.&lt;&#x2F;p&gt;
&lt;p&gt;Our biggest challenge: we are not&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Writers&lt;&#x2F;li&gt;
&lt;li&gt;Designers&lt;&#x2F;li&gt;
&lt;li&gt;Psychologists&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We had to curb our perfectionism, and admittedly some situation descriptions, questions, and answers could have been phrased better. Still, we decided to release a first version quickly (especially since the refugee topic was so hot at the time) and invite people to participate on the website.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ruby-on-rails-app&quot;&gt;Ruby on Rails App&lt;&#x2F;h2&gt;
&lt;p&gt;Ruby on Rails is based on the &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Model%E2%80%93view%E2%80%93controller&quot;&gt;MVC&lt;&#x2F;a&gt; pattern, which made it easy to model the units in our app. The app consists of these models:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;User&lt;&#x2F;li&gt;
&lt;li&gt;Situation&lt;&#x2F;li&gt;
&lt;li&gt;Question&lt;&#x2F;li&gt;
&lt;li&gt;Answer (UniversalAnswer)&lt;&#x2F;li&gt;
&lt;li&gt;Nationality&lt;&#x2F;li&gt;
&lt;li&gt;Continent&lt;&#x2F;li&gt;
&lt;li&gt;Survey&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Here’s how they relate (diagram generated from &lt;code&gt;modes.dot&lt;&#x2F;code&gt; using the Ruby gem railroady):&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;wolke.cwiwie.org&#x2F;s&#x2F;kDXQY6ssD4wzXPy&#x2F;preview&quot; alt=&quot;UML Diagram of RoR models generated with railroady&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We used &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;getbootstrap.com&#x2F;&quot;&gt;Twitter Bootstrap&lt;&#x2F;a&gt; for templates, so the app already looks decent. For simplicity, we used &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;SQLite&quot;&gt;SQLite&lt;&#x2F;a&gt; for the database and &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.highcharts.com&#x2F;&quot;&gt;Highcharts&lt;&#x2F;a&gt; to visualize the distribution of correctly guessed nationalities.
At the start of the survey, we tried to create a bit of emotion in the style of “&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.stanleyparable.com&#x2F;&quot;&gt;The Stanley Parable&lt;&#x2F;a&gt;” with a narrator named “Line.” Since we’re not professional writers, it’s debatable whether it really worked out.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;wolke.cwiwie.org&#x2F;s&#x2F;KiLnQ73pk4AZEqa&#x2F;preview&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;wolke.cwiwie.org&#x2F;s&#x2F;cEkXX8DHE86ozD3&#x2F;preview&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We’re looking for &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;tolerance.cwiwie.org&#x2F;contacts&quot;&gt;support&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
&lt;p&gt;Yannic set up the app on his server and started it—error included. After a few days of ignoring it, we finally found the &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;openborders&#x2F;tolerance&#x2F;commit&#x2F;0204f2804fceba9504f71808410e23dfd33d4b3e&quot;&gt;ridiculous bug&lt;&#x2F;a&gt; (wrong IDs in &lt;code&gt;seed.rb&lt;&#x2F;code&gt;) and the site went live.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;self-promotion&quot;&gt;Self-Promotion&lt;&#x2F;h2&gt;
&lt;p&gt;We shared the project on &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;twitter.com&#x2F;WiwieWiwiec&#x2F;status&#x2F;666020359557292032&quot;&gt;Twitter&lt;&#x2F;a&gt; and &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.facebook.com&#x2F;christian.wiwie&#x2F;posts&#x2F;961511067255092&quot;&gt;Facebook&lt;&#x2F;a&gt;. The feedback was immediate and positive:&lt;&#x2F;p&gt;
&lt;blockquote&gt;“awesome”  
— Facebook user (a.k.a Nicky Cordua Mattsson)&lt;&#x2F;blockquote&gt;
&lt;p&gt;Still, hardly anyone has voted so far. Unfortunately, the success of our project depends on having enough participants.
So here’s a more detailed write-up, hoping some of you find our idea cool, &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;tolerance.cwiwie.org&#x2F;&quot;&gt;join the project&lt;&#x2F;a&gt;, or help spread the word.&lt;&#x2F;p&gt;
&lt;p&gt;Here’s the call from the project website again:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;wolke.cwiwie.org&#x2F;s&#x2F;TWq7FZpXjpbCTsB&#x2F;preview&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Links: &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;tolerance.cwiwie.org&quot;&gt;http:&#x2F;&#x2F;tolerance.cwiwie.org&lt;&#x2F;a&gt; or &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;tolerance.yhaupenthal.org&quot;&gt;http:&#x2F;&#x2F;tolerance.yhaupenthal.org&lt;&#x2F;a&gt;
(soon, thanks to &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;letsencrypt.org&#x2F;&quot;&gt;Let’s Encrypt&lt;&#x2F;a&gt;, with SSL certificates too)&lt;&#x2F;p&gt;
&lt;p&gt;Thanks! :-)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Decluttering with find, grep, and gawk</title>
        <published>2015-06-09T22:44:20+01:00</published>
        <updated>2015-06-09T22:44:20+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/cleanup/"/>
        <id>https://blog.wiwie.dk/cleanup/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/cleanup/">&lt;p&gt;After yesterday’s Ubuntu upgrade process (once again) broke the Ubuntu installation on my old laptop, I had the chance to back up the most important folders before reinstalling. While doing so, I realized that the folders were much larger than expected—mostly due to unnecessary files I hadn’t touched in ages.&lt;&#x2F;p&gt;
&lt;p&gt;I was struck by a cleaning frenzy and started looking for a simple tool that would show me which folders were most cluttered with “file corpses.” I could then exclude these from the backup and delete them.&lt;&#x2F;p&gt;
&lt;p&gt;File corpses = files downloaded ages ago and never touched since. In other words,
&lt;code&gt;access_time(corpse) &amp;lt; now – x_days&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I want to find these corpses so I can delete them afterwards (after manually checking them). They’re usually outdated installation files for some software (which I rarely need anymore) or results of old, finished analyses. Generally, lots of junk that I can safely get rid of.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;whitelist&quot;&gt;Whitelist&lt;&#x2F;h2&gt;
&lt;p&gt;Sometimes, however, there are also files&#x2F;folders I’d like to keep for later (“just in case I need it again”—hehehe). That means I want to maintain a &lt;em&gt;whitelist&lt;&#x2F;em&gt; of files and folders to exclude from the search, since I consider them important.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;directory-grouping&quot;&gt;Directory grouping&lt;&#x2F;h2&gt;
&lt;p&gt;I also quickly noticed that things get messy if I just print all those files to STDOUT. So I wanted the files grouped by directory and only the number of corpses per directory printed.&lt;&#x2F;p&gt;
&lt;p&gt;Since I only found very bare-bones scripts online without whitelist functionality, I went ahead and wrote a small Bash script myself, based on &lt;strong&gt;find&lt;&#x2F;strong&gt;, &lt;strong&gt;grep&lt;&#x2F;strong&gt;, and &lt;strong&gt;gawk&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;First, &lt;strong&gt;find&lt;&#x2F;strong&gt; searches the given directory tree for all files (not folders) that haven’t been accessed in at least &lt;em&gt;x&lt;&#x2F;em&gt; days.&lt;&#x2F;li&gt;
&lt;li&gt;Then, &lt;strong&gt;grep&lt;&#x2F;strong&gt; checks which of these files match at least one of the whitelist patterns and filters those out.&lt;&#x2F;li&gt;
&lt;li&gt;Finally, &lt;strong&gt;gawk&lt;&#x2F;strong&gt; groups the corpses per directory. It iterates over each file corpse and increments the corpse count by one for each of its parent directories up to root.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Example:&lt;&#x2F;p&gt;
&lt;p&gt;If the file &lt;code&gt;&#x2F;home&#x2F;user&#x2F;Downloads&#x2F;test.txt&lt;&#x2F;code&gt; is a corpse, the count is incremented for:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;home&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;home&#x2F;user&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;home&#x2F;user&#x2F;Downloads&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;At the end, gawk writes the counts per directory to STDOUT, sorted by directory.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-script&quot;&gt;The script&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;! &#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-support z-function z-test z-begin z-shell&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-shell&quot;&gt;==&lt;&#x2F;span&gt; 2 &lt;span class=&quot;z-support z-function z-test z-end z-shell&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-or z-shell&quot;&gt;||&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-compound z-begin z-shell&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-echo z-shell&quot;&gt;echo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Two arguments expected&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-and z-shell&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-compound z-end z-shell&quot;&gt;)&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-printf z-shell&quot;&gt;printf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Finding subfolders in %s with files not accessed at least %d days\n&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;touch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; declutter.whitelist&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; look for files in given folder which are older than given number of days&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;find&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;atime&lt;&#x2F;span&gt; +&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;type&lt;&#x2F;span&gt; f &lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; declutter.result&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; filter files based on whitelist&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;grep&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;vf&lt;&#x2F;span&gt; declutter.whitelist declutter.result &lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; declutter.filtered&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; print number of such files per folder&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-printf z-shell&quot;&gt;printf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;#files\tIn Directory\n&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;gawk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-string z-quoted z-single z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt; BEGIN{OFS=&amp;quot;\t&amp;quot;} { i=0; while((newPos = index(substr($0,i+1),&amp;quot;&#x2F;&amp;quot;)) &amp;amp;&amp;amp; newPos &amp;gt; 0) { i=i+newPos; counts[substr($0,1,i)]++; }; } END{ asorti(counts,sorted); for (i = 1; i &amp;lt;= length(counts); i=i+1) { elem = sorted[i]; print counts[elem],elem } }&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; declutter.filtered&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The script takes two arguments:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;the base directory to search in&lt;&#x2F;li&gt;
&lt;li&gt;the number of days since the last access, so that a file is considered a corpse if older&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The whitelist file is located in the same directory as the script and contains one absolute path per line:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;.
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;usr&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;opt&#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The first line ensures that no hidden files&#x2F;folders are considered. It’s also important to specify folders with a trailing &lt;code&gt;&#x2F;&lt;&#x2F;code&gt;, otherwise folders with just an additional postfix would also be excluded: e.g., &lt;code&gt;&#x2F;home&#x2F;user&#x2F;test&lt;&#x2F;code&gt; would also exclude &lt;code&gt;&#x2F;home&#x2F;user&#x2F;test2&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In my downloads directory, the script finds the following corpses (no access for more than 100 days) when run with &lt;code&gt;sh declutter.sh &#x2F;home&#x2F;USERNAME&#x2F;Downloads 100&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Finding subfolders in &#x2F;home&#x2F;USERNAME&#x2F;Downloads with files not accessed at least 100 days
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# files In Directory
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;53 &#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;53 &#x2F;home&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;53 &#x2F;home&#x2F;USERNAME&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;53 &#x2F;home&#x2F;USERNAME&#x2F;Downloads&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;10 &#x2F;home&#x2F;USERNAME&#x2F;Downloads&#x2F;RRW&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;1 &#x2F;home&#x2F;USERNAME&#x2F;Downloads&#x2F;RRW&#x2F;META-INF&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;28 &#x2F;home&#x2F;USERNAME&#x2F;Downloads&#x2F;freduce&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;3 &#x2F;home&#x2F;USERNAME&#x2F;Downloads&#x2F;freduce&#x2F;R.packages&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;25 &#x2F;home&#x2F;USERNAME&#x2F;Downloads&#x2F;freduce&#x2F;bin&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;2 &#x2F;home&#x2F;USERNAME&#x2F;Downloads&#x2F;gecko-1.2.1&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;2 &#x2F;home&#x2F;USERNAME&#x2F;Downloads&#x2F;kual&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;4 &#x2F;home&#x2F;USERNAME&#x2F;Downloads&#x2F;ncbi-blast-2.2.29+&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;2 &#x2F;home&#x2F;USERNAME&#x2F;Downloads&#x2F;ncbi-blast-2.2.29+&#x2F;bin&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;1 &#x2F;home&#x2F;USERNAME&#x2F;Downloads&#x2F;ncbi-blast-2.2.29+&#x2F;doc&#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Would you also like me to slightly modernize the phrasing (e.g., replacing “file corpses” with something like “stale files”) or should I keep the playful wording as close to your original as possible?&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Take Time for the Important Things</title>
        <published>2014-10-18T00:22:23+01:00</published>
        <updated>2014-10-18T00:22:23+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/zeit-wichtige-dinge/"/>
        <id>https://blog.wiwie.dk/zeit-wichtige-dinge/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/zeit-wichtige-dinge/">&lt;p&gt;Today I’d like to share a little from my personal life and how I’m trying to shape it into something more desirable for me. For me, “more desirable” especially implies more connected to nature—and from that follows “healthier” and “more balanced.”&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-biggest-and-most-important-challenge&quot;&gt;The biggest and most important challenge...&lt;&#x2F;h1&gt;
&lt;p&gt;...for a person striving for a happier and more fulfilling life, in my conviction, is to live according to one’s own ideals. What, that’s it already? Yes. Even though the sentence sounds trivial, it’s not at all easy to put into practice.&lt;&#x2F;p&gt;
&lt;p&gt;Wherever you look, whoever you talk to—most of the problems people face are self-made in the sense that there is too large a gap between (1) what one considers desirable, one’s ideal life, and (2) what one actually lives.&lt;&#x2F;p&gt;
&lt;p&gt;I call this a life-discrepancy. In healthy amounts (as with everything), such a discrepancy is not harmful, but rather helps a person develop along a constructive path toward their goals. But a person with too large a life-discrepancy is rarely happy, because they constantly have to measure themselves against their ideals—which are so very high—and realize again and again that they fail to live up to them.&lt;&#x2F;p&gt;
&lt;p&gt;A life-discrepancy can have internal and external causes. We can work on both types:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Internal causes might be, for example, setting one’s ideals unrealistically high, making achievement impossible or frustrating from the outset. Another internal cause is the proverbial inner couch potato (or “inner resistance”). We can address these directly by becoming aware of them and changing our mindset—by overcoming that resistance or by setting more realistic expectations.&lt;&#x2F;li&gt;
&lt;li&gt;External causes are first determined by factors outside of ourselves: people around us, friends, family, work, society with its expectations and social norms, but also the technological possibilities of the time. All this influences how we live (spending free time at the PC&#x2F;in front of the TV instead of playing board games with others; commuting by car&#x2F;bus&#x2F;train instead of walking), as well as our norms, values, ideals, and goals.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This can mean that (1) external influences keep us from following our own ideals and goals, or (2) these influences shift our ideals and goals into the unrealistic. Generally, one can address external causes by becoming more independent of these influences, negotiating compromises, or—if that’s not possible—completely breaking away. This can be very difficult, for example if one’s job is the main reason for not living in line with one’s goals. We do read about radical breakaways from society from time to time, and while I find this tempting, it surely comes with many drawbacks. For me, compromise seems more desirable.&lt;&#x2F;p&gt;
&lt;p&gt;I’d like to illustrate my situation with two graphics:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;time_pc_real.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;time_pc_ideal.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-reasons&quot;&gt;The reasons&lt;&#x2F;h1&gt;
&lt;p&gt;In short, my life-discrepancy is mainly due to the faulty prioritization of “PC&#x2F;Internet” and “life without PC.” This discrepancy has long left me with the feeling that I’m wasting my time and not really making the most of my life.&lt;&#x2F;p&gt;
&lt;p&gt;I do a lot of things to pursue my ideals (helping people, doing something good for humanity), but my own growth and longings are mostly left behind (more closeness to nature, hiking, a few solitary hours).&lt;&#x2F;p&gt;
&lt;p&gt;The causes are a mix of internal and external factors, with external ones prevailing: internal factors include introversion and the resulting inertia. The weighty external factors are the way our society functions and the forms it takes today. Everything is already, and increasingly, made convenient (transport reduces physical movement, the Internet as a social medium reduces real-world encounters, technological achievements like PC&#x2F;Internet&#x2F;consoles have a high addictive potential).&lt;&#x2F;p&gt;
&lt;p&gt;The latter is the main reason I find it so hard to climb out of the “digital swamp”: I’m addicted! And not only me, but many people around me too.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;but-is-that-really-the-cause&quot;&gt;But is that really the cause?&lt;&#x2F;h1&gt;
&lt;p&gt;No. Because if I trace the causal chain further, I must admit: the reason I give in to these external temptations and cannot escape the digital swamp is often my stress level and “hamster-wheel lifestyle.”&lt;&#x2F;p&gt;
&lt;p&gt;There are weeks and months where I stumble from one deadline to the next, constantly feeling I’m running behind and never able to do anything 100%. In these times, my health suffers (neurodermatitis), my social life (I don’t go out), and also the balance of my activities and priorities.&lt;&#x2F;p&gt;
&lt;p&gt;In these phases, I spend much more time at the PC (not only work-related, but also because I lack energy for social activities) and eat more unhealthy foods, which I’d actually like to avoid according to my ideals. But that, too, is not the core problem, because why do I even push myself professionally like this?&lt;&#x2F;p&gt;
&lt;p&gt;Those are also ideals—but ones strongly indoctrinated by society&#x2F;family, namely: be hardworking, be successful at work, it’s good to help humanity!&lt;&#x2F;p&gt;
&lt;p&gt;In summary: in my stressful phases I pursue externally-given ideals, and thereby neglect my instinctive and deep wishes: to live more connected to nature, more consciously, and less dependent on PC&#x2F;Internet.&lt;&#x2F;p&gt;
&lt;p&gt;With my good friend Y., I’ve long shared this “balancing act” between the extremes of technology and nature. We both work in IT, but are also passionate nerds in our private lives. We enjoy tinkering with PCs, writing or testing new software&#x2F;scripts. Which brings us back to addiction. We’ve tried several approaches to reconcile both passions.&lt;&#x2F;p&gt;
&lt;p&gt;But for me, it’s becoming increasingly clear that the two (for me) cannot be reconciled directly. That’s why I’ve long wished to cut down on PC time and lead my life in a more natural way—or rather, to lead it there for the first time, since I’ve never really been there: born in 1986 and raised in a non-poor household, I could retreat into the tech world without hindrance. I grew up with it and sought PC-minded friends. After years of this lifestyle, I remain so deeply rooted in PC-thinking that I can only free myself with effort.&lt;&#x2F;p&gt;
&lt;p&gt;At extreme times, every other activity had to measure up against how much I wanted to put the PC&#x2F;laptop aside.&lt;&#x2F;p&gt;
&lt;p&gt;Meanwhile (thank God), I’m beginning to develop unconscious resistances against constant PC use: always being online in messengers, endless MMORPGs or multiplayer games (which can in principle go on forever). My taste in games has also changed: while I used to play shooters, strategy, RPGs, and basically anything, now I limit myself to (1) indie titles that speak to a deep longing (often related to nature, e.g. The Long Dark), (2) very complex games that make me think and don’t follow a formula, and (3) multiplayer titles with real friends. This is just one aspect of my digital life that has shifted for me in a more natural and important direction.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;a-plan&quot;&gt;A plan&lt;&#x2F;h1&gt;
&lt;p&gt;During my last visit to Y., we discussed many of these aspects, and after I (again) loudly complained about my lifestyle, we came up with a plan.&lt;&#x2F;p&gt;
&lt;p&gt;Because it’s hard to free oneself from the PC&#x2F;Internet swamp on one’s own, we work together. Using workrave , we both log and track how much time we spend at the PC each day—distinguishing between work and private use.&lt;&#x2F;p&gt;
&lt;p&gt;My plan includes:&lt;&#x2F;p&gt;
&lt;p&gt;On workdays, max. 1.5h leisure PC use.&lt;&#x2F;p&gt;
&lt;p&gt;On non-workdays, max. 3h PC use.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rewards-the-carrot&quot;&gt;Rewards (the carrot)&lt;&#x2F;h2&gt;
&lt;p&gt;For every hour we spend less at the PC, we may (with good conscience!) watch two episodes of a series or a film on the same day.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;penalties-the-stick&quot;&gt;Penalties (the stick)&lt;&#x2F;h2&gt;
&lt;p&gt;For every additional hour started, we pay €1 into our shared travel fund (today I owe €5).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-do-we-use-the-new-time&quot;&gt;How do we use the new time?&lt;&#x2F;h2&gt;
&lt;p&gt;We both set priorities for using the freed-up time. My top four are: (1) more social activities, (2) more sport, (3) more nature (e.g. greenhouse), (4) more reading.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mutual-exchange&quot;&gt;Mutual exchange&lt;&#x2F;h2&gt;
&lt;p&gt;We want to exchange regularly about how it’s going and where it’s stuck. To stay motivated, it’s important to talk especially when failing. Every two weeks we’ll reevaluate the plan and improve it if needed.&lt;&#x2F;p&gt;
&lt;p&gt;How things go for us, you’ll soon read here and on Y.’s blog (link to follow)!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Samsung Galaxy SII I9100 - Cyanogenmod 11, correct gapps version</title>
        <published>2014-06-21T22:58:13+01:00</published>
        <updated>2014-06-21T22:58:13+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/samsung-cyanogenmod/"/>
        <id>https://blog.wiwie.dk/samsung-cyanogenmod/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/samsung-cyanogenmod/">&lt;p&gt;Hey folks,&lt;&#x2F;p&gt;
&lt;p&gt;two reasons why I wanted to replace the Samsung ROM on my Galaxy SII with cyanogenmod:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Samsung does not provide updates anymore and the latest released version for the i9100 is based on Android 4.1.2. I am a security fanatic, thus I prefer to use current versions.&lt;&#x2F;li&gt;
&lt;li&gt;In context of NSA and the global privacy&#x2F;surveillance issues, I don&#x27;t trust any major corporation - including Google. Thus I want to keep the number of Google apps on my phone as small as possible. Many (non-essential) Google Apps cannot be uninstalled from a standard installation.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Official infos about cyanogenmod on the I9100 can be found &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;wiki.cyanogenmod.org&#x2F;w&#x2F;I9100_Info&quot;&gt;here&lt;&#x2F;a&gt; and the official installation instructions &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;wiki.cyanogenmod.org&#x2F;w&#x2F;Install_CM_for_i9100&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Download latest snapshot of CM11: &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;download.cyanogenmod.org&#x2F;?type=snapshot&amp;amp;device=i9100&quot;&gt;click&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Download nightly of CM11: &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;download.cyanogenmod.org&#x2F;?type=nightly&amp;amp;device=i9100&quot;&gt;click&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The overall procedure is as follows:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Install a (recent!) recovery on Galaxy S II.
&lt;ul&gt;
&lt;li&gt;A recovery is a special boot environment from which you can make administrative changes to your phone, which you cannot from within a booted Android (e.g. format cache,data,system,backup,restore,replace installed Android by custom ROM). The preinstalled recovery is NOT recent enough to install CM11.&lt;&#x2F;li&gt;
&lt;li&gt;I used the ClockworkMod recovery (&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;downloadandroidrom.com&#x2F;file&#x2F;GalaxyS2&#x2F;recovery&#x2F;CWM-KitKatCompatible-i9100.zip&quot;&gt;CWM-KitKatCompatible-i9100.zip&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Download recovery (zip) and cm11 build (zip) from the above links and copy them to the SD card of your I9100.&lt;&#x2F;li&gt;
&lt;li&gt;Boot into recovery
&lt;ul&gt;
&lt;li&gt;Restart&#x2F;Shutdown your phone. Turn it on again by holding the buttons &lt;strong&gt;Power+Home+VolumeUp&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Update recovery
&lt;ul&gt;
&lt;li&gt;Click &quot;install from zip file&quot; and select the recovery zip file (CWM-KitKatCompatible-i9100.zip)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Restart phone into new recovery
&lt;ul&gt;
&lt;li&gt;Choose restart from the menu and follow the same procedure as in 3. to boot into the newly installed recovery&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Install CyanogenMod
&lt;ul&gt;
&lt;li&gt;Again, &quot;install from zip file&quot; and choose the CM11 zip file&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;If desired, install gapps package containing official Google apps e.g. Google Play Store, Google Maps...
&lt;ul&gt;
&lt;li&gt;The most recent version of the official gapps package is available &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;wiki.cyanogenmod.org&#x2F;w&#x2F;Google_Apps&quot;&gt;here&lt;&#x2F;a&gt;. However, the most recent version is only compatible to latest nightlies of CM and not to the Snapshot M7! Overall, it&#x27;s preferable to install patched versions available in &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;forum.xda-developers.com&#x2F;showthread.php?t=2661932&quot;&gt;this&lt;&#x2F;a&gt; thread, which also has links to older versions.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Warning:&lt;&#x2F;strong&gt; Snapshot M7 requires version 4.4.2, latest nightlies require 4.4.3! Thus, the linked version on the official site only works for the nightlies. Installing the wrong version will lead to various errors including crashing Play Store (also &quot;no connection&quot;), crashing Browser&#x2F;Hangouts&#x2F;Play Service.. Also, I was not able to register my google account anymore and it terminated with an error like &lt;code&gt;could not connect to the google servers&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Some of the error messages I encountered:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Unfortunately, Google Play Store has stopped&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;Unfortunately, Google Play Services has stopped&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;No connection&quot; in Google Play Store&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Clipboard parsing using xclip and awk</title>
        <published>2014-06-21T22:56:25+01:00</published>
        <updated>2014-06-21T22:56:25+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/clipboard-parsing/"/>
        <id>https://blog.wiwie.dk/clipboard-parsing/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/clipboard-parsing/">&lt;p&gt;Whenever I had to do mechanical text parsing work in the past, involving lot of copying, applying the same change to copied lines and pasting  over and over again, I wondered why there isn&#x27;t any tool which allows me to apply a certain parsing command to a text in an automatized way. Often, I had to apply the same command to tens or hundreds of lines, which made it faster to just write a little parser script.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, I tackled the issue when I was facing the following two problems:&lt;&#x2F;p&gt;
&lt;h2 id=&quot;problem-1&quot;&gt;Problem 1&lt;&#x2F;h2&gt;
&lt;p&gt;Given the output text file of tool A which contains lines such as these:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;1 0.118 0.039 0.627 0.216 G
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;2 0.118 0.020 0.824 0.039 G
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;3 0.078 0.059 0.863 0.000 G
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;4 0.706 0.196 0.098 0.000 A
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;5 0.647 0.020 0.255 0.078 A
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;6 0.059 0.294 0.627 0.020 G
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;7 0.529 0.118 0.353 0.000 A
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;8 0.314 0.451 0.235 0.000 C
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;9 0.549 0.059 0.157 0.235 A
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;10 0.000 0.294 0.686 0.020 G
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Take only the information of the sixth column and concatenate the characters into one string from top to bottom. The result for the above example would be: &lt;code&gt;GGGAAGACAG&lt;&#x2F;code&gt;
The output of the program actually represents a PWM (position weight matrix) for a DNA sequence motif as well as the corresponding consensus sequence:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;column 1 contains the position in the motif&lt;&#x2F;li&gt;
&lt;li&gt;column 2 holds the probability of seeing base (nucleotide) A at that position&lt;&#x2F;li&gt;
&lt;li&gt;column 3: probability of seeing base C&lt;&#x2F;li&gt;
&lt;li&gt;column 4: probability of seeing base G&lt;&#x2F;li&gt;
&lt;li&gt;column 5: probability of seeing base T&lt;&#x2F;li&gt;
&lt;li&gt;column 6: the most probable base at that position&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;basic-solution-using-awk&quot;&gt;Basic solution using awk&lt;&#x2F;h3&gt;
&lt;p&gt;Using awk we can extract the sixth column from the given output and concatenate the characters into a single string:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;awk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-string z-quoted z-single z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;BEGIN{ORS=&amp;quot;&amp;quot;} {print $6}&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This alone does not do the trick for me in terms of usability. Of course I could paste the output into a text file and apply awk to the file.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;advanced-solution-using-xclip-and-awk&quot;&gt;Advanced solution using xclip and awk&lt;&#x2F;h3&gt;
&lt;p&gt;Instead, we are going to use xclip to improve on the above approach:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Copy (ctrl-c) the relevant part from the tools output into the clipboard&lt;&#x2F;li&gt;
&lt;li&gt;use xclip to read out the clipboard, pipe it into the awk command above and write the result back into the clipboard&lt;&#x2F;li&gt;
&lt;li&gt;Paste (ctrl-v) the clipboard content to wherever you need the parsed&#x2F;converted text (in this example the consensus sequence).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We can do this by using the following command:
&lt;code&gt;xclip -o -selection clipboard | awk &#x27;BEGIN{ORS=&quot;&quot;} {print $6}&#x27; | xclip -i -selection clipboard&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;sugar&quot;&gt;Sugar&lt;&#x2F;h3&gt;
&lt;p&gt;To make it even better,&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;I wrote a little python GUI allowing me to select between different such commands and&lt;&#x2F;li&gt;
&lt;li&gt;created a shortcut that executes the selected command.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I did this as follows:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;create a directory &lt;code&gt;~&#x2F;.fastCommands&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;create bash script &lt;code&gt;~&#x2F;.fastCommands&#x2F;pwm_to_consensus_sequence.sh&lt;&#x2F;code&gt; containing the above advanced command&lt;&#x2F;li&gt;
&lt;li&gt;create a symlink &lt;code&gt;~&#x2F;.fastCommands&#x2F;activeCommand.sh&lt;&#x2F;code&gt; pointing at the currently active &quot;fast command&quot;, in my case &lt;code&gt;~&#x2F;.fastCommands&#x2F;pwm_to_consensus_sequence.sh&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;and create a shortcut that executes &lt;code&gt;bash ~&#x2F;.fastCommands&#x2F;activeCommand.sh&lt;&#x2F;code&gt; (I used the custom shortcut functionality of gnome shell).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The GUI is a simple python script (Warning, dirty!, based on &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;6389580&#x2F;quick-and-easy-trayicon-with-python&#x2F;6389727#6389727&quot;&gt;this&lt;&#x2F;a&gt;) which just redirects the activeCommand.sh symlink to one of the available commands.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python z-code&quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-python&quot;&gt;import&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;ntpath&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-from z-python&quot;&gt;from&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;span class=&quot;z-meta z-import-source z-python&quot;&gt; &lt;span class=&quot;z-meta z-import-path z-python&quot;&gt;&lt;span class=&quot;z-meta z-import-name z-python&quot;&gt;os&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-python&quot;&gt;import&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;listdir&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-from z-python&quot;&gt;from&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;span class=&quot;z-meta z-import-source z-python&quot;&gt; &lt;span class=&quot;z-meta z-import-path z-python&quot;&gt;&lt;span class=&quot;z-meta z-import-name z-python&quot;&gt;os&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-import-name z-python&quot;&gt;path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-python&quot;&gt;import&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;isfile&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-import-list z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-import-list z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;realpath&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-from z-python&quot;&gt;from&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;span class=&quot;z-meta z-import-source z-python&quot;&gt; &lt;span class=&quot;z-meta z-import-path z-python&quot;&gt;&lt;span class=&quot;z-meta z-import-name z-python&quot;&gt;subprocess&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-python&quot;&gt;import&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;call&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-statement z-import z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-python&quot;&gt;import&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;wx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-other z-constant z-python&quot;&gt;TRAY_TOOLTIP&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;System Tray Demo&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-other z-constant z-python&quot;&gt;TRAY_ICON&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;icon.png&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-other z-constant z-python&quot;&gt;FAST_COMMAND_DIR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;&#x2F;home&#x2F;USER&#x2F;.fastCommands&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;create_menu_item&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;menu&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-parameters z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;label&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-parameters z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;func&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;item&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;wx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;MenuItem&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;menu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-python&quot;&gt;-&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-python&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;label&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;menu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;Bind&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;wx&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-python&quot;&gt;EVT_MENU&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;func&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;id&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;item&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;GetId&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;menu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;AppendItem&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;item&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-flow z-return z-python&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;item&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-class z-python&quot;&gt;&lt;span class=&quot;z-storage z-type z-class z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-class z-python&quot;&gt;class&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-class z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;TaskBarIcon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-inheritance z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-inheritance z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-inheritance z-python&quot;&gt;&lt;span class=&quot;z-entity z-other z-inherited-class z-python&quot;&gt;wx&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;TaskBarIcon&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-inheritance z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-class z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;    &lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-support z-function z-magic z-python&quot;&gt;__init__&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-support z-function z-builtin z-python&quot;&gt;super&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;TaskBarIcon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-support z-function z-magic z-python&quot;&gt;__init__&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;set_icon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-other z-constant z-python&quot;&gt;TRAY_ICON&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;Bind&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;wx&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-constant z-python&quot;&gt;EVT_TASKBAR_LEFT_DOWN&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;on_left_down&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;	&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;menuMap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-mapping z-empty z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-python&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-end z-python&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; 
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;    &lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;CreatePopupMenu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;menu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;wx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;Menu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;	&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;mypath&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-other z-constant z-python&quot;&gt;FAST_COMMAND_DIR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;	&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;activeCommand&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;ntpath&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;basename&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;realpath&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;mypath&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic z-python&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;activeCommand.sh&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;	
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;	&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;onlyfiles&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-sequence z-list z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-sequence z-begin z-python&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-expression z-generator z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-loop z-for z-generator z-python&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;f&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-loop z-for z-in z-python&quot;&gt;in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;listdir&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;mypath&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-conditional z-if z-python&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;isfile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;join&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;mypath&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-python&quot;&gt;and&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;f&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-python&quot;&gt;!=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;activeCommand.sh&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-section z-sequence z-end z-python&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;	&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-loop z-for z-python&quot;&gt;for&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;file&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-loop z-for z-in z-python&quot;&gt;in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;onlyfiles&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-statement z-loop z-for z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-loop z-for z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;		&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;item&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;create_menu_item&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;menu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;on_hello&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;		&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;menuMap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-begin z-python&quot;&gt;[&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-arguments z-python&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;item&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;GetId&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-end z-python&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;		&lt;span class=&quot;z-meta z-statement z-conditional z-if z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-python&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-python&quot;&gt;==&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;activeCommand&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-block z-conditional z-if z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;			&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;item&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;Enable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-python&quot;&gt;False&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;menu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;AppendSeparator&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;create_menu_item&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;menu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;Exit&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;on_exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-keyword z-control z-flow z-return z-python&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;menu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;    &lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;set_icon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-parameters z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;icon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;wx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;IconFromBitmap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;wx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;Bitmap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;SetIcon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;icon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-other z-constant z-python&quot;&gt;TRAY_TOOLTIP&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;    &lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;on_left_down&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-parameters z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-keyword z-other z-print z-python&quot;&gt;print&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;Tray icon was left-clicked.&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;    &lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;on_hello&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-parameters z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;	&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;call&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-sequence z-list z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-sequence z-begin z-python&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-python&quot;&gt;ln&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-sequence z-python&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-python&quot;&gt;-s&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-sequence z-python&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-python&quot;&gt;-f&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-sequence z-python&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-other z-constant z-python&quot;&gt;FAST_COMMAND_DIR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic z-python&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;menuMap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-begin z-python&quot;&gt;[&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-arguments z-python&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;event&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;GetId&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-item-access z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-end z-python&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-sequence z-python&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-other z-constant z-python&quot;&gt;FAST_COMMAND_DIR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic z-python&quot;&gt;+&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-python&quot;&gt;activeCommand.sh&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-sequence z-end z-python&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;    &lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;on_exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-parameters z-python&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-python&quot;&gt;event&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;        &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;wx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;CallAfter&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-language z-python&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;Destroy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-python&quot;&gt;&lt;span class=&quot;z-keyword z-declaration z-function z-python&quot;&gt;def&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-parameters z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-function z-begin z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;wx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;PySimpleApp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;TaskBarIcon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-python&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;MainLoop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-statement z-conditional z-if z-python&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-python&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-support z-variable z-magic z-python&quot;&gt;__name__&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-python&quot;&gt;==&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-single z-python&quot;&gt;__main__&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-block z-conditional z-if z-python&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-function z-python&quot;&gt;&lt;span class=&quot;z-meta z-generic-name z-python&quot;&gt;main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-python&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-python&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;My shortcut is ctrl-alt-f, such that I press ctrl-c, ctrl-alt-f and ctrl-v and I have my converted text pasted where I want it.&lt;&#x2F;p&gt;
&lt;p&gt;Easy, fast and saving a lot of time! :-)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;problem-2&quot;&gt;Problem 2&lt;&#x2F;h2&gt;
&lt;p&gt;I created a second script the same way as before for another problem:&lt;&#x2F;p&gt;
&lt;p&gt;Given a text following the format &lt;code&gt;chrN_startpos_endpos&lt;&#x2F;code&gt;
convert it to the slightly different format
&lt;code&gt;chrN:startpos-endpos&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We can achieve this conversion again, using awk:
&lt;code&gt;awk &#x27;!x{x=sub(&quot;_&quot;,&quot;:&quot;)}7 !x{x=sub(&quot;_&quot;,&quot;-&quot;)}7&#x27;&lt;&#x2F;code&gt;
And again, as before, we parse from the clipboard using xclip and write it back:
&lt;code&gt;xclip -o -selection clipboard | awk &#x27;!x{x=sub(&quot;_&quot;,&quot;:&quot;)}7 !x{x=sub(&quot;_&quot;,&quot;-&quot;)}7&#x27; | xclip -i -selection clipboard&lt;&#x2F;code&gt;
The string describes a genomic region including the chromosome as well as start and endposition of the region of interest. The first format is the format internally used in a database, the second format is compatible to the USCS genome browser.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>R: Extract matrix entries by condition</title>
        <published>2012-09-30T23:20:01+01:00</published>
        <updated>2012-09-30T23:20:01+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/r-extract-matrix/"/>
        <id>https://blog.wiwie.dk/r-extract-matrix/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/r-extract-matrix/">&lt;p&gt;Today I was wondering how I could extract certain entries (&lt;code&gt;≥0.95&lt;&#x2F;code&gt;) from a huge matrix in R containing about 1.5 billion float values.
I had this simple condition on the values, and I wanted to iterate over all entries that satisfied that condition and write them to a file.&lt;&#x2F;p&gt;
&lt;p&gt;After some fiddling I found I quick way of doing so:&lt;&#x2F;p&gt;
&lt;p&gt;We make use of the which-function, which is capable of extracting indices from matrices that fulfill certain conditions and then use the apply function:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;R&quot; class=&quot;language-R z-code&quot;&gt;&lt;code class=&quot;language-R&quot; data-lang=&quot;R&quot;&gt;&lt;span class=&quot;z-source z-r&quot;&gt;trueIndices &lt;span class=&quot;z-keyword z-operator z-assignment z-r&quot;&gt;&amp;lt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-name z-r&quot;&gt;&lt;span class=&quot;z-support z-function z-r&quot;&gt;which&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-r&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-r&quot;&gt;(&lt;&#x2F;span&gt;matrix ≥ &lt;span class=&quot;z-constant z-numeric z-float z-decimal z-r&quot;&gt;0&lt;span class=&quot;z-punctuation z-separator z-decimal z-r&quot;&gt;.&lt;&#x2F;span&gt;95&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-r&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-r&quot;&gt;arr.ind&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-r&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-r&quot;&gt;TRUE&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-r&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-r&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-name z-r&quot;&gt;&lt;span class=&quot;z-support z-function z-r&quot;&gt;apply&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-r&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arguments z-begin z-r&quot;&gt;(&lt;&#x2F;span&gt;trueIndices&lt;span class=&quot;z-punctuation z-separator z-arguments z-r&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-r&quot;&gt;MARGIN&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-r&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-float z-decimal z-r&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-arguments z-r&quot;&gt;,&lt;&#x2F;span&gt; writeFunction&lt;span class=&quot;z-punctuation z-section z-arguments z-end z-r&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>&quot;Adwaita Dark&quot; Gnome3 theme</title>
        <published>2012-06-23T23:10:36+01:00</published>
        <updated>2012-06-23T23:10:36+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/adwaita/"/>
        <id>https://blog.wiwie.dk/adwaita/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/adwaita/">&lt;p&gt;Recently I found a dark-theme for GNOME Shell, which makes it much less tiring when working with the PC for a longer time. Its name is Adwaita Dark, made by &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; title=&quot;Felipe Cabargas&quot; href=&quot;http:&#x2F;&#x2F;felipecabargas.tk&#x2F;blog&#x2F;2011&#x2F;10&#x2F;adwaita-dark-para-gnome-3&#x2F;&quot;&gt;Felipe Cabargas&lt;&#x2F;a&gt;. It can be downloaded &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; title=&quot;here&quot; href=&quot;http:&#x2F;&#x2F;felipe.netai.net&#x2F;proyectos&#x2F;gnome-shell&#x2F;themes&#x2F;Adwaita-Dark.tar.gz&quot;&gt;here&lt;&#x2F;a&gt;. The contents of the file need to be copied to a subfolder in &#x2F;usr&#x2F;share&#x2F;themes&#x2F;, e.g. by executing the following commands&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;tar&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;xzf&lt;&#x2F;span&gt; Adwaita-Dark.tar.gz&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; cp&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;R&lt;&#x2F;span&gt; .&#x2F;Adwaita&lt;span class=&quot;z-constant z-character z-escape z-shell&quot;&gt;\ &lt;&#x2F;span&gt;Dark&#x2F; &#x2F;usr&#x2F;share&#x2F;themes&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;changing-your-gnome-theme&quot;&gt;Changing your GNOME theme&lt;&#x2F;h2&gt;
&lt;p&gt;Now an easy way to change your theme is using the gnome-tweak-tool. If you haven&#x27;t already installed it just do so by executing
&lt;code&gt;sudo apt-get install gnome-tweak-tool&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Some additional help on it can be found &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; title=&quot;here&quot; href=&quot;http:&#x2F;&#x2F;www.ubuntugeek.com&#x2F;gnome-tweak-tool-a-tool-for-changing-specialised-or-advanced-gnome3-settings.html&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;After you installed it, select &quot;Theme&quot; in the left list and select &quot;Adwaita Dark&quot; from the dropdown option &quot;GTK+ theme&quot; on the right. The theme should be applied immediately, if it is not just hit ALT+F2 and enter &quot;r&quot;. This will restart GNOME-Shell.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;coloring-problems&quot;&gt;Coloring problems&lt;&#x2F;h2&gt;
&lt;p&gt;I encountered coloring-problems with some programs, e.g. the background of the Ubuntu Software Center does not adapt to the theme correctly, such that you will not be able to read text. You can fix this by manually changing the css-file of the Ubuntu Software Center. The whole procedure can be found &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; title=&quot;here&quot; href=&quot;http:&#x2F;&#x2F;ubuntuforums.org&#x2F;showthread.php?t=1913590&quot;&gt;here&lt;&#x2F;a&gt;, in short you have to edit the file &quot;&#x2F;usr&#x2F;share&#x2F;software-center&#x2F;ui&#x2F;gtk3&#x2F;css&#x2F;softwarecenter.css&quot;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; vi &#x2F;usr&#x2F;share&#x2F;software-center&#x2F;ui&#x2F;gtk3&#x2F;css&#x2F;softwarecenter.css&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and replace&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;css&quot; class=&quot;language-css z-code&quot;&gt;&lt;code class=&quot;language-css&quot; data-lang=&quot;css&quot;&gt;&lt;span class=&quot;z-source z-css&quot;&gt;@&lt;span class=&quot;z-meta z-selector z-css&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-custom z-css&quot;&gt;define-color&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-tag z-custom z-css&quot;&gt;light-aubergine&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-id z-css&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-entity z-css&quot;&gt;#&lt;&#x2F;span&gt;DED7DB&lt;&#x2F;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-css&quot;&gt;&lt;span class=&quot;z-meta z-selector z-css&quot;&gt;&lt;&#x2F;span&gt;@&lt;span class=&quot;z-meta z-selector z-css&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-custom z-css&quot;&gt;define-color&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-tag z-custom z-css&quot;&gt;super-light-aubergine&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-id z-css&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-entity z-css&quot;&gt;#&lt;&#x2F;span&gt;F4F1F3&lt;&#x2F;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;by e.g.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;css&quot; class=&quot;language-css z-code&quot;&gt;&lt;code class=&quot;language-css&quot; data-lang=&quot;css&quot;&gt;&lt;span class=&quot;z-source z-css&quot;&gt;@&lt;span class=&quot;z-meta z-selector z-css&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-custom z-css&quot;&gt;define-color&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-tag z-custom z-css&quot;&gt;light-aubergine&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-id z-css&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-entity z-css&quot;&gt;#&lt;&#x2F;span&gt;DED7DB&lt;&#x2F;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-css&quot;&gt;&lt;span class=&quot;z-meta z-selector z-css&quot;&gt;&lt;&#x2F;span&gt;@&lt;span class=&quot;z-meta z-selector z-css&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-custom z-css&quot;&gt;define-color&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-tag z-custom z-css&quot;&gt;super-light-aubergine&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-id z-css&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-entity z-css&quot;&gt;#&lt;&#x2F;span&gt;B4A66F&lt;&#x2F;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Conversations in Thunderbird including In- and Outbox</title>
        <published>2012-01-18T23:09:37+01:00</published>
        <updated>2012-01-18T23:09:37+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/conversations-thunderbird/"/>
        <id>https://blog.wiwie.dk/conversations-thunderbird/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/conversations-thunderbird/">&lt;p&gt;Usually when you select a folder e.g. the inbox of a certain mail-account in the left-hand side list, Thunderbird will show you all the messages contained in the selected folder in the middle, including several details (depending on the column selection you did) like date or recipient. Also the leftmost column shows you a little tree-like-icon which, when clicked, enables a thread-view of your messages. Then messages belonging to the same conversation are grouped together such that one sees all messages belonging to a conversation easily by simply expanding it.&lt;&#x2F;p&gt;
&lt;p&gt;Now I was confronted with the problem, that I could group messages within one folder (e.g. in the inbox or the outbox), but not including several folders. Therefore conversations I saw in the list, contained either all the inbox- or the outbox-messages belonging to the same conversation, but not all messages (inbox and outbox at the same time).&lt;&#x2F;p&gt;
&lt;p&gt;There are several ways, one can achieve seeing the complete conversation belonging to a certain email, e.g. by using the addon &quot;Thunderbird Conversations&quot;, which shows you the whole conversation (inbox+outbox) in the content-window, when you select one message in the email-list above it. This does not show you all messages in the list-view, but only in the message-content-window.&lt;&#x2F;p&gt;
&lt;p&gt;But there is an easier way without the use of any addons: One can create a virtual folder (saved search), which contains all messages within inbox and outbox, and afterwards simply enable the grouping for this folder.&lt;&#x2F;p&gt;
&lt;p&gt;A virtual folder can be created by selecting the folder on the left hand side in which you want to insert it, then hitting Edit-&amp;gt;Find-&amp;gt;Search messages. Next you click on &quot;Save search as a folder&quot; and a window pops up, where you can give your new folder a name and where you can select all the folders you want to include in your virtual folder (here you select all inboxes and outboxes). If you wish, you can include conditions on the included messages as well.&lt;&#x2F;p&gt;
&lt;p&gt;Now you will see this virtual folder in the menu on the left, by clicking on it you see all the inbox+outbox messages and by enabling the grouping you achieved exactly what you wanted: Seeing the whole conversation.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Diagona Icons: A free Icon-Pack</title>
        <published>2011-05-15T23:07:14+01:00</published>
        <updated>2011-05-15T23:07:14+01:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.wiwie.dk/diagona-icons/"/>
        <id>https://blog.wiwie.dk/diagona-icons/</id>
        
        <content type="html" xml:base="https://blog.wiwie.dk/diagona-icons/">&lt;p&gt;Some weeks ago, while I was looking for nice icons for an application I wrote, I stumbled over a freely available Icon-pack called &quot;Diagona Icons&quot; made by &lt;em&gt;Yusuke Kamiyamane&lt;&#x2F;em&gt;. On his &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;p.yusukekamiyamane.com&#x2F;&quot;&gt;website&lt;&#x2F;a&gt; there are several icon-sets available, which are all licensed under the &quot;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;creativecommons.org&#x2F;licenses&#x2F;by&#x2F;3.0&#x2F;&quot;&gt;Creative Commons Attribution 3.0 license&lt;&#x2F;a&gt;&quot; which means that&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;you can use the icons for any purpose&lt;&#x2F;li&gt;
&lt;li&gt;under the condition, that you attribute the work of the author of the icons (you can find more information about what this means on the license-website)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Since then I&#x27;m using Yusuke&#x27;s Icon-sets in almost all my projects.&lt;&#x2F;p&gt;
&lt;p&gt;Yusuke, you did a pretty good job and thanks for sharing your spirit so liberally!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;p.yusukekamiyamane.com&#x2F;icons&#x2F;preview&#x2F;diagona.png&quot; alt=&quot;&quot; title=&quot;Diagona Preview&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
