<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Jean-Marc Skopek on Medium]]></title>
        <description><![CDATA[Stories by Jean-Marc Skopek on Medium]]></description>
        <link>https://medium.com/@jmskopek?source=rss-7632bae8f743------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*ZBvFlXckPiNHuXQN.png</url>
            <title>Stories by Jean-Marc Skopek on Medium</title>
            <link>https://medium.com/@jmskopek?source=rss-7632bae8f743------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 16:00:41 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@jmskopek/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Memory Vault]]></title>
            <link>https://medium.com/@jmskopek/memory-vault-6568e850d5c7?source=rss-7632bae8f743------2</link>
            <guid isPermaLink="false">https://medium.com/p/6568e850d5c7</guid>
            <category><![CDATA[memory-management]]></category>
            <category><![CDATA[self-improvement]]></category>
            <category><![CDATA[journaling]]></category>
            <category><![CDATA[organization]]></category>
            <category><![CDATA[memory-improvement]]></category>
            <dc:creator><![CDATA[Jean-Marc Skopek]]></dc:creator>
            <pubDate>Thu, 21 Feb 2019 07:37:55 GMT</pubDate>
            <atom:updated>2019-02-21T07:43:36.286Z</atom:updated>
            <content:encoded><![CDATA[<h4>Remember the past</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/890/1*xP8ZufUGTFaDXSwVeoi06Q.png" /></figure><p>Memory Vault is a program I’ve been working on for a little while. It’s designed to help you remember the past.</p><p>Memory Vault is a place to store videos of you talking to yourself about your day. You can have it remind you to record on a schedule, but we don’t set one up by default. You can reflect once a month or dozens of times a day. You can record yourself on the beach, in the car (eyes on the road!), or on the Hải Vân pass.</p><p>There’s no pressure to make the videos short or long, either. Videos are compressed so that they take up very little space, and the program can skip all the moments where you aren’t talking so you can take as much time as you need (I find this feature really helpful).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/521/1*Q53ianbzuJ7L9E-J-4wU3w.png" /></figure><p>When you are finished, you can choose to have Memory Vault analyze the video. If you do, a written transcript of what you have said is created. You can search through it to find things you have said in the past; you can also download the transcript, which can be a pretty useful way to write emails. Memory Vault will even try to figure out what you are saying and suggest organization tags for you.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*n0wPGlKtPa_v6GVbKDhf4A.png" /></figure><p>You could end up recording some pretty sensitive and embarrassing stuff in Memory Vault; you want to make sure your most sensitive thoughts aren’t being analyzed to give you hyper-customized ads. You may also end up cherishing your videos and looking back on them in the future; possibly even when you are 90 years old and smartphones are a thing of the past. Memory Vault tackles these really important problems in two ways.</p><p>First, you are in charge of storing your memories. We recommend storing them on a cloud drive like Dropbox or Google Drive, but you can store them wherever you want.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/757/1*umg6dhup6JLjaQwYpTVILQ.png" /><figcaption>You can even store your files on a floppy disk for that retro feel</figcaption></figure><p>Your memories are stored in a way you can get to them — in a bunch of folders grouped by the year, month, and day. Your videos are just regular video files. You should still be able to watch them 70 years from now.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/747/1*wDyo7gbQXzQF9YPOljToRw.png" /><figcaption>.mp4 4 life</figcaption></figure><p>Privacy is another really important thing to think about. By default, we don’t ever need to know what you do with Memory Vault. There is no tracking software in the program, and we don’t store your data and don’t (or rather, can’t) look at it.</p><p>If you choose to analyze your videos, we <em>will</em> need to deal with your data. In that situation, your videos are uploaded to our servers where they are analyzed and a written transcript is generated (we do via machine). We hold onto your data for as little as possible during this process; as soon as the transcript is sent back to you, we delete everything from our servers. We don’t ask for your name and we don’t use your information for data analysis purposes. We will have a privacy policy and it won’t just be a formality.</p><p>Does this sound like something you might want to try? Memory Vault is still in development, but there is a beta version available for Mac and Windows. If you’d like to try it out, enter your email address below:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1FAIpQLSc7JbXJnoVktOG6LEuI071Wov35xrCRVU7ROGzHJIcwr-7fsw%2Fviewform%3Fembedded%3Dtrue&amp;url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1FAIpQLSc7JbXJnoVktOG6LEuI071Wov35xrCRVU7ROGzHJIcwr-7fsw%2Fviewform%3Fusp%3Dsend_form&amp;image=https%3A%2F%2Flh6.googleusercontent.com%2Fj3N9QjdynXbWPbk1yTY8x1NuHF9LAKDwPCARdCMMkzRssKrVeASZ-Q3Nl6M_Zf5DidY%3Dw1200-h630-p&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=google" width="760" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/77793d8676ac314801380060a518ca6d/href">https://medium.com/media/77793d8676ac314801380060a518ca6d/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6568e850d5c7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Encoding Video with .NET Core and Azure Media Services — Part 3]]></title>
            <link>https://medium.com/jean-marcs-thoughts/encoding-video-with-net-core-and-azure-media-services-part-3-5429c9c14e5a?source=rss-7632bae8f743------2</link>
            <guid isPermaLink="false">https://medium.com/p/5429c9c14e5a</guid>
            <category><![CDATA[csharp]]></category>
            <category><![CDATA[net-core]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[azure]]></category>
            <category><![CDATA[video-encoding]]></category>
            <dc:creator><![CDATA[Jean-Marc Skopek]]></dc:creator>
            <pubDate>Tue, 08 May 2018 08:09:16 GMT</pubDate>
            <atom:updated>2018-05-08T08:09:16.964Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jl_D9biIdfdNxXMjSxh3Ww.png" /></figure><h4>Part 3: Running an Azure Media Services Job</h4><p>In <a href="https://medium.com/jean-marcs-thoughts/encoding-video-with-net-core-and-azure-media-services-part-2-b19e6de42b60">Part 2</a>, we were able to upload a video file to Azure Media Services. Now that an <em>Asset</em> has been created and a file has been uploaded to it, let’s run an encoding job on it.</p><p>Before we can create an encoding job, we must request an Azure Media Services media processor. AMS has many media processors, each of which can do different tasks. Some of these include:</p><ul><li>Video thumbnail generator</li><li>Optical character recognition processor</li><li>Face redactor/blurring</li><li>Motion detection processor</li><li>Face detector</li><li>Hyperlapse time-lapse encoder</li><li>Transcript/subtitles generator</li></ul><p>The Azure Media Services media processors are described in more detail in an <a href="https://docs.microsoft.com/en-us/azure/media-services/media-services-analytics-overview">article from Microsoft</a>.</p><h4>Request a Media Processor</h4><p>In the <em>MediaServices</em> class, create a method that retrieves the ID of a specified media processor:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1d633058d472596a157c368a0adeb30c/href">https://medium.com/media/1d633058d472596a157c368a0adeb30c/href</a></iframe><h4>Create a Job</h4><p>In the <em>MediaServices</em> class, create a method that generates an encoding job:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2f9c4a6ab719a498917dba0070d9f217/href">https://medium.com/media/2f9c4a6ab719a498917dba0070d9f217/href</a></iframe><h4>Running a video encoder job on an asset</h4><p>Now that we have the ability to request a media processor and generate a job, let’s run an encoding job on our uploaded video file from the main <em>Program.cs</em> file:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1228160c9550813ed4d098194625f415/href">https://medium.com/media/1228160c9550813ed4d098194625f415/href</a></iframe><p>Congratulations! You should now have a video encoding job running on your newly uploaded asset.</p><p>Your code <a href="https://github.com/jskopek/AzureMediaServicesEncoderNetCore/tree/4cdb370d1926f855479607a089e363f0cf02d6dc">should now look like this</a>.</p><p>You now have everything you need to upload video files to Azure Media Services and run a number of different encoding jobs.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5429c9c14e5a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/jean-marcs-thoughts/encoding-video-with-net-core-and-azure-media-services-part-3-5429c9c14e5a">Encoding Video with .NET Core and Azure Media Services — Part 3</a> was originally published in <a href="https://medium.com/jean-marcs-thoughts">Jean-Marc’s Thoughts</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sloquet Hot Springs]]></title>
            <link>https://medium.com/jean-marcs-thoughts/sloquet-hot-springs-1f51dbd24735?source=rss-7632bae8f743------2</link>
            <guid isPermaLink="false">https://medium.com/p/1f51dbd24735</guid>
            <category><![CDATA[travel]]></category>
            <dc:creator><![CDATA[Jean-Marc Skopek]]></dc:creator>
            <pubDate>Wed, 25 Apr 2018 17:47:25 GMT</pubDate>
            <atom:updated>2018-04-25T17:47:25.058Z</atom:updated>
            <content:encoded><![CDATA[<h4>6 hours north of Vancouver, BC</h4><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F0k3kKEOatzI%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D0k3kKEOatzI&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F0k3kKEOatzI%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/7059a84519c0a274e9b2b9c6dee2654a/href">https://medium.com/media/7059a84519c0a274e9b2b9c6dee2654a/href</a></iframe><p>The May Long weekend loomed on the horizon, and we decided we should do something special to celebrate our three days off.</p><p>I think we did pretty good.</p><p>The Sloquet Hot Springs are a natural wonder and something of an untouched gem. The long distance from Vancouver — over 5 hours — and rough roads mean that the area doesn’t get much attention. This in turn means that the springs are remarkably natural.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FoH19HM7hrFg%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DoH19HM7hrFg&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FoH19HM7hrFg%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/6459f3ad2807860a19c3369bbd64f1a8/href">https://medium.com/media/6459f3ad2807860a19c3369bbd64f1a8/href</a></iframe><p>The drive up from Vancouver is long, but the scenery on the way is very pretty.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FgRE5ZGvrVIw%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DgRE5ZGvrVIw&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FgRE5ZGvrVIw%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/096ba3997937764ab2f19cc07c56874f/href">https://medium.com/media/096ba3997937764ab2f19cc07c56874f/href</a></iframe><p>Morgan getting her country girl on.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FuEJ63cQg4jA%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DuEJ63cQg4jA&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FuEJ63cQg4jA%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/8a68801650c2bf966d23e46fb55b4697/href">https://medium.com/media/8a68801650c2bf966d23e46fb55b4697/href</a></iframe><p>And getting into the mountains as well.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FM00oWgjGKrs%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DM00oWgjGKrs&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FM00oWgjGKrs%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/4be8b765347edb894219d74bb20a4d47/href">https://medium.com/media/4be8b765347edb894219d74bb20a4d47/href</a></iframe><p>The whisky doubled as a G-force meter.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FLOrg218ZjUk%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DLOrg218ZjUk&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FLOrg218ZjUk%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/31897cac660a83f31dd7a6de3206ec24/href">https://medium.com/media/31897cac660a83f31dd7a6de3206ec24/href</a></iframe><p>We saw a bunch of deer on the way up, including one that charged the truck kamikaze style. This one knew what was up though.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F3FN8xLIGevU%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D3FN8xLIGevU&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F3FN8xLIGevU%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/4ca896fa18a28cc1b45cacb33bcc201c/href">https://medium.com/media/4ca896fa18a28cc1b45cacb33bcc201c/href</a></iframe><p>The roads up are very bumpy; an all-wheel drive car is recommended, but a lot of people make the trek in 2wd cars. A stranger’s car lost its oil pan on the way up, which sounds rough.</p><p>The last 75km up is on a logging road, and the final 10km of that is on a very rough unmaintained road. The logging road is plowed in the winter, but the final 10km is left alone. We heard from people with heavy duty trucks that it’s impossible to drive more than a few feet up in the winter; expect to snowshoe or snowmobile your way up if you’re visiting in the winter.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Feq27ZDjH47U%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Deq27ZDjH47U&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Feq27ZDjH47U%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/9d165ea2676577282290796306e9e085/href">https://medium.com/media/9d165ea2676577282290796306e9e085/href</a></iframe><p>The campsites are well laid out and very comfortable. We paid $15 per night per car, which works out to an incredible deal. For your $15 you get unlimited access to the hot springs, a campsite with fire pit, and outhouses. Some campsites even have benches and cooking grills.</p><p>We arrived at 11AM on a Saturday morning and claimed one of the last remaining campsites, but that may have been more because of the May long weekend holiday.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Ft5LkgtkuLPg%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dt5LkgtkuLPg&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Ft5LkgtkuLPg%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/04997d2884b64b34a4277e23610395d6/href">https://medium.com/media/04997d2884b64b34a4277e23610395d6/href</a></iframe><p>There’s something incredibly satisfying about swinging an axe down on a cutting block. Here’s hoping that’s not just some latent psycopatheic tendencies.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FefFIPFxrOSA%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DefFIPFxrOSA&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FefFIPFxrOSA%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/db865f356116bc99255cc2f36b8304e7/href">https://medium.com/media/db865f356116bc99255cc2f36b8304e7/href</a></iframe><p>The unusually wet start to the year meant that we could make fires without any worry. We brought our own wood, but you can buy a wheelbarrow full for $15.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FpVw9JtXT0wI%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DpVw9JtXT0wI&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FpVw9JtXT0wI%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/49a498a66e8beeb03ee74104330f1eaf/href">https://medium.com/media/49a498a66e8beeb03ee74104330f1eaf/href</a></iframe><p>Alecia made a huge dent in this book over the weekend, figuratively speaking. I’m sure she also got it a little dirty.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FVJwcr-KjN0k%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DVJwcr-KjN0k&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FVJwcr-KjN0k%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/9c1d0358d7ca0d93702ef306eb5f4bca/href">https://medium.com/media/9c1d0358d7ca0d93702ef306eb5f4bca/href</a></iframe><p>Fred and Alecia showing us what true campfire cooking looks like.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fxm58w_75fLM%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dxm58w_75fLM&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fxm58w_75fLM%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/14257989f4ae43ec267a1ff58bcdded7/href">https://medium.com/media/14257989f4ae43ec267a1ff58bcdded7/href</a></iframe><p>A lot of cribbage was played. I discovered I need to learn basic addition.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FGcblJbMME8c%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGcblJbMME8c&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FGcblJbMME8c%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/b465817ed464d8363d60f3241497e888/href">https://medium.com/media/b465817ed464d8363d60f3241497e888/href</a></iframe><p>There was also a lot of hanging out.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FKf1knhn8YEQ%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DKf1knhn8YEQ&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FKf1knhn8YEQ%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/9a395e62ed0280aa14d49d5d3e72acb5/href">https://medium.com/media/9a395e62ed0280aa14d49d5d3e72acb5/href</a></iframe><p>And a lot of looking at trees.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fq0vuFsHbIMI%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dq0vuFsHbIMI&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fq0vuFsHbIMI%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/9e8a88e843cb177aa69879601e85e209/href">https://medium.com/media/9e8a88e843cb177aa69879601e85e209/href</a></iframe><p>There aren’t any designated hiking trails, but the area is fun to explore and easy to navigate. There were signs are recent bear activity, so you don’t want to be a complete idiot about it.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FPdFLs6d2KPg%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DPdFLs6d2KPg&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FPdFLs6d2KPg%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/b2f00b8324ea5f51070d17ef75369be1/href">https://medium.com/media/b2f00b8324ea5f51070d17ef75369be1/href</a></iframe><p>The hot springs are fed from a series of natural streams. These are really, really, really hot. I couldn’t keep my hand under this stream for more than a second.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FnWzFfBEZPrA%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DnWzFfBEZPrA&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FnWzFfBEZPrA%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/8dc9af8ec3c784f88306b7a1ef44805a/href">https://medium.com/media/8dc9af8ec3c784f88306b7a1ef44805a/href</a></iframe><p>The hot springs themselves are really, really beautiful. The hot streams meet the freezing river below and pool into a series of natural baths. Each area is a different temperature, so you can go from chilly to charred and everything in between.</p><p>There’s very little sign of human meddling. The only foreign object is a small changing area on the edge of the pools.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F6I9RBOlcvjE%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D6I9RBOlcvjE&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F6I9RBOlcvjE%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/db94887bb2d9e8ace519a4ec601dff31/href">https://medium.com/media/db94887bb2d9e8ace519a4ec601dff31/href</a></iframe><p>Tea candles and lamps are scattered among the rocks, and the springs look magical when the stars come out and the candles are lit.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FnN6MvtaJxO8%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DnN6MvtaJxO8&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FnN6MvtaJxO8%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/ee246653dca874ac2c7758b089016695/href">https://medium.com/media/ee246653dca874ac2c7758b089016695/href</a></iframe><p>It can get pretty busy in the evening, but we never found it hard to find space. The pools clear out during the day, which makes for some pretty relaxing times.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F_uT9P8lXcoE%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D_uT9P8lXcoE&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F_uT9P8lXcoE%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/ab9086ed47cbea378daf49f4c64a4728/href">https://medium.com/media/ab9086ed47cbea378daf49f4c64a4728/href</a></iframe><p>The Sloquet hot springs are pretty incredible, and well worth the 6 hour drive. It’s hard to believe that something like this can happen naturally, but nature can be pretty amazing. I’d love to know how many generations have dipped their toes into the water after a long hard day.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1f51dbd24735" width="1" height="1" alt=""><hr><p><a href="https://medium.com/jean-marcs-thoughts/sloquet-hot-springs-1f51dbd24735">Sloquet Hot Springs</a> was originally published in <a href="https://medium.com/jean-marcs-thoughts">Jean-Marc’s Thoughts</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Encoding Video with .NET Core and Azure Media Services — Part 2]]></title>
            <link>https://medium.com/jean-marcs-thoughts/encoding-video-with-net-core-and-azure-media-services-part-2-b19e6de42b60?source=rss-7632bae8f743------2</link>
            <guid isPermaLink="false">https://medium.com/p/b19e6de42b60</guid>
            <category><![CDATA[csharp]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[net-core]]></category>
            <category><![CDATA[video-encoding]]></category>
            <category><![CDATA[azure]]></category>
            <dc:creator><![CDATA[Jean-Marc Skopek]]></dc:creator>
            <pubDate>Wed, 25 Apr 2018 06:36:42 GMT</pubDate>
            <atom:updated>2018-05-08T08:09:42.302Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jl_D9biIdfdNxXMjSxh3Ww.png" /></figure><h4>Part 2: Uploading Videos to Azure Storage</h4><p>Let’s continue from where we left off in <a href="https://medium.com/@jmskopek/encoding-video-with-net-core-and-azure-media-services-part-1-51bf6035ffcb">Part 1</a>. We now have a MediaServices class that can communicate with Azure Media Services and establish an authentication token. Now let’s upload a video to Azure.</p><h4>How files are uploaded to Azure</h4><p>Before we can upload a video file to Azure, we need to define an <em>Asset</em>, an <em>Access Policy</em>, and a file <em>Locator</em>.</p><p><a href="https://docs.microsoft.com/en-us/rest/api/media/operations/asset">Assets</a> are collections of video, audio, image, or text files with corresponding metadata. The files attached to an Asset instance can be encoded or streamed using AMS.</p><p><a href="https://docs.microsoft.com/en-us/rest/api/media/operations/accesspolicy">Access Policies</a> define the permissions and access timeframes for an Asset. An Access Policy with upload permissions must be defined before a file can be uploaded to an Asset.</p><p><a href="https://docs.microsoft.com/en-us/rest/api/media/operations/locator">Locators</a> provide an entry point to access files in an Asset. Locators can be configured with <a href="https://docs.microsoft.com/en-us/rest/api/storageservices/Delegating-Access-with-a-Shared-Access-Signature?redirectedfrom=MSDN">Shared Access Signatures</a> for additional permissions, such as the ability to upload a file to the locator address. Locators require a corresponding Asset and Access Policy before they can be created.</p><h4>Generating an asset</h4><p>Let’s start by creating the method to generate an asset:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/dc8db112e49798d5c99990296b018e37/href">https://medium.com/media/dc8db112e49798d5c99990296b018e37/href</a></iframe><p>This method takes an asset name and a storage account name and creates an <em>Asset</em> instance in Azure Media Services. Note that the method returns an instance of an <em>Asset</em> class. This can be defined with the following code:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/622a65e5188c949a6df528c938bfbb9a/href">https://medium.com/media/622a65e5188c949a6df528c938bfbb9a/href</a></iframe><h4>Generating an Access Policy</h4><p>Next, let’s create a method that generates an <em>Access Policy</em> in AMS. Insert the following method in your <em>MediaServices</em> class:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3f0f9ce36057896176b1b6ec76011bf7/href">https://medium.com/media/3f0f9ce36057896176b1b6ec76011bf7/href</a></iframe><h4>Generating a Locator</h4><p>Finally, let’s create a <em>Locator</em> instance that will be used when uploading the file. Insert the following code in your <em>MediaServices</em> class:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/464cf01685d917513b1d661156c560c7/href">https://medium.com/media/464cf01685d917513b1d661156c560c7/href</a></iframe><p>This method returns an instance of a <em>Locator</em> class, which can be defined with the following code:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2dba0d080d71df2e00e7349b20d74c1f/href">https://medium.com/media/2dba0d080d71df2e00e7349b20d74c1f/href</a></iframe><p>Finally, let’s tie it all together by calling these methods from the main <em>Program.cs</em> file:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/944c8a274af7615ed2531453ba92129d/href">https://medium.com/media/944c8a274af7615ed2531453ba92129d/href</a></iframe><h4>Uploading a video to Azure Media Services</h4><p>Now that we have a locator instance for an asset with an upload-enabled access policy, we can upload a file to Azure. Let’s start by creating a method that takes a file stream, an <em>Asset</em> instance, and a <em>Locator</em> instance:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c8570f86a88f3522b50ed4cff6bd3509/href">https://medium.com/media/c8570f86a88f3522b50ed4cff6bd3509/href</a></iframe><p>Once the file has been uploaded to the locator, we must generate a file info request before the file is registered to the asset. The following code generates a file info request:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8cc3d142f2887620e4936fc8075db75a/href">https://medium.com/media/8cc3d142f2887620e4936fc8075db75a/href</a></iframe><p>Finally, let’s tie it all together in the <em>Program.cs</em> file. This code demonstrates an example upload:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b18adc1cd81634d085ba67c9d93303eb/href">https://medium.com/media/b18adc1cd81634d085ba67c9d93303eb/href</a></iframe><p>Your should now have a video file uploaded and registered to an asset.</p><p>Your code <a href="https://github.com/jskopek/AzureMediaServicesEncoderNetCore/tree/467fed0a3f35d7b159acd51f4994ad79e0dbba1e">should now look like this</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1022/0*mveajqfrftpI2XzK.png" /></figure><p>If you are having trouble determining the state of your Azure Media Services account, you may wish to install the <a href="https://github.com/Azure/Azure-Media-Services-Explorer">Azure Media Services Explorer</a>. This tool provides a nice GUI for navigating your Azure Media Services instance.</p><p>In the next step, we will <a href="https://medium.com/@jmskopek/encoding-video-with-net-core-and-azure-media-services-part-3-5429c9c14e5a">encode our newly uploaded video file</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b19e6de42b60" width="1" height="1" alt=""><hr><p><a href="https://medium.com/jean-marcs-thoughts/encoding-video-with-net-core-and-azure-media-services-part-2-b19e6de42b60">Encoding Video with .NET Core and Azure Media Services — Part 2</a> was originally published in <a href="https://medium.com/jean-marcs-thoughts">Jean-Marc’s Thoughts</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Encoding Video with .NET Core and Azure Media Services — Part 1]]></title>
            <link>https://medium.com/jean-marcs-thoughts/encoding-video-with-net-core-and-azure-media-services-part-1-51bf6035ffcb?source=rss-7632bae8f743------2</link>
            <guid isPermaLink="false">https://medium.com/p/51bf6035ffcb</guid>
            <category><![CDATA[net-core]]></category>
            <category><![CDATA[csharp]]></category>
            <category><![CDATA[video-encoding]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[azure]]></category>
            <dc:creator><![CDATA[Jean-Marc Skopek]]></dc:creator>
            <pubDate>Tue, 24 Apr 2018 06:05:20 GMT</pubDate>
            <atom:updated>2018-04-25T16:58:08.142Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jl_D9biIdfdNxXMjSxh3Ww.png" /></figure><h4>Part 1: Authenticating with Azure Media Services</h4><p>Azure Media Services is a service that can encode video for mobile devices, generate thumbnails, and even create subtitles from audio tracks. It’s powerful and cheap, and I wanted to use it in an application.</p><p>Sadly, there is no official API for .NET Core.</p><p>In this tutorial, I will demonstrate how to create a bare-bones REST connector for Azure Media Services in C# and .NET Core 2.0. We will start by building a project that can talk to Azure Media Services.</p><h4>Creating the Project</h4><p>Let’s start by creating our new project. For this demonstration, we will create a simple console application, but all of the principles should work just as well in a web application.</p><p>Open Visual Studio and create a new “Console App (.NET Core)” project:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RDagW7oaAyH2fnAyuvawyQ.png" /></figure><p>You should now have a simple project that outputs “Hello World!” to a console.</p><p>Time to spice things up a notch.</p><h4>Setting up our Azure Media Services Account</h4><p>Before you can even start to think about talking to Azure Media Services (or AMS, for short), you first need to <a href="https://docs.microsoft.com/en-us/azure/media-services/media-services-portal-create-account">create an Azure Media Services account</a> via the Azure portal.</p><p>Once your Azure Media Services account is created, you will need to create a client id/secret pair and download the required connection information. This includes:</p><ul><li>Azure Active Directory tenant domain</li><li>REST API Endpoint</li><li>Client ID</li><li>Client Secret</li></ul><p>The AAD tenant domain and REST API endpoint can be found by clicking on your Azure Media Service instance from the Azure portal, then clicking on “API Access” and then “Connect to Azure Media Services API with service principal”.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*flnM4sLlRSvNIOacKbPIBw.png" /></figure><p>You will then see your tenant domain and REST API endpoint.</p><p>You may generate a Client ID and Secret from this part of the Azure Portal. The interface is clunky and hard to follow, but Microsoft <a href="https://docs.microsoft.com/en-us/azure/media-services/media-services-rest-connect-with-aad#get-aad-auth-info-from-the-azure-portal">has a decent guide for how to generate</a> the client information.</p><p>Once you have the required information, add it to the main method of your console program. This is a bad approach in practice — it is important to never hard-code sensitive data into code or commit it into a repository — but we’re going for the simplest possible solution to start.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1cda6b279730c8f24d070b99c7261a1e/href">https://medium.com/media/1cda6b279730c8f24d070b99c7261a1e/href</a></iframe><p>Now that our credentials are accessible, let’s start building the REST service</p><h4>Building our Azure Media Services Client</h4><p>Let’s create a new class to serve as our Media Encoder Service. Create a <em>Services</em> folder within the Solution Explorer, then create a <em>MediaServices</em> class within the newly created folder.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/62f1d765a06026a46a3b32cc34a178bf/href">https://medium.com/media/62f1d765a06026a46a3b32cc34a178bf/href</a></iframe><p>Now let’s create a constructor that takes the configuration values and stores them internally</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/489fd6c1e2d220b7f5c27d679d9f7a47/href">https://medium.com/media/489fd6c1e2d220b7f5c27d679d9f7a47/href</a></iframe><p>We will need to create an HttpClient instance that will be used to communicate with the AMS REST API. Let’s initialize that client and set the proper request headers:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ad7458b572522cf14c47f5fe333dda16/href">https://medium.com/media/ad7458b572522cf14c47f5fe333dda16/href</a></iframe><p>Pay close attention to the request headers! The AMS API is very sensitive to these values, and any omission or altered value will likely trigger one of many fairly obtuse error messages.</p><p>The next step is to request an access token from AMS. This will allow us to authorize our subsequent requests to AMS. In the <em>MediaServices</em> class, create a method named “InitializeAccessTokenAsync”. The following code will request a token from AMS:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f09565ad27568e3a05c43cc7499cd113/href">https://medium.com/media/f09565ad27568e3a05c43cc7499cd113/href</a></iframe><p>Thanks to the <a href="https://github.com/shawnmclean/azure-media-services-core">azure-media-services-core SDK</a> created by <a href="https://github.com/shawnmclean">Shawn Mclean</a> for the code.</p><p>In the main <em>Program.cs </em>file, initialize a <em>MediaServices </em>instance and request an access token:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2716146a76115f044788da31e8ebdf1d/href">https://medium.com/media/2716146a76115f044788da31e8ebdf1d/href</a></iframe><p>This will require converting the <em>Main </em>program into an asynchronous task. NET Core 2.0 supports asynchronous console-based commands, but the program’s .<em>csproj</em> file must explicitely specify a <em>LangVersion</em> of <em>latest</em>. Your .<em>csproj</em> file may look like this:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2030a1a4ff9457e79b4b0360b4cdd2ee/href">https://medium.com/media/2030a1a4ff9457e79b4b0360b4cdd2ee/href</a></iframe><p>Run the project, and you should have an <em>HttpClient </em>that has been authorized with your access token.</p><p>Congratulations! You have created a <em>MediaServices</em> class and successfully authenticated with your Azure Media Services instance. At this point, your code <a href="https://github.com/jskopek/AzureMediaServicesEncoderNetCore/tree/2dca4cac6436d1a63c2ff297718e555f103a3cca">should look something like this project</a>.</p><p>In <a href="https://medium.com/@jmskopek/encoding-video-with-net-core-and-azure-media-services-part-2-b19e6de42b60">Part 2</a>, we will start uploading files to Azure and creating Media Services Assets.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=51bf6035ffcb" width="1" height="1" alt=""><hr><p><a href="https://medium.com/jean-marcs-thoughts/encoding-video-with-net-core-and-azure-media-services-part-1-51bf6035ffcb">Encoding Video with .NET Core and Azure Media Services — Part 1</a> was originally published in <a href="https://medium.com/jean-marcs-thoughts">Jean-Marc’s Thoughts</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[My Front Row Seat to Pigeon Parenting]]></title>
            <link>https://medium.com/jean-marcs-thoughts/my-front-row-seat-to-pigeon-parenting-d2f4b7a7765?source=rss-7632bae8f743------2</link>
            <guid isPermaLink="false">https://medium.com/p/d2f4b7a7765</guid>
            <category><![CDATA[animals]]></category>
            <category><![CDATA[life]]></category>
            <category><![CDATA[parenting]]></category>
            <category><![CDATA[timelapse]]></category>
            <category><![CDATA[nature]]></category>
            <dc:creator><![CDATA[Jean-Marc Skopek]]></dc:creator>
            <pubDate>Fri, 03 Nov 2017 23:05:43 GMT</pubDate>
            <atom:updated>2017-11-03T23:10:35.021Z</atom:updated>
            <content:encoded><![CDATA[<p>A couple months ago, a pair of pigeons landed on a tree I’d laid out on the balcony. They were acting a little strange, so I went outside to shoo them away. As they reluctantly flew away, I discovered they’d been sitting on two fresh new eggs. And that was the start of my two month long stint as a pigeon dad.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GD9qnI34FJ9evwSWH_RiGg.jpeg" /></figure><p>Being a pigeon parent is a mixed blessing. They don’t make for great pets — at least, not without a whole lot of training. But there’s something really cool about seeing how animals raise children in the wild. So cool, in fact, that I decided to start documenting it.</p><h3>Day 1</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FRpTcKu4u8Z0%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DRpTcKu4u8Z0&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FRpTcKu4u8Z0%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/dd8af1603dc635a8f4174dae3c057212/href">https://medium.com/media/dd8af1603dc635a8f4174dae3c057212/href</a></iframe><p>The pigeons start making preparations, shoving the tree’s soil around and gathering twigs. We name the father Baba and the mother Bubu.</p><h3>Day 2</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F26gkOoo938A%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D26gkOoo938A&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F26gkOoo938A%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/0dbc78feb7f2e2816d929d48d316202f/href">https://medium.com/media/0dbc78feb7f2e2816d929d48d316202f/href</a></iframe><p>Pigeons are actually quite remarkable parents. The father and mother rotate over evenly spaced shifts, roughly 6 hours each. Parents never leave the eggs exposed; the two birds will form a sort of mini locomotive and shuffle over the eggs. Over the course of the two weeks of incubating, I only saw the eggs a handful of times.</p><p>The first few weeks are pretty boring, so let’s skip to the interesting bit…</p><h3>Day 11</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FeMl4xOca97w%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DeMl4xOca97w&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FeMl4xOca97w%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/04b33ef16f48947cac335889aeef2446/href">https://medium.com/media/04b33ef16f48947cac335889aeef2446/href</a></iframe><p>The babies are born! Life changes remarkably for the parents from this point onwards. Baby pigeons have bottomless stomachs, and these parents have two mouths to feed.</p><p>While the children are young, the parents continue the same approach of sitting on top of them. They’ll soon become big enough that the parent’s can no longer cover them.</p><h3>Day 12</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F0TYUl2ag2cc%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D0TYUl2ag2cc&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F0TYUl2ag2cc%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/fdd99ef1c1746a8a004e1a12d1ab8083/href">https://medium.com/media/fdd99ef1c1746a8a004e1a12d1ab8083/href</a></iframe><p>Pigeons feed their children by regurgitating food into their childrens’ mouths. It doesn’t look like a whole lot of fun — there’s only space for one beak in the parents mouths, so both babies are constantly fighting each other for the priviledge. It’s not an issue at first, but when the kids get older the parents will start to snap back.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FT93EaEwNNnc%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DT93EaEwNNnc&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FT93EaEwNNnc%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="640" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/9a8c187fec0434838f84ba90abcc15ca/href">https://medium.com/media/9a8c187fec0434838f84ba90abcc15ca/href</a></iframe><p>Now that the children are born, there’s slightly less urgency to the shift changes.</p><h3>Day 13</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FP_IUkC2iv8Y%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DP_IUkC2iv8Y&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FP_IUkC2iv8Y%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/aa64ec4f849f8e1d4e2d33271cc70824/href">https://medium.com/media/aa64ec4f849f8e1d4e2d33271cc70824/href</a></iframe><p>It’s now been nearly three weeks since the tree’s had any water, but I don’t want to flood the soil and freak out the kids. I decide to try melting ice. It’s kinda effective.</p><h3>Day 14</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F7X05TlUE6Do%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D7X05TlUE6Do&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F7X05TlUE6Do%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/7d933474d9675a0a72b0d1d66cff272e/href">https://medium.com/media/7d933474d9675a0a72b0d1d66cff272e/href</a></iframe><p>Concerned with how quickly the babies are growing — and how the parents cant seem to keep up with the demand — I put out some crackers. This only lasts for a couple of days before I realize that the parents know what they’re doing and don’t need my help.</p><h3>Day 16</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F6f_tTFbjm1A%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D6f_tTFbjm1A&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F6f_tTFbjm1A%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/d3104ec413161fb21a2145e15d3a14cd/href">https://medium.com/media/d3104ec413161fb21a2145e15d3a14cd/href</a></iframe><p>The babies are finally big enough that the parents can’t feed them enough through shifts. That, or they’re getting sick of the whole parenting thing. They start leaving the babies alone for small periods of time.</p><h3>Day 17</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FrKgP9sjofVU%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DrKgP9sjofVU&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FrKgP9sjofVU%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/4e77dd94c604ef7b9a349e3121c2fcfa/href">https://medium.com/media/4e77dd94c604ef7b9a349e3121c2fcfa/href</a></iframe><p>The babies are growing bigger day-by-day. The yellow fuzz that completely covered them at the start is starting to make way for spines. These will eventually turn into full-blown feathers.</p><h3>Day 18</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FQSO1DfYTL_4%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DQSO1DfYTL_4&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FQSO1DfYTL_4%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/b05e8f8b7cc62d78e707453936d28635/href">https://medium.com/media/b05e8f8b7cc62d78e707453936d28635/href</a></iframe><p>The babies are so big they can no longer be completely covered by the parents. The spines start to get puffs of feathers on them. The parents are starting to leave the kids alone for longer and longer periods of time. Every time a seagull swoops by the window, I hold my breath and hope it doesn’t spot the babies.</p><h3>Day 20</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FGnUu0lA4mNk%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGnUu0lA4mNk&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FGnUu0lA4mNk%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/a05cfde8b619038d8cedec571e9e559c/href">https://medium.com/media/a05cfde8b619038d8cedec571e9e559c/href</a></iframe><p>Disaster! A seagull spots the babies and goes in for the attack. I manage to shoo it away in the nick of time, but it keeps coming back for more. I put together a cardboard sanctuary — just big enough for the parents to squeeze through, but small enough that seagulls don’t have space.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FyMcLjdyr5qI%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DyMcLjdyr5qI&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FyMcLjdyr5qI%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="640" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/4707acd1d04e4f5852ed22a4405cad9d/href">https://medium.com/media/4707acd1d04e4f5852ed22a4405cad9d/href</a></iframe><p>The parents don’t know what to do about this new setup at first, but they figure it out soon enough.</p><h3>Day 21</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F6JwNukye8UY%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D6JwNukye8UY&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F6JwNukye8UY%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/0b3456e2ecd24d2bbfe464764344acaf/href">https://medium.com/media/0b3456e2ecd24d2bbfe464764344acaf/href</a></iframe><p>The pigeons are really starting to develop a coat now. They’re also big enough that their poop really starts to pile up.</p><h3>Day 25</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eP2WunCADGXq9ryzjNtFtA.jpeg" /></figure><p>The babies really go for it during feeding. As cool as it must be to raise kids, the feeding part doesn’t seem fun.</p><h3>Day 26</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*u9EoyAGjO9QHDASWiC8HMQ.jpeg" /></figure><p>The babies are starting to look like actual pigeons now. It wont be too long before they start stretching their wings.</p><h3>Day 28</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F-bgdwj5IR0c%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D-bgdwj5IR0c&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F-bgdwj5IR0c%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/06fb51e4d149d2de03436039ad47696e/href">https://medium.com/media/06fb51e4d149d2de03436039ad47696e/href</a></iframe><p>Bebe and Dreamliner are now stretching their wings and moving around a ton. They’re also starting to develop personalities.</p><p>The bigger one is Dreamliner. He’s always been the more dominant of the two, and his extra work at clawing food out of mom and dad is really starting to show.</p><h3>Day 31</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FTUAH926q1H4%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DTUAH926q1H4&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FTUAH926q1H4%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/7a873631ffbd701a8173c737fc03d101/href">https://medium.com/media/7a873631ffbd701a8173c737fc03d101/href</a></iframe><p>The balcony is starting to look a lot like a recycling bin. I’m constantly adding new layers of cardboard in an effort to prevent the floor from looking like a Jackson Pollock painting.</p><p>The pigeons may be going to town on the balcony, but they’re starting to look awfully mature. The yellow strands of hair that have been with them from the very beginning are nearly completely covered by feathers.</p><h3>Day 32</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FWX-Y6Amoki8%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DWX-Y6Amoki8&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FWX-Y6Amoki8%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/009f6aaf7cb754f97b724a70ad2d6c67/href">https://medium.com/media/009f6aaf7cb754f97b724a70ad2d6c67/href</a></iframe><p>The last full day of filming. The pigeons still have a ways to go, but they’re starting to get too big for the bulky timelapse setup to work properly. They’re also — understandably — quite afraid of the strange man that keeps fiddling around near them every day.</p><h3>Day 35</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YOGqSG-GX-h1xElpvp50dA.jpeg" /></figure><p>The babies are nearly adult size by now. The parents have long given up the idea of sitting in the same tree. They tuck up a few feet away, out of sight of the babies so they can get some peace and quiet.</p><h3>Day 41</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VZV-IRt9QStPo6cjvc-_EA.jpeg" /></figure><p>The bi-hourly feeding cycle. Pigeon dentists must be awfully busy.</p><h3>Day 42</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5uoFyo39wTpof19GSpmj2A.jpeg" /></figure><p>Bebe cautiously checking his boundaries. As the pigeons grew bigger, they seemed to grow less afraid of my presence.</p><h3>Day 44</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Wekm6Va-3ByLLJeGC35lcg.jpeg" /></figure><p>The day before the first flight. Dreamliner (the one on the right) comes back once to tell us he’s all right, but then he’s off to live his own life. Bebe (on the left) and the parents still come back every once in a while, but the family seems to have found some other place to live their life. And that’s all right with me.</p><p>All in all, it was a pretty remarkable experience. Pigeons are actually fascinating animals, and watching the devotion to their kids made me appreciate what my parents did for me. They didn’t even have to throw up in my mouth.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d2f4b7a7765" width="1" height="1" alt=""><hr><p><a href="https://medium.com/jean-marcs-thoughts/my-front-row-seat-to-pigeon-parenting-d2f4b7a7765">My Front Row Seat to Pigeon Parenting</a> was originally published in <a href="https://medium.com/jean-marcs-thoughts">Jean-Marc’s Thoughts</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How does Dropbox Paper have such pretty text?]]></title>
            <link>https://medium.com/jean-marcs-thoughts/how-does-dropbox-paper-have-such-pretty-text-a0e0fa4e8d97?source=rss-7632bae8f743------2</link>
            <guid isPermaLink="false">https://medium.com/p/a0e0fa4e8d97</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[typography]]></category>
            <category><![CDATA[design]]></category>
            <dc:creator><![CDATA[Jean-Marc Skopek]]></dc:creator>
            <pubDate>Fri, 15 Sep 2017 07:46:16 GMT</pubDate>
            <atom:updated>2017-11-04T07:08:18.609Z</atom:updated>
            <content:encoded><![CDATA[<p>I’ve been hearing good things about Dropbox Paper for a while now, but it wasn’t until a couple of days ago that I finally got around to trying it.</p><p>Wow, what a beautiful tool.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*wE9R9nnwLUPQYg-C4srNAw.png" /></figure><p>I wish I could bottle what it is I love about Dropbox Paper and carry it with me; that would be a hell of a formula.</p><p>A lot of it comes down to the typography; it’s a word editor, after all. Something about the type invites you to write; you want to fill the screen up with content just so you can see what it looks like.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/827/1*rr9_lCD4Vy69TxZICQCh1Q.png" /><figcaption>So pretty I want to lick it</figcaption></figure><p>How do they do it? Well, let’s start with the basic bits:</p><pre>font-family: AtlasGrotesk-editor-rtl, AtlasGrotesk-editor, -apple-system, BlinkMacSystemFont, “Segoe UI”, Roboto, Oxygen, Ubuntu, Cantarell, “Open Sans”, “Helvetica Neue”, sans-serif;<br>font-size: 16px;<br>line-height: 26px;<br>color: #1b2733;</pre><p>Atlas Grotesk is a beautiful font, and the off-black color and spacing give make it feel airy and a little less serious.</p><p>What surprises me most are the little tweaks, like this one:</p><pre>font-variant-ligatures: no-common-ligatures;</pre><p>This rule was intentionally added, but the difference with it enabled is minute. I suspect a lot of the beauty comes from a series of minor changes. Changes such as smoothing:</p><pre>-webkit-tap-highlight-color: rgba(0,0,0,0);<br>-webkit-font-smoothing: antialiased;</pre><p>Some people <a href="http://usabilitypost.com/2012/11/05/stop-fixing-font-smoothing/">really don’t like it</a> when you override the font smoothing. I personally think it’s an improvement.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DtAuLEIWNO-rB-DYyBaD9Q.png" /></figure><p>I’d be lying if I said it feels like a night and day difference, but it does feel better when set to antialiased.</p><p>The whole design is sprinkled with small touches like this. Every piece of the tool feels like it had a lot of thought and care put into it.</p><p>My biggest takeaway? <em>Minor tweaks add up.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a0e0fa4e8d97" width="1" height="1" alt=""><hr><p><a href="https://medium.com/jean-marcs-thoughts/how-does-dropbox-paper-have-such-pretty-text-a0e0fa4e8d97">How does Dropbox Paper have such pretty text?</a> was originally published in <a href="https://medium.com/jean-marcs-thoughts">Jean-Marc’s Thoughts</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Setting up a Python and Postgres development environment using Vagrant]]></title>
            <link>https://medium.com/jean-marcs-thoughts/setting-up-a-python-and-postgres-development-environment-using-vagrant-97554874c834?source=rss-7632bae8f743------2</link>
            <guid isPermaLink="false">https://medium.com/p/97554874c834</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[vagrant]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Jean-Marc Skopek]]></dc:creator>
            <pubDate>Sun, 20 Nov 2016 03:32:15 GMT</pubDate>
            <atom:updated>2018-09-20T02:44:36.698Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ht2KlSrsjFYzu8ZgZimz-A.png" /><figcaption>View from <em>Original Coffee</em> in the heart of Prague. Love this little coffee shop!</figcaption></figure><p>It can always be a little annoying getting a fresh new work environment running. This guide is my attempt to keep track of how to get running as quickly as possible.</p><p>We’ll be using Vagrant, so these instructions should work with pretty much every development environment out there. I’m running this on a PC at the moment, but the same guide should work with Mac or Linux environments as well.</p><h4>1. Setting up Vagrant</h4><p>Start by downloading and installing the latest version of Vagrant. Installation should be pretty straightforward, and at the end you should have access to the <em>vagrant </em>command from the CLI.</p><p>The default approach is to initialize a bare-bones version of ubuntu and to build it up from there. The way to do this as of now is with the following two commands:</p><pre>$ vagrant init hashicorp/precise64<br>$ vagrant up</pre><p>We’ll be doing things a little differently because of Postgres. While it would be totally doable to install Postgres manually after initializing a barebones version of Ubuntu, <a href="https://wiki.postgresql.org/wiki/PostgreSQL_For_Development_With_Vagrant">the following configuration</a> speeds things up considerably</p><pre># Clone the repository:<br>$ git clone https://github.com/jackdb/pg-app-dev-vm myapp<br><br># Remove the .git, README, and LICENSE files:<br>$ cd myapp<br>$ rm -rf .git README.md LICENSE<br>$ vagrant up</pre><p>You’ll likely want to make a few tweaks to the provided Vagrantfile after everything is set up. After calling…</p><pre>$ vagrant halt</pre><p>… I went ahead and changed the following two lines</p><pre># Disable original shared folder <br># config.vm.share_folder &quot;bootstrap&quot;, &quot;/mnt/bootstrap&quot;, &quot;.&quot;, :create =&gt; true</pre><pre># Set up new share, mapping vagrant folder to ~ within environment<br>config.vm.share_folder &quot;home&quot;, &quot;/home/vagrant&quot;, &quot;.&quot;, :create =&gt; true</pre><pre># Disable PostgreSQL Server port forwarding<br># config.vm.forward_port 5432, 15432</pre><pre># Enable web server port forwarding<br>config.vm.forward_port 8000, 8000</pre><h4>2. Setting up Postgres</h4><p>Now that Postgres is set up, let’s go about creating a new database and account for it:</p><pre>$ sudo su - postgres<br>$ psql<br># CREATE USER app_local WITH PASSWORD &#39;app_local&#39;;<br># CREATE DATABASE db_local;<br># GRANT ALL PRIVILEGES ON DATABASE db_local TO app_local;</pre><h4>3. Setting up the Python environment</h4><p>The next step is to install Virtualenv, which simplifies the process of managing Python libraries significantly. Start by installing the required packages</p><pre>sudo apt-get install python-pip python-dev build-essential</pre><p>Once this is in place, we can go about installing virtualenv</p><pre>sudo pip install virtualenv virtualenvwrapper</pre><p>We should update pip to the latest version prior to setting up our virtualenv environment</p><pre>sudo pip install --upgrade pip</pre><p>In order to use virtualenvwrapper, we need to modify our bashrc file. Make sure to keep a copy in case anything goes wrong:</p><pre>printf &#39;\n%s\n%s\n%s&#39; &#39;# virtualenv&#39; &#39;export WORKON_HOME=~/virtualenvs&#39; \<br>&#39;source /usr/local/bin/virtualenvwrapper.sh&#39; &gt;&gt; ~/.bashrc<br>source ~/.bashrc<br>mkdir -p $WORKON_HOME</pre><p>Now we can set up our virtualenv:</p><pre>mkvirtualenv venv --always-copy<br>workon venv</pre><p>The — always-copy flag solves <a href="http://stackoverflow.com/questions/24640819/protocol-error-setting-up-virtualenvironment-through-vagrant-on-ubuntu">an issue with vagrant</a>.</p><h4>4. Final Steps</h4><p>You’re pretty much good to go at this point. I went ahead and cloned my project into the home directory (which should be whatever folder you set up the Vagrant environment in). I then ran a <em>pip install -r requirements.txt</em> command from within the virtual environment.</p><p>I had to install a few dependencies before I could get a successful pip install, namely because of my postgres connection library. These package got everything working:</p><pre>sudo apt-get install libpq-dev libncurses5-dev</pre><p>My particular build also called for a redis server, which I was able to set up in one line:</p><pre>sudo apt-get install redis-server</pre><p>To keep things as simple as possible, I keep all my development environment variables in my <em>~/.bashrc</em> file. This has obvious limitations, but because I am devoting this entire Vagrant environment to one project it shouldn’t cause any issues for me. Here’s what the tail end of my <em>.bashrc</em> file looks like:</p><pre>workon venv<br>export DATABASE_URL=postgres://app_local:app_local<a href="http://twitter.com/localhost/db_local">@localhost/db_local</a><br>export REDIS_URL=redis://127.0.0.1:6379/0<br>export DEBUG=True</pre><p>I tend to use <a href="https://devcenter.heroku.com/articles/heroku-local">Heroku Local</a> or Foreman to handle environment variables when I’m doing anything more complicated.</p><p>If you’re dealing with any `npm` packages, you may need to run some extra steps. The version of node that comes with Ubuntu 12.04 is very outdated, so the first step is updating to a stable new version of node.</p><pre>sudo apt-get purge nodejs npm<br>curl -sL <a href="https://deb.nodesource.com/setup_4.x">https://deb.nodesource.com/setup_4.x</a> | sudo bash -</pre><p>If you’re installing node modules into a shared vagrant folder, you will likely run into the <a href="https://github.com/npm/npm/issues/7308">same issue</a> as seen with the virtualenv install. To solve this, make sure to use the --no-bin-link argument</p><pre>npm install — no-bin-link</pre><h4>Conclusion</h4><p>That was pretty easy! As you can see, it should take less than an hour to get a complete end-to-end environment set up.</p><p>I’d like to thank <a href="http://exponential.io/blog/2015/02/10/install-virtualenv-and-virtualenvwrapper-on-ubuntu/">Exponential.io</a> and <a href="https://wiki.postgresql.org/wiki/PostgreSQL_For_Development_With_Vagrant">Postgres</a> for their helpful guides.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=97554874c834" width="1" height="1" alt=""><hr><p><a href="https://medium.com/jean-marcs-thoughts/setting-up-a-python-and-postgres-development-environment-using-vagrant-97554874c834">Setting up a Python and Postgres development environment using Vagrant</a> was originally published in <a href="https://medium.com/jean-marcs-thoughts">Jean-Marc’s Thoughts</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[You should localize your website]]></title>
            <link>https://medium.com/@jmskopek/you-should-localize-your-website-d13b78ccbd48?source=rss-7632bae8f743------2</link>
            <guid isPermaLink="false">https://medium.com/p/d13b78ccbd48</guid>
            <category><![CDATA[language]]></category>
            <category><![CDATA[translation]]></category>
            <dc:creator><![CDATA[Jean-Marc Skopek]]></dc:creator>
            <pubDate>Mon, 11 Jul 2016 16:11:19 GMT</pubDate>
            <atom:updated>2016-07-12T10:50:45.461Z</atom:updated>
            <content:encoded><![CDATA[<h4>The internet is global. If your website isn’t, it should be</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Pdnvv-kAFt4dPOTzTM0i1A.jpeg" /><figcaption>Academie Nationale De Musique, Paris</figcaption></figure><p>If you’re like me, you’ve probably mainly thought about building websites in English. This has been my de-facto approach until recently, when I started travelling the world. I suddenly realized that the world doesn’t just operate in English. It’s not even an especially popular language:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=%2F%2Fjean-marcs-thoughts.silk.co%2Fs%2Fembed%2FkAtXy2v%3Foembed%3D&amp;url=http%3A%2F%2Fjean-marcs-thoughts.silk.co%2Fexplore%2FkAtXy2v&amp;image=http%3A%2F%2Fd548fecxfnojt.cloudfront.net%2Fclients%2Fwebsite%2F3aeb4b7e98cffc02b40ad01d4c8e9c69%2Fimages%2Flogo%2Flight.png&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;type=text%2Fhtml&amp;schema=silk" width="800" height="800" frameborder="0" scrolling="no"><a href="https://medium.com/media/ef9e95987d67e962acbfd4eee7a35ecf/href">https://medium.com/media/ef9e95987d67e962acbfd4eee7a35ecf/href</a></iframe><p>If you only offer your content in English, you risk never being seen by the vast majority of the world. Even if the majority of a foreign country speaks good English — as is the case in the case of Barcelona, where I am currently writing this — it’s likely that Google will prioritize you way below local language websites. My employer — <a href="https://www.sokanu.com/">Sokanu</a> — publishes incredible career guides for people looking to find a new career, and yet our pages don’t even show up in Spain despite ranking highly in North America.</p><p>This is all well and good, but translations aren’t free. There’s a huge cost behind getting your content into different languages (although Duolingo is <a href="https://www.duolingo.com/comment/954969">trying to change that</a>). Thankfully, technology is coming to the rescue. Google Translate has made huge strides over the past year, and is <a href="https://www.taus.net/think-tank/articles/everything-you-ever-wanted-to-know-about-google-translate-and-finally-got-the-chance-to-ask">getting better all the time</a>. Thanks to public APIs, content can now be automatically translated across dozens of languages as soon as it is created. This isn’t ideal, of course, but it serves as a great first step. Once a baseline is established, it’s far easier to go in and manually translate content in order of priority.</p><p>I’ll be spending the next couple of days putting this idea into practice, and I’ll try blogging about the process.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d13b78ccbd48" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[For when I feel I have nothing worth saying]]></title>
            <link>https://medium.com/@jmskopek/for-when-i-feel-i-have-nothing-worth-saying-1a4bc0797387?source=rss-7632bae8f743------2</link>
            <guid isPermaLink="false">https://medium.com/p/1a4bc0797387</guid>
            <dc:creator><![CDATA[Jean-Marc Skopek]]></dc:creator>
            <pubDate>Mon, 09 May 2016 05:41:33 GMT</pubDate>
            <atom:updated>2016-05-09T05:42:29.577Z</atom:updated>
            <content:encoded><![CDATA[<p>When you can think of nothing, fall back on what makes you unique.</p><p>So, what’s unique about me?</p><p>I could write about my weird fascination with fountain pens. About falling asleep to chess. About my theory that falling asleep to chess would make me a better chess player, and my disappointment when I realized it didn’t.</p><p>I could write about my background with computers. About the person who taught me how to write my first program. About being a nerd in university. About getting my first job. About watching a startup grow. About switching from full-time to freelance, and then back to full-time again.</p><p>I could write about the way I’ve decided to interact with people. About finding mutually-beneficial arrangements. About getting the things you want to have without being a dick.</p><p>I could write about my hobbies. Write about photography. Write about going on hikes. About skiing. About joining the ski patrol. About experiencing the first major accident. About how the second was different.</p><p>I could write about my life. About living out of a backpack. About travelling alone. About projects I’m working on and trips I’m undertaking. About discovering that I’m a morning person, and how that is changing my life. About my favorite place on the planet. About the move from Toronto to Vancouver. About my biggest mistakes so far, and my best accomplishments. About stories that really stick with me.</p><p>I guess we’re all pretty unique.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1a4bc0797387" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>