<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>mabs.dk</title>
    <description>Confessions of a computer geek. A blog about open source, web development and other topics.</description>
    <link>https://mabs.dk/</link>
    <atom:link href="https://mabs.dk/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sat, 07 Mar 2026 04:30:16 +0100</pubDate>
    <lastBuildDate>Sat, 07 Mar 2026 04:30:16 +0100</lastBuildDate>
    <generator>Jekyll v4.3.2</generator>
    
      <item>
        <title>Accessible NativeScript - Part 2 - The Labeling</title>
        <description>&lt;p&gt;This is the second part in my &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Accessible NativeScript&lt;/code&gt;-series.&lt;/p&gt;

&lt;p&gt;Since &lt;a href=&quot;/open%20source/nativescript/2019/07/07/accessible-nativescript-part-1-the-setup.html&quot;&gt;part 1&lt;/a&gt; NativeScript 6.0 have been release and we’ve published the new alpha-version of our plugin, with the new and improved API and new css-properties.&lt;/p&gt;

&lt;h1 id=&quot;introduction&quot;&gt;Introduction&lt;/h1&gt;

&lt;p&gt;Writing good labels is essential for making your app accessible for the visually impaired.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;We have three properties for labeling our UI: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityLabel&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityValue&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityHint&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There is a slight difference in behavior between iOS and Android.
VoiceOver (iOS) will read these fields in this order &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityLabel&lt;/code&gt; -&amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityValue&lt;/code&gt; -&amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;traits/role&lt;/code&gt; &lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; -&amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityHint&lt;/code&gt;
TalkBack (android) the fields will be concatted&lt;sup id=&quot;fnref:2&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityLabel. accessibilityValue. accessibilityHint.&lt;/code&gt; followed by the role&lt;sup id=&quot;fnref:1:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;You’ll also want to set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessible=&quot;true&quot;&lt;/code&gt; on the element or you might get unexpected behavior.&lt;/p&gt;

&lt;h1 id=&quot;writing-a-good-label&quot;&gt;Writing a good label:&lt;/h1&gt;

&lt;p&gt;Common for all three properties:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Values should be localized or it will sound very strange when the screen reader reads the label. You can override the language on iOS via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityLanguage&lt;/code&gt; but not on Android.&lt;/li&gt;
  &lt;li&gt;Start with a capitalized later. Helps the screen render.&lt;/li&gt;
  &lt;li&gt;Should not contain the name of the control use `accessibilityRole’&lt;sup id=&quot;fnref:1:2&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; for that.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;accessibilitylabel&quot;&gt;accessibilityLabel=”…”&lt;/h2&gt;

&lt;p&gt;Ideally a single word description the element like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Add&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Play&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Delete&lt;/code&gt; etc.
It isn’t always possible to give a single word description, in these cases you should strive for a short phrase like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Delete bookmark&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Every accessible element should have this value.&lt;/p&gt;

&lt;p&gt;Should not end with a period.&lt;/p&gt;

&lt;h2 id=&quot;accessibilityvalue&quot;&gt;accessibilityValue=”…”&lt;/h2&gt;

&lt;p&gt;Use this property to override the value of the field. If this value is not set the screen reader will use the default value for the element.&lt;br /&gt;
For &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Label&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Button&lt;/code&gt; the default value is from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text&lt;/code&gt;-property.&lt;br /&gt;
For &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Slider&lt;/code&gt; on iOS&lt;sup id=&quot;fnref:3&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; it will be the numeric value.&lt;/p&gt;

&lt;h2 id=&quot;accessibilityhint&quot;&gt;accessibilityHint=”…”&lt;/h2&gt;

&lt;p&gt;If the result of interacting with the element is not obvious from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityLabel&lt;/code&gt; use an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityHint&lt;/code&gt; to describe it.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The hint should be as short as possible.&lt;/li&gt;
  &lt;li&gt;It should not sound as a command:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Opens&lt;/code&gt; rather than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Open&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Plays&lt;/code&gt; rather than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Play&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Deletes&lt;/code&gt; rather than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Delete&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;etc…&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;It should end with period.&lt;/li&gt;
  &lt;li&gt;Few elements should have this.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Will be covered by a later article. For now see &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityRole&lt;/code&gt; in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README&lt;/code&gt;. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt; &lt;a href=&quot;#fnref:1:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;#fnref:1:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Android only provide one field for labeling an element &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ContentDescription&lt;/code&gt;. &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;It isn’t possible to override the value on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Slider&lt;/code&gt; on Android. &lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
        <pubDate>Mon, 29 Jul 2019 11:00:00 +0200</pubDate>
        <link>https://mabs.dk/open%20source/nativescript/2019/07/29/accessible-nativescript-part-2-the-labeling.html</link>
        <guid isPermaLink="true">https://mabs.dk/open%20source/nativescript/2019/07/29/accessible-nativescript-part-2-the-labeling.html</guid>
        
        <category>accessibility</category>
        
        <category>Javascript</category>
        
        <category>NativeScript</category>
        
        <category>plugin</category>
        
        <category>TypeScript</category>
        
        <category>app</category>
        
        <category>iOS</category>
        
        <category>Android</category>
        
        
        <category>Open Source</category>
        
        <category>NativeScript</category>
        
      </item>
    
      <item>
        <title>Accessible NativeScript - Part 1 - The Setup</title>
        <description>&lt;p&gt;This is the first article in a series about making NativeScript app accessible, using the plugin &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@nota/nativescript-accessibility-ext&lt;/code&gt; that my team been developed for our employer, &lt;a href=&quot;https://nota.dk&quot;&gt;Nota&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Two years have passed since I wrote my last article on and a lot has happend since when.&lt;/p&gt;

&lt;h1 id=&quot;setup&quot;&gt;Setup&lt;/h1&gt;

&lt;p&gt;First things first, lets set a new NativeScript angular project with the plugin.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; NativeScript core and Vue are also supported.&lt;/p&gt;

&lt;p&gt;Source code is available &lt;a href=&quot;https://github.com/m-abs/tns-a11y-playground/tree/article/part-1&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;step-1&quot;&gt;Step 1&lt;/h2&gt;

&lt;p&gt;Create a new project with the nativescript cli and add the plugin.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;tns create &lt;span class=&quot;nt&quot;&gt;--ng&lt;/span&gt; tns-a11y-playground
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;tns-a11y-playground &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; tns plugin add @nota/nativescript-accessibility-ext
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;step-2&quot;&gt;Step 2&lt;/h2&gt;

&lt;p&gt;Import &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NotaAccessibilityExtModule&lt;/code&gt; into your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AppModule&lt;/code&gt; (for NativeScript Core and Vue - see the readme).
This extends the NativeScript View classes and setup the various helpers needed.&lt;/p&gt;

&lt;p&gt;Edit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src/app/app.module.ts&lt;/code&gt; and add these two line:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;NgModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;NO_ERRORS_SCHEMA&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;@angular/core&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;NativeScriptModule&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;nativescript-angular/nativescript.module&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;NotaAccessibilityExtModule&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;@nota/nativescript-accessibility-ext/angular&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/** add this line **/&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AppRoutingModule&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;./app-routing.module&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AppComponent&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;./app.component&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ItemsComponent&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;./item/items.component&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ItemDetailComponent&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;./item/item-detail.component&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;NgModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;bootstrap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;AppComponent&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;imports&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;NativeScriptModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;AppRoutingModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;NotaAccessibilityExtModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/** add this line **/&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;declarations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;AppComponent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;ItemsComponent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;ItemDetailComponent&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;schemas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;NO_ERRORS_SCHEMA&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AppModule&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;step-3---optional-but-highly-recommended&quot;&gt;Step 3 - Optional but highly recommended.&lt;/h2&gt;

&lt;p&gt;Import the extension to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nativescript-theme-core&lt;/code&gt; into your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src/app.css&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Edit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src/app.css&lt;/code&gt; and add a single line:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&apos;~nativescript-theme-core/css/core.light.css&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&apos;../node_modules/@nota/nativescript-accessibility-ext/css/a11y.css&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/** &amp;lt;-- add this line **/&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This enables this css helper classes and &lt;a href=&quot;/open%20source/nativescript/2017/07/16/nativescript-accessibility-fontscaling.html&quot;&gt;font-scaling&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;testing-the-results&quot;&gt;Testing the results&lt;/h1&gt;

&lt;p&gt;When developing an accessible app, I recommend you try out the results for yourself.&lt;/p&gt;

&lt;h2 id=&quot;on-ios&quot;&gt;On iOS&lt;/h2&gt;

&lt;p&gt;The screen reader on iOS is called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;VoiceOver&lt;/code&gt;. It is only available on hardware devices.&lt;/p&gt;

&lt;p&gt;(Enabling and using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;VoiceOver&lt;/code&gt;)[https://support.apple.com/guide/iphone/turn-on-and-practice-voiceover-iph3e2e415f/ios]&lt;/p&gt;

&lt;p&gt;You can use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Accessibility Inspector&lt;/code&gt; from XCode to inspect the App on the simulator. You find it by opening XCode -&amp;gt; Going to the Xcode -&amp;gt; Open Developer Tools -&amp;gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Accessibility Inspector&lt;/code&gt;&lt;/p&gt;

&lt;h2 id=&quot;on-android&quot;&gt;On Android&lt;/h2&gt;

&lt;p&gt;The screen reader for Android is called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TalkBack&lt;/code&gt; (some vendors rebrand it. Samsung call their version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Voice Assistant&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://support.google.com/accessibility/android/answer/6007100?hl=en&quot;&gt;Turn on TalkBack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Using the &lt;a href=&quot;https://support.google.com/accessibility/android/answer/6006966?hl=en&quot;&gt;Volume key shortcut&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;install-talkback-on-the-emulator&quot;&gt;Install Talkback on the emulator&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Talkback&lt;/code&gt; isn’t installed by default on the android emulator, but can easily be installed.&lt;/p&gt;

&lt;p&gt;Start by launching the emulator.&lt;/p&gt;

&lt;p&gt;Checkout, build and install talkback.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git checkout https://github.com/google/talkback.git
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;talkback
./gradlew installDebug
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;enabling-talkback&quot;&gt;Enabling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TalkBack&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Can also be enabled via a shortcut see: &lt;a href=&quot;https://support.google.com/accessibility/android/answer/6006966?hl=en&quot;&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h1 id=&quot;lets-get-started&quot;&gt;Lets get started&lt;/h1&gt;

&lt;p&gt;We’ll make the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ListView&lt;/code&gt; more accessible be changing from:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;ActionBar&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;title=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;My App&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;action-bar&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;lt;/ActionBar&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;GridLayout&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;page&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;ListView&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;[items]=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;items&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;list-group&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;ng-template&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;let-item=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;item&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;Label&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;[nsRouterLink]=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;[&apos;/item&apos;, item.id]&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;[text]=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;item.name&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;list-group-item&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/Label&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/ng-template&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/ListView&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/GridLayout&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To this:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;ActionBar&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;title=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;My App&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;action-bar&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;&amp;lt;/ActionBar&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;GridLayout&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;page&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;ListView&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;[items]=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;items&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;list-group&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;ng-template&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;let-item=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;item&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;StackLayout&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;accessible=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;accessibilityRole=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;button&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;[accessiblityLabel]=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;item.name&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;list-group-item&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;[nsRouterLink]=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;[&apos;/item&apos;, item.id]&quot;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;Label&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;[text]=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;item.name&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/Label&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;/StackLayout&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/ng-template&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/ListView&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/GridLayout&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We wrapped the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Label&lt;/code&gt; in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StackLayout&lt;/code&gt; (NativeScript does this internally) and settings a few new attributes.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessible&lt;/code&gt; - Marks the element as focusable for the screen reader.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessibilityComponentType=&quot;true&quot;&lt;/code&gt; - Tells Android this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StackLayout&lt;/code&gt; should be read a button.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessiblityTraits=&quot;button&quot;&lt;/code&gt; - Tells iOS this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StackLayout&lt;/code&gt; should be read a button.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessiblityLabel=&quot;....&quot;&lt;/code&gt; - The Label being read by the screen render.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the user traverse the ui with his/hers finger, each &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ListView&lt;/code&gt; will be read as:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;TalkBack: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Button. &amp;lt;Label&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;iOS: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;Label&amp;gt;. Button&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;next&quot;&gt;Next:&lt;/h1&gt;

&lt;p&gt;In the next article I’ll cover labeling of elements.&lt;/p&gt;
</description>
        <pubDate>Sun, 07 Jul 2019 18:20:00 +0200</pubDate>
        <link>https://mabs.dk/open%20source/nativescript/2019/07/07/accessible-nativescript-part-1-the-setup.html</link>
        <guid isPermaLink="true">https://mabs.dk/open%20source/nativescript/2019/07/07/accessible-nativescript-part-1-the-setup.html</guid>
        
        <category>accessibility</category>
        
        <category>Javascript</category>
        
        <category>NativeScript</category>
        
        <category>plugin</category>
        
        <category>TypeScript</category>
        
        <category>app</category>
        
        <category>iOS</category>
        
        <category>Android</category>
        
        
        <category>Open Source</category>
        
        <category>NativeScript</category>
        
      </item>
    
      <item>
        <title>NativeScript: Accessibility font scaling</title>
        <description>&lt;p&gt;As a part of making our apps more accessible for our partially sighted users, we want to support scaling texts in our app.&lt;/p&gt;

&lt;p&gt;On &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Android&lt;/code&gt; the texts on labels and buttons is scaled by default, we don’t need to do anything to support it. We might want to fix the layout when this happens.&lt;/p&gt;

&lt;p&gt;On &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iOS&lt;/code&gt; on the other hand doesn’t scale the text automatically, on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iOS 10+&lt;/code&gt; &lt;em&gt;adjustsFontForContentSizeCategory&lt;/em&gt; can be used on a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UILabel&lt;/code&gt; to have it scaled.
Unfortunately this only works for prefered fonts, which is difficult to set from NativeScript.&lt;/p&gt;

&lt;p&gt;Luckily &lt;a href=&quot;https://www.npmjs.com/package/@nota/nativescript-accessibility-ext&quot;&gt;@nota/nativescript-accessiblity-ext&lt;/a&gt; just added supports font scaling via CSS.&lt;/p&gt;

&lt;h2 id=&quot;getting-started&quot;&gt;Getting started&lt;/h2&gt;

&lt;p&gt;Start by creating a new NativeScript project. I’m using Angular, but it will work just as well with NativeScript Core.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;tns create projectname &lt;span class=&quot;nt&quot;&gt;--ng&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;projectname
npm i
npm i &lt;span class=&quot;nt&quot;&gt;--save-dev&lt;/span&gt; nativescript-dev-sass
npm i &lt;span class=&quot;nt&quot;&gt;--save&lt;/span&gt; @nota/nativescript-accessibility-ext@^3.0.0-alpha.7 nativescript-globalevents
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Create the SCSS files for the &lt;a href=&quot;https://docs.nativescript.org/ui/theme#sass-usage&quot;&gt;nativescript-theme-core&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;app_appcommonscss&quot;&gt;app/_app.common.scss&lt;/h3&gt;

&lt;div class=&quot;language-sass highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Import the theme’s variables. If you’re using a color scheme&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// other than “light”, switch the path to the alternative scheme,&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// for example &apos;~nativescript-theme-core/scss/dark&apos;.&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;~nativescript-theme-core/scss/light&apos;;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Customize any of the theme’s variables here, for instance $btn-color: red;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Import the theme’s main ruleset.&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;~nativescript-theme-core/scss/index&apos;;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Place any CSS rules you want to apply on both iOS and Android here.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// This is where the vast majority of your CSS code goes.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;appappandroidscss&quot;&gt;app/app.android.scss&lt;/h3&gt;

&lt;div class=&quot;language-sass highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;app-common&apos;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;~nativescript-theme-core/scss/platforms/index.android&apos;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;appappiosscss&quot;&gt;app/app.ios.scss&lt;/h3&gt;

&lt;div class=&quot;language-sass highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;app-common&apos;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;~nativescript-theme-core/scss/platforms/index.ios&apos;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now import the a11y-scss from &lt;strong&gt;@nota/nativescript-accessiblity-ext&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Add this to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app/app.ios.scss&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-sass highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;~@nota/nativescript-accessibility-ext/scss/a11y.ios&apos;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now we need to load import the plugin in our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app/app.module.ts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add this:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;NgModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;NO_ERRORS_SCHEMA&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;@angular/core&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;NativeScriptModule&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;nativescript-angular/nativescript.module&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;@nota/nativescript-accessibility-ext&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// &amp;lt;-- add this line&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;screenshots&quot;&gt;Screenshots&lt;/h2&gt;

&lt;h3 id=&quot;text-not-scaled---ios&quot;&gt;Text not scaled - iOS&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/static/assets/posts/2017-07-16-nativescript-accessibility-fontscaling/1-without-scaling.png&quot; alt=&quot;Text not scaled - iOS&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;text-scaled-to-150-of-normal---ios&quot;&gt;Text scaled to 150% of normal - iOS&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/static/assets/posts/2017-07-16-nativescript-accessibility-fontscaling/2-with-scaling.png&quot; alt=&quot;Text scaled to 150% of normal - iOS&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;how-does-this-work&quot;&gt;How does this work?&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;@nota/nativescript-accessibility-ext&lt;/strong&gt; adds a class to the page matching the current font-scale setting:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- a11y-fontscale-50 *(iOS only)*
- a11y-fontscale-70 *(iOS only)*
- a11y-fontscale-85
- a11y-fontscale-100
- a11y-fontscale-115
- a11y-fontscale-130
- a11y-fontscale-150 *(iOS only)*
- a11y-fontscale-200 *(iOS only - extra large fonts)*
- a11y-fontscale-250 *(iOS only - extra large fonts)*
- a11y-fontscale-300 *(iOS only - extra large fonts)*
- a11y-fontscale-350 *(iOS only - extra large fonts)*
- a11y-fontscale-400 *(iOS only - extra large fonts)*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;These classes are used to override the classes from &lt;strong&gt;nativescript-theme-core&lt;/strong&gt; like this.&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;Page&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.a11y-fontscale-150&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;err&quot;&gt;.t-10&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* 10 * 150% = 15 */&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is done for all the CSS-classes in &lt;strong&gt;nativescript-theme-core&lt;/strong&gt; which touches on font-size.&lt;/p&gt;

&lt;h1 id=&quot;adding-your-own-scaling-style&quot;&gt;Adding your own scaling style&lt;/h1&gt;

&lt;p&gt;If you use your own classes or you need to fix the layout when the text is scaled, you can easily do this yourself.&lt;/p&gt;

&lt;h2 id=&quot;enable-listening-for-config-changes-on-android&quot;&gt;Enable listening for config changes on Android.&lt;/h2&gt;

&lt;p&gt;If you need to make adjustments on Android, you need to make a small change to your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app/App_Resources/Android/AndroidManifest.xml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Add &lt;strong&gt;fontScale&lt;/strong&gt; to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;android:configChanges&lt;/code&gt;-attribute on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;activity&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The line:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;	android:configChanges=&quot;keyboardHidden|orientation|screenSize&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Becomes:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;	android:configChanges=&quot;keyboardHidden|orientation|screenSize|fontScale&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;writing-your-own-style&quot;&gt;Writing your own style&lt;/h2&gt;

&lt;p&gt;Here I’ll scale an image.&lt;/p&gt;

&lt;p&gt;Downloade the small image of &lt;a href=&quot;https://openclipart.org/detail/276028/fez-hat&quot;&gt;a cool fez&lt;/a&gt; and save it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app/fezzes-are-cool.png&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Edit the file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app/_app-common.scss&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-scss highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;~@nota/nativescript-accessibility-ext/scss/fontscales&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;@each&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$scale&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$scales&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$a11y-font-scales&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;$factor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;map-get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$scales&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;factor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;$base-size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;Page&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.a11y-fontscale-&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$scale&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;.scaled-image&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$base-size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$factor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$base-size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$factor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Edit the file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app/item/items.component.html&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;ActionBar&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;title=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Details&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;action-bar&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/ActionBar&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;FlexboxLayout&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;flexDirection=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;column&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;page&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;FlexboxLayout&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;m-15&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;label&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;h2&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;[text]=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;item.id + &apos;. &apos;&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;label&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;h2&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;[text]=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;item.name&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/FlexboxLayout&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;label&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;h4&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;[text]=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;item.role&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;image&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;scaled-image&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;~/fezzes-are-cool.png&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/image&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Add this line --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/FlexboxLayout&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now if you run the app and change the scaling level, you’ll see the image change size accordingly.&lt;/p&gt;

&lt;h2 id=&quot;what-about-component-styling&quot;&gt;What about component styling.&lt;/h2&gt;

&lt;p&gt;This is almost the same, you’ll have to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/deep/&lt;/code&gt; selector.&lt;/p&gt;

&lt;p&gt;And the SCSS will look like this:&lt;/p&gt;

&lt;div class=&quot;language-scss highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;~@nota/nativescript-accessibility-ext/scss/fontscales&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;@each&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$scale&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$scales&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$a11y-font-scales&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;$factor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;map-get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$scales&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;factor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;$base-size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;deep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;Page&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.a11y-fontscale-&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$scale&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;.scaled-image&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$base-size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$factor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$base-size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$factor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;screenshots-1&quot;&gt;Screenshots&lt;/h2&gt;

&lt;h3 id=&quot;fez-not-scaled---android&quot;&gt;Fez not scaled - Android&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/static/assets/posts/2017-07-16-nativescript-accessibility-fontscaling/3-android-no-font-scale.png&quot; alt=&quot;Fez not scaled - Android&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;cool-fez-scaled-150-of-normal---android&quot;&gt;Cool fez scaled 150% of normal - Android&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/static/assets/posts/2017-07-16-nativescript-accessibility-fontscaling/4-android-150pct-fontscale.png&quot; alt=&quot;Cool fez scaled 150% of normal - Android&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-if-it-only-applies-to-one-of-the-platforms&quot;&gt;What if it only applies to one of the platforms?&lt;/h2&gt;

&lt;p&gt;If it’s a global style, you can add it to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app/app.&amp;lt;platform&amp;gt;.scss&lt;/code&gt;-file.&lt;/p&gt;

&lt;p&gt;Or if you use &lt;a href=&quot;https://www.npmjs.com/package/nativescript-platform-css&quot;&gt;nativescript-platform-css&lt;/a&gt;, you can use platform classes like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.ios&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.android&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Install:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm i &lt;span class=&quot;nt&quot;&gt;--save&lt;/span&gt; nativescript-platform-css
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Import in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app/app.module.ts&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-typescrippt&quot;&gt;import { NgModule, NO_ERRORS_SCHEMA } from &quot;@angular/core&quot;;
import { NativeScriptModule } from &quot;nativescript-angular/nativescript.module&quot;;
import &apos;@nota/nativescript-accessibility-ext&apos;;
import &apos;nativescript-platform-css&apos;; // &amp;lt;-- add this line
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Example CSS:&lt;/p&gt;

&lt;div class=&quot;language-scss highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;~@nota/nativescript-accessibility-ext/scss/fontscales&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;@each&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$scale&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$scales&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$a11y-font-scales&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;$factor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;map-get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$scales&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;factor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;$base-size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;deep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;Page&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.a11y-fontscale-&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$scale&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.android&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;cm&quot;&gt;/* &amp;lt;- here */&lt;/span&gt;
      &lt;span class=&quot;nc&quot;&gt;.scaled-image&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$base-size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$factor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nl&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$base-size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$factor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;conclussion&quot;&gt;Conclussion&lt;/h1&gt;

&lt;p&gt;Supporting our visually impaired users is very easy with &lt;strong&gt;@nota/nativescript-accessibility-ext&lt;/strong&gt;.&lt;/p&gt;
</description>
        <pubDate>Sun, 16 Jul 2017 21:00:00 +0200</pubDate>
        <link>https://mabs.dk/open%20source/nativescript/2017/07/16/nativescript-accessibility-fontscaling.html</link>
        <guid isPermaLink="true">https://mabs.dk/open%20source/nativescript/2017/07/16/nativescript-accessibility-fontscaling.html</guid>
        
        <category>accessibility</category>
        
        <category>Javascript</category>
        
        <category>NativeScript</category>
        
        <category>npmjs</category>
        
        <category>plugin</category>
        
        <category>TypeScript</category>
        
        <category>app</category>
        
        <category>iOS</category>
        
        <category>Android</category>
        
        
        <category>Open Source</category>
        
        <category>NativeScript</category>
        
      </item>
    
      <item>
        <title>Accessibility extension plugin for NativeScript</title>
        <description>&lt;p&gt;
    As mentioned in my &lt;a href=&quot;https://mabs.dk/2016/10/29/first-talk-cross-platform-development-using-angular-2-nativescript/&quot;&gt;last post&lt;/a&gt;, I&apos;m working on an
    Audiobook player for my &lt;a href=&quot;http://nota.dk&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;employer&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    As a part of the project, my team and I have published a plugin for
    &lt;a href=&quot;https://www.nativescript.org/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;NativeScript&lt;/a&gt; to make it easier to access accessibility features for both
    Android and iOS.&lt;br /&gt;
    The target audience for our project are people with dyslexia or visual impairment, this makes accessibility is key feature for us.
&lt;/p&gt;
&lt;p&gt;
    Unfortunately this is one of the few things NativeScript doesn&apos;t do very well. We&apos;ve provided a few patches to fix accessibilityLabels, but beyond that
    finding a common abstraction for both platforms is probably not possible. The way Android and iOS do accessibility is just too different. It&apos;s possible to
    do it in code, but we&apos;d rather do it in template.
&lt;/p&gt;
&lt;p&gt;
    &lt;a href=&quot;http://facebook.github.io/react-native/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;React-Native&lt;/a&gt; have a pretty nice API using the platform specific
    accessibility &lt;a href=&quot;http://facebook.github.io/react-native/docs/accessibility.html&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;features&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
    For our needs and inspired by the React-Native API, we&apos;ve released
    &lt;a href=&quot;https://www.npmjs.com/package/@nota/nativescript-accessibility-ext&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;@nota/nativescript-accessibility-ext&lt;/a&gt;
    &amp;mdash; &lt;a href=&quot;https://github.com/Notalib/nativescript-accessibility-ext&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;sourcecode&lt;/a&gt;.&lt;br /&gt;
    The plugin is a work-in-progress and in time we&apos;ll go beyond what React-Native provides.
&lt;/p&gt;
&lt;p&gt;
    The plugin extends NativeScript&apos;s View-classes with new properties and can be used both with and without nativescript-angular.&lt;br /&gt;
    In-time a demo App will be available, but not at the moment.
&lt;/p&gt;
</description>
        <pubDate>Mon, 31 Oct 2016 22:45:33 +0100</pubDate>
        <link>https://mabs.dk/open%20source/nativescript/2016/10/31/accessibility-extension-plugin-for-nativescript.html</link>
        <guid isPermaLink="true">https://mabs.dk/open%20source/nativescript/2016/10/31/accessibility-extension-plugin-for-nativescript.html</guid>
        
        <category>accessibility</category>
        
        <category>Javascript</category>
        
        <category>NativeScript</category>
        
        <category>npmjs</category>
        
        <category>plugin</category>
        
        <category>TypeScript</category>
        
        <category>app</category>
        
        <category>iOS</category>
        
        <category>Android</category>
        
        
        <category>Open Source</category>
        
        <category>NativeScript</category>
        
      </item>
    
      <item>
        <title>First talk: Cross-Platform Development - Using Angular 2 &amp; Nativescript</title>
        <description>&lt;p&gt;
    On the 6th October I held my first ever public talk at
    &lt;a href=&quot;https://www.meetup.com/AngularJS-Copenhagen/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;AngularJS Copenhagen&lt;/a&gt; on the topic: &quot;Cross-Platform Development -
    Using Angular 2 &amp; Nativescript&quot; ((See the slides
    &lt;a href=&quot;https://docs.google.com/presentation/d/19gwVf6h-reqRqMDjz7DGUJF_3hj_Mj4y5BWrp5iVwWM/edit?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;here&lt;/a&gt;)).
&lt;/p&gt;
&lt;p&gt;
    I talked about an extremely cool project I&apos;m working on for &lt;a href=&quot;http://nota.dk&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;Nota&lt;/a&gt;, an Open Source audiobook
    player for iOS and Android. and the challenges in such a project.
&lt;/p&gt;
&lt;p&gt;It was a great success and I got a lot of possible feedback from the audience.&lt;/p&gt;
</description>
        <pubDate>Sat, 29 Oct 2016 14:43:24 +0200</pubDate>
        <link>https://mabs.dk/open%20source/nativescript/2016/10/29/first-talk-cross-platform-development-using-angular-2-nativescript.html</link>
        <guid isPermaLink="true">https://mabs.dk/open%20source/nativescript/2016/10/29/first-talk-cross-platform-development-using-angular-2-nativescript.html</guid>
        
        <category>Angular 2</category>
        
        <category>NativeScript</category>
        
        <category>Talk</category>
        
        
        <category>Open Source</category>
        
        <category>NativeScript</category>
        
      </item>
    
      <item>
        <title>Goodbye GoLease.com and thanks for all the fish</title>
        <description>&lt;p&gt;
    On 30th April 2014 I said goodbye to GoLease.com ((&lt;a href=&quot;http://golease.com&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;GoLease.com&lt;/a&gt;)).&lt;br /&gt;
    I&apos;ve enjoyed working with GoLease.com, it has been a nice challenge and I&apos;ve had some wonderful colleagues, who I&apos;ll miss in the future.
&lt;/p&gt;
&lt;p&gt;Today 19th May 2014 I&apos;ve started my new job as a web-developer with Nota ((&lt;a href=&quot;http://nota.nu&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;Nota.nu&lt;/a&gt;)).&lt;/p&gt;
&lt;p&gt;
    I&apos;ll be working on tools for people with reading impairment (Dyslexia and visual impairment). I&apos;m looking forward to the new challenges and my new
    colleagues.
&lt;/p&gt;
</description>
        <pubDate>Mon, 19 May 2014 22:18:50 +0200</pubDate>
        <link>https://mabs.dk/job/personlige%20emner/2014/05/19/goodbye-golease-com-and-thanks-for-all-the-fish.html</link>
        <guid isPermaLink="true">https://mabs.dk/job/personlige%20emner/2014/05/19/goodbye-golease-com-and-thanks-for-all-the-fish.html</guid>
        
        <category>employment</category>
        
        
        <category>Job</category>
        
        <category>Personlige emner</category>
        
      </item>
    
      <item>
        <title>Announcing WebPerfM</title>
        <description>&lt;p&gt;WebPerfM ((&lt;a href=&quot;https://github.com/m-abs/WebPerfM&quot;&gt;WebPerfM project page on Github&lt;/a&gt;)) (horrible name I know) is a performance test tool for websites.&lt;/p&gt;
&lt;p&gt;The idea came from the need for reliable performance test to know if a given site can handle a certain number of concurrent users.&lt;/p&gt;
&lt;p&gt;For it to be a reliable performance test, it must act as close to real user behavior as possible.&lt;br /&gt;
The presents the problem of writing these tests, there have to be many different tests and they all have to be written like real user behavior.&lt;/p&gt;
&lt;p&gt;Luckily we can create these tests without having to invent them.&lt;br /&gt;
Open Web Analytics (OWA) ((&lt;a href=&quot;http://www.openwebanalytics.com/&quot; title=&quot;Open Web Analytics&quot;&gt;http://www.openwebanalytics.com/&lt;/a&gt;)) is a analytic tool like Google Analytics that you can host on your own server. OWA stores complete real life user sessions on the site in a accessible MySQL database.&lt;/p&gt;
&lt;p&gt;So the idea is that WebPerfM reads the OWA database and crawls the website just the users did.&lt;/p&gt;
&lt;p&gt;Each session is a list of what pages the user visited and what the delay between each pageview were.&lt;br /&gt;
WebPerfM runs multiple sessions at a time.&lt;/p&gt;
&lt;p&gt;So far WebPerfM is just over the proof-of-concept stage and there a few things missing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scaling of how many concurrent sessions&lt;/li&gt;
&lt;li&gt;Set number of sessions&lt;/li&gt;
&lt;li&gt;Set age of session from the tests are created&lt;/li&gt;
&lt;li&gt;Statistics&lt;/li&gt;
&lt;li&gt;Proper caching of js-, css- og image-files with handling of ETAG, expire-date etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are some limitations:&lt;br /&gt;
I can&apos;t simulate logged in users.&lt;br /&gt;
No JavaScript from the pages are not executes during the test, this means no AJAX requests.&lt;/p&gt;
&lt;p&gt;WebPerfM is written in JavaScript and runs on NodeJS, using various libraries available through NPM.&lt;/p&gt;
</description>
        <pubDate>Mon, 20 Jan 2014 12:10:18 +0100</pubDate>
        <link>https://mabs.dk/javascript/open%20source/web%20development/2014/01/20/announcing-webperfm.html</link>
        <guid isPermaLink="true">https://mabs.dk/javascript/open%20source/web%20development/2014/01/20/announcing-webperfm.html</guid>
        
        <category>Javascript</category>
        
        <category>Node.js</category>
        
        <category>Open Web Analytics</category>
        
        <category>OWA</category>
        
        <category>Project</category>
        
        
        <category>Javascript</category>
        
        <category>Open Source</category>
        
        <category>Web development</category>
        
      </item>
    
      <item>
        <title>Hallo GoLease.com,</title>
        <description>&lt;p&gt;On the 12th August 2013, I&apos;ve started working for &lt;a href=&quot;http://golease.com&quot; title=&quot;GoLease.com&quot;&gt;GoLease.com&lt;/a&gt; as their new webdeveloper.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://golease.com&quot; title=&quot;GoLease.com&quot;&gt;GoLease.com&lt;/a&gt; is Denmark&apos;s largest trade portal for leasing equipment to companies and individuals.&lt;/p&gt;
&lt;p&gt;I&apos;m looking for to my time with this new company and hope it will be as great a time as I had working for Peercraft.&lt;/p&gt;
</description>
        <pubDate>Sun, 08 Sep 2013 11:08:01 +0200</pubDate>
        <link>https://mabs.dk/job/personlige%20emner/2013/09/08/hallo-golease-com.html</link>
        <guid isPermaLink="true">https://mabs.dk/job/personlige%20emner/2013/09/08/hallo-golease-com.html</guid>
        
        <category>employment</category>
        
        <category>job</category>
        
        
        <category>Job</category>
        
        <category>Personlige emner</category>
        
      </item>
    
      <item>
        <title>I started my new job back in February.</title>
        <description>&lt;p&gt;It&apos;s &quot;bit&quot; delayed, but back in February I started a new job.&lt;/p&gt;
&lt;p&gt;
    I was employed with the Birkerød (north of Copenhagen) based company &lt;a href=&quot;http://admad.dk&quot; title=&quot;AdMad&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;AdMad&lt;/a&gt;, as
    a backend developer and systems administrator.
&lt;/p&gt;
&lt;p&gt;During my time with AdMad I’ve had the pleasure of working on a many different systems as well as kept the Linux servers up and running.&lt;/p&gt;
&lt;p&gt;
    Amongst the highlights I can mention:&lt;br /&gt;
    I’ve written a distributed mail delivery system meant for promotional emails, which have been used for sending out millions of mails.&lt;br /&gt;
    Before spotify and wimp came around, I had the pleasure of maintaining the systems for one of the first music streaming services in Denmark. It was called
    TouchDiva.&lt;br /&gt;
    I’ve written a document parser for the e-magazine AdMagz, that converts PDF-files into SWF (Flash) and image-files for online viewing.&lt;br /&gt;
    And I’ve enjoyed working on chanti’s site, where I played a key part in developing their new HTML-based site which replaced their old flash-based site.
&lt;/p&gt;
&lt;p&gt;
    The new job (which isn&apos;t so new anymore) is as a Systems Developer at PeerCraft located near the center of Copenhagen.&lt;br /&gt;
    I&apos;m looking forward to spending a long time working with these wonderful people.
&lt;/p&gt;
&lt;p&gt;
    PS.: It&apos;s good to be popular
    &lt;a href=&quot;http://www.heste-nettet.dk/gallery/&quot; title=&quot;I&apos;ve been on most popular images for about 6 months. :)&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;
        &gt;I&apos;ve been on most popular images for about 6 months. :)&lt;/a
    &gt;
&lt;/p&gt;
</description>
        <pubDate>Sun, 04 Nov 2012 14:35:11 +0100</pubDate>
        <link>https://mabs.dk/job/personlige%20emner/2012/11/04/i-got-a-new-job-back-in-february.html</link>
        <guid isPermaLink="true">https://mabs.dk/job/personlige%20emner/2012/11/04/i-got-a-new-job-back-in-february.html</guid>
        
        <category>employment</category>
        
        <category>new job</category>
        
        <category>work</category>
        
        
        <category>Job</category>
        
        <category>Personlige emner</category>
        
      </item>
    
      <item>
        <title>Varnish, Ispconfig and apache2&apos;s access-log</title>
        <description>&lt;p&gt;My web server that hosts this site, is running on Debian GNU/Linux with Apache2, Varnish and the management software Ispconfig.&lt;/p&gt;
&lt;p&gt;This combination means that the default access log, logged 127.0.0.1 as the remote address (Varnish&apos;s IP). This simple change to the file /etc/apache2/sites-available/ispconfig.conf&lt;/p&gt;
&lt;p&gt;Change:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;
LogFormat &quot;%v %h %l %u %t \&quot;%r\&quot; %&gt;s %B \&quot;%{Referer}i\&quot; \&quot;%{User-Agent}i\&quot;&quot; combined_ispconfig
CustomLog &quot;| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \&quot;%Y%m%d-access.log\&quot; -d \&quot;/etc/vlogger-dbi.conf\&quot; /var/log/ispconfig/httpd&quot; combined_ispconfig
&lt;/pre&gt;
&lt;p&gt;To:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;
SetEnvIf X-Forwarded-For &quot;^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$&quot; is-forwarder

LogFormat &quot;%v %{X-Forwarded-For}i %l %u %t \&quot;%r\&quot; %&gt;s %B \&quot;%{Referer}i\&quot; \&quot;%{User-Agent}i\&quot;&quot; combined_ispconfig_forwarded
LogFormat &quot;%v %h %l %u %t \&quot;%r\&quot; %&gt;s %B \&quot;%{Referer}i\&quot; \&quot;%{User-Agent}i\&quot;&quot; combined_ispconfig

CustomLog &quot;| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \&quot;%Y%m%d-access.log\&quot; -d \&quot;/etc/vlogger-dbi.conf\&quot; /var/log/ispconfig/httpd&quot; combined_ispconfig env=!is-forwarder
CustomLog &quot;| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \&quot;%Y%m%d-access.log\&quot; -d \&quot;/etc/vlogger-dbi.conf\&quot; /var/log/ispconfig/httpd&quot; combined_ispconfig_forwarded env=is-forwarder
&lt;/pre&gt;
&lt;p&gt;And add these lines to&lt;br /&gt;
/etc/varnish/default.vcl&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;
sub vcl_fetch {
    ## Remove the X-Forwarded-For header if it exists.
    remove req.http.X-Forwarded-For;

    set    req.http.X-Forwarded-For = client.ip;
...
&lt;/pre&gt;
</description>
        <pubDate>Sun, 04 Nov 2012 11:24:34 +0100</pubDate>
        <link>https://mabs.dk/linux/open%20source/web%20development/2012/11/04/varnish-ispconfig-and-apache2s-access-log.html</link>
        <guid isPermaLink="true">https://mabs.dk/linux/open%20source/web%20development/2012/11/04/varnish-ispconfig-and-apache2s-access-log.html</guid>
        
        <category>apache2</category>
        
        <category>ispconfig</category>
        
        <category>sysadmin</category>
        
        <category>tip</category>
        
        <category>varnish</category>
        
        
        <category>Linux</category>
        
        <category>Open Source</category>
        
        <category>Web development</category>
        
      </item>
    
      <item>
        <title>Politikere med ikke-svar svar</title>
        <description>&lt;p&gt;Jeg havde fornyligt en lille udveksling med vores kulturminister Uffe Elbæk, på hans facebook side (( &lt;a href=&quot;https://www.facebook.com/permalink.php?story_fbid=307906909280447&amp;id=235501083187697&quot; title=&quot;Link til diskussionen&quot;&gt;Link til diskussionen&lt;/a&gt; )) omkring §75c i ophavsretsloven.&lt;br /&gt;
For dem der ikke ved det, så er §75c den paragraf der forbyder os, at bryde kopispærringen på bl.a. DVD-film. Det er en paragraf som jeg er stærkt utilfreds med, da jeg ser det som min ret at bruge mine lovlig købte film som det passer mig i mit eget hjem.&lt;/p&gt;
&lt;p&gt;Jeg havde ærligtalt ikke forventet at han ville give et reelt svar på mit spørgsmål, men det ærgre mig alligevel at han svarer på et spørgsmål hvor han bliver bedt om at retfærdiggøre loven med at gentage hvad loven siger.&lt;br /&gt;
Jeg synes heller ikke særlig godt om at han henviser til RettighedsAlliancen, da de i mine øjne er partisk imod mine og andre borgeres rettigheder, så hvorfor skulle jeg have den fjerneste interesse i at spørge dem om noget som helst. Jeg vil heller ikke tigge RA om at få lov til noget som jeg mener er min ret, en ret som loven i øvrigt giver mig medmindre producenten har lagt en kopispærring på produktet og derved gør det ringere.&lt;/p&gt;
</description>
        <pubDate>Sat, 21 Apr 2012 14:11:18 +0200</pubDate>
        <link>https://mabs.dk/dansk/it-politik/2012/04/21/politikere-med-ikke-svar-svar.html</link>
        <guid isPermaLink="true">https://mabs.dk/dansk/it-politik/2012/04/21/politikere-med-ikke-svar-svar.html</guid>
        
        <category>dansk</category>
        
        <category>ophavsret</category>
        
        <category>politik</category>
        
        
        <category>Dansk</category>
        
        <category>IT-Politik</category>
        
      </item>
    
      <item>
        <title>The Coolest Merge EVER - My take</title>
        <description>&lt;p&gt;Linus Torvalds wrote about &quot;The coolest merge EVER!&quot; back in June 2005 ((&lt;a href=&quot;http://www.gelato.unsw.edu.au/archives/git/0506/5511.html&quot; title=&quot;The coolest merge EVER!&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;http://www.gelato.unsw.edu.au/archives/git/0506/5511.html&lt;/a&gt;)) now I needed to do something similar a while back.&lt;/p&gt;
&lt;p&gt;I had two git repositories that I use for database backup, the two repositories contains backup from a different mysql server in a master-slave setup and therefor contains mostly the same data. This was a problem because they had grown to a size which is a pain to sync to other servers.&lt;br /&gt;
So I decided to join the two repositories into one with full history. Unfortunately simply doing what Torvalds had done wouldn&apos;t work because the files in the two repositories are in the same path and with the same file names, so I had rewrite the commits so that the files were moved to an appropriate sub-directory.&lt;/p&gt;
&lt;p&gt;For such a task git has a tool called filter-branch, which can rewrite the history according to rules I&apos;ve made for it.&lt;br /&gt;
This is what I did:&lt;/p&gt;
&lt;ul&gt;
&lt;ol&gt;First clone the repositories&lt;br /&gt;
[bash]&lt;br /&gt;
git clone path-to-first-repository database_server1&lt;br /&gt;
git clone path-to-second-repository database_server2&lt;br /&gt;
[/bash]
&lt;/ol&gt;
&lt;ol&gt;
Now that you have a clone of both repositories enter the first of them and rewrite it&apos;s history so all the files are in a subdirectory. You should also alter some of the files with sed or other cli utils.&lt;/p&gt;
&lt;p&gt;[bash]&lt;br /&gt;
cd database_server1&lt;br /&gt;
git filter-branch -f --prune-empty --tree-filter &apos;mkdir -p &amp;lt;subdirname&amp;gt;; find -mindepth 1 -maxdepth 1 -type f -exec mv &apos;{}&apos; &amp;lt;subdirname&amp;gt;/ \;;&apos;&lt;br /&gt;
[/bash]
&lt;/ol&gt;
&lt;ol&gt;
Rewriting can take a very long time and requires a lot of CPU and memory, after you&apos;ve done it on the first repository move on to the other repository and repeat the process by moving the files [bash]&lt;br /&gt;
to different directory.&lt;br /&gt;
cd ../database_server2&lt;br /&gt;
git filter-branch -f --prune-empty --tree-filter &apos;mkdir -p &amp;lt;subdirname&amp;gt;; find -mindepth 1 -maxdepth 1 -type f -exec mv &apos;{}&apos; &amp;lt;subdirname&amp;gt;/ \;;&apos;&lt;br /&gt;
[/bash]
&lt;/ol&gt;
&lt;ol&gt;
Now that you have rewritten the history of both repositories make a clone of the first one, so you don&apos;t have to start from scratch if something goes wrong.&lt;br /&gt;
[bash]&lt;br /&gt;
cd ..&lt;br /&gt;
git clone database_server1 database_server1_merge&lt;br /&gt;
cd database_server1_merge&lt;br /&gt;
[/bash]
&lt;/ol&gt;
&lt;ol&gt;
And now for &quot;The Coolest Merge EVER&quot;, I&apos;ve taken the liberty to fix the commands so they work with a resent version of git.&lt;br /&gt;
[bash]&lt;br /&gt;
git fetch ../database_server1&lt;br /&gt;
GIT_INDEX_FILE=.git/tmp-index git read-tree FETCH_HEAD&lt;br /&gt;
GIT_INDEX_FILE=.git/tmp-index git checkout-index -a -u&lt;br /&gt;
git update-index --add -- (GIT_INDEX_FILE=.git/tmp-index git ls-files)&lt;br /&gt;
cp .git/FETCH_HEAD .git/MERGE_HEAD&lt;br /&gt;
git commit&lt;br /&gt;
git gc --prune=now # Clean out old objects if needed.&lt;br /&gt;
[/bash]
&lt;/ol&gt;
&lt;/ul&gt;
&lt;p&gt;That&apos;s it, now I have a single git repository with the full history of the two original repositories&lt;/p&gt;
</description>
        <pubDate>Sat, 26 Nov 2011 22:24:44 +0100</pubDate>
        <link>https://mabs.dk/linux/2011/11/26/the-coolest-merge-ever-my-take.html</link>
        <guid isPermaLink="true">https://mabs.dk/linux/2011/11/26/the-coolest-merge-ever-my-take.html</guid>
        
        <category>backup</category>
        
        <category>git</category>
        
        <category>merge</category>
        
        <category>tips and trick</category>
        
        
        <category>Linux</category>
        
      </item>
    
      <item>
        <title>KRegExpEditor</title>
        <description>&lt;p&gt;Inspired by some patches I found on kde-apps, I&apos;ve started working on the great KDE application KRegExpEditor, developed by Jesper K. Pedersen from &lt;a href=&quot;http://blackie.dk/&quot;&gt;blackie.dk&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I don&apos;t have commit access to KDEs repositories and KRegExpEditor is still in the old SVN-repository, so I&apos;ve created a temporary project on gitorious located here http://gitorious.org/kregexpeditor/kregexpeditor&lt;/p&gt;
&lt;p&gt;The first thing I&apos;ll do is fixing some of the bugs and crashes. I&apos;ve applied the patches from http://kde-apps.org/content/show.php/KRegExpEditor+and+KDE4?content=144569 and I&apos;ve fixed a crash, that was triggered when I switched to emacs syntax.&lt;/p&gt;
</description>
        <pubDate>Wed, 31 Aug 2011 22:58:45 +0200</pubDate>
        <link>https://mabs.dk/kde/linux/open%20source/2011/08/31/kregexpeditor.html</link>
        <guid isPermaLink="true">https://mabs.dk/kde/linux/open%20source/2011/08/31/kregexpeditor.html</guid>
        
        <category>c++</category>
        
        <category>kde</category>
        
        <category>kregexpeditor</category>
        
        <category>Open Source</category>
        
        
        <category>KDE</category>
        
        <category>Linux</category>
        
        <category>Open Source</category>
        
      </item>
    
      <item>
        <title>Now a Supporting member of KDE e.V.</title>
        <description>&lt;p&gt;And now to something I&apos;ve very passionate about, OpenSource and specifically KDE.&lt;/p&gt;
&lt;p&gt;A few months back KDE e.V. started the &quot;Join the Game&quot;-campaign ((&lt;a href=&quot;http://jointhegame.kde.org/&quot;&gt;http://jointhegame.kde.org/&lt;/a&gt;)),&lt;/p&gt;
&lt;p&gt; asking people to give financial support to the KDE project. And as I&apos;ve loved KDE for almost as long as I&apos;ve been using Linux, I decided to join the game and give 25€ per quarter to KDE e.V.&lt;/p&gt;
&lt;p&gt;Back in October I received a gift from KDE e.V. along with the welcome-letter for the organization.&lt;/p&gt;
&lt;p&gt;I love KDE, well I love KDE as much as it&apos;s possible to love a piece of software and what a piece it is :).&lt;br /&gt;
The KDE Software Compilation (KDE SC) is a large collection of software, that I use on a daily basis, from the KDE desktop to many of the applications provided by KDE and related projects like Amarok. I even use KDE Apps under Mac OSX, especially Okular ((Okular is KDE&apos;s document-viewer with some very useful feature, that I&apos;ve grown depended on)).&lt;/p&gt;
&lt;p&gt;I do hope that I at some point can contribute something more than just a few € to the project, in form of some more code or translations ((I&apos;ve previously submitted patches to Kopete and Amarok, and I translated KDevelop 4.0 to Danish in time for the 4.0 release.)),&lt;/p&gt;
&lt;p&gt; but at the moment this is all I can do.&lt;/p&gt;
&lt;p&gt;If you too like KDE and want to support it with a few € please go join the game at http://jointhegame.kde.org/.&lt;/p&gt;
</description>
        <pubDate>Wed, 01 Dec 2010 18:25:14 +0100</pubDate>
        <link>https://mabs.dk/kde/linux/open%20source/2010/12/01/now-a-supporting-member-of-kde-e-v.html</link>
        <guid isPermaLink="true">https://mabs.dk/kde/linux/open%20source/2010/12/01/now-a-supporting-member-of-kde-e-v.html</guid>
        
        
        <category>KDE</category>
        
        <category>Linux</category>
        
        <category>Open Source</category>
        
      </item>
    
      <item>
        <title>TV i S-tog endnu en brev udveksling</title>
        <description>&lt;p&gt;Den 14. September sendte jeg en mail til Niklas Marschall og Gert Frost fra DSB S-Tog, da jeg var godt sur over at jeg havde fået hovedpine af deres reklameskærme i s-togene. &lt;/p&gt;
&lt;p&gt;Det var egenlig meningen af jeg ville have lægt brev udvekslingen op med det samme, men jeg kom fra det og efterfølgende har DSB midlertidigt fjernet lyden fra deres støjsendere, men truer med at sætte det til igen.&lt;/p&gt;
&lt;p&gt;Her er min oprindelige mail (mine stave- og sprogfejl er inkluderet):&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Godaften de herre,&lt;/p&gt;
&lt;p&gt;Jeg må takke jer, for at jeg måtte møde på arbejde med en lettere hovedpine i dag pga. jeg måtte kæmpe mod det lydovergreb der er jeres støj skærme i Linje-B til Lyngby og mod den støjsender som står på Svanemøllen station.&lt;/p&gt;
&lt;p&gt;Jeg kan virkelig ikke se hvorfor at I mener det er en god ide, at gør bilen til et bedre valg end s-toget ved at sætte disse skærme op og derefter kommer med arrogante svar som dem jeg fik i standardsvaret fra kundeservice og det som Niklas har udtalt til politiken. Jeg finder det også meget utroværdigt, at I gang på gang har lovet at lyden bliver skruet ned og alligevel så er den stadig for høj.&lt;/p&gt;
&lt;p&gt;Jeg skrev til Niklas Marschall for nogle dage siden, efter hans kommentarer i politikken (kopi ses på min blog http://mabs.dk/index.php/2010/09/10/dsb-det-her-er-jo-bare-en-byttehandel/) men om han har læst det eller blot har behandlet det som al anden kritik og smidt det direkte i papirkurven, er svært at vide. Det er jo tydeligt fra kommentarerne i politikken, at Niklas ikke er en person som tager sig at småting som utilfredse betalende kunder.&lt;/p&gt;
&lt;p&gt;Men ud over at jeg var uheldig nok til at komme med et af de nedgraderede toge til morges, så fik jeg også muligheden for at &quot;nyde&quot; det på vej hjem, da dette tog også var blevet nedgraderet til den nye kundefjendske standard som DSB er gået over til.&lt;/p&gt;
&lt;p&gt;Jeg er nu begyndt at kigge efter muligheden for at enten købe mig en bil eller lease en, det er selvfølgelig synd at miljøet må lide pga. I fører denne kundefjendske politik, men jeg kan ikke leve med at jeg skal møde op på arbejde med hovedpine eller med at betale jer for at ødelægge min dag.&lt;/p&gt;
&lt;p&gt;Det vil selvfølgelig have den ulempe at jeg ikke kan læse på vej til og fra arbejde, men med skærmene er det alligevel ikke en mulighed da koncentrationsevnen går fløjten når man samtidigt skal koncentrere sig om at holde et overgreb af lyd ude.&lt;/p&gt;
&lt;p&gt;I hører nok fra mig igen, evt. med billeder af den bil jeg måske bliver nødtil at anskaffe mig.&lt;/p&gt;
&lt;p&gt;Med venlig hilsen en stadig meget utilfreds kunde,&lt;br /&gt;
Morten Sjøgren
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Utroligt nok fik jeg den 15. September dette svar fra Niklas Marschall som er salgsdirektør for DSB S-Tog. Jeg havde ærligtalt forventet at han ignorerede klager med udgangspunkt i det ævl han havde sagt til politikken, som jeg kommenterede på i mit sidste blog indlæg.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Kære Morten&lt;/p&gt;
&lt;p&gt;Du må meget undskylde hvis jeg ikke har fået svaret på din mail.&lt;/p&gt;
&lt;p&gt;Vi har skruet ned for lyden - den er blevet justeret flere gange. Der kommer fortsat flere justeringer i takt med at vi får resultater fra vores kundeundersøgelser - det tager lidt tid at finde de rigtige løsninger. Vi arbejder med 50.000 kunder for at finde fremtidssikreløsninger. Som du selv skriver så er dette noget du har bemærket - så jeg forstår ikke hvorfor du finder det utroværdigt.&lt;/p&gt;
&lt;p&gt;Jeg forstår ikke hvorfor stationsskærme skulle give dig problemer således at du får hovedpine- her kommer du til at give mig lidt mere informationer.&lt;/p&gt;
&lt;p&gt;Du må have misforstået artiklen i politikken - selvfølgelig tager jeg mine betalende kunder meget alvorligt. Derfor denne mail til dig.&lt;/p&gt;
&lt;p&gt;Jeg kan oplyse at S-tog hele tiden arbejder på at sikre den optimale kapacitet.&lt;/p&gt;
&lt;p&gt;Vores eneste interesse er mange glade kunder - vi arbejder hårdt på at finde løsninger med TV i togene så alle bliver tilfredse. Jeg håber du vil give os lidt til til at finde de rette løsninger sammen med kunderne - der er ingen grund til at du køber en bil. Jeg er sikker på du nok skal blive glad for at benytte S-toget igen&lt;/p&gt;
&lt;p&gt;Med venlig hilsen&lt;/p&gt;
&lt;p&gt;Niklas Marschall
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Det måtte jeg selvfølgelig svarer på og det gjorde jeg dagen efter den 16. September, endnu engang er sprog- og stavefejl inkluderet.&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;
    Kære Morten&lt;/p&gt;
&lt;p&gt;    Du må meget undskylde hvis jeg ikke har fået svaret på din mail.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Tak for dit svar. Jeg tillader mig lige at svare in-line, da det er nemmere at overskue, hvad der bliver svaret på.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
    Vi har skruet ned for lyden - den er blevet justeret flere gange. Der kommer fortsat flere justeringer i takt med at vi får resultater fra vores kundeundersøgelser - det tager lidt tid at finde de rigtige løsninger. Vi arbejder med 50.000 kunder for at finde fremtidssikreløsninger. Som du selv skriver så er dette noget du har bemærket - så jeg forstår ikke hvorfor du finder det utroværdigt.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;De gange jeg oplevet disse skærme har det ikke virket som om der var skrue ned eller også var der ikke skruet ret meget ned, da lyden stadig har været meget høj, højere end mine hovedtelefoner normalt er. Jeg har indtil videre været så heldig ikke at komme med disse tog hver dag, men det sker desværre oftere og oftere, jeg går udfra dette er i takt med I får nedgraderet flere og flere tog. Hver gang jeg kommer ind i et tog uden disse skærme bliver jeg meget lettet over.&lt;/p&gt;
&lt;p&gt;På turen jeg skrev den mail du svarede på, troede jeg først I rent faktisk havde skruet langt ned til et niveau, desværre lignede det mest en fejl da der i kupeen ved siden af var der ligeså høj lyd som der var om morgenen.&lt;/p&gt;
&lt;p&gt;Det er derfor jeg skrev, det virkede utroværdigt, når I siger I har skruet ned.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
    Jeg forstår ikke hvorfor stationsskærme skulle give dig problemer således at du får hovedpine- her kommer du til at give mig lidt mere informationer.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Jeg kan se, jeg lavede en del sprogfejl i min oprindelige mail. Stationskærmene var kun en del af det der gik galt den morgen, den skærm kunne jeg i det mindste komme væk fra, men jeg fik da et mindre chok da jeg stod med ryggen til den på Svanemøllen og den pludseligt råbte et eller andet.&lt;/p&gt;
&lt;p&gt;Jeg får hovedpine af visse former for støj, især støj som jeg ikke kan slippe væk fra, høje toner, børn der skriger eller støj jeg skal kæmpe for at ignorere.  Den dag jeg skrev min anden mail, måtte jeg kæmpe meget hård for at ignorere det jeg bedst kan beskrive som et lydovergreb uden mulighed for at komme væk fra det. Og jeg tror, det var det der udløste hovedpinen.&lt;/p&gt;
&lt;p&gt;Den store forskel på disse skærme og andre former for støj er at det er min oplevelse at langt de fleste mennesker viser stort hensyn i toget. Derudover er det muligt for mig at komme væk, hvis der er for meget larm. Og derfor er det yderst sjældent, at jeg har haft problemet med støj og hovedpine i de tog som I ikke har sat skærmene op i  endnu. Dette er ikke muligt med jeres skærme, de viser ikke hensyn og de er i alle kupeer med undtagelse af de nye dårligt placerede stillezoner.&lt;/p&gt;
&lt;p&gt;Når jeg siger at stillezonerne er dårligt placeret er det fordi de ligger ved siden af, hvor folk kommer med cykler og barnevogne, de er alt andet end stille. Den eneste forbedring ved de nye stillezoner er at de er meget bedre markeret end de gamle, så langt oftere vælger folk der vil snakke ikke at gå derind.&lt;/p&gt;
&lt;p&gt;Det at skulle kæmpe mod støjkilde kræver for mig meget mental energi, så meget at selv når jeg ikke får ondt i hovedet af støjen, så er det praktisk umuligt for mig at læse noget med bare lidt dybte og jeg har en del it-tekniske bøger jeg vil have læst.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
    Du må have misforstået artiklen i politikken - selvfølgelig tager jeg mine betalende kunder meget alvorligt. Derfor denne mail til dig.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Jeg er også meget glad for dit svar.&lt;/p&gt;
&lt;p&gt;Det kan være jeg misforstod artiklen, men ud fra dine kommentarer i politikken var det meget svært at se du tog os særlig seriøst;&lt;br /&gt;
Da du begyndte at snakke om det blot er en byttehandel og om at det ikke er blevet forklaret godt nok, som om vi bare ikke havde forstået det ordenligt.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
    Jeg kan oplyse at S-tog hele tiden arbejder på at sikre den optimale kapacitet.&lt;/p&gt;
&lt;p&gt;    Vores eneste interesse er mange glade kunder - vi arbejder hårdt på at finde løsninger med TV i togene så alle bliver tilfredse. Jeg håber du vil give os lidt til til at finde de rette løsninger sammen med kunderne - der er ingen grund til at du køber en bil. Jeg er sikker på du nok skal blive glad for at benytte S-toget igen
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Jeg har virkelig svært ved at se, hvad der ligger til grund for beslutningen om at sætte disse skærme op, I må have kunne forudse hvor upopulære de ville være.&lt;/p&gt;
&lt;p&gt;Jeg kan ligeså godt sige det med det ligeud. Jeg tror ikke det vil være muligt for jer at sætte lydniveauet langt ned til jeg kan leve med det og det samtidigt er muligt for dem vil hører det at gøre dette.&lt;/p&gt;
&lt;p&gt;Jeg har taget s-toget til og fra arbejde i lidt over et år og jeg har indtil disse skærme kom. været meget glad for det. Togene er beklagelige at sidde i, der er normalt god plads, de kører så ofte jeg sjældent skal vente og langt de fleste passagerer opfører sig ordenligt. Jeg har virkelig ikke lyst til få mig en bil, jeg bor ved Nørrebros runddel så det er ikke uden besvær og kø-tid, at skulle køre i bil til Birkerød. Men sådan som jeg har oplevet skærmene indtil videre, så kan det være det værd. Jeg udskyder det indtil videre og håber der kommer en løsning som jeg kan leve med.&lt;/p&gt;
&lt;p&gt;Hvis I absolut skal have skærmene i togene, hvilket jeg har svært ved at se en god grund til, da de jo ikke (som I ellers siger) bliver brugt til trafikinformation, så er den eneste løsning jeg kan se at lyden bliver helt valgfri som den er i fx. bus-linje 4A, hvor man kan stille ind på en FM-kanal, hvis man vil høre lyden.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;    Med venlig hilsen&lt;/p&gt;
&lt;p&gt;    Niklas Marschall
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Med venlig hilsen&lt;br /&gt;
Morten
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Efter denne mail udveksling har DSB langt om længe valgt at slukke for lyden, men de siger det kun er midlertidigt.&lt;/p&gt;
&lt;p&gt;Jeg ser nu helst at DSB piller disse skærme ned igen, da de ikke bidrager noget positivt til min tur, men efter at lyden er væk er 90% af mine problemer med skærmene også væk. Det samme glæder de skærme der er på stationerne, men de er i det mindste til at komme væk fra.&lt;/p&gt;
&lt;p&gt;MEN hvis DSB gør alvor af truslerne om at slå lyden til igen, efter de har udført nogle &quot;tests&quot;, så bliver jeg nødt til at finde mig en anden måde at komme på arbejde på. Jeg kan ikke forstille mig at det kan lade sig gøre, at finde et lydniveau som jeg vil acceptere, hvis jeg KAN høre det.&lt;/p&gt;
</description>
        <pubDate>Sun, 10 Oct 2010 14:27:10 +0200</pubDate>
        <link>https://mabs.dk/dansk/personlige%20emner/2010/10/10/tv-i-s-tog-endnu-en-brev-udveksling.html</link>
        <guid isPermaLink="true">https://mabs.dk/dansk/personlige%20emner/2010/10/10/tv-i-s-tog-endnu-en-brev-udveksling.html</guid>
        
        <category>DSB</category>
        
        <category>Klage</category>
        
        
        <category>Dansk</category>
        
        <category>Personlige emner</category>
        
      </item>
    
      <item>
        <title>DSB: Det her er jo bare en byttehandel</title>
        <description>&lt;p&gt;Politikken bragte et interview med Niklas Marschall ((&lt;a href=&quot;http://politiken.dk/debat/1052865/dsb-det-her-er-jo-bare-en-byttehandel/&quot;&gt;http://politiken.dk/debat/1052865/dsb-det-her-er-jo-bare-en-byttehandel/&lt;/a&gt;)) (salgsdirektør i DSB S-tog) &lt;/p&gt;
&lt;p&gt;Niklas mener at skærmene i s-toget er en del af en byttehandel, jeg blev så frustreret af at læse hans kommentarer at jeg har sendt ham et svar.&lt;br /&gt;
Jeg kan ikke huske frivilligt at jeg har indgået i en byttehandel, der betyder jeg betaler en formue for et månedskort, men at jeg til gengæld kan få råbt reklamer og nyheder ind i hovedet, når jeg er i toget.&lt;/p&gt;
&lt;p&gt;En anden interessant artikel i Politikken &lt;a href=&quot;http://politiken.dk/debat/1052866/reklamer-i-s-toget-er-en-mild-form-for-tortur/&quot;&gt;Reklamer i S-toget er en mild form for tortur&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Det er også værd at nævne &lt;a href=&quot;http://www.facebook.com/#!/group.php?gid=112790432079913&amp;v=wall&amp;ref=ts&quot;&gt;facebook gruppen&lt;/a&gt; og &lt;a href=&quot;http://nejtaktils-togs-tv.skrivunder.dk/&quot;&gt;underskrift indsamlingen&lt;/a&gt;, hvis du er imod disse skærme, så er det en god ide at melde dig ind i gruppen og skrive under på underskrift undersamlingen.&lt;/p&gt;
&lt;p&gt;Se mit svar til ham herunder...&lt;/p&gt;
&lt;hr /&gt;
Kære Niklas Marschall,&lt;/p&gt;
&lt;p&gt;Det er med stor skuffelse af jeg har læst dine kommentarer på politikens hjemmeside omkring de støjforurenende skærme som I har sat op i s-togene. Jeg føler mig derfor nødsaget til at sende mine kommentarer på dine bemærkninger som jeg finder meget arrogante.&lt;/p&gt;
&lt;p&gt;Jeg pendler til hverdag mellem Nørrebro og Birkerød, derfor tager jeg toget til og fra arbejde, dette er noget som jeg betaler ret mange penge for og derfor forventer jeg også at I rent faktisk lytter til mig, når jeres beslutninger gør min rejse ulidelig.&lt;/p&gt;
&lt;p&gt;Jeg har under spor arbejdet været forståelig overfor at det er nødvendigt, selvom det har betydet en meget længere rejsetid over sommeren. Jeg har dog ingen forståelse overfor jeres for at sige det pænt tåbelige beslutning om at forurene togturen med unødig støj og de arrogante svar som I har givet til kritikere af disse støjsendere.&lt;/p&gt;
&lt;p&gt;Når men til mine kommentarer, du sagde til politikken:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;»Min tilgang er, at det her er et bytteforhold, og ligesom i andre byttehandler kan man godt acceptere noget, hvis man får noget andet. Hvis jeg oplever, at jeg er blevet hjulpet gennem S-togs-forstyrrelser fra en skærm i toget, og hvis samme skærm også kan oplyse mig om, hvordan jeg kan nå at hente mit barn, så tror jeg godt, jeg kan overleve med lidt mere støj i S-toget. Det er en fair byttehandel, synes vi«.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jeg begriber ikke at du kan sige sådan noget vås. I en byttehandel er begge parter frivillige og begge parter får noget ud af handlen, ingen af disse to ting er gældende her for min part i denne påståede byttehandel.&lt;/p&gt;
&lt;p&gt;Jeg er ikke frivilligt gået med til at få råbt reklame budskaber, dårlig journalistik eller ligegyldige mad opskrifter ind i hovedet, hver eneste dag. Derudover får jeg kun frustrationer ud af at de skærme er der, så jeg får intet ud af det.&lt;/p&gt;
&lt;p&gt;Man bliver ikke hjulpet gennem forstyrrelse med de skærme, den første dag efter min ferie havde I meget store problemer med signalerne og der var ingen oplysninger af nogen art på de skærme som kunne hjælpe på situationen. Der var dog en masse uønsket støj fra dem. Jeg er dog ikke enig med dig i at hvis der er den slags oplysninger så ville støjen være det værd. Tværtimod, så ville jeg IKKE kunne acceptere den støj der kommer fra de skærme når i den tid som oplysningerne ikke var der.&lt;/p&gt;
&lt;p&gt;Det er meget arrogant af dig at kalde dette en byttehandel. Og jeg acceptere ikke begrundelsen med trafikinformation som andet end et meget dårligt forsøg på at forsvare den mest kundefjendske beslutning DSB har taget i nyere tid.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;»DSB skal konkurrere med bilismen, og vi kan se, at rigtig mange vælger os fra, fordi de ikke kan få logistikken til at hænge sammen. Vi vil derfor rigtig gerne give folk 20 minutter ekstra hver dag ved at give dem muligheden for at købe ind via telefonen, få set nyheder eller andet. Alt det skal skærmene også bruges til«.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Det ævl tror du ikke selv på, vel?&lt;/p&gt;
&lt;p&gt;Disse skærme er så forfærdelige, at jeg er begyndt at kigge mig om efter en bil eller anden personlig transportform, så tiden kan blive min egen. Hvis du vil konkurrere mod bilismen, så skal du få de skærme væk, inden alle der har råd og mulighed køber en bil bare for at kunne slippe for jeres lydovergreb.&lt;/p&gt;
&lt;p&gt;Jeg ønsker ikke at købe ind over telefonen, mens jeg sidder i toget, jeg vil have fred og ro. Jeg gider heller ikke høre på børn der larmer eller folk der taler højlydt i mobiltelefon, men der har jeg muligheden for at bede dem om at være lidt stille eller gå et andet sted hen. Det har jeg ikke med støjsenderne, da de er i alle rum undtagen stillezonen som er fyldt eller ikke er særlig stille fordi I har flyttet dem hen hvor folk har barnevogne.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;»Vi ved godt, at reklamerne har irriteret vores kunder, men de finansierer altså vores gratis services. Det er reklamer, der finansierer, at man kan køre gratis i S-tog første søndag i måneden, at automaterne virker, at vi kører nattog, og at der bliver fjernet graffiti. De her services koster penge, og derfor udnytter vi det kommercielle rum. Det er reklameindtægterne, der får det hele til at køre rundt, men det har vi været for dårlige til at formidle«.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hvorfor skal jeg som BETALENDE kunde lide for at I kan lave den slags reklame fremstød? Jeg får ikke noget ud af de ”tilbud”, da jeg allerede har betalt.&lt;/p&gt;
&lt;p&gt;Ja, I har været dårlige til at formidle og jeg kan kun antage at det er fordi I godt, ved det ikke er grund nok til at vi BETALENDE kunder acceptere jeres lydovergreb HVER DAG.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;»Jeg tror, det er bedre at sammenligne det med reklamer i det offentlige rum. Dengang Københavns Kommune finansierede nye busstop med reklamer på stoppestederne, mente mange, at det var forkert. Jeg tror, at den samme proces er i gang nu. Vi har lavet et voldsomt indgreb i folks hverdag, og så må man forvente en reaktion«.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Det glæder mig at du godt kan se at der er et voldsomt indgreb, men sammenligningen med reklamer på busstoppesteder holder ikke af flere grunde som du som intelligent menneske nok godt kender.&lt;/p&gt;
&lt;p&gt;Der er ikke lyd på reklamerne på stoppestederne.&lt;/p&gt;
&lt;p&gt;Man står en meget begrænset tid ved stoppestederne.&lt;/p&gt;
&lt;p&gt;Man kan GÅ VÆK FRA STOPPESTEDERNE&lt;/p&gt;
&lt;p&gt;Man kan kigge væk fra reklamerne på stoppestederne og derved ignorere dem.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;»Om indgrebet har været for voldsomt, og om vi kan forklare vores sag, det må tiden vise. Så jeg kan forsvare det her tiltag med, at det ikke er den endelige løsning, og vi har ansvar for hele tiden at udvikle den kollektive trafik for at skabe bedre forhold for vores kunder. Det her er vores bud på at tage hul på nogle af de grundlæggende problemer i kollektiv trafik«.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I kan ikke forklare jeres sag på en måde der gør at jeg vil acceptere jeres lydovergreb, jeg vil hellere have dyrere billetter end at udsættes for det svineri. Hvis du vil skabe bedre forhold for jeres kunder, så gå tilbage til s-tog uden støjforurenende skærme, de tog var meget gode til at komme på arbejde med. Dette tiltag har gjort det dårligere for jeres kunder (som mig) ikke bedre, de er ikke ønsket og de er ikke nødvendige. Som jeg ser disse skærme, så er de et skridt i retning af at afvikle offentlig transport som transport middel for andre end dem der ikke har råd/mulighed for andet.&lt;/p&gt;
&lt;p&gt;Hvis I skal beholde både mig som kunde og skærmene, så skal lyden væk, HELT VÆK. Hvis jeg kan høre den, så er den for høj. Alle de gange I har lovet at skrue ned, har I jo ikke gjort det alligvel, det kan jeg høre hver gang jeg er så uheldig at havne i et af de nedgraderede toge som har dem.&lt;/p&gt;
&lt;p&gt;Jeg stod på linje-B på Lyngby i dag med hovedtelefoner på, som jeg brugte til at høre et podcast lyden var på et behageligt niveau, men da jeg kom ind i kupeen med jeres forfærdelige skærme så overdøvede det min podcast og jeg måtte forlade kupeen for at holde det ud. Alternativet havde været at jeg skulle skrue op, så niveauet ikke længere var behageligt eller sundt, blot for at kunne høre det jeg har valgt at høre.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;”Vi har undervurderet, hvor stort et indgreb borgerne har oplevet, at det her er, og vi har fejlet i vores kommunikationsopgave.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nej, I har fejlet i jeres kunde service og jeres kontakt med virkeligheden. I har til gengæld ikke fejlet i at give arrogante svar på kritik. De svar jeg fik fra kundeservice da jeg brokkede mig, var meget arrogante standard svar med meget dårlige sammenligninger i et desperat forsøg på at forsvare støj torturen.&lt;/p&gt;
&lt;p&gt;I har tidligere påstået at et flertal af jeres kunder ønskede dette, var det blot en løgn? Eller ligger der en reel undersøgelse bag dette. Jeg hælder personligt mest til det er løgn eller en dårligt udført undersøgelse, da jeg endnu ikke har mødt en eneste passager eller rettere betalende kunde, som har ment det var en god ide.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;»Det er rigtigt, og det er noget, vi er meget opmærksomme på. Vores tilgang har været, at der skal være områder, hvor man kan vælge skærmene helt fra, og skærmene skal placeres, så man kan abstrahere fra dem. Vores vision har været at skabe en platform, der tjener flest interesser, så man skal kunne vælge det til eller fra«.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Så har I fejlet bragt. Det er kun muligt at undgå visse skærme i de dårligt placerede stillezoner.&lt;/p&gt;
&lt;p&gt;Det er ikke muligt at abstrahere fra dem, når de laver sådan en forfærdelig lyd som de gør, så er det lige meget hvor I placere dem.&lt;/p&gt;
&lt;p&gt;Hvis I seriøst ville lade os kunne vælge dem fra, hvorfor er der så lyd på dem og ikke lyd over radio som det er i nogle af busserne? Det er for mig at se enten et tegn på at det ikke er noget I mener seriøst eller at I bare ikke er særlig kompetente til den slags.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;»Det er det helt sikkert ikke. Vi har undervurderet, hvor stort et indgreb borgerne har oplevet, at det her er, og vi har fejlet i vores kommunikationsopgave. Jeg vil slet ikke bortforklare vores fejl, men vi har sat meget i gang for at forbedre processen«.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I kan kun forbedre processen på en måde, fjern støjforureningen og giv os vores tid i toget tilbage.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;»Man vil nok se flere og flere kommercielle tilbud fra DSB, for vi vil gerne tage større ansvar for rejsen fra A til B. Man kunne f.eks. forestille sig cykelsalg eller vores eget mobilselskab, der sikrer trafikinformation. Man vil opleve flere og flere tilbud fra DSB, der sikrer, at det er mere attraktivt at tage den kollektive trafik, så en øget kommercialisering vil man nok se. Så længe det skaber vækst og glade kunder, så gør vi det«.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ellers tak, hvis I nu blot koncentrerede jer som rent faktisk at fragte folk fra A til B til tiden på en behagelig måde, så ville det være nok.&lt;/p&gt;
&lt;p&gt;Hvorfor bliver du ved med at snakke om at gøre det attraktivt at tage den kollektive trafik, når du forsvare jeres beslutning om at gøre den mere uattraktiv end jeg havde forstillet mig det muligt i Danmark?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;»Det er klart, at alle vores ekstra tilbud kun giver mening, når grundproduktet er i orden, men over 95 procent af DSB’s tog kører til tiden, så vi har stort set tog til tiden. Vi kan se, at der kommer flere og flere unge mennesker i de områder, hvor vi kører, og der skal nogle andre ting til at lokke unge mennesker til toget. Så i og med at kundegrundlaget ændrer sig, må toget også ændre sig. Hvis vi ikke vi arbejder med vores produkt, får vi ikke flere kunder«.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Jeres grundprodukt er ikke i orden når I forpester vores rejsen med den mængde af støj som disse skærme giver. Og jeg kan love dig for at jeg dropper toget, hvis ikke situationen bliver forbedret og I rent faktisk lytter til os. Jeg kan ikke forestille mig at I får flere kunder på denne måde og med den attitude som I har lagt for dagen i hele denne sag med støjsenderne.&lt;/p&gt;
&lt;p&gt;Hilsen en meget utilfreds og måske snart tidligere kunde,&lt;/p&gt;
&lt;p&gt;Morten Sjøgren&lt;/p&gt;
&lt;p&gt;PS.: Denne mail havner på min blog http://mabs.dk&lt;/p&gt;
</description>
        <pubDate>Fri, 10 Sep 2010 00:53:13 +0200</pubDate>
        <link>https://mabs.dk/dansk/personlige%20emner/2010/09/10/dsb-det-her-er-jo-bare-en-byttehandel.html</link>
        <guid isPermaLink="true">https://mabs.dk/dansk/personlige%20emner/2010/09/10/dsb-det-her-er-jo-bare-en-byttehandel.html</guid>
        
        <category>dårlig serivce</category>
        
        <category>DSB</category>
        
        <category>kundefjendsk</category>
        
        <category>reklamer</category>
        
        <category>s-tog</category>
        
        <category>svar</category>
        
        <category>uønsket larm</category>
        
        
        <category>Dansk</category>
        
        <category>Personlige emner</category>
        
      </item>
    
      <item>
        <title>Processingjs quick-tip: Making the main-canvas transparent</title>
        <description>&lt;p&gt;With processingjs you can&apos;t give the background color an alpha-channel in the main canvas (the Processing-object).&lt;/p&gt;
&lt;p&gt;This behavior is inherited from the original Java-based Processing, where this doesn&apos;t make sense to have an transparent background.&lt;/p&gt;
&lt;p&gt;However it&apos;s possible to have this effect, if you want to and I&apos;ll show you how:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
var el = document.getElementById( &quot;basecanvas&quot; );
var processing = new Processing( el, function( p ) {
    p.setup = function( ) {
        if ( p.externals.sketch ) {
            // This is the flag that make the transparent background possible.
            p.externals.sketch.options.isTransparent = true;
        }
        // Now that you have flagged the sketch as transparent you want make the background fully transparent
        p.background( 0, 0 );
    };
} );
&lt;/pre&gt;
&lt;p&gt;You have to give that anonymous function as the second parameter to the Processing-constructor otherwise the sketch won&apos;t be created and you can&apos;t set the flag.&lt;/p&gt;
</description>
        <pubDate>Sun, 29 Aug 2010 12:00:00 +0200</pubDate>
        <link>https://mabs.dk/html5/javascript/processing-js/web%20development/2010/08/29/processingjs-quick-tip-making-the-main-canvas-transparent.html</link>
        <guid isPermaLink="true">https://mabs.dk/html5/javascript/processing-js/web%20development/2010/08/29/processingjs-quick-tip-making-the-main-canvas-transparent.html</guid>
        
        <category>code</category>
        
        <category>processingjs</category>
        
        <category>quicky</category>
        
        <category>tip</category>
        
        
        <category>HTML5</category>
        
        <category>Javascript</category>
        
        <category>Processing-js</category>
        
        <category>Web development</category>
        
      </item>
    
      <item>
        <title>Using Processing-js as an JavaScript-library</title>
        <description>&lt;p&gt;I&apos;ve started playing with the JavaScript library Processing-js ((&lt;a href=&quot;http://processingjs.org/&quot;&gt;Processing-js website&lt;/a&gt;)) for rendering in the HTML5 canvas.&lt;/p&gt;
&lt;p&gt;Processing ((Wikipedia &lt;a href=&quot;http://en.wikipedia.org/wiki/Processing_(programming_language)&quot;&gt;article&lt;/a&gt;)) is a programming language and processing-js is a javascript implementation of that language.&lt;br /&gt;
Well, I like JavaScript the way it is and the processing syntax is lazily translated to JavaScript anyway, so I wanted to use it as a normal JavaScript-library, but it wasn&apos;t well documented and the only blog post I could find was out-dated.&lt;/p&gt;
&lt;p&gt;After spending quite a long time on, which included reading a lot of Processing-js&apos; source code, I found a way to do this ((With version 0.9.6 which is currently the latest release)).&lt;/p&gt;
&lt;p&gt;It&apos;s actually straight forward, create a new Processing-object and make sure you give it to parameters;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The DOM-canvas element or the ID of the element&lt;/li&gt;
&lt;li&gt;a function-reference, this function gets the Processing-object p parsed to it. ((This should have been optional, but without it Processing doesn&apos;t initiate properly.))&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
         var p = new Processing( document.getElementById( &quot;canvas_id&quot; ),

         function( p, c ) {
             p.setup = function( ) {
                 p.size( 1250, 250 );
                 p.background( 55 );
                 p.frameRate( 10 );
                 p.cursor( c.HAND );
             };

             p.draw = function( ) {
                 p.background( 155 );
             };

             Processing.addInstance( p );
         } );
&lt;/pre&gt;
&lt;p&gt;Constants that would be seen as global in the processing language is bound to the c-object argument in my callback function. This is changed behavior in 0.9.7, in 0.9.6 they are bound to the p-object. ((If this isn&apos;t clear drop me a comment and I&apos;ll try to explain better.))&lt;/p&gt;
&lt;p&gt;Functions and variables that would normally be seen as being global in the processing-syntax in actually bound to the p-object and can be referred to directly through p with a few exceptions:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;frameRate&lt;/em&gt;, &lt;em&gt;mousePressed&lt;/em&gt; and &lt;em&gt;keyPressed&lt;/em&gt; are both booleans and functions in the Processing-language and we must refer to the boolean version with the prefix __ like this:&lt;br /&gt;
&lt;strong&gt;p.__frameRate&lt;/strong&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 13 Aug 2010 19:34:18 +0200</pubDate>
        <link>https://mabs.dk/javascript/web%20development/2010/08/13/using-processing-js-as-an-javascript-library.html</link>
        <guid isPermaLink="true">https://mabs.dk/javascript/web%20development/2010/08/13/using-processing-js-as-an-javascript-library.html</guid>
        
        <category>bored</category>
        
        <category>code</category>
        
        <category>encapsulation</category>
        
        <category>html5</category>
        
        <category>Javascript</category>
        
        <category>namespace</category>
        
        <category>Open Source</category>
        
        <category>processingjs</category>
        
        <category>script</category>
        
        <category>UI</category>
        
        
        <category>Javascript</category>
        
        <category>Web development</category>
        
      </item>
    
      <item>
        <title>Nyt svar fra DSB S-tog ang. reklameskærme</title>
        <description>&lt;p&gt;Blot et hurtigt indlæg, DSB S-tog har svaret på mine kommentarer ((http://mabs.dk/index.php/2010/07/07/svar-fra-dsb-omkring-reklamesk%c3%a6rme-i-s-toget/)) til deres svar som jeg lige ville dele.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Kære Morten Sjøgren&lt;/p&gt;
&lt;p&gt;Tak for din reaktion.&lt;/p&gt;
&lt;p&gt;Jeg kan oplyse, at DSB S-tog i sidste uge har været ude i togene og skrue ned for lyden på samtlige TV-skærme. Det betyder, at lydniveauet nu er markant lavere.&lt;/p&gt;
&lt;p&gt;S-tog har ingen planer om at fjerne lyden helt, eller om at tage TV-skærmene helt ned.&lt;/p&gt;
&lt;p&gt;Med venlig hilsen&lt;/p&gt;
&lt;p&gt;&amp;lt;navn fjernet&amp;gt;&lt;br /&gt;
DSB S-tog, Kundecenter, Kundeservice&lt;/p&gt;
&lt;p&gt;20.07.2010
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Det er ikke et særligt tilfredsstillende svar, jeg er meget tvivlende over for at DSB kan skrue lyden langt nok ned til at det ikke er irriterende og samtidigt være brugbart.&lt;/p&gt;
</description>
        <pubDate>Wed, 21 Jul 2010 20:01:00 +0200</pubDate>
        <link>https://mabs.dk/dansk/personlige%20emner/2010/07/21/nyt-svar-fra-dsb-s-tog.html</link>
        <guid isPermaLink="true">https://mabs.dk/dansk/personlige%20emner/2010/07/21/nyt-svar-fra-dsb-s-tog.html</guid>
        
        
        <category>Dansk</category>
        
        <category>Personlige emner</category>
        
      </item>
    
      <item>
        <title>Svar fra DSB omkring reklameskærme i s-toget</title>
        <description>&lt;p&gt;Jeg skrev i Onsdags en klage til DSB kundeservice omkring larmen fra reklameskærmene i S-toget. Tidligere idag fik jeg svar fra deres kundeservice.&lt;/p&gt;
&lt;blockquote&gt;
    &lt;p&gt;&lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;&gt;Kære Morten Sjøgren&lt;/span&gt;&lt;/p&gt;
    &lt;p&gt;&lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;&gt;Tak for din e-mail.&lt;/span&gt;&lt;/p&gt;
    &lt;p&gt;
        &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
            &gt;Skærmene i S-togene er som bekendt meget nye. S-tog vil i starten være meget opmærksomme på både indhold og lydniveau. Vi har i den første tid
            justeret lyden og har nu et niveau, som vi mener bør være acceptabelt for de fleste.&lt;/span
        &gt;
    &lt;/p&gt;
    &lt;p&gt;
        &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
            &gt;Hos S-tog følger vi løbende op med kundeundersøgelser, hvor vi beder kunderne om at fortælle os deres mening om det, der bliver bragt på skærmene.
            Vi véd allerede, at en overvægt af vores kunder gerne vil have disse informationer, når de rejser med S-tog. På længere sigt vil skærmene give os
            mulighed for at informere direkte til kunder om forsinkelser og pludselige ændringer i trafikken.&lt;/span
        &gt;
    &lt;/p&gt;
    &lt;p&gt;
        &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
            &gt;Vi lytter selvfølgelig til de kunder, som lige nu ikke er så glade for den nye informationskilde, men vi tror, at også disse kunder med tiden vil
            kunne se fordelene ved de nye skærme. Vi sammenligner det lidt med dengang vores kunder begyndte at tale i mobiltelefon under rejsen. I starten fik
            vi en masse henvendelser fra kunder, som blev forstyrret af disse samtaler. I dag har langt de fleste kunder accepteret, at mobiltelefoner er en
            naturlig del af vores daglige kommunikation. Vi er ret sikre på, at vores kunder på samme måde efterhånden vil se fordelene ved den nye
            informationskilde.&lt;/span
        &gt;
    &lt;/p&gt;
    &lt;p&gt;
        &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
            &gt;Jeg beklager, at du føler det generende, at der er lyd på de TV-skærme, som er sat op i S-togene. Jeg kan oplyse, at vi i starten af sidste uge
            justerende lyden ned, så den gerne skulle være mere acceptabel.&lt;/span
        &gt;
    &lt;/p&gt;
    &lt;p&gt;
        &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
            &gt;Hensigten med TV-skærmene er at tilbyde relevant trafikinformation, hvor kunderne er, og at fortælle om vores andre gode tilbud. Indholdet er
            mikset sammen i blokke af 20 minutters varighed, som består af nyheder, vejrudsigt, reklamer, underholdning og S-togs information.&lt;/span
        &gt;
    &lt;/p&gt;
    &lt;p&gt;
        &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
            &gt;Der er Stillezoner i alle S-tog, hvor der ikke er TV. DSB S-tog har ikke aktuelle planer om at tage TV-skærmene ned igen.&lt;/span
        &gt;
    &lt;/p&gt;
    &lt;p&gt;
        &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
            &gt;Du kan holde dig opdateret om STV på dette link:
            &lt;a href=&quot;http://www.dsb.dk/S-tog/Tv-i-S-toget/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;http://www.dsb.dk/S-tog/Tv-i-S-toget/&lt;/a&gt;&lt;/span
        &gt;
    &lt;/p&gt;
    &lt;p&gt;&lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;&gt;Med venlig hilsen&lt;/span&gt;&lt;/p&gt;
    &lt;p&gt;
        &lt;span style=&quot;font-family: Verdana;&quot;
            &gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;lt;NAVN FJERNET&amp;gt;&lt;br /&gt; &lt;/span&gt;&lt;/span
        &gt;&lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;&gt;DSB S-tog, Kundecenter, Kundeservice&lt;/span&gt;
    &lt;/p&gt;
    &lt;p&gt;&lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;&gt;07.07.2010&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;Her er mit svar til DSB:&lt;/div&gt;
&lt;blockquote&gt;
    &lt;div&gt;Mange tak for dit svar.&lt;/div&gt;
    &lt;div&gt;
        &lt;blockquote&gt;
            &lt;div&gt;
                &lt;p&gt;&lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;&gt;Tak for din e-mail.&lt;/span&gt;&lt;/p&gt;
                &lt;p&gt;
                    &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
                        &gt;Skærmene i S-togene er som bekendt meget nye. S-tog vil i starten være meget opmærksomme på både indhold og lydniveau. Vi har i den
                        første tid justeret lyden og har nu et niveau, som vi mener bør være acceptabelt for de fleste.&lt;/span
                    &gt;
                &lt;/p&gt;
            &lt;/div&gt;
        &lt;/blockquote&gt;
    &lt;/div&gt;
    &lt;div&gt;
        &lt;p&gt;
            Jeg oplevede det her onsdag formiddag i sidste uge. Lydniveauet var alt andet end acceptabelt, jeg håber det var før I har sat det ned, selvom
            onsdag ikke ligefrem er starten på ugen.
        &lt;/p&gt;
        &lt;p&gt;
            Jeg har heldigvis ikke været i et tog med de skærme siden, da det giver mere mening af tage s-tog-bussen til Birkerød end det gør at tage til Farum
            og håbe på at 500S passer nogenlunde med toget og efterfølgende bus i Birkerød (hvilket den aldrig gør).
        &lt;/p&gt;
    &lt;/div&gt;
    &lt;div&gt;
        &lt;blockquote&gt;
            &lt;div&gt;
                &lt;p&gt;
                    &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
                        &gt;Hos S-tog følger vi løbende op med kundeundersøgelser, hvor vi beder kunderne om at fortælle os deres mening om det, der bliver bragt
                        på skærmene. Vi véd allerede, at en overvægt af vores kunder gerne vil have disse informationer, når de rejser med S-tog. På længere
                        sigt vil skærmene give os mulighed for at informere direkte til kunder om forsinkelser og pludselige ændringer i trafikken.&lt;/span
                    &gt;
                &lt;/p&gt;
            &lt;/div&gt;
        &lt;/blockquote&gt;
    &lt;/div&gt;
    &lt;div&gt;
        Det lyder også fint, men drop lyden. Der er ingen rimelig grund til at forpeste s-togene med endnu mere støj end der er i forvejen. I kan gøre som i
        busserne, hvor man skal stille ind på en FM-frekvens for at få glæde af lyden og vi andre kan få fred.
    &lt;/div&gt;
    &lt;div&gt;
        &lt;blockquote&gt;
            &lt;div&gt;
                &lt;p&gt;
                    &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
                        &gt;Vi lytter selvfølgelig til de kunder, som lige nu ikke er så glade for den nye informationskilde, men vi tror, at også disse kunder med
                        tiden vil kunne se fordelene ved de nye skærme.&lt;/span
                    &gt;
                &lt;/p&gt;
            &lt;/div&gt;
        &lt;/blockquote&gt;
    &lt;/div&gt;
    &lt;div&gt;
        Jeg tvivler ærligtalt på, jeg vil komme til at sætte pris på disse skærme, så længe jeg er nød til at kunne hører dem i toget.  Jeg sætter generelt ikke
        pris på ting der støjer, når jeg prøver at slappe af, såsom folk der snakker højlydt, folk der snakker højlydt i telefon, folk der lytter til musik tre
        sæder væk på et niveau som om jeg selv har hovedtelefoner på eller irriterende reklameskærmer der har et højere lydniveau end disse.
    &lt;/div&gt;
    &lt;div&gt;
        &lt;blockquote&gt;
            &lt;div&gt;
                &lt;p&gt;
                    &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
                        &gt;Vi sammenligner det lidt med dengang vores kunder begyndte at tale i mobiltelefon under rejsen. I starten fik vi en masse henvendelser
                        fra kunder, som blev forstyrret af disse samtaler. I dag har langt de fleste kunder accepteret, at mobiltelefoner er en naturlig del af
                        vores daglige kommunikation. Vi er ret sikre på, at vores kunder på samme måde efterhånden vil se fordelene ved den nye
                        informationskilde.&lt;/span
                    &gt;
                &lt;/p&gt;
            &lt;/div&gt;
        &lt;/blockquote&gt;
    &lt;/div&gt;
    &lt;div&gt;
        Nu synes jeg også at folks mobilsnak kan være ret irriterende, men det er vand i forhold til det jeg oplevede i toget. Folk snakker normalt ikke hele
        turen, jeres skærme holder såvidt jeg kan se ikke op med at larme, de fleste mennesker der snakker i mobil prøver at holde niveauet så lavt at andre kan
        være i rum med dem, lydniveauet var alt andet end det.
    &lt;/div&gt;
    &lt;div&gt;
        &lt;blockquote&gt;
            &lt;div&gt;
                &lt;p&gt;
                    &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
                        &gt;Jeg beklager, at du føler det generende, at der er lyd på de TV-skærme, som er sat op i S-togene. Jeg kan oplyse, at vi i starten af
                        sidste uge justerende lyden ned, så den gerne skulle være mere acceptabel.&lt;/span
                    &gt;
                &lt;/p&gt;
            &lt;/div&gt;
        &lt;/blockquote&gt;
    &lt;/div&gt;
    &lt;div&gt;Jeg håber det var efter jeg oplevede det. For ellers bliver I virkelig nød til starte forfra på det.&lt;/div&gt;
    &lt;div&gt;
        &lt;blockquote&gt;
            &lt;div&gt;
                &lt;p&gt;
                    &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
                        &gt;Hensigten med TV-skærmene er at tilbyde relevant trafikinformation, hvor kunderne er, og at fortælle om vores andre gode tilbud.&lt;/span
                    &gt;
                &lt;/p&gt;
            &lt;/div&gt;
        &lt;/blockquote&gt;
    &lt;/div&gt;
    &lt;div&gt;
        Vel, med fokus på &quot;tilbud&quot;. Hvis skærmene kun blev brugt til oplysning ville det være fint, men det gør de jo ikke. De bliver brugt til støjende
        reklamer og støjende TV af laveste kvalitet, det er jo DR Update.
    &lt;/div&gt;
    &lt;div&gt;
        &lt;blockquote&gt;
            &lt;div&gt;
                &lt;p&gt;
                    &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
                        &gt;Indholdet er mikset sammen i blokke af 20 minutters varighed, som består af nyheder, vejrudsigt, reklamer, underholdning og S-togs
                        information.&lt;/span
                    &gt;
                &lt;/p&gt;
                &lt;p&gt;
                    &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
                        &gt;Der er Stillezoner i alle S-tog, hvor der ikke er TV. DSB S-tog har ikke aktuelle planer om at tage TV-skærmene ned igen.&lt;/span
                    &gt;
                &lt;/p&gt;
            &lt;/div&gt;
        &lt;/blockquote&gt;
    &lt;/div&gt;
    &lt;div&gt;Jeg har ikke så meget imod skærmene, hvis de bare var stille. Jeg kan ignorere billeder uden problemer, støj er derimod et stort problem.&lt;/div&gt;
    &lt;div&gt;
        &lt;blockquote&gt;
            &lt;div&gt;
                &lt;p&gt;
                    &lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;
                        &gt;Du kan holde dig opdateret om STV på dette link:
                        &lt;a href=&quot;http://www.dsb.dk/S-tog/Tv-i-S-toget/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;http://www.dsb.dk/S-tog/Tv-i-S-toget/&lt;/a&gt;&lt;/span
                    &gt;
                &lt;/p&gt;
            &lt;/div&gt;
        &lt;/blockquote&gt;
    &lt;/div&gt;
    &lt;div&gt;Tak det vil jeg gøre.&lt;/div&gt;
    &lt;div&gt;
        &lt;blockquote&gt;
            &lt;div&gt;
                &lt;p&gt;&lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;&gt;Med venlig hilsen&lt;/span&gt;&lt;/p&gt;
                &lt;p&gt;
                    &lt;span style=&quot;font-family: Verdana;&quot;
                        &gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;lt;NAVN FJERNET&amp;gt;&lt;br /&gt; &lt;/span&gt;&lt;/span
                    &gt;&lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;&gt;DSB S-tog, Kundecenter, Kundeservice&lt;/span&gt;
                &lt;/p&gt;
                &lt;p&gt;&lt;span style=&quot;font-family: Verdana; font-size: x-small;&quot;&gt;07.07.2010&lt;/span&gt;&lt;/p&gt;
            &lt;/div&gt;
        &lt;/blockquote&gt;
    &lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;
    &lt;a href=&quot;http://www.facebook.com/#!/group.php?gid=112790432079913&amp;amp;ref=ts&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;
        &gt;Facebook gruppen: Nej tak til reklameskærme i S-tog&lt;/a
    &gt;
&lt;/div&gt;
</description>
        <pubDate>Wed, 07 Jul 2010 22:40:05 +0200</pubDate>
        <link>https://mabs.dk/dansk/personlige%20emner/2010/07/07/svar-fra-dsb-omkring-reklameskaerme-i-s-toget.html</link>
        <guid isPermaLink="true">https://mabs.dk/dansk/personlige%20emner/2010/07/07/svar-fra-dsb-omkring-reklameskaerme-i-s-toget.html</guid>
        
        
        <category>Dansk</category>
        
        <category>Personlige emner</category>
        
      </item>
    
      <item>
        <title>Reklameskærme i S-toget nu med lyd</title>
        <description>&lt;p&gt;DSB har for nogle måneder siden besluttet sig for at nu skulle der TV i s-toget, jeg mente det lød som en dårlig ide da der er larm nok i toget.&lt;/p&gt;
&lt;p&gt;Desværre fik jeg ret og føler det er nødvendigt, at jeg viser min &quot;sur-gammel-mand&quot; side, men jeg er jo også snart 30.&lt;/p&gt;
&lt;p&gt;Onsdag havde jeg fornøjelsen af at komme ind i en kupe med en af disse skærme, som nu har lyd på og det var langt værre end jeg havde frygtet. Lydniveauet var helt uacceptabelt højt og jeg måtte finde en anden kupe, for kunne holde turen til Farum ud.&lt;/p&gt;
&lt;p&gt;Desværre har DSB samtidigt besluttet sig for at det med at have en stor kupe til stillezone i et vognsæt var en dårlig ide, så nu er der kun en lille kupe i enden af toget, som så kun har halvdelen af det gamle areal.&lt;/p&gt;
&lt;p&gt;Jeg har skrevet en klage til DSBs kundeservice, men jeg forventer ikke at DSB tager sådan en klage seriøst. Jeg skrev til dem, da jeg hørte om planerne for nogle måneder siden og i deres svar lovede de at lydniveauet ville være på et fornuftigt plan, men det kan jeg hører ikke passer.&lt;/p&gt;
</description>
        <pubDate>Sat, 03 Jul 2010 12:31:52 +0200</pubDate>
        <link>https://mabs.dk/dansk/personlige%20emner/2010/07/03/reklameskaerme-i-s-toget-nu-med-lyd.html</link>
        <guid isPermaLink="true">https://mabs.dk/dansk/personlige%20emner/2010/07/03/reklameskaerme-i-s-toget-nu-med-lyd.html</guid>
        
        <category>dårlig serivce</category>
        
        <category>DSB</category>
        
        <category>gammel sur mand</category>
        
        <category>s-tog</category>
        
        
        <category>Dansk</category>
        
        <category>Personlige emner</category>
        
      </item>
    
      <item>
        <title>Hvorfor diskutere vi det her i 2010?</title>
        <description>&lt;p&gt;
    Så er ligestilling for homoseksuelle til debat igen. Folketinget diskutere om homoseksuelle skal kunne blive gift på lige fod med heteroseksuelle. Og det er
    mig en gåde, hvorfor det overhovedet er nødvendigt at have denne diskussion i Danmark i år 2010?
&lt;/p&gt;
&lt;p&gt;
    Dette er noget som skulle være på plads for mange år siden. Det er simpelhen ikke i orden, at vi i et civiliseret land, stadig undertrykker folk som har en
    anden seksualitet end os selv.
&lt;/p&gt;
&lt;p&gt;
    Hvordan kan nogle folk hade homoseksuelle så meget, at de ikke engang under dem grundlæggende rettigheder så som at danne par med den person som de elsker
    og som elsker dem?
&lt;/p&gt;
&lt;p&gt;
    Under debatten i folketinget kommer Lars Barfoed med argumenter som ((&lt;a href=&quot;http://www.dr.dk/Nyheder/Politik/2010/03/26/140350.htm&quot; target=&quot;_self&quot;
        &gt;http://www.dr.dk/Nyheder/Politik/2010/03/26/140350.htm&lt;/a
    &gt;)) &quot;Og det skyldes helt overordnet, at regeringen ikke er enig i den helt grundlæggende forudsætning, som forslaget bygger på, nemlig at ægteskabet som
    begreb skal ændres. Det mener vi ikke, sagde han.&quot;
&lt;/p&gt;
&lt;p&gt;
    Jeg må sige. jeg har en helt anden opfattelse af hvad ordet &quot;ægteskab&quot; dækker over, jeg mener det er to mennesker som elsker hinanden og vil tilbringe deres
    liv samme. Dette argument høres ofte i USA fra religiøse fundamentalister som glemmer at &quot;ægteskab&quot; allerede er blevet omdefineret flere gange i USA&apos;s
    historie, bl.a. har det været mellem to af samme race.
&lt;/p&gt;
&lt;p&gt;
    Der blev iflg. artiklen på DR&apos;s hjemmeside også snakket om børn, hvilket for mig er komplet ligegyldigt for hvorvidt de skal have lov til at gifte sig, da
    ægteskab for mig intet har at gøre med at avle børn. Vi mennesker er som bekendt i stand til at få børn uden at være gift og vi forbyder ikke folk der ikke
    kan eller ikke vil have børn i at gifte sig.
&lt;/p&gt;
&lt;p&gt;Når jeg læser nogle af kommentarerne på DR&apos;s artikel, finder jeg det meget skræmmende at der er så mange mennesker i dette land som tænker sådan&lt;/p&gt;
&lt;p&gt;
    Jeg har meldt mig ind i endnu en politisk facebook gruppe ((&lt;a href=&quot;http://www.facebook.com/#!/posted.php?id=258500547794&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;
        &gt;http://www.facebook.com/#!/posted.php?id=258500547794&lt;/a
    &gt;)),
&lt;/p&gt;
&lt;p&gt;da det efterhånden ser ud til man skal have sådan en for at få nødvendig opmærksomhed.&lt;/p&gt;
&lt;p&gt;
    Til sidst vil jeg lige komme med en appel til følelser (ja, jeg er klar over, det er en logisk fejlslutning). For jer der er imod at homoseksuelle kan gifte
    sig, prøv at sætte dig i deres sted, hvor din kærlighed til din partner bliver stemplet som mindre værd og mindre ægte af staten og samfundet, og I ikke kan
    få samme ret eller samme anerkendelse som alle andre borgere. Fortæl mig derefter, at du stadig mener det er i orden at behandle folk som elsker anderledes
    end dig, på den måde.
&lt;/p&gt;
</description>
        <pubDate>Fri, 26 Mar 2010 00:00:44 +0100</pubDate>
        <link>https://mabs.dk/dansk/personlige%20emner/2010/03/26/hvorfor-diskutere-vi-det-her-i-2010.html</link>
        <guid isPermaLink="true">https://mabs.dk/dansk/personlige%20emner/2010/03/26/hvorfor-diskutere-vi-det-her-i-2010.html</guid>
        
        <category>politik</category>
        
        <category>rettigheder</category>
        
        
        <category>Dansk</category>
        
        <category>Personlige emner</category>
        
      </item>
    
      <item>
        <title>Demonstration mod medielicensen</title>
        <description>&lt;p&gt;Nu er det her lidt forsinket, men jeg synes, jeg ville dele dette alligevel.&lt;/p&gt;
&lt;p&gt;
    Lørdag d. 6 marts var der demonstration mod medielicensen, med Lars fra &quot;Stør Lars&apos; kamp mod DR licens&quot; ((&lt;a
        href=&quot;http://www.facebook.com/#!/pages/Stot-Lars-kamp-mod-DR-Licens/270591874194?ref=ts&quot;
        target=&quot;_blank&quot;
        rel=&quot;noreferrer&quot;
        &gt;http://www.facebook.com/#!/pages/Stot-Lars-kamp-mod-DR-Licens/270591874194?ref=ts&lt;/a
    &gt;)) på Facebook.
&lt;/p&gt;
&lt;p&gt;
    Jeg var desværre forhindret i at møde op selv, da jeg deltog i Open Source Days på ITU ved siden af DR-byen. Men jeg ville meget gerne have været med til,
    at udtrykke min utilfredshed med medielicensen, som jeg ikke kan finde noget positivt ved.
&lt;/p&gt;
&lt;p&gt;
    TV2 Nyhederne har er udemærket indslag fra dagen på deres hjemmeside:
    &lt;a href=&quot;http://nyhederne.tv2.dk/video/index/id/29064128/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;http://nyhederne.tv2.dk/video/index/id/29064128/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Mange tak til Lars for hans kamp.&lt;/p&gt;
</description>
        <pubDate>Sun, 21 Mar 2010 14:47:41 +0100</pubDate>
        <link>https://mabs.dk/dansk/it-politik/personlige%20emner/2010/03/21/demonstration-mod-medielicensen.html</link>
        <guid isPermaLink="true">https://mabs.dk/dansk/it-politik/personlige%20emner/2010/03/21/demonstration-mod-medielicensen.html</guid>
        
        <category>demonstration</category>
        
        <category>DR</category>
        
        <category>Licens</category>
        
        <category>medialicens</category>
        
        
        <category>Dansk</category>
        
        <category>IT-Politik</category>
        
        <category>Personlige emner</category>
        
      </item>
    
      <item>
        <title>Åbent og demokratisk samfund? Ikke her.</title>
        <description>&lt;p&gt;I forbindelse med forhandlingerne af ACTA, har Danmark endnu engang vist en grim side af sig selv.&lt;/p&gt;
&lt;p&gt;I flg. et lækket memo ((&lt;a href=&quot;http://www.michaelgeist.ca/content/view/4819/125/&quot;&gt;http://www.michaelgeist.ca/content/view/4819/125/&lt;/a&gt;)) ((&lt;a href=&quot;http://translate.google.com/translate?js=y&amp;prev=_t&amp;hl=en&amp;ie=UTF-8&amp;layout=1&amp;eotf=1&amp;u=http%3A%2F%2Fwww.bigwobber.nl%2F2010%2F02%2F25%2Facta-verslagen-van-het-ministerie-van-economische-zaken%2F&amp;sl=nl&amp;tl=en&quot;&gt;Engelsk oversættelse&lt;/a&gt;)) så er Danmark et af de lande som er mest imod gennemsigtighed omkring ACTA, dvs. at regeringen ikke ønsker at befolkningen skal vide hvad der sker før det er forsent, at gøre noget ved resultatet af ACTA.&lt;/p&gt;
&lt;p&gt;Jeg grimmes over denne samling udemokratiske mennesker, vi har til at lede os. Som om det ikke var slemt nok, at de snød os for vores folkeafstemning om EU-traktaten.&lt;/p&gt;
</description>
        <pubDate>Thu, 25 Feb 2010 21:40:48 +0100</pubDate>
        <link>https://mabs.dk/dansk/it-politik/2010/02/25/abent-og-demokratisk-samfund-ikke-her.html</link>
        <guid isPermaLink="true">https://mabs.dk/dansk/it-politik/2010/02/25/abent-og-demokratisk-samfund-ikke-her.html</guid>
        
        <category>ACTA</category>
        
        <category>demokrati</category>
        
        <category>IT-Politik</category>
        
        <category>politik</category>
        
        <category>retssikkerhed</category>
        
        
        <category>Dansk</category>
        
        <category>IT-Politik</category>
        
      </item>
    
      <item>
        <title>DR og censur</title>
        <description>&lt;h1&gt;Forord&lt;/h1&gt;
&lt;p&gt;Jeg tror, at jeg indledningsvis bliver nødtil kort at forklare mit forhold til licensen, da denne post er relateret til dette. Jeg mener, at licensen både i dens nye form og dens gamle form er forkert på alle tænkelige måde, og derfor er jeg imod licens modellen. Jeg er ikke imod public service iform af information, nyheder og generel oplysning af folket, men jeg er imod at public service omfatter ligegyldigheder som X-Faktor og anden underholdning.&lt;/p&gt;
&lt;h1&gt;DR og censur af modstandere&lt;/h1&gt;
&lt;p&gt;Jeg er medlem af et par facebook grupper i kampen mod licensen, bl.a. fulgte jeg gruppen &amp;quot;Støt Lars&apos; kamp mod DR Licens&amp;quot; og det er hvad denne post handler om. &lt;/p&gt;
&lt;p&gt;For DR har i starten af 2010, gjort noget som jeg mener går direkte imod en af begrundelserne for licensen, nemlig at det skal sikre uafhængig information fordi det er nødvendigt for et demokratisk samfund. DR har med hjælp af facebook fået lukket gruppen &amp;quot;Støt Lars&apos; kamp mod DR Licens&amp;quot; og det er svært for mig at se det som andet end DR har ønsket at lukke munden på en der kæmper mod deres faste indtjening, nemlig licensen. Dette er en form for censur og det kan vi ikke leve med i et demokratisk samfund, og DR der fremstiller sig selv om demokratiets vogter burde vide dette.&lt;/p&gt;
&lt;p&gt;Plummer har siden udtalt til 180grader at Lars har truet DRs medarbejdere, men han har ikke ville præcisere, hvad han mener Lars har gjort og det er ikke blevet meldt til politiet. Dette virker for mig som en enorm dårlig undskyldning efter Plummer har opdaget at censur er en upopulær løsning. Hvis han virkelig mener at Lars har virket truende, hvorfor er Lars så ikke meldt til politiet? Lars er iøvrigt politimand, så man må jo gå ud fra at han kender loven.&lt;/p&gt;
&lt;p&gt;Endnu engang lykkedes det DR at give mig en dårlig smag i munden over at jeg overholder loven, og rent faktisk betaler 2200 kr. om året selvom jeg helst var fri, da jeg ingen interesse har i deres produkter.&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.facebook.com/group.php?gid=288615379362 &quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;http://www.facebook.com/group.php?gid=288615379362&lt;/a&gt; - Facebook gruppen: &amp;quot;Støt Lars&apos; kamp mod DR Licens - v. 2.0 efter DR lukkede siden&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.180grader.dk/Krimi/dr-advokat-jeg-bad-om-at-faa-facebook-side-lukket&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;http://www.180grader.dk/Krimi/dr-advokat-jeg-bad-om-at-faa-facebook-side-lukket&lt;/a&gt; - 180grader: &amp;quot;DR-advokat: Jeg bad om at få Facebook-side lukket&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.180grader.dk/Politik/dr-sender-redegoerelse-for-facebook-sag-til-politikere&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;http://www.180grader.dk/Politik/dr-sender-redegoerelse-for-facebook-sag-til-politikere&lt;/a&gt; - 180grader: &amp;quot;DR sender redegørelse for Facebook-sag til politikere&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.180grader.dk/Politik/plummer-facebook-lars-truer-vores-medarbejdere&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;http://www.180grader.dk/Politik/plummer-facebook-lars-truer-vores-medarbejdere&lt;/a&gt; - 180grader: &amp;quot;Plummer: Facebook-Lars truer vores medarbejdere&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.180grader.dk/Krimi/mulig-injuriesag-mod-generaldirektoer-kenneth-plummer&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;http://www.180grader.dk/Krimi/mulig-injuriesag-mod-generaldirektoer-kenneth-plummer&lt;/a&gt; - 180grader: &amp;quot;Mulig injuriesag mod Generaldirektør Kenneth Plummer&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://ekstrabladet.dk/minsag/article1287819.ece&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;http://ekstrabladet.dk/minsag/article1287819.ece&lt;/a&gt; -  &amp;quot;Min sag&amp;quot; på Ekstrabladet, skrevet af Lars&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot; font-size:small;&quot;&gt;&lt;em&gt;PS.: Dette er min første post med blogilo, KDEs nye blog-editor.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 30 Jan 2010 15:17:42 +0100</pubDate>
        <link>https://mabs.dk/dansk/it-politik/personlige%20emner/2010/01/30/dr-og-censur.html</link>
        <guid isPermaLink="true">https://mabs.dk/dansk/it-politik/personlige%20emner/2010/01/30/dr-og-censur.html</guid>
        
        <category>censur</category>
        
        <category>DR</category>
        
        <category>IT-Politik</category>
        
        <category>Licens</category>
        
        
        <category>Dansk</category>
        
        <category>IT-Politik</category>
        
        <category>Personlige emner</category>
        
      </item>
    
      <item>
        <title>Orango.dk - Domæne indehaver mister domæne efter 9 år til 11 måneder gammelt firma</title>
        <description>&lt;p&gt;Jeg læste fredag til min store forargelse om endnu en absurd sag om domæner, denne gang Orango.dk.&lt;/p&gt;
&lt;p&gt;
    Orango.dk har været ejet af Peter Veileborg i 9 år og har været brugt til bl.a. emails. I januar startede der et nyt web-profilerings virksomhed med navnet
    Orango ApS og de vil gerne have domænet Orango.dk, så de tilbyder en meget lav pris for domænet 500,- som Peter afviser som værende alt for lavt.
&lt;/p&gt;
&lt;p&gt;
    Domæneklagenævnet giver Orango ApS medhold i at Peter forbryder sig mod god domænenavnsskik, fordi de mener at Orango ApS har større værdi af domænet end
    Peter og i deres afgørelse ignorere de totalt vigtigheden af emails som Peter har brugt domænet til.
&lt;/p&gt;
&lt;p&gt;Jeg er selv indehaver at et domæne (mabs.dk),&lt;/p&gt;
&lt;p&gt;
    som jeg bl.a. bruger til email og blog. Jeg ville da nødigt stå i samme situation som Peter Veileborg, at miste mit domæne på den måde. For mig er dette en
    vigtig&lt;br /&gt;
    sag, for det ser ikke ud til at os private domæne ejere er sikret i sager som denne og mit domæne, mit påtaget navn mabs, er ligeså vigtigt for mig som mit
    folkeregisternavn som mabs i øvrigt er baseret på.
&lt;/p&gt;
&lt;p&gt;
    Udover at jeg synes afgørelsen er helt uden for al rimelighed, så finder jeg også Orango ApS forretningsmoral som værende meget dårlig. Alene det at de
    kommer med et utrolig lavt tilbud for domænet, 500 kr., for så at bruge det som argument med ejeren. Men også at det ser ud til det har været en bevidst
    strategi for dem, at ville kapre domænet fra Peter.
&lt;/p&gt;
&lt;p&gt;
    Jeg er fuld forstående over for at man skal bekæmpe domænepirater, men det kan man på ingen måde kalde Peter Veileborg i denne sag, da han har haft navnet
    længere end Orango ApS har eksisteret.
&lt;/p&gt;
&lt;p&gt;Jeg savner en klar beskyttelse af private danskere i sager som denne, da det ikke kan være rigtigt at vi står så dårligt i sager som denne.&lt;/p&gt;
&lt;p&gt;
    Det er mit håb at Peter Veileborg går videre med sagen og jeg har tilbudt ham et mindre beløb som støtte til sagen, da princippet i denne sag er meget
    vigtigt for mig.
&lt;/p&gt;
&lt;p&gt;
    Jeg har desuden skrevet en mail til videnskabsministeren, Helge Sander, for at få nogle svar og jeg har sendt et debat oplæg til IT-politiskforenings
    mailingsliste.
&lt;/p&gt;
&lt;h2&gt;Links:&lt;/h2&gt;
&lt;p&gt;
    &lt;a href=&quot;http://www.comon.dk/nyheder/Domaene-ejer-mister-navnet-efter-ni-ar-1.247341.html&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;
        &gt;http://www.comon.dk/nyheder/Domaene-ejer-mister-navnet-efter-ni-ar-1.247341.html&lt;/a
    &gt;&lt;br /&gt;
    &lt;a href=&quot;http://www.comon.dk/nyheder/Principiel-domaenesag-kan-ende-i-retten-1.243502.html&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;
        &gt;http://www.comon.dk/nyheder/Principiel-domaenesag-kan-ende-i-retten-1.243502.html&lt;/a
    &gt;&lt;br /&gt;
    &lt;a href=&quot;http://www.comon.dk/nyheder/Principiel-domaenesag-kan-ende-i-retten-1.243502.html&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;http://new.czar.dk/?p=547&lt;/a
    &gt;&lt;br /&gt;
    &lt;a href=&quot;http://www.dr.dk/nettv/update/?video={cc7e58df-fbcb-41ee-85ed-ea674dd41e4f}&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;
        &gt;http://www.dr.dk/nettv/update/?video={cc7e58df-fbcb-41ee-85ed-ea674dd41e4f}&lt;/a
    &gt;&lt;br /&gt;
    &lt;a href=&quot;http://www.domæneklager.dk/uploads/2009-0099orango.dk&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;http://www.domæneklager.dk/uploads/2009-0099orango.dk&lt;/a
    &gt;&lt;br /&gt;
    &lt;a href=&quot;http://myplace.dk/2009/11/21/dk-domaener-kan-tages-fra-dig/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;
        &gt;http://myplace.dk/2009/11/21/dk-domaener-kan-tages-fra-dig/&lt;/a
    &gt;&lt;br /&gt;
    &lt;a href=&quot;http://peter.binderup.dk/blog/2009/11/21/ejeren-af-domnet-orangodk-skal-overdrage-det-til-orangonu.html&quot;
        &gt;http://peter.binderup.dk/blog/2009/11/21/ejeren-af-domnet-orangodk-skal-overdrage-det-til-orangonu.html&lt;/a
    &gt;&lt;br /&gt;
    &lt;a href=&quot;http://domaene-retfaerdighed-tak.skrivunder.dk/&quot;&gt;http://domaene-retfaerdighed-tak.skrivunder.dk/&lt;/a&gt;&lt;br /&gt;
    &lt;a href=&quot;http://www.180grader.dk/IT/wild-wild-west-ejendomsret-til-dk-domaenenavne-ringere-end-ejendomsret-i-det-kommunistiske-kina#comments&quot;
        &gt;http://www.180grader.dk/IT/wild-wild-west-ejendomsret-til-dk-domaenenavne-ringere-end-ejendomsret-i-det-kommunistiske-kina#comments&lt;/a
    &gt;
&lt;/p&gt;
</description>
        <pubDate>Sun, 22 Nov 2009 16:02:24 +0100</pubDate>
        <link>https://mabs.dk/dansk/it-politik/2009/11/22/orango-dk-domaene-indehaver-mister-domaene-efter-9-ar-til-11-maneder-gammelt-firma.html</link>
        <guid isPermaLink="true">https://mabs.dk/dansk/it-politik/2009/11/22/orango-dk-domaene-indehaver-mister-domaene-efter-9-ar-til-11-maneder-gammelt-firma.html</guid>
        
        <category>dårlig forretningsmoral</category>
        
        <category>dk-domæner</category>
        
        <category>IT-Politik</category>
        
        <category>skandale</category>
        
        <category>urimelig afgørelse</category>
        
        
        <category>Dansk</category>
        
        <category>IT-Politik</category>
        
      </item>
    
      <item>
        <title>Started on Git</title>
        <description>&lt;p&gt;I&apos;m currently learning, how to use git and plan to move my private svn-repository to git soon.&lt;/p&gt;
&lt;p&gt;I just stumbled up on the site &lt;a href=&quot;http://gitcasts.com&quot;&gt;http://gitcasts.com&lt;/a&gt; that has some short video courses in using git.&lt;/p&gt;
&lt;p&gt;Git is somewhat different from subversion(svn) and introduces some new concepts for me, namely the local index, remote-repository, rebasing, branching (never used it in svn) and automated merging.&lt;/p&gt;
&lt;p&gt;I&apos;ve had a hard time getting of the ground with it, but I was very motivated since many of the more important (to me) open source projects like amarok have moved to it and KDE is planing to do so.&lt;/p&gt;
&lt;p&gt;The more I learn about Git the more I like it. Now I&apos;m off to watch more of those videos.&lt;/p&gt;
</description>
        <pubDate>Sun, 22 Nov 2009 14:03:34 +0100</pubDate>
        <link>https://mabs.dk/open%20source/2009/11/22/git.html</link>
        <guid isPermaLink="true">https://mabs.dk/open%20source/2009/11/22/git.html</guid>
        
        <category>git</category>
        
        <category>learn</category>
        
        <category>link</category>
        
        
        <category>Open Source</category>
        
      </item>
    
      <item>
        <title>Reducing memory usage with JavaScript</title>
        <description>&lt;p&gt;In this article I&apos;ll talk about reducing memory leaks in JavaScript with focus on working with jQuery and the encapsulation I used in my work ((covered in http://www.mabs.dk/wordpress/index.php/2009/04/20/reintroducing-a-little-sanity-in-working-with-javascript/ )).&lt;/p&gt;
&lt;p&gt;This dates back to a problem I had in my previous job, our web-application used a lot of memory and it just kept growing the longer the application was running. Reloading the page only fixed the problem some of the time, often restarting the browser was the only way to free the memory.&lt;/p&gt;
&lt;p&gt;This problem had to be fixed and fixed quickly. I found a very useful document from Microsoft about memory leak patterns in JavaScript (( http://msdn.microsoft.com/en-us/library/bb250448.aspx )),&lt;/p&gt;
&lt;p&gt; which helped a lot.&lt;/p&gt;
&lt;p&gt;I&apos;ll list the patterns I intend to cover by name for reference.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Circular References&lt;/li&gt;
&lt;li&gt;Closures&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Circular References&lt;/h2&gt;
&lt;p&gt;With &lt;strong&gt;circular references&lt;/strong&gt; an object have a reference to another object, which in turn have a reference back to the other object and since the references are never removed the garbage collector will not know to free the memory.&lt;/p&gt;
&lt;p&gt;I ran into this because I wanted to save time by not looking for DOM elements, I already had found once. Searching the DOM can be slow, especially than you have a large page with many elements.&lt;/p&gt;
&lt;p&gt;But since it caused a lot of memory leaks, I had to find another way to do it OR live with the waste of time searching for elements. I found another way with jQuery, the function &quot;data&quot; (( jQuery doc: http://docs.jquery.com/Core/data )) solves the problem in a nice and clean way.&lt;/p&gt;
&lt;p&gt;I&apos;ll show a simple example, how this can be used. But first I&apos;ll show a piece of code which a potential memory leak.&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;	// Find the elements in the DOM-tree
	var el1 = $( &quot;#element1&quot; );
	var el2 = $( &quot;#element2&quot; );

	// Creating circular reference problem
	el1[0].other_element = el2;
	el2[0].other_element = el1;
…
	// Accessing element-reference
	el1[0].other_element.css( &quot;background-color&quot;, &quot;black&quot; );
	el2[0].other_element.css( &quot;background-color&quot;, &quot;#666000&quot; );
…
	// Removing the reference
	el1[0].other_element = undefined;
	el2[0].other_element = undefined;
&lt;/pre&gt;
&lt;p&gt;And here is a piece of code which don&apos;t have the potential memory leak:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;	// Find the elements in the DOM-tree
	var el1 = $( &quot;#element1&quot; );
	var el2 = $( &quot;#element2&quot; );

	// Add the reference with the data-function
	el1.data( &quot;other_element&quot;, el2 );
	el2.data( &quot;other_element&quot;, el1 );
…
	// Accessing the element with the data-function
	el1.data( &quot;other_element&quot; ).css( &quot;background-color&quot;, &quot;black&quot; );
	el2.data( &quot;other_element&quot; ).css( &quot;background-color&quot;, &quot;#666000&quot; );
…
	// Removing the reference
	el1.removeData( &quot;other_element&quot; );
	el2.removeData( &quot;other_element&quot; );
&lt;/pre&gt;
&lt;p&gt;As you can see there isn&apos;t much difference in the two code examples, but there is a huge difference between in potential for memory leaks.&lt;/p&gt;
&lt;p&gt;This works because jQuery will remove the data when the DOM-element is removed (through jQuery). You should note that if you remove el1 and not el2, el1 will still be referenced from el2 until el2 is removed.&lt;/p&gt;
&lt;h2&gt;The problem and solution for closures.&lt;/h2&gt;
&lt;p&gt;Now with jQuery, we tend to create a lot of new functions when we add events, loops through arrays and so on. We need to be careful then we do this, since it can lead to the problem described in that Microsoft document as &quot;Closure&quot;.&lt;br /&gt;
Basically the problem is that inside function (A) we create a new function (B),&lt;/p&gt;
&lt;p&gt; if B references to an outside object we have an extra reference and reference count for the element never reaches zero, this means that the garbage collector doesn&apos;t free the memory.&lt;/p&gt;
&lt;p&gt;Like before I&apos;ll give an example with the potential problem followed by an example without the problem.&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
function A( el ) {
	var el2 = $( &quot;&amp;lt;div&amp;gt;Hallo&amp;lt;/div&amp;gt;&quot; ).appendTo( document.body );
	el2.css( {
		&quot;position&quot; : &quot;absolute&quot;,
		&quot;top&quot; : 100,
		&quot;left&quot; : 100,
		&quot;background-color&quot; : &quot;#666000&quot;
	} ).hide( );

	el.click( function( e ) {
		el.hide( );
		el2.show( );
	} );

	el2.click( function( e ) {
		el.show( );
		el2.hide( );
	} );
}&lt;/pre&gt;
&lt;p&gt;Without the potential problem:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
function B( e ) {
	var el = e.data.el;
	var el2 = e.data.el2;
	el.hide( );
	el2.show( );
}

function C( e ) {
	var el = e.data.el;
	var el2 = e.data.el2;
	el.show( );
	el2.hide( );
}

function A( el ) {
	var el2 = $( &quot;&amp;lt;div&amp;gt;Hallo&amp;lt;/div&amp;gt;&quot; ).appendTo( document.body );
	el2.css( {
		&quot;position&quot; : &quot;absolute&quot;,
		&quot;top&quot; : 100,
		&quot;left&quot; : 100,
		&quot;background-color&quot; : &quot;#666000&quot;
	} ).hide( );

	el.bind( &quot;click&quot;,  {
		el : el,
		el2 : el2
	}, B );

	el.bind( &quot;click&quot;,  {
		el : el,
		el2 : el2
	}, B );
}&lt;/pre&gt;
&lt;p&gt;In the first example I have two anonymous child functions in function A, every single time A is called two new enclosures are created from these two functions. Each of the child functions have references to elements from function A&apos;s scope potential preventing the garbage collector from deleting the elements.&lt;/p&gt;
&lt;p&gt;In the second example I&apos;ve moved the two functions out of function A and instead just give a reference to the functions inside function A when I bind the events, but in order for the functions B and C to access to the elements I use the jquery-function &quot;bind&quot; insteed of &quot;click&quot; to bind the events, &quot;bind&quot; allows me to provide a data-object to the function. In the event-function I can easily access the data by accessing the parameter &quot;data&quot; on the event object.&lt;/p&gt;
&lt;p&gt;The reason this works is that the two closures are no longer created and the references to the element are parsed by normal reference through the event-object. Jquery will unbind all events from an element once it&apos;s removed, eliminating the reference created by parsing the data-object to bind.&lt;/p&gt;
&lt;p&gt;Another way you can achieve this is with the &quot;data&quot;-function like this:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;function B( e ) {
	var el = $( this );
	var el2 = el.data( &quot;el2&quot; );
	el.hide( );
	el2.show( );
}

function C( e ) {
	var el2 = $( this );
	var el = el.data( &quot;el&quot; );
	el.show( );
	el2.hide( );
}

function A( el ) {
	var el2 = $( &quot;&amp;lt;div&amp;gt;Hallo&amp;lt;/div&amp;gt;&quot; ).appendTo( document.body );
	el2.css( {
		&quot;position&quot; : &quot;absolute&quot;,
		&quot;top&quot; : 100,
		&quot;left&quot; : 100,
		&quot;background-color&quot; : &quot;#666000&quot;
	} ).hide( );

	el.data( &quot;el2&quot;, el2 );
	el2.data( &quot;el&quot;, el );

	el.click( B );
	el2.click( B );
}&lt;/pre&gt;
&lt;p&gt;The major difference here is that the data is no longer private. Every piece of code that can get a hold of either of the elements can get to the other through the data-function.&lt;/p&gt;
&lt;p&gt;But if the data is not meant to be private this can be fine. I&apos;ve done this in a few jQuery plugins I&apos;ve created where is was better to just add the element references as data so that all my functions for the plugin could easily reach the elements that made up the interface.&lt;/p&gt;
&lt;h2&gt;Saving memory on events&lt;/h2&gt;
&lt;p&gt;Another way the save memory is to use the same event-function for more then one element, especially if the functionality is similar. Here I&apos;ll show how I tend to use a single event for two buttons.&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;…
	&amp;lt;button xaction=&apos;okay&apos;&amp;gt;Okay&amp;lt;/button&amp;gt;
	&amp;lt;button xaction=&apos;cancel&apos;&amp;gt;Cancel&amp;lt;/button&amp;gt;
…&lt;/pre&gt;
&lt;p&gt;I add the attribution &quot;xaction&quot; to the elements to indicate what kind of action I want to take then the button is clicked.&lt;/p&gt;
&lt;p&gt;Here are the JavaScript-code the handle the click event on these two buttons.&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;function button_clicked( e ) {
	var el = $( e.target );
	var xaction = el.attr( &quot;xaction&quot; );
	if ( xaction == &quot;okay&quot; ) {
		// TODO: Handle okay action.
	} else if ( xaction == &quot;cancel&quot; ) {
		// TODO: Handle cancel action.
	}
}
…
$( &quot;button[xaction]&quot; ).click( button_clicked );
...&lt;/pre&gt;
&lt;p&gt;It&apos;s not that a function uses a lot of memory, but if you have a lot of functions that could become fewer by refactoring the code, it can add up to a lot of memory.&lt;/p&gt;
&lt;p&gt;Another reason I like this is the refactoring of code it self. I don&apos;t like to have functions that have 95% of the same functionality, then we can create a function that handles the 95% plus the last 5% percent from multiple functions.&lt;/p&gt;
</description>
        <pubDate>Sun, 25 Oct 2009 22:39:33 +0100</pubDate>
        <link>https://mabs.dk/javascript/web%20development/2009/10/25/reducing-memory-usage-with-javascript.html</link>
        <guid isPermaLink="true">https://mabs.dk/javascript/web%20development/2009/10/25/reducing-memory-usage-with-javascript.html</guid>
        
        <category>example</category>
        
        <category>Javascript</category>
        
        <category>memory leak</category>
        
        <category>patterns</category>
        
        
        <category>Javascript</category>
        
        <category>Web development</category>
        
      </item>
    
      <item>
        <title>jQuery-plugin: jquery.rightclick</title>
        <description>&lt;p&gt;I&apos;ve written a plugin for jQuery to handle right click events.&lt;/p&gt;
&lt;p&gt;The plugin provides two features:&lt;/p&gt;
&lt;h2&gt;$( ... ).disableContextMenu( condition_event );&lt;/h2&gt;
&lt;p&gt;This function disables the browsers build-in contextmenu (right-click menu on PC&apos;s).&lt;/p&gt;
&lt;p&gt;condition_event  - is an optional parameter, it&apos;s meant to be a function-reference to determine if the contextmenu should be shown, the function must return true if the menu is allowed to be shown and must return false if the menu is not to be shown. If condition_event is not provided or returns a non-boolean value, the contextmenu will be disabled.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please note: &lt;/strong&gt;This is not a way to stop your users from downloading images or viewing source code, this is only meant to be used as when it&apos;s better for the usability.&lt;/p&gt;
&lt;h2&gt;$( ... ).rightClick( callback, contextmenu_condition_event );&lt;/h2&gt;
&lt;p&gt;This function will let you create your own event for right click, it can be used to create your own contextmenu.&lt;/p&gt;
&lt;p&gt;It takes two paramters.&lt;/p&gt;
&lt;p&gt;callback - Is the event which will be called on right click. (required)&lt;/p&gt;
&lt;p&gt;contextmenu_condition_event - will be parsed to disableContextMenu.&lt;/p&gt;
&lt;p&gt;Extra functions:&lt;/p&gt;
&lt;p&gt;I also provide functions to remove these event from an element:&lt;/p&gt;
&lt;h2&gt;$( ... ).enableContextMenu( );&lt;/h2&gt;
&lt;p&gt;Will undo the function $( ... ).disableContextMenu( );&lt;/p&gt;
&lt;h2&gt;$( ... ).removeRightClick( );&lt;/h2&gt;
&lt;p&gt;Will remove the rightClick event from the element.&lt;/p&gt;
&lt;p&gt;License:&lt;/p&gt;
&lt;pre&gt;   Copyright (c) 2009 Morten Sjoegren &amp;lt;m_abs@mabs.dk&amp;gt;
   Permission is hereby granted, free of charge, to any person obtaining a copy
   of this software and associated documentation files (the &quot;Software&quot;),

 to deal
   in the Software without restriction, including without limitation the rights
   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   copies of the Software, and to permit persons to whom the Software is
   furnished to do so, subject to the following conditions:
   The above copyright notice and this permission notice shall be included in
   all copies or substantial portions of the Software.
   THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
   THE SOFTWARE.&lt;/pre&gt;
&lt;h1&gt;Download:&lt;/h1&gt;
&lt;p&gt;You can download the plugin including a simple example &lt;a href=&quot;/images/uploads/2009/06/jquery-rightclick-v1.0.zip&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Mon, 22 Jun 2009 20:01:47 +0200</pubDate>
        <link>https://mabs.dk/javascript/jquery%20plugin/web%20development/2009/06/22/jquery-rightclick.html</link>
        <guid isPermaLink="true">https://mabs.dk/javascript/jquery%20plugin/web%20development/2009/06/22/jquery-rightclick.html</guid>
        
        <category>documentation</category>
        
        <category>Javascript</category>
        
        <category>jquery</category>
        
        <category>plugin</category>
        
        <category>right-click contextmenu</category>
        
        
        <category>Javascript</category>
        
        <category>jQuery plugin</category>
        
        <category>Web development</category>
        
      </item>
    
      <item>
        <title>Banana cake with chocolate glaze</title>
        <description>&lt;p&gt;This is the recipe for my favorite cake, being a big guy there is some competition for this title. :)&lt;/p&gt;
&lt;p&gt;This is a recipe I got from a friends mother, who is a great cook. It&apos;s a banana cake with chocolate glaze.&lt;br /&gt;
Please note that this cake is in no way healthy to eat, but it taste great.&lt;/p&gt;
&lt;hr /&gt;&lt;strong&gt;Dough:&lt;/strong&gt;&lt;br /&gt;
225 grams of butter&lt;br /&gt;
460 grams of sugar&lt;br /&gt;
4 whole eggs&lt;br /&gt;
5 very ripe banana.&lt;br /&gt;
50 grams of chopped hazel nuts&lt;br /&gt;
50 grams of oatmeal&lt;br /&gt;
1 ¼ deciliter of buttermilk&lt;br /&gt;
½ tablespoon salt&lt;br /&gt;
2 tablespoon baking soda&lt;br /&gt;
2 tablespoon vanilla sugar&lt;br /&gt;
375 grams of flour&lt;br /&gt;
100 grams of chopped dark chocolate&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Glaze:&lt;/strong&gt;&lt;br /&gt;
100 grams of smelted dark chocolate&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is what you do:&lt;/strong&gt;&lt;br /&gt;
Smelt the butter and mix it with the sugar, add the eggs one at the time.&lt;br /&gt;
Squeeze the bananas and add them in the dough with the hazel nuts and the oatmeal.&lt;br /&gt;
Mix the flour, soda, baking soda, vanilla sugar and sieved it into the dough.&lt;br /&gt;
Stir the dough until it is uniform.&lt;/p&gt;
&lt;p&gt;Bake the cake in a greased form at 200 degrees Celsius for approx. 35 minutes.&lt;br /&gt;
When cake has cooled, melt the chocolate and glaze the cake with the smelted chocolate.&lt;/p&gt;
&lt;hr /&gt;&lt;strong&gt;Here is the original recipe in Danish:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt; Dej:&lt;/strong&gt;&lt;br /&gt;
225    gr.    Smør&lt;br /&gt;
460    gr.    Sukker&lt;br /&gt;
4    stk.    Æg&lt;br /&gt;
5    stk.    Meget modne bananer&lt;br /&gt;
50    gr.    Hakkede hassel nødder&lt;br /&gt;
50    gr.    Havregryn&lt;br /&gt;
1 ¼    dl.    Kærnemælk&lt;br /&gt;
½    tsk.    Salt&lt;br /&gt;
2    tsk.    Natron&lt;br /&gt;
2    tsk.    Vanillesukker&lt;br /&gt;
375    gr.    Mel&lt;br /&gt;
100     gr.    Hakket mørk chokolade&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pynt:&lt;/strong&gt;&lt;br /&gt;
200    gr.    Smeltet mørk chokolade&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fremgangsmåde:&lt;/strong&gt;&lt;br /&gt;
Smøret smeltes og blandes godt med sukkeret, æggene tilsættes et&lt;br /&gt;
af gangen. Bananerne moses og kommes i sammen med de&lt;br /&gt;
hakkede nødder og havregryn, kærnemælken hældes i.&lt;br /&gt;
Mel, natron, vanillesukker og salt blandes og sigtes i, dejen røres til&lt;br /&gt;
den er ensartet.&lt;br /&gt;
Bages i smurt form ved 200 grader i ca. 35 minutter&lt;br /&gt;
Når kagen er kølet af, smeltes chokoladen og fordeles over.&lt;/p&gt;
</description>
        <pubDate>Tue, 26 May 2009 19:01:09 +0200</pubDate>
        <link>https://mabs.dk/cake/2009/05/26/banana-cake-with-chocolate-glaze.html</link>
        <guid isPermaLink="true">https://mabs.dk/cake/2009/05/26/banana-cake-with-chocolate-glaze.html</guid>
        
        <category>banana</category>
        
        <category>cake</category>
        
        <category>chocolate</category>
        
        <category>the cake is not a lie</category>
        
        <category>there will be cake</category>
        
        
        <category>Cake</category>
        
      </item>
    
      <item>
        <title>Creating a custom dialog with jquery and jquery.blockUI</title>
        <description>&lt;p&gt;The goal of this article is to demostrate how to create a dialog with it own self-contained functionality using jQuery and blockUI.&lt;/p&gt;
&lt;p&gt;
    For this we need jQuery (v1.3.x) ((jQuery (v1.3.x) from &lt;a href=&quot;http://jquery.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer&quot;&gt;jquery.com&lt;/a&gt;)) and blockUI(v2.15+)
    ((blockUI(v2.15+) from &lt;a href=&quot;http://malsup.com/jquery/block/&quot;&gt;malsup.com&lt;/a&gt;)). I assume you have at least basic understanding of jQuery and JavaScript
    to make use of this article.
&lt;/p&gt;
&lt;p&gt;
    I tend to think of a dialog like an interface with it&apos;s own enclosure containing attributes, private functions and public functions. The idea is that we can
    reuse the functionality easily, just include the javascript-file in the webpage and call a function.
&lt;/p&gt;
&lt;p&gt;The dialog I&apos;ll create here is a dialog from which a user will select the size of a pair of jeans.&lt;/p&gt;
&lt;p&gt;
    I pack my code into a namespace, so I create the namespace first ((Covered in
    &lt;a href=&quot;http://www.mabs.dk/wordpress/index.php/2009/05/06/namespacing-in-javascript/&quot;&gt;Namespacing in JavaScript&lt;/a&gt;)). My dialog will be a subset of
    UI.dialog.
&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
var UI = {
  dialog : {}
};
&lt;/pre&gt;
&lt;p&gt;Now I can create the basic structure of our interface in a new file:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
( function( UI, $ ) {
  // Make sure the namespace exists.
  if ( !UI.dialog ) {
    UI.dialog = {};
  }

  // It this interface already loaded?
  if ( UI.dialog.selectSize ) {
    // If so don&apos;t intiate it again
    return;
  }

  // Attributes

  // Private functions

  // Public functions
  UI.dialog.selectSize = function( ) {
  };
} )( UI, jQuery );
&lt;/pre&gt;
&lt;p&gt;This piece of code shows the basic code-structure I use to create an interface.&lt;/p&gt;
&lt;p&gt;
    First I create an enclosure which is an anonymous function ((Covered in
    &lt;a href=&quot;http://www.mabs.dk/wordpress/index.php/2009/04/20/reintroducing-a-little-sanity-in-working-with-javascript/&quot;
        &gt;Reintroducing a little sanity in working with JavaScript&lt;/a
    &gt;)),
&lt;/p&gt;
&lt;p&gt;
    which is called immediately with the UI and jQuery parameter. Everything inside this enclosure is unreachable from the outside, unless I intentionally make
    it public by binding functions or variables to a global variable like UI.&lt;br /&gt;
    I these three sections in my enclosure:
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Attribute section&lt;/li&gt;
    &lt;li&gt;Private function section&lt;/li&gt;
    &lt;li&gt;Public function section&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In the same way I would have it in a class in C++ or Java, which is the model I used to come up with this.&lt;/p&gt;
&lt;p&gt;Now I&apos;ll create the HTML part of this dialog. I&apos;ll add the function setupHTML to the private functions section.&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
	function setupHTML( q, msg, sizes ) {
		// We need a group name to make exclusive selection in the radio buttons we are going to create.
		var group_name = &quot;size_&quot; + parseInt( Math.random( ) * 100, 10 );

		// Write the HTML much like the way, we would write it directly in our .html-file.
		var dd = &quot;&amp;lt;div style=&apos;text-align : left; cursor : default;&apos;&amp;gt;&quot;;
		dd += &quot;&amp;lt;div style=&apos;font-weight: bolder; padding-left:20px;padding-right:20px;&apos;&amp;gt;&quot; + msg + &quot;&amp;lt;/div&amp;gt;&quot;;

		// Add a radio-button for each size in our sizes, array.
		$.each( sizes, function( i, size ) {
			dd += &quot;&amp;lt;div&amp;gt;&quot;;
			dd += &quot;&amp;lt;input type=&apos;radio&apos; id=&apos;&quot; + group_name + &quot;_&quot; + i + &quot;&apos; style=&apos;margin-right: 8px;&apos; name=&apos;&quot; + group_name + &quot;&apos; value=&apos;&quot; + size + &quot;&apos; /&amp;gt;&quot;;
			dd += &quot;&amp;lt;label for=&apos;&quot; + group_name + &quot;_&quot; + i +  &quot;&apos;&amp;gt;&quot; + size + &quot;&amp;lt;/label&amp;gt;&quot;;
			dd += &quot;&amp;lt;/div&amp;gt;&quot;;
		} );
		
		// Add buttons
		dd += &quot;&amp;lt;div style=&apos;text-align: right; padding : 5px;&apos;&amp;gt;&quot;;
		dd += &quot;&amp;lt;button xvalue=&apos;okay&apos; disabled=&apos;disabled&apos;&amp;gt;Okay&amp;lt;/button&amp;gt;&quot;;
		dd += &quot;&amp;lt;button xvalue=&apos;cancel&apos;&amp;gt;Cancel&amp;lt;/button&amp;gt;&quot;;
		dd += &quot;&amp;lt;/div&amp;gt;&quot;;
		dd += &quot;&amp;lt;/div&amp;gt;&quot;;
		
		q.html( dd );
	}
&lt;/pre&gt;
&lt;p&gt;
    Now that we have the function for creating the HTML, we need to create the function to open the dialog.&lt;br /&gt;
    This function is called UI.dialog.selectSize(...) and takes three parameters:
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;msg // The message to the user&lt;/li&gt;
    &lt;li&gt;sizes // An array containing the available sizes&lt;/li&gt;
    &lt;li&gt;callback // The function is called after the user clicks &quot;okay&quot;. The first parameter in the callback function is the selected size&lt;/li&gt;
&lt;/ol&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
	UI.dialog.selectSize = function( msg, sizes, callback ) {
		// There is no point in showing the dialog without both msg and sizes
		if ( msg &amp;&amp; sizes ) {
			// Block the whole page
			$.blockUI( {
				message : $( &quot;&amp;lt;div id=&apos;select_size_overlay&apos;&amp;gt;&amp;lt;/div&amp;gt;&quot; ),


				css : {
					width : &quot;auto&quot;,
					height : &quot;auto&quot;
				}
			} );
			
			// The container for the dialog is the div I created above,
			// we need to find it and add the content to it.
			var q = $( &quot;#select_size_overlay&quot; );
			setupHTML( q, msg, sizes );
			
			// TODO: Handle events
		}
	};
&lt;/pre&gt;
&lt;p&gt;
    In this function I haven&apos;t added the events yet, this is because I haven&apos;t created the event functions yet.&lt;br /&gt;
    To limit the potential memory leaks in browsers like IE6, I choose not to make them inline event-functions but to make them private functions.&lt;br /&gt;
    The potential memory leak is that referencing DOM-element in inline function, creates an extra reference to that element which can confuse the garbage
    collector. The problem is increased if the function is inline, since it&apos;s created every time the parent function is call which could be many time.
&lt;/p&gt;
&lt;p&gt;I put my event functions in the private functions-section of my interface.&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
	function button_click_event( e ) {
		// Get the element that was clicked, which is e.target.
		// This should work in all browsers since jQuery have been so kind as to fix broken event-objects.
		var el = $( e.target );
		
		// Get data for this event
		// This is important since it holds reference to data from the UI.dialog.selectSize-function.
		var data = e.data;
		
		// The xvalue-attr tells the event-handler which action we want to perform.
		var xvalue = el.attr( &quot;xvalue&quot; );
		if ( xvalue == &quot;okay&quot; ) {
			// Is something selected?
			var radios = data.radios;
			var selected_val = radios.filter( &quot;:checked&quot; ).val( );
			if ( selected_val ) {
				if ( $.isFunction( data.callback ) ) {
					data.callback( selected_val );
				}
				
				$.unblockUI( );
			} else {
				// Should never happen, since the okay button should be disabled
				alert( &quot;You must select a size.&quot; );
			}
		} else if ( xvalue == &quot;cancel&quot; ) {
			$.unblockUI( );
		}
	}
	
	function radio_click_event( e ) {
		// Get the element that was clicked.
		var el = $( e.target );
		
		// Get data for this event
		var data = e.data;

		// Toggle okay-button on/off on selection
		var radios = data.radios;
		var okay_button = data.buttons.filter( &quot;[xvalue=okay]&quot; );
		if ( radios.filter( &quot;:checked&quot; ).size( ) &amp;gt; 0 ) {
			okay_button.removeAttr( &quot;disabled&quot; );
		} else {
			okay_button.attr( &quot;disabled&quot;, &quot;disabled&quot; );
		}
	}
&lt;/pre&gt;
&lt;p&gt;Now that these event-functions have been created I can bind them in the UI.dialog.selectSize-function:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
	UI.dialog.selectSize = function( msg, sizes, callback ) {
		// There is no point in showing the dialog without both msg and sizes
		if ( msg &amp;&amp; sizes ) {
			// Block the whole page
			$.blockUI( {
				message : $( &quot;&amp;lt;div id=&apos;select_size_overlay&apos;&amp;gt;&amp;lt;/div&amp;gt;&quot; ),


				css : {
					width : &quot;auto&quot;,
					height : &quot;auto&quot;
				}
			} );
			
			// The container for the dialog is the div I created above,
			// we need to find it and add the content to it.
			var q = $( &quot;#select_size_overlay&quot; );
			setupHTML( q, msg, sizes );
			
			// Inorder for the dialog to work, we need to bind some event to the elements in it.
			var buttons = q.find( &quot;button[xvalue]&quot; );
			var radios = q.find( &quot;input[type=radio]&quot; );
		
			// Handle events
			
			// I&apos;m using jQuery&apos;s bind function to bind the events to the elements and to parse data to those events.
			// I can&apos;t use buttons.click( button_click_event ),

 because I need to parse some extra data to the events.

			// Handle click event for the buttons
			buttons.bind( &quot;click&quot;, {
				callback : callback,
				buttons : buttons,
				radios : radios
			}, button_click_event );
			
			// Handle click event for the radio-buttons
			radios.bind( &quot;click&quot;, {
				buttons : buttons,
				radios : radios
			}, radio_click_event );
		}
	};
&lt;/pre&gt;
&lt;p&gt;
    Now I&apos;m done with writing the dialog interface, here is the entire code including jslint parameters ((I prefer to run all my JS-code through jslint to find
    hidden errors.)):
&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
/*jslint undef: true, browser: true */

/*global jQuery, UI */

( function( UI, $ ) {
	if ( !UI.dialog ) {
		// This is part of the UI.dialog namespace, if the namespace doesn&apos;t exist create the namespace object
		UI.dialog = {};
	}

	// It this interface already loaded?
	if ( UI.dialog.selectSize ) {
		return;
	}

	// Attributes

	// Private functions
	function setupHTML( q, msg, sizes ) {
		// We need a group name to make exclusive selection in the radio buttons we are going to create.
		var group_name = &quot;size_&quot; + parseInt( Math.random( ) * 100, 10 );

		// Write the HTML much like the way, we would write it directly in our .html-file.
		var dd = &quot;&amp;lt;div style=&apos;text-align : left; cursor : default;&apos;&amp;gt;&quot;;
		dd += &quot;&amp;lt;div style=&apos;font-weight: bolder; padding-left:20px;padding-right:20px;&apos;&amp;gt;&quot; + msg + &quot;&amp;lt;/div&amp;gt;&quot;;

		// Add a radio-button for each size in our sizes, array.
		$.each( sizes, function( i, size ) {
			dd += &quot;&amp;lt;div&amp;gt;&quot;;
			dd += &quot;&amp;lt;input type=&apos;radio&apos; id=&apos;&quot; + group_name + &quot;_&quot; + i + &quot;&apos; style=&apos;margin-right: 8px;&apos; name=&apos;&quot; + group_name + &quot;&apos; value=&apos;&quot; + size + &quot;&apos; /&amp;gt;&quot;;
			dd += &quot;&amp;lt;label for=&apos;&quot; + group_name + &quot;_&quot; + i +  &quot;&apos;&amp;gt;&quot; + size + &quot;&amp;lt;/label&amp;gt;&quot;;
			dd += &quot;&amp;lt;/div&amp;gt;&quot;;
		} );
		
		// Add buttons
		dd += &quot;&amp;lt;div style=&apos;text-align: right; padding : 5px;&apos;&amp;gt;&quot;;
		dd += &quot;&amp;lt;button xvalue=&apos;okay&apos; disabled=&apos;disabled&apos;&amp;gt;Okay&amp;lt;/button&amp;gt;&quot;;
		dd += &quot;&amp;lt;button xvalue=&apos;cancel&apos;&amp;gt;Cancel&amp;lt;/button&amp;gt;&quot;;
		dd += &quot;&amp;lt;/div&amp;gt;&quot;;
		dd += &quot;&amp;lt;/div&amp;gt;&quot;;
		
		q.html( dd );
	}

	/*
	 * Event for handling click on any button in the overlay
	 */
	function button_click_event( e ) {
		// Get the element that was clicked. jQuery fixes the incompatibility between browsers&apos; event-object (e).
		var el = $( e.target );
		
		// Get data for this event
		var data = e.data;
		
		// The xvalue-attr tells the event-handler which action we want to perform.
		var xvalue = el.attr( &quot;xvalue&quot; );
		if ( xvalue == &quot;okay&quot; ) {
			// Is something selected?
			var radios = data.radios;
			var selected_val = radios.filter( &quot;:checked&quot; ).val( );
			if ( selected_val ) {
				if ( $.isFunction( data.callback ) ) {
					data.callback( selected_val );
				}
				
				$.unblockUI( );
			} else {
				// Should never happen, since the okay button should be disabled
				alert( &quot;You must select a size.&quot; );
			}
		} else if ( xvalue == &quot;cancel&quot; ) {
			$.unblockUI( );
		}
	}
	
	function radio_click_event( e ) {
		// Get the element that was clicked. jQuery fixes the incompatibility between browsers&apos; event-object (e).
		var el = $( e.target );
		
		// Get data for this event
		var data = e.data;

		// Toggle okay-button on/off on selection
		var radios = data.radios;
		var okay_button = data.buttons.filter( &quot;[xvalue=okay]&quot; );
		if ( radios.filter( &quot;:checked&quot; ).size( ) &amp;gt; 0 ) {
			okay_button.removeAttr( &quot;disabled&quot; );
		} else {
			okay_button.attr( &quot;disabled&quot;, &quot;disabled&quot; );
		}
	}
	
	// Public functions
	UI.dialog.selectSize = function( msg, sizes, callback ) {
		if ( msg &amp;&amp; sizes ) {
			$.blockUI( {
				message : $( &quot;&amp;lt;div id=&apos;select_size_overlay&apos;&amp;gt;&amp;lt;/div&amp;gt;&quot; ),


				css : {
					width : &quot;auto&quot;,
					height : &quot;auto&quot;
				}
			} );
			
			var q = $( &quot;#select_size_overlay&quot; );
			setupHTML( q, msg, sizes );
			
			var buttons = q.find( &quot;button[xvalue]&quot; );
			var radios = q.find( &quot;input[type=radio]&quot; );
		
			// Handle events

			// Handle click event for the buttons
			buttons.bind( &quot;click&quot;, {
				callback : callback,
				buttons : buttons,
				radios : radios
			}, button_click_event );
			
			// Handle click event for the radio-buttons
			radios.bind( &quot;click&quot;, {
				buttons : buttons,
				radios : radios
			}, radio_click_event );
		}
	};
} ) ( UI, jQuery );
&lt;/pre&gt;
&lt;p&gt;Using the dialog is as simple as this:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
	UI.dialog.selectSize( &quot;Select size of the jeans&quot;, [
	  &quot;xx-small&quot;, &quot;x-small&quot;, &quot;small&quot;, &quot;medium&quot;, &quot;large&quot;, &quot;x-large&quot;, &quot;xx-large&quot;, &quot;xxx-large&quot;, &quot;xxxx-large&quot;
	], function( size ) {
		// TODO: Do something usefull with the size
		alert( size );
	} );
&lt;/pre&gt;
</description>
        <pubDate>Wed, 13 May 2009 18:00:01 +0200</pubDate>
        <link>https://mabs.dk/css/javascript/web%20development/2009/05/13/creating-a-custom-dialog-with-jquery-and-jqueryblockui.html</link>
        <guid isPermaLink="true">https://mabs.dk/css/javascript/web%20development/2009/05/13/creating-a-custom-dialog-with-jquery-and-jqueryblockui.html</guid>
        
        <category>blockUI</category>
        
        <category>code</category>
        
        <category>dialog</category>
        
        <category>example</category>
        
        <category>Javascript</category>
        
        <category>jquery</category>
        
        <category>UI</category>
        
        
        <category>CSS</category>
        
        <category>Javascript</category>
        
        <category>Web development</category>
        
      </item>
    
      <item>
        <title>Learning to get more out of jQuery</title>
        <description>&lt;p&gt;A quick recommendation for the people who want to learn more about using jQuery. &lt;/p&gt;
&lt;p&gt;There is a great site called &lt;a href=&quot;http://jqueryfordesigners.com&quot;&gt;jQuery for designers&lt;/a&gt;, on this site you find video tutorials and articles for using jQuery. You can learn how to make great effects on your site with very little code using jQuery.&lt;/p&gt;
&lt;p&gt;I hope you find that site as useful as I did.&lt;/p&gt;
</description>
        <pubDate>Mon, 11 May 2009 00:00:04 +0200</pubDate>
        <link>https://mabs.dk/javascript/web%20development/2009/05/11/learning-to-get-more-out-of-jquery.html</link>
        <guid isPermaLink="true">https://mabs.dk/javascript/web%20development/2009/05/11/learning-to-get-more-out-of-jquery.html</guid>
        
        <category>effects</category>
        
        <category>jquery</category>
        
        <category>recommendation</category>
        
        
        <category>Javascript</category>
        
        <category>Web development</category>
        
      </item>
    
      <item>
        <title>Namespacing in JavaScript</title>
        <description>&lt;p&gt;To structure my javascript code I&apos;ve developed a namespace scheme ((Javascript doesn&apos;t really have namespaces so we need to fake them)). Namespace is used in languages like C++ to group functionality and data, it&apos;s also used in Java but referred to as packages.&lt;/p&gt;
&lt;p&gt;Coming from a C++ background with structure I wanted to impose a kind of order to my JavaScript code. Prior the using namespace almost all my functions were global functions and they had longer and longer names like this:&lt;br /&gt;
data_sentences_get( sent_id ) {...}&lt;/p&gt;
&lt;p&gt;To get some structure on this I decided to have two global objects:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
	var UI = [];
	var Data = [];
&lt;/pre&gt;
&lt;p&gt;UI is the top-level namespace for all my UI functions.&lt;br /&gt;
Data is the top-level namespace for all data-processing and retrival functions.&lt;/p&gt;
&lt;p&gt;In this scheme the above mentioned function would be defined like this:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
( function( Data ) {
	if ( Data.sentences ) {
		return; // Already defined, don&apos;t do it again.
	}

	// Create the sentences namespace object.
	Data.sentences = [];

	// Create a short hand reference to it.
	var ref = Data.sentences;

	ref.get = function( sent_id ) {
		// TODO
	};
} )( Data );
&lt;/pre&gt;
&lt;p&gt;In this example I create the namespace Data.sentences (I know this is actually an object) and create the function “Data.sentences.get( sent_id )”.&lt;/p&gt;
&lt;p&gt;This structure gives me some benefits. The first is the grouping of functions which help me structure my code, the second is that I can have private data and functions for each namespace ((Covered in the article&lt;br /&gt;
&lt;a href=&quot;/css/javascript/job/web%20development/2009/04/20/reintroducing-a-little-sanity-in-working-with-javascript.html&quot;&gt;Reintroducing a little sanity in working with JavaScript&lt;/a&gt;)) and the third is that I can use dynamic load functions as needed.&lt;/p&gt;
&lt;p&gt;Jquery have a useful function called $.getScript, it&apos;s used to dynamically load JavaScript-files to the webpage. Since we have the namespace objects and JavaScript allows us to extend already initiated objects, we have an easy way to load new functions and to check if they have been loaded.&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
….
	if ( Data.sentences ) {
		Data.sentences.get( 1 );
	} else {
		$.getScript( “data_sentences.js”, function( ) {
			Data.sentences.get( 1 );
		} );
	}
...
&lt;/pre&gt;
&lt;p&gt;If you have a large web application, you might want to save memory or bandwidth by only loading functionality as needed. You might need 100kB+ of JavaScript code for a component your users might use less then 1% of the time, this costs bandwidth and load time.&lt;/p&gt;
&lt;p&gt;But &lt;i&gt;if&lt;/i&gt; you do this you need to consider what could go &lt;b&gt;wrong&lt;/b&gt;. If the server or connection is slow, loading code might make the interface fell slow since the user will have to wait for the code to be loaded. There is the possibility that the request fails or times out, you need to handle this problem or the interface might be appear to have frozen. There is also the possibility, that the version of code on the server is incompatible with the version of code the browser has (this shouldn&apos;t happen. If it does something is wrong with you development process).&lt;/p&gt;
</description>
        <pubDate>Wed, 06 May 2009 15:46:16 +0200</pubDate>
        <link>https://mabs.dk/javascript/web%20development/2009/05/06/namespacing-in-javascript.html</link>
        <guid isPermaLink="true">https://mabs.dk/javascript/web%20development/2009/05/06/namespacing-in-javascript.html</guid>
        
        <category>Javascript</category>
        
        <category>jquery</category>
        
        <category>namespace</category>
        
        <category>structure</category>
        
        
        <category>Javascript</category>
        
        <category>Web development</category>
        
      </item>
    
      <item>
        <title>Backup using encryption and gmail</title>
        <description>&lt;p&gt;Today I was a bit bored, so I wrote a script to backup up my personal svn repository. I use my svn-server for my personal projects and to keep a history of my personal documents. So I don&apos;t want to loose the data in my repository.&lt;/p&gt;
&lt;p&gt;The repository is already on a RAID1, but I don&apos;t think this is enough. I use Google Apps for hosting my mail (it&apos;s GMail) and this gives me more disk-space then I could use on ordinary emails, so I&apos;ve decided to utilize this for my backups. Both because I&apos;ve the space and because I assume Google has a better backup system then anything I could afford.&lt;/p&gt;
&lt;p&gt;I&apos;ve written a script that compresses and encrypts to content of a directory, the archive created is then emailed to my backup email account.&lt;/p&gt;
&lt;p&gt;This script is set to run once a day, but the email is only sent if  something has changed since the last time it&apos;s sent to my email. This is to save space.&lt;/p&gt;
&lt;p&gt;I encrypt the archive because email isn&apos;t all that private. The data isn&apos;t sensitive, but I would still like to minimize the risk of it falling into other peoples hands.&lt;/p&gt;
&lt;p&gt;The script splits the backup into 20MB pieces because of the limits on the gmail-smtp.&lt;/p&gt;
&lt;p&gt;Well enough text, here is my script:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;
#!/bin/bash

mkdir -p ${HOME}/tmp

DATE=`date +%Y%m%d-%H:%M:%S`
BACKUP_DIR=&quot;svn&quot; # Name of directory to backup, NOT PATH.
PARENT_DIR=&quot;/home&quot; # Path to the parent dir for the backup directory

BASE_FILENAME=&quot;${HOME}/tmp/svn_backup&quot; # Base path for the working files for this backup
NEW_TAR_FILENAME=&quot;${BASE_FILENAME}.tar&quot; # Working path to the tar archive
OLD_TAR_FILENAME=&quot;${BASE_FILENAME}_old.tar&quot; # Path to the old tar archive, this will be used to see if changes have happend since last time.
NEW_LZMA_FILENAME=&quot;${BASE_FILENAME}-${DATE}.tar.lzma&quot; # Path to the lzma-compress archive of the backup.
NEW_GPG_FILENAME=&quot;${NEW_LZMA_FILENAME}.gpg&quot; # Path to the gpg encrypted file containing the back

EMAIL=&quot;target@domain.com&quot; # Target email for our backup

SPLIT_SIZE=&quot;20MB&quot; # How big do we want the pieces to be, I choose 20MB since that&apos;s the maximum file size gmail allows.

# Change dir to the parent dir.
cd ${PARENT_DIR}
echo &quot;Generating tar-archive&quot;
tar cp ${BACKUP_DIR} &gt; ${NEW_TAR_FILENAME}

if [ -f ${OLD_TAR_FILENAME} ]; then
	# if an old copy of the archive exist, check if the new one is different
	echo &quot;Old tar-archive exists.&quot;
	diff -q ${NEW_TAR_FILENAME} ${OLD_TAR_FILENAME} &amp;&amp; \
		echo &quot;They are the same, nothing has changed stopping.&quot; &amp;&amp; \
		rm -f &quot;${NEW_TAR_FILENAME}&quot; &amp;&amp; exit 0
fi

echo &quot;Compressing backup with lzma: `date`&quot;
lzma -z -9 - &lt; ${NEW_TAR_FILENAME} &gt; ${NEW_LZMA_FILENAME}

echo &quot;Encrypting backup with gpg: `date`&quot;
gpg -r &quot;m_abs@mabs.dk&quot; -e - &lt; ${NEW_LZMA_FILENAME} &gt; ${NEW_GPG_FILENAME}
rm -v ${NEW_LZMA_FILENAME}

echo &quot;Splitting encrypted file: `date`&quot;
split ${NEW_GPG_FILENAME} -b 20MB &quot;${NEW_GPG_FILENAME}_&quot;
rm -v ${NEW_GPG_FILENAME}

# How many pieces is there? This is need because I want to write it in the email.
c=0;
for filename in ${NEW_GPG_FILENAME}_[a-z]*; do
	let &quot;c=${c}+1&quot;;
done

# Sent every piece of this backup to the target email.
i=0;
for filename in ${NEW_GPG_FILENAME}_[a-z]*; do
	let &quot;i=${i}+1&quot;;
	echo &quot;Sending email ${i}: `date`&quot;
	echo &quot;SVN backup - ${DATE}&quot; | mutt -s &quot;SVN backup part ${i}/${c} - ${DATE}&quot; ${EMAIL} -a ${filename}
	rm -v ${filename}
done

mv -v ${NEW_TAR_FILENAME} ${OLD_TAR_FILENAME}
exit 0
&lt;/pre&gt;
&lt;p&gt;Save it to a file, place the file ((remember to name the file to the run-parts specification, see man run-parts)) in /etc/cron.daily and make it executable.&lt;/p&gt;
&lt;p&gt;In order for this script to work I needed a few packages installed on my Gentoo installation, mutt and ssmtp.&lt;/p&gt;
&lt;p&gt;I&apos;m gmails smtp-server to sent the emails, I&apos;ve created a special email-account for this so that I don&apos;t have to use my everyday email account for this. This is my /etc/ssmtp/ssmtp.conf&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;
# The person who gets all mail for userids &lt; 1000
# Make this empty to disable rewriting.
root=postmaster

# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and your mailhub is so named.
mailhub=mail

root=sender@domain.com
mailhub=smtp.gmail.com:587
rewriteDomain=
hostname=sender@domain.com
UseSTARTTLS=YES
AuthUser=sender@domain.com
AuthPass=password
FromLineOverride=YES
&lt;/pre&gt;
&lt;p&gt;To encrypt in this script I use GPG and a self generated key.&lt;br /&gt;
To generate the key run the command &quot;gpg --gen-key&quot; and follow the wizard. And export the public key from the machine you created it on and import it on the server you are going to run the script.&lt;br /&gt;
Exporting the key:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;
host# gpg --list-keys
/home/user/.gnupg/pubring.gpg
-----------------------------
pub   1024D/112A2538 2009-04-21
uid                  Firstname Lastname &lt;user@domain.com&gt;
sub   4096g/AEFA304A 2009-04-21
host# gpg --export &quot;Firstname Lastname &lt;user@domain.com&gt;&quot; &gt; key.pub
&lt;/pre&gt;
&lt;p&gt;Once you have transfered the key to the server import it with and set trust-level to ultimate on this key, or the backup script will stop and wait for you to answer if you really trust the key.&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;
server# gpg --import key.pub
server# gpg --edit-key user@domain.com
command&amp;gt; trust
Please decide how far you trust this user to correctly verify other users&apos; keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don&apos;t know or won&apos;t say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y
Command&amp;gt; quit
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Restoring the backup:&lt;/strong&gt;&lt;br /&gt;
Get the files from the email, this can take a while if there are many pieces. &lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;
host# basename=svn_backup-20090421-20:20:33.tar.lzma

host#  for filename in $basename_[a-z]*; do
cat $filename &amp;gt;&amp;gt; $basename
done

host# lzma -d &lt; ${basename} | tar cvp
&lt;/pre&gt;
&lt;p&gt;This should do the trick. The reason I use a for loop and don&apos;t just &quot;cat $basename*&gt;&gt;$basename&quot; is that with danish locale &quot;aa&quot; is perceive like å which is the last letter in the danish alphabet and this messes up the file order for cat.&lt;/p&gt;
</description>
        <pubDate>Tue, 21 Apr 2009 22:00:49 +0200</pubDate>
        <link>https://mabs.dk/linux/2009/04/21/backup-using-encryption-and-gmail.html</link>
        <guid isPermaLink="true">https://mabs.dk/linux/2009/04/21/backup-using-encryption-and-gmail.html</guid>
        
        <category>backup</category>
        
        <category>bored</category>
        
        <category>encrypt</category>
        
        <category>gentoo</category>
        
        <category>gmail</category>
        
        <category>gpg</category>
        
        <category>mail</category>
        
        <category>script</category>
        
        <category>subversion</category>
        
        <category>svn</category>
        
        
        <category>Linux</category>
        
      </item>
    
      <item>
        <title>Reintroducing a little sanity in working with JavaScript</title>
        <description>&lt;p&gt;When I first started working with JavaScript (JS),&lt;/p&gt;
&lt;p&gt; I came from a background working with type-safe languages like Java and C++. &lt;/p&gt;
&lt;p&gt;Working with JavaScript wasn&apos;t as much fun as working with C++ and Java. JavaScript has a very poor image and there are several problems with the language which can lead to very bad coding.&lt;/p&gt;
&lt;p&gt;One of the main problems I had with JavaScript was the lack of encapsulation of data, the API especially the DOM-API is rather horrible and the browser compatibility can be a mess. Jquery fixes both the problem with DOM-API and the problem with cross-browser development by wrapping is up in a much more developer-friendly API. &lt;/p&gt;
&lt;p&gt;Some of the things I learned from working with the JS-library jQuery, was how to exploit JS&apos;s features to get the encapsulation required to make my code a lot cleaner.&lt;/p&gt;
&lt;p&gt;Around the same time I started using jQuery ((http://jquery.com)),&lt;/p&gt;
&lt;p&gt; I also started using jslint ((http://www.jslint.com/)) to increase the code quality and reduce stupid mistakes.&lt;/p&gt;
&lt;p&gt;Jslint is a tool that looks for problems in JS source code. On their website you can copy &amp; paste source code into a form to check the code or you can use a standalone version ((http://www.jslint.com/rhino/index.html or http://www.jslint.com/wsh/index.html)) &lt;/p&gt;
&lt;p&gt;The benefit from using a tool like jslint is that you find problems with the code, you might not find testing it in a browser or would that a long time to find. Jslint is mean and might hurt your feelings, but your code will be much better if you follow the advise it gives you.&lt;/p&gt;
&lt;p&gt;In your source file, you can add options to the jslint parser. These are the options I normally use:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
/*jslint undef: true, browser: true */
/*global jQuery, $*/
&lt;/pre&gt;
&lt;p&gt;The first line is options for jslint undef: true will give a warning if a variable or function is used that hasn&apos;t been defined or is used before it&apos;s defined. browser: true, tells jslint that this script is meant to run in a web-browser and therefor allows variables the browser provides.&lt;/p&gt;
&lt;p&gt;The second line tells jslint which global variable are available in this case jQuery and $ because I intend to use jQuery.&lt;/p&gt;
&lt;p&gt;To encapsulate my code I use this structure:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
/*jslint undef: true, browser: true */
/*global jQuery, $*/

( function( $ ) {
	// Private variables

	// Private functions

	// Public functions
} )( jQuery );
&lt;/pre&gt;
&lt;p&gt;What happens here is that I create an anonymous function which is called immediate with a reference to the jQuery object. This function can only get called once.&lt;br /&gt;
Inside this function I&apos;ve three sections:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Private variables&lt;/li&gt;
&lt;li&gt;Private functions&lt;/li&gt;
&lt;li&gt;Public functions&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You&apos;ll notice this is much like a class definition is Java or C++, which is my intension to mimic. ((If you want to make objects from this function: Name the function and remove the implicit call to it ( jQuery ). Then you can call it with new and create an instance of it. ))&lt;br /&gt;
In the first two sections I put variables and functions, that can only be reached from within the anonymous outer function.&lt;/p&gt;
&lt;p&gt;I&apos;ll now write a very simple plug-in to jQuery using this structure.&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
/*jslint undef: true, browser: true */
/*global jQuery, $*/

( function( $ ) {
	// Private variables
	var enabled = false;

	// Private functions
	var switchPageBackgroundColor = function( ) {
		$( document.body ).css( {
			&quot;background-color&quot; : &quot;#ABBEEC&quot;,
		} );
		enabled = true;
	};

	var switchOfPageBackgroundColor = function( ) {
		$( document.body ).css( {
			&quot;background-color&quot; : &quot;&quot;
		} );
		enabled = false;
	};

	// Public functions
	$.switchPageBackgroundColor = function( ) {
		if ( !enabled ) {
			switchPageBackgroundColor( );
		}
	};

	$.switchOfPageBackgroundColor = function( ) {
		if ( enabled ) {
			switchOfPageBackgroundColor( );
		}
	};
} )( jQuery );
&lt;/pre&gt;
&lt;p&gt;This code adds two public functions to the jQuery object  switchPageBackgroundColor and  switchOfPageBackgroundColor. These two functions are little more then wrappers to the private functions, but it&apos;s impossible to call the private functions directly from outside of the anonymous function.&lt;/p&gt;
&lt;p&gt;But wait!!! This code has a bug that breaks the code in IE but not in Firefox, can you spot this error?  &lt;/p&gt;
&lt;p&gt;If you run this code through jslint you should get this error:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;py&quot;&gt;
Lint at line 11 character 44: Extra comma.
&quot;background-color&quot; : &quot;#ABBEEC&quot;,
&lt;/pre&gt;
&lt;p&gt;You might be able to find such an error on your own, but imagine you maintained a large website with 20k+ lines of JS code and you introduced such a bug. How would you find it?&lt;/p&gt;
&lt;p&gt;When I worked for ScioSphere I created strict guidelines for the JS source code which I were responsible for. The first and most important rule in those guidelines were “Nothing gets committed or deployed without passing the jslint test”.&lt;/p&gt;
&lt;p&gt;Code without the error:&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;js&quot;&gt;
/*jslint undef: true, browser: true */
/*global jQuery, $*/

( function( $ ) {
	// Private variables
	var enabled = false;

	// Private functions
	var switchPageBackgroundColor = function( ) {
		$( document.body ).css( {
			&quot;background-color&quot; : &quot;#ABBEEC&quot;
		} );
		enabled = true;
	};

	var switchOfPageBackgroundColor = function( ) {
		$( document.body ).css( {
			&quot;background-color&quot; : &quot;&quot;
		} );
		enabled = false;
	};

	// Public functions
	$.switchPageBackgroundColor = function( ) {
		if ( !enabled ) {
			switchPageBackgroundColor( );
		}
	};

	$.switchOfPageBackgroundColor = function( ) {
		if ( enabled ) {
			switchOfPageBackgroundColor( );
		}
	};
} )( jQuery );
&lt;/pre&gt;
</description>
        <pubDate>Mon, 20 Apr 2009 12:00:46 +0200</pubDate>
        <link>https://mabs.dk/css/javascript/job/web%20development/2009/04/20/reintroducing-a-little-sanity-in-working-with-javascript.html</link>
        <guid isPermaLink="true">https://mabs.dk/css/javascript/job/web%20development/2009/04/20/reintroducing-a-little-sanity-in-working-with-javascript.html</guid>
        
        <category>class</category>
        
        <category>encapsulation</category>
        
        <category>example</category>
        
        <category>Javascript</category>
        
        <category>jquery</category>
        
        <category>jslint</category>
        
        <category>sanity</category>
        
        
        <category>CSS</category>
        
        <category>Javascript</category>
        
        <category>Job</category>
        
        <category>Web development</category>
        
      </item>
    
      <item>
        <title>Unexpected benefits from even small contributions to Open Source</title>
        <description>&lt;p&gt;Once long ago I had a problem with Kopete ((KDE&apos;s instant messaging client http://kopete.kde.org/)). The problem was that the notification dialog got in the way and it didn&apos;t hide it self, if the user didn&apos;t react to it. This was especially a problem while I was playing a game, since the dialog got on top and covered the game.&lt;/p&gt;
&lt;p&gt;After a while I decided to fix the problem myself and I took the time to look into Kopete&apos;s notification code and wrote a simple patch, which added a timeout which hid the dialog and added a settings interface to set the timeout delay.&lt;/p&gt;
&lt;p&gt;I submitted the patch to the developers of Kopete, after a while one of them got back to me.  His name was Jan Ritzerfeld, he improved my patch which were added to Kopete in KDE3.5. Something I&apos;m extremely proud of :).&lt;/p&gt;
&lt;p&gt;This is my original bug report about this: http://bugs.kde.org/show_bug.cgi?id=108967&lt;/p&gt;
&lt;p&gt;When I made this patch, I was looking my first job after finishing my education as a &quot;datamatiker&quot; and my job hunt wasn&apos;t going all that well for me.&lt;/p&gt;
&lt;p&gt;In 2006, I got called in for a job interview with a company called Sapio Systems. For this interview I got a theoretical problem to solve and my solution was to be presented at the job interview.&lt;/p&gt;
&lt;p&gt;At the interview we talked about my education, the few projects I had been involved with since my graduation, the time I used helping other Linux users online, my patch for Kopete and finally my solution to the problem I&apos;d been given.&lt;/p&gt;
&lt;p&gt;Well, I had misunderstood the problem and my solution was wrong. During the interview I was so nervous that I sold my skills short and having solved the problem wrong, I was sure that I had completely blown my chances at getting this job.&lt;/p&gt;
&lt;p&gt;To my great surprise they called me back and I got a second chance which meant a week to solve a practical assignment, writing a small application which looked for unknown words in a text file and a web-interface for it.&lt;/p&gt;
&lt;p&gt;This task I handled much better and they gave me my first real job as a developer and I had the job for almost three years. Which gave me a lot of experience and I had a lot of fun developing ScioSphere.&lt;/p&gt;
&lt;p&gt;For a long time I didn&apos;t understand why I got this important second chance. I recently found out they were very impressed that I had code in Kopete and thought that I&apos;d sold my skills short at the interview.&lt;/p&gt;
&lt;p&gt;I hadn&apos;t actually thought that this patch was all that important and had mostly mentioned it because I had so little to show, but without this contribution I don&apos;t think I&apos;d got that second chance to prove myself.&lt;/p&gt;
&lt;p&gt;The lesson I think can be learned from this is that unexpected great rewards can come from small contributions.&lt;/p&gt;
</description>
        <pubDate>Wed, 01 Apr 2009 12:00:45 +0200</pubDate>
        <link>https://mabs.dk/job/open%20source/2009/04/01/unexpected-benefits-from-even-small-contributions-to-open-source.html</link>
        <guid isPermaLink="true">https://mabs.dk/job/open%20source/2009/04/01/unexpected-benefits-from-even-small-contributions-to-open-source.html</guid>
        
        <category>anecdote</category>
        
        <category>contribution</category>
        
        <category>job interview</category>
        
        <category>kde</category>
        
        <category>kopete</category>
        
        <category>Open Source</category>
        
        <category>patch</category>
        
        
        <category>Job</category>
        
        <category>Open Source</category>
        
      </item>
    
  </channel>
</rss>
