<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.0.0">Jekyll</generator><link href="https://blog.robban.eu/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.robban.eu/" rel="alternate" type="text/html" /><updated>2020-12-18T15:15:12+00:00</updated><id>https://blog.robban.eu/feed.xml</id><title type="html">Robbans Blog</title><subtitle>My thoughts on code, ImageVault, micro controllers, life, machine learning and home automation.</subtitle><author><name>Robert Blomqvist</name></author><entry><title type="html">A good time to Rust - some thoughts on Rust programming</title><link href="https://blog.robban.eu/2020/12/18/a-good-time-to-rust.html" rel="alternate" type="text/html" title="A good time to Rust - some thoughts on Rust programming" /><published>2020-12-18T15:02:00+00:00</published><updated>2020-12-18T15:02:00+00:00</updated><id>https://blog.robban.eu/2020/12/18/a-good-time-to-rust</id><content type="html" xml:base="https://blog.robban.eu/2020/12/18/a-good-time-to-rust.html">&lt;p&gt;&lt;img src=&quot;https://source.unsplash.com/XMnwOArQ1ak/1730x1153&quot; alt=&quot;Post image&quot; /&gt;
&lt;span class=&quot;unsplash-embed-wrapper&quot;&gt;
    &lt;a class=&quot;unsplash-embed&quot; style=&quot;background-color:black;color:white;text-decoration:none;padding:4px 6px;font-family:-apple-system, BlinkMacSystemFont, &amp;quot;San Francisco&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Ubuntu, Roboto, Noto, &amp;quot;Segoe UI&amp;quot;, Arial, sans-serif;font-size:12px;font-weight:bold;line-height:1.2;display:inline-block;border-radius:3px&quot; href=&quot;https://unsplash.com/@introspectivedsgn?utm_medium=referral&amp;amp;utm_campaign=photographer-credit&amp;amp;utm_content=creditBadge&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Download free do whatever you want high-resolution photos from Erik Mclean&quot;&gt;&lt;span style=&quot;display:inline-block;padding:2px 3px&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; style=&quot;height:12px;width:auto;position:relative;vertical-align:middle;top:-2px;fill:white&quot; viewBox=&quot;0 0 32 32&quot;&gt;
                &lt;title&gt;unsplash-logo&lt;/title&gt;
                &lt;path d=&quot;M10 9V0h12v9H10zm12 5h10v18H0V14h10v9h12v-9z&quot;&gt;&lt;/path&gt;
            &lt;/svg&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;padding:2px 3px&quot;&gt;Erik Mclean&lt;/span&gt;&lt;/a&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;I have been using Rust as my primary go-to language for personal and hobby projects for a couple of years now, and thought I’d share some of my thoughts about this powerful and possibly underused language. With a pandemic still blowing over the planet, and perhaps a few days of holiday leave coming up, now is a really good time to try it out!&lt;/p&gt;

&lt;h2 id=&quot;its-fun-after-a-while&quot;&gt;It’s fun after a while&lt;/h2&gt;
&lt;p&gt;Qualifying as the most loved language in the Stack Overflow developer survey over the last years, a lot of people in 2020 have at least heard about Rust. Still, at least among my developer colleagues, very few adopted it or even gave it a try. I think there are a couple of reasons for this, the primary ones being that the language is advertised as a systems programming language and that it’s a bit of an uphill climb before you can really enjoy it. I also find that most developers tend to have a “sphere of comfort and productivity” around one or two languages and are hesitant to move away from that.&lt;/p&gt;

&lt;p&gt;Sure, Rust may be a systems programmming language, but I think a lot of people misinterpret this to only being able to write low level drivers and operating systems. Rust is actually a really nice general programming language that can be applied to a wide spectrum of devices, services and applications. So don’t let the systems programming tag fool you, Rust is really nice even for smaller hobby projects.&lt;/p&gt;

&lt;p&gt;Also, Rust is not the easiest language to get started with. It has some basic concepts that are surprisingly hard to adapt to, at least coming from other programming languages. My best advice here is to leave (most of) your previous programming language routines at the door when initially approaching Rust. Trying to program in Rust in the same way you program for example C# doesn’t work very well. There are similarities of course, that you will likely benefit from having previous programming experience, but approaching Rust with an open mindset to pretty much everything really helps.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://source.unsplash.com/mNGaaLeWEp0/1782x1188&quot; alt=&quot;Post image&quot; /&gt;
&lt;span class=&quot;unsplash-embed-wrapper&quot;&gt;
    &lt;a class=&quot;unsplash-embed&quot; style=&quot;background-color:black;color:white;text-decoration:none;padding:4px 6px;font-family:-apple-system, BlinkMacSystemFont, &amp;quot;San Francisco&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Ubuntu, Roboto, Noto, &amp;quot;Segoe UI&amp;quot;, Arial, sans-serif;font-size:12px;font-weight:bold;line-height:1.2;display:inline-block;border-radius:3px&quot; href=&quot;https://unsplash.com/@esdesignisms?utm_medium=referral&amp;amp;utm_campaign=photographer-credit&amp;amp;utm_content=creditBadge&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Download free do whatever you want high-resolution photos from Emma Simpson&quot;&gt;&lt;span style=&quot;display:inline-block;padding:2px 3px&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; style=&quot;height:12px;width:auto;position:relative;vertical-align:middle;top:-2px;fill:white&quot; viewBox=&quot;0 0 32 32&quot;&gt;
                &lt;title&gt;unsplash-logo&lt;/title&gt;
                &lt;path d=&quot;M10 9V0h12v9H10zm12 5h10v18H0V14h10v9h12v-9z&quot;&gt;&lt;/path&gt;
            &lt;/svg&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;padding:2px 3px&quot;&gt;Emma Simpson&lt;/span&gt;&lt;/a&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Getting started with rust is a lot like getting started with running. The first times you probably won’t enjoy it, or see any benefit of it, but if you stick around for a while you’ll hopefully begin to like it and eventually it becomes second nature.&lt;/p&gt;

&lt;p&gt;Rust has a really aggressive compiler. Compared to most other programming languages, it can take a long time for new users to even get a program to compile and run. This is of course frustrating, and I think a lot of people give up on Rust here, but think about it for a while: the compiler is actually helping you identifying issues early on, instead of having more costly issues pop up later. However frustrating this might be, it is actually a good thing.&lt;/p&gt;

&lt;p&gt;The benefit of this is that you can venture more fearlessly into traditionally complex areas like multi threading, knowing that the compiler won’t let through anything that can potentially break your program.&lt;/p&gt;

&lt;h2 id=&quot;use-it-everywhere&quot;&gt;Use it everywhere&lt;/h2&gt;
&lt;p&gt;Rust has the benefit of being applicable pretty much everywhere. The thumb rule is everywhere you can use C, you can use Rust. And as you may know, C can be used on pretty much every CPU and micro controller available. So investing time in learning Rust means that you can use the same programming language for programming your micro controllers, smart watch, cars, airplanes, game consoles, etc, etc.&lt;/p&gt;

&lt;p&gt;While the entire toolbox of Rust might not be available for all devices, and the tool chains to build and compile for some devices are not always the easiest or most ergonomic, the core Rust concepts apply everywhere - the ability to use modern, high level abstractions, package management, avoiding memory issues and race conditions, etc.&lt;/p&gt;

&lt;h2 id=&quot;its-easy-to-work-with&quot;&gt;It’s easy to work with&lt;/h2&gt;
&lt;p&gt;The documentation for Rust is really good. &lt;a href=&quot;https://doc.rust-lang.org/book/&quot; target=&quot;_blank&quot;&gt;The online Rust book&lt;/a&gt; should be the natural starting point for learning, and it covers the language really well. I also found the &lt;a href=&quot;https://www.rust-lang.org/community&quot; target=&quot;_blank&quot;&gt;Rust Discord server&lt;/a&gt; to be really helpful for quick questions.&lt;/p&gt;

&lt;p&gt;Rust has an impressive library of crates (packages). Browsing through &lt;a href=&quot;https://crates.io/&quot; target=&quot;_blank&quot;&gt;Crates.io&lt;/a&gt; for getting new project ideas is always very inspiring. Chances are your next project already has some helpful packages ready and waiting for you, allowing you to cherry pick the fun things to do and leaving the boring/tedious/hard work to existing packages.&lt;/p&gt;

&lt;p&gt;IDE and text editor support is also top of the line. You’ll find writing Rust code is really pleasant with code completion, formatting and documentation available for a wide range of editors from old school VIM to VS Code.&lt;/p&gt;

&lt;p&gt;And of course, Rust’s major selling points: you don’t have to worry about common headaches like installing runtimes, memory management, race conditions, thread safety and still get your application running with blazing fast performance.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In reality, none of the above matters if you’re not enjoing it. Despite having all these nice performance gains from using Rust, the main reason I’m still sticking to it is because it’s fun. It doesn’t need to be more complicated than that. And I’m certain more people would enjoy Rust if you manage to hold on to your life raft during the first heavy storms that most likely will blow through your head when first trying it out.&lt;/p&gt;

&lt;p&gt;Happy programming!&lt;/p&gt;

&lt;div&gt;
    &lt;span&gt;Tags:&lt;/span&gt;
    &lt;ul class=&quot;tag-list&quot;&gt;
        
        &lt;li&gt;&lt;a href=&quot;/tags/rust/&quot;&gt;rust&lt;/a&gt;&lt;/li&gt;
        
    &lt;/ul&gt;
&lt;/div&gt;</content><author><name>Robert Blomqvist</name></author><category term="rust" /><summary type="html">unsplash-logo Erik Mclean</summary></entry><entry><title type="html">Bosch Indego robotic lawn mower - tips and tricks</title><link href="https://blog.robban.eu/tips-and-tricks/2020/04/30/bosch-indego-robotic-lawn-mower-tips-and-tricks.html" rel="alternate" type="text/html" title="Bosch Indego robotic lawn mower - tips and tricks" /><published>2020-04-30T12:55:00+00:00</published><updated>2020-04-30T12:55:00+00:00</updated><id>https://blog.robban.eu/tips-and-tricks/2020/04/30/bosch-indego-robotic-lawn-mower-tips-and-tricks</id><content type="html" xml:base="https://blog.robban.eu/tips-and-tricks/2020/04/30/bosch-indego-robotic-lawn-mower-tips-and-tricks.html">&lt;p&gt;&lt;img src=&quot;https://source.unsplash.com/c-5-QE5kBYk/1600x900&quot; alt=&quot;Post image&quot; /&gt;
&lt;span class=&quot;unsplash-embed-wrapper&quot;&gt;
    &lt;a class=&quot;unsplash-embed&quot; style=&quot;background-color:black;color:white;text-decoration:none;padding:4px 6px;font-family:-apple-system, BlinkMacSystemFont, &amp;quot;San Francisco&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Ubuntu, Roboto, Noto, &amp;quot;Segoe UI&amp;quot;, Arial, sans-serif;font-size:12px;font-weight:bold;line-height:1.2;display:inline-block;border-radius:3px&quot; href=&quot;https://unsplash.com/@ptonchev?utm_medium=referral&amp;amp;utm_campaign=photographer-credit&amp;amp;utm_content=creditBadge&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Download free do whatever you want high-resolution photos from Petar Tonchev&quot;&gt;&lt;span style=&quot;display:inline-block;padding:2px 3px&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; style=&quot;height:12px;width:auto;position:relative;vertical-align:middle;top:-2px;fill:white&quot; viewBox=&quot;0 0 32 32&quot;&gt;
                &lt;title&gt;unsplash-logo&lt;/title&gt;
                &lt;path d=&quot;M10 9V0h12v9H10zm12 5h10v18H0V14h10v9h12v-9z&quot;&gt;&lt;/path&gt;
            &lt;/svg&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;padding:2px 3px&quot;&gt;Petar Tonchev&lt;/span&gt;&lt;/a&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;At the time of this post’s writing, I’ve had my Bosch Indego robotic lawn mower for seven seasons and it’s still happily taking care of my lawn. I admit it has been through more services, software updates and repairs than I expected but so far Bosch and my reseller has been very understanding and every single case has been covered by warranty and/or paid in full by Bosch. I’ve learned a thing or two about this robot over the years, both through Bosch support and my own findings, and thought I’d share some tips and tricks.&lt;/p&gt;

&lt;p&gt;Just to clarify, this post refers to the first generation robotic lawn mower (Indego 800 - 1200) and not the newer Connect series.&lt;/p&gt;

&lt;h2 id=&quot;important-note&quot;&gt;Important note&lt;/h2&gt;
&lt;p&gt;If you suspect something is wrong with your device, always contact Bosch support first. Modifying and replacing parts yourself is done at your own risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Some of the instructions in this post may void the warrany of your unit, damage it and make it less safe to operate. Even if something helped me, it may not help you. You have been warned, use at your own risk.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;table-of-contents&quot;&gt;Table of contents&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#overview&quot;&gt;Overview&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#perimeter-wire&quot;&gt;Perimeter wire&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#housing&quot;&gt;Housing&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#lift-sensors&quot;&gt;Lift sensors&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#docking-station&quot;&gt;Docking station&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;The first generation Bosch Indego has a couple of years behind it. As such, it may be a bit bigger and louder than current generation units. But as I see it, it still has one big advantage - something called Logicut. This robot learns the boundaries of your lawn and keeps an internal map of it. Once learned, the robot knows exactly where it has and has not been and will resume at the exact spot it left after charging the battery. Logicut also makes the robot work in straight, parallell lines (like traditional mowing) instead of randomly bouncing around. This means it’s much easier to plan ahead and move back garden toys, grills, etc, when the robot is finished with an area - because it won’t return to the same spot twice in the same run (except maybe for a pass through).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.ytimg.com/vi/dKZxIaErLUU/maxresdefault.jpg&quot; alt=&quot;Logicut&quot; /&gt;
&lt;em&gt;Logicut (left), random cutting (right).&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;wheel-tracks&quot;&gt;Wheel tracks&lt;/h3&gt;
&lt;p&gt;The Indego will most likely leave at least some wheel tracks on your lawn. Especially during the learning phase (the two first complete runs of the lawn) it re-uses the same paths extensively as it navigates on top of the perimeter wire. Unfortunately there is no variation or offset from the wire, so the Indego will use the exact same tracks every time. (This could have been easily fixed by introducing a small offset/randomness in how it positions with regards to the perimeter wire position, varying for every run.) Some other factors contributing to visible wheel tracks are the weight of the Indego and the fact that the driving wheels are not ribbed enough. Obviously the running time and schedule is a big factor as well.&lt;/p&gt;

&lt;p&gt;After the learning phase the Indego will start to navigate more without help of the perimeter wire, ideally only using it for a short distance before the docking station or when edge cutting is scheduled. The wheel tracks typically won’t appear the first season and you can of course slightly adjust the perimeter wire between seasons to prevent it as much as possible. But it also depends a lot on your lawn. If you have a very dense and strong lawn, chances are wheel tracks won’t be visible. I have some areas of my lawn with very visible wheel tracks (where the grass is thin or no grass at all) and other places, where the Indego has not used the perimeter wire as much and also having denser grass, where it’s barely visible.&lt;/p&gt;

&lt;picture&gt;
&lt;source type=&quot;image/webp&quot; srcset=&quot;/assets/images/visible_wheel_tracks.webp&quot; /&gt;
&lt;source type=&quot;image/jpg&quot; srcset=&quot;/assets/images/visible_wheel_tracks.jpg&quot; /&gt;
&lt;img src=&quot;/assets/images/visible_wheel_tracks.jpg&quot; alt=&quot;Visible wheel tracks&quot; /&gt;
&lt;/picture&gt;
&lt;p&gt;&lt;em&gt;Visible wheel tracks will appear where the grass is too weak or missing.&lt;/em&gt;&lt;/p&gt;
&lt;picture&gt;
&lt;source type=&quot;image/webp&quot; srcset=&quot;/assets/images/not_so_visible_wheel_tracks.webp&quot; /&gt;
&lt;source type=&quot;image/jpg&quot; srcset=&quot;/assets/images/not_so_visible_wheel_tracks.jpg&quot; /&gt;
&lt;img src=&quot;/assets/images/not_so_visible_wheel_tracks.jpg&quot; alt=&quot;Not so visible wheel tracks&quot; /&gt;
&lt;/picture&gt;
&lt;p&gt;&lt;em&gt;Less distinct wheel tracks due to denser grass.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;cutting-height&quot;&gt;Cutting height&lt;/h3&gt;
&lt;p&gt;I set my cutting height quite high, seven out of ten. The most common mistake for new robotic lawn mower owners is setting this too low, causing the grass to dry out easily and turn yellow. The lawn will still look groomed with a higher setting, since the Indego will make sure the grass is evenly cut. I suggest starting somewhat higher and lower it gradually until you’re happy; the cutting height is of course very dependant on the climate, grass type, etc.&lt;/p&gt;

&lt;h3 id=&quot;trimming-edges&quot;&gt;Trimming edges&lt;/h3&gt;
&lt;p&gt;The Indego will not cut all the way out to the lawn edge. Smart positioning of the perimeter wire and the use of stone slabs around edges can minimize this, but you will still need to trim some areas manually.&lt;/p&gt;

&lt;picture&gt;
&lt;source type=&quot;image/webp&quot; srcset=&quot;/assets/images/trim_edge.webp&quot; /&gt;
&lt;source type=&quot;image/jpg&quot; srcset=&quot;/assets/images/trim_edge.jpg&quot; /&gt;
&lt;img src=&quot;/assets/images/trim_edge.jpg&quot; alt=&quot;Indego does not cut all the way to the edge&quot; /&gt;
&lt;/picture&gt;
&lt;p&gt;&lt;em&gt;Manual trimming around trees is still needed.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;perimeter-wire&quot;&gt;Perimeter wire&lt;/h2&gt;

&lt;h3 id=&quot;lawn-size-and-wire-length&quot;&gt;Lawn size and wire length&lt;/h3&gt;
&lt;p&gt;I have the Indego 1000 model which is rated for lawns up to 1000 m&lt;sup&gt;2&lt;/sup&gt;. My yard is actually 1600 m&lt;sup&gt;2&lt;/sup&gt;, although not all of it is grass. Once fully learned, the Indego covers this area in about ten hours.&lt;/p&gt;

&lt;p&gt;At this time I think I put down around 5-600 meters perimeter wire in total. This is more than the manual suggest but it does not cause any problems.&lt;/p&gt;

&lt;h3 id=&quot;pegging-or-digging&quot;&gt;Pegging or digging?&lt;/h3&gt;
&lt;p&gt;The perimeter wire can be buried fairly deep without losing the signal (I have it down 5-6 cm at places, below stone slabs). For the first season I would recommend to keep the wire on top of the lawn, pegged down with the included pegs. After observing the robot for a few weeks you will most likely notice some problematic areas or places where you want to adjust the wire closer to a tree/bush etc. Keeping it on top of the lawn until all such adjustments have been made saves a lot of time.&lt;/p&gt;

&lt;p&gt;Once you’re happy with the wire positioning, you can go ahead and dig it down if you want to. It’s a lot of work (especially for a big lawn) but it will prevent you from accidently ripping up the wire when raking leaves.&lt;/p&gt;

&lt;picture&gt;
&lt;source type=&quot;image/webp&quot; srcset=&quot;/assets/images/lawn_edger.webp&quot; /&gt;
&lt;source type=&quot;image/jpg&quot; srcset=&quot;/assets/images/lawn_edger.jpg&quot; /&gt;
&lt;img src=&quot;/assets/images/lawn_edger.jpg&quot; alt=&quot;Lawn edger for easier digging down perimeter wire&quot; /&gt;
&lt;/picture&gt;
&lt;p&gt;&lt;em&gt;The first seasons I crawled on my knees and manually dug down the wire with a garden trowel, now I use a lawn edger.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;re-map-after-modifications&quot;&gt;Re-map after modifications!&lt;/h3&gt;
&lt;p&gt;The Indego is really sensitive when it comes to adjusting the perimeter wire. Always reset and re-map when making changes. With a long perimeter wire it can get confused with adjustments as small as a couple of centimeters. Keep in mind a reset means the unit will need to spend some time to re-learn your lawn, so it’s best to note down and bundle multiple wire changes together in one go.&lt;/p&gt;

&lt;h3 id=&quot;cable-tracker&quot;&gt;Cable tracker&lt;/h3&gt;
&lt;p&gt;A cable tracker is a really helpful tool for finding problems with the perimeter wire and connectors. Always use good quality cable, like the one included with the Indego, to keep the cable functional over many years. Still, tree roots, ground going from frozen to thawed, driving heavy vehicles on the lawn, etc, can all cause the wire to move or break. A wire testing tool will help in finding the exact location of the cut - just connect it to the start of the cable (at the docking station) and walk along the wire with the hand held part to find where the signal goes weak.&lt;/p&gt;

&lt;picture&gt;
&lt;source type=&quot;image/webp&quot; srcset=&quot;/assets/images/cable_tracker.webp&quot; /&gt;
&lt;source type=&quot;image/jpg&quot; srcset=&quot;/assets/images/cable_tracker.jpg&quot; /&gt;
&lt;img src=&quot;/assets/images/cable_tracker.jpg&quot; alt=&quot;Cable tracker for perimeter wire&quot; /&gt;
&lt;/picture&gt;
&lt;p&gt;&lt;em&gt;A cable tracker is helpful for finding weak connections or cuts in the perimeter wire.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;housing&quot;&gt;Housing&lt;/h2&gt;
&lt;p&gt;While the Indego is marketed as rain proof, I would highly recommend to build some sort of housing or roof for it. After one of the bigger services my device went through I got a note back explaining water had reached some of the internal electronics and damaged multiple components, and a recommendation from the service team to keep it protected from rain. This was a very rainy summer. Remember, this device (at least mine) stays outdoors from spring to autumn, 24/7. You can of course move it in and out according to the weather if you want to, but building a simple house or roof is not that hard. Just remember to keep the entrance and inner side of the docking station clear so the Indego can dock and move out freely.&lt;/p&gt;

&lt;picture&gt;
&lt;source type=&quot;image/webp&quot; srcset=&quot;/assets/images/lawn_mower_house.webp&quot; /&gt;
&lt;source type=&quot;image/jpg&quot; srcset=&quot;/assets/images/lawn_mower_house.jpg&quot; /&gt;
&lt;img src=&quot;/assets/images/lawn_mower_house.jpg&quot; alt=&quot;Robotic lawn mower house&quot; /&gt;
&lt;/picture&gt;
&lt;p&gt;&lt;em&gt;A simple transparent plastic roof protects from rain.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;lift-sensors&quot;&gt;Lift sensors&lt;/h2&gt;
&lt;p&gt;The Indego is equipped with several sensors for identifying lifts and tilts, causing the device to stop. Two of these lift sensors are located at the front wheel bases. The sensors are essentially &lt;a href=&quot;https://en.wikipedia.org/wiki/Reed_switch&quot; target=&quot;_blank&quot;&gt;reed switches&lt;/a&gt;, causing the sensor to trigger when the wheel axles are fully extended (indicating the front of the unit has been lifted up from the ground). There is a cylindrical magnet in a plastic enclosure at the base of each wheel axle that moves away from the sensor, causing the reed switch to open (or close) and trigger the sensor.&lt;/p&gt;

&lt;h3 id=&quot;adjusting-sensitivity-of-the-lift-sensors&quot;&gt;Adjusting sensitivity of the lift sensors&lt;/h3&gt;
&lt;p&gt;Although not recommended, it is possible to adjust the sensitivity of the lift sensors to be more forgiving. This can be done by removing the wheel lift and slightly lifting the cylindrical magnet in the plastic enclosure upwards, so it gets closer to the reed switch, and fastening it so it won’t fall down to the original position. This adjustment must be done in very small steps and some trial and error is involved - &lt;strong&gt;lifting the magnet too far up disables the lift sensors completely, which is very dangerous as the cutting disc will keep rotating even when you lift it. Most of the time adjusting the magnets should not be needed.&lt;/strong&gt; Only experiment with this on a spare set of front wheels and only as a last resort, e.g. if your lawn is too uneven and falsely triggers the lift sensors.&lt;/p&gt;

&lt;picture&gt;
&lt;source type=&quot;image/webp&quot; srcset=&quot;/assets/images/magnet_position.webp&quot; /&gt;
&lt;source type=&quot;image/jpg&quot; srcset=&quot;/assets/images/magnet_position.jpg&quot; /&gt;
&lt;img src=&quot;/assets/images/magnet_position.jpg&quot; alt=&quot;Repositioning the magnet to decrease lift sensor sensitivity&quot; /&gt;
&lt;/picture&gt;
&lt;p&gt;&lt;em&gt;Raising the front wheel magnet from the original position (white circle) will reduce the lift sensor sensitivity (Note: use with caution)&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;docking-station&quot;&gt;Docking station&lt;/h2&gt;
&lt;p&gt;If there is one place where you should be particularly careful to get the perimeter wire straight and well within the bounds of the instruction manual, it’s at the docking station. If the wire does not go straight through the docking station, and keeps straight about two meters before and after, the Indego will probably have problems docking. Make sure to get this right from the start, double check the first couple of days that the Indego docks 100% of the time. It should never miss the charging pins. If it’s still missing the charging pins with a straight cable before, through and after, it could be a problem with “front wheel wobble”.&lt;/p&gt;

&lt;h3 id=&quot;front-wheel-wobble&quot;&gt;Front wheel wobble&lt;/h3&gt;
&lt;p&gt;The holes for the front wheel axles are, in my opinion, a quite poor design from Bosch. This area is subject to constant friction and tear. As the Indego moves around, the front wheel axles will move up and down pretty much constantly. The plastic in this area is very thin and the metal axles will eventually grind up the holes, causing a lot of sideways wobbling of the front wheels. This doesn’t cause any real issues out on the lawn, but eventually the wobbling will be large enough to cause the Indego to miss the charging pins when docking.&lt;/p&gt;

&lt;picture&gt;
&lt;source type=&quot;image/webp&quot; srcset=&quot;/assets/images/worn_wheels.webp&quot; /&gt;
&lt;source type=&quot;image/jpg&quot; srcset=&quot;/assets/images/worn_wheels.jpg&quot; /&gt;
&lt;img src=&quot;/assets/images/worn_wheels.jpg&quot; alt=&quot;Worn out wheel axle hole&quot; /&gt;
&lt;/picture&gt;
&lt;p&gt;&lt;em&gt;Worn out wheel axle hole (left) compared to a new one (right).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The wheel lift is a widely available spare part, very easy to remove (a single screw) and a new set of two complete front wheel lifts is about 50€ so it’s not that big deal to replace after a few seasons, but I think the plastic could have been strengthened a bit in this area. (This can of course be fixed with some creative DIY) Keeping the axles clean from sand and dirt and applying some dry lube from time to time will extend the lifetime, but next to the cutting blades this is probably what will wear out the fastest. &lt;strong&gt;Do NOT spray the wheel axles with liquid lube like WD-40.&lt;/strong&gt; It will find its way down through the wheel housing into the reed switches below (lift sensors) and destroy them, rendering the device unusable (been there, done that). Only use a small amount of dry lube and let it dry completely before re-attaching the wheel lift.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In my case, having a robotic lawn mower has been really good for the lawn. Before, my lawn was spotty, irregular and had lots of weed and moss. Keeping the lawn constantly cut and regularely “feeding” it with small amounts of grass cuttings (both an effect of the robotic lawn mower) has definitely made my lawn denser and reduces blank spots. It has a lot less weeds in it but unfortunately it does not remove all of the moss, it’s not as much as before but it’s still there. As an added bonus, I can use the time previously spent on mowing the lawn with my kids or some other hobby. Or just grab a beer, sit down and watch the robot drive around.&lt;/p&gt;

&lt;p&gt;I hope you found this post useful. Reach out on Twitter for leaving feedback and comments!&lt;/p&gt;

&lt;div&gt;
    &lt;span&gt;Tags:&lt;/span&gt;
    &lt;ul class=&quot;tag-list&quot;&gt;
        
        &lt;li&gt;&lt;a href=&quot;/tags/robots/&quot;&gt;robots&lt;/a&gt;&lt;/li&gt;
        
        &lt;li&gt;&lt;a href=&quot;/tags/gardening/&quot;&gt;gardening&lt;/a&gt;&lt;/li&gt;
        
        &lt;li&gt;&lt;a href=&quot;/tags/DIY/&quot;&gt;DIY&lt;/a&gt;&lt;/li&gt;
        
    &lt;/ul&gt;
&lt;/div&gt;</content><author><name>Robert Blomqvist</name></author><category term="robots" /><category term="gardening" /><category term="DIY" /><summary type="html">unsplash-logo Petar Tonchev</summary></entry><entry><title type="html">Machine Learning and TensorFlow in Rust: Part two - Installing TensorFlow and dependencies</title><link href="https://blog.robban.eu/guides/2019/10/02/machine-learning-and-tensorflow-in-rust-part-two.html" rel="alternate" type="text/html" title="Machine Learning and TensorFlow in Rust: Part two - Installing TensorFlow and dependencies" /><published>2019-10-02T19:05:00+00:00</published><updated>2019-10-02T19:05:00+00:00</updated><id>https://blog.robban.eu/guides/2019/10/02/machine-learning-and-tensorflow-in-rust-part-two</id><content type="html" xml:base="https://blog.robban.eu/guides/2019/10/02/machine-learning-and-tensorflow-in-rust-part-two.html">&lt;p&gt;&lt;img src=&quot;https://source.unsplash.com/5h9f1dqE8XM/1600x1067&quot; alt=&quot;Post image&quot; /&gt;
&lt;span class=&quot;unsplash-embed-wrapper&quot;&gt;
    &lt;a class=&quot;unsplash-embed&quot; style=&quot;background-color:black;color:white;text-decoration:none;padding:4px 6px;font-family:-apple-system, BlinkMacSystemFont, &amp;quot;San Francisco&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Ubuntu, Roboto, Noto, &amp;quot;Segoe UI&amp;quot;, Arial, sans-serif;font-size:12px;font-weight:bold;line-height:1.2;display:inline-block;border-radius:3px&quot; href=&quot;https://unsplash.com/@bamin?utm_medium=referral&amp;amp;utm_campaign=photographer-credit&amp;amp;utm_content=creditBadge&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Download free do whatever you want high-resolution photos from Pierre Bamin&quot;&gt;&lt;span style=&quot;display:inline-block;padding:2px 3px&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; style=&quot;height:12px;width:auto;position:relative;vertical-align:middle;top:-2px;fill:white&quot; viewBox=&quot;0 0 32 32&quot;&gt;
                &lt;title&gt;unsplash-logo&lt;/title&gt;
                &lt;path d=&quot;M10 9V0h12v9H10zm12 5h10v18H0V14h10v9h12v-9z&quot;&gt;&lt;/path&gt;
            &lt;/svg&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;padding:2px 3px&quot;&gt;Pierre Bamin&lt;/span&gt;&lt;/a&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/guides/2019/09/20/machine-learning-and-tensorflow-in-rust-part-one.html&quot;&gt;The first part of this guide&lt;/a&gt; was a short overview on TensorFlow and machine learning with Rust in general. In this part we will install the TensorFlow libraries and set up the dependencies needed to run TensorFlow from Rust with GPU support.&lt;/p&gt;

&lt;p&gt;In order to run a Rust program with TensorFlow GPU support we need the following:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Rust&lt;/li&gt;
  &lt;li&gt;TensorFlow language bindings for C&lt;/li&gt;
  &lt;li&gt;Latest GPU drivers&lt;/li&gt;
  &lt;li&gt;CUDA® Toolkit&lt;/li&gt;
  &lt;li&gt;cuDNN SDK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I will assume you have Rust installed, if not &lt;a href=&quot;https://www.rust-lang.org/tools/install&quot; target=&quot;_blank&quot;&gt;follow the official instructions for installing.&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;tensorflow-language-bindings-for-c&quot;&gt;TensorFlow language bindings for C&lt;/h2&gt;
&lt;p&gt;Visit &lt;a href=&quot;https://www.tensorflow.org/install/lang_c&quot; target=&quot;_blank&quot;&gt;TensorFlow’s download page for the C bindings&lt;/a&gt; and download the Windows version with GPU support. Extract the files to any location suitable for libraries, for this guide I’m going to use:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;%USERPROFILE%\lib
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Inside the newly extracted TensorFlow folder we find another &lt;code class=&quot;highlighter-rouge&quot;&gt;lib&lt;/code&gt; folder. This should be added to the Windows Path variable. You can modify the PATH variable through Windows Control Panel -&amp;gt; Edit the system environment variables.&lt;/p&gt;

&lt;p&gt;So in my case I got version 1.14.0 of the language bindings, so the following path is appended to the existing PATH environment variable:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;%USERPROFILE%\lib\libtensorflow-gpu-windows-x86_64-1.14.0\lib
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;latest-gpu-drivers&quot;&gt;Latest GPU drivers&lt;/h2&gt;
&lt;p&gt;Make sure you have a &lt;a href=&quot;https://developer.nvidia.com/cuda-gpus&quot; target=&quot;_blank&quot;&gt;CUDA® enabled GPU&lt;/a&gt; and visit &lt;a href=&quot;https://www.nvidia.com/Download/index.aspx&quot; target=&quot;_blank&quot;&gt;the download page for NVIDIA® drivers&lt;/a&gt; and download and install the latest available drivers for your GPU.&lt;/p&gt;

&lt;h2 id=&quot;cuda-toolkit&quot;&gt;CUDA® Toolkit&lt;/h2&gt;
&lt;p&gt;Visit the &lt;a href=&quot;&quot;&gt;CUDA® Toolkit download page&lt;/a&gt; and download a version of your choice. For this guide we will use CUDA® 10.0.&lt;/p&gt;

&lt;p&gt;After installing we need to add the &lt;code class=&quot;highlighter-rouge&quot;&gt;bin&lt;/code&gt; folder of the toolkit to the windows Path variable, just like we did for the TensorFlow library above.&lt;/p&gt;

&lt;p&gt;In my case, the following path is appended to the PATH variable:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;cudnn-sdk&quot;&gt;cuDNN SDK&lt;/h2&gt;
&lt;p&gt;In order to download cuDNN SDK, you need to be registered in the NVIDIA® Developer Program. &lt;a href=&quot;https://developer.nvidia.com/cudnn&quot; target=&quot;_blank&quot;&gt;Visit the cuDNN site&lt;/a&gt;, follow the download links for cuDNN to get to the registration process. Once registered and logged in, you get access to download cuDNN SDK. &lt;em&gt;Make sure to download a version matching the CUDA® Toolkit version you installed above.&lt;/em&gt; Extract the files to a suitable location, again we’re going to use &lt;code class=&quot;highlighter-rouge&quot;&gt;%USERPROFILE%\lib&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;highlighter-rouge&quot;&gt;bin&lt;/code&gt; folder of the extraced cuDNN files should be added to Windows PATH variable as well. The folder to add in our case would be:&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;%USERPROFILE%\lib\cuda\bin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And we are done setting up TensorFlow C bindings and dependencies! In the next and final part of the series we will configure and run a sample Rust program that builds and trains a small Neural Network.&lt;/p&gt;

&lt;div&gt;
    &lt;span&gt;Tags:&lt;/span&gt;
    &lt;ul class=&quot;tag-list&quot;&gt;
        
        &lt;li&gt;&lt;a href=&quot;/tags/machine learning/&quot;&gt;machine learning&lt;/a&gt;&lt;/li&gt;
        
        &lt;li&gt;&lt;a href=&quot;/tags/rust/&quot;&gt;rust&lt;/a&gt;&lt;/li&gt;
        
        &lt;li&gt;&lt;a href=&quot;/tags/tensorflow/&quot;&gt;tensorflow&lt;/a&gt;&lt;/li&gt;
        
    &lt;/ul&gt;
&lt;/div&gt;</content><author><name>Robert Blomqvist</name></author><category term="machine learning" /><category term="rust" /><category term="tensorflow" /><summary type="html">unsplash-logo Pierre Bamin</summary></entry><entry><title type="html">Machine Learning and TensorFlow in Rust: Part one - Overview</title><link href="https://blog.robban.eu/guides/2019/09/20/machine-learning-and-tensorflow-in-rust-part-one.html" rel="alternate" type="text/html" title="Machine Learning and TensorFlow in Rust: Part one - Overview" /><published>2019-09-20T07:53:00+00:00</published><updated>2019-09-20T07:53:00+00:00</updated><id>https://blog.robban.eu/guides/2019/09/20/machine-learning-and-tensorflow-in-rust-part-one</id><content type="html" xml:base="https://blog.robban.eu/guides/2019/09/20/machine-learning-and-tensorflow-in-rust-part-one.html">&lt;p&gt;&lt;img src=&quot;https://source.unsplash.com/jIBMSMs4_kA/1600x1151&quot; alt=&quot;Post image&quot; /&gt;
&lt;span class=&quot;unsplash-embed-wrapper&quot;&gt;
    &lt;a class=&quot;unsplash-embed&quot; style=&quot;background-color:black;color:white;text-decoration:none;padding:4px 6px;font-family:-apple-system, BlinkMacSystemFont, &amp;quot;San Francisco&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Ubuntu, Roboto, Noto, &amp;quot;Segoe UI&amp;quot;, Arial, sans-serif;font-size:12px;font-weight:bold;line-height:1.2;display:inline-block;border-radius:3px&quot; href=&quot;https://unsplash.com/@franckinjapan?utm_medium=referral&amp;amp;utm_campaign=photographer-credit&amp;amp;utm_content=creditBadge&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; title=&quot;Download free do whatever you want high-resolution photos from Franck V.&quot;&gt;&lt;span style=&quot;display:inline-block;padding:2px 3px&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; style=&quot;height:12px;width:auto;position:relative;vertical-align:middle;top:-2px;fill:white&quot; viewBox=&quot;0 0 32 32&quot;&gt;
                &lt;title&gt;unsplash-logo&lt;/title&gt;
                &lt;path d=&quot;M10 9V0h12v9H10zm12 5h10v18H0V14h10v9h12v-9z&quot;&gt;&lt;/path&gt;
            &lt;/svg&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;padding:2px 3px&quot;&gt;Franck V.&lt;/span&gt;&lt;/a&gt;
&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Machine learning is really fun to play with. Instead of a more traditional approach of working out a &lt;em&gt;solution&lt;/em&gt; for a problem, and getting an answer from it, we input &lt;em&gt;answers&lt;/em&gt; to a problem, and get a solution from it. Weird? Yeah, a bit. But it’s a refreshing think-outside-the-box experience, especially if you’ve been stuck with traditional programming for a long time.&lt;/p&gt;

&lt;p&gt;Programming machine learning can be approached in a variety of ways. The most common, at the time of writing this post, is to use Python and usually some kind of Notebook software/service to code, arrange and visualize problems easily. This approach is fine and offers a hard to beat overview, allows for easy sharing and collaboration and uses a known and easy programming language. I strongly advise to try this approach first, especially if you’re completely new to machine learning. Then again, maybe you are focusing on a new language to learn, and really want to stick to that language. Perhaps you hate Python for some reason or you just want a different approach. Resources for machine learning without Python is harder to find but it’s definitely doable.&lt;/p&gt;

&lt;h3 id=&quot;what-to-expect-from-this-series&quot;&gt;What to expect from this series&lt;/h3&gt;
&lt;p&gt;The goal for this guide is to be a a cover-it-all for getting started with machine learning with TensorFlow in Rust. As such it will be quite broad and not necessarily go into deep details about everything. (&lt;em&gt;Deep details for machine learning seems easy to find anyway - simple overviews and tutorials are not&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;This guide will assume a Windows 10 PC with Rust 2018 edition on a machine with a &lt;a href=&quot;https://developer.nvidia.com/cuda-gpus&quot; target=&quot;_blank&quot;&gt;CUDA supported Nvidia graphics card (GPU)&lt;/a&gt; for TensorFlow. If your setup differs you should still be able to get something out of this series but I will not describe other setups. If you’re running Linux, Docker, etc, all of these are typically more documented compared to a Windows/GPU setup. For example, running Tensorflow on Windows 10 without GPU support is really easy, simply spin up a Docker image that includes everything you need. On Linux you can get Tensorflow Docker images with included GPU support as well. You can read more about Tensorflow’s Docker support and instructions &lt;a href=&quot;https://www.tensorflow.org/install/docker&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;traditional-machine-learning-in-rust&quot;&gt;Traditional machine learning in Rust&lt;/h3&gt;
&lt;p&gt;I will not spend a lot of time selling in the Rust programming language, the &lt;a href=&quot;https://www.rust-lang.org/&quot; target=&quot;_blank&quot;&gt;official Rust website&lt;/a&gt; does a much better job. My opinion is that Rust is a really nice language to use for machine learning for a couple of reasons; It is very fast, you can easily compile your app for multiple devices/architectures and it is powered by Cargo and &lt;a href=&quot;https://crates.io&quot; target=&quot;_blank&quot;&gt;Crates.io&lt;/a&gt; for easily using existing code and packages. I also find it a very hygienic and fun language to use.&lt;/p&gt;

&lt;p&gt;A few crates exist for machine learning in Rust, many without the need to download additional dependencies. &lt;a href=&quot;https://github.com/AtheMathmo/rusty-machine&quot; target=&quot;_blank&quot;&gt;Rusty machine&lt;/a&gt; is a good example. Unfortunately not very actively maintained but it still covers a lot of machine learning algorithms and is easy to use. In fact, I find this crate sufficient for most of my hobby projects and it would probably work fine for small/medium “real” projects as well. I highly recommend you start prototyping with a crate like this since the time from setup to writing code is minimal compared to setting up a GPU supported Tensorflow environment.&lt;/p&gt;

&lt;h3 id=&quot;tensorflow-machine-learning-in-rust&quot;&gt;TensorFlow machine learning in Rust&lt;/h3&gt;
&lt;p&gt;If you’re exploring or planning to train very large datasets, maybe for a really deep neural network, you will eventually grow tired of watching progress bars slowly ticking along as your CPUs cough and sweat to get your model ready. This is where you want GPU support. Again, this (usually) occurs a bit further down the machine learning road and it’s probably not where you want to start your journey.&lt;/p&gt;

&lt;p&gt;Setting up TensorFlow with GPU support on a Windows 10 PC is, sadly, not the easiest thing to do. TensorFlow agree and recommend to use their Docker images instead of a manual setup. Unfortunately, at this time, Windows users cannot get the GPU to pass through to Docker. So if we want to have GPU support, we have to set it up ourselves.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/guides/2019/10/02/machine-learning-and-tensorflow-in-rust-part-two.html&quot;&gt;The next part of the series&lt;/a&gt; will go through setting up TensorFlow and all the Nvidia and CUDA dependencies on Windows 10.&lt;/p&gt;

&lt;div&gt;
    &lt;span&gt;Tags:&lt;/span&gt;
    &lt;ul class=&quot;tag-list&quot;&gt;
        
        &lt;li&gt;&lt;a href=&quot;/tags/machine learning/&quot;&gt;machine learning&lt;/a&gt;&lt;/li&gt;
        
        &lt;li&gt;&lt;a href=&quot;/tags/rust/&quot;&gt;rust&lt;/a&gt;&lt;/li&gt;
        
        &lt;li&gt;&lt;a href=&quot;/tags/tensorflow/&quot;&gt;tensorflow&lt;/a&gt;&lt;/li&gt;
        
    &lt;/ul&gt;
&lt;/div&gt;</content><author><name>Robert Blomqvist</name></author><category term="machine learning" /><category term="rust" /><category term="tensorflow" /><summary type="html">unsplash-logo Franck V.</summary></entry></feed>