Congratulations!

[Valid Atom 1.0] This is a valid Atom 1.0 feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://blog.codinginparadise.org/feeds/posts/default

  1. <?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-3191291</id><updated>2024-04-21T04:19:40.332-07:00</updated><category term="open source"/><category term="coworking"/><category term="gears"/><category term="open web"/><category term="ajax"/><category term="svg"/><category term="announcement"/><category term="dojo"/><category term="dojo offline toolkit"/><category term="hypertext geekery"/><category term="release"/><category term="svgweb"/><category term="dojo storage"/><category term="google"/><category term="html5"/><category term="purple include"/><category term="video"/><category term="flash"/><category term="rsh"/><category term="engelbart"/><category term="google gears"/><category term="hyperscope"/><category term="hypertext"/><category term="politics"/><category term="projects"/><category term="space"/><category term="yahoo"/><category term="aboutme"/><category term="dhtml"/><category term="flash storage provider"/><category term="inkling"/><category term="internet explorer"/><category term="invention"/><category term="javascript"/><category term="news"/><category term="personal"/><category term="presentation"/><category term="press"/><category term="pubtools"/><category term="really simple history"/><category term="scoble"/><category term="3d"/><category term="PR"/><category term="VR"/><category term="XR"/><category term="aria"/><category term="astrobiology"/><category term="berkeley"/><category term="bio"/><category term="bootstrapping"/><category term="brainstorming"/><category term="brian dillard"/><category term="brilliant"/><category term="browser"/><category term="collaboration"/><category term="community"/><category term="computer history"/><category term="css3"/><category term="daniel perez"/><category term="definition"/><category term="developer advocate"/><category term="documentary"/><category term="dot"/><category term="dwr"/><category term="email missive"/><category term="exoplanets"/><category term="film"/><category term="fixtheweb"/><category term="freedom"/><category term="funny"/><category term="future studies"/><category term="gdata"/><category term="google app engine"/><category term="gwt"/><category term="hackery"/><category term="health care"/><category term="history"/><category term="insurance"/><category term="ios"/><category term="ipad"/><category term="java"/><category term="jibjab"/><category term="jobs"/><category term="joe walker"/><category term="jquery"/><category term="keynote"/><category term="launch"/><category term="libraries"/><category term="mcallen"/><category term="microformats"/><category term="notes"/><category term="ohloh"/><category term="openid"/><category term="owdn"/><category term="personal research agenda"/><category term="photos"/><category term="research"/><category term="resume"/><category term="review"/><category term="sabbatical"/><category term="sandbox suites"/><category term="semantic web"/><category term="sitepen"/><category term="ski"/><category term="social architectures"/><category term="spec"/><category term="sprint"/><category term="storage"/><category term="study"/><category term="tahoe"/><category term="texas"/><category term="travel"/><category term="tv sucks"/><category term="videoblog"/><category term="web extension mechanisms"/><category term="weblog"/><category term="xml"/><title type='text'>Coding In Paradise</title><subtitle type='html'>Brad Neuberg&#39;s Weblog</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default?start-index=26&amp;max-results=25'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03274020042497854648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://codinginparadise.org/images/brad.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>733</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3191291.post-3673122085762395616</id><published>2022-10-25T11:11:00.007-07:00</published><updated>2022-10-25T11:36:48.502-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="collaboration"/><category scheme="http://www.blogger.com/atom/ns#" term="coworking"/><category scheme="http://www.blogger.com/atom/ns#" term="social architectures"/><category scheme="http://www.blogger.com/atom/ns#" term="VR"/><category scheme="http://www.blogger.com/atom/ns#" term="XR"/><title type='text'>Turning Strangers Into Friends In Virtual Reality: VR Social Architectures</title><content type='html'>&lt;p&gt;This blog post is a call to action for the social VR platforms to get creative around helping strangers connect and become friends, what I call the social architecture.&lt;/p&gt;&lt;p&gt;With the rise of remote work and other changes in society, we&#39;ve been in a multi-decade crises in&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Third_place&quot; target=&quot;_blank&quot;&gt;third places&lt;/a&gt;&amp;nbsp;that can help people to connect (this is one of the reasons&amp;nbsp;&lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/start_of_coworking.html&quot; target=&quot;_blank&quot;&gt;I invented coworking&lt;/a&gt;, for example). Advances in social VR can help give healthy outlets for people to turn strangers into friends - I think that will be a positive thing for the world if done well.&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;br/&gt;&lt;i&gt;“This blog post is a call to action for the social VR platforms to get creative around helping strangers connect and become friends, what I call the social architecture.”&lt;/i&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;text-align: right;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;a href=&quot;https://www.oculus.com/blog/horizon-worlds-spotlight-the-soapstone-comedy-club/&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1280&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhAw8Sli6CqDaLQBJweyoPgNp1ebkwiB5TI-R4hVAnGdY370xbcfrdvgTqPZeiwcloWhC5P0_-39uaZWSV7aCfRSGTm1fVu3v1Z-bjGIsCASDNkj9_haa6AfmaSY6WCt6bMkpr-yZatWT1Kd07C0l3b9BlmvDLV9hENykIPyPxxVgN6Oi_ueA&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://www.oculus.com/blog/horizon-worlds-spotlight-the-soapstone-comedy-club/&quot; target=&quot;_blank&quot;&gt;Horizon&#39;s Soap Stone Comedy Club&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;I&#39;ve been personally experimenting with social VR the last few years, through &lt;a href=&quot;https://recroom.com/&quot; target=&quot;_blank&quot;&gt;Rec Room&lt;/a&gt;, &lt;a href=&quot;https://hello.vrchat.com/&quot; target=&quot;_blank&quot;&gt;VRChat&lt;/a&gt;, and &lt;a href=&quot;https://www.oculus.com/horizon-worlds&quot; target=&quot;_blank&quot;&gt;Horizons&lt;/a&gt;. I was never into 3D shared worlds like &lt;a href=&quot;https://www.oculus.com/horizon-worlds&quot; target=&quot;_blank&quot;&gt;Second Life&lt;/a&gt; before, but there is something intriguing about how embodied VR can be while connecting with other people that is different than a flat screen in my experience.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;i style=&quot;font-size: large;&quot;&gt;“&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Advances in social VR can help give healthy outlets for people to turn strangers into friends - I think that will be a positive thing for the world if done well.&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;font-size: large;&quot;&gt;”&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I&#39;ve been playing a social VR game in Rec Room since 2017 called Laser Tag and have created community there; have been attending a VR comedy club in Horizons; and have been attending music &amp;amp; dance festivals in VRChat. I have a healthy physical social life, regularly meeting up with friends, going to real world meetups, doing very embodied activities like yoga, biking, and tap dancing, hosting real world neighborhood meetups, etc.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;text-align: right;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;a href=&quot;https://rec-room.fandom.com/wiki/Laser_Tag&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;197&quot; data-original-width=&quot;350&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEieegJ6n4-9LrBt8LGA4L7o4fNXpvnkknwSOFrgNpdJCQUOi0sxKGGPkr_WJ-3J7I8sUUsDQ4Aqp1FZpOrq0hZ-jyZRuxp1AaotjO28_81hO2q2Ib2yO37VFQ6mdfEhmLR5KnMu1W3E7eviMnHdmGrBwzNd335DSy-R3q5xlhchIjt62Kto9Q&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://rec-room.fandom.com/wiki/Laser_Tag&quot; target=&quot;_blank&quot;&gt;Rec Room&#39;s Laser Tag&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;I don&#39;t see social VR as a replacement for physical activities but rather new territory opening up for social interaction, not unlike how a good book isn&#39;t a replacement for doing activities in the real world but rather even more new experiences to layer into a rich life. A life even wider with new and different possibilities, not a replacement. I&#39;m not replacing my life with a VR headset, I&#39;m expanding it into new territories I couldn&#39;t access before.&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;i style=&quot;font-size: large;&quot;&gt;&lt;br/&gt;“I don&#39;t see social VR as a replacement for physical activities but rather new territory opening up for social interaction, not unlike how a good book isn&#39;t a replacement for doing activities in the real world but rather even more new experiences to layer into a rich life.”&lt;/i&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;However, a major issue with all these social VR platforms is that you are essentially interacting with lots of strangers, attempting to break the ice and find some common ground. This is layered on top with bad actors, named griefers, who just get in people&#39;s faces and want to create discord, usually young (mostly male) kids.&lt;/p&gt;&lt;p&gt;These are strong headwinds against social VR, and in the long run as VR becomes XR with lighter, more accessible, and cheaper headsets making XR mainstream, giant anonymous connection spaces might fade in preference to meeting up with friends &amp;amp; family in virtual and half-virtual settings (beaming your friend as a hologram onto your sofa via XR headsets to watch a movie together, for example, would be a half-virtual, or XR, setting).&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;i style=&quot;font-size: large; text-align: left;&quot;&gt;&lt;br /&gt;“&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;font-size: large;&quot;&gt;A major issue with all these social VR platforms is that you are essentially interacting with lots of strangers, attempting to break the ice and find some common ground.&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;font-size: large; text-align: left;&quot;&gt;”&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;However, I do think broad social VR still has a place, especially as a location for earlier XR enthusiasts to connect before XR headsets have broader availability. One major problem is that the social VR platforms just aren&#39;t being creative in facilitating breaking the ice with lots of strangers -- they mostly are focusing on the more tangible 3D worlds, and not on the more subtle &quot;social architecture&quot; that can enable strangers to connect and have meaningful conversations.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;i style=&quot;font-size: large; text-align: left;&quot;&gt;“&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;font-size: large;&quot;&gt;One major problem is that the social VR platforms just aren&#39;t being creative in facilitating breaking the ice with lots of strangers -- they mostly are focusing on the more tangible 3D worlds, and not on the more subtle &quot;social architecture&quot; that can enable strangers to connect and have meaningful conversations.&lt;/span&gt;&lt;/i&gt;&lt;i style=&quot;font-size: large; text-align: left;&quot;&gt;”&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Here are possible ideas for these social architectures to help break the ice between strangers. Think of it like an amazing party host in the real world&amp;nbsp;— they know that two different people have common interests and introduce them together, mentioning their common interest, or a real world meetup you attend might have name tags where you can write a short interest you have related to the meetups subject to catalyze conversation.&lt;/p&gt;&lt;p&gt;Talking to strangers is hard, we need mechanisms to break the ice. I&#39;m extroverted and quite good at talking to strangers in the real world, so some of these ideas are based on tricks I&#39;ve used to engage conversations with strangers. Here&#39;s some ideas for better VR social architectures:&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Automatch Interests&lt;/h2&gt;&lt;div&gt;I should be able to list my interests, books I&#39;m reading, movies I&#39;m watching, etc., not unlike the original Facebook interests page. Then, when I&#39;m talking to someone, it can automatch and show me above their avatar common interests we might have, prompting discussion topics. VRChat&#39;s &lt;a href=&quot;https://www.reddit.com/r/VRchat/comments/s3fvzo/no_time_two_talk_is_the_best_thing_thats_happened/&quot; target=&quot;_blank&quot;&gt;No Time Two Talk&lt;/a&gt; is an early example of this kind of automatching based on interests.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
  2.  
  3. &lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;text-align: right;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjAtw-eGsC7qVOkVMNohYn0Dn84V-bM924vSpjGkekGdDKtrhnLhKDeOwkswCFIiKBv0hnVQZuqo5cdp3BGky71w3unXCJatW2PFRME6kHfL1LYEVCD5SwzO_romC6gx6I7dSVdfLyrvivuuJw-SH9TKGslcJ7QjLMCQJSlvwyAo2JMtodvwA&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;450&quot; data-original-width=&quot;1200&quot; height=&quot;120&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjAtw-eGsC7qVOkVMNohYn0Dn84V-bM924vSpjGkekGdDKtrhnLhKDeOwkswCFIiKBv0hnVQZuqo5cdp3BGky71w3unXCJatW2PFRME6kHfL1LYEVCD5SwzO_romC6gx6I7dSVdfLyrvivuuJw-SH9TKGslcJ7QjLMCQJSlvwyAo2JMtodvwA&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;VRChat&#39;s No Time Two Talk&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
  4.  
  5. &lt;h2 style=&quot;text-align: left;&quot;&gt;Jerseys &amp;amp; Stickers&lt;/h2&gt;&lt;p style=&quot;text-align: left;&quot;&gt;In the real world my laptop is covered with stickers on my interests, generally things related to space, computers, and machine learning. In coffee shops others have seen these and prompted conversation, or I&#39;ll see whats on their laptop and strike up talking about that.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;T-shirts and hats can also play this function - &quot;Oh did you go to such and such college (based on their hat)? Do you follow that sports team (if they are wearing a jersey)? Are you associated with that organization (some random t-shirt)?&quot; etc. Basically, these give hooks to find some common ground to start a conversation. Social VR platforms should allow me to have t-shirts, caps, and stickers that I can add to my avatar that others can see to spur connection and conversation.&lt;/p&gt;
  6.  
  7. &lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;text-align: right;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiQExkNTdzJeLugkfoaxMnb3Mg06CPiJ9mxrjjoUKJ6ZRPObcWUyL_SYjuZHhcAqJvvLIY0yin244ucFysDk0f8Jq8HeSnW0Y-dL45V3vK3yACraXIcLNbwWAfzWewzp1yWUttGrb1wx_ysEc_-jW5Pj-Wif0Tfh9Hs-cYZN6I9x_Dh5Bo4pg&quot; style=&quot;clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;&quot;&gt;&lt;img data-original-height=&quot;3024&quot; data-original-width=&quot;4032&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiQExkNTdzJeLugkfoaxMnb3Mg06CPiJ9mxrjjoUKJ6ZRPObcWUyL_SYjuZHhcAqJvvLIY0yin244ucFysDk0f8Jq8HeSnW0Y-dL45V3vK3yACraXIcLNbwWAfzWewzp1yWUttGrb1wx_ysEc_-jW5Pj-Wif0Tfh9Hs-cYZN6I9x_Dh5Bo4pg=w320-h240&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;My personal laptop, with many nerd stickers&lt;br /&gt;to spur conversation&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
  8.  
  9. &lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Mood &amp;amp; &quot;Whats On Your Mind?&quot; Bubbles&lt;/h2&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Early web social platforms used to prompt people on their mood or brief thoughts, what if I could list my mood (&quot;angry&quot;, &quot;sad&quot;, &quot;happy&quot;, &quot;tired&quot;, etc.) or a short sentence (&quot;Surviving finals&quot;, etc.) that might float above my avatar as a bubble. Again, this is another prompt and hook that someone can talk about - &quot;Hey, why are you feeling sad?&quot;, &quot;What happened today that you feel happy about?&quot;, etc.).&lt;/p&gt;
  10.  
  11. &lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;text-align: right;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgY_R2WSchkLh9a9_1HkusqoTOFMG7Z_AcB75pF8FCqJ5BHdGSTiQoH4WuLGb5WohJfsAbtdKAROefQYtRK7hEGvNVKFI33kNdUfolBWPN-H9zkGDD3DygzS80g1_kBTjGg7_OWVOSy7JADSJ6Rn9Gnr9RmjHCiZ48neZ8g3S95l6A_P4Ga7g&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;507&quot; data-original-width=&quot;663&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgY_R2WSchkLh9a9_1HkusqoTOFMG7Z_AcB75pF8FCqJ5BHdGSTiQoH4WuLGb5WohJfsAbtdKAROefQYtRK7hEGvNVKFI33kNdUfolBWPN-H9zkGDD3DygzS80g1_kBTjGg7_OWVOSy7JADSJ6Rn9Gnr9RmjHCiZ48neZ8g3S95l6A_P4Ga7g&quot; width=&quot;314&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Example of early web social platforms&lt;br /&gt;&quot;What&#39;s on your mind?&quot; prompt&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
  12.  
  13. &lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Double Down on Real World Events Anchored by Real People in Social VR&lt;/h2&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Events help attract common &quot;birds of a feather&quot; together and create community. We should have real comedians present in social VR; we should have real book readings and discussions from authors; we should have scientists and interesting people giving real VR presentations, actually present as avatars, etc. Recorded events just aren&#39;t the same. Small, intimate events anchored by a real individual present as an avatar would do wonders. Imagine hosting &lt;a href=&quot;https://michaelnielsen.org/&quot; target=&quot;_blank&quot;&gt;Michael Nielsen&lt;/a&gt; talking about &lt;a href=&quot;https://quantum.country/&quot; target=&quot;_blank&quot;&gt;quantum computing&lt;/a&gt; or &lt;a href=&quot;https://scienceplusplus.org/metascience/&quot; target=&quot;_blank&quot;&gt;metascience&lt;/a&gt;, with a small intimate before and after conversation with all the people present being able to connect with him or others present. That will definitely raise the caliber of the kind of interactions people are having in social VR, not just a bunch of griefers streaming through causing havoc.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;New Metrics&lt;/h2&gt;&lt;p style=&quot;text-align: left;&quot;&gt;We need a new metric that tracks whether people are forming long running, meaningful connections on these platforms. This metric could track whether someone is making new friends, and whether they are continuing to connect with these people frequently and over the long term.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;The healthiest VRChat interactions I&#39;ve seen involve this — once you bust out of the public worlds into the private areas, you start to make friends and then connect with them more regularly.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: large;&quot;&gt;“&lt;/span&gt;&lt;span style=&quot;font-size: large; text-align: center;&quot;&gt;We need a new metric that tracks whether people are forming long running, meaningful connections on these platforms.&lt;/span&gt;&lt;span style=&quot;font-size: large;&quot;&gt;”&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;Another metric might track whether you can get past the toxic griefers and public worlds into longer run, healthier social interactions. This is a very key metric for social VR platforms to get right, as ones first experience in social VR can be with these toxic griefers and it can turn you off of social VR completely, before you find the nicer, more private communities. This is another argument for very well curated events, like Altspace VR is attempting to do, to catalyze initial more intimate interactions to form a positive impression of social VR.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Conclusion&lt;/h2&gt;&lt;p&gt;These are early days for XR in general. As headsets get lighter, have face tracking, get much more comfortable, etc. we will see much more broad adoption of this kind of socializing. However, social VR platforms really need to get their act together and be more creative on the interaction side -- a city is not just its buildings, but the subtle norms and ways that architecture helps people to connect, feel safe, or the opposite of that. Let&#39;s see a wave of creative experiments in the social architectures of VR platforms, not just endless sterile 3D buildings populated by griefers. I believe it&#39;s possible.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-size: large;&quot;&gt;“&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;i&gt;Let&#39;s see a wave of creative experiments in the social architectures of VR platforms, not just endless sterile 3D buildings populated by griefers. I believe it&#39;s possible.&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;font-size: large;&quot;&gt;”&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/3673122085762395616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=3673122085762395616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/3673122085762395616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/3673122085762395616'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2022/10/turning-strangers-into-friends-in.html' title='Turning Strangers Into Friends In Virtual Reality: VR Social Architectures'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhAw8Sli6CqDaLQBJweyoPgNp1ebkwiB5TI-R4hVAnGdY370xbcfrdvgTqPZeiwcloWhC5P0_-39uaZWSV7aCfRSGTm1fVu3v1Z-bjGIsCASDNkj9_haa6AfmaSY6WCt6bMkpr-yZatWT1Kd07C0l3b9BlmvDLV9hENykIPyPxxVgN6Oi_ueA=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-1462643691593544199</id><published>2022-06-09T11:58:00.001-07:00</published><updated>2022-06-09T12:04:06.683-07:00</updated><title type='text'>Two Exciting, Optimistic Visions for the 2020s Involving the Earth, Space, and Machine Learning</title><content type='html'>&lt;h1 style=&quot;text-align: left;&quot;&gt;Introduction&lt;/h1&gt;&lt;div&gt;&lt;div&gt;In this essay I present two inspirational visions for the 2020s, one involving Earth and the other involving space — both scenarios are bound together and enabled by advanced machine learning. These two visions are what personally inspire my work, and provide a roadmap for me this decade.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The focus of this article is optimistic. While looking at the downsides of technology is important, we are currently inundated with dark visions of the future. In my opinion it is sometimes good to look up and be inspired rather than horrified. Hopefully I can paint a few positive visions for this decade that inspire you.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhZfRJr7VPKKz9MWG3_oGqvis2bFahnk0HAFxtTYqKLrY79YO1N437cadjz5sLaH9dT5UgPxUq7KlJ-OaWQA1p181dPA3wbhv8ct3muQ_tgdyZtUYwGH3G7or3KShoRZuci7USPXpb4pxgBGqAgpjWa1wsFYfEYc5lzEQFX3E6VBGktnZ2wiQ&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1278&quot; data-original-width=&quot;1920&quot; height=&quot;426&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhZfRJr7VPKKz9MWG3_oGqvis2bFahnk0HAFxtTYqKLrY79YO1N437cadjz5sLaH9dT5UgPxUq7KlJ-OaWQA1p181dPA3wbhv8ct3muQ_tgdyZtUYwGH3G7or3KShoRZuci7USPXpb4pxgBGqAgpjWa1wsFYfEYc5lzEQFX3E6VBGktnZ2wiQ=w640-h426&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;First pair of the 28 Planet Labs satellites launched from the ISS via the NanoRacks CubeSat Deployer (2014)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;A brief introduction to who I am before we dive in. I&#39;m a Staff Machine Learning Engineer at Planet. Planet has ~200 small cubesats the size of a shoebox in Low Earth Orbit (LEO) that image the landmass of the Earth daily. I do machine learning &amp;amp; analytics on this imagery, performing things like automatic road and building change detection using neural networks. I&#39;m also an advisor with the Frontier Development Lab (FDL), a public-private partnership between entities such as NASA, the SETI Institute, and more that hosts intensive research sprints at the intersection of space exploration/science, earth science, and machine learning.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have a long history in Silicon Valley of technical and product innovation, having worked at companies like Google &amp;amp; Dropbox. At Dropbox I did industrial R&amp;amp;D to ship deep learning-powered products to millions of users and across billions of files. In my career I&#39;ve done everything from helping the open foundations of the web blossom into a true application deployment platform through efforts like HTML5; to re-imagining interactive digital textbooks for higher education and how they are published by adopting ideas from computer science; to founding what became the Coworking movement, an international grassroots movement to establish a new kind of workspace for the self-employed, with more than 15,000 coworking spaces now open globally.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now that that&#39;s out of the way, let&#39;s dive into our first optimistic vision, involving the Earth.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Earth&lt;/h1&gt;&lt;div&gt;In the late 1950s the Advanced Research Projects Agency (ARPA) was assigned the task of creating a global seismology network to monitor tremors on the Earth, with sensors globally from Thailand to Alaska to Tasmania. In the early 1960s this sensor network proved instrumental in outlawing nuclear tests, as well as monitoring underground tests, as any nuclear tests would activate this global seismology network. A global monitoring system allowed global treaties to have &quot;teeth&quot; and be enforceable, in this case making the world safer from nuclear tests and nuclear proliferation. You do not get a global test ban treaty without a sensor network to keep countries honest.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgeLKliBb5AvWYUOc8K3x-1ODiB20MeevHmALcsuXpu_tI_UtFdNLZ2QcWwe8jCm59bPRo_KNu_3z9SQ9qheiPNZPgyYJIeY9aXF0lOHrUX8hDDB6y451xGqu22N2dsOupEiRggnomExsW6UVYHQ_0qz1XxJlSPe0W_tBaFKb5TVIx8yAvtKw&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgeLKliBb5AvWYUOc8K3x-1ODiB20MeevHmALcsuXpu_tI_UtFdNLZ2QcWwe8jCm59bPRo_KNu_3z9SQ9qheiPNZPgyYJIeY9aXF0lOHrUX8hDDB6y451xGqu22N2dsOupEiRggnomExsW6UVYHQ_0qz1XxJlSPe0W_tBaFKb5TVIx8yAvtKw=w640-h640&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;John F. Kennedy signs the Limited Test Ban Treaty (Washington, 7 October 1963)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;In the same way, by the end of the 2020s I&#39;d like to see a global network of earth observation satellites combined with advanced machine learning to monitor the environment and human development daily, weekly, and monthly. This would flow up to a State of the Planet &amp;amp; Human Society dashboard monitoring key metrics such as:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;What&#39;s the global percentage of degraded forests?&lt;/li&gt;&lt;li&gt;What&#39;s the percentage of humanity living in poverty?&lt;/li&gt;&lt;li&gt;What are the number of tree crowns across the entire globe, counted individually?&lt;/li&gt;&lt;li&gt;What percentage of global biomass is capturing carbon vs. acting as a carbon source?&lt;/li&gt;&lt;li&gt;What are the total gigawatts of renewable energy (solar photovotaic, wind, etc.) currently operating on Earth?&lt;/li&gt;&lt;li&gt;What communities are at risk of catastrophic flooding?&lt;/li&gt;&lt;li&gt;etc.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;We would also be able to gauge the relative change in these metrics over days, weeks, months, and years, to see if we are getting better or worse.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Automatically detecting and surfacing these environmental and human development trends can give real enforcement mechanisms for global treaties, just as ARPA&#39;s global seismometer network contributed to ending nuclear tests. A given country can promise to preserve their biomass and trees, for example, and perhaps have these promises be turned into tradeable instruments&amp;nbsp;— a global earth observation network plus machine learning would make it possible to know, daily, how a country is actually doing preserving their forests, for example, to back these promises and tradeable instruments with verification. &quot;Trust, but verify,&quot; as many said during the nuclear disarmament talks of the 1980s.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I believe this will create a revolution in our ability to hold societies accountable by the end of the 2020s. This is my primary focus at Planet, to enable and help this revolution as much as I can.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjpUFANSwXQnuw3vRM2RA7vZXtj4sgn7qpi2TcZlb70CoPUq4xIyITKgrbKc0L30IewYY6aAqF6A00YhgBjDq1KMMCq-ov7YG_NHxzkC5pxS1iNMwsD1KwqJZaJg9IS7rbQctgRNjo4SXFJ8cnOXgIejCapXuRrHc4r8pjniIOJ77qbLn6njg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;451&quot; data-original-width=&quot;728&quot; height=&quot;397&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjpUFANSwXQnuw3vRM2RA7vZXtj4sgn7qpi2TcZlb70CoPUq4xIyITKgrbKc0L30IewYY6aAqF6A00YhgBjDq1KMMCq-ov7YG_NHxzkC5pxS1iNMwsD1KwqJZaJg9IS7rbQctgRNjo4SXFJ8cnOXgIejCapXuRrHc4r8pjniIOJ77qbLn6njg=w640-h397&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;The 17 Sustainable Development Goals (SDG) of the United Nations. Remote sensing + machine learning can help with some of them.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;Rich sensor modalities, with data fusion between them, will be an important part of making this vision true by the end of the decade. This will include:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;High revisit, optical, daily, global scans&lt;/i&gt;&lt;/b&gt; - this includes Planet&#39;s Dove constellation, currently at 3 through 5 meters.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;Very high resolution, tasking-oriented optical satellites&lt;/i&gt;&lt;/b&gt; - these allow very high resolution tasking collects to be done over specific, focused areas of interest, in the tens of centimeters range. Examples of these include Planet&#39;s SkySat and the future Planet Pelican fleet.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;Hyperspectral&lt;/i&gt;&lt;/b&gt; - these allow the detection of specific chemical composition and materials, including monitoring climate change gases like methane and carbon dioxide from power plants and point pollution emitters, as well as detecting details on surface materials of the Earth&#39;s surface. Planet&#39;s future Carbon Mapper is an example hyperspectral satellite.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;Synthetic Aperture Radar (SAR)&lt;/i&gt;&lt;/b&gt; - satellite platforms using radar to penetrate clouds, fog, smog, darkness, and smoke, especially important when monitoring the Earth&#39;s equitorial regions which can be frequently cloudy. The Sentinel-1 fleet are examples of SAR satellites.&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;Light Detection and Ranging (LIDAR)&lt;/b&gt; &lt;/i&gt;- satellites using light in the form of a pulsed laser to measure distances to the Earth. This is important for measuring variables such as tree canopy heights in forests, determining surface elevations, etc. An example of these sensors are the Global Ecosystem Dynamics Investigation (GEDI) instrument on the International Space Station (ISS).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;To make our global monitoring vision true for the 2020s, we need a greater variety of these sensors monitoring the Earth at greater cadences, with as much resolution as possible, with common methods to do data fusion across them to get different angles of the Earth.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;There are also machine learning frontiers that have to be solved to enable this vision. This includes:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Labeling geospatial data to be used for training neural networks is very error prone &amp;amp; tedious. We need to adapt the latest advances from Self-Supervised Learning (SSL) to work in the geospatial domain.&lt;/li&gt;&lt;li&gt;It would be great to get a DallE-2/GPT-3 scale generative model but trained on earth observation systems.&lt;/li&gt;&lt;li&gt;We need generic change detection systems that can scale globally across continents and across a range of change detection tasks, whether for roads and buildings or changes in land cover.&lt;/li&gt;&lt;li&gt;We need advancements in multi-task/meta-learning to be applied in the geospatial realm, adapting developments like Model-Agnostic Meta-Learning (MAML) or even a generalist agent like DeepMind&#39;s Gato but applied to a range of remote sensing problems.&lt;/li&gt;&lt;li&gt;We need a true digital globe, somewhat like the digital globe Microsoft created for Flight Simulator 2020 but with a remote sensing and earth science focus, to realistically synthesize global training data and for experiments.&lt;/li&gt;&lt;li&gt;Sensor fusion and automatic tip and cue will become important tools, with automatic tip and cue focused on environmental and human development goals rather than the traditional Defense &amp;amp; Intelligence (D&amp;amp;I) focus that automatic tip and cue currently has. Research and product work need to focus on getting better at automated tip and cue for civilian &amp;amp; environmental goals based on tips from machine learning models and observations, with follow up loops.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Space&lt;/h1&gt;&lt;div&gt;The last 15 years have been exciting in space, primarily due to three developments:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Rapid cost reductions from SpaceX with the Falcon 9 and Falcon Heavy rockets, and increased access to affordable micro-launchers like Rocket Lab&#39;s Electron.&lt;/li&gt;&lt;li&gt;The transformation from NASA moving from cost-plus contracts to results-driven contracts, such as Commercial Orbital Transportation Services (COTS) and Commercial Crew Development (CCDev).&lt;/li&gt;&lt;li&gt;Rapid miniaturization and cost reductions thrown off from developments in sectors like the smart phone market opening new possibilities for use in space.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;If SpaceX&#39;s Starship happens, though, we will see developments in space in the mid- to late 2020s that will be, to put it plainly, absolutely bonkers compared to the last 15 years. Starship fundamentally rewrites cheap, rapid, massive access to Low Earth Orbit, and as the science fiction author Robert Heinlein wrote: &quot;If you can get your ship to orbit, you&#39;re halfway to anywhere.&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;369&quot; src=&quot;https://www.youtube.com/embed/-Oox2w5sMcA&quot; width=&quot;567&quot; youtube-src-id=&quot;-Oox2w5sMcA&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you don&#39;t know what Starship is, it&#39;s SpaceX&#39;s Super Heavy rapidly re-usable launch vehicle, currently being designed in South Texas (right by where I grew up BTW) and targeting the mid-2020s for takeoff. The current paper specs for Starship are 100 through 150 metric tons uplift depending on the exact target orbit and final actual performance of Starship, for perhaps ~3 million marginal cost per launch baseline price, with a payload fairing size of 9 meters in diameter and an in-orbit refuelling ability. These are crazy numbers and abilities, but the magnitude of this change can get lost. Lets do some comparisons to understand just how transformative having Starship could be.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, take a look at the amount of metric tons different rockets can take to LEO. As you can see with the numbers under the rockets, showing the payload tonnage to LEO, Starships estimated tonnage is incredibly high vs. other rocket systems; even if it &quot;only&quot; ends up being 100 tons rather than 150 tons like in the diagram below its still much larger than most other systems:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuHrdJW2SA_Dk18LVBeDPHHfdwcj7IQofE0Ztz94gcuCzbT17IRJ7sa1rA9DrIZjPdgWFZYvz3fHOH89ZFyaUW4CkfJeibmzTULZ0rxCBPzkKOEUWmyRCk2AUFJqNdLk4qXaDaAUZrU1qjIkYEb9Jy8_rlwCWIL-qPuYC__oray8BoZ7tTmA/s1920/tonnage_to_orbit_comparison.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1357&quot; data-original-width=&quot;1920&quot; height=&quot;452&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuHrdJW2SA_Dk18LVBeDPHHfdwcj7IQofE0Ztz94gcuCzbT17IRJ7sa1rA9DrIZjPdgWFZYvz3fHOH89ZFyaUW4CkfJeibmzTULZ0rxCBPzkKOEUWmyRCk2AUFJqNdLk4qXaDaAUZrU1qjIkYEb9Jy8_rlwCWIL-qPuYC__oray8BoZ7tTmA/w640-h452/tonnage_to_orbit_comparison.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Comparison of metric tons to LEO for different launch systems, original image modified from Wikipedia Super Heavy Launch Systems comparison.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;This Starship Super Heavy Lift ability also comes at a cost that is estimated to be even cheaper than the Falcon 9:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1qAy78QaAaXSnR7U41h8DwDXzgztSa-E89oCj98qn6eRRZlg7TQW-1iC3n6Pvt9KUJAr0Muc4vlWF9ye_tYxQ45FktvYpyd94wFH_9NuTM29oRKZiUeZyToX9rk-DBQ2qP0G9WeGnhzcj_SrvGc9SspBqsmdHcuSgeJGtZjEBA3Ja4UeDvg/s658/Payload%20Cost%20to%20LEO%20in%20kgs,%20in%20FY21%20USD,%20narrower.png&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;576&quot; data-original-width=&quot;658&quot; height=&quot;560&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1qAy78QaAaXSnR7U41h8DwDXzgztSa-E89oCj98qn6eRRZlg7TQW-1iC3n6Pvt9KUJAr0Muc4vlWF9ye_tYxQ45FktvYpyd94wFH_9NuTM29oRKZiUeZyToX9rk-DBQ2qP0G9WeGnhzcj_SrvGc9SspBqsmdHcuSgeJGtZjEBA3Ja4UeDvg/w640-h560/Payload%20Cost%20to%20LEO%20in%20kgs,%20in%20FY21%20USD,%20narrower.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Payload Cost to LEO in kgs, in FY21 USD&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;Even if the cost &quot;only&quot; ends up being $50 per kg rather than $14 per kg, that&#39;s still vastly cheaper than the closest comparable cheapest rocket, the Falcon 9 at $1,500 per kg.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;The headline is that we are getting Saturn V level tonnage to orbit for cheaper than the cheapest launch system, or basically Super Heavy launch capability at Small Launcher prices&lt;/i&gt;&lt;/b&gt;. This right here is the revolution in a nutshell: the ability to do Saturn V level exploration and science for cheaper than the price of a Falcon 9.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;In addition, there are two other important abilities that will make Starship even more capable:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;A very large fairing size to allow bigger and wider objects to be launched into orbit, such as space telescope systems&lt;/li&gt;&lt;li&gt;The ability to refuel in orbit, allowing more affordable access to the rest of the solar system, including the Moon and Mars&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Starship will allow many dead space dreams of the last 60 years to come back to life. The ability to cheaply and rapidly launch large, heavy mass into space will revive efforts such as in-space manufacturing, operations on the surface of the Moon and Mars, building large scientific structures at the Lagrange Points, and more. However, space remains a very unforgiving and harsh environment, and we will need to use autonomous systems as much as possible for these efforts rather than just throwing people at the problem. This means the demand for reliable and very capable autonomous systems in space will greatly increase near the end of this decade.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgHY7lZnUxv-1P2FauZI5AlLUjOIH83Yz4yrioNoxmtQwTdUBKck-N7nHxPovB98zP4G3BcN8GmjRh_YQYoV2UKBz0W_up8vLHNuUDPKSVy1UnoUGG48T9L7FzA5jgvnHd1gCi54vbfva1OQp6-cpLqkQeWVF9qQcopnZuYMgohhMHaRgu8wQ&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1582&quot; data-original-width=&quot;2290&quot; height=&quot;442&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgHY7lZnUxv-1P2FauZI5AlLUjOIH83Yz4yrioNoxmtQwTdUBKck-N7nHxPovB98zP4G3BcN8GmjRh_YQYoV2UKBz0W_up8vLHNuUDPKSVy1UnoUGG48T9L7FzA5jgvnHd1gCi54vbfva1OQp6-cpLqkQeWVF9qQcopnZuYMgohhMHaRgu8wQ=w640-h442&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;Rendering of proposed NASA/JPL Lunar Crater Radio Telescope (LCRT), an ultra-long-wavelength radio telescope on the far-side of the Moon.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;Here&#39;s a glimpse of some of the activities we might be able to do later in the decade or early 2030s if Starship takes off:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;In-Space Resource Utilization (ISRU), which means to use resources already in space such as asteroids and on the surface of the Moon and Mars, to build structures and refine useful materials. This can include harvesting water from icy asteroids for use by people, split into propellant for use by rocket engines, etc., as well as creating habitable shelters on planetary surfaces using the regolith already present. This will require manufacturing systems that are robust and autonomous.&lt;/li&gt;&lt;li&gt;In-space construction of large structures, such as very large free floating optical synthetic aperture telescopes to image continents on exoplanets around other stars, or building very large radio telescopes on the dark side of the moon, such as the NASA/JPL proposed Lunar Crater Radio Telescope. These efforts will require precision, autonomous robotics and manufacturing in micro gravity environments.&lt;/li&gt;&lt;li&gt;The ability to have heavier, larger, and more ambitious scientific missions to planets throughout the solar system, including the icy outer planets.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;To unlock these kinds of abilities, we need advances in machine learning that includes:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;The ability to use modern compute tailored for neural networks, such as GPUs and neural cores, in high radiation space environments, by leveraging software-level resiliency even if dealing with non-rad hardened compute hardware, similar to how the Mars Ingenuity helicopter uses Commercial Off The Shelf (COTS) Qualcomm processors for its computer vision.&lt;/li&gt;&lt;li&gt;The ability to harness reinforcement learning with hard guarantees on system behavior, similar to what traditional control theory provides but with the learning and flexibility of modern deep reinforcement learning. This will be needed for the advanced robotics and perception challenges that in-space and on-surface ISRU, manufacturing, and construction requires, while strong guarantees on autonomous behavior are necessary in the space environment to know that a system will work as expected.&lt;/li&gt;&lt;li&gt;The ability for algorithms to automatically do exploration and scientific work when exploring the outer icy planets, such as doing flybys and exploration of Europa without any humans in the loop, as the radio distance is too great for scientists on Earth to really direct an outer planet mission in detail.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Conclusion&lt;/h1&gt;&lt;div&gt;These two visions, one focused on taking care of the Earth and the other on opening up positive visions for space, are a personal roadmap for me this decade and one of my focuses for my machine learning work. I hope they help you in determining how you would like to contribute this decade. While humanity has real challenges to solve, I think there are more silver linings and positive possibilities in the 2020s than many give credit to. So put down your doomscrolling and roll up your sleeves to help move the ball forward in the 2020s.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/1462643691593544199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=1462643691593544199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/1462643691593544199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/1462643691593544199'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2022/06/two-exciting-optimistic-visions-for.html' title='Two Exciting, Optimistic Visions for the 2020s Involving the Earth, Space, and Machine Learning'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhZfRJr7VPKKz9MWG3_oGqvis2bFahnk0HAFxtTYqKLrY79YO1N437cadjz5sLaH9dT5UgPxUq7KlJ-OaWQA1p181dPA3wbhv8ct3muQ_tgdyZtUYwGH3G7or3KShoRZuci7USPXpb4pxgBGqAgpjWa1wsFYfEYc5lzEQFX3E6VBGktnZ2wiQ=s72-w640-h426-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-4013736097830712531</id><published>2021-01-19T16:03:00.004-08:00</published><updated>2021-01-19T16:03:35.960-08:00</updated><title type='text'>HOWTO: Adding Keyboard Accelerators to Holoviz Applications for Machine Learning Workflows</title><content type='html'>&lt;p&gt;My team at &lt;a href=&quot;https://www.planet.com/&quot;&gt;Planet&lt;/a&gt; trains deep nets with large amounts of geospatial remote sensing data, for tasks such as semantic segmentation. We&#39;ve created a set of internal Jupyter Notebooks built above the &lt;a href=&quot;https://holoviz.org/&quot;&gt;HoloViz&lt;/a&gt; ecosystem for quickly jumping through, validating, QAing, etc. this training data, leaning on tools like &lt;a href=&quot;http://geoviews.org/&quot;&gt;GeoViews&lt;/a&gt; to efficiently display and create these UIs. Since we are sometimes dealing with thousands of samples, keyboard accelerators are very important for productively dealing with this data.&lt;/p&gt;&lt;p&gt;Unfortunately, Bokeh/HoloViews/GeoViews don&#39;t have any official mechanisms for adding keyboard accelerators. I recently created a workaround for this that was tricky, and thought sharing it might help others in a similar situation when attempting to create Bokeh/HoloViews powered Jupyter Notebooks for the kinds of workflow situations machine learning often requires.&lt;/p&gt;&lt;p&gt;To use, you will first need to add a &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Grab Keyboard&lt;/span&gt; button to your HoloViz UI. Here&#39;s an example UI from our own Planet QA work with this button added:&lt;/p&gt;&lt;p&gt;&lt;/p&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/AVvXsEjJ_khg99_S6RDtbfnjEjjBAl2SiRhUWVB8xOhAsO9j2MGpe0HrVr3lOpChcm27JiXLzqQzFbEllHkrPxMLW7-l-sxQnqkCrMU6jgs8lfir86bJzWMQugBh-6PWKGoR8NQWh9bo/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;423&quot; data-original-width=&quot;1284&quot; height=&quot;211&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ_khg99_S6RDtbfnjEjjBAl2SiRhUWVB8xOhAsO9j2MGpe0HrVr3lOpChcm27JiXLzqQzFbEllHkrPxMLW7-l-sxQnqkCrMU6jgs8lfir86bJzWMQugBh-6PWKGoR8NQWh9bo/w640-h211/image.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Clicking the &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Grab Keyboard&lt;/span&gt; button will &quot;inject&quot; JavaScript keyboard handling into the page; if the user clicks the &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Release Keyboard&lt;/span&gt; button that toggles or loses focus, then keyboard handling will be deactivated. This is so that Jupyter&#39;s own keyboard handling doesn&#39;t collide with these keyboard accelerators. Image showing the toggled &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Release Keyboard&lt;/span&gt; button:&lt;/p&gt;&lt;p&gt;&lt;/p&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/AVvXsEgP9tc9viVzK_8HwDMxHLW_mjVuozZpFxDmfTBYYoocT0g90WktFyOTy70-02kk677_FQuFgOGPr0qs7y9g8_dUiQRFw_K3Nnpku4LgAOo07ACOQ4LHZDsZbTsq6WYQURLAkgI9/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;425&quot; data-original-width=&quot;1288&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP9tc9viVzK_8HwDMxHLW_mjVuozZpFxDmfTBYYoocT0g90WktFyOTy70-02kk677_FQuFgOGPr0qs7y9g8_dUiQRFw_K3Nnpku4LgAOo07ACOQ4LHZDsZbTsq6WYQURLAkgI9/w640-h212/image.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In your HoloViews app, make sure it has this button; also define a unique instance_class CSS class that will be used to &#39;silo&#39; your panel when dealing with its buttons in case there are multiple panel instances in the Jupyter notebook:&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;self.instance_class = &#39;some_tool&#39;&lt;br /&gt;self.grab_keyboard_button = pn.widgets.Button(name=&quot;Grab Keyboard&quot;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Pass both of these into your panel when drawing the UI:&lt;/p&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;def panel(self):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return pn.Column(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # ... other parts of your UI&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pn.Row(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pn.Column(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # 4 pn.widgets.Buttons that we want to attach keyboard accelerators to.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pn.Row(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.prev_button,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.valid_button,&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.invalid_button,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.next_button,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pn.layout.HSpacer(),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;pn.Column(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # The Grab Keyboard button.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.grab_keyboard_button,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; align=&quot;center&quot;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ),&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; background=&#39;lightgrey&#39;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;b&gt;# Make sure we have a JavaScript hook to bind onto the buttons for just this&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # pyviz panel in case there are multiple ones in a Jupyter notebook. Used&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # so that we can add keybindings.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; css_classes=[self.instance_class],&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;/div&gt;&lt;p&gt;Next, you will need to grab the &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;JSKeyboardAccelerators&lt;/span&gt; class &lt;a href=&quot;https://gist.github.com/BradNeuberg/ab1e4fd7d687c99b8be1d9ede9905e4d&quot; target=&quot;_blank&quot;&gt;from this gist I put up&lt;/a&gt; and save it to the file js_keyboard_accelerators.py.&lt;/p&gt;&lt;p&gt;Now instantiate a &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;JSKeyboardAccelerators&lt;/span&gt; instance with the actions you want to bind to:&lt;/p&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;self.accelerators = JSKeyboardAccelerators(self.instance_class, self.grab_keyboard_button,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; actions=[&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;action_name&#39;: &#39;Previous&#39;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;keycode&#39;: JSKeycodes.LEFT_ARROW,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;html_button_ordering&#39;: 0,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;expected_text&#39;: &#39;◀&#39;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;action_name&#39;: &#39;Next&#39;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;keycode&#39;: JSKeycodes.RIGHT_ARROW,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;html_button_ordering&#39;: 1,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;expected_text&#39;: &#39;▶&#39;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;action_name&#39;: &#39;Invalid&#39;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;keycode&#39;: JSKeycodes.DOWN_ARROW,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;html_button_ordering&#39;: 2,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;expected_text&#39;: &#39;✖&#39;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;action_name&#39;: &#39;Valid&#39;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;keycode&#39;: JSKeycodes.UP_ARROW,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;html_button_ordering&#39;: 3,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;expected_text&#39;: &#39;✔&#39;,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; },&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;])&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;The &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;action_name&lt;/span&gt; and &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;expected_text&lt;/span&gt; fields are debugging fields that will be printed to the JavaScript console when this keyboard accelerator is pressed to aid in ensuring that the right action is being invoked; &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;keycode&lt;/span&gt; is one of the &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;JSKeycodes&lt;/span&gt; enums (add your own if one is not listed that you want to use); and &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;html_button_ordering&lt;/span&gt; is the ordering of the button you want to be &#39;clicked&#39; on in the background -- basically, the order returned from the CSS selector for your instance_class defined, such as &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&#39;.some_tool button&#39;&lt;/span&gt;.&lt;/div&gt;&lt;p&gt;Hopefully this helps your own work!&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/4013736097830712531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=4013736097830712531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/4013736097830712531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/4013736097830712531'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2021/01/howto-adding-keyboard-accelerators-to.html' title='HOWTO: Adding Keyboard Accelerators to Holoviz Applications for Machine Learning Workflows'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ_khg99_S6RDtbfnjEjjBAl2SiRhUWVB8xOhAsO9j2MGpe0HrVr3lOpChcm27JiXLzqQzFbEllHkrPxMLW7-l-sxQnqkCrMU6jgs8lfir86bJzWMQugBh-6PWKGoR8NQWh9bo/s72-w640-h211-c/image.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-8067827265973675584</id><published>2021-01-07T07:05:00.003-08:00</published><updated>2021-01-18T17:49:23.640-08:00</updated><title type='text'>HOWTO: NVIDIA Jetson TX2: Productive Docker Development &amp; Benchmarking</title><content type='html'>&lt;div style=&quot;text-align: left;&quot;&gt;My previous post,&amp;nbsp;&lt;a href=&quot;http://blog.codinginparadise.org/2021/01/howto-getting-productive-development.html&quot;&gt;HOWTO: Setting Up NVIDIA Jetson TX2 &amp;lt;-&amp;gt; Mac Laptop Development Workflow,&lt;/a&gt; detailed getting a productive workflow going between a Mac Laptop and an NVIDIA Jetson TX2. This post will contain notes and writeups from my work getting a productive Docker workflow going on the Jetson, as well doing performance, power, thermal, etc. benchmarking.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SSH into your Jetson container. Make sure that Docker is actually running correctly; if it isn&#39;t the following command will print an error:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo docker version&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using Docker on your Jetson will allow you to create development sandboxes, which is especially useful if you are doing deep learning or other things that might require extensive configuration of the OS. The Docker sandboxes can have different versions of TensorFlow, PyTorch, etc.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For your base Docker image, you should use one of the official NVIDIA L4T base images (L4T=Linux for Tegra). These images have the necessary hooks for the Docker container to integrate well with Jetson. You can see a list of these NVIDIA L4T images &lt;a href=&quot;https://ngc.nvidia.com/catalog/containers?orderBy=scoreDESC&amp;amp;pageNumber=0&amp;amp;query=l4t&amp;amp;quickFilter=&amp;amp;filters=&quot;&gt;here&lt;/a&gt; (you will need an NVIDIA Developer Account).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A good workflow is to start with a base &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Dockerfile&lt;/span&gt; of some kind to bootstrap a bash shell, then you can experiment within this container as you install different packages to see what you need, making sure to re-add any environment setup back into your Dockerfile.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In these examples we will assume a test directory for a computer vision oriented deep net being tested with the following file layout:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;jetson-experiments/&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;src/&lt;/span&gt; - Python source for some TensorFlow inference graph&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;models/&lt;/span&gt; - Trained TensorFlow weight files that will be used for inference&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;images/&lt;/span&gt; - Example input images that would be used for this TF network&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;mounted/&lt;/span&gt; - Mounted output directory where inference output artifacts will go.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Here&#39;s a basic &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Dockerfile&lt;/span&gt; that can be leveraged; in this &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Dockerfile&lt;/span&gt; we are using a base NVIDIA image that has TensorFlow 2.3 and Python 3.6. If you need something different see the &lt;a href=&quot;https://ngc.nvidia.com/catalog/containers?orderBy=scoreDESC&amp;amp;pageNumber=0&amp;amp;query=l4t&amp;amp;quickFilter=&amp;amp;filters=&quot;&gt;NVIDIA L4T base images&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;FROM nvcr.io/nvidia/l4t-tensorflow:r32.4.4-tf2.3-py3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;ENV DEBIAN_FRONTEND=noninteractive&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;ENV SHELL /bin/bash&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;WORKDIR jetson-experiments&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;#&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Install some common useful packages then clean up to save space.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;#&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;RUN apt-get update &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; apt-get install -y --no-install-recommends \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; software-properties-common \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cmake \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; python3-opencv \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; htop \&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; vim \&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; curl \&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; less \&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# alias python3 -&amp;gt; python&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;RUN rm /usr/bin/python &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ln -s /usr/bin/python3.6 /usr/bin/python &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ln -s /usr/bin/pip3 /usr/bin/pip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;RUN export PYTHON_PATH=/jetson-experiments/src&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;RUN export PATH=$PATH:/usr/bin&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Ensure we can get low-level stats on the Jetson.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;COPY bin/tegrastats /usr/bin/tegrastats&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To build this Dockerfile:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo docker pull nvcr.io/nvidia/l4t-tensorflow:r32.4.4-tf2.3-py3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo docker build -f Dockerfile .&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Take note of the new Docker image ID, which you will use to set &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;CONTAINER_IMAGE&lt;/span&gt; below.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To run this &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Dockerfile&lt;/span&gt;, dumping you into a Bash shell in the Docker container you can play with:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;export CONTAINER_IMAGE=...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;export USER_COMMAND=/bin/bash&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# If trying to get a VNC window into the container; must be run&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# from inside of an X Windows session:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;#sudo xhost +si:localuser:root&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo docker run \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; -it --rm \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; -e DISPLAY=$DISPLAY \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; --runtime nvidia \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; --network host \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; --volume $PWD/mounted:/jetson-experiments/mounted \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;--volume $PWD/src:/jetson-experiments/src \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; --volume $PWD/images:/jetson-experiments/images \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; --volume $PWD/models:/jetson-experiments/models \&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; --volume /tmp/.X11-unix/:/tmp/.X11-unix \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; --volume /tmp/argus_socket:/tmp/argus_socket \&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; $CONTAINER_IMAGE $USER_COMMAND&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once inside the container you can experiment with other commands, updating your Dockerfile as appropriate. Note that the &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;--volume&lt;/span&gt; options for &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;src&lt;/span&gt;, &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;images&lt;/span&gt;, and &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;models&lt;/span&gt; means that the Docker container will inherit these directories from the native Jetson environment -- this means if you &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;rsync&lt;/span&gt; over new files while you are developing on your Mac they will seamlessly get picked up inside the Docker container, which can help with quicker development.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you do this workflow you can build up a significant number of Docker images, which can take up valuable disk space on the Jetson. To clean these up, periodically run this command to clean up unused images:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo docker image prune -a -f&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It can be useful to start a container into a bash shell, running some process like a deep net that you want profile. If this is true, you will want to open other interactive bash shells &lt;i&gt;into the same container&lt;/i&gt;&amp;nbsp;where you can run &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;htop&lt;/span&gt;&amp;nbsp;to monitor performance.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To do this, start your first primary container bash shell as given above with the docker run command. Then, run the following to get the container ID for this container instance:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo docker container ls&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Take note of the value in the &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;CONTAINER ID&lt;/span&gt; column for the instance you started already.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then, assuming you are running &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;tmux&lt;/span&gt; for your overall SSH session on the Jetson, open another &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;tmux&lt;/span&gt; window with the following:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;export CONTAINER_ID=...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo docker exec -it $CONTAINER_ID /bin/bash&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now you can run &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;htop&lt;/span&gt;&amp;nbsp;in these other Docker sessions to gain visibility into your primary process. Note that the &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;tegrastats&lt;/span&gt; command is &lt;i&gt;not&lt;/i&gt;&amp;nbsp;available inside a Docker container; instead, you will have to run it outside of the container to get visibility into overall GPU details.&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://blog.codinginparadise.org/feeds/8067827265973675584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=8067827265973675584' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/8067827265973675584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/8067827265973675584'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2021/01/howto-nvidia-jetson-tx2-productive.html' title='HOWTO: NVIDIA Jetson TX2: Productive Docker Development &amp; Benchmarking'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-3296594883344190718</id><published>2021-01-05T17:49:00.017-08:00</published><updated>2021-01-18T17:18:36.572-08:00</updated><title type='text'>HOWTO: Setting Up NVIDIA Jetson TX2 &lt;-&gt; Mac Laptop Development Workflow</title><content type='html'>&lt;h1 style=&quot;text-align: left;&quot;&gt;Introduction&lt;/h1&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;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/AVvXsEjy1t3imWfN41D3XDc1wPUDPQEqsLhRFie4N1RxbcMaSwM0EKU19iQ84T2lYsxMW2QG5HEo815yk26M6gRnp_W_rsG_IPe4qaimfsHM_H4HxH2c_ZRJgSEb-wSpt9NM51Fejb3T/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;756&quot; data-original-width=&quot;1008&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy1t3imWfN41D3XDc1wPUDPQEqsLhRFie4N1RxbcMaSwM0EKU19iQ84T2lYsxMW2QG5HEo815yk26M6gRnp_W_rsG_IPe4qaimfsHM_H4HxH2c_ZRJgSEb-wSpt9NM51Fejb3T/w400-h300/jetson1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jetson TX2 with external monitor connected&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;This post details how to get a productive development cycle between a Mac and an &lt;a href=&quot;https://developer.nvidia.com/embedded/jetson-tx2-developer-kit&quot;&gt;NVIDIA Jetson TX2&lt;/a&gt; development board, so that you can easily do your coding on your Mac and SSH into your Jetson. By default, the host development computer for a Jetson has to be an Ubuntu Linux install, generally with a USB cable directly plugged into the Jetson development board. At the end of this HOWTO we will be able to directly develop on the Mac without having to have Ubuntu running in a VM at the same time, connecting over a WiFi connection to the Jetson board so you don&#39;t need a direct cable. In addition, this HOWTO also details how to get Docker containers running on the Jetson, how to compile some common machine learning oriented packages for the ARM chips on the Jetson, and how to install an NVMe SSD storage device for greater development room on the Jetson.&lt;/p&gt;&lt;p&gt;Hardware/Software details on what this was tested on:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Mac OS X 10.15.7 (Catalina)&lt;/li&gt;&lt;li&gt;MacBook Pro 2019 (x86 architecture) with 4 Thunderbolt 3 ports&lt;/li&gt;&lt;li&gt;NVIDIA Jetson TX2 development board carrier &lt;a href=&quot;https://developer.nvidia.com/embedded/dlc/jetson-tx1-tx2-developer-kit-carrier-board-c02-design-files&quot;&gt;C02 model&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Ubuntu 18.04.5 (Bionic Beaver) LTS&lt;/li&gt;&lt;li&gt;NVIDIA Jetpack 4.4.1&lt;/li&gt;&lt;li&gt;CUDA 10.2&lt;/li&gt;&lt;li&gt;cuDNN 8.0&lt;/li&gt;&lt;li&gt;NVIDIA Container Runtime with Docker 0.9.0&lt;/li&gt;&lt;/ul&gt;&lt;div&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/AVvXsEg_HvJYok6iRIBI_AE9kCWYXRTWyQrCLGjD6XVY2XBCI1kKOTnus_SlNS8foRY7RGstRl-qgJEGmeVr05VrxniC85jINh-QXPRDhNXbzRsFCVt7ZyIAol0Whspm30UGjgpzzFul/&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;756&quot; data-original-width=&quot;1008&quot; height=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_HvJYok6iRIBI_AE9kCWYXRTWyQrCLGjD6XVY2XBCI1kKOTnus_SlNS8foRY7RGstRl-qgJEGmeVr05VrxniC85jINh-QXPRDhNXbzRsFCVt7ZyIAol0Whspm30UGjgpzzFul/w400-h300/jetson2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jetson TX2 with Mac laptop in background and NVMe SSD attached to motherboard&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Initial Setup&lt;/h1&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;Turn on the Jetson, following the printed guide with the board and get Ubuntu setup on the TX2 itself, confirming that everything works. Make sure you have a monitor and keyboard attached to the Jetson development board when you do so. Also ensure that you have an &lt;a href=&quot;https://developer.nvidia.com/developer-program&quot;&gt;NVIDIA developer account&lt;/a&gt; before proceeding, as this will be needed for the full dev workflow in this HOWTO.&lt;/div&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Get Ubuntu 18 VM Going on Mac OS X&lt;/h1&gt;&lt;div&gt;By default the Jetson needs Ubuntu running on the host computer for development. We need to get this bootstrapped on our Mac before proceeding.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On your Mac, download and install &lt;a href=&quot;https://download.virtualbox.org/virtualbox/6.1.16/VirtualBox-6.1.16-140961-OSX.dmg&quot;&gt;Virtualbox 6.1.16&lt;/a&gt;, then also download and install the &lt;a href=&quot;https://download.virtualbox.org/virtualbox/6.1.16/Oracle_VM_VirtualBox_Extension_Pack-6.1.16.vbox-extpack&quot;&gt;Virtualbox Extensions&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Install Ubuntu 18 into this Virtualbox on your Mac. First download &lt;a href=&quot;https://releases.ubuntu.com/18.04/ubuntu-18.04.5-desktop-amd64.iso&quot;&gt;Ubuntu 18.04.5 (Bionic Beaver) LTS&lt;/a&gt;&amp;nbsp;and install it into Virtualbox:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-b5785635-7fff-8bb1-9ebf-c74b5885305c&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;border: none; display: inline-block; height: 376px; overflow: hidden; width: 624px;&quot;&gt;&lt;img height=&quot;376&quot; src=&quot;https://lh6.googleusercontent.com/z9V_JNCO-fj9kkozHkPPWNpmrUmFTVl5eim-LdWSwML0wvwvGrjohZ3oG3AThhbLamHtqQ5tjL1TqVPqsD4dfva0kJMMZQdeEwOljBcHCbZo0gncbI91yGXzPUFRkpuHBQTV_Wym&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;624&quot; /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-6932a963-7fff-b2bf-99ec-667dedef90ac&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;border: none; display: inline-block; height: 356px; overflow: hidden; width: 624px;&quot;&gt;&lt;img height=&quot;356&quot; src=&quot;https://lh5.googleusercontent.com/wdN8c-RELDO2A3FgL15zLWOZxbDgR9pflIsuJB-eYpWWeLyJsJJDz2mQbSJW4i8SGW3eukh5vyLuEshhaqiukCWegD1SLzM0-v3qKVE_Qf7OJWvLisyG8QLwXleR_B7oLs1FLtre&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;624&quot; /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Create an Ubuntu machine with the following settings:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Storage is larger than 50GBs&lt;/li&gt;&lt;li&gt;Go to Settings -&amp;gt; Network -&amp;gt; Adapter 1, change &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Attached to&lt;/span&gt; to &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Bridged Adapter&lt;/span&gt;, and name to whatever under Wi-Fi&lt;/li&gt;&lt;li&gt;Go to Settings -&amp;gt; Ports -&amp;gt; USB, ensure &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Enable USB Controller&lt;/span&gt;&lt;/span&gt; is under &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;USB 3.0 (xHCI) Controller&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Last, load the image that you downloaded and spin up a VM.&lt;br /&gt;&lt;br /&gt;Right click on our new machine and go to &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Start &amp;gt; Normal Start&lt;/span&gt;&lt;/span&gt; or select the machine and just click the Green Start Arrow icon. We&#39;ll soon be prompted with the following, where we&#39;ll now select our downloaded ISO file, and click Start.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;At first your Ubuntu VM window will be very small. To temporary fix this before we configure our display setting in Ubuntu directly, click the fifth icon from the bottom right and go to&amp;nbsp;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Virtual Screen 1 &amp;gt; Scale to 200% (autoscaled output)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Inside the VM Ubuntu will now do a Linux install. Select a minimal install, plus install third party options. Select erase disk and install Ubuntu. Once its finished, restart the Ubuntu VM.&lt;br /&gt;&lt;br /&gt;When you are back inside the restarted Ubuntu VM, fix the screen resolution. Go to the 9 dots in the bottom left of the Ubuntu UI and search for &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Settings&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;background-color: white; clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggFDvzbVm2RAadhwvCedWn1C7IR-VJIyWAvTfjJKH4_31aYSOpnZ39MU3_yYuC3um_2JgYIyPMfLhh2IXGAcIlcHIUbHemmNZyGwiMZZbb-3UPb6G_FRm7ppRsNojgVKb7vbmG/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;573&quot; data-original-width=&quot;700&quot; height=&quot;524&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggFDvzbVm2RAadhwvCedWn1C7IR-VJIyWAvTfjJKH4_31aYSOpnZ39MU3_yYuC3um_2JgYIyPMfLhh2IXGAcIlcHIUbHemmNZyGwiMZZbb-3UPb6G_FRm7ppRsNojgVKb7vbmG/w640-h524/image.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once settings shows up, scroll to the bottom with the left sidebar until you see &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Devices&lt;/span&gt;&lt;/span&gt; and click on it.&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQP6Nof7x67n15t94-uM8i8o0PYh1WtXzGPgylKcBKw7N1E3kXU0CoyyWcCyRon-tgTJcPuWJNgH8NHDXY6GDH_C5VSuXHJIoYJy2dVNnzbLU9iG1oeO484D04xKdXGcvHrtyq/&quot; style=&quot;background-color: white; margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;573&quot; data-original-width=&quot;700&quot; height=&quot;524&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQP6Nof7x67n15t94-uM8i8o0PYh1WtXzGPgylKcBKw7N1E3kXU0CoyyWcCyRon-tgTJcPuWJNgH8NHDXY6GDH_C5VSuXHJIoYJy2dVNnzbLU9iG1oeO484D04xKdXGcvHrtyq/w640-h524/image.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/span&gt;Select the new resolution from the dropdown -- note that part of it will be cut off.&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;background-color: white; clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidAgzgcqLhwC5ay68X-DMY-wq_XzDPfSs7NcHRXcRkS6ce7-yKdHJeR09J5gDdmsMr93DCvhRnEObadVnpJU3uJa3Dxo3iryu8xxYDG2rticcn_ZZz1faBzD35fM-Ve27blVuR/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;573&quot; data-original-width=&quot;700&quot; height=&quot;524&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidAgzgcqLhwC5ay68X-DMY-wq_XzDPfSs7NcHRXcRkS6ce7-yKdHJeR09J5gDdmsMr93DCvhRnEObadVnpJU3uJa3Dxo3iryu8xxYDG2rticcn_ZZz1faBzD35fM-Ve27blVuR/w640-h524/image.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It will prompt you the top right to apply these changes, but unfortunately you can’t click &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Apply&lt;/span&gt;&lt;/span&gt; because it’s not within the view of the resolution of the window. To get access it to, double-click the top navigation bar where it says&amp;nbsp;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Displays&lt;/span&gt;, and then drag the window from right to left until you see the&amp;nbsp;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Apply&lt;/span&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&amp;nbsp;&lt;/span&gt;button.&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;background-color: white; clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-qvogfCYxHf4FmCoUe3hMkD0QjeBkavTjEFZtr0O6_DEyLYcmIeE2oCe_Zxa8TupGiUu9RzqcTx_3e9QnqtcwXxxGfgdTTji7HqSvAEOv7p89GB6NM_eh8d8GelY8Qi8GAFqg/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;573&quot; data-original-width=&quot;700&quot; height=&quot;524&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-qvogfCYxHf4FmCoUe3hMkD0QjeBkavTjEFZtr0O6_DEyLYcmIeE2oCe_Zxa8TupGiUu9RzqcTx_3e9QnqtcwXxxGfgdTTji7HqSvAEOv7p89GB6NM_eh8d8GelY8Qi8GAFqg/w640-h524/image.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The resolution will change, and you’ll be prompted to confirm if you want to keep these changes. If it doesn’t fit your screen, leave it for a few seconds and it will reset back, otherwise click &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Keep Changes&lt;/span&gt;&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;div class=&quot;separator&quot; style=&quot;background-color: white; clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLTDCBUHpdAYEAl2QUx2pr_QT2XlzoMHoTN3Wkyz0jTOj3qwidHqiD7k7QleyyL_uW_detnO62PpB_-UQ4GqqEXuLqK3hCaLBjOpn5J8JaWdbgAi8IxRBTm1nBmQTs8rJPgamb/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;469&quot; data-original-width=&quot;700&quot; height=&quot;428&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLTDCBUHpdAYEAl2QUx2pr_QT2XlzoMHoTN3Wkyz0jTOj3qwidHqiD7k7QleyyL_uW_detnO62PpB_-UQ4GqqEXuLqK3hCaLBjOpn5J8JaWdbgAi8IxRBTm1nBmQTs8rJPgamb/w640-h428/image.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;Next, open a browser window inside the Ubuntu VM window on your Mac. &lt;a href=&quot;https://www.blogger.com/u/1/#&quot;&gt;Download&lt;/a&gt; the Jetpack 4.4.1 NVIDIA SDK Manager Method of download (you will need to use your NVIDIA developer portal credentials). When you download Jetpack, save it then double-click it to install or else you will get Ubuntu permission errors.&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Once Jetpack is installed inside the Ubuntu VM on your Mac, click the 9 dots menu on the lower-left of Ubuntu&#39;s UI, search for the word &quot;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;SDK&lt;/span&gt;&lt;/span&gt;&quot;, then double-click the NVIDIA SDK Manager icon that appears. Sign into the NVIDIA developer portal again through the SDK manager. Inside the SDK manager UI, select the Target Hardware to be the Jetson TX2, and select DeepStream to also be installed. Select the &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Download now, install later&lt;/span&gt;&lt;/span&gt; option.&lt;/div&gt;&lt;br /&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Flash Over Updated OS and SDK to Jetson&lt;/h1&gt;&lt;div&gt;Now we will use the host Mac Ubuntu VM to flash over and update the Jetson. Ensure that the Jetson is not plugged in. Shutdown the Ubuntu Virtualbox VM on your Mac, making sure its actually powered off and not on standby. Touch some metal to ensure you don&#39;t have static charge on you, then connect the Jetson Micro-USB port and your laptop&#39;s USB-c port. Note that the Jetson can be quite sensitive to which USB cable you use for the Jetson Micro-USB to Mac USB-c port. Ultimately I had to use the black cable with a tiny NVIDIA green icon on it that came with the Jetson (not the white adapter one) for this all to work:&lt;div&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&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/AVvXsEgy1fAVs-LW7Bg-0yjr9qxU9aDMgiMl8NnPYWYAThdkIeKUWmv9W-6g8RgrH4A6mCbYBfA6UvkcwMzrQtt7F0A2FaoQRUWUaKU2Sj4owzz6ho8k2EFGnDuZiET8sYYftXcba1Jl/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1600&quot; data-original-width=&quot;1200&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy1fAVs-LW7Bg-0yjr9qxU9aDMgiMl8NnPYWYAThdkIeKUWmv9W-6g8RgrH4A6mCbYBfA6UvkcwMzrQtt7F0A2FaoQRUWUaKU2Sj4owzz6ho8k2EFGnDuZiET8sYYftXcba1Jl/w480-h640/jetson_illustration.png&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Now, connect the power to the Jetson development board again, and get &lt;span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc; font-size: 11pt; white-space: pre-wrap;&quot;&gt;Force Recovery Mode&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; going on the Jetson by working with the 4 onboard red buttons on the edge of the board. Here they are, annotated with their function:&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&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/AVvXsEiEMhOgc5SusMArGyYKU_vW7Sy5DrEX5XSnXvbt-TCwcM1JX_RH-B-G1k2lWBtpogABgb6FHc1KuGDdr7q1eyVUga3RWiAQCGeTLZcOqaJn0Trc6LtWolDgAkoAPRY6JZXzaNX2/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;2048&quot; data-original-width=&quot;1536&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEMhOgc5SusMArGyYKU_vW7Sy5DrEX5XSnXvbt-TCwcM1JX_RH-B-G1k2lWBtpogABgb6FHc1KuGDdr7q1eyVUga3RWiAQCGeTLZcOqaJn0Trc6LtWolDgAkoAPRY6JZXzaNX2/w480-h640/IMG_2866.jpg&quot; width=&quot;480&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Follow these instructions to get &lt;span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc; font-size: 11pt; white-space: pre-wrap;&quot;&gt;Force Recovery Mode&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; going:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Press and release the &lt;span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc; font-size: 11pt; white-space: pre-wrap;&quot;&gt;Power Switch&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Hold down the &lt;span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc; font-size: 11pt; white-space: pre-wrap;&quot;&gt;Recovery (REC) Switch&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;With &lt;span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc; font-size: 11pt; white-space: pre-wrap;&quot;&gt;REC&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; held down, press and release the &lt;span style=&quot;background-color: #cccccc; font-size: 11pt; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Reset Switch&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Hold &lt;span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc; font-size: 11pt; white-space: pre-wrap;&quot;&gt;REC&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; for 2 more seconds, then release&lt;/li&gt;&lt;/ul&gt;Once the Jetson starts up, you want to make sure that the NVIDIA Jetson board is actually connecting and registering itself with the physical Mac laptop before we even involve the Mac Ubuntu VM. On your Mac open a Terminal window and enter:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-size: 14.6667px; white-space: pre-wrap;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;ioreg -p IOUSB -w0 | sed &#39;s/[^o]*o //; s/@.*$//&#39; | grep -v &#39;^Root.*&#39;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: Arial; font-size: 14.6667px; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;This should show &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;NVIDIA Corp. APX&lt;/span&gt;&lt;/span&gt; or just &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;APX&lt;/span&gt;&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, we will start up the Ubuntu VM on the Mac laptop, but we need to make sure it can actually get access to the USB-connected Jetson. Before you start up the Ubuntu VM, for that VM in Virtualbox go to Settings -&amp;gt; Ports -&amp;gt; USB, and click &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Add new USB filters with all ....&lt;/span&gt;&lt;/span&gt;, then add &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;NVIDIA Corp. APX&lt;/span&gt;&lt;/span&gt;. Then, go to the VM, click the bottom right corner button with the shape of a USB port and select &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;NVIDIA Corp. APX&lt;/span&gt;&lt;/span&gt;. You &lt;i&gt;won&#39;t&lt;/i&gt; need to remove other USB devices from your Mac; I was able to get everything working fine with all my other USB devices (webcam, keyboard, etc.) plugged in.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once the Ubuntu VM is started again on the host Mac, double click the NVIDIA SDK Manager install again. Note that if you get a warning like the following you can just ignore it; just press &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Yes&lt;/span&gt;&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;border: none; display: inline-block; height: 284px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 535px;&quot;&gt;&lt;img height=&quot;213&quot; src=&quot;https://lh4.googleusercontent.com/r9TNou1jClIvGlW2CN76hnnSCPVaLwtAD1W_XjkcNDzktaD0lKHVWkU59O7QyzDUPq3TELmP3oQ0LVj3oi24wgRCkTp3uOp2zd3oHJzSB4tqdKYrj7bneeF8FwC5jbLSpX5pUDij=w400-h213&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;400&quot; /&gt;&lt;/span&gt;&lt;/div&gt;Once you continue with the NVIDIA SDK Manager install, you should now see that the Jetson TX2 is detected. At some point you will be prompted on the Jetson developer board&#39;s external monitor to continue installation. Go through that full flow on the Jetson itself until you get to the Jetson&#39;s login screen, then go back to your Mac&#39;s Ubuntu host VM.&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;You will have to go back to the Mac&#39;s Ubuntu VM&#39;s settings, select&amp;nbsp;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Ports&lt;/span&gt;&lt;/span&gt;, then click the &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;+&lt;/span&gt;&lt;/span&gt; button to add a new USB device. You will see &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;NVIDIA Linux for Tegra&lt;/span&gt;&lt;/span&gt; now -- select that, then press &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;OK&lt;/span&gt;&lt;/span&gt;.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;span id=&quot;docs-internal-guid-51912365-7fff-daf2-3b0b-c569878b57db&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;border: none; display: inline-block; height: 557px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 624px;&quot;&gt;&lt;img height=&quot;571&quot; src=&quot;https://lh5.googleusercontent.com/hH5YsvItg9Tfs9tYWP_bvszTE9JCoKrUFkCQ5raQqx2q9VYrTeb3TtTYfVOoU6ShhKoufsorEIfq5HJXViiK9Vit5nP0sOK9WgxsoCSiIXwe9hysWciA9fdcatIwAiNNVjoj8GHW=w640-h571&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately this new USB device &lt;i&gt;won&#39;t&lt;/i&gt; be seen by the host Ubuntu VM, so you will have to press the &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Skip&lt;/span&gt;&lt;/span&gt; button in the SDK Install Manager, then click &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Finish and Exit&lt;/span&gt;&lt;/span&gt;, then shut down the Mac&#39;s Ubuntu VM via the &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Power Off&lt;/span&gt;&lt;/span&gt; button again. Also shut down the Jetson itself by selecting the &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Shutdown&lt;/span&gt;&lt;/span&gt; option in its OS UI.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We will have to repeat the entire flow above, but we have now made the Mac&#39;s Ubuntu VM aware of the second USB driver (&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;NVIDIA Linux for Tegra&lt;/span&gt;&lt;/span&gt;). Put the device back into &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Force Recovery Mode&lt;/span&gt;&lt;/span&gt; by following the earlier instructions about which red buttons to push on the Jetson development board, start the Mac&#39;s Ubuntu VM again, and click back into the NVIDIA SDK Manager to restart the whole install flow. Once you do the device OS setup on the Jetson and get its sign in window, you should now be able to go back to your Mac host Ubuntu VM, enter your credentials, and the host VM will &quot;push over&quot; more of the Jetpack install.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img height=&quot;402&quot; src=&quot;https://lh3.googleusercontent.com/tD6sN09vUO69GFykDlC6JXREj6nV6wVUE88BA4rt9zEKpedOVXU-eWcpINE-LTnx-FpGSmTdNW6AdFkvJAUO0001xPmFU68lQxjP6BOvEqAxMjEgkq1ao2vU3gcJGUr4ypMUHvRV=w640-h402&quot; style=&quot;margin-left: 0px; margin-top: 0px; text-align: center;&quot; width=&quot;640&quot; /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;It will take awhile to install everything.&lt;div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;span style=&quot;border: none; display: inline-block; height: 221px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 624px;&quot;&gt;&lt;img height=&quot;227&quot; src=&quot;https://lh4.googleusercontent.com/5rnLF0eiInehswPvP-ofcs3Zr-2gUbZiZzZtvxR-JwIzV8xdQQXEdD6npugmIA_F_oIaZE-sug5Fysu4XdYCFagw1EjiD1o9h4ws6xymG11A9lFK8XoNeWiol8DiujHc4HBSmHWu=w640-h227&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-8bbb3914-7fff-25d3-a2ae-ba7dab881b85&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Once its installed, go back to your Jetson and confirm things installed correctly by opening a terminal on the external Jetson&#39;s monitor and run the following:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Validate NVCC&lt;br /&gt;nvcc -V&lt;br /&gt;&lt;br /&gt;# Validate CUDA&lt;br /&gt;ls /usr/local | grep cuda&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Back on the Mac&#39;s Ubuntu VM, pin the Terminal application to make it quicker to access -- click the dots in the lower left corner of Ubuntu&#39;s UI, search for Terminal, then start it. Once it&#39;s running you will see the Terminal app in the Ubuntu app switcher. Command-Click with your Mac mouse on the Terminal icon to simulate a right click and select &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Add to Favorites&lt;/span&gt;&lt;/span&gt; to pin it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Turn off the screenlock in the Ubuntu install on your Jetson or else it will get annoying; do this by going to &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Settings&lt;/span&gt;&lt;/span&gt; then &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;Brightness &amp;amp; Lock&lt;/span&gt;&lt;/span&gt; then turning it off.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On your host Mac&#39;s Ubuntu VM, you will see an &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;L4T-README&lt;/span&gt;&lt;/span&gt; directory that is exported via the Jetson USB connection. Double-click this to see some README files that are somewhat useful to read and know about:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;border: none; display: inline-block; height: 400px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 624px;&quot;&gt;&lt;img height=&quot;410&quot; src=&quot;https://lh4.googleusercontent.com/rlyg29zbmVcY7oqzwnsFbJiFVPkArzQTV4dse3eTP6V5rBubCbp20rcRhVQUrrnnPlFP-OoBcwvocOyswYlPkbfe18dTNnSpGYW_5uFVCpD6RpMaggKAhp2LTpeUcWOUxcWwPdTr=w640-h410&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;640&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-d3041079-7fff-d9a8-6af8-5509a2a58ff7&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Getting a Development Workflow Working with SSH and VNC&lt;/h1&gt;&lt;div&gt;The best dev workflow is to SSH directly from your Mac laptop into the Jetson itself, with the Jetson connected via an Ethernet connection to your Internet router/switch. This means you won&#39;t have to use either the Ubuntu VM on the Mac or a direct USB connection to the Jetson development board.&lt;br /&gt;&lt;br /&gt;Find the local IP address of your Jetson by using the external monitor and keyboard of the Jetson, open a terminal, then use the &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;ifconfig&lt;/span&gt;&lt;/span&gt; command. Search for &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;eth0&lt;/span&gt;&lt;/span&gt; in the output, then get the IP address from that. Then, go back to your Mac (not the Mac&#39;s Ubuntu VM), open a terminal, then SSH to this IP address. You will be prompted to enter your Jetson password; you will now be dumped into an SSH shell on your Jetson. Congrats!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;To prevent having to re-type your password constantly when you SSH or SCP from your Mac to the Jetson board, type the following via the Jetson&#39;s external monitor and keyboard into a terminal:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;mkdir -p ~/.ssh&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;On your Mac laptop outside of the Ubuntu VM, do the following:&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;export USERNAME=&amp;lt;change to your Jetson&#39;s username&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;export JETSON_IP=&amp;lt;change to eth0 IP address&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;scp ~/.ssh/id_rsa.pub $USERNAME@$JETSON_IP:./.ssh/authorized_keys&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At this point you can power down the Jetson, power down the Mac&#39;s Ubuntu VM, unplug the Jetson to ensure no static electricity hits the development board, touch some metal to discharge static electricity, then unplug the Jetson&#39;s USB from your Mac laptop. Now, power the Jetson back up and just use the &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;eth0&lt;/span&gt;&lt;/span&gt; IP address to SSH from your Mac into the Jetson itself. You don&#39;t even have to sign into the external monitor on the Jetson itself. Example SSH command:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;export USERNAME=&amp;lt;change to your Jetson&#39;s username&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;export JETSON_IP=&amp;lt;change to eth0 IP address&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;ssh $USERNAME $JETSON_IP&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;In your SSH session on your Mac, install a few useful things:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo apt install -y tmux htop curl vim less&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You will want to change the default Ubuntu &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo&lt;/span&gt; timeout, which is very short and which can get quite annoying in your Jetson development. To do so, run:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo visudo&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This will open a configuration file that has the following existing line:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Defaults&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; env_reset&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Change this to be the following:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Defaults&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; env_reset, timestamp_timeout=XX&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Where &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;XX&lt;/span&gt; is the timeout in minutes. I&#39;ve set that to &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;300&lt;/span&gt; (or 5 hours) in my own sudo settings.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By default &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;python3&lt;/span&gt; is installed; make sure &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;pip3&lt;/span&gt; is installed as well:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;sudo apt install python3-pip -y&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You will have to restart your Jetson after installing this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;sudo shutdown -r now&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can use the &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;tegrastats&lt;/span&gt;&lt;/span&gt; command when SSHed into the Jetson to get CPU/GPU/thermal/power details (the Jetson does not have the common &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;nvidia-smi&lt;/span&gt;&lt;/span&gt; command, using &lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;tegrastats&lt;/span&gt;&lt;/span&gt; instead).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A useful set of commands to get higher level Jetson stats is to&amp;nbsp;&lt;a href=&quot;https://pypi.org/project/jetson-stats/&quot;&gt;install the jetson-stats package&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;sudo -H pip3 install -U jetson-stats&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some example commands you can run after installing this (note that you do &lt;i&gt;not&lt;/i&gt;&amp;nbsp;have to use sudo for these): &lt;span style=&quot;background-color: #cccccc;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;jtop&lt;/span&gt;&lt;/span&gt;, &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;jetson_config&lt;/span&gt;, &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;jetson_release&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;To setup VNC between your Mac host and the Jetson, do the following. First, SSH into your Jetson and run the following:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo apt update&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo apt install vino&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Configure auto-login with GDM3. Open “/etc/gdm3/custom.conf” and uncomment or change the following lines:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;AutomaticLoginEnable=true&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;AutomaticLogin=nvidia&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Set up the VNC server for the user you wish to log in as. When you run &quot;vncserver&quot; for the first time on your Jetson, it will ask you to set a password. Just use the same password as your primary Jetson account for simplicity. Select NO when prompted if you want a view only password.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Enable the VNC server to start each time you log in&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;mkdir -p ~/.config/autostart&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;cp /usr/share/applications/vino-server.desktop ~/.config/autostart&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Configure the VNC server&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;gsettings set org.gnome.Vino prompt-enabled false&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;gsettings set org.gnome.Vino require-encryption false&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Replace thepassword with your desired password, the same as your Jetson account&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;gsettings set org.gnome.Vino authentication-methods &quot;[&#39;vnc&#39;]&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;gsettings set org.gnome.Vino vnc-password $(echo -n &#39;thepassword&#39;|base64)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Make sure we get close/minimize/maximize settings, which you will get when you hover over the window titlebar&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;gsettings set org.gnome.desktop.wm.preferences button-layout &quot;close,minimize,maximize:&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Reboot the system so the settings take effect&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;On your Mac laptop, start an SSH proxy for VNC:&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;export USERNAME=&amp;lt;change to your Jetson&#39;s username&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;export JETSON_IP=&amp;lt;change to eth0 IP address&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;ssh -L 5900:127.0.0.1:5900 -C -N -l $USERNAME $JETSON_IP&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now use a Mac VNC client, such as &lt;a href=&quot;https://www.realvnc.com/en/connect/download/viewer/macos/&quot;&gt;VNC Viewer,&lt;/a&gt;&amp;nbsp;to sign into the eth0 IP address at the 5900 port.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Inside of a VNC session on your Jetson, if you have an Ubuntu Terminal open, you can open a new terminal tab by pressing &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Shift-Control-T&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note that at this point you can choose to boot your Jetson TX2 in the future &lt;i&gt;without&lt;/i&gt;&amp;nbsp;a keyboard or external monitor. It will boot up as normal -- wait a few minutes then you can SSH in. Surprisingly, even VNC will work fine without an external monitor hooked up!&lt;/div&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Use Jetson From Outside Local Network&lt;/h1&gt;&lt;div&gt;The flow above only allows you to SSH into your Jetson from within your immediate local area network, since the &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;eth0&lt;/span&gt; address you&#39;ve been using so far is a private address. If you want to sign in and develop from outside your network, or allow colleagues to also develop on your Jetson, you need to securely make it possible to access the Jetson from outside your network. Please be conscious of the security ramifications of doing this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You will need to use port forwarding to do this. Before you setup the port forwarding, you will need to ensure you have a stable external IP address. If you don&#39;t, you will have to use a dynamic DNS service. I used &lt;a href=&quot;http://no-ip.com&quot;&gt;no-ip.com&lt;/a&gt; using their free option and will document how to set it up.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In a VNC session on the Jetson, use a web browser to navigate to &lt;a href=&quot;https://noip.com/download&quot;&gt;https://noip.com/download&lt;/a&gt; to download their dynamic DNS updater for Linux. This will compile and install a &lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;noip2&lt;/span&gt; command line tool:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;tar -zxvf noip-duc-linux.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;cd noip-duc-linux&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;make&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo make install&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Make sure the command is present; if not copy it there.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;ls /usr/local/bin/noip2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo chmod a+x /usr/local/bin/noip2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To make sure noip2 starts on system startup, get a systemd script running. Run the following commands in your SSH session on the Jetson:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Generate configuration file&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo /usr/local/bin/noip2 -C&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Add the following systemd script&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo cat &amp;gt;&amp;gt; /etc/systemd/system/noip2.service &amp;lt;&amp;lt;EOL&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;[Unit]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Description=No-ip.com dynamic IP address updater&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;After=network.target&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;After=syslog.target&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;[Install]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;WantedBy=multi-user.target&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Alias=noip.service&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;[Service]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Start main service&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;ExecStart=/usr/local/bin/noip2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Restart=always&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;Type=forking&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;EOL&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Restart and enable systemd services&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo systemctl daemon-reload&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo systemctl enable noip2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo systemctl start noip2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Make sure everything is running fine&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo systemctl status noip2&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now we will setup port forwarding for SSH, to &quot;poke&quot; a hole in the external router to allow inbound connections to the Jetson. You will have to look at details for your particular home router on how to this. For my own router, a LinkSys router, I used the&amp;nbsp;&lt;a href=&quot;https://www.linksys.com/ru/support-article?articleNum=138535&quot;&gt;following instructions&lt;/a&gt;. I went to&amp;nbsp;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;192.168.1.1&lt;/span&gt; to get the router admin screen. Note that its important that you &lt;b&gt;DO NOT&lt;/b&gt; use the default SSH port 22 as your external port for security reasons, but choose a random port. In the example admin screenshots below private details, such as the external SSH port chosen, have been fuzzed out.&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; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit057fqYcSsAubMaM9gd4If3U7eaabz3VTRGltzin0FDCcPZLRGNWR-2ZALrznxuFl9orpUglgfrI8YYegSDin0170ROjhqdoJdXb4Ad2uFKU8H2xURn_W4F7HrCr2CSsutzfS/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;162&quot; data-original-width=&quot;624&quot; height=&quot;166&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit057fqYcSsAubMaM9gd4If3U7eaabz3VTRGltzin0FDCcPZLRGNWR-2ZALrznxuFl9orpUglgfrI8YYegSDin0170ROjhqdoJdXb4Ad2uFKU8H2xURn_W4F7HrCr2CSsutzfS/w640-h166/admin1.png&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;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/AVvXsEh37CDZ5ZB4ie5RKyKShz2GEUW76Atdr2LtSY8uNbuak1cH0LY1nq8clW3sCV_-Tdid8eXU1lYSutv5ZkdHtBZmxGOsXsp_2Kr2vEHp23gjOKmOhJm3gT_HE3Y2C-CNUExqy96o/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;171&quot; data-original-width=&quot;626&quot; height=&quot;174&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh37CDZ5ZB4ie5RKyKShz2GEUW76Atdr2LtSY8uNbuak1cH0LY1nq8clW3sCV_-Tdid8eXU1lYSutv5ZkdHtBZmxGOsXsp_2Kr2vEHp23gjOKmOhJm3gT_HE3Y2C-CNUExqy96o/w640-h174/admin2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;Now to SSH from a computer outside of your local network:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;export USERNAME=&amp;lt;Jetson user account name&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;export DYN_HOST_NAME=&amp;lt;Dynamic DNS name from noip.com, such as foobar.hopto.org&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;export EXTERNAL_SSH_PORT=&amp;lt;The random external SSH port you chose, such as 301&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;ssh $DYN_HOST_NAME -p $EXTERNAL_SSH_PORT&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here&#39;s how you can use SCP to copy something over:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;scp -P $EXTERNAL_SSH_PORT $USERNAME:/some/path/file.txt .&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Example usage of RSYNC:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;rsync -Pavz -e &quot;ssh -p $EXTERNAL_SSH_PORT&quot; . $USERNAME@$DYN_HOST_NAME:~&amp;nbsp;--exclude .git&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In order to now VNC over this external SSH connection, run a local SSH proxy for the VNC session:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;ssh -L 5900:127.0.0.1:5900 -C -N -l $USERNAME -p $EXTERNAL_SSH_PORT $DYN_HOST_NAME&lt;/span&gt;&lt;/div&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-weight: 400;&quot;&gt;Use a VNC client on your Mac to connect to &lt;span style=&quot;background-color: #cccccc;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;localhost:5900&lt;/span&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Mount External SSD&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Jetson TX2 has a 32GB eMMC flash storage; however, this can get full very quickly, especially if you are experimenting with multiple Docker containers being available or having large amounts of machine learning oriented data.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This section documents how to install an NVMe SSD drive onto the Jetson board. The Jetson has an M.2 connector, which is normally used for attached SSD drives, but the Jetson&#39;s M.2 connector is a type &quot;Key E&quot; port and is therefore not compatible with SSD drives. Instead, we will use the Jetson&#39;s on-board PCIe Gen2 x4 connector with an M.2 adapter. PCIe Gen2 x4 has a max IO of 2 GB per second, so it can keep up with NVMe drives (be careful not to purchase an NVMe drive that is &lt;i&gt;faster&lt;/i&gt;&amp;nbsp;than 2 GB/s, or else you will just be wasting money on a drive that is faster than the PCIe Gen2 x4 connector on the Jetson can accommodate).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I purchased a PCIe to M.2 adapter at a &lt;a href=&quot;https://www.centralcomputer.com/&quot;&gt;local computer store&lt;/a&gt;; it was only $12.95:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;border: none; display: inline-block; height: 832px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 624px;&quot;&gt;&lt;img height=&quot;832&quot; src=&quot;https://lh3.googleusercontent.com/q2gygficThBfyhXiV0s28wCIk2wgniby1JXjbBEv_gUfutWVIYLAush_NgGvz2Asi8fpbGt9nDTzi_yx7oezq7iMN1yVg_3JU5Qm4TzBd0hZaX2HbDc7agA2K7Gi64BIxv35D8sX&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;624&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-4a10791a-7fff-4bd3-585c-d88c621e30c7&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also purchased a &lt;a href=&quot;https://www.samsung.com/semiconductor/minisite/ssd/product/consumer/970evoplus/&quot;&gt;1 TB NVMe SSD Samsung drive&lt;/a&gt; to plug into the adapter:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;border: none; display: inline-block; height: 832px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 624px;&quot;&gt;&lt;img height=&quot;832&quot; src=&quot;https://lh6.googleusercontent.com/UkLlVTbPmvWoTH1eK82bIi0-UK6bcBvQOU2BJBczGoFiINjuUOSY80o7lW8LyjpVno-OtbXDC8XJyYjPxURW9kNwxLoiHO_EPjQU8vgfjB5-UuNBaAzwT8yeisMJnt_tXOqCKcRA&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;624&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-9a923b22-7fff-e2f8-509d-dbc53c5c87b2&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here are both put together and mounted onto the Jetson board (remember to unplug the Jetson and ground any static electricity on yourself before mounting these items!):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;border: none; display: inline-block; height: 468px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 624px;&quot;&gt;&lt;img height=&quot;468&quot; src=&quot;https://lh5.googleusercontent.com/yFF-HwMqj6Ln2Oa-4JQgh18am6GYqLny6JOMhlpX-TwO-YoEVVspd5WkWcRqWRV1Sew_y1k0BA-ZwGZrwpmeIRnRAQAHFzozrGJSB7GnAiLHHywbOCEzVR3HGCz1rsWojn33mcHo&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;624&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-e330bb2a-7fff-9664-2edd-9167078df340&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;border: none; display: inline-block; height: 832px; margin-left: 1em; margin-right: 1em; overflow: hidden; width: 624px;&quot;&gt;&lt;img height=&quot;832&quot; src=&quot;https://lh6.googleusercontent.com/0hXnkYK8T1g05vvEEyhZjR7BG7zVd1UxDCa4ujr9bS6WZlRL9jx6tlD7n4pHI8CFvroBUuXNzWLvulMMfTsjI3c6qYTB9eF2RDSYvsW2Ky0gNJdZwP8ceUznzfltKUDLbskxvzzT&quot; style=&quot;margin-left: 0px; margin-top: 0px;&quot; width=&quot;624&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span id=&quot;docs-internal-guid-2b002990-7fff-bb2a-c927-2fef48984945&quot;&gt;&lt;span style=&quot;font-family: Arial; font-size: 11pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once the machine is restarted, SSH back into the Jetson and compile and mount the SSD drive:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# SSD should show up as nvme0n1 on this command:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;lsblk&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Format the drive&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo mkfs.ext4 -F /dev/nvme0n1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo mkdir -p /mnt/disks/ssd&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo mount /dev/nvme0n1 /mnt/disks/ssd&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Make sure the new drive shows up here:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;df --h&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Let everyone access it&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo chmod a+rxw /mnt/disks/ssd&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Automount the disk on startup&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;echo UUID=`sudo blkid -s UUID -o value /dev/nvme0n1` /mnt/disks/ssd ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;cat /etc/fstab # Make sure the new line shows up correctly&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Benchmark to see how the IO is&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo apt install hdparm&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;for run in {1..3}; do sudo hdparm -Tt /dev/nvme0n1; done&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Example output, pretty good IO for reads:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;/dev/nvme0n1:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp;Timing cached reads:&amp;nbsp; &amp;nbsp;3898 MB in&amp;nbsp; 2.00 seconds = 1950.98 MB/sec&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp;Timing buffered disk reads: 2834 MB in&amp;nbsp; 3.00 seconds = 944.28 MB/sec&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;/dev/nvme0n1:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp;Timing cached reads:&amp;nbsp; &amp;nbsp;3730 MB in&amp;nbsp; 2.00 seconds = 1867.07 MB/sec&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp;Timing buffered disk reads: 3050 MB in&amp;nbsp; 3.00 seconds = 1016.14 MB/sec&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;/dev/nvme0n1:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp;Timing cached reads:&amp;nbsp; &amp;nbsp;3892 MB in&amp;nbsp; 2.00 seconds = 1947.68 MB/sec&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp;Timing buffered disk reads: 2856 MB in&amp;nbsp; 3.00 seconds = 951.78 MB/sec&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Do daily trimming of the SSD (TRIM garbage collection) to keep performance tip-top&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo mkdir -v /etc/systemd/system/fstrim.timer.d&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo touch /etc/systemd/system/fstrim.timer.d/override.conf&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo vim /etc/systemd/system/fstrim.timer.d/override.conf&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Add the following into the document (note the double entries for OnCalendar is intentional!)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;[Timer]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;OnCalendar=&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;OnCalendar=daily&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Save and reboot. Confirm TRIM is correct, ensuring the new override is at the bottom:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;systemctl cat fstrim.timer&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# At any point you can run the following to ensure TRIMing actually has happened; probably&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# won&#39;t show anything the first time.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;journalctl | grep fstrim.service&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Force trim manually - might last for minutes, just be patient&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo fstrim -av&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Configure Docker to store all of its images and containers on the SSD&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo docker version # Make sure Docker reports its running&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo service docker stop # Now stop it&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo vim /etc/docker/daemon.json&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Make sure this JSON file has the following new &quot;data-root&quot; property:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;runtimes&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;nvidia&quot;: {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;path&quot;: &quot;nvidia-container-runtime&quot;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;runtimeArgs&quot;: []&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; },&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &quot;data-root&quot;: &quot;/mnt/disks/ssd/docker&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Save and exit&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;mkdir -p /mnt/disks/ssd/docker&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Copy current data over to new path&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo rsync -aP /var/lib/docker /mnt/disks/ssd/docker&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Temporarily rename old location for sanity check&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo mv /var/lib/docker /var/lib/docker.old&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Restart docker&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo service docker start&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Make sure the following two commands run without error&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo docker image ls&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo docker container ls&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Now you can remove the old data&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo rm -rf /var/lib/docker.old&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo docker image prune -a -f&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Move all home directories to SSD&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;mkdir -p /mnt/disks/ssd/home&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo rsync -aXS /home/. /mnt/disks/ssd/home/.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo mv /home /home_old&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;ls /mnt/disks/ssd/home # Make sure everything is there&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo ln -s /mnt/disks/ssd/home /home&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;ls -al / # Make sure the symbolic link is correct&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo rm -fr /home_old&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Example Machine Learning Package Installation&lt;/h1&gt;&lt;div&gt;The Jetson has an ARM CPU, so you will have to compile most Python packages yourself for the ARM architecture since there are most likely no ARM pip wheels available. In the example commands below, we setup a virtualenv, Python 3.6, and compile and install several common geospatial and machine learning packages on the Jetson.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Make sure various apt tools are available&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo apt-get install -y software-properties-common&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Setup a Python 3 virtualenv&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo apt-get install python3-venv&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;python3 -m venv test-arm-compile&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;source test-arm-compile/bin/activate&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;python --version # Should be 3.6.9&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Make sure certain Python dev files are available for later compilation dependencies.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo apt-get install python3.6-dev&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;pip install wheel&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Make sure Cython is available, which is a Numpy dependency.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;pip install cython&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;python -c &quot;import cython&quot; # Make sure this runs without error&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Install numpy; print out detailed info during compilation as it can take awhile.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;pip install numpy -v&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;python -c &quot;import numpy as np; print(np.array([2, 3, 4]))&quot; # Make sure runs without error&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Install various geospatial ecosystem libraries&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo add-apt-repository ppa:ubuntugis/ppa&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo apt-get install gdal-bin libgdal-dev python-gdal --yes&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;pip install rasterio -v&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;# Install OpenCV&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;sudo apt install python3-opencv&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;pip install --upgrade pip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;pip install opencv-python-headless -v&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: #cccccc; font-family: courier;&quot;&gt;python -c &quot;import cv2; print(cv2.__version__)&quot; # Should print out a version number, like 4.4.0&lt;/span&gt;&lt;/div&gt;&lt;h1 style=&quot;text-align: left;&quot;&gt;Appendix&lt;/h1&gt;&lt;div&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Thanks to the following guides which were used for some of the details creating this HOWTO:&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.blogger.com/u/1/#&quot;&gt;https://github.com/KleinYuan/tx2-flash#2-install-virtual-box-and-extensions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.blogger.com/u/1/#&quot;&gt;https://codingwithmanny.medium.com/installing-ubuntu-18-04-on-mac-os-with-virtualbox-ac3b39678602&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.blogger.com/u/1/#&quot;&gt;https://gist.github.com/NathanGiesbrecht/da6560f21e55178bcea7fdd9ca2e39b5&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Previous post:&amp;nbsp;&lt;a href=&quot;http://blog.codinginparadise.org/2021/01/howto-getting-productive-development.html&quot;&gt;HOWTO: Setting Up NVIDIA Jetson TX2 &amp;lt;-&amp;gt; Mac Laptop Development Workflow&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/3296594883344190718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=3296594883344190718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/3296594883344190718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/3296594883344190718'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2021/01/howto-getting-productive-development.html' title='HOWTO: Setting Up NVIDIA Jetson TX2 &lt;-&gt; Mac Laptop Development Workflow'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjy1t3imWfN41D3XDc1wPUDPQEqsLhRFie4N1RxbcMaSwM0EKU19iQ84T2lYsxMW2QG5HEo815yk26M6gRnp_W_rsG_IPe4qaimfsHM_H4HxH2c_ZRJgSEb-wSpt9NM51Fejb3T/s72-w400-h300-c/jetson1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-3763758119461647938</id><published>2020-02-10T12:40:00.000-08:00</published><updated>2020-02-10T12:41:45.812-08:00</updated><title type='text'>Joining Planet!</title><content type='html'>&lt;div style=&quot;text-align: center;&quot;&gt;
  14. &lt;/div&gt;
  15. &lt;div style=&quot;text-align: center;&quot;&gt;
  16. &lt;a href=&quot;https://www.blogger.com/blogger.g?blogID=3191291&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;/a&gt;&lt;img alt=&quot;Image result for planet labs&quot; src=&quot;https://thumbs-prod.si-cdn.com/cMGla9KLS2XC7hSwEVOPxw-3T98=/420x240/https://public-media.si-cdn.com/filer/d3/fb/d3fb245e-af07-4582-a75a-26920d28b16c/planet-deployment-flock.jpg&quot; /&gt;&lt;/div&gt;
  17. &lt;br /&gt;
  18. I&#39;m excited to announce I&#39;m joining the machine learning team at Planet! I will be applying machine and deep learning to remote sensing imagery of the Earth&#39;s surface. Planet has built a constellation of nanosats in Low Earth Orbit that image the entirety of the Earth daily to monitor changes and pinpoint trends. The ultimate goal is to enable a &lt;a href=&quot;https://www.planet.com/pulse/queryable-earth-our-vision-for-making-daily-global-imagery-accessible-and-actionable/&quot;&gt;Queryable Earth&lt;/a&gt;, indexing physical change on Earth and making it searchable for all. I&#39;m excited that I&#39;ll continue to get working at the intersection of space and machine learning. My first day is Tuesday, February 18th.&lt;br /&gt;
  19. &lt;br /&gt;
  20. &lt;br /&gt;
  21. &lt;div style=&quot;text-align: center;&quot;&gt;
  22. &lt;/div&gt;
  23. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/3763758119461647938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=3763758119461647938' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/3763758119461647938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/3763758119461647938'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2020/02/joining-planet.html' title='Joining Planet!'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-4655890833315849107</id><published>2018-10-10T09:57:00.001-07:00</published><updated>2019-03-26T15:08:55.964-07:00</updated><title type='text'>Using machine learning to index text from billions of images</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  24. &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
  25. &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTDGE1yv4YA4XKnQ9P2E569r4sbTbY5ovGSfG9uDheAVDfrz3ll4nIYrkwkJIQYZqHzUWyfkAxwbcVNV_s5aGhCL2SqfecLEepnbiF2_6FfKLl_NM2pjqI3H2qt3FaqBnoStFS/s1600/autoocr-web.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;760&quot; data-original-width=&quot;1300&quot; height=&quot;233&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTDGE1yv4YA4XKnQ9P2E569r4sbTbY5ovGSfG9uDheAVDfrz3ll4nIYrkwkJIQYZqHzUWyfkAxwbcVNV_s5aGhCL2SqfecLEepnbiF2_6FfKLl_NM2pjqI3H2qt3FaqBnoStFS/s400/autoocr-web.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
  26. &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
  27. &lt;/div&gt;
  28. &lt;br /&gt;
  29. The last year and a half I&#39;ve led a project on the Dropbox Machine Learning team to take the &lt;a href=&quot;http://blog.codinginparadise.org/2017/04/creating-modern-ocr-pipeline-using.html&quot;&gt;computer vision/deep learning OCR pipeline&lt;/a&gt; I built the year before and automatically run it and several other advanced machine learning models on billions of images daily in Dropbox to extract text for search. This turned out to be one of the largest computational projects Dropbox has ever done. The feature went live yesterday.&lt;br /&gt;
  30. &lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;a href=&quot;https://blogs.dropbox.com/tech/2018/10/using-machine-learning-to-index-text-from-billions-of-images/&quot;&gt;Dive into the technical details&lt;/a&gt; of how we built this on the Dropbox technical blog.&lt;br /&gt;
  31. &lt;br /&gt;
  32. &lt;br /&gt;&lt;/div&gt;
  33. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/4655890833315849107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=4655890833315849107' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/4655890833315849107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/4655890833315849107'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2018/10/using-machine-learning-to-index-text.html' title='Using machine learning to index text from billions of images'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTDGE1yv4YA4XKnQ9P2E569r4sbTbY5ovGSfG9uDheAVDfrz3ll4nIYrkwkJIQYZqHzUWyfkAxwbcVNV_s5aGhCL2SqfecLEepnbiF2_6FfKLl_NM2pjqI3H2qt3FaqBnoStFS/s72-c/autoocr-web.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-2974684015391775931</id><published>2017-04-12T11:00:00.000-07:00</published><updated>2017-05-31T11:01:46.685-07:00</updated><title type='text'>Creating a Modern OCR Pipeline Using Computer Vision and Deep Learning</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  34. &lt;span style=&quot;background-color: white; color: #5e676d; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;In this post we will take you behind the scenes on how we built a state-of-the-art Optical Character Recognition (OCR) pipeline for our&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://blogs.dropbox.com/dropbox/2016/06/new-dropbox-productivity-tools/&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #007ee5; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 14px; margin: 0px; outline: 0px; padding: 0px; text-decoration-line: none; vertical-align: baseline;&quot;&gt;mobile document scanner&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #5e676d; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;. We used computer vision and deep learning advances such as bi-directional Long Short Term Memory (LSTMs), Connectionist Temporal Classification (CTC), convolutional neural nets (CNNs), and more. In addition, we will also dive deep into what it took to actually make our OCR pipeline production-ready at Dropbox scale.&lt;/span&gt;&lt;br /&gt;
  35. &lt;span style=&quot;background-color: white; color: #5e676d; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
  36. &lt;span style=&quot;background-color: white; color: #5e676d; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 14px;&quot;&gt;&lt;a href=&quot;https://blogs.dropbox.com/tech/2017/04/creating-a-modern-ocr-pipeline-using-computer-vision-and-deep-learning/&quot;&gt;Read more...&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
  37. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/2974684015391775931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=2974684015391775931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/2974684015391775931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/2974684015391775931'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2017/04/creating-modern-ocr-pipeline-using.html' title='Creating a Modern OCR Pipeline Using Computer Vision and Deep Learning'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-2583152955925585813</id><published>2016-12-12T18:19:00.000-08:00</published><updated>2016-12-12T18:19:04.102-08:00</updated><title type='text'>Notes from Neural Network NIPS 2016 conference</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  38. I&#39;ve put up all my notes from the NIPS 2016 conference in Barcelona &lt;a href=&quot;https://paper.dropbox.com/doc/Brad-Neubergs-NIPS-2016-Notes-XUFRdpNYyBhau0gWcybRo&quot;&gt;here&lt;/a&gt;. It includes lots of deep and reinforcement learning talks, paper sessions, and more. Hopefully these notes are useful for you!&lt;/div&gt;
  39. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/2583152955925585813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=2583152955925585813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/2583152955925585813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/2583152955925585813'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2016/12/notes-from-neural-network-nips-2016.html' title='Notes from Neural Network NIPS 2016 conference'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-4304963971223325155</id><published>2016-01-22T14:37:00.001-08:00</published><updated>2016-01-22T14:38:21.369-08:00</updated><title type='text'>Some Surprising Results of What it Would Take to Transport a Million People to Mars</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  40. Elon Musk of SpaceX has said &lt;a href=&quot;http://waitbutwhy.com/2015/08/how-and-why-spacex-will-colonize-mars.html&quot;&gt;he wants to send one million people to Mars&lt;/a&gt;. What would it take in terms of the transport side of the equation to actually make this happen?&lt;br /&gt;
  41. &lt;br /&gt;
  42. My good friend &lt;a href=&quot;http://eetd.lbl.gov/people/jeffery-greenblatt&quot;&gt;Jeffery Greenblatt &lt;/a&gt;analyzes emerging technologies to answer questions exactly like this; for example, he recently published a &lt;a href=&quot;http://www.nature.com/nclimate/journal/v5/n9/full/nclimate2685.html&quot;&gt;scientific paper in Nature Climate Change&lt;/a&gt; on the impact of autonomous cars on greenhouse-gas emissions.&lt;br /&gt;
  43. &lt;br /&gt;
  44. He has now turned his attention to the transport side of getting a large population to Mars:&lt;br /&gt;
  45. &lt;br /&gt;
  46. &lt;blockquote class=&quot;tr_bq&quot;&gt;
  47. &quot;We perform the first comprehensive assessment of the energy, resource and infrastructure requirements of a large-scale human transport system between Earth and Mars. In it, we develop credible mass estimates for a system consisting of four appropriately-sized reusable spacecraft to move humans, and four additional types of reusable spacecraft for moving propellant (hydrogen/oxygen and methane/oxygen) from the Moon and Mars to in-orbit depots. Human consumables (air, water, food) and cargo mass estimates were included in the analysis. We base our estimates on public sources, and develop scenarios of infrastructure scale-up to achieve a Mars settlement size of 1 million people by the first half of the 22nd century. We do not examine the requirements of the Mars settlement itself.&quot;&lt;/blockquote&gt;
  48. &lt;br /&gt;
  49. His result uncovers some surprising repercussions of such large-scale transport; see &lt;a href=&quot;http://tinyurl.com/j7cweyx&quot;&gt;his blog post&lt;/a&gt;&amp;nbsp;and the &lt;a href=&quot;http://tinyurl.com/MarsTransportPaper&quot;&gt;paper itself&lt;/a&gt; for more details.&lt;/div&gt;
  50. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/4304963971223325155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=4304963971223325155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/4304963971223325155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/4304963971223325155'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2016/01/some-surprising-results-of-what-it.html' title='Some Surprising Results of What it Would Take to Transport a Million People to Mars'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-6245662295861614512</id><published>2016-01-05T09:00:00.000-08:00</published><updated>2016-01-05T12:01:31.432-08:00</updated><title type='text'>Cloudless: Open Source Deep Learning Pipeline for Orbital Satellite Data</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  51. I&#39;m proud to announce the &lt;a href=&quot;https://github.com/BradNeuberg/cloudless&quot;&gt;1.0 release of Cloudless&lt;/a&gt;, an open source computer vision pipeline for orbital satellite data, powered by data from Planet Labs and using deep learning under the covers. This blog post contains details and a technical report on the project.&lt;br /&gt;
  52. &lt;br /&gt;
  53. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/introducing_cloudless.html&quot;&gt;Read more...&lt;/a&gt;&lt;/div&gt;
  54. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/6245662295861614512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=6245662295861614512' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/6245662295861614512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/6245662295861614512'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2016/01/cloudless-open-source-deep-learning.html' title='Cloudless: Open Source Deep Learning Pipeline for Orbital Satellite Data'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-8319271898963211122</id><published>2015-12-13T14:19:00.002-08:00</published><updated>2015-12-13T14:19:39.699-08:00</updated><title type='text'>Ten Deep Learning Trends I Saw at NIPS 2015</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  55. I attended the Neural Information Processing Systems (NIPS) 2015 conference this week in Montreal. It was an incredible experience, like drinking from a firehose of information. Special thanks to my employer Dropbox for sending me to the show (&lt;a href=&quot;https://www.dropbox.com/jobs&quot;&gt;we&#39;re hiring!&lt;/a&gt;)&lt;br /&gt;
  56. Here&#39;s some of the trends I noticed this week; note that they are biased towards deep and reinforcement learning as those are the tracks I attended at the conference:&lt;br /&gt;
  57. &lt;br /&gt;
  58. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/ten_deep_learning_trends_at_nips_2015.html&quot;&gt;Read more...&lt;/a&gt;&lt;/div&gt;
  59. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/8319271898963211122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=8319271898963211122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/8319271898963211122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/8319271898963211122'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2015/12/ten-deep-learning-trends-i-saw-at-nips.html' title='Ten Deep Learning Trends I Saw at NIPS 2015'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-3815978284572174542</id><published>2015-12-10T08:11:00.003-08:00</published><updated>2015-12-10T08:11:52.219-08:00</updated><title type='text'>NIPS Day 3 Posters</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  60. These are the posters that caught my eye on the third day of NIPS. Note that they are HDR images, so zoom in using your computer to see more detail. Some of the posters below have extra images focusing on specific parts of the poster to give more visual detail.&lt;br /&gt;
  61. &lt;br /&gt;
  62. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/nips_day_3_posters.html&quot;&gt;Read more...&lt;/a&gt;&lt;/div&gt;
  63. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/3815978284572174542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=3815978284572174542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/3815978284572174542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/3815978284572174542'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2015/12/nips-day-3-posters.html' title='NIPS Day 3 Posters'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-5514459353968910708</id><published>2015-12-09T12:38:00.002-08:00</published><updated>2015-12-09T12:38:09.917-08:00</updated><title type='text'>NIPS Day 3 Morning Sessions</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  64. These are my notes from the morning sessions of day 3 of NIPS.&lt;br /&gt;
  65. &lt;br /&gt;
  66. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/nips_day_3_morning_sessions.html&quot;&gt;Read more...&lt;/a&gt;&lt;/div&gt;
  67. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/5514459353968910708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=5514459353968910708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/5514459353968910708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/5514459353968910708'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2015/12/nips-day-3-morning-sessions.html' title='NIPS Day 3 Morning Sessions'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-5646965759589209978</id><published>2015-12-08T20:41:00.002-08:00</published><updated>2015-12-08T20:41:40.908-08:00</updated><title type='text'>NIPS Day 1: Tutorials on Scaling Deep Learning, Probabilistic Programming, and Reinforcement Learning</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  68. &lt;div data-uuid=&quot;c20058eaec2548639a8566177af65038&quot;&gt;
  69. I&#39;m at my first annual &lt;a href=&quot;https://nips.cc/&quot;&gt;NIPS conference&lt;/a&gt; this year in Montreal, the annual pow-wow for machine learning and deep learning in particular.&lt;/div&gt;
  70. &lt;div data-uuid=&quot;c20058eaec2548639a8566177af65038&quot;&gt;
  71. &lt;br /&gt;&lt;/div&gt;
  72. &lt;div data-uuid=&quot;185428f0b2b6479b8b6cc5d8da016c20&quot;&gt;
  73. Monday, the first day, had several multi-hour in-depth tutorials from literally the folks that wrote the textbooks in these areas. I attended sessions on scaling deep learning via TensorFlow, presented by Google folks like Jeff Dean; a deep dive into probabilistic programming (being able to describe a statistical system and allow an inference engine to do the hard work of building a model from it); and an introduction to reinforcement learning (using a scalar reward signal to automatically discover the optimal policy for a behavior).&lt;/div&gt;
  74. &lt;div data-uuid=&quot;185428f0b2b6479b8b6cc5d8da016c20&quot;&gt;
  75. &lt;br /&gt;&lt;/div&gt;
  76. &lt;div data-uuid=&quot;185428f0b2b6479b8b6cc5d8da016c20&quot;&gt;
  77. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/nips_day_1.html&quot;&gt;Read more...&lt;/a&gt;&lt;/div&gt;
  78. &lt;/div&gt;
  79. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/5646965759589209978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=5646965759589209978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/5646965759589209978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/5646965759589209978'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2015/12/nips-day-1-tutorials-on-scaling-deep.html' title='NIPS Day 1: Tutorials on Scaling Deep Learning, Probabilistic Programming, and Reinforcement Learning'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-8817169971185871299</id><published>2015-10-12T18:34:00.002-07:00</published><updated>2015-10-12T18:34:37.333-07:00</updated><title type='text'>Intelligence Augmentation and the Myth of the “Golden Lost Age”</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  80. &lt;br /&gt;
  81. &lt;div&gt;
  82. &lt;div style=&quot;text-align: center;&quot;&gt;
  83. &lt;img alt=&quot;&quot; src=&quot;http://codinginparadise.org/ebooks/img/chapter03/255-1968-practice-demo.jpg&quot; data-uuid=&quot;3f9895097bc545a5aa49577213f5825d&quot; width=&quot;75%&quot; /&gt;&lt;/div&gt;
  84. &lt;/div&gt;
  85. &lt;br /&gt;
  86. &lt;div data-uuid=&quot;df4fd65d9b794f3681162b49c633c3eb&quot;&gt;
  87. &lt;a href=&quot;https://vanemden.wordpress.com/2015/10/09/ia-or-ai-2/&quot;&gt;Maarten van Emden has a great piece&lt;/a&gt; on Douglas Engelbart and Intelligence Augmentation (IA) versus Artificial Intelligence (AI). First go read that piece then come back here :) This post follows up a bit and comments on some of what Maarten says.&lt;br /&gt;
  88. &lt;br /&gt;&lt;/div&gt;
  89. &lt;div data-uuid=&quot;c7c9e8e852864446a77cab0baa667761&quot;&gt;
  90. Most people don&#39;t realize that much of the computer industry has been about the struggle between two worlds, IA and AI. &lt;a href=&quot;https://twitter.com/markoff&quot;&gt;John Markoff&lt;/a&gt; has chronicled the tension between both of these well with his books &lt;a href=&quot;http://www.amazon.com/What-Dormouse-Said-Counterculture-Personal/dp/0143036769&quot;&gt;What the Dormouse Said: How the Sixties Counterculture Shaped the Personal Computer Industry&lt;/a&gt; and his newest book, &lt;a href=&quot;http://www.amazon.com/Machines-Loving-Grace-Common-Between/dp/0062266683&quot;&gt;Machines of Loving Grace: The Quest for Common Ground Between Humans and Robots&lt;/a&gt;.&lt;/div&gt;
  91. &lt;div data-uuid=&quot;c7c9e8e852864446a77cab0baa667761&quot;&gt;
  92. &lt;br /&gt;&lt;/div&gt;
  93. &lt;div data-uuid=&quot;c7c9e8e852864446a77cab0baa667761&quot;&gt;
  94. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/ia_vs__ai.html&quot;&gt;Read more...&lt;/a&gt;&lt;/div&gt;
  95. &lt;/div&gt;
  96. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/8817169971185871299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=8817169971185871299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/8817169971185871299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/8817169971185871299'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2015/10/intelligence-augmentation-and-myth-of.html' title='Intelligence Augmentation and the Myth of the “Golden Lost Age”'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-1151160470868907113</id><published>2015-09-21T22:42:00.001-07:00</published><updated>2015-09-21T22:47:05.107-07:00</updated><title type='text'>Personal Photos Model Using Deep Learning</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  97. &lt;br /&gt;
  98. &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
  99. &lt;a href=&quot;http://codinginparadise.org/ebooks/img/chapter03/photo-256887_1280.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://codinginparadise.org/ebooks/img/chapter03/photo-256887_1280.jpg&quot; height=&quot;211&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
  100. &lt;div data-uuid=&quot;e48b2158cac0406aa42a26ceb7e893db&quot;&gt;
  101. &lt;br /&gt;&lt;/div&gt;
  102. &lt;div data-uuid=&quot;e48b2158cac0406aa42a26ceb7e893db&quot;&gt;
  103. I&#39;ve spent the last year going deep into deep learning, machine vision, and autonomous systems. I&#39;ve completed two Coursera courses, &lt;a href=&quot;https://www.coursera.org/learn/machine-learning&quot;&gt;Andrew Ng&#39;s Introduction to Machine Learning&lt;/a&gt; and &lt;a href=&quot;https://www.coursera.org/course/neuralnets&quot;&gt;Geoffrey Hinton&#39;s Neural Networks&lt;/a&gt; course. I&#39;ve also been trying to stay on top of the (crazy flood) of deep learning literature via &lt;a href=&quot;http://arxiv.org/&quot;&gt;Arxiv.org&lt;/a&gt;. I&#39;ve been doing this part time in the evenings and weekends while I work at &lt;a href=&quot;https://www.dropbox.com/recents&quot;&gt;Dropbox&lt;/a&gt;, generally via the colearning study groups I host weekly.&lt;/div&gt;
  104. &lt;div data-uuid=&quot;e48b2158cac0406aa42a26ceb7e893db&quot;&gt;
  105. &lt;br /&gt;&lt;/div&gt;
  106. &lt;div data-uuid=&quot;66097a5d97b1425086f3dd68146a9ae1&quot;&gt;
  107. A few months ago I wanted to ground the theoretical knowledge I&#39;ve been gaining with an actual coding project before taking more courses. Nothing like trying to actually apply what you&#39;ve been learning to humble you :)&lt;/div&gt;
  108. &lt;div data-uuid=&quot;66097a5d97b1425086f3dd68146a9ae1&quot;&gt;
  109. &lt;br /&gt;&lt;/div&gt;
  110. &lt;div data-uuid=&quot;1bb5dce94c9740a6b3ca106806d3fb97&quot;&gt;
  111. The attempt was to allow someone to train a neural network over their personal photo collection in order to do face detection on the people in those photos. They could then organize the photos by those people into automatic groups.&lt;/div&gt;
  112. &lt;div data-uuid=&quot;1bb5dce94c9740a6b3ca106806d3fb97&quot;&gt;
  113. &lt;br /&gt;&lt;/div&gt;
  114. &lt;div data-uuid=&quot;7a0b6fd7c19d4455a7a2d09ef8cdcbb7&quot;&gt;
  115. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/personal_photos_model_using_deep_learning.html&quot;&gt;Read more...&lt;/a&gt;&lt;/div&gt;
  116. &lt;/div&gt;
  117. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/1151160470868907113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=1151160470868907113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/1151160470868907113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/1151160470868907113'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2015/09/personal-photos-model-using-deep.html' title='Personal Photos Model Using Deep Learning'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-7817269024388114823</id><published>2015-08-24T12:28:00.002-07:00</published><updated>2015-08-24T12:29:49.564-07:00</updated><title type='text'>Where Will Work Be in 10 Years?</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  118. Wired.uk recently asked me to write a short 100 word answer on what our workplaces will look like in ten years. One hundred words is pretty small; here&#39;s my full response:&lt;br /&gt;
  119. &lt;br /&gt;
  120. &lt;blockquote class=&quot;tr_bq&quot;&gt;
  121. It&#39;s not about what work &lt;i&gt;will&lt;/i&gt; be in 10 years, but what it &lt;i&gt;should&lt;/i&gt;&amp;nbsp;be. Service work and the Uber-esque sharing economy support middle-class lifestyles via progressive legislation; these jobs can&#39;t be outsourced and support a real living wage. Silicon Valley makes its service workers (janitors, etc.) first class employees. Computers and networks eliminate and subsume middle management; collaborative tools allow teams to self-assemble, communicate, and work nimbly. AI doesn&#39;t replace people, but augments them. We learn to harness both analytics &lt;i&gt;and&lt;/i&gt; empathy.&lt;/blockquote&gt;
  122. &lt;blockquote class=&quot;tr_bq&quot;&gt;
  123. Today Silicon Valley companies like Google see their offices as exclusive preserves to provide high-end amenities to keep their employees. In the future they will integrate much better into their local communities, providing public spaces and leaving behind infrastructure that raise the quality of life for everyone, not just employees. The physical membrane separating offices from the outside will dissolve a bit.&lt;/blockquote&gt;
  124. &lt;blockquote class=&quot;tr_bq&quot;&gt;
  125. The importance of physical offices will also decline; we are actually at peak &quot;real office&quot;. Collaborative tools and stronger individual and organizational skills will allow telecommuting to truly go mainstream. Coworking spaces will provide community for these workers.&lt;/blockquote&gt;
  126. &lt;br /&gt;
  127. &lt;br /&gt;&lt;/div&gt;
  128. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/7817269024388114823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=7817269024388114823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/7817269024388114823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/7817269024388114823'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2015/08/where-will-work-be-in-10-years.html' title='Where Will Work Be in 10 Years?'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-4433570213533417558</id><published>2015-05-07T14:52:00.000-07:00</published><updated>2015-05-07T14:54:53.291-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="coworking"/><title type='text'>Roots of Coworking Keynote at GCUC 2015</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  129. &lt;br /&gt;
  130. &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
  131. &lt;a href=&quot;https://twitter.com/maburkejr/status/596347007809114112/photo/1&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixbE-34zRCkoV0W-3GNzKkPNQQypm_YtAhzo21qubYnU_UThfgFDcYlmS04VMNPFTrzw4S0yqA3CyO9rSXZ7Ty0_e6IU2ull3L7QFLqL6l03wbSwrZSoGddh793mFZOJRSOkMg/s400/CEamcQzVEAAWRAt.jpg&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
  132. &lt;br /&gt;
  133. I gave a keynote at the &lt;a href=&quot;http://gcuc.co/&quot;&gt;GCUC 2015 coworking conference&lt;/a&gt; on the roots of coworking, giving my personal story on &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/start_of_coworking.html&quot;&gt;why I created coworking&lt;/a&gt; and what led up to it.&lt;br /&gt;
  134. &lt;br /&gt;
  135. This is a slightly longer version of the talk I recorded before hand, with extra material:&lt;br /&gt;
  136. &lt;br /&gt;
  137. &lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;281&quot; mozallowfullscreen=&quot;&quot; src=&quot;https://player.vimeo.com/video/127201764&quot; webkitallowfullscreen=&quot;&quot; width=&quot;500&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
  138. &lt;br /&gt;
  139. &lt;br /&gt;
  140. Some nice tweet reactions from folks in the audience:&lt;br /&gt;
  141. &lt;br /&gt;
  142. &lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;
  143. &lt;div dir=&quot;ltr&quot; lang=&quot;en&quot;&gt;
  144. &quot;Steal this idea, remix it, and make it your own. Let other people expand your ideas.&quot; - &lt;a href=&quot;https://twitter.com/bradneuberg&quot;&gt;@bradneuberg&lt;/a&gt; (creator of Coworking) &lt;a href=&quot;https://twitter.com/hashtag/gcucusa?src=hash&quot;&gt;#gcucusa&lt;/a&gt;&lt;/div&gt;
  145. — Oren Salomon (@iOren) &lt;a href=&quot;https://twitter.com/iOren/status/596348297662496768&quot;&gt;May 7, 2015&lt;/a&gt;&lt;/blockquote&gt;
  146. &lt;script async=&quot;&quot; charset=&quot;utf-8&quot; src=&quot;//platform.twitter.com/widgets.js&quot;&gt;&lt;/script&gt;
  147.  
  148. &lt;br /&gt;
  149. &lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;
  150. &lt;div dir=&quot;ltr&quot; lang=&quot;en&quot;&gt;
  151. &lt;a href=&quot;https://twitter.com/bradneuberg&quot;&gt;@bradneuberg&lt;/a&gt; Go Ahead - Be Weird remain &lt;a href=&quot;https://twitter.com/hashtag/authentic?src=hash&quot;&gt;#authentic&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/grow?src=hash&quot;&gt;#grow&lt;/a&gt; your &lt;a href=&quot;https://twitter.com/hashtag/coworking?src=hash&quot;&gt;#coworking&lt;/a&gt; space. Weird becomes the norm. Always be &lt;a href=&quot;https://twitter.com/hashtag/creating?src=hash&quot;&gt;#creating&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/community?src=hash&quot;&gt;#community&lt;/a&gt;&lt;/div&gt;
  152. — Varela Consulting (@varelacons) &lt;a href=&quot;https://twitter.com/varelacons/status/596347815606943744&quot;&gt;May 7, 2015&lt;/a&gt;&lt;/blockquote&gt;
  153. &lt;script async=&quot;&quot; charset=&quot;utf-8&quot; src=&quot;//platform.twitter.com/widgets.js&quot;&gt;&lt;/script&gt;
  154.  
  155. &lt;br /&gt;
  156. &lt;blockquote class=&quot;twitter-tweet&quot; lang=&quot;en&quot;&gt;
  157. &lt;div dir=&quot;ltr&quot; lang=&quot;en&quot;&gt;
  158. It was all started by &lt;a href=&quot;https://twitter.com/bradneuberg&quot;&gt;@bradneuberg&lt;/a&gt; in a funky space called the Spiral Muse. The movement has come so far! &lt;a href=&quot;https://twitter.com/hashtag/coworking?src=hash&quot;&gt;#coworking&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/gcuc2015?src=hash&quot;&gt;#gcuc2015&lt;/a&gt;&lt;/div&gt;
  159. — CoLab Orlando (@CoLabOrlando) &lt;a href=&quot;https://twitter.com/CoLabOrlando/status/596347636153618433&quot;&gt;May 7, 2015&lt;/a&gt;&lt;/blockquote&gt;
  160. &lt;script async=&quot;&quot; charset=&quot;utf-8&quot; src=&quot;//platform.twitter.com/widgets.js&quot;&gt;&lt;/script&gt;
  161.  
  162. &lt;/div&gt;
  163. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/4433570213533417558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=4433570213533417558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/4433570213533417558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/4433570213533417558'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2015/05/roots-of-coworking-keynote-at-gcuc-2015.html' title='Roots of Coworking Keynote at GCUC 2015'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixbE-34zRCkoV0W-3GNzKkPNQQypm_YtAhzo21qubYnU_UThfgFDcYlmS04VMNPFTrzw4S0yqA3CyO9rSXZ7Ty0_e6IU2ull3L7QFLqL6l03wbSwrZSoGddh793mFZOJRSOkMg/s72-c/CEamcQzVEAAWRAt.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-1239029306049007052</id><published>2014-11-06T16:22:00.001-08:00</published><updated>2014-11-06T16:22:16.991-08:00</updated><title type='text'>Left Inkling</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  164. &lt;span style=&quot;background-color: rgba(255, 255, 255, 0);&quot;&gt;I haven&#39;t been public about it, but I left Inkling 2 1/2 months ago. It was a fabulous place to work but after nearly four years it was time to move on. During this time I&#39;ve been doing part time front end engineering consulting for a startup. I&#39;m interviewing with Dropbox tomorrow to do part time consulting for them as well. I&#39;ve also been taking this time to learn new skills, in particular taking a Product Management course at General Assembly and teaching myself machine learning and neural networks.&lt;/span&gt;&lt;/div&gt;
  165. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/1239029306049007052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=1239029306049007052' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/1239029306049007052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/1239029306049007052'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2014/11/left-inkling.html' title='Left Inkling'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-3807787129974876224</id><published>2014-04-14T08:30:00.000-07:00</published><updated>2014-09-19T01:08:41.108-07:00</updated><title type='text'>Digital Storytelling Conference 2014</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  166. &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
  167. &lt;br /&gt;&lt;/div&gt;
  168. &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
  169. &lt;br /&gt;&lt;/div&gt;
  170. &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
  171. &lt;a href=&quot;http://codinginparadise.org/ebooks/img/chapter03/inkling_crew_at_digital_storytelling_conf.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://codinginparadise.org/ebooks/img/chapter03/inkling_crew_at_digital_storytelling_conf.jpg&quot; height=&quot;240&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
  172. &lt;br /&gt;
  173. &lt;br /&gt;
  174. &lt;span style=&quot;background-color: white; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px;&quot;&gt;On Wednesday last week a bunch of us at&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://inkling.com/&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #037bb5; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Inkling&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px;&quot;&gt;&amp;nbsp;jumped in a van in San Francisco and drove eight hours to U.C. Irvine for the&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://sites.uci.edu/story/&quot; style=&quot;background-color: white; border: 0px; box-sizing: border-box; color: #037bb5; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Digital Storytelling conference&lt;/a&gt;&lt;span style=&quot;background-color: white; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px;&quot;&gt;. It was a great road trip and a fabulous one-day conference.&lt;/span&gt;&lt;br /&gt;
  175. &lt;br /&gt;
  176. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/digital_storytelling_conference_2014_notes.html&quot;&gt;Read more...&lt;/a&gt;&lt;/div&gt;
  177. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/3807787129974876224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=3807787129974876224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/3807787129974876224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/3807787129974876224'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2014/04/digital-storytelling-conference-2014.html' title='Digital Storytelling Conference 2014'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-6896769962382054289</id><published>2014-03-17T08:30:00.000-07:00</published><updated>2014-09-19T12:10:30.405-07:00</updated><title type='text'>Next Generation eBook Review: The Glo Bible: Surprising Lessons We Can Learn from Religious eBooks</title><content type='html'>&lt;br/&gt;
  178. &lt;figure class=&quot;one-whole&quot; data-uuid=&quot;c0d88f319173473c8032a557d58ecd76&quot; style=&quot;border: 0px; box-sizing: border-box; clear: both; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin: 0px auto 1.5em; padding: 0px; position: relative; vertical-align: baseline; width: 685px;&quot;&gt;&lt;img src=&quot;http://codinginparadise.org/ebooks/img/chapter03/illustration_from_gutenberg_bible.jpg&quot; data-uuid=&quot;4d3dfb468cc742c7b7c073461dd3f3fd&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px auto; max-width: 600px; padding: 0px; vertical-align: baseline; width: 600px;&quot; /&gt;&lt;/figure&gt;&lt;br /&gt;
  179. &lt;div data-uuid=&quot;655906919c3b4c77909799f84582b374&quot; style=&quot;border: 0px; box-sizing: border-box; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin-bottom: 1.5em; padding: 0px; vertical-align: baseline;&quot;&gt;
  180. Today I&#39;m reviewing a very interesting next generation religious eBook named&amp;nbsp;&lt;a href=&quot;http://globible.com/&quot; style=&quot;border: 0px; box-sizing: border-box; color: #037bb5; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Glo&lt;/a&gt;. The digital religious and eBook communities don&#39;t tend to talk to each other. However, the work happening in these digital religious communities around eBooks is incredibly interesting for several reasons.&lt;/div&gt;
  181. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/next_generation_ebook_review_the_glo_bible.html&quot;&gt;Read more...&lt;/a&gt;
  182. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/6896769962382054289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=6896769962382054289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/6896769962382054289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/6896769962382054289'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2014/03/next-generation-ebook-review-glo-bible.html' title='Next Generation eBook Review: The Glo Bible: Surprising Lessons We Can Learn from Religious eBooks'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-5295543655303524445</id><published>2014-03-10T09:00:00.000-07:00</published><updated>2014-09-19T01:16:50.953-07:00</updated><title type='text'>You&#39;re Doing Web &amp; eBook Footnotes Wrong</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  183. &lt;br /&gt;
  184. &lt;h2 data-uuid=&quot;512db736d72546f8a4da3e71037311dc&quot; style=&quot;border: 0px; box-sizing: border-box; clear: both; color: #333333; font-family: &#39;Source Sans Pro&#39;, Verdana, Helvetica, sans; font-weight: inherit; margin: 0px 0px 0.95em; padding: 0px; vertical-align: baseline;&quot;&gt;
  185. &lt;span style=&quot;font-weight: inherit;&quot;&gt;The Problem&lt;/span&gt;&lt;/h2&gt;
  186. &lt;div data-uuid=&quot;657cf30d14d94810afa224509ff0e3cf&quot; style=&quot;border: 0px; box-sizing: border-box; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin-bottom: 1.5em; padding: 0px; vertical-align: baseline;&quot;&gt;
  187. Most web pages that have footnotes blindly mimic paper and put them at the bottom of the page, jumping the user to the footnote when clicked on:&lt;/div&gt;
  188. &lt;br /&gt;
  189. &lt;figure class=&quot;one-whole&quot; data-uuid=&quot;21d588a6f379419abdd2fb68166dccee&quot; style=&quot;border: 0px; box-sizing: border-box; clear: both; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin: 0px auto 1.5em; padding: 0px; position: relative; vertical-align: baseline; width: 685px;&quot;&gt;&lt;iframe data-uuid=&quot;f50febc2519d419f8eff1713b60073d7&quot; height=&quot;281&quot; src=&quot;http://player.vimeo.com/video/88620817&quot; style=&quot;border-width: 0px; box-sizing: border-box; display: block; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px auto; padding: 0px; vertical-align: baseline;&quot; width=&quot;500&quot;&gt;&lt;/iframe&gt;&lt;figcaption style=&quot;border: 0px; box-sizing: border-box; font-family: &#39;Source Sans Pro&#39;, Verdana, Helvetica, sans; font-size: 0.8947em; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0.375em auto 0px; max-width: 600px; padding: 0px; position: relative; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;caption-body&quot; style=&quot;border: 0px; box-sizing: border-box; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Picking on&amp;nbsp;&lt;a href=&quot;http://paulgraham.com/articles.html&quot; style=&quot;border: 0px; box-sizing: border-box; color: #037bb5; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Paul Graham&#39;s&lt;/a&gt;&amp;nbsp;footnotes&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;
  190. &lt;div data-uuid=&quot;427b5eba2eb743358192cfdf8b99748b&quot; style=&quot;border: 0px; box-sizing: border-box; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin-bottom: 1.5em; padding: 0px; vertical-align: baseline;&quot;&gt;
  191. This is silly for many reasons. First, computer screens aren&#39;t paper; they can easily&amp;nbsp;&lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/stretchtext.html&quot; style=&quot;border: 0px; box-sizing: border-box; color: #037bb5; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;accordion open&lt;/a&gt;&amp;nbsp;and show extra information based on user intent. Second, they cause a user to lose context while reading an article, forcing them to jump away from what they are doing; this is annoying.&lt;/div&gt;
  192. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/doing_web_footnotes_right.html&quot;&gt;Read more...&lt;/a&gt;&lt;/div&gt;
  193. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/5295543655303524445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=5295543655303524445' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/5295543655303524445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/5295543655303524445'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2014/03/youre-doing-web-ebook-footnotes-wrong.html' title='You&#39;re Doing Web &amp; eBook Footnotes Wrong'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-8943784678790938931</id><published>2014-03-03T08:30:00.000-08:00</published><updated>2014-09-19T01:20:20.292-07:00</updated><title type='text'>Inkling Habitat: How a 100,000 Line JavaScript Application Focused on Digital Publishing is Built</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  194. &lt;br /&gt;
  195. &lt;figure class=&quot;one-whole&quot; data-uuid=&quot;bf517d7444ee4d09a89d05d26271d031&quot; style=&quot;border: 0px; box-sizing: border-box; clear: both; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin: 0px auto 1.5em; padding: 0px; position: relative; vertical-align: baseline; width: 685px;&quot;&gt;&lt;img data-uuid=&quot;081443003d2f46e9b02ea29e26e4422b&quot; src=&quot;http://codinginparadise.org/ebooks/img/chapter03/chapter_overview_2.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px auto; max-width: 600px; padding: 0px; vertical-align: baseline; width: 600px;&quot; /&gt;&lt;/figure&gt;&lt;div data-uuid=&quot;5a4fd0f58e0b4515abf36cf3448ad37b&quot; style=&quot;border: 0px; box-sizing: border-box; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin-bottom: 1.5em; padding: 0px; vertical-align: baseline;&quot;&gt;
  196. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/books_as_software.html&quot; style=&quot;border: 0px; box-sizing: border-box; color: #037bb5; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Last week&lt;/a&gt;&amp;nbsp;I introduced you to one of the original animating ideas behind&amp;nbsp;&lt;a href=&quot;https://www.inkling.com/habitat/&quot; style=&quot;border: 0px; box-sizing: border-box; color: #037bb5; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Inkling Habitat&lt;/a&gt;, treating books as software to transform the eBook production process. Today I&#39;d like to take you behind the scenes and show you the technologies and processes we used to build Inkling Habitat itself. How did we build this software?&lt;/div&gt;
  197. &lt;h2 data-uuid=&quot;eb58c062d38344689ed79aec45486c5b&quot; style=&quot;border: 0px; box-sizing: border-box; clear: both; color: #333333; font-family: &#39;Source Sans Pro&#39;, Verdana, Helvetica, sans; font-size: 1.5789em; font-weight: inherit; line-height: 1.3; margin: 0px 0px 0.95em; padding: 0px; vertical-align: baseline;&quot;&gt;
  198. How is Inkling Habitat Built?&lt;/h2&gt;
  199. &lt;div data-uuid=&quot;94c0dfb8c46b4a5287802b55d11f9794&quot; style=&quot;border: 0px; box-sizing: border-box; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin-bottom: 1.5em; padding: 0px; vertical-align: baseline;&quot;&gt;
  200. First, Inkling Habitat is a client side application that runs inside your web browser, built with JavaScript, HTML, and CSS. The client-side portion is roughly 100,000 lines of JavaScript, which is a big application.&lt;/div&gt;
  201. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/technology_behind_habitat.html&quot;&gt;Read more...&lt;/a&gt;&lt;/div&gt;
  202. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/8943784678790938931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=8943784678790938931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/8943784678790938931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/8943784678790938931'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2014/03/inkling-habitat-how-100000-line.html' title='Inkling Habitat: How a 100,000 Line JavaScript Application Focused on Digital Publishing is Built'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3191291.post-5265991245280666514</id><published>2014-02-25T08:00:00.000-08:00</published><updated>2014-09-19T01:21:33.416-07:00</updated><title type='text'>Transforming eBook Production by Treating Books as Software</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
  203. &lt;br /&gt;
  204. &lt;figure class=&quot;one-whole&quot; data-uuid=&quot;7bb749347db347398abb828fcbe80f44&quot; style=&quot;border: 0px; box-sizing: border-box; clear: both; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin: 0px auto 1.5em; padding: 0px; position: relative; vertical-align: baseline; width: 685px;&quot;&gt;&lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/books_as_software.html&quot; style=&quot;border: 0px; box-sizing: border-box; color: #037bb5; display: block; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;img data-uuid=&quot;a783a4038b6648e98fc3940065807fa9&quot; src=&quot;http://codinginparadise.org/ebooks/img/chapter03/books_as_software.jpg&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px auto; max-width: 600px; padding: 0px; vertical-align: baseline; width: 600px;&quot; /&gt;&lt;/a&gt;&lt;figcaption style=&quot;border: 0px; box-sizing: border-box; font-family: &#39;Source Sans Pro&#39;, Verdana, Helvetica, sans; font-size: 0.8947em; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0.375em auto 0px; max-width: 600px; padding: 0px; position: relative; vertical-align: baseline;&quot;&gt;&lt;span class=&quot;caption-body&quot; style=&quot;border: 0px; box-sizing: border-box; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/j1x4r/4313734090/&quot; style=&quot;border: 0px; box-sizing: border-box; color: #037bb5; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Photo by Jixar&lt;/a&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;div data-uuid=&quot;3d1de2f15d094c4d91d0b6457691bcfc&quot; style=&quot;border: 0px; box-sizing: border-box; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin-bottom: 1.5em; padding: 0px; vertical-align: baseline;&quot;&gt;
  205. Digital books are bundles of HTML, CSS, and JavaScript. How do we efficiently convert and create these pieces of software?&lt;/div&gt;
  206. &lt;div data-uuid=&quot;36d91c6d90774a1eb369a6f6e2321904&quot; style=&quot;border: 0px; box-sizing: border-box; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin-bottom: 1.5em; padding: 0px; vertical-align: baseline;&quot;&gt;
  207. These bundles can be very complicated. For example,&amp;nbsp;&lt;a href=&quot;https://www.inkling.com/store/book/ganongs-review-medical-physiology-barrett-24th/&quot; style=&quot;border: 0px; box-sizing: border-box; color: #037bb5; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Ganong&#39;s Review of Medical Physiology&lt;/a&gt;&amp;nbsp;has thirty-nine chapters. Now add in interactive quizzes, 3-D models, high-definition video, educational slide lines, and pop tip glossaries/footnotes, and if you&#39;re not careful you will need a small army to produce every eBook. If next generation eBooks require Fabergé&amp;nbsp;egg levels of care and expense we&#39;ll never get the scale and quantity we need to make this new world real.&lt;/div&gt;
  208. &lt;figure class=&quot;one-half right&quot; data-uuid=&quot;744c52b311af46629a527eb98bf137e2&quot; style=&quot;border: 0px; box-sizing: border-box; clear: right; color: #333333; float: right; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin: 0px 0px 1.5em 21.90625px; padding: 0px; position: relative; vertical-align: baseline; width: 331.53125px;&quot;&gt;&lt;img data-uuid=&quot;e705f2e2b68c4d0a9075f524585dbbd2&quot; src=&quot;http://codinginparadise.org/ebooks/img/chapter03/trs80.png&quot; style=&quot;border: 0px; box-sizing: border-box; display: block; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; max-width: 600px; padding: 0px; vertical-align: baseline; width: 331.53125px;&quot; /&gt;&lt;/figure&gt;&lt;div data-uuid=&quot;81398bc7565e4968b42f778adb8ffc59&quot; style=&quot;border: 0px; box-sizing: border-box; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin-bottom: 1.5em; padding: 0px; vertical-align: baseline;&quot;&gt;
  209. It turns out over the last fifty years we&#39;ve developed an incredible set of techniques and tools for dealing with artifacts of incredible complexity: computer software itself. These tools include:&lt;/div&gt;
  210. &lt;ul data-uuid=&quot;eb8d65c5baf2466e956dd47ffd139392&quot; style=&quot;border: 0px; box-sizing: border-box; color: #333333; font-family: &#39;Meta Serif Office Pro&#39;, Georgia, serif; font-size: 19px; line-height: 28.5px; margin: 0px 0px 1.5em 2.25em; padding: 0px; vertical-align: baseline;&quot;&gt;
  211. &lt;li data-uuid=&quot;16bff8fe8fe5466380878520dffdad2e&quot; style=&quot;border: 0px; box-sizing: border-box; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Source control systems&lt;/li&gt;
  212. &lt;li data-uuid=&quot;9e6f13549ef6439d9f761cdc73a72277&quot; style=&quot;border: 0px; box-sizing: border-box; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Issue databases&lt;/li&gt;
  213. &lt;li data-uuid=&quot;90bd798773084efcac0d5863b7fb519b&quot; style=&quot;border: 0px; box-sizing: border-box; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Automated testing&lt;/li&gt;
  214. &lt;li data-uuid=&quot;ea993ca2255342a988851c8777b1751c&quot; style=&quot;border: 0px; box-sizing: border-box; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Cross compilers&lt;/li&gt;
  215. &lt;li data-uuid=&quot;05d3a36f79124a8f91a008d0d1d5d22b&quot; style=&quot;border: 0px; box-sizing: border-box; font-family: inherit; font-size: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;&quot;&gt;Integrated Development Environments (IDEs)&lt;/li&gt;
  216. &lt;/ul&gt;
  217. &lt;a href=&quot;http://codinginparadise.org/ebooks/html/blog/books_as_software.html&quot;&gt;Read more...&lt;/a&gt;&lt;/div&gt;
  218. </content><link rel='replies' type='application/atom+xml' href='http://blog.codinginparadise.org/feeds/5265991245280666514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3191291&amp;postID=5265991245280666514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/5265991245280666514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3191291/posts/default/5265991245280666514'/><link rel='alternate' type='text/html' href='http://blog.codinginparadise.org/2014/02/transforming-ebook-production-by.html' title='Transforming eBook Production by Treating Books as Software'/><author><name>Brad Neuberg</name><uri>http://www.blogger.com/profile/03436380878044525337</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid Atom 1.0" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//blog.codinginparadise.org/feeds/posts/default

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda