<?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-6652554936740795212</id><updated>2024-10-24T17:24:53.722+02:00</updated><category term="Fotografie"/><category term="Natur"/><category term="Vonderort"/><category term="Internet"/><category term="Ausflug"/><category term="Bottrop"/><category term="Ruby"/><category term="Veranstaltung"/><category term="Termin"/><category term="Tiere"/><category term="Wandern"/><category term="Computer"/><category term="Oberhausen"/><category term="SPD"/><category term="Velbert"/><category term="Arduino"/><category term="CSV"/><category term="Entwicklung"/><category term="Geocaching"/><category term="Musik"/><category term="Politik"/><category term="iOS"/><category term="API"/><category term="Duisburg"/><category term="Kommunalwahl"/><category term="Medien"/><category term="Netzpolitik"/><category term="Panorama"/><category term="Wahlkampf"/><category term="Zoo"/><category term="Apple"/><category term="Architektur"/><category term="Ausgehen"/><category term="Besichtigung"/><category term="Bochum"/><category term="Bunker"/><category term="EFI"/><category term="Essen"/><category term="Fernsehen"/><category term="Frage"/><category term="Gelsenkirchen"/><category term="HTML"/><category term="Hase"/><category term="Lost Place"/><category term="Macbook Air"/><category term="Marketing"/><category term="Museum"/><category term="Office"/><category term="REST"/><category term="RegEx"/><category term="Twitter"/><category term="XML"/><category term="Zensursula"/><title type='text'>Petschbot</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><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>71</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-8663045850852559814</id><published>2014-06-08T12:47:00.001+02:00</published><updated>2014-06-10T18:52:21.039+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Bunker"/><category scheme="http://www.blogger.com/atom/ns#" term="Oberhausen"/><title type='text'>Abbruch Bunker Osterfeld</title><content type='html'>&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;font-family: &#39;Helvetica Neue Light&#39;, HelveticaNeue-Light, helvetica, arial, sans-serif;&quot;&gt;Mit welchen Mühen der Abbruch eines Luftschutzhochbunkers verbunden ist, kann man derzeit in Oberhausen Osterfeld nachvollziehen. Mit maximal schweren Abbruchgerät wird hier der Bunker an der Bottroper Straße abgetragen. Aus den Fotos ergibt sich ein seltener Querschnitt durch einen solchen Bunker. Warum hier ein solcher Aufwand getrieben wird ist mir aber schleierhaft. Mit den Grundstückspreisen in dieser Ecke dürfte es kaum zusammenhängen...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRMykmPdwJmwuijCcq0hkU197CjsN5868nOmBIHX8JtSFD3GgSpwN3fTLlvBuPYnhxfzc2jYt7ysS9PyKhZ_mwUxmoOs5iMWkoR1WlTsFjzpcpeGnjy5O5jY51FtAAS0Yet8qiDlGK_erx/s640/blogger-image--870523434.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRMykmPdwJmwuijCcq0hkU197CjsN5868nOmBIHX8JtSFD3GgSpwN3fTLlvBuPYnhxfzc2jYt7ysS9PyKhZ_mwUxmoOs5iMWkoR1WlTsFjzpcpeGnjy5O5jY51FtAAS0Yet8qiDlGK_erx/s640/blogger-image--870523434.jpg&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUL9u5dCMx63cEEjPLSSYEXi7oXaRbUIXTquQGY-MHyGzhUhQLQVHxc588klBJLEgp9MfHyx2FKV4emFsP-J0qPkoGkNjqwt3UOx47cHv3JQRhENvYPd0jWTwIs2nyOtazK9cspWPcQicH/s640/blogger-image--544531478.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUL9u5dCMx63cEEjPLSSYEXi7oXaRbUIXTquQGY-MHyGzhUhQLQVHxc588klBJLEgp9MfHyx2FKV4emFsP-J0qPkoGkNjqwt3UOx47cHv3JQRhENvYPd0jWTwIs2nyOtazK9cspWPcQicH/s640/blogger-image--544531478.jpg&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0bAfjP3R2hNDgE774pChic1nEil22R1vf0HYfYIDAgz8e-o5UEVB2hP9rrQGsPxyJe4l6nO-UM-Ww6zO8LQMusS5Av8C0051Hlg1fYLr8tS7CFjUWpamEaiSqYCdUhF5IiR0LFsz8OZ9D/s640/blogger-image-1292113735.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0bAfjP3R2hNDgE774pChic1nEil22R1vf0HYfYIDAgz8e-o5UEVB2hP9rrQGsPxyJe4l6nO-UM-Ww6zO8LQMusS5Av8C0051Hlg1fYLr8tS7CFjUWpamEaiSqYCdUhF5IiR0LFsz8OZ9D/s640/blogger-image-1292113735.jpg&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/8663045850852559814/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2014/06/abbruch-bunker-osterfeld.html#comment-form' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/8663045850852559814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/8663045850852559814'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2014/06/abbruch-bunker-osterfeld.html' title='Abbruch Bunker Osterfeld'/><author><name>Unknown</name><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/AVvXsEgRMykmPdwJmwuijCcq0hkU197CjsN5868nOmBIHX8JtSFD3GgSpwN3fTLlvBuPYnhxfzc2jYt7ysS9PyKhZ_mwUxmoOs5iMWkoR1WlTsFjzpcpeGnjy5O5jY51FtAAS0Yet8qiDlGK_erx/s72-c/blogger-image--870523434.jpg" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-9191644301178198081</id><published>2014-06-07T16:08:00.001+02:00</published><updated>2014-06-07T16:10:33.869+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Fotografie"/><category scheme="http://www.blogger.com/atom/ns#" term="Natur"/><title type='text'>Wald...</title><content type='html'>&lt;br&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxNuTuBKOZlm8u5nYAz62g6sGYMW-FUxeo0MFK1QamS2jjL9VYbm-EEaSwPrxs3ERRUnYa6hIUPf2yCYPtBOZ8czd7_3v1t4zrKWODMjKFvyqfhbxe4qUPSo9U1E82rB3W06U1z4sqeUSw/s640/blogger-image-1013976005.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxNuTuBKOZlm8u5nYAz62g6sGYMW-FUxeo0MFK1QamS2jjL9VYbm-EEaSwPrxs3ERRUnYa6hIUPf2yCYPtBOZ8czd7_3v1t4zrKWODMjKFvyqfhbxe4qUPSo9U1E82rB3W06U1z4sqeUSw/s640/blogger-image-1013976005.jpg&quot;&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/9191644301178198081/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2014/06/wald.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/9191644301178198081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/9191644301178198081'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2014/06/wald.html' title='Wald...'/><author><name>Unknown</name><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/AVvXsEgxNuTuBKOZlm8u5nYAz62g6sGYMW-FUxeo0MFK1QamS2jjL9VYbm-EEaSwPrxs3ERRUnYa6hIUPf2yCYPtBOZ8czd7_3v1t4zrKWODMjKFvyqfhbxe4qUPSo9U1E82rB3W06U1z4sqeUSw/s72-c/blogger-image-1013976005.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-5446414060165972530</id><published>2014-05-13T22:03:00.000+02:00</published><updated>2014-05-13T22:03:01.557+02:00</updated><title type='text'>How to export Evernote notes to plain text files via NvAlt</title><content type='html'>Out of the box, Evernote can only export notes as a single XML-File (exml) or as multiple HTML files. Here a simple how to for exporting Evernote Notes to plain text files via NvAlt.&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You will need:&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Evernote Desktop Client for OSX&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://brettterpstra.com/projects/nvalt/&quot; target=&quot;_blank&quot;&gt;NvAlt&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Export your notes from Evernote to HTML files (File -&amp;gt; Export)&lt;/li&gt;
&lt;li&gt;Open the NvAlt Preferences and go to &quot;Notes&quot;, &quot;Storage&quot;. Select the Evernote Export Folder as Storage Folder and &quot;Formatted HTML&quot; as storage format. Close the NvAlt Preferences&lt;/li&gt;
&lt;li&gt;NvAlt will now import the Evernote HTML-Export files.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Select all notes inside NvAlt and export them to plain text files via &quot;File -&amp;gt; Export&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/5446414060165972530/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2014/05/how-to-export-evernote-notes-to-plain.html#comment-form' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/5446414060165972530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/5446414060165972530'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2014/05/how-to-export-evernote-notes-to-plain.html' title='How to export Evernote notes to plain text files via NvAlt'/><author><name>Unknown</name><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-6652554936740795212.post-6160470976797025282</id><published>2013-10-09T21:24:00.000+02:00</published><updated>2013-10-09T21:24:38.648+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="HTML"/><category scheme="http://www.blogger.com/atom/ns#" term="iOS"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><title type='text'>iOS7: Website für Präsentation offline verfügbar machen</title><content type='html'>Heute mal wieder ein Post aus der Reihe praktische Herausforderungen des Arbeitsalltags. Mein Team hat einen HTML5 Prototypen gebaut, inkl. aufwändiger JavaScript Effekte und optimiert für das iPad. Der Kunde wünscht nun diesen Website-Prototypen in internen Runden auch ohne Netzzugang auf dem iPad präsentieren zu können.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Jailbreak-Webserver fallen hier raus und ausgänglich plante ich die Website mittels Dropbox oder Documents von Readdle auf das iPad zu bringen. Beide Lösungen rendern die Site aber nicht sauber. Rund 5 gruselige Offline-Reader aus dem AppStore später kam ich über Googlen und das stets verlässliche StackOverflow auf die richtige Fährte.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Die HTML5 Spezifikation sieht bereits vor über sogenannte Cache Manifest Dateien dem Browser des ausspielenden Devices anzuweisen die dort definierten Teile einer Website lokal zu cachen.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Die Manifestdatei selber wird einfach in der Index.html referenziert.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;txt&quot;&gt;&amp;lt;html manifest=&quot;cache.manifest&quot;&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Die Datei cache.manifest wiederum ist inhaltlich im einfachsten Fall auch übersichtlich und umfasst neben einem Headerteil eine Auflistung der Lokal zu cachenden Dateien, relativ zum Manifest. Wichtig dabei ist die pro Revision der Website eindeutige Versionsnummer und das die Dateidefinition keine Wildcards umfassen darf.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;txt&quot;&gt;CACHE MANIFEST
# Version 201310916251
CACHE:
/index.html
/images/image1.png
&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Um die Generierung dieses Manifests zu erleichtern habe ich ein kleines Rubyscript geschrieben.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;ruby&quot;&gt;#!/usr/bin/ruby -w
t = Time.new
timestamp = t.year, t.month, t.day, t.hour, t.min, t.sec
open(&#39;cache.manifest&#39;, &#39;w&#39;) do |fo|
  fo.puts &quot;CACHE MANIFEST&quot;
  fo.puts &quot;# Version #{timestamp}&quot;
  fo.puts &quot;CACHE:&quot;
  array = Dir[&quot;./**/*&quot;].select{|f| !File.directory? f}
  array.each do |i|
    fo.puts &quot;#{i}&quot;.gsub(/^\./, &quot;&quot;)
  end
end
&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
An sich ist damit alles vorbereitet damit der Mobile Safari auf dem iPad beim ersten Aufruf der Website eine lokale Kopie in den Cache schaufelt. Um diese Upzudaten muss der User entweder einen manuellen Reload forcieren oder die Versionsnummer in der cache.manifest inkremiert werden (was das Script über einen Zeitstempel erledigt). Um das ganze schön zu machen wurde in der Index.html noch über das passende metatag auf ein schickes Icon verwiesen und das Ganze kann dann über die entsprechende Funktion des mobile Safari als Bookmark direkt auf den Homescreen abgelegt werden.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Somit war nur noch eine Frage offen: Wie groß darf die Website sein. Apple schweigt sich dazu in seiner Developer Reference aus, im Netz finden sich angaben im Bezug auf iOS6 zwischen 5 und 10MB. Mittels Trail and Error konnte ich ermitteln, dass unter iOS 7 eine Website über die cache.manifest 20MB cachen darf. Geht die Summe der Dateien darüber hinaus wird interessanterweise radikal gar nichts gecacht!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Weitergehende Infos hier:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://developer.apple.com/library/safari/documentation/iphone/conceptual/safarijsdatabaseguide/OfflineApplicationCache/OfflineApplicationCache.html#//apple_ref/doc/uid/TP40007256-CH7-SW1&quot;&gt;https://developer.apple.com/library/safari/documentation/iphone/conceptual/safarijsdatabaseguide/OfflineApplicationCache/OfflineApplicationCache.html#//apple_ref/doc/uid/TP40007256-CH7-SW1&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html#//apple_ref/doc/uid/TP40008193-SW1&quot;&gt;https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html#//apple_ref/doc/uid/TP40008193-SW1&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/6160470976797025282/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2013/10/ios7-website-fur-prasentation-offline.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/6160470976797025282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/6160470976797025282'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2013/10/ios7-website-fur-prasentation-offline.html' title='iOS7: Website für Präsentation offline verfügbar machen'/><author><name>Unknown</name><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-6652554936740795212.post-5042810827319403906</id><published>2013-04-22T15:07:00.000+02:00</published><updated>2013-04-22T15:12:55.023+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Entwicklung"/><category scheme="http://www.blogger.com/atom/ns#" term="Geocaching"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><title type='text'>RUBY: Geo-Locations Referenzpunkten zuordnen</title><content type='html'>&lt;p&gt;Das folgende Script sieht vor im zu untersuchenden Gebiet ein oder mehrere Referenzpunkte zu setzen und darum einen Radius in Metern zu schlagen. Diese Referenzpunkte werden in der ersten CSV-Datei hinterlegt. Die Radien dürfen sich dabei überschneiden. In einer zweiten CSV-Datei findet sich die Geo-Locations.&lt;/p&gt;

&lt;p&gt;Das Script kalkuliert anschließend die Distanz zwischen den Referenzpunkten und den Locations und vergleicht, ob die Location innerhalb der (pro Referenzpunkt individuell zu definierenden) Radien liegt. Dafür verwendet es eine Kalkulation nach Haversine wie in diesem Blogpost beschrieben: &lt;a href=&quot;http://codingandweb.blogspot.de/2012/04/calculating-distance-between-two-points.html&quot; target=&quot;_blank&quot;&gt;http://codingandweb.blogspot.de/2012/04/calculating-distance-between-two-points.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Falls eine Location in den Radien mehrerer Referenzpunkte liegt wird der am nächsten liegende Referenzpunkt als Empfehlung bestimmt. Die Ergebnisse werden im Terminal und gleichzeitig als CSV-Datei ausgegeben. Anhand dieser Angaben lassen sich Locations gruppieren und z.B. eine Location-basierte Abarbeitung planen.&lt;/p&gt;

&lt;p&gt;Datenfelder in der Locations-CSV&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id (ID der Location)&lt;/li&gt;
&lt;li&gt;lat (Location Latitude in der Form 59.1234)&lt;/li&gt;
&lt;li&gt;long (Location Longitude in der Form 6.1234)&lt;/li&gt;
&lt;li&gt;name (Name der Location)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Datenfelder in der Referenzen-CSV&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id (ID des Referenzpunkts)&lt;/li&gt;
&lt;li&gt;lat (Referenzpunkt Latitude)&lt;/li&gt;
&lt;li&gt;long (Referenzpunkt Longitude)&lt;/li&gt;
&lt;li&gt;radius (Gewünschter Radius um den Punkt im Meter)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Datenfelder in der Output-CSV&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id (Location ID)&lt;/li&gt;
&lt;li&gt;name (Name der Location)&lt;/li&gt;
&lt;li&gt;lat (Location Latitude)&lt;/li&gt;
&lt;li&gt;long (Location Longitude)&lt;/li&gt;
&lt;li&gt;ref matches (Anzahl der Referenzpunkte, in deren Radius die Location liegt)&lt;/li&gt;
&lt;li&gt;ref recommendation (Referenzpunkt am nächsten zur Location)&lt;/li&gt;
&lt;li&gt;ref shortest distance (Distanz in Metern zu diesem Referenzpunkt)&lt;/li&gt;
&lt;li&gt;ref %id% (Liegt Location im Radius des Referenzpunktes %id% (true/false))&lt;/li&gt;
&lt;li&gt;ref %id% distance (Distanz in Metern der Location zum Referenzpunkt %id%)&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class = &quot;ruby&quot;&gt;
#!/usr/bin/ruby -w

require &#39;rubygems&#39;
require &#39;fastercsv&#39;

# Dateien über Kommandozeilenargumente definieren
reference_csv = ARGV[0] # CSV-datei mit den Referenzpunkten (id;lat;long;radius)
locations_csv = ARGV[1] # CSV-Datei mit den Locations () (id;lat;long)
output_csv = ARGV[2] # Gewünschter Name der Output-Datei


# Mathematische Funktionen um Distanz zwischen zwei Punkten definieren zu können
# http://codingandweb.blogspot.de/2012/04/calculating-distance-between-two-points.html

def power(num, pow)
  num ** pow
end

def haversine(lat1, long1, lat2, long2)
  dtor = Math::PI/180
  r = 6378.14*1000

  rlat1 = lat1 * dtor 
  rlong1 = long1 * dtor 
  rlat2 = lat2 * dtor 
  rlong2 = long2 * dtor 

  dlon = rlong1 - rlong2
  dlat = rlat1 - rlat2

  a = power(Math::sin(dlat/2), 2) + Math::cos(rlat1) * Math::cos(rlat2) * power(Math::sin(dlon/2), 2)
  c = 2 * Math::atan2(Math::sqrt(a), Math::sqrt(1-a))
  d = r * c

  return d
end

# Referenzpunkte in Array einlesen

references = []
reference_line_counter = 0

FasterCSV.foreach(reference_csv, :quote_char =&gt; &#39;&quot;&#39;, :col_sep =&gt;&#39;;&#39;, :row_sep =&gt;:auto) do |row|
  unless reference_line_counter == 0 then
    references.push (&quot;#{row[0]}|#{row[1]}|#{row[2]}|#{row[3]}&quot;)
  end
  reference_line_counter += 1
end

puts &quot;#{(reference_line_counter - 1)} Referenzen eingelesen.&quot;
puts &quot; &quot;

# Locations einlesen und berechnen, ob sie innerhalb des definierten Radius der einzelnen Referenzpunkte liegen

location_line_counter = 0
reference_to_check = []
reference_result_string = &quot;&quot;
reference_match_counter = 0
reference_shortest_distance = 0
reference_nearest_to_location = &quot;&quot;

FasterCSV.foreach(locations_csv, :quote_char =&gt; &#39;&quot;&#39;, :col_sep =&gt;&#39;;&#39;, :row_sep =&gt;:auto) do |row|
  unless location_line_counter == 0 then
    location_id = &quot;#{row[0]}&quot;
    location_lat = &quot;#{row[1]}&quot;
    location_long = &quot;#{row[2]}&quot;
    loctaion_name = &quot;#{row[3]}&quot;


    puts &quot; &quot;
    puts &quot;===============================================================================================&quot;
    puts &quot;Prüfe #{location_id} (#{location_name}, Lat #{location_lat}, Long #{location_long})&quot;
    puts &quot; &quot;

    references.each do |ref|
      ref_string = &quot;#{ref}&quot;
      reference_to_check = ref_string.split(&quot;|&quot;)
      reference_to_check_id = reference_to_check[0]
      reference_to_check_lat = reference_to_check[1]
      reference_to_check_long = reference_to_check[2]
      reference_to_check_radius = reference_to_check[3]

      puts &quot;---------------------&quot;
      puts &quot;Referenzpunkt #{reference_to_check_id}: Lat #{reference_to_check_lat}, Long #{reference_to_check_long}, Radius #{reference_to_check_radius} m&quot;

      distance = (haversine(location_lat.to_f,location_long.to_f,reference_to_check_lat.to_f,reference_to_check_long.to_f)).round
      puts &quot;Distanz zwischen Location und Referenzpunkt: #{distance} m&quot;

      if distance &lt; reference_to_check_radius.to_f then
        puts &quot;#{location_id} (#{location_name}) in Radius von Referenzpunkt #{reference_to_check_id}: true&quot;
        puts &quot; &quot;
        reference_result_string += &quot;true;#{distance};&quot;
        if reference_match_counter == 0 then
          reference_shortest_distance = distance
          reference_nearest_to_location = &quot;#{reference_to_check_id}&quot;
        else
          if distance &lt; reference_shortest_distance then
            reference_shortest_distance = distance
            reference_nearest_to_location = &quot;#{reference_to_check_id}&quot;
          end 
        end
        reference_match_counter += 1
      else
        puts &quot;#{location_id} (#{location_name}) in Radius von Referenzpunkt #{reference_to_check_id}: false&quot;
        puts &quot; &quot;
        reference_result_string += &quot;false;#{distance};&quot;
      end
    end

    puts &quot;Location liegt im Radius von #{reference_match_counter} Referenzpunkten&quot;
    unless reference_match_counter == 0 then
      puts &quot;Der am nächsten liegende Referenzpunkt ist #{reference_nearest_to_location} (#{reference_shortest_distance} m)&quot;
    end

    reference_result_string = reference_result_string.chop

    open(output_csv, &#39;a&#39;) do |f|
      f.puts &quot;#{location_id};#{location_name};#{location_lat};#{location_long};#{reference_match_counter};#{reference_nearest_to_location};#{reference_shortest_distance};#{reference_result_string}&quot;
    end
    reference_result_string = &quot;&quot;
    reference_match_counter = 0
    reference_nearest_to_location = &quot;&quot;
    reference_shortest_distance = 0

  else
    reference_id_header = &quot;&quot;

    references.each do |ref|
      ref_string = &quot;#{ref}&quot;
      reference_to_check = ref_string.split(&quot;|&quot;)
      reference_to_check_id = reference_to_check[0]
      reference_id_header += &quot;ref #{reference_to_check[0]};ref #{reference_to_check[0]} distance;&quot;
    end
    reference_id_header = reference_id_header.chop

    open(output_csv, &#39;w&#39;) do |f|
      f.puts &quot;id;name;lat;long;ref matches;ref recommendation;ref shortest distance;#{reference_id_header}&quot;
    end
  end
  location_line_counter += 1
end

puts &quot; &quot;
puts &quot;===========================================&quot;
puts &quot;===========================================&quot;
puts &quot; &quot;
puts &quot;Operation abgeschlossen. #{(location_line_counter - 1)} Locations verarbeitet und Ergebnisse in #{output_csv} geschrieben.&quot;
&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/5042810827319403906/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2013/04/ruby-geo-locations-referenzpunkten.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/5042810827319403906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/5042810827319403906'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2013/04/ruby-geo-locations-referenzpunkten.html' title='RUBY: Geo-Locations Referenzpunkten zuordnen'/><author><name>Unknown</name><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-6652554936740795212.post-4932344495623836644</id><published>2013-02-10T13:20:00.002+01:00</published><updated>2013-02-10T13:21:09.434+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Bottrop"/><category scheme="http://www.blogger.com/atom/ns#" term="Fotografie"/><category scheme="http://www.blogger.com/atom/ns#" term="Natur"/><category scheme="http://www.blogger.com/atom/ns#" term="Oberhausen"/><category scheme="http://www.blogger.com/atom/ns#" term="Vonderort"/><title type='text'>Fotografie: Winterliche Impressionen aus dem Revierpark Vonderort</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Einige winterliche Bilder aus dem Revierpark Vonderort in Oberhausen&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;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/AVvXsEg3rITXv20fItmw9VqTmSnQ2G1cXGI5vjPHSCdYb7DgeF1LQmmyeyyDkBcS8_Kkr8QXUc9KZZA9pLq386SW0TPzWLuCky0PxicvMmn75LfEiyQS9tpdda6JSU2a-g-1nHZQRzQlGckk3CsR/s1600/2013-02-10+11.20.49.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3rITXv20fItmw9VqTmSnQ2G1cXGI5vjPHSCdYb7DgeF1LQmmyeyyDkBcS8_Kkr8QXUc9KZZA9pLq386SW0TPzWLuCky0PxicvMmn75LfEiyQS9tpdda6JSU2a-g-1nHZQRzQlGckk3CsR/s640/2013-02-10+11.20.49.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&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/AVvXsEi2pHbLX_YGtSnNk4P5z6-rjl8Ln6g-nLk1dX5p8KhglOTIzPLUgCBSHwvJtHWAvdEsAVZS72yC8g5GV-yJaY-fBo4FBCovvjkvWMcXLyMS5rXCY5pZr3vYZeCx6tXmUuKc2t23UV2NkhR3/s1600/2013-02-10+11.23.53.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;138&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2pHbLX_YGtSnNk4P5z6-rjl8Ln6g-nLk1dX5p8KhglOTIzPLUgCBSHwvJtHWAvdEsAVZS72yC8g5GV-yJaY-fBo4FBCovvjkvWMcXLyMS5rXCY5pZr3vYZeCx6tXmUuKc2t23UV2NkhR3/s640/2013-02-10+11.23.53.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&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/AVvXsEi7Plh7NERW4lWGpKL6d_dvoltj9bH-qARzcudBvEDyzkT3gwOT2NzEwPukrs5tFGvWdDjV_ODbfJmQKQF5WoYVjMHTsWrgx-cIUtJhroIdV_VRHeNR-ndEfryX9Mnna2k6lWH0P4XIgsTm/s1600/2013-02-10+11.25.27.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7Plh7NERW4lWGpKL6d_dvoltj9bH-qARzcudBvEDyzkT3gwOT2NzEwPukrs5tFGvWdDjV_ODbfJmQKQF5WoYVjMHTsWrgx-cIUtJhroIdV_VRHeNR-ndEfryX9Mnna2k6lWH0P4XIgsTm/s640/2013-02-10+11.25.27.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&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/AVvXsEiQWwTpDEVVTIeK8pOESAtsIH92n4NbqPGLKMQRASAsPb-yrajo7hEclG8PawHUm9mTYAMzWfSVQr3e1slUp28eqmu6Ue58ebmnf1ov6bs4BRPoYI64QP0F_BlEKnpywDdQT14yoCDJ2uq7/s1600/2013-02-10+11.33.02.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;166&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQWwTpDEVVTIeK8pOESAtsIH92n4NbqPGLKMQRASAsPb-yrajo7hEclG8PawHUm9mTYAMzWfSVQr3e1slUp28eqmu6Ue58ebmnf1ov6bs4BRPoYI64QP0F_BlEKnpywDdQT14yoCDJ2uq7/s640/2013-02-10+11.33.02.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&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/AVvXsEiyWajOo0QgTUdCs5Q-F3BwOiNnWC1za6MfFpYc9Q23KeXEQ2lgqmb9ZC0y6Ab7MFEmBKSAUvLqQghmlMDRaGOW_XB1YsSiVyWlsNHtLGEbm0jgiFEkRXlq3kFJiEs8d9Vi1q1EYpMYw4a2/s1600/2013-02-10+11.32.29.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;164&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyWajOo0QgTUdCs5Q-F3BwOiNnWC1za6MfFpYc9Q23KeXEQ2lgqmb9ZC0y6Ab7MFEmBKSAUvLqQghmlMDRaGOW_XB1YsSiVyWlsNHtLGEbm0jgiFEkRXlq3kFJiEs8d9Vi1q1EYpMYw4a2/s640/2013-02-10+11.32.29.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&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/AVvXsEhyB_KloO7yLEZMait2jexxSNMLd5fTJbuhPQHxbh3v8Pul0fHYmzYsu2Jc5U7lCwf87BuDLCJecm62qWItIE3ngKLJioM1EjvY7asSdlrC0Y-Om-l1J5r5C1FaAR7hXjyL5lEIK9-vhUmy/s1600/2013-02-10+11.39.08.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyB_KloO7yLEZMait2jexxSNMLd5fTJbuhPQHxbh3v8Pul0fHYmzYsu2Jc5U7lCwf87BuDLCJecm62qWItIE3ngKLJioM1EjvY7asSdlrC0Y-Om-l1J5r5C1FaAR7hXjyL5lEIK9-vhUmy/s640/2013-02-10+11.39.08.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/4932344495623836644/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2013/02/fotografie-winterliche-impressionen-aus.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/4932344495623836644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/4932344495623836644'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2013/02/fotografie-winterliche-impressionen-aus.html' title='Fotografie: Winterliche Impressionen aus dem Revierpark Vonderort'/><author><name>Unknown</name><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/AVvXsEg3rITXv20fItmw9VqTmSnQ2G1cXGI5vjPHSCdYb7DgeF1LQmmyeyyDkBcS8_Kkr8QXUc9KZZA9pLq386SW0TPzWLuCky0PxicvMmn75LfEiyQS9tpdda6JSU2a-g-1nHZQRzQlGckk3CsR/s72-c/2013-02-10+11.20.49.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-3322696846441312517</id><published>2013-02-07T17:07:00.000+01:00</published><updated>2013-02-07T17:09:03.833+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Architektur"/><category scheme="http://www.blogger.com/atom/ns#" term="Fotografie"/><category scheme="http://www.blogger.com/atom/ns#" term="iOS"/><title type='text'>Fotografie: Architekturpanorama mit dem iPhone 5</title><content type='html'>Heute mal ein Härtefalltest für jede Stitching-Software: Architektur. Aus meiner Sicht schlägt sich hier das iPhone 5 gar nicht mal so übel, eine ruhige Hand vorausgesetzt halten sich die perspektivischen Fehler in Grenzen&lt;br /&gt;
&lt;br /&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/AVvXsEiPfUsnRc9ECipP2yGmt79yMPKKTemUUFyq_7DSongSsPv2fMA6qZ_WDZRa5LC1wb1OD7_GSXKQOQRu5uPR14xach2VUHtn7n-imJ90HJf1kmRRaOW3fwYJReh1A0lbuBsEHlkoe50DVlFu/s1600/Foto+07.02.13+17+03+38.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;258&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPfUsnRc9ECipP2yGmt79yMPKKTemUUFyq_7DSongSsPv2fMA6qZ_WDZRa5LC1wb1OD7_GSXKQOQRu5uPR14xach2VUHtn7n-imJ90HJf1kmRRaOW3fwYJReh1A0lbuBsEHlkoe50DVlFu/s640/Foto+07.02.13+17+03+38.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/3322696846441312517/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2013/02/fotografie-architekturpanorama-mit-dem.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/3322696846441312517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/3322696846441312517'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2013/02/fotografie-architekturpanorama-mit-dem.html' title='Fotografie: Architekturpanorama mit dem iPhone 5'/><author><name>Unknown</name><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/AVvXsEiPfUsnRc9ECipP2yGmt79yMPKKTemUUFyq_7DSongSsPv2fMA6qZ_WDZRa5LC1wb1OD7_GSXKQOQRu5uPR14xach2VUHtn7n-imJ90HJf1kmRRaOW3fwYJReh1A0lbuBsEHlkoe50DVlFu/s72-c/Foto+07.02.13+17+03+38.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-7904114894207341831</id><published>2013-02-04T22:37:00.002+01:00</published><updated>2013-02-04T22:37:26.059+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Fotografie"/><category scheme="http://www.blogger.com/atom/ns#" term="iOS"/><category scheme="http://www.blogger.com/atom/ns#" term="Natur"/><title type='text'>Fotografie: Panoramaaufnahmen mit dem IPhone 5</title><content type='html'>Früher habe ich Panoramen umständlich mit der Kompaktkamera und Stitchingsoftware angefertigt, und gerade bei detailreichen Aufnahmen - z.B. im Wald - waren saubere Übergänge eher schwierig. Und heute findet sich solche Funktionalität dank ausreichender mobiler Rechenleistung und halbwegs brachbarer Kameras direkt im Handy...&lt;br /&gt;
&lt;br /&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/AVvXsEj0yt_IKbUMcTMSVOSaXBoMD22moJrR24DowgJAcTuN_81HAfoFID-SBP2BsW81q1isiV_0YybCWIqZiamry7NnOvO7xCGNIOO3wrxyXjrl0HhSDWllnUuY5RSRdo9Y7chitoCBuC8kXMOP/s1600/2013-02-03+09.10.47.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0yt_IKbUMcTMSVOSaXBoMD22moJrR24DowgJAcTuN_81HAfoFID-SBP2BsW81q1isiV_0YybCWIqZiamry7NnOvO7xCGNIOO3wrxyXjrl0HhSDWllnUuY5RSRdo9Y7chitoCBuC8kXMOP/s640/2013-02-03+09.10.47.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&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/AVvXsEiGGjCxucsS0ESIwpuReOxqOmXDGtSMIQ4ihiD-BOreDOKXim0R86frLjhOX6C7VEBwyJPfhhDcOKmSNpUb4NK9bvA2cBQfNWPdsKinA_Cs_I_ByOBVdNf3Opqab6lEyDSzYRQ2VZT8h6Qy/s1600/2013-02-03+09.31.31.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;206&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGGjCxucsS0ESIwpuReOxqOmXDGtSMIQ4ihiD-BOreDOKXim0R86frLjhOX6C7VEBwyJPfhhDcOKmSNpUb4NK9bvA2cBQfNWPdsKinA_Cs_I_ByOBVdNf3Opqab6lEyDSzYRQ2VZT8h6Qy/s640/2013-02-03+09.31.31.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&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/AVvXsEh05R_-E5C0cs_5EyTVViRImSIMvEYAMufY6qewnqoQg3Zz0rfP7h8yZBaW7pOvcB8Z5gasfm9OmeZQt8fsD8Q3zp3_TTQj2y5CB9uygZ1t47MwlPC3-Ehbb0K6lasGCrljRiuW_0h6IKVj/s1600/2013-02-03+09.17.37.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh05R_-E5C0cs_5EyTVViRImSIMvEYAMufY6qewnqoQg3Zz0rfP7h8yZBaW7pOvcB8Z5gasfm9OmeZQt8fsD8Q3zp3_TTQj2y5CB9uygZ1t47MwlPC3-Ehbb0K6lasGCrljRiuW_0h6IKVj/s640/2013-02-03+09.17.37.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/7904114894207341831/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2013/02/fotografie-panoramaaufnahmen-mit-dem.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/7904114894207341831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/7904114894207341831'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2013/02/fotografie-panoramaaufnahmen-mit-dem.html' title='Fotografie: Panoramaaufnahmen mit dem IPhone 5'/><author><name>Unknown</name><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/AVvXsEj0yt_IKbUMcTMSVOSaXBoMD22moJrR24DowgJAcTuN_81HAfoFID-SBP2BsW81q1isiV_0YybCWIqZiamry7NnOvO7xCGNIOO3wrxyXjrl0HhSDWllnUuY5RSRdo9Y7chitoCBuC8kXMOP/s72-c/2013-02-03+09.10.47.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-4238784649406390836</id><published>2013-01-13T15:27:00.000+01:00</published><updated>2013-01-13T15:27:15.948+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Fotografie"/><category scheme="http://www.blogger.com/atom/ns#" term="Natur"/><title type='text'>Fotografie: Winter-Makro</title><content type='html'>Zwei winterliche Makro-Aufnahmen aus dem Naturpark Hohe Mark&lt;br /&gt;
&lt;br /&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/AVvXsEhLijkqXEoKWgIhQvu8cgV52oCxA9JEnrZbnNTX04gHiEJQprOG4oDoWDRaQEjZhhSp4yqkGYZ2VpxE9I7XjHPtR7ueUxgUzzzqRe1kJmtwOa9rI-7jSCMWFHwC0_7ydD_7K3054b0ClkcM/s1600/2013-01-13+14.11.34.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLijkqXEoKWgIhQvu8cgV52oCxA9JEnrZbnNTX04gHiEJQprOG4oDoWDRaQEjZhhSp4yqkGYZ2VpxE9I7XjHPtR7ueUxgUzzzqRe1kJmtwOa9rI-7jSCMWFHwC0_7ydD_7K3054b0ClkcM/s640/2013-01-13+14.11.34.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&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;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/AVvXsEjm3ssaobJn_NVMLfv33h8n_YuMD0RQhNjTryKbbldNq86nFcxHy8Tem-lQ7HLqYTPEgvhX2emm8g5Js70XZFcLjo5MgdEPBLDe4Bhz2wZZCASHXRTpROgtL4oihqkR3Y8jiKTTv0G46glQ/s1600/2013-01-13+13.49.27.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm3ssaobJn_NVMLfv33h8n_YuMD0RQhNjTryKbbldNq86nFcxHy8Tem-lQ7HLqYTPEgvhX2emm8g5Js70XZFcLjo5MgdEPBLDe4Bhz2wZZCASHXRTpROgtL4oihqkR3Y8jiKTTv0G46glQ/s640/2013-01-13+13.49.27.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&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;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/4238784649406390836/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2013/01/fotografie-winter-makro.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/4238784649406390836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/4238784649406390836'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2013/01/fotografie-winter-makro.html' title='Fotografie: Winter-Makro'/><author><name>Unknown</name><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/AVvXsEhLijkqXEoKWgIhQvu8cgV52oCxA9JEnrZbnNTX04gHiEJQprOG4oDoWDRaQEjZhhSp4yqkGYZ2VpxE9I7XjHPtR7ueUxgUzzzqRe1kJmtwOa9rI-7jSCMWFHwC0_7ydD_7K3054b0ClkcM/s72-c/2013-01-13+14.11.34.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-1879629921241830330</id><published>2012-12-02T20:24:00.000+01:00</published><updated>2012-12-02T20:24:46.545+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Bottrop"/><category scheme="http://www.blogger.com/atom/ns#" term="Fotografie"/><category scheme="http://www.blogger.com/atom/ns#" term="Natur"/><title type='text'>Fotografie: Regenbogen am Heidesee</title><content type='html'>OK, ich bin bei der Aktion maximal nass und von Hagelkörnern verschrammelt worden, aber das Foto vom Regenbogen über dem Heidesee in Bottrop-Kirchhellen war es wert.&lt;br /&gt;
&lt;br /&gt;
Notiz an mich: Bestand an Regenbekleidung optimieren&lt;br /&gt;
Erkenntnis&amp;nbsp;des Tages: Mit der Lüftung im Skoda Yeti kann man sich die Haare trocken föhnen&lt;br /&gt;
&lt;br /&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/AVvXsEgBNcMddMLTYEORwe76b1BBvlrJ7ZJ1cuxKshxoz-zFtBiDld94_yELMGP9igt1iz1UpPhUQzOrABo4la_1wOE-Xr9ZUzyKhbMfvImGnzyfABVMVqbsy4QtTUma6vh8T_zo8ZsdEGzgK4vd/s1600/2012-12-02+15.22.01.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBNcMddMLTYEORwe76b1BBvlrJ7ZJ1cuxKshxoz-zFtBiDld94_yELMGP9igt1iz1UpPhUQzOrABo4la_1wOE-Xr9ZUzyKhbMfvImGnzyfABVMVqbsy4QtTUma6vh8T_zo8ZsdEGzgK4vd/s640/2012-12-02+15.22.01.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/1879629921241830330/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/12/fotografie-regenbogen-am-heidesee.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/1879629921241830330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/1879629921241830330'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/12/fotografie-regenbogen-am-heidesee.html' title='Fotografie: Regenbogen am Heidesee'/><author><name>Unknown</name><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/AVvXsEgBNcMddMLTYEORwe76b1BBvlrJ7ZJ1cuxKshxoz-zFtBiDld94_yELMGP9igt1iz1UpPhUQzOrABo4la_1wOE-Xr9ZUzyKhbMfvImGnzyfABVMVqbsy4QtTUma6vh8T_zo8ZsdEGzgK4vd/s72-c/2012-12-02+15.22.01.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Mühlenweg, 46244 Bottrop, Deutschland</georss:featurename><georss:point>51.577069537225668 6.8720340728759766</georss:point><georss:box>51.57213553722567 6.8621635728759767 51.582003537225667 6.8819045728759765</georss:box></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-4841219372572238939</id><published>2012-12-02T00:25:00.000+01:00</published><updated>2012-12-03T07:24:47.475+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Bottrop"/><category scheme="http://www.blogger.com/atom/ns#" term="Fotografie"/><category scheme="http://www.blogger.com/atom/ns#" term="Natur"/><category scheme="http://www.blogger.com/atom/ns#" term="Wandern"/><title type='text'>Fotografie: Winteranfang am Heidhof</title><content type='html'>Die Wandersaison neigt sich dem Ende zu und wenn ich so auf die &quot;Wanderuhr&quot; schaue kommen da dieses Jahr bei mir so rund 500km in den heimischen Forsten zusammen. Der Großteil entfällt dabei auf dei Hohe Mark und&amp;nbsp;insbesondere&amp;nbsp;auf mein &quot;Stammrevier&quot; rund um den Heidhof. Neben vielen erholsamen Stunden in der Natur habe ich dort dieses Jahr auch mein Kartenmaterial ergänzt und präzisiert, nicht jeder OSM-Weg ist noch gangbar, das prominenteste Beispiel dürfte der Wegfall der Schwarzbachbrücke sein...&lt;br /&gt;
&lt;br /&gt;
Quasi zum Abschluss noch ein eine Rutsche spätherbstliche/frühwinterliche Fotos&lt;br /&gt;
&lt;br /&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/AVvXsEirIEe6RruKvAML4DeI5bVpJ37OqGv48Ne9R1OzW76gnzUhfp01YMiE7YwKwYvVz-4okFqC8GOpjQp-N8HIgLObKdAIp3yZd38cCM1iCbU1BiYU9FN2AEH25lVreBNQxGXB-zZvV-OSOJZe/s1600/2012-12-01+09.14.04.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirIEe6RruKvAML4DeI5bVpJ37OqGv48Ne9R1OzW76gnzUhfp01YMiE7YwKwYvVz-4okFqC8GOpjQp-N8HIgLObKdAIp3yZd38cCM1iCbU1BiYU9FN2AEH25lVreBNQxGXB-zZvV-OSOJZe/s640/2012-12-01+09.14.04.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&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/AVvXsEgYpu847PE_vAw8W57Ar1RDETRf0avE8KymTraM5xuyBdxsov1_QnmxbP_7aZOy7SUVOLznKwhqAYSGB7zSkYEN9XzI6O8uX2M4l1YmE7EgknA-HPtKV576TKVIDMF9a_6RRo7F3IlYwASh/s1600/2012-12-01+09.18.58.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYpu847PE_vAw8W57Ar1RDETRf0avE8KymTraM5xuyBdxsov1_QnmxbP_7aZOy7SUVOLznKwhqAYSGB7zSkYEN9XzI6O8uX2M4l1YmE7EgknA-HPtKV576TKVIDMF9a_6RRo7F3IlYwASh/s640/2012-12-01+09.18.58.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
Der Heidhofsee&lt;/div&gt;
&lt;br /&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/AVvXsEjUxctsQ2IwfHVXDXRkmCN2NRwuU3PiKWCjH-x7ordTQLU6xj53nubJnKbKVKk4KASoY73e9Wm-PkLZvW4TGCCEJ87Y8f3vea2gebbzsiVe7JgiGOj0nHP0KzG0y8cDi9EFXsZ8A3jibxAt/s1600/2012-12-01+09.36.13.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUxctsQ2IwfHVXDXRkmCN2NRwuU3PiKWCjH-x7ordTQLU6xj53nubJnKbKVKk4KASoY73e9Wm-PkLZvW4TGCCEJ87Y8f3vea2gebbzsiVe7JgiGOj0nHP0KzG0y8cDi9EFXsZ8A3jibxAt/s640/2012-12-01+09.36.13.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&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/AVvXsEhIFdS4ofVdprVTL3AuAYRPRoCbOkSaK-gyI8guLnEGS3P0Jo_77i9ZwyKyOs_A0YqUfbvt3tslfX2iJ1GrVO1Yc0OXq0Vf5cBN4yMsze2fK0lojjohyphenhyphene6Kd3N6GIo3RaAFAadxv3zNJEPj/s1600/2012-12-01+09.37.38.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIFdS4ofVdprVTL3AuAYRPRoCbOkSaK-gyI8guLnEGS3P0Jo_77i9ZwyKyOs_A0YqUfbvt3tslfX2iJ1GrVO1Yc0OXq0Vf5cBN4yMsze2fK0lojjohyphenhyphene6Kd3N6GIo3RaAFAadxv3zNJEPj/s640/2012-12-01+09.37.38.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
Bedingt durch den geringen&amp;nbsp;Nährstoffgehalt&amp;nbsp;der&amp;nbsp;sandigen&amp;nbsp;Heideböden sind die Naturwaldzellen rund um den Heidhof hauptsächlich mit&amp;nbsp;niedrigeren&amp;nbsp;Eichenbäumen bewachsen. Diese lassen viel Licht für Unterholz, in diesem Fall ein schon verdorrter Teppich aus Farn.&amp;nbsp;&lt;/div&gt;
&lt;br /&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/AVvXsEjGmlVSqDCA4gQkRqqx1O1iSd9tPUjaGlF-zQWfuQJZSUqYGwTOFlBcySjNOqQSCojxGTR7zZFwFm17uov6iswPlZiKlk6DjxIKzf4ChdFYwZ7CVbqThz92KWKW2PQjCmBUWTd3Yy5fsRm8/s1600/2012-12-01+09.54.32.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGmlVSqDCA4gQkRqqx1O1iSd9tPUjaGlF-zQWfuQJZSUqYGwTOFlBcySjNOqQSCojxGTR7zZFwFm17uov6iswPlZiKlk6DjxIKzf4ChdFYwZ7CVbqThz92KWKW2PQjCmBUWTd3Yy5fsRm8/s640/2012-12-01+09.54.32.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
Wintergrün auf den&amp;nbsp;angrenzen&amp;nbsp;Äckern&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/4841219372572238939/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/12/fotografie-winteranfang-am-heidhof.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/4841219372572238939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/4841219372572238939'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/12/fotografie-winteranfang-am-heidhof.html' title='Fotografie: Winteranfang am Heidhof'/><author><name>Unknown</name><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/AVvXsEirIEe6RruKvAML4DeI5bVpJ37OqGv48Ne9R1OzW76gnzUhfp01YMiE7YwKwYvVz-4okFqC8GOpjQp-N8HIgLObKdAIp3yZd38cCM1iCbU1BiYU9FN2AEH25lVreBNQxGXB-zZvV-OSOJZe/s72-c/2012-12-01+09.14.04.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-5221603441871720332</id><published>2012-11-22T15:42:00.003+01:00</published><updated>2012-11-22T15:42:54.604+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSV"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><title type='text'>Ruby: Dateien mit Daten aus CSV umbenennen</title><content type='html'>&lt;p&gt;Heute mal wieder ein Beispiel aus der Praxis wie wir mit Hilfe eines Ruby-Scripts Dateien gemäß den Angaben in einer CSV-Datei umbenennen können.&lt;/p&gt;

&lt;p&gt;Die Ausgangslage sah folgendermaßen aus: Zum einen hatte ich einen Order (fotos2) mit Bildern, die nach dem folgenden Muster benannt waren:&lt;/p&gt;

&lt;pre&gt;
001_außen.jpg
001_innen.jpg
002_logo.jpg
&lt;/pre&gt;

&lt;p&gt;Zum anderen hatte ich eine CSV-Datei (namen.csv) mit folgendem Inhalt:&lt;/p&gt;

&lt;pre&gt;
&quot;id&quot;;&quot;name&quot;
&quot;001&quot;;&quot;Cafe Schaefer&quot;
&quot;002&quot;;&quot;Brauhaus&quot;
&lt;/pre&gt;

&lt;p&gt;Die Anforderung war es jetzt, die Dateinamen in diese Form zu ändern:&lt;/p&gt;

&lt;pre&gt;
001_Cafe Schaefer_1.jpg
001_Cafe Schaefer_2.jpg
002_Brauhaus_1.jpg
&lt;/pre&gt;

&lt;p&gt;Die Lösung ist das unten gezeigte Script. Zunächst habe ich zwei Hashes angelegt und mit Hilfe von FasterCSV befüllt. Die Keys in beiden Hashes bilden die ID aus Spalte 1 (row[0]). merchant_names_hash speichert dabei die Namen nach dem Muster &quot;002 =&gt; Brauhaus&quot;, merchant_foto_amount ist einfach ein Counter mit dem Startwert 1, also z.B. &quot;001 =&gt; 1&quot;. Anschließend werden die Dateinamen aus dem Verzeichnis in einen Array geschrieben und durch iteriert. Dabei extrahiere ich zunächst die ID aus dem Dateinamen und schaue ob diese als Key im Hash merchant_names_hash enthalten ist. Wenn ja wird mit den Informationen aus diesem Hash und dem Wert aus dem Counter ein neuer Dateiname gebildet, der Counter einen hochgezählt und abschließend die Datei umbenannt.&lt;/p&gt;



&lt;pre class = &quot;ruby&quot;&gt;
require &#39;rubygems&#39;
require &#39;fastercsv&#39;

basedir = &quot;./fotos2/&quot;
csv_file = &quot;namen.csv&quot;

merchant_names_hash = Hash.new
merchant_foto_amount = Hash.new

FasterCSV.foreach(csv_file, :quote_char =&gt; &#39;&quot;&#39;, :col_sep =&gt;&#39;;&#39;, :row_sep =&gt;:auto) do |row|
  merchant_names_hash.store (&quot;#{row[0]}&quot;,&quot;#{row[1]}&quot;)
  merchant_foto_amount.store (&quot;#{row[0]}&quot;,1)
end

files = Dir.glob(&quot;#{basedir}*&quot;)

files.each do |file|
  name = &quot;#{file}&quot;
  filebasename = File.basename(file)
  
  if filebasename =~ /^(\w*)_/ then
    foto_id = $1
  end
  
  if merchant_names_hash.has_key?(foto_id) then
    newname = &quot;#{basedir}/#{foto_id}_#{merchant_names_hash [foto_id]}_#{merchant_foto_amount [foto_id]}.jpg&quot;
    merchant_foto_amount [foto_id] += 1
    File.rename(name, newname)
  end

end
&lt;/pre&gt;


</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/5221603441871720332/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/11/ruby-dateien-mit-daten-aus-csv.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/5221603441871720332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/5221603441871720332'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/11/ruby-dateien-mit-daten-aus-csv.html' title='Ruby: Dateien mit Daten aus CSV umbenennen'/><author><name>Unknown</name><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-6652554936740795212.post-8382706382607497720</id><published>2012-11-18T20:41:00.000+01:00</published><updated>2012-11-18T20:41:47.093+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Fotografie"/><category scheme="http://www.blogger.com/atom/ns#" term="Natur"/><title type='text'>Fotografie: Herbst in der Mark</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
Hier mal ein paar herbstliche Impressionen, aufgenommen in Bottrop Grafenmühle (Naturpark Hohe Mark). Mehr Bilder gibt es in meinem &lt;a href=&quot;http://petschbot.tumblr.com/&quot; target=&quot;_blank&quot;&gt;Tumblr-Blog&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://25.media.tumblr.com/tumblr_mdp6oaA01V1rnvqvso1_1280.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;http://25.media.tumblr.com/tumblr_mdp6oaA01V1rnvqvso1_1280.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://25.media.tumblr.com/tumblr_mdp7g7Vx8p1rnvqvso1_1280.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;http://25.media.tumblr.com/tumblr_mdp7g7Vx8p1rnvqvso1_1280.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://25.media.tumblr.com/tumblr_mdp6kbNtW31rnvqvso1_1280.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;http://25.media.tumblr.com/tumblr_mdp6kbNtW31rnvqvso1_1280.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://25.media.tumblr.com/tumblr_mdp7voA18G1rnvqvso1_1280.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;480&quot; src=&quot;http://25.media.tumblr.com/tumblr_mdp7voA18G1rnvqvso1_1280.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/8382706382607497720/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/11/fotografie-herbst-in-der-mark.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/8382706382607497720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/8382706382607497720'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/11/fotografie-herbst-in-der-mark.html' title='Fotografie: Herbst in der Mark'/><author><name>Unknown</name><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><georss:featurename>Bottrop Grafenmühle</georss:featurename><georss:point>51.565599891917863 6.8654251098632812</georss:point><georss:box>51.563132391917861 6.860489609863281 51.568067391917864 6.8703606098632815</georss:box></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-5913954149296897242</id><published>2012-11-07T11:12:00.000+01:00</published><updated>2012-11-07T11:17:14.993+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="Entwicklung"/><category scheme="http://www.blogger.com/atom/ns#" term="RegEx"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><category scheme="http://www.blogger.com/atom/ns#" term="Twitter"/><title type='text'>Ruby: Der Unwetter-Bot mit Twitter- und Arduino-Anbindung</title><content type='html'>&lt;p&gt;tldr; (Abstract)&lt;/p&gt;
&lt;i&gt;&lt;p&gt;In diesem Blogpost zeige ich, wie man mit einem Ruby-Script über Regular Expressions statische Webseiten automatisiert auswertet und abhängig vom Ergebnis über das Twitter Gem eine Direct Message verschickt.&lt;/p&gt;&lt;/i&gt;
&lt;p&gt;&lt;br&gt; &lt;/p&gt;

&lt;p&gt;Die Warnseite des Deutschen Wetterdienstes hatte bei mir schon immer einen festen Platz auf der Bookmarkliste. Wer will schon mit offenen Fenstern vom Sturm überrascht werden und als Bahnfahrer ist man in der Regel eh &quot;unwettersensitiv&quot;.&lt;/p&gt;
&lt;p&gt;Das Problem: Man muss die Informationen selber einholen. Besser wäre es natürlich, wenn man die Informationen automatisch als Direct Message bekommt und am allerbesten wenn diese Infos für weitere Automatisierungen herhalten könnten. Genau das ermöglicht das folgende Script.&lt;/p&gt;
&lt;p&gt;Vorab aber zwei Warnhinweise:&lt;br/&gt;
&lt;ol&gt;
&lt;li&gt;Die Wetterdaten des DWD unterliegen dem Urheberrecht. Sich selber eine DM oder Notification auf Basis frei verfügbarer Informationen zu senden oder für weitere Heim-Automatisierung zu verwenden ist eine Sache, die via Script gewonnen Daten anderweitig zu veröffentlichen eine (wohl kaum durch die DWD-AGB gedeckte) andere Sache. Und das mit Recht, denn:&lt;/li&gt;
&lt;li&gt;Unwetterschutz ist eine ernste Sache. Das Script ist mehr ein Proof-of-Concept und sollte nicht in Bereichen eingesetzt werden, in dem Leib und Leben von einer 100% korrekten Funktion abhängt. Dazu später auch noch mehr... Wenn ihr eine &quot;ernsthafte&quot; Anwendung plant könnt ihr euch direkt an den DWD wenden, die bieten ein breites Produktportfolio. Ich habe mir deren Warnseiten hier aufgrund ihres recht statischen Charakters exemplarisch rausgepickt.&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;Nun aber zur Funktion des Scripts. Zuvor sollte man wissen, dass der Deutsche Wetterdienst seine Warninformationen individuell für Kreise auf eigenen statischen Webseiten ohne jQuery-Schischi anbietet, soweit ich das sehen kann decken sich diese Kreise mit den Landkreisen, ggf. noch einmal wetterrevelant unterteilt, und werden vom DWD mit 3-Buchstaben-Kürzeln versehen. Beispiele:&lt;/p&gt;
&lt;p&gt;Stadt Bottrop: &lt;a href=&quot;http://www.dwd.de/dyn/app/ws/html/reports/BOT_warning_de.html&quot; target=&quot;_blank&quot;&gt;http://www.dwd.de/dyn/app/ws/html/reports/BOT_warning_de.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cuxhaven Binnenland &lt;a href=&quot;http://www.dwd.de/dyn/app/ws/html/reports/CUI_warning_de.html&quot; target=&quot;_blank&quot;&gt;http://www.dwd.de/dyn/app/ws/html/reports/CUI_warning_de.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Das Script macht sich nun zunutze, dass der DWD die Warnlage auf diesen Landkreisseiten immer gleich aufbaut. Wenn keine Warnung vorliegt findet sich der entsprechende String &quot;keine Warnungen&quot; im Seitenquelltext, ansonsten werden Warnmeldungen mit &quot;Amtliche Warnmeldung&quot; begonnen.&lt;/p&gt;
&lt;p&gt;Diesen relativ statischen Aufbau macht sich das Script zunutze und steuert nicht nur seinen eigenen Prozesslauf, sondern extrahiert auch die folgenden relevanten Informationen über Regular Expressions aus dem Seitenquelltext:&lt;/p&gt;
&lt;p&gt;&lt;ul&gt;
&lt;li&gt;Name des Landkreises&lt;/li&gt;
&lt;li&gt;Titel der Warnmeldung&lt;/li&gt;
&lt;li&gt;Zeitlicher Beginn der Warnlage&lt;/li&gt;
&lt;li&gt;Zeitliches Ende der Warnlage&lt;/li&gt;
&lt;li&gt;Veröffentlichungszeitpunkt&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;p&gt;Insbesondere die Extraktion des Veröffentlichungszeitpunkt ist für den Prozesslauf von besonderer Bedeutung:&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;Zunächst prüft das Script, ob überhaupt eine Warnmeldung vorliegt.&lt;/li&gt;
&lt;li&gt;Ist das der Fall werden die o.g. Daten extrahiert und in eigene Variablen weggeschrieben&lt;/li&gt;
&lt;li&gt;Aus dem Veröffentlichungszeitpunkt wird unter der Annahme, das pro Landkreis eine individuelle Warnmeldung über den minutengenauen Veröffentlichungszeitpunkt determiniert werden kann, eine ID gebildet.&lt;/li&gt;
&lt;li&gt;Diese ID wird mit den IDs aus einer CSV-Datei verglichen. Diese enthält alle bereits durch das Script für diesen Landkreis registrierten Warnmeldungen.&lt;/li&gt;
&lt;li&gt;Ist die ID bereits in der Liste enthalten endet das Script hier.&lt;/li&gt;
&lt;li&gt;Ist die ID noch nicht enthalten wird sie zusammen mit den anderen extrahierten Informationen der CSV-Datei hinzugefügt.&lt;/li&gt;
&lt;li&gt;Als weitere Aktionen wird mir zum einen der Titel der Warnmeldung als Direct Message via Twitter zugestellt.&lt;/li&gt;
&lt;li&gt;Zudem prüft das Script optional, ob laut Titel die Warnmeldung vor einem Regenereignis warnt. Wenn ja wird über den seriellen Monitor eine &quot;1&quot; geschrieben. (Diese Information könnte wiederum von einem Arduino genutzt werden, um im Rahmen der Heimautomation ein Rückschlagventil im Keller zu schließen. Zum Thema Ruby&lt;&gt;Arduino Kommunikation siehe u.a. meinen älteren Blogpost &lt;a href=&quot;http://petschbot.blogspot.de/2012/06/arduino-das-restclient-gem-und.html&quot; target=&quot;_blank&quot; &gt;Arduino, das Restclient Gem und bidirektionale Kommunikation&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;Um korrekt zu funktionieren benötigt das Script ein paar Konfigurationsparameter, die am Anfang definiert werden:&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;Den DWD-Citycode, der über die &lt;a href=&quot;http://www.dwd.de/bvbw/appmanager/bvbw/dwdwwwDesktop?_nfpb=true&amp;_pageLabel=_dwdwww_wetter_warnungen_warnungen&amp;T31201258461164705532058gsbDocumentPath=BEA__Navigation%2FWetter__Warnungen%2FWarnungen.html%3F__nnn%3Dtrue&amp;lastPageLabel=dwdwww_start&quot; target=&quot;_blank&quot;&gt;Bundeswarnkarte&lt;/a&gt; via Durchklicken ermittelt werden kann.&lt;/li&gt;
&lt;li&gt;Den Dateinamen der CSV-Datei zum loggen der Warnmeldungen&lt;/li&gt;
&lt;li&gt;Den Intervall für die erneute Prüfung der Warnseite in Sekunden.&lt;/li&gt;
&lt;li&gt;Die API-Keys für die Twitter-API, näheres siehe dazu auf der Seite des &lt;a href=&quot;http://sferik.github.com/twitter/&quot; target=&quot;_blank&quot;&gt;Twitter-Gems&lt;/a&gt; und auf dem Developerportal von Twitter&lt;/li&gt;
&lt;li&gt;Konfigurationsparameter für das Schreiben auf dem seriellen Port.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;Soweit so gut hat das Script doch einen kleinen Schönheitsfehler. Es wertet immer nur die die erste Warnmeldung auf der Warnseite auf. Der DWD fügt die neueste Warnmeldung immer oben auf der Seite hinzu, wenn eine alte Warnmeldung noch Bestand hat rutscht diese weiter herunter. Insofern ist die Einstellung für den Aktualisierungsintervall mit Bedacht zu wählen, auf der einen Seite wollen wir die DWD-Seite nicht fluten, auf der anderen Seite keine Warnmeldung verpassen. Eine Einstellung von 5 Minuten (300 Sekunden) sollte dabei einen guten Mittelweg darstellen. Die technisch saubere Lösung würde daraus bestehen alle Warnmeldungen auf der Seite wie oben beschrieben zu parsen und nicht nur die erste Meldung. Aber zum einen würde das über das Proof-of-concept-Ziel &quot;Abhängig von einer Meldung auf einer Webseite führen wie eine Aktion aus&quot; hinausgehen und zum anderen wäre es bedeutet einfacher, dafür den eMail-Newsletter des DWD zu analysieren. Wie das geht werden wir uns in einem späteren Beitrag zu Gemüte führen, sobald ich mich mit den entsprechenden email-Ruby-Gems beschäftigt habe ;-) &lt;/p&gt;

&lt;p&gt;Zuletzt noch ein Dank an den Deutscher Wetterdienst für seine Arbeit. Besucht mal deren Webseite, für Wetter-Nerds ist das eine wahre Fundgrube :-) &lt;/p&gt;
 

&lt;pre class=&quot;ruby&quot;&gt;
require &amp;#x27;rubygems&amp;#x27;
require &amp;#x27;rest-client&amp;#x27;
require &amp;#x27;fastercsv&amp;#x27;
require &amp;#x27;twitter&amp;#x27;
require &amp;#x27;serialport&amp;#x27;

### Konfiguration ###

# DWD Citycode  
city = &amp;quot;BOT&amp;quot;

# Logging CSV
csvfilename = &amp;quot;logging.csv&amp;quot;

# Sleep-Intervall in Sekunden
intervall = 300

# Twitter
Twitter.configure do |config|
  config.consumer_key = &amp;#x27;&amp;#x27;
  config.consumer_secret = &amp;#x27;&amp;#x27;
  config.oauth_token = &amp;#x27;&amp;#x27;
  config.oauth_token_secret = &amp;#x27;&amp;#x27;
end

# Arduino Serial Monitor
serial_support = false

if serial_support == true then
  serial_port = &amp;quot;/dev/tty.usbmodem411&amp;quot;
  serial_baud_rate = 9600
  serial_data_bits = 8
  serial_stop_bits = 1
  serial_parity = SerialPort::NONE
  # init serial port
  sp = SerialPort.new(serial_port, serial_baud_rate, serial_data_bits, serial_stop_bits, serial_parity)
end

#########################################


loop do
 begin

    response = RestClient.get &amp;quot;http://www.dwd.de/dyn/app/ws/html/reports/#{city}_warning_de.html&amp;quot;
  
    if response =~ /keine Warnungen/ then
      puts &amp;quot;DWD: Keine Warnung in #{city}&amp;quot;
    
    elsif response =~ /Amtliche WARNUNG/ then
      if response =~ /(Amtliche WARNUNG vor [\D]+)(&amp;lt;\/.*&amp;gt;)$/ then
        message = $1.gsub(/\n/,&amp;quot; &amp;quot;).gsub(/(&amp;lt;.*&amp;gt;)/,&amp;quot;&amp;quot;).gsub(&amp;quot;  &amp;quot;,&amp;quot; &amp;quot;).strip
      end

      # Startdatum ($3) und Uhrzeit ($5)
      if response =~ /(g&amp;uuml;ltig von: )(\w*,\s)(\d*\.\d*\.\d*)(.)(\d\d:\d\d)/ then
        startdate = $3
        starttime = $5
      end
    
      # Enddatum ($3) und Uhrzeit ($5)
      if response =~ /(bis: )(\w*,\s)(\d*\.\d*\.\d*)(.)(\d\d:\d\d)/ then
        enddate = $3
        endtime = $5   
      end
    
      # Ausgabedatum und Zeit
      if response =~ /(am: )(\w*,\s)(\d*\.\d*\.\d*)(.)(\d\d:\d\d)/ then
        announcedate = $3
        announcetime = $5   
      end
      
      # Name der Stadt
      if response =~ /&amp;lt;title&amp;gt;(.*)-(.*)&amp;lt;\/title&amp;gt;/ then
        cityname = $2.strip
      end
    
      # Aus Ausgabedaten notification_id generieren, Muster: ddmmyyyyhhmm
      notification_id = (announcedate+announcetime).gsub(&amp;quot;.&amp;quot;,&amp;quot;&amp;quot;).gsub(&amp;quot;:&amp;quot;,&amp;quot;&amp;quot;)
    
      linenumber = 0
      notification_id_logging = 0
      notification_id_already_logged = false
    
      # Logging-Datei parsen
      FasterCSV.foreach(csvfilename, :quote_char =&amp;gt; &amp;#x27;&amp;quot;&amp;#x27;, :col_sep =&amp;gt;&amp;#x27;;&amp;#x27;, :row_sep =&amp;gt;:auto) do |row|
        # Erste Zeile erh&amp;auml;lt nur Header
        unless linenumber == 0 then
          # notification_id_logging aus erster Zelle auslesen 
          # und mit aktueller notification_id vergleichen
          notification_id_logging = row[0].to_i
          if notification_id_logging == notification_id.to_i then
            notification_id_already_logged = true
          end
        end
        linenumber += 1
      end
    
      # Falls Warnung noch nicht im Log...
      if notification_id_already_logged == false then
        # Warnung der CSV-Datei hinzuf&amp;uuml;gen
        open(csvfilename, &amp;#x27;a&amp;#x27;) do |fileop|
          fileop.puts &amp;quot;#{notification_id};#{announcedate};#{announcetime};#{message};#{startdate};#{starttime};#{enddate};#{endtime}&amp;quot;
        end
        Twitter.direct_message_create(&amp;quot;petschbot&amp;quot;, &amp;quot;DWD-Warnung f&amp;uuml;r ##{cityname}: #{message}&amp;quot;)
        puts &amp;quot;DWD-Warnung f&amp;uuml;r ##{cityname}: #{message}&amp;quot;
        if serial_support == true then
          if message =~ /regen/i then
            sp.write &amp;quot;1&amp;quot;
          end
        end
      end
  
    else
      puts &amp;quot;Warnstatus f&amp;uuml;r #{city} nicht auslesbar&amp;quot;
    end

  rescue =&amp;gt; error
    puts &amp;quot;Error (Falscher Stadtcode?)&amp;quot;
  end

sleep(intervall)

end
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/5913954149296897242/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/11/ruby-der-unwetter-bot-mit-twitter-und.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/5913954149296897242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/5913954149296897242'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/11/ruby-der-unwetter-bot-mit-twitter-und.html' title='Ruby: Der Unwetter-Bot mit Twitter- und Arduino-Anbindung'/><author><name>Unknown</name><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-6652554936740795212.post-359249301404299444</id><published>2012-10-24T21:34:00.000+02:00</published><updated>2012-10-24T21:34:23.571+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSV"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><category scheme="http://www.blogger.com/atom/ns#" term="XML"/><title type='text'>Ruby: Daten strukturiert einlesen mit FasterCSV</title><content type='html'>&lt;p&gt;Heute mal ein kurzes Codebeispiel wie wir Daten mit Ruby strukturiert aus einer CSV-Tabelle auslesen und weiterverarbeiten können. Der unten stehende Codeausschnitt ist Teil aus einem größeren Script.&lt;/p&gt;
&lt;p&gt;Die Anforderung bestand darin, dass die Rohdaten in einem CSV-File vorliegen und für eine Serie von API-Calls in einen XML-Payload umgewandelt werden müssen, jede Zeile sollte dabei getrennt behandelt werden:&lt;/p&gt;

&lt;p&gt;Das CSV-File:&lt;br&gt;
&lt;pre&gt;
id;var1;var2
1;test1;test12
2;test2;test22
3;test3;test32
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;Hier ein Ausschnitt aus dem benötigten XML-Payload (am Beispiel des zweite Datensatzes):&lt;br&gt;
&lt;pre&gt;
&amp;lt;items&amp;gt;
    &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;
    &amp;lt;content&amp;gt;2&amp;lt;/content&amp;gt;
&amp;lt;/items&amp;gt;
&amp;lt;items&amp;gt;
    &amp;lt;code&amp;gt;var1&amp;lt;/code&amp;gt;
    &amp;lt;content&amp;gt;test2&amp;lt;/content&amp;gt;
&amp;lt;/items&amp;gt;
&amp;lt;items&amp;gt;
    &amp;lt;code&amp;gt;var2&amp;lt;/code&amp;gt;
    &amp;lt;content&amp;gt;test22&amp;lt;/content&amp;gt;
&amp;lt;/items&amp;gt;
&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Und hier mein Ruby-Codeschnipsel unter Verwendung des GEMs FasterCSV. Wie man sieht lese ich im ersten Schritt die Feldbezeichner aus der ersten Zeile des CSVs in ein Array (headerarray) und bestimme zugleich die Anzahl der Elemente über .length. Anschließend parse ich die Folgezeilen und baue die gewünschte Struktur durch Verketten eines Strings (items) auf.&lt;/p&gt;

&lt;font size =&quot;0.8&quot;&gt;
&lt;pre class=&quot;ruby&quot;&gt;
linenumber = 0
headerarray = []
header_amount = 0

FasterCSV.foreach(csv_file, :quote_char =&amp;gt; &amp;#x27;&amp;quot;&amp;#x27;, :col_sep =&amp;gt;&amp;#x27;;&amp;#x27;, :row_sep =&amp;gt;:auto) do |row|

  if linenumber == 0 then  
     # Item Codes f&amp;uuml;r Input Items aus Headerzeile einlesen
     headerarray = row
     header_amount = headerarray.length
     header_amount -= 1
  else
    # F&amp;uuml;r Folgezeilen Input Items einlesen und Items-Teil des XML-Payloads durch verketten generieren
    items = &amp;quot;&amp;quot;
    0.upto(header_amount) do |i|
      items += &amp;quot;&amp;lt;items&amp;gt;&amp;lt;code&amp;gt;#{headerarray[i]}&amp;lt;/code&amp;gt;&amp;lt;content&amp;gt;#{row[i]}&amp;lt;/content&amp;gt;&amp;lt;/items&amp;gt;&amp;quot;
    end
  end

  linenumber += 1

end
&lt;/pre&gt;
&lt;/font&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/359249301404299444/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/10/ruby-daten-strukturiert-einlesen-mit.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/359249301404299444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/359249301404299444'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/10/ruby-daten-strukturiert-einlesen-mit.html' title='Ruby: Daten strukturiert einlesen mit FasterCSV'/><author><name>Unknown</name><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-6652554936740795212.post-5372925596384729602</id><published>2012-10-05T19:53:00.001+02:00</published><updated>2012-10-06T23:51:20.125+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="CSV"/><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><title type='text'>Ruby: Verfügbarkeit von URLs checken</title><content type='html'>&lt;p&gt;Mal ebend schnell den Response-Status von einer Rutsche URLs checken? Geht einfach mit diesem kurzen Rubyscript unter Verwendung der Gems Restclient und FasterCSV. Das Script wird mit einer CSV gefüttert und erwartet in der zweiten Spalte die URL, die erste Spalte kann mit einer ID oder ähnlichem befüllt werden.&lt;/p&gt;
&lt;p&gt;Die Rückgabe kann direkt in eine CSV gepipet werden, am Ende wird ein kurzer Bericht angefügt.&lt;/p&gt;

&lt;p&gt;[UPDATE] Hier das ganze auch auf Github: 
&lt;a href=&quot;https://github.com/petschbot/onlinechecker&quot; target=&quot;_blank&quot;&gt;https://github.com/petschbot/onlinechecker&lt;/a&gt; [/UPDATE]&lt;/p&gt;

&lt;pre class = &quot;ruby&quot;&gt;
#!/usr/bin/ruby -w

# Fast URL response checker
# Author: PS
# Date: 2010/10/05

require &#39;rubygems&#39;
require &#39;rest-client&#39;
require &#39;fastercsv&#39;

# CSV File as first command line argument
# Must be look like this:
# id;url
# 01;http://www.example.com

csv_file = ARGV[0]

      
linenumber = 0
ok_counter = 0
error_counter = 0

FasterCSV.foreach(csv_file, :quote_char =&gt; &#39;&quot;&#39;, :col_sep =&gt;&#39;;&#39;, :row_sep =&gt;:auto) do |row|
  unless linenumber == 0 then
    begin
      response = RestClient.get row[1] 
      puts &quot;OK;#{row[0]};#{row[1]}&quot;
      ok_counter = ok_counter + 1
    rescue =&gt; error
        puts &quot;Error;#{row[0]};#{row[1]}&quot;
        error_counter = error_counter + 1
    end
  else
    puts &quot;status;#{row[0]};#{row[1]}&quot;
  end
  linenumber = linenumber + 1
end

puts &quot;------&quot;
puts &quot;Report&quot;
puts &quot;OK: #{ok_counter}&quot;
puts &quot;Error: #{error_counter}&quot;
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/5372925596384729602/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/10/ruby-verfugbarkeit-von-urls-checken.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/5372925596384729602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/5372925596384729602'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/10/ruby-verfugbarkeit-von-urls-checken.html' title='Ruby: Verfügbarkeit von URLs checken'/><author><name>Unknown</name><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-6652554936740795212.post-7787979812486581788</id><published>2012-09-30T11:16:00.000+02:00</published><updated>2012-09-30T11:18:29.064+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apple"/><category scheme="http://www.blogger.com/atom/ns#" term="EFI"/><category scheme="http://www.blogger.com/atom/ns#" term="Macbook Air"/><title type='text'>Standbymodus auf dem Macbook Air optimieren und Einfrieren minimieren</title><content type='html'>&lt;p&gt;Seit Tagen kämpfe ich mit dem Problem, dass mein Macbook Air beim aufwachen aus dem Standby (genauer gesagt aus dem Suspend to Disk) immer wieder einfriert. Das Problem tritt auf, seitdem ich das EFI Update auf die Boot-ROM-Version MBA31.0061.B07 vorgenommen habe. Witzigerweise sieht Apple keine Möglichkeit vor, ein &lt;b&gt;erfolgreiches&lt;/b&gt; EFI-Update wieder &lt;a href=&quot;https://discussions.apple.com/thread/3334128?start=0&amp;tstart=0&quot; target=&quot;_blank&quot;&gt;rückgängig zu machen&lt;/a&gt; und auch ein &lt;a href=&quot;http://support.apple.com/kb/ht3964?viewlocale=de_de&quot; target=&quot;_blank&quot;&gt;Reset des System Management Controllers&lt;/a&gt; brachte keine Besserung.&lt;/p&gt;

&lt;p&gt;Also gut, steigen wir mal kurz tiefer in die Materie ein. Zunächst muss man wissen, dass Apple im großen und ganzen 3 Ruhezustandsmodi (hibernatemode) unterscheidet:&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt;0 - Suspend to RAM only&lt;/li&gt;
&lt;li&gt;1 - Suspend to Disk only&lt;/li&gt;
&lt;li&gt;3 - Suspend to disk + RAM&lt;/li&gt;
&lt;/ul&gt;&lt;br/&gt;
Der Modus 3 ist dabei die Standard-Einstellung. Das Macbook Air wechselt erst in das weniger tiefe Suspend to RAM und nach einer bestimmten Zeit in den Modus Suspend to Disk (Deepsleep). Auf diese Weise kann Apple eine Standybyzeit von rund 30 Tagen versprechen, da das Air im Deepsleep kaum Energie verbraucht. Das Problem ist allerdings, dass das Aufwachen aus dem Deepsleep auf meinem Late 2010 MBA mit 4 GB RAM schon so rund 20 Sekunden dauert und zudem seit dem EFI Update in rund 25% der Fälle fehlschlägt.&lt;/p&gt;

&lt;p&gt;Eine Möglichkeit wäre es nun den hibernatemode auf Modus 0 zu setzen, was für Desktop-Macs der Standard-Modus ist. Das geht auch ohne Probleme im Terminal mit dem folgenden Befehl:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo pmset -a hibernatemode 0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Der große Nachteil ist allerdings, dass das MBA danach nie wieder in den Deepsleep wechselt und im Falle des Leerlaufens des Akkus (Bei voller Ladung nach ca. 4 - 5 Tagen im Mode 0) die Gefahr des Datenverlusts droht.&lt;/p&gt;

&lt;p&gt;Insofern ist es eigentlich interessanter anzupassen, &lt;b&gt;wann&lt;/b&gt; das MBA vom Suspend to RAM zum Suspend to Disk wechselt. Der default Wert lässt sich ebenfalls recht einfach auslesen:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pmset -g&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ergibt folgende Rückgabe&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
Active Profiles:&lt;br/&gt;
Battery Power  -1*&lt;br/&gt;
AC Power  -1&lt;br/&gt;
Currently in use:&lt;br/&gt;
 &lt;b&gt;standbydelay         4200&lt;/b&gt;&lt;br/&gt;
 standby              1&lt;br/&gt;
 halfdim              1&lt;br/&gt;
 hibernatefile        /var/vm/sleepimage&lt;br/&gt;
 darkwakes            0&lt;br/&gt;
 disksleep            10&lt;br/&gt;
 sleep                45&lt;br/&gt;
 hibernatemode        3&lt;br/&gt;
 ttyskeepawake        1&lt;br/&gt;
 displaysleep         5&lt;br/&gt;
 acwake               0&lt;br/&gt;
 lidwake              1&lt;br/&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Von besonderen Interesse ist dabei der Wert standbydelay. Er gibt in Sekunden an wann das Air vom Suspend to RAM nach Suspend to Disk wechselt und ist standardmäßig mit 70 Minuten vorbelegt. Um jetzt nicht vollkommen auf Suspend to Disk verzichten zu müssen habe ich diesen Wert nun einmal probeweise auf 36 Stunden verlängert:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo pmset -a standbydelay 129600&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In der Regel hängt das AIR bei mir eh alle 24 Stunden irgendwann mal am Ladekabel und ich hoffe damit die Deepsleep-Probleme soweit zu verringern bis Apple ein weiteres EFI-Update rausbringt.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/7787979812486581788/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/09/standbymodus-auf-dem-macbook-air.html#comment-form' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/7787979812486581788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/7787979812486581788'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/09/standbymodus-auf-dem-macbook-air.html' title='Standbymodus auf dem Macbook Air optimieren und Einfrieren minimieren'/><author><name>Unknown</name><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-6652554936740795212.post-1562876679365301665</id><published>2012-09-28T22:38:00.000+02:00</published><updated>2012-09-28T22:38:24.467+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Computer"/><category scheme="http://www.blogger.com/atom/ns#" term="Entwicklung"/><title type='text'>Freier Adobe Font Sourcecode Pro</title><content type='html'>Adobe hat einen Monospace-Font &quot;Sourcecode Pro&quot; unter OpenSource-Lizenz rausgebracht, der besonders für die Verwendung im Entwicklungsumfeld gestaltet wurde. Interessant ist auch der &lt;a href=&quot;http://blogs.adobe.com/typblography/2012/09/source-code-pro.html#more-2946&quot; target=&quot;_blank&quot;&gt;Blogpost&lt;/a&gt;, wieviel Planungsarbeit in den Font gesteckt wurde. Ich finde den Font ihn wirklich sehr leserlich und auch mit Anti-Aliasing brauchbar:&lt;br /&gt;
&lt;br /&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/AVvXsEhDzyxjOcqe580LqLB3LnFXcXgGuzmOaFTHQ7eM927-wdGnuoJ3c7iDVwkw06mkJTOIsvpGlMyZnNnKN6UZvx8yyM3kqnZC-cKw-z5IcZjxghtTr5zIpDTigiqQnTnpynDlJPt1Z5AZwhyphenhyphenc/s1600/Bildschirmfoto+2012-09-28+um+22.27.47.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDzyxjOcqe580LqLB3LnFXcXgGuzmOaFTHQ7eM927-wdGnuoJ3c7iDVwkw06mkJTOIsvpGlMyZnNnKN6UZvx8yyM3kqnZC-cKw-z5IcZjxghtTr5zIpDTigiqQnTnpynDlJPt1Z5AZwhyphenhyphenc/s320/Bildschirmfoto+2012-09-28+um+22.27.47.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Den Font selber gibt es als Paket in mehreren Variationen auf &lt;a href=&quot;http://sourceforge.net/projects/sourcecodepro.adobe/&quot; target=&quot;_blank&quot;&gt;Sourceforge&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/1562876679365301665/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/09/freier-adobe-font-sourcecode-pro.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/1562876679365301665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/1562876679365301665'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/09/freier-adobe-font-sourcecode-pro.html' title='Freier Adobe Font Sourcecode Pro'/><author><name>Unknown</name><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/AVvXsEhDzyxjOcqe580LqLB3LnFXcXgGuzmOaFTHQ7eM927-wdGnuoJ3c7iDVwkw06mkJTOIsvpGlMyZnNnKN6UZvx8yyM3kqnZC-cKw-z5IcZjxghtTr5zIpDTigiqQnTnpynDlJPt1Z5AZwhyphenhyphenc/s72-c/Bildschirmfoto+2012-09-28+um+22.27.47.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-625922514329392343</id><published>2012-08-28T21:56:00.000+02:00</published><updated>2012-08-29T09:18:20.494+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Computer"/><category scheme="http://www.blogger.com/atom/ns#" term="Internet"/><category scheme="http://www.blogger.com/atom/ns#" term="Office"/><title type='text'>Textdateien syncen</title><content type='html'>Nach einigem rumschrauben und erheblichen rumprobieren habe ich nun für mich eine gangbare Lösung gefunden, um Informationen in Form von Plaintext zwischen meinen Rechnern und meinem Handy syncen zu können. Das ist mein Setup:&lt;br /&gt;
&lt;br /&gt;
Als Eingabefrontend verwende ich auf dem Mac &lt;a href=&quot;http://brettterpstra.com/project/nvalt/&quot; target=&quot;_blank&quot;&gt;nvAlt&lt;/a&gt;. Dieser&amp;nbsp;Notational Velocity Fork verbindet eine sehr einfache Dateiablage (Alle Datensätze werden als einzelne UTF-8 TXT-Dateien abgelegt und sind direkt in der Anwendung durchsuchbar) mit Markdown- und Datensatz-Verlinkungs-Funktionalitäten.[UPDATE]&lt;update&gt; Im Gegensatz zum Original lässt sich zudem das Color Scheme und das CSS/HTML-Template für das Markdown-Preview Window anpassen sowie Klammern per Autopairing komplettieren. [/UPDATE]&amp;nbsp;&lt;/update&gt; Hier werfe ich wirklich alles rein, von Code-Schnipseln über Meeting-Notizen und ToDo-Listen bis hin zu einer DVD-Datenbank.&lt;br /&gt;
&lt;br /&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/AVvXsEg8BCHsqWfZ_uWskrMgANKiX6CXBukDqROdszi9ev3YeaCzOAEIN60LLkCCmWoiAwBxRoyJ02Y7cYJB3xjpPhOprwkJ7_ylIjfI4TX2QbdFVI2WgAsxYoAav8T_GqT7V7Usc44VZ_6f-jRQ/s1600/Bildschirmfoto+2012-08-28+um+21.41.57.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;223&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8BCHsqWfZ_uWskrMgANKiX6CXBukDqROdszi9ev3YeaCzOAEIN60LLkCCmWoiAwBxRoyJ02Y7cYJB3xjpPhOprwkJ7_ylIjfI4TX2QbdFVI2WgAsxYoAav8T_GqT7V7Usc44VZ_6f-jRQ/s320/Bildschirmfoto+2012-08-28+um+21.41.57.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Gesynct wird das über &lt;a href=&quot;http://db.tt/wxI4V1J&quot; target=&quot;_blank&quot;&gt;Dropbox&lt;/a&gt;&amp;nbsp;(Affiliate Link). Dabei ist leider eine erhebliche Einschränkung, dass auf meinen Notebooks nur eine Instanz von nvAlt gleichzeitig laufen darf. Theoretisch ließe sich das über den &lt;a href=&quot;http://simplenoteapp.com/&quot; target=&quot;_blank&quot;&gt;SimpleNote&lt;/a&gt;-Support in nvAlt umgehen, mit dem ich aber keine gute&amp;nbsp;Erfahrung&amp;nbsp;gemacht&amp;nbsp;habe: Die Performance ist mies und ich habe auch Daten verloren. Der große Vorteil...&lt;br /&gt;
&lt;br /&gt;
Auf meinem Android-Smartphone kann ich einfach die &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.dropbox.android&amp;amp;hl=de&quot; target=&quot;_blank&quot;&gt;Dropbox-App&lt;/a&gt; samt eingebauten Texteditor verwenden um auf meine Notizen zuzugreifen oder neue anzulegen.&lt;br /&gt;
&lt;br /&gt;
Für mich ebenfalls wichtig: Ich unterliege keinem Lock-In, da die Daten letztendlich immer als Plain-Text Files vorliegen und sich mit jeder beliebigen Anwendung weiterverarbeiten lassen und auch in x Jahren noch verwertbar sein werden. Unter Windows habe ich z.b. früher den Outliner &lt;a href=&quot;http://theguide.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;The Guide&lt;/a&gt; in Kombination mit Dropbox verwendet. Dort werden die Daten aber in einem anwendungsspezifischen Format abgelegt, aus dem man sie kaum wieder rausbekommt (letztendlich nur alle Notizen in einem RTF oder HTML-Dokument). Aus diesem Grund mache ich auch einen Bogen um Evernote oder Springpad, zudem halte ich diese Anwendungen auch für relativ unperformant, gerade wenn man nur Text-Informationen syncen will.&lt;br /&gt;
&lt;br /&gt;
&lt;update&gt;[UPDATE] In letzter Konsequenz ist das Frontend egal, man könnte ohne Probleme eine Windows-Maschine syncen indem man dort statt nvalt &lt;a href=&quot;http://resoph.com/ResophNotes/Welcome.html&quot; target=&quot;_blank&quot;&gt;ResophNotes&lt;/a&gt; einsetzt. Im Extremfall würden es auch vim und grep auf einer beliebigen unxoiden Kiste tun, Hauptsache es gibt einen Dropbox-Client oder man schraubt sich eine passende API-Anbindung. Statt also eine Anwendung zu wählen und zu überlegen, wie man deren Datenformat über die Cloud gesynct bekommt, verwendet man hier ein möglichst universelles Format und sucht sich solche Anwendungen, die einfach Plain-Text Files aus einem definierten Ordner parsen.&amp;nbsp;&lt;/update&gt;[/UPDATE]</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/625922514329392343/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/08/textdateien-syncen.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/625922514329392343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/625922514329392343'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/08/textdateien-syncen.html' title='Textdateien syncen'/><author><name>Unknown</name><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/AVvXsEg8BCHsqWfZ_uWskrMgANKiX6CXBukDqROdszi9ev3YeaCzOAEIN60LLkCCmWoiAwBxRoyJ02Y7cYJB3xjpPhOprwkJ7_ylIjfI4TX2QbdFVI2WgAsxYoAav8T_GqT7V7Usc44VZ_6f-jRQ/s72-c/Bildschirmfoto+2012-08-28+um+21.41.57.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-3922074006512713821</id><published>2012-08-22T21:50:00.001+02:00</published><updated>2012-08-22T21:50:54.572+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Bottrop"/><title type='text'>Hansa Zentrum </title><content type='html'>&lt;div&gt;&lt;br/&gt;&lt;img src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPBEjh6C-6j5aTiSDGc3sfv_R0Ac3PqQlTENgCTGoIY7Lz5Xox7BV8nUbDZDG4X2yRhD8u9DU7uj-pZaABypKGQk6cU5NRN4XmCwkS2QN5sMNcYbH3qUg_AL_k0bhlJZGgR2XdEwvV3yDw/&#39; /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/3922074006512713821/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/08/hansa-zentrum.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/3922074006512713821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/3922074006512713821'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/08/hansa-zentrum.html' title='Hansa Zentrum '/><author><name>Unknown</name><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/AVvXsEgPBEjh6C-6j5aTiSDGc3sfv_R0Ac3PqQlTENgCTGoIY7Lz5Xox7BV8nUbDZDG4X2yRhD8u9DU7uj-pZaABypKGQk6cU5NRN4XmCwkS2QN5sMNcYbH3qUg_AL_k0bhlJZGgR2XdEwvV3yDw/s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-5428466595315843527</id><published>2012-08-22T21:45:00.001+02:00</published><updated>2012-08-22T21:45:11.905+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Hase"/><title type='text'>Frühstück auf dem Sonnendeck </title><content type='html'>&lt;div&gt;&lt;br/&gt;&lt;img src=&#39;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh551gwOZ2sab_7p2fylFO__8DUnZqgLQqHoorWOyuDeLkJPBTo-w4zqVF-w_7k1eK5ZorZVgR7g8aBYbUhIqtZdwDXvLU08HHouZMbEQmi8G7VkWzvaQhufjOE1pInrDm5qTHXIYdLiYKD/&#39; /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/5428466595315843527/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/08/fruhstuck-auf-dem-sonnendeck.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/5428466595315843527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/5428466595315843527'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/08/fruhstuck-auf-dem-sonnendeck.html' title='Frühstück auf dem Sonnendeck '/><author><name>Unknown</name><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/AVvXsEh551gwOZ2sab_7p2fylFO__8DUnZqgLQqHoorWOyuDeLkJPBTo-w4zqVF-w_7k1eK5ZorZVgR7g8aBYbUhIqtZdwDXvLU08HHouZMbEQmi8G7VkWzvaQhufjOE1pInrDm5qTHXIYdLiYKD/s72-c" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Bottrop, Bottrop</georss:featurename><georss:point>51.529087 6.944689</georss:point></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-1286816187906487290</id><published>2012-06-23T10:48:00.000+02:00</published><updated>2012-06-24T09:30:32.438+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><title type='text'>Arduino, das Restclient Gem und bidirektionale Kommunikation</title><content type='html'>&lt;p&gt;Ausgehend von meinem gestrigen Blogpost habe ich mein Rubyscript funktional erweitert. Ein puts an sich ist witzlos, mit einem Restclient kann ich aber beliebige REST APIs eventgesteuert befüttern. Das Ruby Gem &lt;a href=&quot;http://rubygems.org/gems/rest-client&quot; target=&quot;_blank&quot;&gt;rest-client&lt;/a&gt; bringt dafür schon alles Notwendige mit. Zudem habe ich nun die Konfiguration des seriellen Devices in ein Commandline Argument verschoben und die Übergabeparameter für den Restclient in Form der URL und des Request Bodys in ein YAML-File. Der Name dieses YAML-Files wiederum wird über ein zweites Commandline Argument übergeben.&lt;br/&gt;
Somit ist es möglich, im Sinne eines Plug-Ins eine ganze Reihe von YAML-Files für eine Sammlung von API-Services vorzuhalten.&lt;/p&gt;
&lt;p&gt;Die vermutlich größte Einschränkung an dieser Stelle meines Aufbaus ist die mangelnde Implementierung einer Authentifizierungsmethode. Basic Auth lässt sich aber beim rest-client gem relativ schmerzlos in folgender Form direkt in die URL einflechten:&lt;/p&gt;
&lt;pre&gt;
http(s)://username:password@urlofservice.com
&lt;/pre&gt;
&lt;p&gt;Arduino-seitig habe ich nun den einfachen Zeit-Trigger um einen Button-Trigger erweitert. Zudem erfolgt die Kommunikation über den Serial-Port jetzt bidirektional: Wenn der REST-Client auf seinen Call einen Statuscode 200 vom Zielserver zurückerhält schreibt das Rubyscript eine &quot;1&quot; in den seriellen Port. Dies veranlasst den Arduino eine grüne LED für 5 Sekunden leuchten zu lassen. Falls es während des Calls zu einem Error kommt wird [UPDATE]  &lt;s&gt;dieser über ein resuce abgefangen und&lt;/s&gt;[/UPDATE] stattdessen eine 0 über den seriellen Port geschrieben, was Arduino-Seitig eine rote LED leuchten lässt.&lt;/p&gt;
&lt;p&gt;tl;dr:&lt;br/&gt; 
&lt;br/&gt;
This example combines a ruby script to trigger REST api calls via an event driven Arduino script. The api response triggers an event inside the Arduino script, too (bidirectional communication via the serial port).&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;[UPDATE] Die Scripte finden sich auch auf GitHub: &lt;a href=&quot;https://github.com/petschbot/arduino-restapi&quot; target=&quot;_blank&quot;&gt;https://github.com/petschbot/arduino-restapi&lt;/a&gt; [/UPDATE] &lt;/p&gt;
&lt;br/&gt;
&lt;b&gt;Ruby-Script&lt;/b&gt;&lt;br/&gt;
&lt;font size =&quot;0.5&quot;&gt;
&lt;pre class = &quot;ruby&quot;&gt;
# This script combines the serialport gem with the rest-client gem
# purpose: trigger a REST-API-Call by a serial signal generated by a Arduino
# V1.1 Update: Alternative Exception handling


require &quot;rubygems&quot;
require &quot;serialport&quot;
require &#39;rest-client&#39;
require &#39;yaml&#39;


# reading the config yaml
config_file = ARGV[0] # first command line argument, e.g. config.yml
raw_config = File.read(config_file)
app_config = YAML.load(raw_config)


# params for serial port
port_str = ARGV[1] # second command line argument, e.g. /dev/tty.usbmodem411
baud_rate = 9600
data_bits = 8
stop_bits = 1

parity = SerialPort::NONE

# init serial port
sp = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity)


# params for rest client
url = app_config[:restclient][:url]
request_body = app_config[:restclient][:request_body]

sleep 10
puts &quot;Ready!&quot;

while true do
  
  sp_string = sp.gets
  
  # If the arduino send an &quot;a&quot; via the serial port start the REST Call
  if sp_string.to_s =~ /a/ then

      response = RestClient.post(url, request_body, :content_type =&gt; &#39;application/xml&#39;, :accept =&gt; &#39;application/xml&#39;){|response, request, result| response }
      puts response

      # if the REST Call was sucessfull ACK by the server send a &quot;1&quot; to the Arduino
      if response.code == 200 then
        sp.write &quot;1&quot;
      else
        sp.write &quot;0&quot;
      end

  end
end

sp.close
&lt;/pre&gt;&lt;/font&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;b&gt;Arduino-Script&lt;/b&gt;&lt;br/&gt;
&lt;font size = &quot;0.5&quot;&gt;
&lt;pre class = &quot;cpp&quot;&gt;
 // Initalize variables

 int led_red = 12;
 int led_green = 10;
 int button = 8;
 int incoming = 0;


 void setup() {                
   // initialize the digital pins as output and input.
   pinMode(led_red, OUTPUT);
   pinMode(led_green, OUTPUT);
   pinMode(button, INPUT);

   // initialize the serial port
   Serial.begin(9600);  
 }

 // the loop routine runs over and over again forever:
 void loop() {

   // turn booth leds off
   digitalWrite(led_red, LOW);
   digitalWrite(led_green, LOW);


   // if button is pushed send an a and wait two sec
   // so the button can be raised again
   if (digitalRead(button) == HIGH) {     
     Serial.print(&quot;a&quot;);
     delay(2000);
   }

   incoming = Serial.read();

   // if an &quot;0&quot; is received turn on the red led for 5 seconds
   if (incoming == 48) {
     digitalWrite(led_red, HIGH);
     delay(5000);
   }

   // if an &quot;1&quot; is received turn on the green led for 5 seconds
   if (incoming == 49) {
     digitalWrite(led_green, HIGH);
     delay(5000);
   }


 } 
&lt;/pre&gt;
&lt;/font&gt;

&lt;p&gt;Und so sieht das ganze in der Hardware-Verdrahtung aus:&lt;/p&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4adsT0ZoX27RvbxitgV2SS6nRZL_fPQxNBgimwAtXFPlh9_vVTGg0KWL65A085kP76f_a2KoxV9lRwvIomVcBhG01ugWVVtfWNUJmjuinMb2MPDeO14j56bSQxyZuN_qzRjmlraPIf1lw/s1600/arduino_rest1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;302&quot; width=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4adsT0ZoX27RvbxitgV2SS6nRZL_fPQxNBgimwAtXFPlh9_vVTGg0KWL65A085kP76f_a2KoxV9lRwvIomVcBhG01ugWVVtfWNUJmjuinMb2MPDeO14j56bSQxyZuN_qzRjmlraPIf1lw/s320/arduino_rest1.jpg&quot; /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/1286816187906487290/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/06/arduino-das-restclient-gem-und.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/1286816187906487290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/1286816187906487290'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/06/arduino-das-restclient-gem-und.html' title='Arduino, das Restclient Gem und bidirektionale Kommunikation'/><author><name>Unknown</name><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/AVvXsEg4adsT0ZoX27RvbxitgV2SS6nRZL_fPQxNBgimwAtXFPlh9_vVTGg0KWL65A085kP76f_a2KoxV9lRwvIomVcBhG01ugWVVtfWNUJmjuinMb2MPDeO14j56bSQxyZuN_qzRjmlraPIf1lw/s72-c/arduino_rest1.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-2411543650721077391</id><published>2012-06-20T19:00:00.000+02:00</published><updated>2012-06-21T12:27:52.801+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="Ruby"/><title type='text'>Arduino und Ruby verbinden</title><content type='html'>Heute mal ein Tech-Basteleintrag. Die letzten Tage habe ich mit meinem &lt;a href=&quot;http://www.arduino.cc/&quot; target=&quot;_blank&quot;&gt;Arduino&lt;/a&gt; aus der &lt;a href=&quot;http://fritzing.org/shop/starter-kit/&quot; target=&quot;_blank&quot;&gt;Fritzing-Box&lt;/a&gt; ein wenig rumgespielt. Neben dem Nachbauen der Schaltungen aus dem Video-Tutorial fand ich es&amp;nbsp;persönlich&amp;nbsp;interessant, eine Verbindung zwischen dem Arduino und einem&amp;nbsp;lokalen&amp;nbsp;Ruby-Script herzustellen. Diese ersten Schritten sollen die Basis für die Entwicklung eines Twitter-Statusbots sein, der abhängig von digitalen/analogen Messwerten&amp;nbsp;entsprechende&amp;nbsp;Nachrichten absetzt.&lt;br /&gt;
&lt;br /&gt;
Das hier gezeigte erste Testsetup:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Simuliert von Seiten des Arduinos als Aktio das eventabhängige Absetzen eines Status via Serial.println (statt eines Messwerts ist hier einfach nur ein zeitabhängiger Trigger verbaut).&lt;/li&gt;
&lt;li&gt;Auf Seiten des Rubyscripts als Reaktio eine einfache&amp;nbsp;Quittierung über puts.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;


Arduino-Script:&lt;/h2&gt;
&lt;pre class=&quot;cpp&quot;&gt;
void setup() {                
  Serial.begin(9600);  
}

void loop() {

  Serial.println(&quot;a&quot;);
  delay(5000);
  Serial.println(&quot;b&quot;);
  delay(5000);
  
}
&lt;/pre&gt;


&lt;h2&gt;Ruby-Script&lt;/h2&gt;
&lt;pre class=&quot;ruby&quot;&gt;
#simplest ruby program to read from arduino serial, 
#using the SerialPort gem
#(http://rubygems.org/gems/serialport)

require &quot;rubygems&quot;
require &quot;serialport&quot;

#params for serial port
port_str = &quot;/dev/tty.usbmodem411&quot;  #may be different for you
baud_rate = 9600
data_bits = 8
stop_bits = 1
parity = SerialPort::NONE

sp = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity)

#just read forever
while true do
  
  sp_string = sp.gets
  puts sp_string
  if sp_string.to_s =~ /a/ then
    puts &quot;A empfangen&quot;
  elsif sp_string.to_s =~ /b/ then
    puts &quot;B empfangen&quot;
  end

end

sp.close                       #see note 1
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/2411543650721077391/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2012/06/arduino-und-ruby-verbinden.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/2411543650721077391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/2411543650721077391'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2012/06/arduino-und-ruby-verbinden.html' title='Arduino und Ruby verbinden'/><author><name>Unknown</name><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-6652554936740795212.post-2886942300718227078</id><published>2011-04-03T12:08:00.002+02:00</published><updated>2012-11-14T10:51:04.057+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ausflug"/><category scheme="http://www.blogger.com/atom/ns#" term="Bottrop"/><category scheme="http://www.blogger.com/atom/ns#" term="Wandern"/><title type='text'>Von Vonderort nach Kirchhellen: Auf dem Wanderweg X11 durch Bottrop</title><content type='html'>Nach längerer Pause will ich mich hier mal, passend zum Wanderauftakt, mit einer heimatnahen Route beschäftigen. Dem eingesessenen Bottroper dürfte die Route nicht neu sein, landläufig ist sie hier auch als &quot;Vaddatachstour&quot; in diversen Variationen bekannt. Die Route bietet sich aber gerade dem Wanderneuling als Einstieg an. Sie ist sehr gut markiert, es liegt eine gute KVR-Karte &lt;a href=&quot;http://www.amazon.de/TourTipp-Kirchheller-Heide-20-000/dp/3932165454&quot; target=&quot;_blank&quot;&gt;&quot;Tourtipp Kirchhellener Heide&lt;/a&gt; vor und faktisch muss man nur dem Wanderweg X11 folgen. Die Einsteigepunkte sind fast beliebig, der Wanderweg führt so u.a. an den Stadtgärten, Bischofssondern und Grafenmühle vorbei. Der Hauptwanderweg &lt;a href=&quot;http://www.openstreetmap.org/browse/relation/553408&quot;&gt;X11 &quot;Emscherpark&quot;&lt;/a&gt;  ist durchwegs kinderwagentauglich ausgebaut und die faktisch nicht vorhandene Steigung stellt auch den ungeübten Wanderer vor keine konditionellen Schwierigkeiten. Mein Toruvorschlag steht dabei unter dem Motto &quot;Einmal von Süd nach Nord durch Bottrop&quot; und startet deshalb bereits in Vonderort. Er folgt bis zum Heidesee dem Wanderweg X11 um erst im letzten Fünftel über den Wanderweg X19 in die Kirchhellener Innenstadt zurückzuführen. Insgesamt kommen so 20 Kilometer mit nur rund 190 zu &quot;überwindenden&quot;  Höhenmetern zusammen. Also quasi die perfekte Saison-Auftakttour.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/nJvmDR3rEAbK_pkAo3aLMw?feat=embedwebsite&quot;&gt;&lt;img height=&quot;480&quot; src=&quot;https://lh3.googleusercontent.com/_Qhe3SCbaKFM/TZDNXkeIJ_I/AAAAAAAAMMQ/vNJEXt5CqDw/s640/IMG_4567.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/GkJO5u9usctArHSCBEUq6A?feat=embedwebsite&quot;&gt;&lt;img height=&quot;480&quot; src=&quot;https://lh3.googleusercontent.com/_Qhe3SCbaKFM/TZDNaONeojI/AAAAAAAAMMU/JiX913iEcwU/s640/IMG_4569.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/TKTnoSPY-_OpW_8m-rjm_g?feat=embedwebsite&quot;&gt;&lt;img height=&quot;480&quot; src=&quot;https://lh4.googleusercontent.com/_Qhe3SCbaKFM/TZDNcoApVrI/AAAAAAAAMMY/HDR8RYI0tJ0/s640/IMG_4570.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/3LBo2e54vGY5TpSRXja5vA?feat=embedwebsite&quot;&gt;&lt;img height=&quot;480&quot; src=&quot;https://lh4.googleusercontent.com/_Qhe3SCbaKFM/TZDNjBYHp0I/AAAAAAAAMMg/URlWK7pUaNU/s400/IMG_4579.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/-z7aCDy-Ip8OlXHgETF7uQ?feat=embedwebsite&quot;&gt;&lt;img height=&quot;428&quot; src=&quot;https://lh6.googleusercontent.com/_Qhe3SCbaKFM/TZDNmdfwjEI/AAAAAAAAMMk/2vjzQV75Y70/s640/IMG_4583.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Brütende Fischreiher am Stadtteich.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/HYJ4YYxXc1Klh3SXSZMGoA?feat=embedwebsite&quot;&gt;&lt;img height=&quot;480&quot; src=&quot;https://lh3.googleusercontent.com/_Qhe3SCbaKFM/TZDNyoy4QPI/AAAAAAAAMMs/y8KlEd8VL10/s640/IMG_4589.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Buschwindröschenblüte im Kölnischen Wald.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/VJknr7ZFHdnO5StmH5xcWQ?feat=embedwebsite&quot;&gt;&lt;img height=&quot;640&quot; src=&quot;https://lh5.googleusercontent.com/_Qhe3SCbaKFM/TZDN6XH3AcI/AAAAAAAAMM0/JNfs0ss9SmM/s640/IMG_4594.JPG&quot; width=&quot;455&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Der &lt;a href=&quot;http://www.sgv-oberhausen.de/html/klompenweg.htm&quot; target=&quot;_blank&quot;&gt;Klompenweg&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/RzVNFjGRppMQn9HfRLCCjA?feat=embedwebsite&quot;&gt;&lt;img height=&quot;480&quot; src=&quot;https://lh4.googleusercontent.com/_Qhe3SCbaKFM/TZDOfWaCyJI/AAAAAAAAMNI/XaXU74g0-Sw/s640/IMG_4608.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Rustikale Kinderbespaßung an der Grafenmühle.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/ZowgRVoGlYKbKK1tEOEa0g?feat=embedwebsite&quot;&gt;&lt;img height=&quot;480&quot; src=&quot;https://lh3.googleusercontent.com/_Qhe3SCbaKFM/TZDOpZ4F2bI/AAAAAAAAMNQ/D4ZLSV1nt3Y/s640/IMG_4618.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Nördlich der Grafenmühle. Einzelwanderer erkennt man sehr gut an den schlecht gestellten Selbstauslöserfotos ;-)&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/i7cxECgd253W4GntUewfHw?feat=embedwebsite&quot;&gt;&lt;img height=&quot;480&quot; src=&quot;https://lh5.googleusercontent.com/_Qhe3SCbaKFM/TZDOwT-TM0I/AAAAAAAAMNU/rD2m4fw6LSQ/s640/IMG_4624.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://de.wikipedia.org/wiki/Bergschaden&quot; target=&quot;_blank&quot;&gt;Bergsenkung&lt;/a&gt; an der Schöttelhalde&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/xQ0HmNAa5i8qh6PmaR5wdA?feat=embedwebsite&quot;&gt;&lt;img height=&quot;480&quot; src=&quot;https://lh4.googleusercontent.com/_Qhe3SCbaKFM/TZDO0Q2yP8I/AAAAAAAAMNc/axRhVG2E6-g/s640/IMG_4627.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Die große Bergsenkung am Schwarzbach. Was hier etwas trostlos aussieht ist jetzt ein neues und reichhaltiges Auen-Ökosystem mit Enten, Fischreihern und lautstarken Amphibien&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/s8pKBkjxEIUf-i5do-IztQ?feat=embedwebsite&quot;&gt;&lt;img height=&quot;480&quot; src=&quot;https://lh4.googleusercontent.com/_Qhe3SCbaKFM/TZDO4UWq3jI/AAAAAAAAMNg/4S9BIsiEtw4/s640/IMG_4633.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Wie gesagt, Selbstauslöser.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://picasaweb.google.com/lh/photo/-uabTPLwP1BK49eoiO5tdw?feat=embedwebsite&quot;&gt;&lt;img height=&quot;480&quot; src=&quot;https://lh3.googleusercontent.com/_Qhe3SCbaKFM/TZDPJqxsGsI/AAAAAAAAMNw/V6zOrXr0Wfc/s640/IMG_4653.JPG&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Zwischen den Feldern auf dem Weg nach Kirchhellen.</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/2886942300718227078/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2011/04/von-vonderort-nach-kirchhellen-auf-dem.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/2886942300718227078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/2886942300718227078'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2011/04/von-vonderort-nach-kirchhellen-auf-dem.html' title='Von Vonderort nach Kirchhellen: Auf dem Wanderweg X11 durch Bottrop'/><author><name>Unknown</name><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://lh3.googleusercontent.com/_Qhe3SCbaKFM/TZDNXkeIJ_I/AAAAAAAAMMQ/vNJEXt5CqDw/s72-c/IMG_4567.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6652554936740795212.post-7679669869664822887</id><published>2010-06-05T16:08:00.001+02:00</published><updated>2010-06-05T16:13:23.194+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Geocaching"/><category scheme="http://www.blogger.com/atom/ns#" term="Lost Place"/><title type='text'>Geocaching GC1C7FH: Lost Place in Werl</title><content type='html'>Nach der ganzen Wanderei hier im Blog mal wieder was zum Thema Geocaching. Fronleichnam wurde von Tobibus und meiner Wenigkeit konstruktiv mit dem Lost Place Geocache in Werl genutzt. Genau gesagt handelt es sich um das ehemalige Fort Victoria der britischen Rheinarmee. Als die Tommy&#39;s 1994 abzogen haben sie praktisch nur die Möbel aufgeladen und das Tor hinter sich abgeschlossen, ansonsten aber genau nichts zurückgebaut. Das ganze geht soweit, dass in den vermodernden Vorratsschränken in den Baracken noch Ersatztoilettenpapier, Wischmop und Putzmittel stehen. &quot;Zaunkarte&quot; vorausgesetzt (wobei die rückwärtigen Tore sperrangelweit offen stehen) erschließt sich hier eine vollständige kleine Stadt inklusiv Kino, Kirche, Wohnbaracken, Garagen und Kraftwerk. Die Gebäude werden seit 16 Jahren nach und nach von der Natur zurückerobert, die Vandalismusschäden halten sich aber in Grenzen. Offensichtlich sind noch nicht einmal die sonst allgegenwärtigen Kupferdiebe auf das Gelände aufmerksam geworden.&lt;br /&gt;
&lt;br /&gt;
Der Geocache an sich ist interessant gestaltet, wenn auch teilweise vom Schwierigkeitsgrad her nicht ohne. Abseilausrüstung und Helm ist nicht zwangsweise notwendig, meiner Meinung nach aber zur Selbstsicherung nicht verkehrt. So forderte eine der Stationen den Aufstieg auf den Kraftwerksschornsteinturm oder unter eine Hallendecke.&lt;br /&gt;
&lt;br /&gt;
Insgesamt ein toller Lost Place, wem der Weg nach &lt;a href=&quot;http://de.wikipedia.org/wiki/Prypjat_(Stadt)&quot;&gt;Prypjat&lt;/a&gt; zu weit ist, wer klettersicher, ausdauernd und ohne Kinder (!) unterwegs ist sei dieser Cache auf jeden Fall ans Herz gelegt&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.geocaching.com/seek/cache_details.aspx?guid=03e899b2-aec9-4e78-8584-d700d5340445&quot;&gt;GC1C7FH auf Geocaching.com&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://picasaweb.google.de/lh/photo/XFnCIOLm7_NLyiTeUX0nQw?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh3.ggpht.com/_Qhe3SCbaKFM/TApYNjHa_tI/AAAAAAAAMBU/RX9qNvfp_iw/s400/IMG_3360.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://picasaweb.google.de/lh/photo/wMwCTCRIhlSOwpQDo-gvqw?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh6.ggpht.com/_Qhe3SCbaKFM/TApYaqhNzvI/AAAAAAAAMBs/34d4fUduq3k/s400/IMG_3387.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://picasaweb.google.de/lh/photo/mXr1jh2dcohp6Xh2WDCnhw?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh5.ggpht.com/_Qhe3SCbaKFM/TApY3KOCQ8I/AAAAAAAAMCY/09EKg8T5mhA/s400/IMG_3420.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://picasaweb.google.de/lh/photo/S6asucylEGm_k5c0hGwfLQ?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh5.ggpht.com/_Qhe3SCbaKFM/TApZQlkcBJI/AAAAAAAAMDE/m2HXbtN05T4/s400/IMG_3445.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://picasaweb.google.de/lh/photo/Ak_ChVHSZ8fTp61YEbqQQg?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh5.ggpht.com/_Qhe3SCbaKFM/TApZVD_qYoI/AAAAAAAAMDM/tPzht7AXNzs/s400/IMG_3456.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://picasaweb.google.de/lh/photo/_TBPInMNodVK-ugRlyAR7w?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh4.ggpht.com/_Qhe3SCbaKFM/TApZk8bKZMI/AAAAAAAAMD4/QiP_ZI_J_Po/s400/IMG_3473.JPG&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table style=&quot;width:194px;&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; style=&quot;height:194px;background:url(http://picasaweb.google.de/s/c/transparent_album_background.gif) no-repeat left&quot;&gt;&lt;a href=&quot;http://picasaweb.google.de/petschbot/Geocaching03062010?feat=embedwebsite&quot;&gt;&lt;img src=&quot;http://lh5.ggpht.com/_Qhe3SCbaKFM/TApYFfYGj-E/AAAAAAAAMDk/epz3JTJPrBA/s160-c/Geocaching03062010.jpg&quot; width=&quot;160&quot; height=&quot;160&quot; style=&quot;margin:1px 0 0 4px;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align:center;font-family:arial,sans-serif;font-size:11px&quot;&gt;&lt;a href=&quot;http://picasaweb.google.de/petschbot/Geocaching03062010?feat=embedwebsite&quot; style=&quot;color:#4D4D4D;font-weight:bold;text-decoration:none;&quot;&gt;Geocaching 03.06.2010&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://petschbot.blogspot.com/feeds/7679669869664822887/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://petschbot.blogspot.com/2010/06/geocaching-gc1c7fh-lost-place-in-werl.html#comment-form' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/7679669869664822887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6652554936740795212/posts/default/7679669869664822887'/><link rel='alternate' type='text/html' href='http://petschbot.blogspot.com/2010/06/geocaching-gc1c7fh-lost-place-in-werl.html' title='Geocaching GC1C7FH: Lost Place in Werl'/><author><name>Unknown</name><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="http://lh3.ggpht.com/_Qhe3SCbaKFM/TApYNjHa_tI/AAAAAAAAMBU/RX9qNvfp_iw/s72-c/IMG_3360.JPG" height="72" width="72"/><thr:total>0</thr:total></entry></feed>