<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8982539204068602702</id><updated>2026-11-03T00:22:19.040-08:00</updated><category term="tips"/><category term="tricks"/><category term="macosx"/><category term="groovy"/><category term="jenkins"/><category term="experience"/><category term="Blog"/><category term="Featured"/><category term="OSX"/><category term="installer"/><category term="programming"/><category term="Familie"/><category term="Spass"/><category term="development"/><category term="dontforget"/><category term="flex"/><category term="fun"/><category term="german"/><category term="knowhow"/><category term="webdev"/><category term="Kinder"/><category term="Meinung"/><category term="adobe"/><category term="android"/><category term="brackets"/><category term="california"/><category term="ci"/><category term="cli"/><category term="coding"/><category term="coffee"/><category term="deutsch"/><category term="ebook"/><category term="eclipse"/><category term="git"/><category term="gradle"/><category term="ios"/><category term="iphone"/><category term="javascript"/><category term="learn"/><category term="meetup"/><category term="news"/><category term="nook"/><category term="noteworthy"/><category term="perforce"/><category term="photo"/><category term="programmieren"/><category term="remember"/><category term="reminder"/><category term="san francisco"/><category term="shell"/><category term="sommer"/><category term="sport"/><category term="thoughts"/><category term="training"/><category term="usa"/><category term="Android Wear"/><category term="Installation"/><category term="Legoland"/><category term="Lennart"/><category term="Moto360"/><category term="NAS"/><category term="Nexus7"/><category term="OpenSource"/><category term="Owncloud"/><category term="Synology"/><category term="TILT"/><category term="Urlaub"/><category term="Zahn"/><category term="Zuhause"/><category term="air"/><category term="arbeit"/><category term="as3"/><category term="automation"/><category term="bash"/><category term="bilder"/><category term="books"/><category term="camera"/><category term="ccd"/><category term="christmas"/><category term="clean-code-developer"/><category term="command line"/><category term="console"/><category term="content"/><category term="contribution"/><category term="cycling"/><category term="dvcs"/><category term="dxo"/><category term="dxo-one"/><category term="ehrlichkeit"/><category term="electron"/><category term="electron-shell"/><category term="english"/><category term="epub"/><category term="ereader"/><category term="flash"/><category term="flash video"/><category term="friends"/><category term="google"/><category term="grails"/><category term="grape"/><category term="growl"/><category term="help"/><category term="info"/><category term="intellij"/><category term="ivy"/><category term="java"/><category term="jfrog"/><category term="job"/><category term="latex"/><category term="learning"/><category term="linkedin"/><category term="livescribe"/><category term="mercurial"/><category term="nodejs"/><category term="notes"/><category term="notetomyself"/><category term="nottoserious"/><category term="npm"/><category term="oneliner"/><category term="opinion"/><category term="oss"/><category term="performance"/><category term="pferd"/><category term="philosophy"/><category term="promo"/><category term="python"/><category term="quicktime"/><category term="rails"/><category term="repository"/><category term="resolver"/><category term="review"/><category term="ruby"/><category term="running"/><category term="setup"/><category term="spring"/><category term="summary"/><category term="summit"/><category term="sun"/><category term="swift"/><category term="travel"/><category term="university"/><category term="vcs"/><category term="vmware"/><category term="weihnachten"/><category term="windows"/><category term="writing"/><title type='text'>today is tomorrow&#39;s past</title><subtitle type='html'>random thoughts about computer tech, web technologies, javascript, nodejs, groovy, java, webdev, process automation, jenkins, eclipse, android and stuff that worked for me</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>97</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-6323827673666388873</id><published>2016-05-02T23:20:00.000-07:00</published><updated>2016-05-02T23:20:01.979-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Blog"/><category scheme="http://www.blogger.com/atom/ns#" term="content"/><category scheme="http://www.blogger.com/atom/ns#" term="thoughts"/><category scheme="http://www.blogger.com/atom/ns#" term="writing"/><title type='text'>Independence for Content and Layout - Moving away from blogger</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;span style=&quot;background-color: white; color: #333333; font-family: Georgia; line-height: 31.4286px;&quot;&gt;Perhaps it&#39;s about time. Move on. Try something different. The way I write and need to publish content changed in the past years. Most of the time, I write either in plain text, Markdown or more recently in Asciidoc. I believe plain text, or slightly enhanced plain text formats, represent a much easier solution to deal with on different platforms. Easy for versioning.&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: Georgia; line-height: 31.4286px;&quot; /&gt;&lt;br style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: Georgia; line-height: 31.4286px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Georgia; line-height: 31.4286px;&quot;&gt;I consider content to be fluid. It must fit different formats to represent it properly. This brings me to the next wish: having a modern, easy to maintain design for my blog. I struggle with the template system and the way templates are organized in blogger. Making changes to the layout feels restricting and complex. There are a couple of instructions out there to tweak the hell out of blogger and bend it to your will. But it all seems like tweaks to me. Blogger works for a lot of cases and people out of the box. In my case, I want to experiment freely and make adjustments to my blog. Without the experience of being slowed down by the system. Blogger represents still a great way for people to get started with blogging. Minimal investment and solid foundation. I Believe, that I grew out of this whole system over time. I feel like I want more space, more breathing room.&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: Georgia; line-height: 31.4286px;&quot; /&gt;&lt;br style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: Georgia; line-height: 31.4286px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Georgia; line-height: 31.4286px;&quot;&gt;In the next couple of weeks, I will move to a different space. I haven&#39;t made a decision yet. There are a lot of cool static site generators that I&#39;d like to explore. When I made a decision, you will be notified.&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: Georgia; line-height: 31.4286px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Georgia; line-height: 31.4286px;&quot;&gt;I&#39;ll keep all the old content here. Nothing is about to go, but there won&#39;t be many new posts in the future.&lt;/span&gt;&lt;br style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: Georgia; line-height: 31.4286px;&quot; /&gt;&lt;br style=&quot;background-color: white; box-sizing: border-box; color: #333333; font-family: Georgia; line-height: 31.4286px;&quot; /&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: Georgia; line-height: 31.4286px;&quot;&gt;Sometimes, you want to say good bye to say hello.&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/6323827673666388873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/6323827673666388873' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/6323827673666388873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/6323827673666388873'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2016/05/independence-for-content-and-layout.html' title='Independence for Content and Layout - Moving away from blogger'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-4450260835823061044</id><published>2016-04-19T00:10:00.000-07:00</published><updated>2016-04-19T00:10:02.948-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dontforget"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="TILT"/><category scheme="http://www.blogger.com/atom/ns#" term="tips"/><category scheme="http://www.blogger.com/atom/ns#" term="tricks"/><title type='text'>Call me! PythonJS and variadic functions</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;color: #484848; font-family: &#39;Trebuchet MS&#39;, Helvetica, sans-serif;&quot;&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
I’m currently developing UI automation tests for &lt;a href=&quot;https://www.adobe.com/products/experience-design.html?scid=social52541916&quot;&gt;Adobe Experience Design&lt;/a&gt;, aka &lt;a href=&quot;https://www.adobe.com/products/experience-design.html?scid=social52541916&quot;&gt;Adobe XD&lt;/a&gt;. Or, for anybody who hasn’t heard of the recent name change: &lt;a href=&quot;https://blogs.adobe.com/creativecloud/introducing-project-comet-a-new-tool-for-designing-and-prototyping-user-experiences/&quot;&gt;Project Comet&lt;/a&gt;!&lt;/h3&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiHzRsLUVxQu4PQdCfsV2g8nNG4BmOrTa71GOku3AKVsgKS4P3ma_FuizQTXWNbRq6S3VZ8GS3iufGaIKjI37E0rafoVHCC2KtpD7FjgQrgvLNDSZok6Lc3qIV-8M9ZQkQH9s_iJTLdX_E/s1600/IMG_2597.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiHzRsLUVxQu4PQdCfsV2g8nNG4BmOrTa71GOku3AKVsgKS4P3ma_FuizQTXWNbRq6S3VZ8GS3iufGaIKjI37E0rafoVHCC2KtpD7FjgQrgvLNDSZok6Lc3qIV-8M9ZQkQH9s_iJTLdX_E/s640/IMG_2597.JPG&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Combine and attach different material&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;
&lt;a href=&quot;https://www.blogger.com/null&quot; name=&quot;_this_is_a_note_to_myself_mostly&quot;&gt;&lt;/a&gt;1. This is a note to myself. Mostly&lt;/h2&gt;
Today, I got stuck in something that looked pretty straight forward to me. I wanted to call a function in a Python API from my JavaScript code. We use &lt;a href=&quot;https://github.com/rusthon/Rusthon&quot;&gt;PythonJS&lt;/a&gt; to make this magic happen. In the most cases, calling a function in the Python API is not a big deal. Scalar values work well, named arguments work well, but &lt;a href=&quot;https://en.wikipedia.org/wiki/Variadic_function&quot;&gt;variadic function args&lt;/a&gt; do not.&lt;br /&gt;
The function I wanted to call looks like this:&lt;br /&gt;
&lt;table bgcolor=&quot;#e8e8e8&quot; border=&quot;0&quot; cellpadding=&quot;10&quot; style=&quot;width: 100%px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;

&lt;br /&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;def&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style=&quot;color: black;&quot;&gt;menuItem&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #990000;&quot;&gt;(&lt;/span&gt;self&lt;span style=&quot;color: #990000;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #990000;&quot;&gt;*&lt;/span&gt;args&lt;span style=&quot;color: #990000;&quot;&gt;)&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Calling the function from JavaScript, I tried several things. The most promising for me was to convert the JavaScript &lt;code&gt;arguments&lt;/code&gt; into an &lt;code&gt;Array&lt;/code&gt; and pass it on.&lt;br /&gt;
&lt;table bgcolor=&quot;#e8e8e8&quot; border=&quot;0&quot; cellpadding=&quot;10&quot; style=&quot;width: 100%px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;

&lt;br /&gt;
&lt;pre&gt;&lt;tt&gt;pythonObj&lt;span style=&quot;color: #990000;&quot;&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: black;&quot;&gt;menuItem&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #990000;&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;&#39;value1&#39;&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;&#39;value2&#39;&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;&#39;value3&#39;&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;])&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
The result was an error, telling me that I should &lt;code&gt;call the function with a string or int&lt;/code&gt;. Okay, the function signature accept either one or multiple `int`s or `string`s. In various combinations.&lt;br /&gt;
I guess, my initial approach was a bit too naive. A JavaScript array doesn’t translate to a vararg in Python. Got it!
But how do I pass the list of varargs from JavaScript to Python? I tried to &lt;code&gt;apply&lt;/code&gt; the arguments from the JavaScript function to &lt;code&gt;obj.menuItem&lt;/code&gt;. But this didn’t work with the same error.&lt;br /&gt;
I tried to call the Python function by&lt;br /&gt;
&lt;table bgcolor=&quot;#e8e8e8&quot; border=&quot;0&quot; cellpadding=&quot;10&quot; style=&quot;width: 100%px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;

&lt;br /&gt;
&lt;pre&gt;&lt;tt&gt;obj&lt;span style=&quot;color: #990000;&quot;&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: black;&quot;&gt;menuItem&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #990000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;&quot;value1&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;&quot;value2&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;&quot;value3&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;)&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
That worked well. But I can’t make this happen from the JavaScript side? How can I split up an unknown number of arguments and pass them &lt;strong&gt;all&lt;/strong&gt; as single arguments?
I had no answer for that.&lt;br /&gt;
&lt;h2&gt;
&lt;a href=&quot;https://www.blogger.com/null&quot; name=&quot;_workaround_hack_you_name_it&quot;&gt;&lt;/a&gt;2. Workaround, Hack, you name it&lt;/h2&gt;
If I would have a fixed number of arguments, the solution would be easier.
I ended up with a &lt;em&gt;hacky&lt;/em&gt; solution (IMHO), since I didn’t wanted to spent more time on this &lt;em&gt;interesting but blocking&lt;/em&gt; issue.&lt;br /&gt;
&lt;table bgcolor=&quot;#e8e8e8&quot; border=&quot;0&quot; cellpadding=&quot;10&quot; style=&quot;width: 100%px;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;

&lt;br /&gt;
&lt;pre&gt;&lt;tt&gt;&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;function&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style=&quot;color: black;&quot;&gt;callPythonFunction&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #990000;&quot;&gt;(&lt;/span&gt;args&lt;span style=&quot;color: #990000;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;{&lt;/span&gt;
    &lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;switch&lt;/span&gt;&lt;/b&gt; &lt;span style=&quot;color: #990000;&quot;&gt;(&lt;/span&gt;args&lt;span style=&quot;color: #990000;&quot;&gt;.&lt;/span&gt;length&lt;span style=&quot;color: #990000;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;{&lt;/span&gt;
        &lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;case&lt;/span&gt;&lt;/b&gt; &lt;span style=&quot;color: #993399;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;{&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;tt&gt;            &lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt;&lt;/b&gt; app&lt;span style=&quot;color: #990000;&quot;&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: black;&quot;&gt;menuItem&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #990000;&quot;&gt;(&lt;/span&gt;args&lt;span style=&quot;color: #990000;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #993399;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;]);&lt;/span&gt;
        &lt;span style=&quot;color: red;&quot;&gt;}&lt;/span&gt;

        &lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;case&lt;/span&gt;&lt;/b&gt; &lt;span style=&quot;color: #993399;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;{&lt;/span&gt;
            &lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt;&lt;/b&gt; app&lt;span style=&quot;color: #990000;&quot;&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: black;&quot;&gt;menuItem&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #990000;&quot;&gt;(&lt;/span&gt;args&lt;span style=&quot;color: #990000;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #993399;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;],&lt;/span&gt; args&lt;span style=&quot;color: #990000;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #993399;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;]);&lt;/span&gt;
        &lt;span style=&quot;color: red;&quot;&gt;}&lt;/span&gt;

        &lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;case&lt;/span&gt;&lt;/b&gt; &lt;span style=&quot;color: #993399;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: red;&quot;&gt;{&lt;/span&gt;
            &lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt;&lt;/b&gt; app&lt;span style=&quot;color: #990000;&quot;&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: black;&quot;&gt;menuItem&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #990000;&quot;&gt;(&lt;/span&gt;args&lt;span style=&quot;color: #990000;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #993399;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;],&lt;/span&gt; args&lt;span style=&quot;color: #990000;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #993399;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;],&lt;/span&gt; args&lt;span style=&quot;color: #990000;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #993399;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;]);&lt;/span&gt;
        &lt;span style=&quot;color: red;&quot;&gt;}&lt;/span&gt;

        &lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;default&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #990000;&quot;&gt;:&lt;/span&gt;
            console&lt;span style=&quot;color: #990000;&quot;&gt;.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: black;&quot;&gt;error&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #990000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;&quot;Unsupported amount of arguments for args&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000;&quot;&gt;,&lt;/span&gt; args&lt;span style=&quot;color: #990000;&quot;&gt;.&lt;/span&gt;length&lt;span style=&quot;color: #990000;&quot;&gt;);&lt;/span&gt;
        &lt;span style=&quot;color: red;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: red;&quot;&gt;}&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Is this a good solution? Until I find something better, I consider it as a good solution.&lt;br /&gt;
&lt;h2&gt;
&lt;a href=&quot;https://www.blogger.com/null&quot; name=&quot;_summary&quot;&gt;&lt;/a&gt;3. Summary&lt;/h2&gt;
Bridging languages and make up for missing or non transferrable features requires creative solutions. They might not be the best solutions, but they unblock and let you move on.&lt;br /&gt;
&lt;br /&gt;
What do you think? Is there a better way of doing this? Let me know in the comments.&lt;br /&gt;
&lt;br /&gt;
Thanks for reading!&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/4450260835823061044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/4450260835823061044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/4450260835823061044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/4450260835823061044'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2016/04/call-me-pythonjs-and-variadic-functions.html' title='Call me! PythonJS and variadic functions'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiHzRsLUVxQu4PQdCfsV2g8nNG4BmOrTa71GOku3AKVsgKS4P3ma_FuizQTXWNbRq6S3VZ8GS3iufGaIKjI37E0rafoVHCC2KtpD7FjgQrgvLNDSZok6Lc3qIV-8M9ZQkQH9s_iJTLdX_E/s72-c/IMG_2597.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-4688940027206842476</id><published>2016-04-13T23:54:00.000-07:00</published><updated>2016-04-13T23:54:31.788-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="camera"/><category scheme="http://www.blogger.com/atom/ns#" term="dxo"/><category scheme="http://www.blogger.com/atom/ns#" term="dxo-one"/><category scheme="http://www.blogger.com/atom/ns#" term="iphone"/><category scheme="http://www.blogger.com/atom/ns#" term="Meinung"/><category scheme="http://www.blogger.com/atom/ns#" term="opinion"/><category scheme="http://www.blogger.com/atom/ns#" term="photo"/><category scheme="http://www.blogger.com/atom/ns#" term="review"/><title type='text'>DxO One - Ein Erfahrungsbericht</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;color: #484848; font-family: &#39;Trebuchet MS&#39;, Helvetica, sans-serif;&quot;&gt;
&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Schon als die interessante Ansteck-Kamera im Frühjahr 2015 angekündigt wurde, hab ich ein Auge auf sie geworfen. Da die Kamera aber nur für den Anschluss an iPhones hergestellt wird, hatte sich die Sache nach Durchsicht der technischen Daten dann aber auch schon erledigt. Ich hatte zu diesem Zeitpunkt kein iPhone. Lediglich ein iPad, aber ich halte nicht so viel davon, mit meinem riesigen iPad durch die Gegend zu laufen und Bilder zu machen.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_tl_dr&quot;&gt;
1. TL;DR&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_kaufen_ja_nein_weiss_nicht&quot;&gt;
1.1. Kaufen? Ja, Nein, Weiss nicht&lt;/h3&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;_pros&quot;&gt;
1.1.1. Pros&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
Bildqualität ist sehr gut
&lt;br /&gt;

&lt;/li&gt;
&lt;li&gt;
Selfie Mode (für alle die es brauchen)
&lt;br /&gt;

&lt;/li&gt;
&lt;li&gt;
minimales Gewicht, handlich, passt in jede Tasche
&lt;br /&gt;

&lt;/li&gt;
&lt;li&gt;
mit der Kamera App lässt alles aus der Kamera rausholen
&lt;br /&gt;

&lt;/li&gt;
&lt;li&gt;
Akku lädt sehr schnell wieder auf
&lt;br /&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect3&quot;&gt;
&lt;h4 id=&quot;_cons&quot;&gt;
1.1.2. Cons&lt;/h4&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
Batterie hat eine kurze Lebenszeit (und kann nicht gewechselt werden)
&lt;br /&gt;

&lt;/li&gt;
&lt;li&gt;
Braucht beim speichern von Super RAW Bildern extrem lange
&lt;br /&gt;

&lt;/li&gt;
&lt;li&gt;
neigt zu überhitzen
&lt;br /&gt;

&lt;/li&gt;
&lt;li&gt;
der Lightning Connector macht für mich keinen robusten Eindruck
&lt;br /&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_jetzt_aber&quot;&gt;
2. Jetzt aber&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Mitte 2015 ist die Kamera dann für den Preis von $599 hier auf den Markt gekommen. Der Preisschock ging nach kurzer Zeit wieder weg, aber die Frage blieb: warum ist die Kamera genauso teuer wie ein iPhone oder wie eine gute handliche Kompaktkamera? Und diese Kamera macht definitiv nur mit einem iPhone Sinn, weil sie nur ein winziges Display zur Anzeige von Statusinformationen hat. Also ohne iPhone praktisch unbrauchbar. Ein iPad mit Lightning Anschluss würde auch funktionieren. Aber wie gesagt, bin ich kein großer Freund davon.&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Im Februar 2016 hatte dann ein Händler die Kamera für $350 im Angebot. Das war dann der Moment. Ja, ich konnte nicht mehr widerstehen und hab die Kamera gekauft. Ja, ja, ein neues Spielzeug in der Sammlung.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_die_kamera&quot;&gt;
3. Die Kamera&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Ist sehr handlich und die Elektronik befindet sich in einem Aluminium Gehäuse. Eine Plastikklappe verdeckt den SD Karten Slot und den USB Anschluss. An der Seite des Gehäuses ist der Lighting Connector angebracht. Er wird einfach eingeklappt. Mehr Anschlüsse hat die Kamera auch nicht&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_die_iphone_ipad_app&quot;&gt;
4. Die iPhone/iPad App&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Um die Kamera überhaupt bedienen zu können, muß die kostenlose iPhone App installiert werden. Die App kann vom iTunes Store installiert werden. Die App bietet alle Einstellmöglichkeiten die man von einer Kamera her kennt. Es gibt einen Auto Mode, verschiedene Szenenprogramme und die üblichen manuellen Modi (P, A, S, M). Blende und Belichtungszeit kann eingestellt werden. Der Fokus Mode kann aus der App heraus geändert werden.
Die App dient auch dazu die Bilder von der Kamera auf das iPhone zu kopieren. Auf dem iPhone kann man sie dann weiter bearbeiten oder direkt von dort im Internet verteilen.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRsacR9nwAzTCz9YXNicNf2AjmRd_jQEQZ0husriDFreic4I7quMTgR6WY0RJmAKwgZOf0LB35TApGf2gUNRYbvkX7pJ1jaxVZI0oqiDbESgMQ12klLLQrsGwCaNTI1uGGPNkOGQZBntj6/s1600/IMG_2460.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRsacR9nwAzTCz9YXNicNf2AjmRd_jQEQZ0husriDFreic4I7quMTgR6WY0RJmAKwgZOf0LB35TApGf2gUNRYbvkX7pJ1jaxVZI0oqiDbESgMQ12klLLQrsGwCaNTI1uGGPNkOGQZBntj6/s640/IMG_2460.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;iPhone App - Camera Modi&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ6wAt5yKV4PvRhEJBp3ys94tBuW7ctVEY0abNrt6tl_fw2wYBdgVTus98NXzKMBcXw3hIrY2hRDlgM_y4rzxMK5I7LDJn_UGQCuiOyMHAaDfcesYgOsrp_EBb06tqFHyb5BSu7LtqnpfN/s1600/IMG_2461.PNG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ6wAt5yKV4PvRhEJBp3ys94tBuW7ctVEY0abNrt6tl_fw2wYBdgVTus98NXzKMBcXw3hIrY2hRDlgM_y4rzxMK5I7LDJn_UGQCuiOyMHAaDfcesYgOsrp_EBb06tqFHyb5BSu7LtqnpfN/s640/IMG_2461.PNG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;iPhone App - Sucher und Einstellmöglichkeiten&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_die_verbindung&quot;&gt;
5. Die Verbindung&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Die Kamera wird über einen ausfahrbaren &lt;a href=&quot;https://de.wikipedia.org/wiki/Lightning_(Schnittstelle)&quot;&gt;Lightning Connector&lt;/a&gt; an das iPhone angeschlossen. Der Anschluss klappt nur aus, wenn man den Objektivschutz ganz nach unten schiebt. Damit wird die Kamera eingeschaltet und der Lightning Connector fährt aus dem Gehäuse heraus.&lt;/div&gt;
&lt;div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbpxX6nNtdOvzSUEFHvHPFmpjXKR70MZi1oPbph6gjF23O_rBIyrBfT8FnIxSs0VnZuNrg_fCepFgAlG4hEwK9ZDrRsxAT7hSEvtllidq0MhoyjIwd3GJIHTwjN8G0Qh6gWi630DnNUl8X/s1600/IMG_2458.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbpxX6nNtdOvzSUEFHvHPFmpjXKR70MZi1oPbph6gjF23O_rBIyrBfT8FnIxSs0VnZuNrg_fCepFgAlG4hEwK9ZDrRsxAT7hSEvtllidq0MhoyjIwd3GJIHTwjN8G0Qh6gWi630DnNUl8X/s640/IMG_2458.JPG&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Der LIghtning Connector zum Anschluss ans iPhone&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_sensor&quot;&gt;
6. Sensor&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Die kleine Kamera hat einen nicht ganz so kleinen Sensor. Im Gehäuse steckt ein 20MP 1 Inch Sensor. Das gleiche Kaliber wie in einer guten handlichen Kompaktkamera. Leider habe ich nicht herausbekommen, ob der Sensor eine Eigenentwicklung ist, oder von einem anderen Hersteller lizensiert wurde. Macht aber auch nicht wirklich einen Unterschied. Ich wollte hier ohnehin nicht die Sensoren vergleichen.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_geschwindigkeit&quot;&gt;
7. Geschwindigkeit&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Die Kamera legt ein gutes Tempo an den Tag. Fokussieren (vornehmlich mit dem Finger auf dem Display des iPhones) und dann den Auslöser betätigen. Die Bilder werden schnell gespeichert. Es sollte auf jeden Fall nicht an der SD Karte gespart werden (die übrigens nicht im Liederumfang enthalten ist). Mit einer schnellen SD Karte ist die Kamera schnell wieder einsatzbereit.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_bild_qualität&quot;&gt;
8. Bild Qualität&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Die Bilder sind gut bis sehr gut. Auf jeden Fall besser als die mit dem iPhone erstellten Bilder. Aber das sollte mich auch nicht wirklich wundern. Die Kamera kann Bilder als JPEG &lt;strong&gt;und&lt;/strong&gt; RAW und Super RAW speichern (dazu unten mehr). Ich fotografiere generell in RAW, um bei der Nachbearbeitung die meisten Möglichkeiten für die Korrekturen zur Verfügung zu haben.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_super_raw&quot;&gt;
9. Super RAW&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Hoppla, was ist das denn? Besser als RAW? Ich wusste ja nur, das es unkomprimiertes RAW gibt, aber Super RAW. Okay, und was ist es nun? Die Kamera macht 4 Aufnahmen kurz hintereinander und diese 4 Aufnahmen werden in eine Datei geschrieben. Zum importieren muss man dann DxO Connect bemühen (siehe unten). Das ist eine zusätzliche Software, die man erst downloaden kann, nachdem man die Kamera registriert hat. Leider funktioniert die Registrierung der Kamera nur aus der iPhone App heraus.
Beim Import mit DxO Connect (siehe unten), werden die Bilder dann mittels verschiedener Algorithmen zusammengeführt (das Rauschen wird stark minimiert) und so ein besseres Bild erzeugt. Das resultierende Bild liegt dann als optimierte JPEG Datei vor. Das Rauschen ist im JPEG definitiv geringer als in der orignalen RAW Datei. Aber ich weiß nicht, ob das diese riesigen Files Super RAW Files das Ergebnis rechtfertigen. Aber okay, irgendein merkwürdiges Verkaufsargument darf eben nicht fehlen.&lt;/div&gt;
&lt;div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiddwJ-xG0RBTJmyXlXx7z6bZtXIWVddXwfFReEqS2Lv7Z78EclL8kcVYuJ-2pJJ3-Jqd7LYRAtZf37Np7YD-QLpCRuC8wLuO0PYRSAzGsdpQHvBMu4M9KsNysJ9EvwgR1eiDKxjMARD_EP/s1600/RAWvsSUPERRAW.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiddwJ-xG0RBTJmyXlXx7z6bZtXIWVddXwfFReEqS2Lv7Z78EclL8kcVYuJ-2pJJ3-Jqd7LYRAtZf37Np7YD-QLpCRuC8wLuO0PYRSAzGsdpQHvBMu4M9KsNysJ9EvwgR1eiDKxjMARD_EP/s640/RAWvsSUPERRAW.png&quot; width=&quot;558&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Das Rauschen im JPEG ist auf jeden Fall geringer als in der Super RAW Ausgangsdatei&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;table cellpadding=&quot;4&quot; frame=&quot;void&quot;&gt;
&lt;tbody&gt;
&lt;tr valign=&quot;top&quot;&gt;
&lt;td&gt;&lt;img alt=&quot;Warnung&quot; src=&quot;data:image/png;base64,
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
/F/lgJiyQFHragAAAABJRU5ErkJggg==&quot; style=&quot;border-image: none 0;&quot; /&gt;
&lt;/td&gt;
&lt;td style=&quot;border-left: 1px solid silver;&quot;&gt;Auf jeden Fall sorgt der Super RAW Modus dafür, dass die Kamera ziemlich lange braucht um die Daten auf die Karte zu schreiben. Das ist auch nicht besonders überraschend, da die 4 fache Datenmenge gespeichert werden muß. Und ein RAW Bild ist so um die 40 MB groß! Die DXO Datei ist satte &lt;strong&gt;160 MB&lt;/strong&gt; groß.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Ich habe es mehrere male erlebt, dass die Kamera im Super RAW Modus ziemlich warm geworden ist. Ich habe nur einmal die &lt;strong&gt;Hitze Warnmeldung&lt;/strong&gt; im Display der Kamera gesehen. Andere Benutzer scheinen damit mehr Erfahrung gemacht zu haben.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_firmware_updates&quot;&gt;
10. Firmware Updates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Das letzte Firmwareupdate hat der Kamera einen &quot;Retro-Mode&quot; verschafft. Was ist das? Das kleine Monochrome Display kann jetzt als Sucher benutzt werden, wenn die Kamera nicht an das iPhone angeschlossen ist. Damit kann man dann ohne das iPhone mit der Kamera Bilder machen (hätte man vorher auch schon machen können, wäre aber ein kompletter Blindflug gewesen). Das geht so als Notfall-Lösung durch. Richtig was sehen, kann man auf dem kleinen Display nicht. Nur Schwarz/Weiß und viel zu geringe Auflösung. Aber man sieht zumindest in welche Richtung die Kamera blickt.&lt;/div&gt;
&lt;div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZMkZl8I83DJkDKHhwgHSeq2kseAsDFg-qNJVJUmyoEg9hS9igbVWronThDCg4eVKnZ-XeWCN0iks5eKNguGWDdviWowjyZaRCHwTMlJaXl9EWcXo_BVPZATZs11qQGP5-RUkVcibuKpnV/s1600/IMG_2459.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZMkZl8I83DJkDKHhwgHSeq2kseAsDFg-qNJVJUmyoEg9hS9igbVWronThDCg4eVKnZ-XeWCN0iks5eKNguGWDdviWowjyZaRCHwTMlJaXl9EWcXo_BVPZATZs11qQGP5-RUkVcibuKpnV/s640/IMG_2459.JPG&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Das kleine Display&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_software&quot;&gt;
11. Software&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Eigentlich braucht man die zusätzliche Software nicht um die Bilder von der Kamera zu bekommen. Wenn man aber Bilder im Super RAW Format gemacht hat, dann sollte man DxO Connect auf jeden Fall installieren. Denn nur damit kann man den Super RAW Bildern die ganzen Informationen entlocken. Ansonsten können die Bilder auch direkt von der angeschlossenen Kamera oder der SD-Karte in Lightroom oder Apples Photos importiert werden.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_testbilder&quot;&gt;
12. Testbilder&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy6ah529sh61zKa2IkGCnEhBV_xFjUod7Ku_UvE8cdqIEWOLxNLUqqUldmjO0ooZ2foL2SZXVnxRKiCt61HY_aaZk_9GHiAwKhDEFLW3q5YX7xWkrxdO846n_Lu6-gM9tIs42Owz33smBW/s1600/DXO_0003.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy6ah529sh61zKa2IkGCnEhBV_xFjUod7Ku_UvE8cdqIEWOLxNLUqqUldmjO0ooZ2foL2SZXVnxRKiCt61HY_aaZk_9GHiAwKhDEFLW3q5YX7xWkrxdO846n_Lu6-gM9tIs42Owz33smBW/s640/DXO_0003.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Closeup&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0CiNwUhAqtGM0FTWeKkAKB30WW4Ft97XwbMBxeH7ZshzQguKVMEGBEVMrx1RtMmwbxwpAxY73Y25lCC9N4yOkrojv_oZACynF2gEkPxQ-Ej0PHYRLZAApq1EgyDAxP589hDKFYEYWj1Gp/s1600/DXO_0014.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0CiNwUhAqtGM0FTWeKkAKB30WW4Ft97XwbMBxeH7ZshzQguKVMEGBEVMrx1RtMmwbxwpAxY73Y25lCC9N4yOkrojv_oZACynF2gEkPxQ-Ej0PHYRLZAApq1EgyDAxP589hDKFYEYWj1Gp/s640/DXO_0014.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Farben&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8urCB2Yk2WYqbHmYSbcRHjNEsIWnJ31zq7jxCJzeO-YsWf0tWAGfkGHK1Poi0w2VE2FwiUOOzUxbLEYbBsvqkxWZQr0svjRYIAMSpiohZInziPUaaec-nWH8pGspglKnX0WCapCmjwmZI/s1600/DXO_0038.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8urCB2Yk2WYqbHmYSbcRHjNEsIWnJ31zq7jxCJzeO-YsWf0tWAGfkGHK1Poi0w2VE2FwiUOOzUxbLEYbBsvqkxWZQr0svjRYIAMSpiohZInziPUaaec-nWH8pGspglKnX0WCapCmjwmZI/s640/DXO_0038.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Abend&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0wh0pze6Gh_Tc0_Q0LV8J6Sf0uTSXCepG7IQN1z3bzUJt4jojli9hoA9y9Mk7FWo7UAWxQIK6QbJbPcrQ0rBpci4neIl7arH2ok6l91tJZ5mWX3ICuhoB1sj2Np1onGBDxRcj_ywqNMJk/s1600/DXO_0053.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;468&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0wh0pze6Gh_Tc0_Q0LV8J6Sf0uTSXCepG7IQN1z3bzUJt4jojli9hoA9y9Mk7FWo7UAWxQIK6QbJbPcrQ0rBpci4neIl7arH2ok6l91tJZ5mWX3ICuhoB1sj2Np1onGBDxRcj_ywqNMJk/s640/DXO_0053.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Langzeitbelichtung&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMBs4VHn7STrxnWtPI20IaOePyVG4Fqth6TeHOEjK0gNgsCCmAu-NmrKjRG3yXK1XPS0DQHM4cDAzareek4z7TlY0jOm4vpu8DF7EOn_L0U3AwNpaCarRBcw952aUtEpd3p6wvxIhZObb2/s1600/DXO_0065.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMBs4VHn7STrxnWtPI20IaOePyVG4Fqth6TeHOEjK0gNgsCCmAu-NmrKjRG3yXK1XPS0DQHM4cDAzareek4z7TlY0jOm4vpu8DF7EOn_L0U3AwNpaCarRBcw952aUtEpd3p6wvxIhZObb2/s640/DXO_0065.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Closeup&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRQkYWWqfiKKkeECJj3uizqQjVSizmWjO32zd78MkLArqQe-Rcun5_pgcYUi4I36GEWPaSJ5pAGNoNTmtZWdObA8e0Lt9JCjbjFxNp4iMSNb0KbjiVlFmfla4MABTljaDQySkqmvuCJ-CJ/s1600/DXO_0078.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRQkYWWqfiKKkeECJj3uizqQjVSizmWjO32zd78MkLArqQe-Rcun5_pgcYUi4I36GEWPaSJ5pAGNoNTmtZWdObA8e0Lt9JCjbjFxNp4iMSNb0KbjiVlFmfla4MABTljaDQySkqmvuCJ-CJ/s640/DXO_0078.jpg&quot; width=&quot;426&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Licht und Schatten&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib271nDkead__YSJup0qE7TqELVdR71SzbCnvdNhnk95HNM2itW7QqK1JC3IIqkRyf7qACx-JA_BhXHm__kz5wI2LYE2wG6koqhTK0RT9lTJTaQBCIkoGG3g2F960ohrRVhdkUmtwIv1j8/s1600/DXO_0091.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib271nDkead__YSJup0qE7TqELVdR71SzbCnvdNhnk95HNM2itW7QqK1JC3IIqkRyf7qACx-JA_BhXHm__kz5wI2LYE2wG6koqhTK0RT9lTJTaQBCIkoGG3g2F960ohrRVhdkUmtwIv1j8/s640/DXO_0091.jpg&quot; width=&quot;426&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Sonnenschein&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKSbNRmOBjpJ2CzBa0kJzUGoREddcZnj9fXRAieBs9N3voMavjcT3_Y9Bb_mzYhLcig-ihbJxcanqzPR8_PqLQAoEP8NdR_xRbCSlWQm6DWkuX1cKQvS4-bw94TCt_V7s7Gxu-aQYGeiG-/s1600/DXO_0096.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKSbNRmOBjpJ2CzBa0kJzUGoREddcZnj9fXRAieBs9N3voMavjcT3_Y9Bb_mzYhLcig-ihbJxcanqzPR8_PqLQAoEP8NdR_xRbCSlWQm6DWkuX1cKQvS4-bw94TCt_V7s7Gxu-aQYGeiG-/s640/DXO_0096.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Kunstlicht&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnmXAw7xxwF3b__icVG4EiTjsXiduQkGmeLujjL-wY7NoupqSpRI-MN0itVmIyMRzRU5M0Dg3JpI9xFX-UptFR3Wg7geLklT3l4Dd8AWIIoBUntoLjHkZo8aOLa9nyz1PVMy0rd871Hl6q/s1600/DXO_0124.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnmXAw7xxwF3b__icVG4EiTjsXiduQkGmeLujjL-wY7NoupqSpRI-MN0itVmIyMRzRU5M0Dg3JpI9xFX-UptFR3Wg7geLklT3l4Dd8AWIIoBUntoLjHkZo8aOLa9nyz1PVMy0rd871Hl6q/s640/DXO_0124.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Tageslicht&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZA_75xKMvty0daHDJI8-Jc1O-4NAdwMKRF3Kljh4GbpHPEjgTTX6EhvIdUnniLmXO5cOYUwf8QY88QuYK6gq_xvR2N0Qo8SErswXu34mxhpnoDtInDVezg-aqeWugZlCwSe6tBqni1VQY/s1600/DXO_0142.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZA_75xKMvty0daHDJI8-Jc1O-4NAdwMKRF3Kljh4GbpHPEjgTTX6EhvIdUnniLmXO5cOYUwf8QY88QuYK6gq_xvR2N0Qo8SErswXu34mxhpnoDtInDVezg-aqeWugZlCwSe6tBqni1VQY/s640/DXO_0142.jpg&quot; width=&quot;426&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Sonnenschein&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/4688940027206842476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/4688940027206842476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/4688940027206842476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/4688940027206842476'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2016/04/dxo-one-ein-erfahrungsbericht.html' title='DxO One - Ein Erfahrungsbericht'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRsacR9nwAzTCz9YXNicNf2AjmRd_jQEQZ0husriDFreic4I7quMTgR6WY0RJmAKwgZOf0LB35TApGf2gUNRYbvkX7pJ1jaxVZI0oqiDbESgMQ12klLLQrsGwCaNTI1uGGPNkOGQZBntj6/s72-c/IMG_2460.PNG" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>San Francisco, CA, USA</georss:featurename><georss:point>37.7749295 -122.41941550000001</georss:point><georss:box>37.373501499999996 -123.06486250000002 38.1763575 -121.77396850000001</georss:box></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-153295344339060183</id><published>2016-03-05T22:44:00.000-08:00</published><updated>2016-03-05T22:44:22.999-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="npm"/><category scheme="http://www.blogger.com/atom/ns#" term="tips"/><category scheme="http://www.blogger.com/atom/ns#" term="tricks"/><category scheme="http://www.blogger.com/atom/ns#" term="webdev"/><title type='text'>5 npm script secrets</title><content type='html'>&lt;div style=&quot;color: #484848; font-family: &#39;Trebuchet MS&#39;, Helvetica, sans-serif&quot;&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_no_secret&quot;&gt;No Secret&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;Last week I was hosting a &lt;a href=&quot;http://forwardjs.com/workshop/build-great-desktop-apps-with-electron-shell&quot;&gt;workshop&lt;/a&gt; about Electron Shell, ES6 and Reactjs at ForwardJS in San Francisco. Preparing all the sample code, I was inspired by this &lt;a href=&quot;http://substack.net/task_automation_with_npm_run&quot;&gt;blog post&lt;/a&gt; to avoid any build tool like &lt;a href=&quot;http://gruntjs.com/&quot;&gt;grunt&lt;/a&gt; or &lt;a href=&quot;http://gulpjs.com&quot;&gt;gulp&lt;/a&gt; at all. In fact, I wanted to remove anything that could distract the attendees of the workshop by throwing another unknown toolset at them. Instead, leveraging the build in capabilities of npm.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_the_idea&quot;&gt;The Idea&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;Why use grunt, gulp, etc. if you can leverage the power of &lt;a href=&quot;http://npm-scripts.com&quot;&gt;npm scripts&lt;/a&gt;? Not having to maintain a build script is a good idea and helps to remove another piece of complexity from your project.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_secrets&quot;&gt;Secrets&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;sect2&quot;&gt;
&lt;h3 id=&quot;_different_types_of_scripts&quot;&gt;Different types of scripts&lt;/h3&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;&lt;span class=&quot;monospaced&quot;&gt;npm&lt;/span&gt; supports custom scripts defined by &lt;span class=&quot;monospaced&quot;&gt;scripts&lt;/span&gt; property of &lt;span class=&quot;monospaced&quot;&gt;package.json&lt;/span&gt;.
&lt;span class=&quot;monospaced&quot;&gt;npm&lt;/span&gt; distinguishes between 2 different kind of scripts&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;
lifecycle scripts
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;
directly-run scripts
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;&lt;span class=&quot;monospaced&quot;&gt;Lifecycle scripts&lt;/span&gt; tie into a specific phase of your project lifecycle, like &lt;span class=&quot;monospaced&quot;&gt;install&lt;/span&gt;, &lt;span class=&quot;monospaced&quot;&gt;publish&lt;/span&gt;, &lt;span class=&quot;monospaced&quot;&gt;start&lt;/span&gt;, &lt;span class=&quot;monospaced&quot;&gt;stop&lt;/span&gt;, etc. These scripts can be executed with &lt;span class=&quot;monospaced&quot;&gt;npm lifecycle-script&lt;/span&gt;. Each &lt;span class=&quot;monospaced&quot;&gt;lifecycle script&lt;/span&gt; can have a &lt;span class=&quot;monospaced&quot;&gt;pre&lt;/span&gt; and &lt;span class=&quot;monospaced&quot;&gt;post&lt;/span&gt; script for that phase, e.g. &lt;span class=&quot;monospaced&quot;&gt;preinstall&lt;/span&gt; and &lt;span class=&quot;monospaced&quot;&gt;postinstall&lt;/span&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;The &lt;span class=&quot;monospaced&quot;&gt;directly-run scripts&lt;/span&gt; need the extra &lt;span class=&quot;monospaced&quot;&gt;run&lt;/span&gt; command after npm, e.g. &lt;span class=&quot;monospaced&quot;&gt;npm run *my-script-name*&lt;/span&gt;. Your &lt;span class=&quot;monospaced&quot;&gt;directly-run&lt;/span&gt; scripts can have a &lt;span class=&quot;monospaced&quot;&gt;pre&lt;/span&gt; and &lt;span class=&quot;monospaced&quot;&gt;post&lt;/span&gt; step with the same name as your script name, e.g. &lt;strong&gt;premy-script-name&lt;/strong&gt; and *postmy-script-name. Always without space between the prefix and the script name.&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;You can read more about it in the &lt;a href=&quot;https://docs.npmjs.com/misc/scripts&quot;&gt;official docs&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
&lt;table frame=&quot;void&quot; cellpadding=&quot;4&quot;&gt;
&lt;tr valign=&quot;top&quot;&gt;
&lt;td&gt;
&lt;img style=&quot;border-image: none 0;&quot; alt=&quot;Tip&quot; src=&quot;data:image/png;base64,
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&quot;&gt;
&lt;/td&gt;
&lt;td style=&quot;border-left: 1px solid silver;&quot;&gt;Call your own scripts always with &lt;span class=&quot;monospaced&quot;&gt;npm run &amp;lt;script-name&amp;gt;&lt;/span&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_platform_differences&quot;&gt;Platform differences&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;Sometimes you need to do things differenly when it comes to build your project on multiple platforms. I ran into the issue, where I needed to copy files. On OSX this is as simple as &lt;span class=&quot;monospaced&quot;&gt;cp srcfile.txt destfile.txt&lt;/span&gt;. On Windows, this didn&amp;#8217;t work, since &lt;span class=&quot;monospaced&quot;&gt;cp&lt;/span&gt; is an unknown command, unless you have cygwin installed. Building your project in the default Windows command prompt fails with an error, once you want to copy those important files. On Windows you should use &lt;span class=&quot;monospaced&quot;&gt;copy&lt;/span&gt; instead.&lt;/p&gt;&lt;/div&gt;
&lt;table frame=&quot;void&quot; cellpadding=&quot;4&quot;&gt;
&lt;tr valign=&quot;top&quot;&gt;
&lt;td&gt;
&lt;img style=&quot;border-image: none 0;&quot; alt=&quot;Tip&quot; src=&quot;data:image/png;base64,
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&quot;&gt;
&lt;/td&gt;
&lt;td style=&quot;border-left: 1px solid silver;&quot;&gt;Create an external &lt;span class=&quot;monospaced&quot;&gt;copy.js&lt;/span&gt; file and do the OS specific tasks there. You can use &lt;span class=&quot;monospaced&quot;&gt;process.platform === &#39;win32&#39;&lt;/span&gt; to determine if you are running Windows.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_dry_refer_to_anything_defined_in_your_package_json&quot;&gt;DRY - refer to anything defined in your package.json&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;DRY (don&amp;#8217;t repeat yourself) is a great principle when it comes to software development. You can even refer to anything defined in your &lt;span class=&quot;monospaced&quot;&gt;package.json&lt;/span&gt; when you execute your script.
Let&amp;#8217;s assume, you want to create a zip for distribution.&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;span style=&quot;color: #FF0000&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #FF0000&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;create-zip&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;zip -r app-1.0.zip dist&quot;&lt;/span&gt;
&lt;span style=&quot;color: #FF0000&quot;&gt;}&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;Now you can call &lt;span class=&quot;monospaced&quot;&gt;npm run create-zip&lt;/span&gt; to create a zip containing all the files to distribute your app.&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;But why can&amp;#8217;t we just refer to the name of the app and the version already defined in &lt;span class=&quot;monospaced&quot;&gt;package.json&lt;/span&gt;? Well, we can. &lt;span class=&quot;monospaced&quot;&gt;npm&lt;/span&gt; exposes all config keys from &lt;span class=&quot;monospaced&quot;&gt;package.json&lt;/span&gt; in the form &lt;span class=&quot;monospaced&quot;&gt;npm_package_configkey&lt;/span&gt; for you to use in your scripts.&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;span style=&quot;color: #FF0000&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #FF0000&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;create-zip&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;zip -r $npm_package_name-$npm_package_version.zip $npm_package_distdir&quot;&lt;/span&gt;
&lt;span style=&quot;color: #FF0000&quot;&gt;}&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;table frame=&quot;void&quot; cellpadding=&quot;4&quot;&gt;
&lt;tr valign=&quot;top&quot;&gt;
&lt;td&gt;
&lt;img style=&quot;border-image: none 0;&quot; alt=&quot;Tip&quot; src=&quot;data:image/png;base64,
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&quot;&gt;
&lt;/td&gt;
&lt;td style=&quot;border-left: 1px solid silver;&quot;&gt;Stay DRY! Refer to information already available in &lt;span class=&quot;monospaced&quot;&gt;package.json&lt;/span&gt;. You can define whatever config option in package.json and refer to it in the same way.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_call_any_script_in_another_script&quot;&gt;Call any script in another script&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;What if you want to run more than one script at the same time? You want for example watch &lt;span class=&quot;monospaced&quot;&gt;*.js&lt;/span&gt; files and &lt;span class=&quot;monospaced&quot;&gt;*.scss&lt;/span&gt; files and preprocess them? How can you do this with one &lt;span class=&quot;monospaced&quot;&gt;npm script&lt;/span&gt;?&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;You can concatenate different scripts and run them all at the same time:&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;span style=&quot;color: #FF0000&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #FF0000&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;sass-watch&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;node-sass -watch src/style.scss dest/style.css&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;,&lt;/span&gt;
    &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;babel-watch&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;babel -w *.js dist&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;,&lt;/span&gt;
    &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;watch&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;npm run sass-watch &amp;amp; npm run babel-watch&quot;&lt;/span&gt; &lt;span style=&quot;font-style: italic&quot;&gt;&lt;span style=&quot;color: #9A1900&quot;&gt;// &lt;img alt=&quot;1&quot; src=&quot;data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAAAAABzHgM7AAAAAmJLR0QAAKqNIzIAAABjSURBVHja
VY6xDcAwCAS/pPQaLim9QmajdOk2I2SNrMEIlARIoigU8Cek/4e7zdHaWOYOVwaoA6wOCw05Y7FB
gE0tIWQ+sBcwKM8qoD/wB5wGL8hjfdzWrh01GRp1hInGjDoXwHgsFuzBVLQAAABDdEVYdFNvZnR3
YXJlAEAoIylJbWFnZU1hZ2ljayA0LjIuOCA5OS8wOC8wMSBjcmlzdHlAbXlzdGljLmVzLmR1cG9u
dC5jb22RuiG4AAAAKnRFWHRTaWduYXR1cmUANThhMDcyZTA3MGRhMjJmNjEzNWNiZDNlNDE0NTQ2
ZjloaiHtAAAADnRFWHRQYWdlADEyeDEyKzArMIRtu30AAAAASUVORK5CYII=&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style=&quot;color: #FF0000&quot;&gt;}&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;colist arabic&quot;&gt;&lt;table&gt;
&lt;tr&gt;&lt;td&gt;&lt;img alt=&quot;1&quot; src=&quot;data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAAAAABzHgM7AAAAAmJLR0QAAKqNIzIAAABjSURBVHja
VY6xDcAwCAS/pPQaLim9QmajdOk2I2SNrMEIlARIoigU8Cek/4e7zdHaWOYOVwaoA6wOCw05Y7FB
gE0tIWQ+sBcwKM8qoD/wB5wGL8hjfdzWrh01GRp1hInGjDoXwHgsFuzBVLQAAABDdEVYdFNvZnR3
YXJlAEAoIylJbWFnZU1hZ2ljayA0LjIuOCA5OS8wOC8wMSBjcmlzdHlAbXlzdGljLmVzLmR1cG9u
dC5jb22RuiG4AAAAKnRFWHRTaWduYXR1cmUANThhMDcyZTA3MGRhMjJmNjEzNWNiZDNlNDE0NTQ2
ZjloaiHtAAAADnRFWHRQYWdlADEyeDEyKzArMIRtu30AAAAASUVORK5CYII=&quot;&gt;&lt;/td&gt;&lt;td&gt;
&lt;span class=&quot;monospaced&quot;&gt;npm run watch&lt;/span&gt; will call both custom scripts and run them at the same time. This will create two processes that run independently from each other.
&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;table frame=&quot;void&quot; cellpadding=&quot;4&quot;&gt;
&lt;tr valign=&quot;top&quot;&gt;
&lt;td&gt;
&lt;img style=&quot;border-image: none 0;&quot; alt=&quot;Tip&quot; src=&quot;data:image/png;base64,
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&quot;&gt;
&lt;/td&gt;
&lt;td style=&quot;border-left: 1px solid silver;&quot;&gt;Concatenate multiple scripts with &lt;span class=&quot;monospaced&quot;&gt;&amp;amp;&lt;/span&gt; to run them as one script.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;_run_any_script_in_your_span_class_monospaced_node_modules_bin_span_directory&quot;&gt;Run any script in your &lt;span class=&quot;monospaced&quot;&gt;node_modules/.bin&lt;/span&gt; directory&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;Installing any &lt;span class=&quot;monospaced&quot;&gt;node module&lt;/span&gt; that adds it&amp;#8217;s own executable script, will be available from &lt;span class=&quot;monospaced&quot;&gt;projectDir/node_modules/.bin&lt;/span&gt;. Let&amp;#8217;s say, you need &lt;span class=&quot;monospaced&quot;&gt;babel&lt;/span&gt; for your project and you installed it with &lt;span class=&quot;monospaced&quot;&gt;npm install babel-cli --save-dev&lt;/span&gt;, you can run babel from within your project directory by typing &lt;span class=&quot;monospaced&quot;&gt;./node_modules/.bin/babel&lt;/span&gt;. That is great, since you don&amp;#8217;t have to rely on a global installation of babel.&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;If you want to run &lt;span class=&quot;monospaced&quot;&gt;babel&lt;/span&gt; as part of a script, you would probably specify the whole path to the babel script:&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;span style=&quot;color: #FF0000&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #FF0000&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;babel-watch&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;./node_modules/.bin/babel -w *.js dist&quot;&lt;/span&gt;
&lt;span style=&quot;color: #FF0000&quot;&gt;}&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;Since &lt;span class=&quot;monospaced&quot;&gt;npm&lt;/span&gt; adds all executable script to the &lt;span class=&quot;monospaced&quot;&gt;PATH&lt;/span&gt; for the script, you can instead write&lt;/p&gt;&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;span style=&quot;color: #FF0000&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #FF0000&quot;&gt;{&lt;/span&gt;
    &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;babel-watch&quot;&lt;/span&gt;&lt;span style=&quot;color: #990000&quot;&gt;:&lt;/span&gt; &lt;span style=&quot;color: #FF0000&quot;&gt;&quot;babel -w *.js dist&quot;&lt;/span&gt;
&lt;span style=&quot;color: #FF0000&quot;&gt;}&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;table frame=&quot;void&quot; cellpadding=&quot;4&quot;&gt;
&lt;tr valign=&quot;top&quot;&gt;
&lt;td&gt;
&lt;img style=&quot;border-image: none 0;&quot; alt=&quot;Tip&quot; src=&quot;data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAKZUlEQVRoge2aa3BU5RmAn3Pbs7fs
JmwCRGITk0hVLFAtNWoq6pAiU0cKaYfa6ShT+YN4YbQw9F/8QX+UMv6gM3Q6oxMV6TgIbe10Gq2g
cSzDpRaFgmIk4SKB3LP3Pff+SM66m+xuFvEyzvSbeefsbva8+z7nvXzf934RHMfhmzzEr9uAqx3/
B/i6xzceQP6iFDmT1cBxHNzCkFsgBEHIXnNeC1f7u1cN4DiOY9s2rliWhWVZWRDHcbJGC4KAJElI
koQoioii6IiieFUgnxvAtm3HNdg0Tbq6uuju7ubYsWP09vYyMjKCpmmoqkokEqGhoYGFCxfS2tpK
W1sbiqJkRZIkZxLoikGEK50H3CdumiZ9fX3s3LmT3bt3U1V3A0033cKc2nkEQxV4PSqSJOI4Dpqu
k0gkGLx8kZ4T7zF87iSrV69m3bp1NDY2oqoqHo8HWZa5Uo9cEYBt245lWRiGQUdHB9u2beOe1Y8w
/6bFVAT9xJJpYvEUiVSGjG5gmBY4DqIoonoUfF4PoYAfRRE5/8kp3njlD6xfv54tW7YQCATw+Xyu
R8r2RtkAtm07pmly5MgRHn/8cZSaZpbcfjd+n5f+wVEGRqJkdCMv3vME8t77vB6qQn4+OX6YsXPH
2bp1Ky0tLQQCAVRVdb0xI0RZZdQ1ft++fSxbtozrlqzgrnvvI5nRee9UL+f6h9B0A1EQEIsBiOKE
TL7XdJOBkTg1jYtouu1+1qxZw549e4hGo6TTaUzTxLbtGZ/ujEmca/wvHnqYnz/2DLNn19B74TID
I9HPjCvwlLMls4RHdMNC8IRZ8dBmnnp6E7Zts2rVKgB8Ph+yLDulPFEyhBzHcUzT5PDhwyxbtow1
j3YQqanmozOfEk2kChuLQ3x0lGQihmM7qF4vVdWz8fr9hYFyoK30OG/ufpYXXniB1tZWwuEwXq8X
WZaLJnZJAMuyHE3TuPPOO2lcsoLGpmZO9ZzPM37q0x0ZuISla2xY2077j5ZSFargZM9Znt97gE8u
DBb3ziRIfPAcF4/v59VXX6W6uppQKISqqkiSVBCgaA64odPR0YFS00xjUzNnLlwmmkznxbKYI45j
k04mefaZJ3j04VXMqZ6Fx6Pw3QXXs/3Xv6Tp2rnTALL3T8wDBCLz8M2Zz/bt24nFYjPmQ0EAt9b3
9fWxbds2ltxxD0NjMQbdmC+QlIIgIIkSoWCAH971/Wk6PYrCg/f/oHiVmhSP6qWm/gY6Ozvp6ekh
mUyi6zq2bWeXK+UAYFkWO3fu5N72dQT8Pi5cGp6xuoiiiBoMktH0gl5trp87DbqQBEMRbl32U3bt
2kUikUDTtOzypGwAwzDYvXs3316wiEuDoxiGWVaZrAjP4qW/vFUQ4NAHPdlwKQWiqF4qa+ro6uoi
kUiQTqcxDKM8ADd8Xn/9dWZdewMVwSCDo7GicT8NSBTZt/8oT259jgOHThBNpIgmUjy3dz/P7z2Q
r2My7gs9FNUXoPpbN9Ld3Z0FKBRG0+YBN3y6u7tpWnAr8WR6+gxLfr03TYNMMolhGFimiWVbXDzb
x4G3/4XgOIiyTF3DdW45nHG2RhBQfX6q65o5evQoy5cvn9BtWUiSRG5FLQhg2zbHjh3j+tsfKFrv
3R8EGL7UT23NLNraWmi+ro5r5kSYHakiVOHH7/OiyDKxZIonf9NJIpWZMQcEwOPx4vNXcPr0B2Qy
mdxEzrO34ExsWRa9vb3csjzEaP9w1sUFZ1RBQJJk/vjbTdTXzS2kDoBQwI9HmcEDOSJ7PAiiSH9/
P7quY5omlmVN01soB3Ach5GREbyqiqabM8a+NxAglcmvPOf7h9jR+WdOfNQLwNtHTzIeT+XFfdGC
IAiIogSOQzQaxTRNdy4ozwO2baNpGpIkY1j2RAJTeJ0jCAKRmtmcPHORmkglxz48y/5DJ3jrnUPM
b7iGxx7+MZZls/efR0rG/VQPgwMC2eQtZHxRAABVVbM3lEpgV178azcvvfYOgiCgZTJomsbGR9oR
BIHzl4YYGo2VlcCuWOaE5xVFwbbtqVHiCJOZXBQgEomg6zqSKOIUMrqER+LRKItvaubW78wH4NLQ
WNmx7+q1DB1ZkgmFQohifqS7xhcFEEWRhoYGEokEqkeeWPLmurcEiGPbpJJJfvbAPVl95/qHJyYv
mH5/EdG1FA5QW1ubzZvc8pm1deoHroKFCxcycPkiPlWdnmC5iTxlVk2n0wT9Xu69Y3FW51g8OfH3
ye+WnAgnRcukyKQSNDU1Icty7n65NACAJEm0trbSc/zfVAT9JZ/U1NWklslwx/duxqMoWX0Zzcy/
bwr0VCDT0NDTSS6f/ZBFixZlN/ySJJXnAVEUaWtrY6DvOIoiFlx5FhPLsrjl5uvzdPq8nsLfL6I3
FR1FlhUG+v5LS0tLtmtRlgcEYaL5pCgKq1ev5lzPKfxeT8FwKSQA115Tk6eztjpcsubn6rUMnfj4
MLHxIZYuXYrX683rVpQDIIiiiKIorFu3jn+8vIPKCt+0cCkG4m4Bc0fd3OqCoVIIJDo2iCQrvPu3
F1m5cmVeu6VQz6hgDrj1t7GxkfXr1/Px+wdRPcr02C+wmgxVVnLm3KU8ffNmVxX03lSgRHSEVGyc
oYt9tLe3U19fTzAYzAKUVYVyw0hVVbZs2cJw7/uYyZGSIeCCeFWVd499jGGaWX1zq8OfrYOKeC+T
ijM+cBHHsRju/Q9r164lFAoRDAbdPfEVAQiiKOLxeAgEAmzdupW/v/A7RLPEyjTHuGjKYMfLb3B5
eBzdMNl/+CSmZReN+0wqztDFs4iSxIE9O9mwYQPhcJhwOEwgEMhN4GkEZXUlYrEYe/bs4elfbWLF
Q5tQKyJlVaRy+kSJ6AhjA58iihJdf9rBUxufYPny5cyZM6esrkTJxpabzIFAgFWrVmHbNps3b+bu
n6wnVF2H4lHLmlULgZiGTmxkgGR8DNu2efOV3/PUxo20tbURiUSorKwkEAhkk7fYmLE36rZX0uk0
0WiUgwcP0tHRQcW8G5ndsIBgaBYe1TvtyRYDMXWNZGyU+Ngwkiwz+GkfQ73vsWHDBhYvXkwkEmHW
rFmEw2G3M1eyR1pWczcXIh6PMz4+zvbt2+ns7OS2+x6kanYdqjeA1xdAUb3IioIoSjg42JaJaejo
mTRaOoGeTiHJEvGxYd55rZP29nbWrl1LOBymqqqKyspKKioqyjK+bIBcCE3TSCaTxGIxenp62LVr
F11dXdTUL2BO/Xx8/goEUcSxbYSJ2EGS5IlzgnSC/r4PuXzmOEuXLmXlypXU19cTCoUIh8OEQqEr
7k5/7vOBdDpNMpkkkUiQSCTo7u7m6NGjnD59mv7+fqLRKIZhoCgKoVCI2tpampqaWLRoES0tLfh8
Pvx+P8FgkGAw+OWfD7gj94RG13U0TSOdTpNOp8lMbmQ0TcvbArrrK1mW8Xg8eL3e7BLB5/N9dSc0
uSP3jMwwjKy4G3AXwB0ugAsx5YzMndW//DOy3OFMjGwrxrKs7NX9LBfAneFFUcxec6rU5zqpvCqA
qTCT16/0nPgLA/i6xjf+Xw3+B2ll/uiqTaJTAAAAAElFTkSuQmCC&quot;&gt;
&lt;/td&gt;
&lt;td style=&quot;border-left: 1px solid silver;&quot;&gt;Don&amp;#8217;t specify the full path to a script in your projects &lt;span class=&quot;monospaced&quot;&gt;node_modules/.bin&lt;/span&gt; folder. Use the command without the path.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;div class=&quot;paragraph&quot;&gt;&lt;p&gt;Thank you very much for reading. If you have any comments or questions, please leave them in the comments below.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/153295344339060183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/153295344339060183' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/153295344339060183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/153295344339060183'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2016/03/5-npm-script-secrets.html' title='5 npm script secrets'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-6724332831259337670</id><published>2015-11-01T23:30:00.000-08:00</published><updated>2015-11-01T23:30:02.066-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="experience"/><category scheme="http://www.blogger.com/atom/ns#" term="german"/><category scheme="http://www.blogger.com/atom/ns#" term="running"/><category scheme="http://www.blogger.com/atom/ns#" term="travel"/><category scheme="http://www.blogger.com/atom/ns#" term="usa"/><title type='text'>Einmal Tennessee und zurück</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot; style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;background-color: white; color: #292929; line-height: 24px;&quot;&gt;&quot;Put on my blue suede shoes&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;background-color: white; color: #292929; line-height: 24px;&quot;&gt;And I boarded the plane&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;background-color: white; color: #292929; line-height: 24px;&quot;&gt;Touched down in the land of the Delta Blues&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;background-color: white; color: #292929; line-height: 24px;&quot;&gt;In the middle of the pouring rain&quot;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/blockquote&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Chattanooga&lt;/h2&gt;
Diese Zeilen aus dem Song &quot;Walking in Memphis&quot; von &lt;a href=&quot;https://www.youtube.com/watch?v=KK5YGWS5H84&quot; target=&quot;_blank&quot;&gt;Marc Cohn&lt;/a&gt;, hatte ich im Kopf, als ich letzten Donnerstag mit dem Flugzeug in &lt;a href=&quot;https://en.wikipedia.org/wiki/Chattanooga,_Tennessee&quot; target=&quot;_blank&quot;&gt;Chattanooga&lt;/a&gt; gelandet bin. Wow, wo bin ich hier gelandet? Alles irgendwie anders, langsamer, aber spannend und interessant. Chattanooga ist eine Kleinstadt, die wirtschaftlich stark gelitten hat, als die großen Industriebetriebe ihre Türen geschlossen haben. Viele gutbezahlte Arbeitskräfte haben ihren Job verloren und zu einer hohen Arbeitslosenquote geführt. Mehr als 20 Jahre hat die Stadt gebraucht, um sich von diesem wirtschaftlichen Untergang zu erholen. Heute hat Chattanooga den Tourismus für sich entdeckt. Ansonsten finden eine ganze Menge Sportveranstaltungen in Chattanooga statt. Die größte Veranstaltung ist ein Ironman.&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjusLudVOX2_gp7zFBulCTukHCtWXb3wMfth9agJ4iSPjIJ2kKsfy1s2EHWfW0WD0LxTSk-f95XN56kDZBS3p7t1MQ4pZ2c2syEf5aG3Mkdu5o75snwaXWU8B3ovEt_ivBsaml7vBG0Un5f/s1600/IMG_0347.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjusLudVOX2_gp7zFBulCTukHCtWXb3wMfth9agJ4iSPjIJ2kKsfy1s2EHWfW0WD0LxTSk-f95XN56kDZBS3p7t1MQ4pZ2c2syEf5aG3Mkdu5o75snwaXWU8B3ovEt_ivBsaml7vBG0Un5f/s640/IMG_0347.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Chattanooga Airport&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4iUv1kAvOUSXh4Jdj0F3LJpIKLJ_d7Fu2CLBBuB6QDMSJ4DWmkrH-JEBdMUN_gAGBhNQYd2pLbxw6yIjHJL8-8DSOUNKSgszr_sFranJUrYiRnTrFdSGblY5FIcFJyFXOYyqR6Yv4SIkf/s1600/IMG_0341.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4iUv1kAvOUSXh4Jdj0F3LJpIKLJ_d7Fu2CLBBuB6QDMSJ4DWmkrH-JEBdMUN_gAGBhNQYd2pLbxw6yIjHJL8-8DSOUNKSgszr_sFranJUrYiRnTrFdSGblY5FIcFJyFXOYyqR6Yv4SIkf/s640/IMG_0341.JPG&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Die orangenen Laufschuhe&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
Statt Lederschuhen hatte ich meine Laufschuhe an.&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD4ClQCZGw0QFc_YXXV9O0js9b8ZkaqOeNnS8LZi8TJGosHyTvbwmX6BqNCseZiPPjaG1NPp6iTQ3BxyFXGatjTXX574_7ASST8XADvsrMcZ3GEsCZ3GWHv_YkukppcNN8olFyVvDNuGo0/s1600/IMG_0352.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD4ClQCZGw0QFc_YXXV9O0js9b8ZkaqOeNnS8LZi8TJGosHyTvbwmX6BqNCseZiPPjaG1NPp6iTQ3BxyFXGatjTXX574_7ASST8XADvsrMcZ3GEsCZ3GWHv_YkukppcNN8olFyVvDNuGo0/s640/IMG_0352.JPG&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Downtown Chattanooga&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9pup32OwmUDCOl2n11p9LIRMPBFZCwiqRkJRI0CRdK-61tShFbG8WAmaEotJGw0NU4-eBPQhyphenhyphenJx_Ck-sVjgkTqo5lwiSVFPHg4HP1dpTERnX5gsVGKfYiFu5EBwD26M_XfnSvX8LEja_u/s1600/IMG_0353.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9pup32OwmUDCOl2n11p9LIRMPBFZCwiqRkJRI0CRdK-61tShFbG8WAmaEotJGw0NU4-eBPQhyphenhyphenJx_Ck-sVjgkTqo5lwiSVFPHg4HP1dpTERnX5gsVGKfYiFu5EBwD26M_XfnSvX8LEja_u/s640/IMG_0353.JPG&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Coco Cola in Chattanooga&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF2O25WyF4qZSZl4mM3Yq6drfUw5bA2n2p-dhV4ggc-uL2FA7CxEr2NBtGOnV01D-l7DTn_yckQo7PzWAeAhsnhe0pmPM9Ivf1WnK2GVH058-ozZUClA4hNPrgz6MmNdCZAmNi2fAqFAD9/s1600/IMG_0359.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF2O25WyF4qZSZl4mM3Yq6drfUw5bA2n2p-dhV4ggc-uL2FA7CxEr2NBtGOnV01D-l7DTn_yckQo7PzWAeAhsnhe0pmPM9Ivf1WnK2GVH058-ozZUClA4hNPrgz6MmNdCZAmNi2fAqFAD9/s640/IMG_0359.JPG&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Ein paar weise Worte.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJY0cGgd6rH8n2C9-GWnL5i1G80eYxDoOyWP6Ks74LkMxEt167vRylnb5cYxsH8tn3Ce4Yd25rHbmC15SK469ZBln2lD-5wTuZPRm3yqZArJiLOW5YyfsQrLxqE-IMhQ05H8KrSn89YgHf/s1600/IMG_0380.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJY0cGgd6rH8n2C9-GWnL5i1G80eYxDoOyWP6Ks74LkMxEt167vRylnb5cYxsH8tn3Ce4Yd25rHbmC15SK469ZBln2lD-5wTuZPRm3yqZArJiLOW5YyfsQrLxqE-IMhQ05H8KrSn89YgHf/s640/IMG_0380.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Market Street Bridge über den Tennessee River&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx5dOQhr5N_b5dm7BDr6FesEWSTeld6sJuA2XJGzYcjYSyzU90vHq3En8xBs6wSKX3QPra7KY4SL9KDBGl_BcC8Q1KYSvntqaL7hZRoGYAasUPD6fLDGHQq71b8vTO3qH9K3bTEHUGhFKb/s1600/IMG_0381.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx5dOQhr5N_b5dm7BDr6FesEWSTeld6sJuA2XJGzYcjYSyzU90vHq3En8xBs6wSKX3QPra7KY4SL9KDBGl_BcC8Q1KYSvntqaL7hZRoGYAasUPD6fLDGHQq71b8vTO3qH9K3bTEHUGhFKb/s640/IMG_0381.JPG&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Sonnenuntergang am Tennessee River&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimw_N-ind24Bc-3BQcq1-vMQf0XnDbZO3srY_J4pkrm557COJ_enMlAk-AtfUSC0Fm05XT1Bx-PsJZd4EbvkhO3EvEwqAbYdDa2HQjlAtA8Y1vdkBZ_rifeIY3KADv2w7rtjnAFy0ataWX/s1600/IMG_0387.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimw_N-ind24Bc-3BQcq1-vMQf0XnDbZO3srY_J4pkrm557COJ_enMlAk-AtfUSC0Fm05XT1Bx-PsJZd4EbvkhO3EvEwqAbYdDa2HQjlAtA8Y1vdkBZ_rifeIY3KADv2w7rtjnAFy0ataWX/s640/IMG_0387.JPG&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Leider auch hier: Bausünden&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUT_DXY7d16TpsfvCPfugnTS9n7Qy0D4aS0VO2BYN1tYj2octKfmC7m7aj04gCTOuOPCgP-RbCiWtw3Fbp5eOpg-LCczA_7kc-4LEiAs-SkVYV1-pfkUGnHs_jdJPfpOafeyAOfJQNbghv/s1600/IMG_0392.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUT_DXY7d16TpsfvCPfugnTS9n7Qy0D4aS0VO2BYN1tYj2octKfmC7m7aj04gCTOuOPCgP-RbCiWtw3Fbp5eOpg-LCczA_7kc-4LEiAs-SkVYV1-pfkUGnHs_jdJPfpOafeyAOfJQNbghv/s640/IMG_0392.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&quot;Kleine Kuchenauswahl&quot; in einem lokalem Cafe&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Ich war hier angekommen um an einer, ich möchte mal vorsichtig sagen, verrückten Veranstaltung teilzunehmen: ein Staffellauf von &lt;a href=&quot;https://en.wikipedia.org/wiki/Chattanooga,_Tennessee&quot; target=&quot;_blank&quot;&gt;Chattanooga&lt;/a&gt; nach &lt;a href=&quot;https://en.wikipedia.org/wiki/Nashville,_Tennessee&quot; target=&quot;_blank&quot;&gt;Nashville&lt;/a&gt;. Distanz ca. 200 Meilen (ungefähr 320 km). Teams haben entweder 12 oder 6 Läufer. Gelaufen wird die ganze Zeit. Egal wie spät es ist. Ankunft aller Läufer in Nashville ca. 24-30 Stunden später.&lt;br /&gt;
Mein Team bestand aus 12 Läufern und jeder von uns ist 3 mal in dieser Zeit gelaufen. Die zu laufende Distanz pro Läufer variierte zwischen 3 und 10 Meilen.&lt;br /&gt;
&lt;br /&gt;
Jedes Team hat 2 Vans mit jeweils 6 Läufern. Ich war in Van 1 unseres Teams und der letzte Läufer der 6er Gruppe.&lt;br /&gt;
Ich bin das erste mal am Freitag um 14:30h unterwegs gewesen. 3.1 Meilen in der prallen Mittagssonne. Nicht meine Lieblingsbedingungen zum Laufen. Aber was solls. Immerhin hatte ich eine relativ flache und kurze Strecke zu absolvieren.&lt;br /&gt;
&lt;br /&gt;
Mein nächster Einsatz war dann erst Nachts um 23:30h. Kurze und flache Strecke mit 2.7 Meilen Länge. Der letzte Lauf war dann am nächsten Tag um 9:00h. Diesmal 4.5 Meilen und mit ziemlich vielen Anstiegen. Immerhin war die Temperatur angenehm zum laufen.&lt;br /&gt;
Danach war ich aber auch froh, dass ich nicht nochmal Laufen musste.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo0wAvXn_ijUNztrtQz9c7FN95GmlEhNPYQ_jGt1U03L9nuphSva90YRVASuUI1uvmcVlTpSt6061ePd02kW6Iw4H97lgr3WqvFVkakK0l9UsCRqXs3NAS02AGTP-GW4uSrhoUIgdz4TYQ/s1600/IMG_0529.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo0wAvXn_ijUNztrtQz9c7FN95GmlEhNPYQ_jGt1U03L9nuphSva90YRVASuUI1uvmcVlTpSt6061ePd02kW6Iw4H97lgr3WqvFVkakK0l9UsCRqXs3NAS02AGTP-GW4uSrhoUIgdz4TYQ/s640/IMG_0529.JPG&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Nach dem letzten Lauf. Fertig, aber glücklich.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioEe6NBiDOSTr1TBDhICCBjRgrq1DaH847Gi9vnR2tc_MSa1p1vlxgw1KMsK-t9qf0eKR2cqF2xPg0Q8IlNaqaHPOz8gxMEBH-0JTVWsJe5EtcGSPr8xI_lDfzQhZcdjMQsdNhBUEu7wBs/s1600/IMG_0531.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioEe6NBiDOSTr1TBDhICCBjRgrq1DaH847Gi9vnR2tc_MSa1p1vlxgw1KMsK-t9qf0eKR2cqF2xPg0Q8IlNaqaHPOz8gxMEBH-0JTVWsJe5EtcGSPr8xI_lDfzQhZcdjMQsdNhBUEu7wBs/s640/IMG_0531.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Jo, genau das richtige nach dem Laufen: Zucker, Mehl und Fett in Kreisform. Auch als Donut bekannt.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCwdPZFlX91GRNREHT3qHMqq3Rp3zdeLsVq_uB8QoGktCa_JdhN6ve1V9XNDxuC97qF44PyeJXADphaFL4pqL9WK4DJto5V2psh-ZM9hb4Fchx5nd_3DAuCPssFCzXBzOjxt7GhrsVgjfj/s1600/IMG_0538.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCwdPZFlX91GRNREHT3qHMqq3Rp3zdeLsVq_uB8QoGktCa_JdhN6ve1V9XNDxuC97qF44PyeJXADphaFL4pqL9WK4DJto5V2psh-ZM9hb4Fchx5nd_3DAuCPssFCzXBzOjxt7GhrsVgjfj/s640/IMG_0538.JPG&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Zieleinlauf in Nashville bei bedecktem Himmel&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgFQoCh7ssOhMGFQ6CXZHd2pv_uEx8wC8mifsyUqcEh7nblaJeds9oMwVtYpa-XxBLg-QcEoTe6qWwuoMTqfbbuPqaaYvGbHhVAOSmje_HPKRW8zMhVXoFiahX46rewiLCOw9n3ess5513/s1600/IMG_0553.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgFQoCh7ssOhMGFQ6CXZHd2pv_uEx8wC8mifsyUqcEh7nblaJeds9oMwVtYpa-XxBLg-QcEoTe6qWwuoMTqfbbuPqaaYvGbHhVAOSmje_HPKRW8zMhVXoFiahX46rewiLCOw9n3ess5513/s640/IMG_0553.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Lea und ich warten mit den anderen auf die Ankunft unserer 6 Läufer aus Van Nr. 2&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsHUH5YPhV4w_7E7mT-qkJrnhsAiwl7QkPh-1WEgQDiEIntiJzf8knZ1Kl0L24GRfhWpEPKl1rvHAymaennhdrit9IfEDzjfyWiNzOR-PPWpHDyDeNJ5E0BMrY0nijPtDjDKUyIkYzP7mr/s1600/IMG_0566.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsHUH5YPhV4w_7E7mT-qkJrnhsAiwl7QkPh-1WEgQDiEIntiJzf8knZ1Kl0L24GRfhWpEPKl1rvHAymaennhdrit9IfEDzjfyWiNzOR-PPWpHDyDeNJ5E0BMrY0nijPtDjDKUyIkYzP7mr/s640/IMG_0566.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Sehr coole Idee: alle unsere Medaillen ergeben zusammen eine grosse Medaille&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWaE4YOVj9ofkgdbzECuPlcaK7PStNt2FLneBgOftY-_RAG_S_giPP6VaTGmNRppuuiLREA5Bg1JY1Ko-6VkNx4NuVlqh9TK9RJ8kgV2tfYgZfqdGvoSUhXX_2yyms51LwcfxHQ8nlor0W/s1600/IMG_0588.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWaE4YOVj9ofkgdbzECuPlcaK7PStNt2FLneBgOftY-_RAG_S_giPP6VaTGmNRppuuiLREA5Bg1JY1Ko-6VkNx4NuVlqh9TK9RJ8kgV2tfYgZfqdGvoSUhXX_2yyms51LwcfxHQ8nlor0W/s640/IMG_0588.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Abendessen mit dem gesamten Team nach fast 30 Stunden&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Die ganze Veranstaltung war sehr gut organisiert. Viele Helfer bei den Übergabestellen. Für die längeren Pausen wurden immer Schulen hergerichtet und die Turnhallen zu Schlafplätzen umfunktioniert. Auch in den Schulen waren sehr viele Helfer unterwegs. Sei es nun, um das Chaos auf den Parkplätzen zu koordinieren oder aber um Essen und Getränke in der Schulkantine zu verkaufen.&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Drei Dinge sind mir aufgefallen, als ich in Tennessee war:&lt;/h3&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Hier läuft die Zeit langsamer! Im Vergleich zur Bay Area, wo sich alles schnell bewegt, ist in Tennessee alles ein paar Takte langsamer. Aber das war sehr entspannend, obwohl die Wartezeit in Restaurants manchmal schon als grenzwertig lang zu bezeichnen war.&lt;/li&gt;
&lt;li&gt;Die Menschen sind hier sehr freundlich. Jemand hat mir gesagt, dass das die &lt;b&gt;Southern Hospitality&lt;/b&gt; ist. Aufgesetzt und hinter der Fassade sieht es anders aus. Ich hab mich dort aber sehr wohlgefühlt und die Interaktion mit den Menschen war ausgesprochen nett.&lt;/li&gt;
&lt;li&gt;Es mangelt hier nicht an Kirchen!!!&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Nashville ist cool!&lt;/h3&gt;
&lt;div&gt;
Wirklich? Ja, ich finde schon. Die Stadt hat ein paar schöne Ecken. Für Unterhaltung ist auf dem Broadway gesorgt. Bars und Restaurants mit Live Musik. Country Musik ist nicht jedermanns Sache, aber es passt alles zusammen hier. Die Menschen haben Spass und die Stimmung war überall toll. Es gibt noch ein Football und ein Eishockey Team. Beide Teams haben ihre Stadien in Laufweite vom Broadway. Rundherum um den Broadway gibt es eine ganze Menge Geschäfte zum Einkaufen (Cowboy Hut und Stiefel gefällig?). Des Weiteren sind noch eine Menge Museen vorhanden. Allen voran die &lt;b&gt;Country Music Hall of Fame&lt;/b&gt;. Leider war die Hall of Fame am Sonntag geschlossen und wir sind ins Johnny Cash Museum gegangen. Sehr interessant und in einer Stunde gut zu schaffen.&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnhkoFznohTEfAjR4k3RBoE21AfSNd9QSzORQULWSpAgt5UtqiOz0qCSSPX0EYyKYgeiVC7eF72dD9TNpOw-KjdENciKyMVJNrlKVlH1g5sI-8AvdvK2SK6HkaaMI-Az2yTbenHYNKiZKQ/s1600/IMG_0599.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnhkoFznohTEfAjR4k3RBoE21AfSNd9QSzORQULWSpAgt5UtqiOz0qCSSPX0EYyKYgeiVC7eF72dD9TNpOw-KjdENciKyMVJNrlKVlH1g5sI-8AvdvK2SK6HkaaMI-Az2yTbenHYNKiZKQ/s640/IMG_0599.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Der hippste und teuerste Coffeeshop in Nashville&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Noch eine kurze Anekdote zum oben abgebildeten Coffeeshop: ich wollte für mein Team Kaffee besorgen, da wir vor dem Restaurant auf unser Frühstück etwas länger warten mussten (Ansage was 30 Minuten). Ich bin also schnell um die Ecke gegangen, hab dort ein paar Kaffee geordert und wollte dann schnell wieder zurück sein, damit die anderen ihren Kaffee trinken konnten solange sie in der Schlange draussen warten mussten. Nach 20 Minuten bekam ich eine Nachricht von meinem Team. Die Frage nach dem Kaffee musste ich verneinen und meine Bestellung hab ich per SMS übermittelt. Leider hatte ich nach 20 Minuten immer noch keinen Kaffee in der Hand. Kurz darauf hab ich den Kaffee bekommen und bin schnell wieder zurück zum Frühstückslokal. Schmunzelnde Gesichter bei meiner Ankunft. Der Kaffee war gut und teuer (Cappucino $5,50, Ice Cafe Latte $7,50) und hat ewig gedauert. &lt;b&gt;Wie ich eingangs schon mal erwähnte: alles läuft hier langsamer als anderswo. Lektion gelernt.&lt;/b&gt;&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Und zurück in die Bay Area&lt;/h3&gt;
Die Kolumne in der New York Times heißt &amp;nbsp;&quot;36 Stunden in xxx&quot; (xxx=nimm irgendeine Stadt auf der Welt). Leider hatte ich weniger als 36 Stunden in Nashville. Ich hab ein bisschen was gesehen von der Stadt. Aber es gibt&amp;nbsp;noch soviel andere Dinge zu entdecken, die ich mir für einen zukünftigen Besuch gemerkt habe. Also, bis bald mal wieder in Nashville. Dann mit etwas mehr Zeit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/6724332831259337670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/6724332831259337670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/6724332831259337670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/6724332831259337670'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2015/11/einmal-tennessee-und-zuruck.html' title='Einmal Tennessee und zurück'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjusLudVOX2_gp7zFBulCTukHCtWXb3wMfth9agJ4iSPjIJ2kKsfy1s2EHWfW0WD0LxTSk-f95XN56kDZBS3p7t1MQ4pZ2c2syEf5aG3Mkdu5o75snwaXWU8B3ovEt_ivBsaml7vBG0Un5f/s72-c/IMG_0347.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-5312519217797262846</id><published>2015-10-29T08:30:00.000-07:00</published><updated>2015-10-29T08:30:00.284-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Installation"/><category scheme="http://www.blogger.com/atom/ns#" term="NAS"/><category scheme="http://www.blogger.com/atom/ns#" term="Owncloud"/><category scheme="http://www.blogger.com/atom/ns#" term="Synology"/><category scheme="http://www.blogger.com/atom/ns#" term="tips"/><category scheme="http://www.blogger.com/atom/ns#" term="tricks"/><title type='text'>Install ownCloud on Synology NAS DS413</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Here is a list of steps required to install o&lt;a href=&quot;https://owncloud.org/&quot;&gt;wnCloud&lt;/a&gt; on a Synology NAS. I have a DS413 and I was able to install ownCloud on it. I don&#39;t know about the other Synology models out there. Let me know, if you succeeded to install&amp;nbsp;ownCloud&amp;nbsp;on any other model.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;ownCloud&amp;nbsp;is not part of the official Synology packet repository. You need to add the community repository to install packets from there.&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Log into the Synology admin site&lt;/li&gt;
&lt;li&gt;Open &lt;b&gt;Package Center &lt;/b&gt;and open the &lt;b&gt;Settings. &lt;/b&gt;Under &lt;b&gt;Package Sources, &lt;/b&gt;add&amp;nbsp;&lt;b&gt;http://packages.synocommunity.com/&amp;nbsp;&lt;/b&gt;as a source (see screenshot). Click &lt;b&gt;Ok&lt;/b&gt;&amp;nbsp;to confirm the new repository.&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOF1746O5adQbAWXuiSWlBNCPWtneAIw8kcsK6cIbyyPLEHeleRswK6mMb3JmEihqKaIFLJkFWbPae4bUbyNo4IQoSVlszdlTHO41IfjikqkOt_U4w0MNc2uXdlyg-WnZPHSN6mdanOCZu/s1600/Screenshot+2015-10-28+22.50.06.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;368&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOF1746O5adQbAWXuiSWlBNCPWtneAIw8kcsK6cIbyyPLEHeleRswK6mMb3JmEihqKaIFLJkFWbPae4bUbyNo4IQoSVlszdlTHO41IfjikqkOt_U4w0MNc2uXdlyg-WnZPHSN6mdanOCZu/s640/Screenshot+2015-10-28+22.50.06.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;In &lt;b&gt;Package Center&lt;/b&gt;, refresh the list of available packets by pressing the &lt;b&gt;Refresh&lt;/b&gt;&amp;nbsp;button at the top of the window&lt;/li&gt;
&lt;li&gt;Now search for &lt;b&gt;MariaDB &lt;/b&gt;and install it. This is required to install Owncloud. Otherwise, the installation of&amp;nbsp;ownCloud&amp;nbsp;will abort with an error. MariaDB is a fork of MySQL and is one of two databases recommended by&amp;nbsp;ownCloud. The other one is PostgreSQL.&lt;/li&gt;
&lt;li&gt;Next enable &lt;b&gt;Web Station&lt;/b&gt;&amp;nbsp;in the Control Panel.&amp;nbsp;ownCloud&amp;nbsp;is a webapp and needs the http server to&amp;nbsp;properly work.&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEIaERGOAgCX4RGWMx4TtiMoXbrschPh-woGgZPvrhgL1Po2lTGxrsD3D2jICke710HQ6iUZxaP0CgfO9bE0erhxmm9JS7fHzqWhOr4eLRE5MDrdqut-RGC-0S4xgQj1wyHIA3fET91ImD/s1600/Screenshot+2015-10-28+23.12.02.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;364&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEIaERGOAgCX4RGWMx4TtiMoXbrschPh-woGgZPvrhgL1Po2lTGxrsD3D2jICke710HQ6iUZxaP0CgfO9bE0erhxmm9JS7fHzqWhOr4eLRE5MDrdqut-RGC-0S4xgQj1wyHIA3fET91ImD/s640/Screenshot+2015-10-28+23.12.02.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Before we continue with the&amp;nbsp;ownCloud&amp;nbsp;installation, you need to create a new shared folder. The&amp;nbsp;installation of&amp;nbsp;ownCloud&amp;nbsp;failed in the beginning, because this folder is required, but could not be&amp;nbsp;created.&lt;/li&gt;
&lt;li&gt;Open the &lt;b&gt;Control Panel&lt;/b&gt;&amp;nbsp;and open &lt;b&gt;Shared Folder&lt;/b&gt;. Create a new shared folder and give it the name&amp;nbsp;ownCloud&amp;nbsp;(this is the default during the&amp;nbsp;ownCloud&amp;nbsp;installation).&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUrRgoNKoNgtfFK0vFYNku53yKd4BKD32Osy5bu1-bcYWxpO-Flq-EQ7VmxbuWx5wQuEF0rhpsBbrdDsKdi1p9dvqEuxWBWZb88EUKLuiLxWRooaT8rFlgccRJZNCTxnZMJt19irfJUzgN/s1600/Screenshot+2015-10-28+23.06.55.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;408&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUrRgoNKoNgtfFK0vFYNku53yKd4BKD32Osy5bu1-bcYWxpO-Flq-EQ7VmxbuWx5wQuEF0rhpsBbrdDsKdi1p9dvqEuxWBWZb88EUKLuiLxWRooaT8rFlgccRJZNCTxnZMJt19irfJUzgN/s640/Screenshot+2015-10-28+23.06.55.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Check off &lt;b&gt;Hide this shared folder in &quot;My Network Places&quot;&lt;/b&gt;. Nobody should modify any content in this directory. This belongs to the&amp;nbsp;ownCloud&amp;nbsp;installation!&lt;/li&gt;
&lt;li&gt;Change the permissions of the newly created shared folder. In order to grant&amp;nbsp;ownCloud&amp;nbsp;read/write&amp;nbsp;permissions, select &lt;b&gt;http&amp;nbsp;&lt;/b&gt;from the &lt;b&gt;Local Groups&lt;/b&gt;&amp;nbsp;(in the Dropdown list on the left hand side above the table) and check the box in the &lt;b&gt;Read/Write&lt;/b&gt;&amp;nbsp;column. Press the &lt;b&gt;OK&lt;/b&gt;&amp;nbsp;button when done.&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfCmluo_OZpopsiM_0Efk7WXVfzHNIaf1nliPIq_LMPU_J_vFFGxNN2X7ZZnum-e5TqCwYpKLdU69j3p29D8dKkzCwobbnqU1MQApJW69fOQ3Euc5KonbHDcZTX4zXDg7o_Jk9i4MHghtQ/s1600/Screenshot+2015-10-28+23.14.30.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;408&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfCmluo_OZpopsiM_0Efk7WXVfzHNIaf1nliPIq_LMPU_J_vFFGxNN2X7ZZnum-e5TqCwYpKLdU69j3p29D8dKkzCwobbnqU1MQApJW69fOQ3Euc5KonbHDcZTX4zXDg7o_Jk9i4MHghtQ/s640/Screenshot+2015-10-28+23.14.30.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Now search for&amp;nbsp;ownCloud&amp;nbsp;and install it.&lt;/li&gt;
&lt;li&gt;During the installation of&amp;nbsp;ownCloud, you will be asked to enter the password for the&amp;nbsp;&lt;b&gt;root&lt;/b&gt;&amp;nbsp;user. Leave this field empty. By default there root password is not set (this is not secure at all, but for demo purposes, this should be alright)&lt;/li&gt;
&lt;li&gt;After ownCloud was installed properly, click on the URL in the&amp;nbsp;ownCloud overview page in the &lt;b&gt;Package Center&lt;/b&gt;. In my case it&#39;s http://192.168.1.22/owncloud.&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfb4L-2WO4WJ7fuBTh4Zo89RxzuKPyFDAAB_5CeaSl6u_jMvDldG-36WhROZeOdGN-bjd9dZ9w9Wpw0A_jSXDpMFhUAPIZPf7H49iDPc-14NRyCVmWasHgdFlRVQ3CnnXbrzWn_HcpCmSE/s1600/Screenshot+2015-10-28+23.23.26.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;366&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfb4L-2WO4WJ7fuBTh4Zo89RxzuKPyFDAAB_5CeaSl6u_jMvDldG-36WhROZeOdGN-bjd9dZ9w9Wpw0A_jSXDpMFhUAPIZPf7H49iDPc-14NRyCVmWasHgdFlRVQ3CnnXbrzWn_HcpCmSE/s640/Screenshot+2015-10-28+23.23.26.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Now you will be greeted with&amp;nbsp;ownCloud&#39;s login page. Type in your &lt;b&gt;admin&lt;/b&gt;&amp;nbsp;password and log into your&amp;nbsp;ownCloud installation. The administration is part of another blog post.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
Summary&lt;/h3&gt;
&lt;/div&gt;
&lt;div&gt;
This is a list of steps to install ownCloud on a Synology NAS DS413. The steps cover the installation of dependencies required to run ownCloud. The administration of ownCloud is not part of this post.&lt;/div&gt;
&lt;div&gt;
I hope this will help anyone to successfully install ownCloud. Let me know if you have any questions or other constructive feedback.&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/5312519217797262846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/5312519217797262846' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/5312519217797262846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/5312519217797262846'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2015/10/install-owncloud-on-synology-nas-ds413.html' title='Install ownCloud on Synology NAS DS413'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOF1746O5adQbAWXuiSWlBNCPWtneAIw8kcsK6cIbyyPLEHeleRswK6mMb3JmEihqKaIFLJkFWbPae4bUbyNo4IQoSVlszdlTHO41IfjikqkOt_U4w0MNc2uXdlyg-WnZPHSN6mdanOCZu/s72-c/Screenshot+2015-10-28+22.50.06.png" height="72" width="72"/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-3507076365583439847</id><published>2015-10-12T22:30:00.000-07:00</published><updated>2015-10-12T22:30:13.253-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="dontforget"/><category scheme="http://www.blogger.com/atom/ns#" term="experience"/><category scheme="http://www.blogger.com/atom/ns#" term="ios"/><category scheme="http://www.blogger.com/atom/ns#" term="learn"/><category scheme="http://www.blogger.com/atom/ns#" term="swift"/><title type='text'>What I&#39;ve learnt today</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;div&gt;
Here is a list of things I have learnt today. Things to remember for myself and to reflect on.&lt;/div&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jetbrains.com/objc/?fromMenu&quot;&gt;AppCode&lt;/a&gt;&amp;nbsp;has a simple, yet very useful &lt;a href=&quot;https://cocoapods.org/&quot;&gt;CocoaPods&lt;/a&gt;&amp;nbsp;integration. Easily create a podfile and fill in your dependencies. AppCode will provide you with a button to install your dependencies. &lt;b&gt;Bonus&lt;/b&gt;: if you remove a dependency from your podfile, AppCode will give the uninstall button. Keeps your project directory neat and tidy. You can do this on the command line too, but it fits perfectly into the IDE.&lt;/li&gt;
&lt;li&gt;Swift playground in XCode 7.0.1 on El Capitan 10.11 sucks! I had so many crashes in the playground, that I had to restart XCode several times to get it back working.&lt;/li&gt;
&lt;li&gt;Swift and Objective-C seem to have a &quot;Love and Hate&quot; relationship? Why, you might ask? I tried to use some library that was written in Objective-C with my Swift project. It took a good amount of work to navigate around those little compile errors and find alternative ways to use the library anyways. But it was painful and not fun at all. What I did? I created a custom XML deserializer for &lt;a href=&quot;https://github.com/Alamofire/Alamofire&quot;&gt;Alamofire&lt;/a&gt;&amp;nbsp;with&amp;nbsp;&lt;a href=&quot;https://github.com/mattt/Ono&quot;&gt;Ono&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/3507076365583439847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/3507076365583439847' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/3507076365583439847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/3507076365583439847'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2015/10/what-ive-learnt-today.html' title='What I&#39;ve learnt today'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-5691825268873979944</id><published>2015-09-01T00:15:00.000-07:00</published><updated>2015-09-01T00:15:00.719-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="electron-shell"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="meetup"/><category scheme="http://www.blogger.com/atom/ns#" term="summary"/><category scheme="http://www.blogger.com/atom/ns#" term="webdev"/><title type='text'>1st Electron-Shell User Group Meetup</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
I went to the 1st Bay Area Electron-Shell User Group Meetup last Tuesday, 8/25/2016. The meetup was hosted by (&lt;a class=&quot;bare&quot; href=&quot;https://www.wagonhq.com/&quot;&gt;WagonHQ&lt;/a&gt;) in San Francisco’s Mission district. It started at 6pm and was scheduled to last until 9pm. The nice folks at WagonHQ provided some food and drinks for all attendees.&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
The Agenda for this meetup is available (&lt;a class=&quot;bare&quot; href=&quot;http://www.meetup.com/Bay-Area-Electron-User-Group/events/224438611/&quot;&gt;here&lt;/a&gt;).&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
There was a good crowd of interested engineers (between 40 and 60 people). Some of them were already using electron-shell in one or the other project.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h1 class=&quot;sect0&quot; id=&quot;the-talks&quot;&gt;
The Talks&lt;/h1&gt;
&lt;div class=&quot;paragraph&quot;&gt;
There were 4 tech talks for this event:&lt;/div&gt;
&lt;div class=&quot;ulist&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
The History of Electron (Kevin Sawicki - Engineer at &lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt;)&lt;br /&gt;

&lt;/li&gt;
&lt;li&gt;
Integrating with Native Code (Paul Betts - Engineer at &lt;a href=&quot;https://www.slack.com/&quot;&gt;Slack&lt;/a&gt;)&lt;br /&gt;

&lt;/li&gt;
&lt;li&gt;
Electron, React, and Haskell. Oh my! (Mike Craig - CTO at &lt;a href=&quot;https://www.wagonhq.com/&quot;&gt;Wagon&lt;/a&gt;)&lt;br /&gt;

&lt;/li&gt;
&lt;li&gt;
Making a web app feel native (Ben Gotow - Engineer at &lt;a href=&quot;http://www.nylas.com/&quot;&gt;Nylas&lt;/a&gt;)&lt;br /&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
The talks covered different parts of app development and the specialities of building a cross platform desktop app with web technolgy. A lot of questions around styling, using node modules, write your own node modules, call C# APIs to integrate with Windows, call Objective-C to integrate better with OSX and app packaging (I might have missed something).&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
I’m looking forward to attend the next meetup. I think that some attendees might have tried electron-shell for their own projects and have some eperiences to share.&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/5691825268873979944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/5691825268873979944' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/5691825268873979944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/5691825268873979944'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2015/09/1st-electron-shell-user-group-meetup.html' title='1st Electron-Shell User Group Meetup'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-3212415287402309367</id><published>2015-06-09T00:00:00.000-07:00</published><updated>2015-06-09T00:05:39.159-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="shell"/><category scheme="http://www.blogger.com/atom/ns#" term="tips"/><category scheme="http://www.blogger.com/atom/ns#" term="tricks"/><title type='text'>Simple date math in bash script</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;div id=&quot;preamble&quot;&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
To catch up with my blog, I needed to extract data from a twitter feed. Usually I update the blog on a weekly basis. Since I didn’t find the time recently, I fell behind.&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
I was looking for a &lt;strong&gt;quick&lt;/strong&gt; solution to download all the feed data at once. A bash script should be good enough.&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
The script that I use to extract the data from the twitter feed, expects a date argument in the form &lt;code&gt;mm/dd/yyyy&lt;/code&gt;. The script will extract all data for the range &lt;code&gt;[date - 7days, date]&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;sect1&quot;&gt;
&lt;h2 id=&quot;create-the-series-of-dates&quot;&gt;
Create the series of dates&lt;/h2&gt;
&lt;div class=&quot;sectionbody&quot;&gt;
&lt;div class=&quot;paragraph&quot;&gt;
I need to create a series of dates for several weeks. Given a start date, I’m going to produce new dates with a 7 day interval. The starting date is included in the series. Here is what I ended up with:&lt;/div&gt;
&lt;div class=&quot;listingblock&quot;&gt;
&lt;div class=&quot;content&quot;&gt;
&lt;pre class=&quot;brush:shell&quot;&gt;#!/usr/bin/env bash

set -e

# startdate in the form mm/dd/yyyy
startDate=$1
weeks=$2

for ((i=0;i&amp;lt;${weeks};i++)); do
    offsetDays=$((${i}*7))
    newDate=`date -j -v+${offsetDays}d -f &quot;%m/%d/%Y&quot; ${startDate} &quot;+%m/%d/%Y&quot;`

    startDateFilename=`echo ${newDate} | sed &quot;s/\//-/g&quot;`

    echo ${startDateFilename}
    # download the twitter data and redirect all output to that file
    exec &amp;amp;&amp;gt; weeklyTwitterData-${startDateFilename}.txt
    # call the script to extract the data from twitter stream
    coffee src/WeeklyStats.coffee -n ${startDate}
done&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;paragraph&quot;&gt;
Since I didn’t want to do all the calendar math myself, I rely on the magic of the date utility. The line defining &lt;code&gt;newDate&lt;/code&gt; is where the magic happens. Parsing a date &lt;code&gt;${startDate}&lt;/code&gt; in a given format &lt;code&gt;%m/%d/%Y&lt;/code&gt;, adding &lt;code&gt;$offsetDays&lt;/code&gt; to the parsed date and print out the new date in the format &lt;code&gt;%m/%d/%Y&lt;/code&gt;.&lt;/div&gt;
&lt;div class=&quot;paragraph&quot;&gt;
That’s it.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/3212415287402309367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/3212415287402309367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/3212415287402309367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/3212415287402309367'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2015/06/simple-date-math-in-bash-script.html' title='Simple date math in bash script'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-4454545980479818899</id><published>2015-05-13T23:57:00.001-07:00</published><updated>2015-05-14T13:14:15.083-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="console"/><category scheme="http://www.blogger.com/atom/ns#" term="notes"/><category scheme="http://www.blogger.com/atom/ns#" term="OSX"/><category scheme="http://www.blogger.com/atom/ns#" term="remember"/><category scheme="http://www.blogger.com/atom/ns#" term="setup"/><category scheme="http://www.blogger.com/atom/ns#" term="shell"/><title type='text'>Setup iTerm2, zsh, oh-my-zsh and powerline fonts on OSX</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
After waiting for a long time, I finally updated my Mac to OSX 10.10.
Right after the installation, the usual tweaking process begins to make you feel &lt;strong&gt;at home&lt;/strong&gt;. These are my notes to make the shell look good.&lt;/div&gt;
I wanted &lt;a href=&quot;http://www.zsh.org/&quot;&gt;z-shell&lt;/a&gt;, &lt;a href=&quot;http://ohmyz.sh/&quot;&gt;oh-my-zsh&lt;/a&gt; and these modified powerline fonts to make the command prompt &lt;a href=&quot;http://ohmyz.sh/img/themes/nebirhos.jpg&quot;&gt;look cool&lt;/a&gt;.&lt;br /&gt;
&lt;blockquote&gt;
If you want to follow these steps, it&#39;s recommended to have &lt;a href=&quot;http://brew.sh/&quot;&gt;homebrew&lt;/a&gt; installed to install zsh-shell.&lt;/blockquote&gt;
&lt;h2 id=&quot;ready,-set,-go!&quot;&gt;
Ready, set, go!&lt;/h2&gt;
&lt;/div&gt;
Open your terminal and prepare to type.&lt;br /&gt;

&lt;h2 id=&quot;iterm2&quot;&gt;iTerm2&lt;/h2&gt;
The easiest way it to install iTerm2 with &lt;strong&gt;homebrew&lt;/strong&gt;.
Run this command: &lt;br /&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;brew install iTerm2&lt;/pre&gt;
&lt;h2 id=&quot;oh-my-zsh&quot;&gt;
oh-my-zsh&lt;/h2&gt;
Run this command &lt;code&gt;curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh&lt;/code&gt;

&lt;br /&gt;
&lt;h2 id=&quot;powerline&quot;&gt;
powerline&lt;/h2&gt;
&lt;a href=&quot;https://github.com/powerline/powerline&quot;&gt;Powerline&lt;/a&gt; is a project that provides tools to customize the status line and command prompt of several applications. To achieve this, they use special glyphs that are available through patched fonts. These are the &lt;a href=&quot;https://github.com/powerline/fonts&quot;&gt;powerline fonts&lt;/a&gt;.

Download &lt;a href=&quot;https://github.com/powerline/fonts/blob/master/InconsolataDz/Inconsolata-dz%20for%20Powerline.otf&quot;&gt;the font&lt;/a&gt; from here and install it by double clicking. This will open the &lt;strong&gt;Font Book&lt;/strong&gt; application and install the font for you.

&lt;br /&gt;
&lt;h2 id=&quot;configuration&quot;&gt;
Configuration&lt;/h2&gt;
Now it&#39;s time to put everything together.

&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Open iTerm2&lt;/li&gt;
&lt;li&gt;Go to &lt;code&gt;Preferences -&amp;gt; Profiles -&amp;gt; Default -&amp;gt; General&lt;/code&gt; and type &lt;code&gt;/bin/zsh&lt;/code&gt; into the text field next to Command (this will use zsh instead of your default shell)&lt;/li&gt;
&lt;li&gt;Go to &lt;code&gt;Preferences -&amp;gt; Profiles -&amp;gt; Default -&amp;gt; Text&lt;/code&gt; and change the &lt;strong&gt;Regular Font&lt;/strong&gt; and the &lt;strong&gt;Non-ASCII Font&lt;/strong&gt; to &lt;code&gt;11pt Inconsolata-dz for Powerline&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;open &lt;code&gt;~/.zshrc&lt;/code&gt; with your favorite text editor and change &lt;code&gt;ZSH_THEME&lt;/code&gt; to &lt;code&gt;agnoster&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
That&#39;s it. Make sure to start/restart iTerm to see all the changes.

&lt;br /&gt;
&lt;h2 id=&quot;resources&quot;&gt;
Resources&lt;/h2&gt;
&lt;a href=&quot;http://ohmyz.sh/&quot;&gt;oh-my-zsh&lt;/a&gt;

&lt;a href=&quot;https://github.com/powerline/powerline&quot;&gt;Powerline&lt;/a&gt;

&lt;a href=&quot;http://osxdaily.com/2012/03/21/change-shell-mac-os-x/&quot;&gt;change osx shell&lt;/a&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/4454545980479818899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/4454545980479818899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/4454545980479818899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/4454545980479818899'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2015/05/setup-iterm2-zsh-oh-my-zsh-and.html' title='Setup iTerm2, zsh, oh-my-zsh and powerline fonts on OSX'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-7967789774852766777</id><published>2015-05-06T22:29:00.001-07:00</published><updated>2015-06-09T00:06:43.949-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="brackets"/><category scheme="http://www.blogger.com/atom/ns#" term="electron"/><category scheme="http://www.blogger.com/atom/ns#" term="nodejs"/><category scheme="http://www.blogger.com/atom/ns#" term="OSX"/><category scheme="http://www.blogger.com/atom/ns#" term="tips"/><category scheme="http://www.blogger.com/atom/ns#" term="tricks"/><title type='text'>Electron mystery on OSX solved</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;h3 id=&quot;electron-mystery-on-osx-solved&quot;&gt;
&lt;em&gt;Do I look like an idiot? I don&#39;t know. But I felt like one for the last 2 days.&lt;/em&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;
2 days ago I started to look into on a &lt;a href=&quot;https://github.com/zaggino/brackets-electron&quot;&gt;great project&lt;/a&gt; idea, to replace the &lt;a href=&quot;https://github.com/adobe/brackets-shell&quot;&gt;Brackets Shell&lt;/a&gt; with &lt;a href=&quot;https://github.com/atom/electron&quot;&gt;Electron&lt;/a&gt;. Great idea! I wanted to contribute and fix issues that crossed my way. But, I followed the given instruction to clone the repo and setup all dependencies. After everything was download and in the right place, I ran &lt;code&gt;npm start&lt;/code&gt; to bring up &lt;a href=&quot;http://github.com/adobe/brackets&quot;&gt;Brackets&lt;/a&gt; in it&#39;s new electron shell. But that first attempt failed with this error:&lt;br /&gt;
&lt;div class=&quot;highlight&quot;&gt;
&lt;pre&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Brackets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.3.0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;start&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;develop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fun&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;OSS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;brackets&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;-electron&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;electron&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;.&lt;/span&gt;

&lt;span class=&quot;err&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;develop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fun&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;OSS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;brackets&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;-electron&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;-config.js&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;13&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CONFIG_PATH&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;path.resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;utils.convertWindowsPathToUnixPath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;app.getPath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;u&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;                                                                    ^&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;TypeError: app.getPath is not a function&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;    at Object.&amp;lt;anonymous&amp;gt; (~/develop/fun/OSS/brackets-electron/app/shell-config.js:13:71)&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;    at Module._compile (module.js:418:26)&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;    at Object.Module._extensions..js (module.js:436:10)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
I was wondering, if there was something important missing in the setup instruction, I simply made a mistake or my system config was tricking me.
After checking with the guys who started that effort, I was left with this weird error.&lt;br /&gt;
&lt;br /&gt;
I started to research and looked for others having the same issue, but I couldn&#39;t find anything. Okay, it has to be my machine setup. Back at home, I started to setup everything on another machine to see if it works there. &lt;strong&gt;The result was the same!&lt;/strong&gt; The error showed up on a different Macs, with a different OSX versions.&lt;br /&gt;
&lt;br /&gt;
I went back to our slack channel and carefully mentioned, that I&#39;m still not able to get it running yet. Someone replied, that I can install Electron globally and try it again. But this turned out to be a red herring. Nothing has changed and it was really frustrating, since nobody else seemed to have these issues on OSX.
I promised them to help, but I could even review and test pull requests.&lt;br /&gt;
&lt;br /&gt;
I did some more research and came across this great &lt;a href=&quot;http://dotnet-rocks.com/2015/05/04/writing-an-electron-atom-shell-app-using-angular-and-es6/#comment-2008507103&quot;&gt;blogpost&lt;/a&gt; from &lt;a href=&quot;https://github.com/ThorstenHans&quot;&gt;Thorstenhans&lt;/a&gt;. He provided a boilerplate project for an app that uses Electron. I was so happy. I followed his instructions to create a clean app. Everything went fine and I was excited because it&#39;s using es6. Unfortunately, the result with Electron was the same.&lt;br /&gt;
&lt;br /&gt;
I left a comment for the blogpost asking, if he has encountered this issue before.
Nothing worked for me as expected. So, it must be my machine I concluded. But two machines at the same time?&lt;br /&gt;
&lt;br /&gt;
I mentioned my inability to launch Electron on OSX, briefly in the slack channel for electron-brackets. I felt like an idiot at this point. Somebody who distracts everybody with some nonsense. Nobody had an idea what might help to resolve this misery to help me getting started.&lt;br /&gt;
&lt;br /&gt;
Since the electron-brackets version on Linux seemed to work fine, I decided to pull my Linux VM out of the drawer and give it a try. I cloned the repo, installed everything and typed &lt;code&gt;npm start&lt;/code&gt; at the console. Guess what? It worked! I was happy. That is awesome and I&#39;m finally able to help.&lt;br /&gt;
&lt;br /&gt;
But I wasn&#39;t happy that my day-to-day machine didn&#39;t play well with me.
I had a conversation with Thorsten Hans (look at the comments &lt;a href=&quot;http://dotnet-rocks.com/2015/05/04/writing-an-electron-atom-shell-app-using-angular-and-es6/#comment-2008507103&quot;&gt;here&lt;/a&gt;). He solved another mystery for himself along the way, but I didn&#39;t make any progress.&lt;br /&gt;
&lt;br /&gt;
Long story short, I started to get rid of my nodejs installation, install nvm from scratch and hoped to resolve the issue. No luck.
But then I inspected the environment variables for anything nodejs related and I found &lt;code&gt;NODE_PATH&lt;/code&gt;. It seemed somehow messed up.
This &lt;a href=&quot;https://stackoverflow.com/questions/20185627/node-js-node-path-environment-variable#20189376&quot;&gt;post&lt;/a&gt; recommended to undef &lt;code&gt;NODE_PATH&lt;/code&gt; to solve another issue. But it helped me too. &lt;code&gt;npm start&lt;/code&gt; is finally working and the biggest mystery, that let me look like an idiot was resolved.&lt;br /&gt;
&lt;h1 id=&quot;thanks&quot;&gt;
Thanks&lt;/h1&gt;
To &lt;a href=&quot;https://github.com/ThorstenHans&quot;&gt;Thorstenhans&lt;/a&gt; for the back and forth to help me resolve the issue. Thanks to &lt;a href=&quot;https://github.com/mackenza&quot;&gt;Andrew MacKenzie&lt;/a&gt; to mention often enough, that the Linux version is doing a good job for him.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/7967789774852766777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/7967789774852766777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/7967789774852766777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/7967789774852766777'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2015/05/electron-mystery-on-osx-solved.html' title='Electron mystery on OSX solved'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-3178782035164290075</id><published>2015-01-02T12:34:00.000-08:00</published><updated>2015-01-02T12:34:48.000-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cli"/><category scheme="http://www.blogger.com/atom/ns#" term="learn"/><category scheme="http://www.blogger.com/atom/ns#" term="remember"/><category scheme="http://www.blogger.com/atom/ns#" term="tips"/><category scheme="http://www.blogger.com/atom/ns#" term="tricks"/><title type='text'>Something I Learnt About sed</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;strong&gt;Note: I’m writing this down to remind myself for the next time I’m using sed and any kind of regex.&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;
I was working on some very simple task: replace a string in a file with a different string.&lt;br /&gt;
All of this should happen on our build machine during the product build. Nothing too fancy. But then I got bitten by different versions of sed available on the build machines.&lt;br /&gt;
We build our product on OSX, Windows and Linux and I had to realize, that the regex I used, didn’t work with every sed version on the build machines.&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
My Regex Confusion&lt;/h2&gt;
To make it clear: I’m not a regex guru. I use it for simple things. When it get’s complex, I usually consult some tools like &lt;a href=&quot;http://www.regex101.com/&quot;&gt;regex101.com&lt;/a&gt; to get it right.&lt;br /&gt;
I started with this simple regex to replace the number after the &lt;code&gt;-&lt;/code&gt; (the number of commits). The buildnumber looks like 1.0.0-12345. &lt;br /&gt;
Here is the command I started with&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;`cat build.prop | sed &quot;s/(brackets_build_version=\d+.\d+.\d+-)(\d+)/\1${NEW_COMMITS}/&quot; &amp;gt; build.prop.new`.
&lt;/code&gt;&lt;/pre&gt;
The result:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;`sed: 1: &quot;s/(brackets_build_versi ...&quot;: \1 not defined in the RE`
&lt;/code&gt;&lt;/pre&gt;
Okay, that doesn’t help that much. After some research I have found the solution: &lt;code&gt;-E&lt;/code&gt; needs to be added to the command.&lt;br /&gt;
Okay, that error went away, but the replace didn’t work either. Hm, now I had to debug the Regex and find the issue.&lt;br /&gt;
After several rounds of experimentation, I started to read the documentation for  &lt;code&gt;re_format&lt;/code&gt;. That explained a lot: there are &lt;em&gt;modern RE&lt;/em&gt; and &lt;em&gt;obsolete RE&lt;/em&gt; (they are sometimes referred to as Basic Regular Expression (BRE) and Extended Regular Expression (ERE)), that mainly exist for backward compatibility. They are not as powerful as the &lt;em&gt;modern RE&lt;/em&gt; and lack some features.&lt;br /&gt;
The last working version looked like:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;`cat build.prop | sed -E &quot;s/(brackets_build_version=[[:digit:]]+.[[:digit:]]+.[[:digit:]]+)-([[:digit:]]+)/\1-${COMMITS}/&quot;`
&lt;/code&gt;&lt;/pre&gt;
This worked! Heureka. &lt;br /&gt;
&lt;strike&gt;But wait, why do I have to used &lt;code&gt;[[:digit:]]&lt;/code&gt; instead of the much shorter &lt;code&gt;\d+&lt;/code&gt;? I don’t know and probably I will never find out.&amp;nbsp;&lt;/strike&gt;&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Deploy on Build Machines&lt;/h2&gt;
Happy, that I finally found a solution that worked on OSX. I totally forgot about the other OSses. Once I made the changes and started the build, it failed on Linux and Windows. &lt;br /&gt;
WTH? What was I missing? Why doesn’t it even work on Linux? Quickly started my Linux VM and gave it try. The solution was simple: I had to call sed with &lt;code&gt;-r&lt;/code&gt; in order to make it work.&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Conclusion or What I have Learnt&lt;/h2&gt;
sed behaves differently on different OS versions. This is probably no exciting news, but I thought I keep this as a reminder for myself. &lt;br /&gt;
Using bash or some derivative of it like cygwin or gitbash on Windows does make a difference for some tools. Especially sed comes in two variants: BSD and GNU. &lt;br /&gt;
OSX uses BSD and I guess linux and cygwin come with GNU. They might have different command line switched for the same option. So be careful and testing is always required.&lt;br /&gt;
Another difference is the Regex engine tha can be used. sed supports &lt;strong&gt;basic regular expressions&lt;/strong&gt; (BRE’s) and &lt;strong&gt;extended (ERE or modern) regular expressions&lt;/strong&gt; &lt;br /&gt;
As I mentioned bofore, enabling the &lt;strong&gt;extended regular expressions&lt;/strong&gt; you need to call &lt;code&gt;sed -E&lt;/code&gt; on OSX and &lt;code&gt;sed -r&lt;/code&gt; on Linux and cygwin.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/3178782035164290075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/3178782035164290075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/3178782035164290075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/3178782035164290075'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2015/01/something-i-learnt-about-sed.html' title='Something I Learnt About sed'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-8520064038281813354</id><published>2014-11-29T00:28:00.001-08:00</published><updated>2014-11-29T01:11:08.877-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="Android Wear"/><category scheme="http://www.blogger.com/atom/ns#" term="deutsch"/><category scheme="http://www.blogger.com/atom/ns#" term="german"/><category scheme="http://www.blogger.com/atom/ns#" term="Meinung"/><category scheme="http://www.blogger.com/atom/ns#" term="Moto360"/><title type='text'>Moto 360 - Was ich wollte und was ich bekam</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Heute vor &lt;strike&gt;&lt;em&gt;2 Wochen&lt;/em&gt; (17. September)&lt;/strike&gt;&amp;nbsp;10 Wochen habe ich von einem Freund eine &lt;a href=&quot;https://moto360.motorola.com/&quot; target=&quot;_blank&quot;&gt;Moto 360&lt;/a&gt; geschenkt bekommen. Der Grund: er hat als Teilnehmer der Google I/O eine zugeschickt bekommen, hat aber selber kein Android Phone und somit keine Verwendung dafür. Ich hab mich sehr darüber gefreut, wollte ich mir doch selber eine kaufen. Leider, in diesem Fall eher Glück, war die Uhr bei Motorola innerhalb kürzester Zeit ausverkauft und ich hab keine mehr bekommen. Naja, ich hab mich auf eine etwas längere Wartezeit eingestellt. Umso überraschender war dann die Lieferung an mich.&lt;/div&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Erwartung&lt;/h2&gt;
Was habe ich von dieser Uhr alles erwartet? Die Artikel, in denen über die Uhr geschrieben wurde, haben sich ja vor Begeisterung gar nicht mehr einbekommen. Ich denke, dass sollte sich bei erscheinen der Uhr etwas legen.
Das ich seit 1,5 Jahren eine &lt;a href=&quot;https://getpebble.com/&quot; target=&quot;_blank&quot;&gt;Pebble Smartwatch&lt;/a&gt; habe, bin ich schon mit einer hohen Erwartungshaltung angetreten. Darunter waren&lt;br /&gt;
&lt;ul id=&quot;draft_check_box_list_0&quot;&gt;
&lt;li&gt;Akkulaufzeit von mindestens 3 Tagen&lt;/li&gt;
&lt;li&gt;Herzfrequenzmesser für sportliche Aktivitäten (Ersatz für Brustgurt)&lt;/li&gt;
&lt;li&gt;Schlaftracker&lt;/li&gt;
&lt;li&gt;Eine Uhr im coolen Design und coole Watchfaces&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;der-erste-tag&quot; style=&quot;text-align: left;&quot;&gt;
Der erste Tag&lt;/h2&gt;
Ich hab die Uhr nur noch auf die Ladestation gestellt und bis zum nächsten Morgen gewartet. Der Tag fing erstmal mit einem Update an. Ich hatte das am Abend zuvor nicht mehr gesehen und deshalb wurde die Uhr jetzt erstmal aktualisiert. Schon mal nicht schlecht. Die ersten Probleme haben sie (Motorola) also schon beseitigt.&lt;br /&gt;
&lt;br /&gt;
Nachdem das Firmware Update durchgeführt und die Uhr endlich einsatzbereit war, hab ich erstmal ein bisschen rumgespielt. Leider hat dadurch die Batterielaufzeit sehr gelitten. An diesem Tag war die Uhr Nachmittags um 16 Uhr fertig. Aus, Ende und vorbei. Wow, das war sehr viel weniger als ich erwartet hatte.
Am nächsten Tag habe ich dann tatsächlich das Ladegerät der Uhr mit ins Büro genommen. Ich wollte ja nicht mit einem unbrauchbaren, weil leerem, Hightech Spielzeug rumlaufen. Schon echt blöd, für etwas was eigentlich die Uhrzeit anzeigen soll. In den folgenden Tagen habe ich die Uhr weniger benutzt, ausser um die Uhrzeit abzulesen. Auf jeden Fall hielt die Batterie jetzt bis Abends um 9 Uhr. Das war aber immer noch nicht das, was Motorola auf ihrer Website verkündet hat: Hält einen ganzen Tag. Vielleicht haben wir unterschiedliche Vorstellungen wie lang so ein ganzer, normaler Tag ist.&lt;br /&gt;
&lt;h2 id=&quot;alles-wird-besser-oder-das-große-firmware-update&quot;&gt;
Alles wird besser oder das große Firmware Update&lt;/h2&gt;
Die ersten Wochen waren eher ernüchternd. Die Batterie war schnell erledigt und Bedienungstechnisch gab es auch noch einiges zu verbessern. Okay, so ist das eben, wenn man mit einem neuen technischen Spielzeug spielen möchte. Die Ecken müssen erst rundgeschliffen werden. Warum sollte das bei der neuen Smartwatch anders sein?
Umso erfreuter war ich, als dann eines Tages die Verfügbarkeit eines Firmwareupdates angezeigt wurde. Also, die Uhr schnell auf die Ladestation und dann das Update starten. Auf den ersten Blick hat sich erstmal nichts verändert. Unter der Haube wurde auf jeden Fall der Batterieverbrauch reduziert. Super! Endlich hält die Uhr einen ganzen langen Tag durch (bei moderater Benutzung!).&lt;br /&gt;
&lt;h2 id=&quot;firmware-update-die-zweite&quot; style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;
Firmware Update die Zweite&lt;/span&gt;&lt;/h2&gt;
Ein paar Wochen später gab es dann Update Nr. 2. Hier wurde hauptsächlich die Bedienbarkeit der Uhr verbessert. Notifications können jetzt ganz aus dem Sichtfeld an den unteren Rand verschoben werden. Damit kann dann die Uhr komplett betrachtet werden. Weiterhin soll die Bluetooth Verbindung mit dem Smartphone jetzt stabiler sein.&lt;br /&gt;
&lt;h2 id=&quot;was-ist-aus-den-anderen-wünschen-geworden?&quot; style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;
Was ist aus den anderen Wünschen geworden?&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;
Herzfrequenzmesser&lt;/span&gt;&lt;/h3&gt;
Der Herzfrequenzmesser ist, ich sag es mal vorsichtig, nicht ganz so gut wie ich mir das vorgestellt habe. Messungen dauern zu lange und eine kontinuierliche Messung ist anscheinend nicht möglich oder die Apps unterstützen das einfach noch nicht. Messungen funktionieren in vielen Fällen nicht beim ersten mal. Die Uhr legt großen Wert auf die richtige Armhaltung. Der Kontakt zwischen Uhr und Haut muss komplett hergestellt sein. Vielleicht passiert hier ja noch etwas zum besseren. Momentan gehört das noch in die Kategorie &quot;Nutzlos und Überflüssig&quot;.&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;
Schlaftracker&lt;/span&gt;&lt;/h2&gt;
Okay, ich hab dann mal ausprobiert ob ich die Uhr auch zum Schlaftracking benutzen kann. Ich bin um Mitternacht ins Bett gegangen und die Uhr war zu 100% aufgeladen. Als ich am morgen um 6:30 h aufwachte, war sie... Aus! Alle! Leer! Unfassbar. Ich weiss ja nicht was die Uhr so zum Schlaftracking macht, aber das ist mehr als enttäuschend. Da hatte ich mal wieder mehr erwartet.&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;
Lederarmband&lt;/span&gt;&lt;/h2&gt;
Was ich bis jetzt gar nicht nachvollziehen kann, ist die Tatsache das eine Uhr, die jeden Abend aufs Ladegerät gelegt werden muss, mit einem herkömmlichen Lederarmband ausgestattet wird. Das Armband wird ständig an der selben Stelle geknickt und sieht mit der Zeit nicht mehr schön aus. Für eine Uhr, die zum Sport getragen wird, halte ich Lederarmbänder auch nur für bedingt brauchbar. Duschen ist auch keine gute Idee, da das Leder darunter sehr leidet. Ich hätte mir gewünscht, das die Uhr auch mit einem Metallarmband verkauft wird. Diese Option stand leider nicht zur Verfügung, soll aber zum Ende des Jahres erhältlich sein. Ich bin gespannt. Ich werde mir sofort ein Metallarmband besorgen.&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;
Fazit oder was ich bekam&lt;/span&gt;&lt;/h2&gt;
Um noch auf den Punkt &quot;Erwartungen&quot; zurückzukommen. Leider habe ich mir viel gewünscht und nicht so viel bekommen. Akkulaufzeit war am Anfang mehr als enttäuschend. Weniger als ein Tag durchgehalten und das &quot;Mitschleppen&quot; des Ladegeräts für die Uhr geht gar nicht. Das wurde besser mit dem ersten &quot;großen Firmware Update&quot;. Das Update hat vieles verbessert. Bei 3 Tagen Batterielaufzeit bin ich trotzdem noch nicht angekommen. Aber immerhin bei der Hälfte.&lt;br /&gt;
&lt;br /&gt;
Bleibt also noch eine Uhr im coolen Design. Jawoll, das ist auf jeden Fall erfüllt worden. Die Uhr sieht gut aus, die bisher erhältlichen Zifferblätter sehen gut bis originell aus. Immer mehr Apps bekommen die Möglichkeit Informationen auf der Uhr darzustellen.&lt;br /&gt;
&lt;br /&gt;
Ich benutzte die Uhr jeden Tag. Sie hat sich zu einem zuverlässigen und unauffälligen Begleiter entwickelt. Die Spracheingabe funktioniert, zumindest in Englisch, überraschend gut. Zum Sport benutze ich die Uhr nicht. Aus irgendeinem nicht offensichtlichen Grund steigt der Batterieverbrauch während dieser Zeit erheblich an. Ich benutzt die Smartwatch als Schrittzähler und Activitytracker (hauptsächlich Radfahren).
Ich glaube, dass es noch viele Verbesserungen geben wird. Die &lt;a href=&quot;https://getpebble.com/&quot; target=&quot;_blank&quot;&gt;Pebble Smartwatch&lt;/a&gt; hat auch mit relativ wenigen Features angefangen und wurde mit der Zeit immer leistungsfähiger. Also abwarten und geduldig sein.&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Pros und Cons&lt;/h2&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;
Pro&lt;/span&gt;&lt;/h3&gt;
&lt;ul id=&quot;draft_check_box_list_1&quot;&gt;
&lt;li&gt;Ladezeit&lt;/li&gt;
&lt;li&gt;Bedienung&lt;/li&gt;
&lt;li&gt;Induktionsladegerät&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;
Con&lt;/span&gt;&lt;/h3&gt;
&lt;ul id=&quot;draft_check_box_list_2&quot;&gt;
&lt;li&gt;Batterielaufzeit&lt;/li&gt;
&lt;li&gt;Lederarmband&lt;/li&gt;
&lt;li&gt;Schlaftracking&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-weight: normal;&quot;&gt;
Kaufen oder nicht?&lt;/span&gt;&lt;/h2&gt;
Thrillseeker? Spielkind? Muss ich immer das neueste, coolste technische Gadget haben? Dann gibt es nur eine Antwort: Kaufen! Die erste gut aussehende Smartwatch, die nicht wie ein merkwürdiger Klotz am Handgelenk aussieht. Naja, zumindest nicht an meinem Handgelenk. Wie es sich aber immer so mit neuem technischen Spielzeug verhält, gibt es noch einiges zu verbessern.&lt;br /&gt;
&lt;br /&gt;
Aber anscheinend gibt sich Motorola hier viel Mühe die Kunden mit aktualisierter Firmware und besserer 3rd Party Integration glücklich zu machen.
Und nicht vergessen, wir haben es hier mit einer jungen, neuen Produktgeneration zu tun. Es wird noch viel passieren in den nächsten Wochen und Monaten. Google Fit ist erst der Anfang.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/8520064038281813354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/8520064038281813354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/8520064038281813354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/8520064038281813354'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2014/11/moto-360-was-ich-wollte-und-was-ich_29.html' title='Moto 360 - Was ich wollte und was ich bekam'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-998358279655737279</id><published>2013-12-16T15:18:00.001-08:00</published><updated>2013-12-16T15:20:24.193-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Blog"/><category scheme="http://www.blogger.com/atom/ns#" term="brackets"/><category scheme="http://www.blogger.com/atom/ns#" term="coding"/><category scheme="http://www.blogger.com/atom/ns#" term="promo"/><category scheme="http://www.blogger.com/atom/ns#" term="webdev"/><title type='text'>Guest post about Brackets and building Brackets Extensions</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div class=&quot;se-section-delimiter&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;se-section-delimiter&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
It’s already a couple of weeks ago, that I provided two guest posts about Brackets for &lt;a href=&quot;http://blog.safaribooksonline.com/&quot;&gt;Safari Books Online&lt;/a&gt;.&lt;/div&gt;
Please have a look at &lt;a href=&quot;http://blog.safaribooksonline.com/2013/11/19/brackets-code-the-web/&quot;&gt;introduction to Brackets&lt;/a&gt; and &lt;a href=&quot;http://blog.safaribooksonline.com/2013/12/03/build-a-brackets-extension/&quot;&gt;Building a Brackets Extension&lt;/a&gt; and let me know what you think.&lt;br /&gt;
I’d like to hear your feedback. Thanks.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/998358279655737279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/998358279655737279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/998358279655737279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/998358279655737279'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2013/12/brackets-and-building-brackets.html' title='Guest post about Brackets and building Brackets Extensions'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-7970839309851660150</id><published>2013-11-08T12:29:00.000-08:00</published><updated>2013-11-08T12:29:01.078-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="git"/><category scheme="http://www.blogger.com/atom/ns#" term="notetomyself"/><category scheme="http://www.blogger.com/atom/ns#" term="tips"/><title type='text'>git re-merge done easy</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I messed up some files during a larger merge a couple of days ago. When I tracked down the files that had issues (in my case the unit tests didn&#39;t succeed anymore), I wondered if there is an easy way to revert to the version of the file before the merge and redo the merge or at least bring back the file with the conflict markers.&lt;br /&gt;
&lt;br /&gt;
I was looking for an elegant solution. Something must exist that helps engineers to easily resolve situations like this.&lt;br /&gt;
After 45 seconds of research (sometimes it&#39;s that quick if you know the right words to search for), this &lt;a href=&quot;http://stackoverflow.com/questions/6434995/how-to-re-merge-a-file-in-the-git&quot; target=&quot;_blank&quot;&gt;result&lt;/a&gt; on StackOverflow came up.&lt;br /&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;git checkout -m &amp;lt;filename&amp;gt;

&lt;/pre&gt;
&lt;/div&gt;
Very nice solution. I was able to go back to the state, where the file contained all the conflict markers and I was able to resolve the issue pretty quickly.&lt;br /&gt;
&lt;br /&gt;
Yes, sometimes git is really easy.
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/7970839309851660150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/7970839309851660150' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/7970839309851660150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/7970839309851660150'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2013/11/git-re-merge-done-easy.html' title='git re-merge done easy'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-4622657638927764833</id><published>2013-03-03T23:13:00.000-08:00</published><updated>2013-03-03T23:14:05.205-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dontforget"/><category scheme="http://www.blogger.com/atom/ns#" term="gradle"/><category scheme="http://www.blogger.com/atom/ns#" term="groovy"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="reminder"/><category scheme="http://www.blogger.com/atom/ns#" term="tips"/><category scheme="http://www.blogger.com/atom/ns#" term="tricks"/><title type='text'>Using cobertura with gradle</title><content type='html'>&lt;p&gt;I wanted to get code coverage for my current groovy project. Since I use &lt;a href=&quot;http://www.gradle.org/&quot;&gt;gradle&lt;/a&gt; and all of my source is written in &lt;a href=&quot;http://groovy.codehaus.org/&quot;&gt;groovy&lt;/a&gt;, I searched for a gradle plugin that provides cobertura functionality for groovy files. I found two (perhaps there are a more available)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/eriwen/gradle-cobertura-plugin&quot;&gt;Eric Wendelin’s Cobertura plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/stevesaliman/gradle-cobertura-plugin&quot;&gt;Steve Saliman’s Cobertura plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using both plugins wasn&amp;#8217;t a big deal. There is a slight difference how to set them up in your build.gradle file though. Both plugins provide very similar configuration options to tweak cobertura’s behavior. Let’s take a look.&lt;/p&gt;

&lt;h1 id=&quot;usingericwendelinscoberturaplugin&quot;&gt;Using &lt;a href=&quot;&quot;&gt;Eric Wendelin’s Cobertura plugin&lt;/a&gt;&lt;/h1&gt;

&lt;h2 id=&quot;addingtheplugintothebuild.gradle&quot;&gt;Adding the plugin to the build.gradle&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;m using gradle 1.4 for this exercise and I added the following to my build.gradle:&lt;/p&gt;

&lt;pre class=&quot;brush: groovy&quot;&gt;buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath &amp;quot;net.saliman:gradle-cobertura-plugin:1.1.0&amp;quot;
    }
}

apply plugin: &#39;cobertura
&lt;/pre&gt;

&lt;p&gt;This will provide you with four new tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;coberturaInstrumentMain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;coberturaInstrumentTest&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;testCoberturaReport&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;coberturaConfigureTest&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, which task to call to determine the code coverage? Simply run the &lt;code&gt;test&lt;/code&gt; tasks and your source will be instrumented prior to executing your tests.&lt;/p&gt;

&lt;p&gt;But what you really want, is to run the &lt;code&gt;check&lt;/code&gt; tasks because this will not only run your tests on your previously instrumented source, but it will also create the coverage report. And that’s basically what we want.&lt;/p&gt;

&lt;p&gt;The plugin provides some configuration options to tweak cobertura’s behavior&lt;/p&gt;

&lt;div class=&quot;TableCSS&quot;&gt;
&lt;table&gt;
&lt;colgroup&gt;
&lt;col style=&quot;text-align:left;&quot;/&gt;
&lt;col style=&quot;text-align:left;&quot;/&gt;
&lt;/colgroup&gt;

&lt;thead&gt;
&lt;tr&gt;
 &lt;th&gt;option&lt;/th&gt;
 &lt;th&gt;description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;format&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;&lt;code&gt;’html’&lt;/code&gt; (default) or &lt;code&gt;’xml’&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;reportsDir&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;Path to report directory for coverage report. Defaults to &lt;code&gt;${project.reportsDir.path}/cobertura&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;includes&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;List glob paths to be reported on. Defaults to &lt;code&gt;[‘**/*.java&#39;, ‘**/*.groovy&#39;, ‘**/*.scala’]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;excludes&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;List glob paths to exclude from reporting. Defaults to &lt;code&gt;[‘**/*Test.java&#39;, &#39;**/*Test.groovy&#39;, &#39;**/*Test.scala’]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;ignores&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;List regexes of classes to exclude from instrumentation. Defaults to &lt;code&gt;[‘org.apache.tools.*&#39;, &#39;net.sourceforge.cobertura.*’]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;To specify the output format of cobertura’s coverage report you have to do this:&lt;/p&gt;

&lt;pre class=&quot;brush: groovy&quot;&gt;cobertura {
    format = ‘xml’
}
&lt;/pre&gt;

&lt;h1 id=&quot;usingstevesalimanscoberturaplugin&quot;&gt;Using &lt;a href=&quot;&quot;&gt;Steve Saliman’s Cobertura plugin&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;This plugin is based on the work of &lt;a href=&quot;https://github.com/valkolovos/gradle_cobertura&quot;&gt;gradle_cobertura&lt;/a&gt;. The original version had some issue with the latest gradle version, so I decided to pick one of the 20 forks. The one with the most recent changes was &lt;a href=&quot;https://github.com/stevesaliman/gradle-cobertura-plugin&quot;&gt;Steve Saliman’s Cobertura plugin&lt;/a&gt;. You can find the setup instructions in the &lt;a href=&quot;https://github.com/stevesaliman/gradle-cobertura-plugin/blob/master/README.md&quot; title=&quot;README&quot;&gt;README&lt;/a&gt;. Currently the compatibility chart shows that gradle 1.1 is the highest supported version right now. I&amp;#8217;m using it with gradle 1.2, 1.3 and 1.4 and they work too. So, let&amp;#8217;s move ahead and give it a try.&lt;/p&gt;

&lt;h2 id=&quot;addingtheplugintothebuild.gradle&quot;&gt;Adding the plugin to the build.gradle&lt;/h2&gt;

&lt;pre class=&quot;brush: groovy&quot;&gt;buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath &amp;quot;net.saliman:gradle-cobertura-plugin:1.1.1&amp;quot;
    }
}
apply plugin: &#39;cobertura&#39;
&lt;/pre&gt;

&lt;p&gt;This will add 2 new tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cobertura&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;instrument&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get your coverage report you need to run the &lt;code&gt;cobertura&lt;/code&gt; task and the report will be created.&lt;/p&gt;

&lt;p&gt;There are a couple of options available to this plugin to change the cobertura behavior:&lt;/p&gt;

&lt;div class=&quot;TableCSS&quot;&gt;
&lt;table&gt;
&lt;colgroup&gt;
&lt;col style=&quot;text-align:left;&quot;/&gt;
&lt;col style=&quot;text-align:left;&quot;/&gt;
&lt;/colgroup&gt;

&lt;thead&gt;
&lt;tr&gt;
 &lt;th&gt;option&lt;/th&gt;
 &lt;th&gt;description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;coverageDirs&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;Directories under the base directory containing classes to be instrumented. Defaults to &lt;code&gt;${project.sourceSets.main.classesDir.path}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;coverageDatafile&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;Path to data file to use for Cobertura. Defaults to &lt;code&gt;${project.buildDir.path}/cobertura/cobertura.ser&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;coverageReportDir&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;Path to report directory for coverage report. Defaults to &lt;code&gt;${project.reportsDir.path}/cobertura&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;coverageFormats&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;Formats of cobertura report. Default is a single report in &amp;#8216;html&amp;#8217; format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;coverageSourceDirs&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;Directories of source files to use. Defaults to &lt;code&gt;${project.sourceSets.main.java.srcDirs]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;coverageIncludes&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;List of include patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;coverageExcludes&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;List of exclude patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;coverageIgnores&lt;/td&gt;
 &lt;td style=&quot;text-align:left;&quot;&gt;List of ignore patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/br&gt;

&lt;h2 id=&quot;fixbrokenlinksincoveragereport&quot;&gt;Fix broken links in coverage report&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;In order to have a working link to the groovy source files in the coverage report, it’s necessary to add the following to your &lt;code&gt;build.gradle&lt;/code&gt;. This will add the groovy source directory to the list of coverageSourceDirs&lt;/p&gt;
&lt;/blockquote&gt;

&lt;pre class=&quot;brush: groovy&quot;&gt;cobertura {
    coverageSourceDirs &amp;lt;&amp;lt; project.sourceSets.main.groovy.srcDirs
}
&lt;/pre&gt;

&lt;h1 id=&quot;reportlocation&quot;&gt;Report location&lt;/h1&gt;

&lt;p&gt;For both plugins, the generated report can be found in &lt;code&gt;build/reports/cobertura&lt;/code&gt;.&lt;/p&gt;

&lt;h1 id=&quot;summary&quot;&gt;Summary&lt;/h1&gt;

&lt;p&gt;I have to admit, that both plugins are too similar in functionality to declare a clear favorite. In general, both plugins have subtle differences in regards of their configuration. I like that &lt;a href=&quot;&quot;&gt;Eric Wendelin’s Cobertura plugin&lt;/a&gt; supports groovy (and scala) files right out of the box without further configuration. But this is only a very small advantage. I’ll stick with &lt;a href=&quot;&quot;&gt;Steve Saliman’s Cobertura plugin&lt;/a&gt; for a while, since there is still active development. Not a strong reason, but as I mentioned earlier, there are only subtle differences between both plugins.&lt;/p&gt;

&lt;p&gt;The choice is up to you.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/4622657638927764833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/4622657638927764833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/4622657638927764833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/4622657638927764833'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2013/03/using-cobertura-with-gradle.html' title='Using cobertura with gradle'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-7454070292004784838</id><published>2013-02-11T17:55:00.001-08:00</published><updated>2013-02-11T17:56:22.391-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="automation"/><category scheme="http://www.blogger.com/atom/ns#" term="command line"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="ios"/><category scheme="http://www.blogger.com/atom/ns#" term="macosx"/><category scheme="http://www.blogger.com/atom/ns#" term="reminder"/><category scheme="http://www.blogger.com/atom/ns#" term="tips"/><category scheme="http://www.blogger.com/atom/ns#" term="tricks"/><title type='text'>List all available instruments templates</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Using Apple&#39;s &lt;b&gt;instruments&lt;/b&gt; on the command line to inspect an iOS application on the device, usually involves a specific template to capture data from the application running on the device.&lt;br /&gt;
&lt;br /&gt;
For my current project I usually used the &lt;b&gt;Automation.tracetemplate&lt;/b&gt;&amp;nbsp;to launch my iOS app. But after I&#39;ve upgraded Xcode from 4.3 to 4.5, the filesystem location of the instruments templates have been slightly changed. The framework that I wrote for the performance tracking system failed in finding the template. I started to investigate a better solution to be able to deal with different Xcode versions that could be found on the dev machines.&lt;br /&gt;
&lt;br /&gt;
For that reason I created a little helper class to identify the version of Xcode to locate the correct path of the &lt;b&gt;Automation.tracetemplate&lt;/b&gt;. That works pretty fine, but I don&#39;t know if this will work for future Xcode versions too. This solution required &lt;b&gt;xcodebuild -version&lt;/b&gt;&amp;nbsp;to determine the Xcode version and &lt;b&gt;xcode-select -print-path&lt;/b&gt;&amp;nbsp;to determine the location of the Xcode folder. I needed this information to assemble the path to the templates.&lt;br /&gt;
There must be a better, shorter way of getting this information.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;
A better solution&lt;/span&gt;&lt;/h3&gt;
&lt;div&gt;
Running instruments on the command line produces a rather concise than helpful overview of the available options. I couldn&#39;t find any manpage for instruments on my machine. Rather by accident than intentional, I came across the instruments &lt;a href=&quot;https://developer.apple.com/library/mac/#documentation/Darwin/Reference/Manpages/Xcode-3.2.5/man1/instruments.1.html&quot; target=&quot;_blank&quot;&gt;manpage&lt;/a&gt; on Apple&#39;s Developer Connection website.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
The manpage contained far more information about the available options including some description for the unknowing user. I discovered the option &lt;b&gt;-s&lt;/b&gt;&amp;nbsp;that produces a list of all available instrument templates. &amp;nbsp;Even if the manpage was targeting the Xcode tools 3.2.5 version (I couldn&#39;t find a more recent version), the option is still recognized by the latest instruments (as time of writing I used Xcode 4.6).&lt;br /&gt;
&lt;br /&gt;
Running &lt;b&gt;instruments -s&lt;/b&gt;&amp;nbsp;and parsing the output will give me path to the &lt;b&gt;Automation.template&lt;/b&gt;. without any guessing or probing. I hope this option will remain available in instruments in future versions.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/7454070292004784838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/7454070292004784838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/7454070292004784838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/7454070292004784838'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2013/02/list-available-instruments-templates.html' title='List all available instruments templates'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-6054865242010899771</id><published>2013-01-29T16:10:00.000-08:00</published><updated>2013-01-30T11:00:12.948-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="adobe"/><category scheme="http://www.blogger.com/atom/ns#" term="arbeit"/><category scheme="http://www.blogger.com/atom/ns#" term="job"/><category scheme="http://www.blogger.com/atom/ns#" term="pferd"/><category scheme="http://www.blogger.com/atom/ns#" term="usa"/><title type='text'>Das tote Pferd</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Es gibt diese Weißheit der Dakota Indianer:&amp;nbsp;&lt;b&gt;„Wenn Du entdeckst, dass Du ein totes Pferd reitest, steig ab!”&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Und heute ist es wieder passiert. Ich hab die Zeichen wieder nicht gesehen. Vielleicht waren dort auch keine, aber das Pferd auf dem ich geritten bin ist definitv tot. Leider bin ich nicht aus freien Stücken abgestiegen, sondern abgestiegen worden.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;Mit anderen Worten: mein Arbeitgeber hat heute mal wieder eine neue strategische Ausrichtung bekannt gegeben und leider war mein Team, und damit eine Menge anderer Kollegen, nicht mehr direkt Teil dieser neuen Strategie. Zum Glück wurde aber keiner meiner Kollegen entlassen. Das hat die Firma aus den vergangenen Umstrukturierungen gelernt. Erst fire, dann hire ist teuer.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Hab ich noch einen Job? Ja, hab ich. Also kein Grund zum meckern. Was für ein Job? Keine Ahnung.&lt;br /&gt;
&lt;br /&gt;
Warum rege ich mich darüber auf? Du bist in den USA. Da ist das doch gang und gebe. Ja, das ist zwar richtig und es verwundert mich auch nicht wirklich. Es ist nur die Häufigkeit der Veränderungen in den letzten 2 Jahren gewesen. Und jedes mal das ungute Gefühl, dass ich irgendwann durch die Mühlen falle und keinen Job mehr habe, wir das Land verlassen müssen, weil das Visum an meinen Arbeitgeber gebunden ist.&lt;br /&gt;
Naja, jetzt heisst es erstmal abwarten und sehen was das kommt. Jeder Neuanfang ist auch eine Chance etwas Neues zu lernen.&lt;br /&gt;
Also, es ist mal wieder Zeit etwas Neues zu lernen.&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/6054865242010899771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/6054865242010899771' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/6054865242010899771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/6054865242010899771'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2013/01/das-tote-pferd.html' title='Das tote Pferd'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-3477530877788602254</id><published>2012-12-24T10:15:00.002-08:00</published><updated>2012-12-24T10:16:44.084-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="christmas"/><category scheme="http://www.blogger.com/atom/ns#" term="san francisco"/><category scheme="http://www.blogger.com/atom/ns#" term="weihnachten"/><title type='text'>Frohe Weihnachten/Merry Christmas</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Frohe Weihnachten/Merry Christmas&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjocxcdjGtfYaFnC4DUVkict62ccG1H25lNlJ20YooPIkG7w4a43Z5fXNZO7UbCGUphvujK581DNg6GuZ75PvTjfH3DPFjLzKIycrHpLHwbPpM_WXs8A3ZYxp5gzROwLEDgSQB1FOlx-bdj/s1600/SanFranciscoCityHall2012Lights.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;215&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjocxcdjGtfYaFnC4DUVkict62ccG1H25lNlJ20YooPIkG7w4a43Z5fXNZO7UbCGUphvujK581DNg6GuZ75PvTjfH3DPFjLzKIycrHpLHwbPpM_WXs8A3ZYxp5gzROwLEDgSQB1FOlx-bdj/s400/SanFranciscoCityHall2012Lights.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;San Francisco City Hall 2012&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/3477530877788602254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/3477530877788602254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/3477530877788602254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/3477530877788602254'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2012/12/frohe-weihnachtenmerry-christmas.html' title='Frohe Weihnachten/Merry Christmas'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjocxcdjGtfYaFnC4DUVkict62ccG1H25lNlJ20YooPIkG7w4a43Z5fXNZO7UbCGUphvujK581DNg6GuZ75PvTjfH3DPFjLzKIycrHpLHwbPpM_WXs8A3ZYxp5gzROwLEDgSQB1FOlx-bdj/s72-c/SanFranciscoCityHall2012Lights.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-4402393981157314887</id><published>2012-08-27T11:00:00.000-07:00</published><updated>2012-08-27T11:00:02.961-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="Nexus7"/><category scheme="http://www.blogger.com/atom/ns#" term="nottoserious"/><title type='text'>R.I.P. Nexus 7</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Beginning of this month I received my &lt;a href=&quot;http://www.google.com/nexus/#/7&quot; target=&quot;_blank&quot;&gt;Nexus 7 Tablet&lt;/a&gt;. I really like the form factor, the performance and how handsome this device feels in my hands. We had a great time.&lt;br /&gt;
&lt;br /&gt;
Last Wednesday, without any further warning and totally surprising, the Nexus 7 died in my hands. I&#39;m really sad about this loss, since I had no chance to properly say goodbye.&lt;br /&gt;
&lt;br /&gt;
What happened? The screen started to show a lot of horizontal lines dancing from left to right and back. After a couple of seconds, the tablet shut itself down. There was no way to switch it on again. I tried everything. Finally I attached the tablet to my computer and it started to show signs of life again. I was so lucky. The battery charging symbol appeared and it seemed I was able to save the life of it. After some hours of&amp;nbsp;continuous&amp;nbsp;charging, it seemed that everything turned back to normal, but after some minutes using it, the same symptoms came back. This time, the tablet shutdown much more quickly. I was unable to switch it back on again. I declared the tablet dead at 3:21pm, Wednesday, 22nd of August 2012.&lt;br /&gt;
&lt;br /&gt;
I called the undertaker (Google Support) how to proceed with this dead patient now. They offered me a replacement Nexus 7 tablet that will be send to me in the next couple of days (nothing can replace my beloved original Nexus 7 tablet).&lt;br /&gt;
Once arrived, I have to send the dead one back to them and they hopefully will give it the appropriate final treatment in it&#39;s short life.&lt;br /&gt;
&lt;br /&gt;
Rest in peace.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/4402393981157314887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/4402393981157314887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/4402393981157314887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/4402393981157314887'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2012/08/rip-nexus-7.html' title='R.I.P. Nexus 7'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-5744616277810308488</id><published>2012-07-03T09:39:00.000-07:00</published><updated>2012-07-03T09:39:44.585-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="adobe"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="flash"/><category scheme="http://www.blogger.com/atom/ns#" term="performance"/><title type='text'>New Job: ActionScript VM Performance Engineer</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
A couple of weeks ago I started to work for a new team within Adobe. The team: Performance Engineering for the ActionScript VM (AVM). What am I doing there? Build the infrastructure to track the performance data, analyze performance issues and develop performance workloads for the AVM.&lt;br /&gt;
&lt;br /&gt;
For all reader not familiar with the AVM, it&#39;s the virtual machine that is used by the Flash Player to run Flash content. Wait, did I say Flash Player? Yes, the piece of well known software that so many people use and so many believe it&#39;s dead (or about to die). I can tell you, that at least from Adobes perspective, that the opposite is the truth (even if the perception out there might be different). Adobe is investing in ActionScript and Flash Player to make it the best language and execution environment for modern web enabled applications. There will be changes to the ActionScript language, which will improve the overall execution performance.&amp;nbsp;&lt;span style=&quot;background-color: white;&quot;&gt;The roadmap is available&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.adobe.com/devnet/flashplatform/whitepapers/roadmap.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;&lt;span style=&quot;background-color: white;&quot;&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;One of the improvements already in place are Workers. Workers help the developer to execute code in a separate thread to create a smooth user experience. Think of some heavy computation that doesn&#39;t have to happen in the UI thread anymore. Have a look at the Worker &lt;a href=&quot;http://www.bytearray.org/?p=4423&quot; target=&quot;_blank&quot;&gt;example&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;background-color: white;&quot;&gt;To better keep track of the upcoming performance improvements, this new team was build and I&#39;m happy to be part of it. I&#39;m going to work on a lot of different things over the next few months: automation, webapp/database development, analyzing performance issues, developing the relevant workloads to measure the performance, etc. This sounds exciting.&lt;/span&gt;&lt;br /&gt;
Riding a dead horse looks different.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/5744616277810308488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/5744616277810308488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/5744616277810308488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/5744616277810308488'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2012/07/new-job-actionscript-vm-performance.html' title='New Job: ActionScript VM Performance Engineer'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-2796024315938003537</id><published>2012-05-08T00:01:00.000-07:00</published><updated>2012-05-08T00:01:01.572-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grape"/><category scheme="http://www.blogger.com/atom/ns#" term="groovy"/><category scheme="http://www.blogger.com/atom/ns#" term="ivy"/><category scheme="http://www.blogger.com/atom/ns#" term="repository"/><category scheme="http://www.blogger.com/atom/ns#" term="resolver"/><title type='text'>Grape: adding a repo to the ivy configuration</title><content type='html'>&lt;p&gt;Grape is a great thing. It&amp;#8217;s one of my favorite features in groovy. It makes groovy script distribution so easy and painless. You want to use your groovy script on a new machine? Install groovy (if not already done) on the other machine and copy the script to the new machine. The script and all declared dependencies will be downloaded for you and the script is ready to run. What a timesaver.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Grab(group=&#39;mycompany.com&#39;, module=&#39;awesome-lib&#39;, version=&#39;1.2&#39;)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This statement specifies a dependency to a library that your groovy script depends on. No need to copy this jar and all transitive dependencies manually to your machine. No need to make it manually available in the classpath. You know maven, gradle and ivy. They do the same job during build time. Grape provides the same dependency resolving functionality in the runtime scenario. No worries about missing dependencies anymore.&lt;/p&gt;

&lt;p&gt;What happens if a required dependency is part of a &lt;strong&gt;not-so-famous&lt;/strong&gt; or a company internal repository? Grape has a solution for it! You specify the repository with a Grape annotation and tell the dependency resolver to consult your company repository in order to resolve dependencies.&lt;/p&gt;

&lt;p&gt;The following statement will add a repository named &amp;#8216;my_unknown_repository&amp;#8217; and a root URL &amp;#8216;http://repo.mycompany.com&amp;#8217; to the list of resolvers.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@GrabResolver(name=&#39;my_unknown_repository&#39;, root=&#39;http://repo.mycompany.com&#39;)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In case that you have a company internal repository (which also acts as a proxy to the outside world) and you &lt;em&gt;always&lt;/em&gt; want to consult this repository without always remembering the GrabResolver annotation for every script you write, there is another way of specifying the repository. This option is less flexible, but it saves this one line in every script and probably makes more sense in a larger context like companies.
To add your repository permanently to the resolver list, I recommend to obtain a copy of the configuration file that Grape uses to configure the underlying ivy to perform the heavy-lifting.&lt;/p&gt;

&lt;p&gt;Grape uses a specific configuration that can be found in the groovy-x.y.z.jar. In order to customize the configuration, we need to create a &lt;code&gt;grapeConfig.xml&lt;/code&gt; and add our repository there. But how does the content of the file look like? To preserve the existing configuration, we get a copy of the original config file from the groovy.jar.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s jump to the command line (I assume that java&amp;#8217;s &lt;code&gt;jar&lt;/code&gt; is in the search path and &lt;code&gt;/path/to/groovy&lt;/code&gt; exists):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;jar -xf /path/to/groovy/lib/groovy-1.8.6.jar groovy/grape/defaultGrapeConfig.xml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This command extracts the defaultGrapeConfig.xml to the current directory. Open this file with your favorite editor and you will probably see something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;ivysettings&amp;gt;
  &amp;lt;settings defaultResolver=&quot;downloadGrapes&quot;/&amp;gt;
  &amp;lt;resolvers&amp;gt;
    &amp;lt;chain name=&quot;downloadGrapes&quot;&amp;gt;
      &amp;lt;filesystem name=&quot;cachedGrapes&quot;&amp;gt;
        &amp;lt;ivy pattern=&quot;${user.home}/.groovy/grapes/[organisation]/[module]/ivy-[revision].xml&quot;/&amp;gt;
        &amp;lt;artifact pattern=&quot;${user.home}/.groovy/grapes/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]&quot;/&amp;gt;
      &amp;lt;/filesystem&amp;gt;
        &amp;lt;!-- todo add &#39;endorsed groovy extensions&#39; resolver here --&amp;gt;
      &amp;lt;ibiblio name=&quot;codehaus&quot; root=&quot;http://repository.codehaus.org/&quot;   m2compatible=&quot;true&quot;/&amp;gt;
      &amp;lt;ibiblio name=&quot;ibiblio&quot; m2compatible=&quot;true&quot;/&amp;gt;
      &amp;lt;ibiblio name=&quot;java.net2&quot; root=&quot;http://download.java.net/maven/2/&quot; m2compatible=&quot;true&quot;/&amp;gt;
    &amp;lt;/chain&amp;gt;
  &amp;lt;/resolvers&amp;gt;
&amp;lt;/ivysettings&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now go ahead and copy one of the &lt;code&gt;&amp;lt;ibiblio… /&amp;gt;&lt;/code&gt; lines and add your repository configuration.
Finished with editing? Save the file as &lt;code&gt;grapeConfig.xml&lt;/code&gt; in &lt;code&gt;~/.groovy/&lt;/code&gt;.
From now on Grape will search your repository every time there is a dependency to resolve. If you want Grape to use &lt;em&gt;only&lt;/em&gt; your repository, because it&amp;#8217;s caching downloaded dependencies, you should remove all &lt;code&gt;&amp;lt;ibiblio… /&amp;gt;&lt;/code&gt; lines, except the one for your repository.&lt;/p&gt;

&lt;p&gt;Additional documentation about Grape can be found &lt;a href=&quot;http://docs.codehaus.org/display/GROOVY/Grape&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/2796024315938003537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/2796024315938003537' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/2796024315938003537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/2796024315938003537'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2012/05/grape-adding-repo-to-ivy-configuration.html' title='Grape: adding a repo to the ivy configuration'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total><georss:featurename>Castro Valley, CA, USA</georss:featurename><georss:point>37.6940973 -122.0863522</georss:point><georss:box>37.6438393 -122.16531619999999 37.7443553 -122.0073882</georss:box></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-204780477751421813</id><published>2012-04-26T13:10:00.001-07:00</published><updated>2012-04-26T13:10:46.671-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="learning"/><category scheme="http://www.blogger.com/atom/ns#" term="programming"/><category scheme="http://www.blogger.com/atom/ns#" term="university"/><title type='text'>How do machines learn?</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I already thought that I know the answer, until I met someone at a Party who told me about &lt;a href=&quot;https://en.wikipedia.org/wiki/Machine_learning&quot; target=&quot;_blank&quot;&gt;Machine Learning&lt;/a&gt;. That was the point when I&amp;nbsp;realized&amp;nbsp;that I only know a small fraction of this topic. Luckily, I found &lt;a href=&quot;https://www.coursera.org/course/ml&quot; target=&quot;_blank&quot;&gt;this&lt;/a&gt; free online class from &lt;a href=&quot;http://www.stanford.edu/&quot; target=&quot;_blank&quot;&gt;Stanford University&lt;/a&gt;. The class runs for 10 weeks and I hope to learn the basics about &lt;a href=&quot;https://en.wikipedia.org/wiki/Machine_learning&quot; target=&quot;_blank&quot;&gt;Machine Learning&lt;/a&gt;, the tools and how to develop great algorithms for large datasets. The class started last Monday, so I already watched some of the videos and installed Octave. Now I need to learn how to use it.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/204780477751421813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/204780477751421813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/204780477751421813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/204780477751421813'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2012/04/how-do-machines-learn.html' title='How do machines learn?'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-2570207791830628802</id><published>2012-03-26T09:00:00.000-07:00</published><updated>2012-03-26T11:24:45.191-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dvcs"/><category scheme="http://www.blogger.com/atom/ns#" term="english"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><category scheme="http://www.blogger.com/atom/ns#" term="mercurial"/><category scheme="http://www.blogger.com/atom/ns#" term="perforce"/><category scheme="http://www.blogger.com/atom/ns#" term="thoughts"/><category scheme="http://www.blogger.com/atom/ns#" term="vcs"/><title type='text'>git and why I sometimes feel lost</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Yes, I had an affair with cvs, svn and Perforce the last couple of years! But most of the time I&#39;m using Perforce, since this is used by my employer. Last year I started to look closer at git and mercurial. For some open source projects that I&#39;m contributing to, I had to use git (&lt;a href=&quot;https://github.com/jenkinsci&quot;&gt;Jenkins&lt;/a&gt; and &lt;a href=&quot;https://github.com/mxcl/homebrew&quot;&gt;homebrew&lt;/a&gt;) and mercurial (&lt;a href=&quot;https://developer.mozilla.org/en/Tamarin&quot;&gt;tamarin&lt;/a&gt;) to keep track of my changes. Having used Version Control Systems (VCS) for a long time, I thought that &lt;a href=&quot;http://git-scm.com/&quot;&gt;git&lt;/a&gt; and &lt;a href=&quot;http://mercurial.selenic.com/&quot;&gt;mercurial&lt;/a&gt; (hg) are just another new system that couldn&#39;t be too difficult to deal with. The start wasn&#39;t that bad: clone a repo, work locally, submitting changes locally without connection to the repository server is really a very productive feature.&lt;br /&gt;
&lt;br /&gt;
How does it work if you meet somebody new and you try to build a relationship? You look for similarities and things that make it easier to find common ground. I my case I was still thinking: hey, they are all &lt;a href=&quot;https://en.wikipedia.org/wiki/Revision_control&quot;&gt;VCS&#39;s&lt;/a&gt; (Version Control Systems). That&#39;s true, they have a lot in common, but I also think they are more different than everybody thinks. I had to learn new concepts (which I always consider good) because of the centralized/decentralized nature of the different systems. The different terminology that all the systems use, is one of the issues that makes working not as smooth as I was used to it. Why? Every time I run into issues with branches, merges, resolving and I had to search for the &quot;thing or situation&quot; that described my situation best. But always in the language of the VCS that I was currently using. The longer I use the system, the better I should get to find the appropriate information quickly next time. I found numerous community driven site with tips and tricks and work flows for git and mercurial. There is the git and the mercurial handbook which will provide enough information to manage the most complex work- flows one can think of. But sometimes I&#39;m looking for the simple tasks and how to manage them.&lt;br /&gt;
&lt;br /&gt;
I&#39;m getting better. I like git and hg. I don&#39;t love them yet, but we are working on our relationship. Even if they sometimes give me a hard time solving simple tasks, like this one: I wanted to delete a branch in one of my github repositories. As an example: in Perforce GUI tool I select the branch and delete it. Done. With git I had to do this in order to delete the branch:&lt;br /&gt;
&lt;span style=&quot;font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;git push git@github:ingorichter/homebrew.git :update-libzip&lt;/span&gt;&lt;br /&gt;
A push really deleted the branch. Perfect!? I hope I&amp;nbsp;remember the command for the next time if I need to do it again.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Don&#39;t get me wrong: git and hg are very powerful, but it takes some time until your brain embraces the massive power of these VCS&#39;s. Until then, I assume that I will feel lost from time to time.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
An IMHO very interesting podcast about VCS&#39;s can be found &lt;a href=&quot;http://javaposse.com/webpage/java-posse-380-roundup-11-using-dvcs&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/2570207791830628802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/2570207791830628802' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/2570207791830628802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/2570207791830628802'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2012/03/git-and-why-i-sometimes-feel-lost.html' title='git and why I sometimes feel lost'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total><georss:featurename>San Francisco, CA, USA</georss:featurename><georss:point>37.7749295 -122.4194155</georss:point><georss:box>37.6745235 -122.577344 37.8753355 -122.261487</georss:box></entry><entry><id>tag:blogger.com,1999:blog-8982539204068602702.post-4415391921833326332</id><published>2012-03-09T19:00:00.000-08:00</published><updated>2012-03-09T19:00:03.854-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="installer"/><category scheme="http://www.blogger.com/atom/ns#" term="jenkins"/><category scheme="http://www.blogger.com/atom/ns#" term="noteworthy"/><title type='text'>Jenkins: OSX installer now supports the creation of it&#39;s own jenkins user</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Okay, this doesn&#39;t sound like big thing, but there were some valid complaints from users that used jenkins to run their iOS and maven builds. Some of them had trouble with ssh. See &lt;a href=&quot;https://ljnelson.posterous.com/getting-jenkins-running-on-a-mac&quot;&gt;https://ljnelson.posterous.com/getting-jenkins-running-on-a-mac&lt;/a&gt; and&amp;nbsp;&lt;a href=&quot;http://colonelpanic.net/2011/06/jenkins-on-mac-os-x-git-w-ssh-public-key&quot;&gt;http://colonelpanic.net/2011/06/jenkins-on-mac-os-x-git-w-ssh-public-key&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Since jenkins version 1.449, the OSX installer provides an option to run the jenkins service no longer as daemon user. The installer is able to create a new jenkins user with it&#39;s own home directory (maven and ssh, here we come!). It should be easier to grant the jenkins user access to the keychain to allow codesigning of iOS deliverables.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Some facts about the new jenkins user:&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;uid will be determined automatically to avoid any collisions with existing users&lt;/li&gt;
&lt;li&gt;guid of jenkins group is determined automatically to avoid collisions with existing groups&lt;/li&gt;
&lt;li&gt;home directory of the jenkins user will be &lt;b&gt;/Users/Shared/Jenkins&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpL_-qYPeTrbbZowPaMe0dFn00CKhl3eLqdAyFsMbzrjebQtLNjWM96YVjn7H8IFQWRbIGskfSNo2Z6tK3fftwF8KQTr2rewOLtL7NOintpIB1h9PVmViE9jEHMniSjYR2B8idBjGJtsG5/s1600/Jenkins-installer-jenkins-user.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;470&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpL_-qYPeTrbbZowPaMe0dFn00CKhl3eLqdAyFsMbzrjebQtLNjWM96YVjn7H8IFQWRbIGskfSNo2Z6tK3fftwF8KQTr2rewOLtL7NOintpIB1h9PVmViE9jEHMniSjYR2B8idBjGJtsG5/s640/Jenkins-installer-jenkins-user.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Installer options&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;How to get rid of the jenkins installation?&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
I heard people talking about issues with the installer updating an existing installation (how can this be?). Some of them asked for way to get rid&amp;nbsp;of the installed files. Since OSX doesn&#39;t have a mechanism to un-install files, there are only the options to remove the files manually or use some 3rd party tool (TrashMe) to get rid of the files. Since these tools use some heuristic methods to determine the files to remove, I created a simple shell script to remove all files installed by the installer. The script can be found &lt;a href=&quot;http://dl.dropbox.com/u/318506/jenkins/uninstall.sh&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;b&gt;Warning: I used the script for testing purpose when experimenting with the installer. The are no error checks and it&#39;s far from being perfect. So, please use at your own risk!&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ingorichter.blogspot.com/feeds/4415391921833326332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8982539204068602702/4415391921833326332' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/4415391921833326332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8982539204068602702/posts/default/4415391921833326332'/><link rel='alternate' type='text/html' href='http://ingorichter.blogspot.com/2012/03/jenkins-osx-installer-now-supports.html' title='Jenkins: OSX installer now supports the creation of it&#39;s own jenkins user'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/09982497492498082317</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpL_-qYPeTrbbZowPaMe0dFn00CKhl3eLqdAyFsMbzrjebQtLNjWM96YVjn7H8IFQWRbIGskfSNo2Z6tK3fftwF8KQTr2rewOLtL7NOintpIB1h9PVmViE9jEHMniSjYR2B8idBjGJtsG5/s72-c/Jenkins-installer-jenkins-user.png" height="72" width="72"/><thr:total>6</thr:total><georss:featurename>San Francisco, CA, USA</georss:featurename><georss:point>37.7749295 -122.4194155</georss:point><georss:box>37.6745235 -122.577344 37.8753355 -122.261487</georss:box></entry></feed>