<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Piotr Kościelniak - passionate programmer</title>
    <link>http://koscielniak.me/post/</link>
    <description>Recent content in Posts on Piotr Kościelniak - passionate programmer</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 06 Mar 2018 22:19:25 +0100</lastBuildDate>
    <atom:link href="http://koscielniak.me/post/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Free online text to mp3 converter</title>
      <link>http://koscielniak.me/post/2018/03/free-online-text-to-mp3-converter/</link>
      <pubDate>Tue, 06 Mar 2018 22:19:25 +0100</pubDate>
      
      <guid>http://koscielniak.me/post/2018/03/free-online-text-to-mp3-converter/</guid>
      <description>&lt;p&gt;Once upon a time, I had a meeting and we intended to discuss a particular document during this meeting.
Of course, the other participants expected me to be prepared
by reading this document. The content of this document was
&lt;strong&gt;&lt;em&gt;so&lt;/em&gt;&lt;/strong&gt; fascinating that I waiting until the very last moment to read it and finally I realized that I didn’t have any time to read it. In case you haven’t realized, that last sentence was a bit of sarcasm.&lt;/p&gt;

&lt;p&gt;What ended up happening was that 30 minutes before the meeting, I still didn’t know what was it that bloody document but I knew I needed 20 minutes to commute to the meeting. Driving a car and reading is not a good idea even during rush hour. But necessity is the mother of invention. I thought “Maybe I can convert this document to audio and I listen to it during the ride?” I would be offline during the ride so I thought I could convert this text to mp3, download the file to my phone and listen to it during my journey. “Yeah&amp;hellip;that should be easy”, I thought.&lt;/p&gt;

&lt;p&gt;Not at all. The document was a bit lengthy, that’s why I was procrastinating until the final moment. I started looking for an online tool to change my text to an audio format, preferably mp3, but I failed. Every online tool had some drawback. Lack of support for Polish, a limited of number of characters, and of course some of them required payment and I was looking for something free. The truth is, I was lost during the meeting. I sat there awkwardly, pretending that I knew the contents of the document, nodding along with what the other speakers were saying.&lt;/p&gt;

&lt;p&gt;I promised myself then and there: next time I would be prepared. I would create a tool to save my ass when this kind of situation happened again.
This is how the &lt;a href=&#34;https://text2mp3.online/&#34;&gt;text2mp3&lt;/a&gt; app originated.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2018/03/text2mp3.png&#34; alt=&#34;text2mp3&#34; title=&#34;text2mp3&#34; /&gt;&lt;/p&gt;

&lt;p&gt;It is a very simple tool which allows you to paste some text, convert it to audio, listen to it online or download it to your device. Nothing remarkable but very useful. It is free and it allows you to convert text as long as 5000 characters. Additionally, it has unpretentious, succinct GUI designed by a programmer. That was also sarcasm in case you didn’t pick it up. Please feel free to use it. Please enjoy it. And if it saves your ass please buy me a coffee.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Self-signed certificate? All you need is go</title>
      <link>http://koscielniak.me/post/2017/12/self-signed-certificate-all-you-need-is-go/</link>
      <pubDate>Tue, 19 Dec 2017 22:13:28 +0100</pubDate>
      
      <guid>http://koscielniak.me/post/2017/12/self-signed-certificate-all-you-need-is-go/</guid>
      <description>&lt;p&gt;Are you writing code in Go (Golang)?
And do you sometimes need to create
a self-signed test certificate?
I have, and that’s why I am writing this post to remind myself
(and you) how to do this. I’ll be happy if someone
else will also benefit from this information.
Do this to create a self-signed test certificate:&lt;/p&gt;

&lt;p&gt;On Linux:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;go run $GOROOT/src/crypto/tls/generate_cert.go --rsa-bits 1024 --host 127.0.0.1,::1,localhost --ca --start-date &amp;quot;Jan 1 00:00:00 1970&amp;quot; --duration=1000000h&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;On Windows:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;go run %GOROOT%/src/crypto/tls/generate_cert.go --rsa-bits 1024 --host 127.0.0.1,::1,localhost --ca --start-date &amp;quot;Jan 1 00:00:00 1970&amp;quot; --duration=1000000h&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After executing this command you get the files &lt;code&gt;cert.pem&lt;/code&gt; and &lt;code&gt;key.pem&lt;/code&gt;. And that’s it!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>‘Mine’ field or minefield?</title>
      <link>http://koscielniak.me/post/2017/03/mine-field-or-minefield/</link>
      <pubDate>Thu, 16 Mar 2017 22:48:16 +0100</pubDate>
      
      <guid>http://koscielniak.me/post/2017/03/mine-field-or-minefield/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2017/03/minesweeper.png&#34; alt=&#34;Minesweeper&#34; title=&#34;Minesweeper&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Sometimes you write a piece of code or feature, or even a whole application by yourself. In some cases, no one else knows what you’ve written. Sometimes you are glad for this freedom. Freedom is the right word because you’re glad to have your code the way you want it: everything in its place and in proper working order. I say proper working order instead of perfect for a reason. Inevitably, one day you’ll return to this piece of code or application and wonder: &lt;em&gt;“who the hell wrote this code?”&lt;/em&gt;
And of course, git is laughing at you and saying &lt;em&gt;“you, bloody bastard”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Wouldn’t it be nice if you were able to ask someone to look at your code the moment it was written, and then together, be able to write this code in a way where you wouldn’t be ashamed of it in the future? Yea, maybe, but many programmers feel a bit guilt about showing their code to someone else while asking for a review. They feel like showing their code is a private thing, for some programmers it can feel like pulling down their pants and asking someone &lt;em&gt;“hey, does this mole look weird?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It’s perfectly normal to feel like this, but you know what? Fuck it. Ask yourself what really matters. Isn’t it good for you to improve and become a better programmer? Even more, isn’t it an asset to your company if you can create valuable code that is the best quality possible? If you have said yes, then you too can remove your pants for a minute or two and bear the shame of asking for help.
Not to mention, there’s always the chance of someone giving you a compliment about other things while checking if the mole is serious or not. I don’t know about you, but I’d appreciate a compliment like that.&lt;/p&gt;

&lt;p&gt;Often, I hear the sentiment: “It was hard to write, it must be hard to read.” Fortunately, I have heard this joke, but unfortunately, there are people who think this approach can guarantee a long lasting job in their company, because nobody else can deal with the code they have written. They naively think writing complicated code makes them indispensable. I beg to differ, and I believe this way of thinking is not only wrong, but antiquated. Let’s debate who is more valuable for the company with two scenarios:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Person A structures projects that are not only scalable, but also allows programmers to be added as needed, in addition to writing code that is maintainable. Furthermore, when they are absent or leave the company, you don’t need to worry because they leave a readable, maintainable code that anyone can dive right into comfortably.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Person B writes code that resembles ancients ruins that only they can maintain. You think this person is valuable to the company, but when they are absent or quit, most of their projects unravel or come to a standstill. It’s only when this person leaves that you realise the extent of how unmaintainable their code is. In essence, everything needs to be rewritten after they’ve left.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, honestly ask yourself which person you’d prefer to have in a company you own.
Whether you want to or not, your code leaves mines on the field where you work. If you ask someone frequently to review your work, or if you work with someone else as a team, you will be alerted about these mines, early. When you work alone, quite often you are aware of the landmines that you leave, but you have the home field advantage and know where to place your steps.&lt;/p&gt;

&lt;p&gt;However, it’s important to remember that someone else may have to enter your zone&amp;hellip;and then what? Would you like to have someone’s life on your conscience? I don’t think so. You know they might be able to survive the explosion, but do you want them to seek revenge? It’s better not to leave landmines or defuse them as quickly as possible, and in this field, it’s indispensable to have the helping hand of another sapper/programmer.&lt;/p&gt;

&lt;p&gt;If you’re not comfortable asking someone else for help, sooner or later you’ll learn to because without this skill you’ll create minefields which will blow many programmers out of the water. That’s a lot of potential enemies in a small industry. Open your field for sappers and open your mind to code review. Before it’s too late.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Wroc# is coming</title>
      <link>http://koscielniak.me/post/2017/01/wrocsharp-is-coming/</link>
      <pubDate>Thu, 26 Jan 2017 23:11:32 +0100</pubDate>
      
      <guid>http://koscielniak.me/post/2017/01/wrocsharp-is-coming/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.wrocsharp.com/&#34;&gt;&lt;img src=&#34;http://koscielniak.me/post/2017/01/wrocsharp-is-coming.jpg&#34; alt=&#34;Wroc# is coming&#34; title=&#34;Wroc# is coming&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://www.wrocsharp.com/&#34; &gt;Wroc#&lt;/a&gt; is coming. You don’t know what that is? It’s the most amazing conference I’ve ever attended.
If you’ve never been, I highly recommend you visit this year. If you miss this opportunity, you’ll never experience a more perfect conference in Poland. This year, one of my favourite idols,
&lt;a href=&#34;https://twitter.com/stevensanderson&#34;&gt;Steve Sanderson&lt;/a&gt;
will be presenting. I proposed him
after &lt;a href=&#34;http://koscielniak.me/post/2016/03/wrocsharp-2016-knowledge-networking-and-objectivity-office-tour/&#34;&gt;last year&amp;rsquo;s conference&lt;/a&gt; and big kudos to the planning team for fulfilling my wish.&lt;/p&gt;

&lt;p&gt;Unfortunately, I cannot be there this year. I’ll be sad, and a bit regretful about it, but my absence means a free place for someone like you to attend! Don’t miss your chance, because next year I won’t be leaving this free space for you.&lt;/p&gt;

&lt;p&gt;Don’t hesitate and be sure to register for this conference.
Registration starts in February, but I can assure you that availability won’t last for long. Personally, I believe within 10 minutes or so the tickets will be sold out. Be sure to follow Wroc#
on &lt;a href=&#34;https://twitter.com/WrocSharp&#34;&gt;social media&lt;/a&gt;, and have a specially brewed Wroc# beer for me. Also be sure to tweet highlights so I can follow the event from my man cave. Have fun!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I made my first Chrome extension and lived to tell the tale</title>
      <link>http://koscielniak.me/post/2016/11/i-made-my-first-chrome-extension-and-lived-to-tell-the-tale/</link>
      <pubDate>Tue, 01 Nov 2016 23:00:00 +0100</pubDate>
      
      <guid>http://koscielniak.me/post/2016/11/i-made-my-first-chrome-extension-and-lived-to-tell-the-tale/</guid>
      <description>&lt;p&gt;This story began this year during the summer. I bought myself a guitar in order to remind myself of a few guitar riffs. After a several weeks of looking at this guitar, I finally started to play it. I always wanted to learn a couple of Brian Setzer’s riffs, so I typed &lt;em&gt;Brian Setzer riffs&lt;/em&gt; in the YouTube search bar and I found what I was looking for. But these guys played so fast that I couldn’t keep up with them. Luckily, the YouTube video player has an option to slow down a video but it is rather poor.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/11/playbackrateoptions.png&#34; alt=&#34;YouTube playback rate options&#34; title=&#34;YouTube playback rate options&#34; /&gt;&lt;/p&gt;

&lt;p&gt;As you can see, you can only slow it down to 50%. (Slowing it down to 25% causes the sound to mute). So what did I do? I opened Chrome DevTools and I found the video element on the page.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/11/devtools.png&#34; alt=&#34;Chrome DevTools and the video tag&#34; title=&#34;Chrome DevTools and the video tag&#34; /&gt;&lt;/p&gt;

&lt;p&gt;When you click on this tag, you get access to it in the console under the &lt;code&gt;$0&lt;/code&gt;. And then you can slow down the video to speed whatever you want. For example to 0.6.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/11/consoleplaybackrate.png&#34; alt=&#34;The playback rate set in the console&#34; title=&#34;The playback rate set in the console&#34; /&gt;&lt;/p&gt;

&lt;p&gt;After practicing for a short while, I was completely exhausted not by playing the guitar, but because I kept rewinding to the place in the video where I wanted to start practicing from. The player always rewound too far back. My first thought was: “I have access to the video tag. I can quickly write a function in the console to loop the fragment of the song which I want to practice”. After a while, I typed this in the browser console:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var video = $0
var start = 0
var stop = 3


video.addEventListener(&#39;timeupdate&#39;,() =&amp;gt;  {
   if (video.currentTime &amp;gt; stop ) {
       video.currentTime = start;
   }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now I could simply manipulate start and stop variables to loop the exact fragment of the song that I wanted.&lt;/p&gt;

&lt;p&gt;But, what came next? I thought for sure someone had written an extension for Chrome which did what I had just done. And of course I was right. I tried one and it turned out to be complete rubbish&amp;hellip;it even didn’t start. I tried another one but it required too much mouse clicking to do what I wanted, so I decided to write my own.&lt;/p&gt;

&lt;p&gt;I started on &lt;a href=&#34;https://developer.chrome.com/extensions/getstarted&#34;&gt;this page&lt;/a&gt; where I found resources for further exploration. After two hours, I had the first version of my Chrome extension with a keyboard interface. Different keys control different functions, for example: one key sets a point A and another sets a point B anywhere in the song, another key sets point A to the beginning of the song and point B to the end of the song, while other keys allow you to slow down and speed up a song. The next day I added the ability to turn this plugin on and off and some labels which appear on YouTube videos to show values for point A, B and also for the current playback rate.&lt;/p&gt;

&lt;p&gt;It was a fun experience to playing around with Chrome extension. The most frustrating thing was discovering how to refresh and debug this extension because extensions have content scripts and background scripts and they are debugged in two separate DevTools windows. There is a shortcut to refreshing an extension &lt;em&gt;CTRL+R&lt;/em&gt; but sometimes you can press it in the wrong window. The safe option is to refresh the extension on this page chrome://extensions/ and click &lt;em&gt;Reload&lt;/em&gt;. In this place, you can also get some errors which may appear while your extension is loading. For example, unavailable file.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/11/reload.png&#34; alt=&#34;Where reload the extension&#34; title=&#34;Where reload the extension&#34; /&gt;&lt;/p&gt;

&lt;p&gt;My extension adds this little icon at the top of the browser. Which turns the extension on and off.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/11/icon.png&#34; alt=&#34;The extensions icon&#34; title=&#34;The extensions icon&#34; /&gt;&lt;/p&gt;

&lt;p&gt;When it is on, you can see some labels at the top of video which shows the current value for point A, B and the playback rate.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/11/labels.png&#34; alt=&#34;The labels&#34; title=&#34;The labels&#34; /&gt;&lt;/p&gt;

&lt;p&gt;This extension only has a keyboard interface with specific keys which control the functions. The Q,W,E keys are used to control point A; the A,S,D keys are used to control point B; the playback rate is managed using the Z,X,C keys and finally the R key resets points A,B to the beginning and end respectively.&lt;/p&gt;

&lt;p&gt;There is a lot of room for improvement with this extension but now I am happy with what I have and I can fully enjoy learning another Brian Setzer solo.&lt;/p&gt;

&lt;p&gt;By the way, the source code of this extension is &lt;a href=&#34;https://github.com/pikoscielniak/guitartrainer&#34;&gt;here&lt;/a&gt;.
It hasn’t been published yet but you can download it from repo as a zip file then unpack it. On the page chrome://extensions/ select &lt;em&gt;Developer mode&lt;/em&gt; and then load the extension by clicking the button “Load unpacked extension…” and selecting the folder where you unzipped the code from repo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/11/chromeextensionspage.png&#34; alt=&#34;Chrome extensions page&#34; title=&#34;Chrome extensions page&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Have fun.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>bbq4.it Recap</title>
      <link>http://koscielniak.me/post/2016/09/bbq4_it_recap/</link>
      <pubDate>Tue, 20 Sep 2016 23:10:03 +0200</pubDate>
      
      <guid>http://koscielniak.me/post/2016/09/bbq4_it_recap/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/bbq4it.png&#34; alt=&#34;bbq4.it&#34; title=&#34;bbq4.it&#34; /&gt;&lt;/p&gt;

&lt;p&gt;On June 24th, 2015, I was returning home from the Devvox PL conference in Cracow. During this journey,
&lt;a href=&#34;http://www.benedykt.net/&#34; target=&#34;_blank&#34;&gt;Arkadiusz Benedykt&lt;/a&gt;
and I were discussing how nice it would be to organize a conference in our city, Bielsko-Biala.
Then, at the beginning of June 2016
&lt;a href=&#34;http://www.rekord.com.pl/&#34; target=&#34;_blank&#34;&gt;my company&lt;/a&gt; was thinking about organizing a small meetup for students from our area. It was then that Arek and
I remembered our discussion and we suggested combining our idea with the company’s idea.
After brainstorming, we formulated a plan to organize a small conference in the form of a
BBQ to gather people related to the IT sector in our area. Another brainstorming session lead to the name:
&lt;a href=&#34;http://bbq4.it/&#34; &gt;bbq4.it&lt;/a&gt; and after some time we had about 75% of the agenda laid out. However,
if it wasn’t for
&lt;a href=&#34;https://www.facebook.com/piotr.szymura.37&#34;&gt;Piotr Szymura&lt;/a&gt;, things would have died in the planning stages. He took the weight of preparing the conference, unto his shoulders and thanks to him and the other hardworking people at our company, we managed to organize bbq4.it. Our collective efforts paid off, as we attracted almost 300 people.&lt;/p&gt;

&lt;p&gt;I want to recall the great time we had through this post. I will share official and behind-the-scenes photos of the inaugural bbq4.it conference which took place on the evening of September 9th, 2016.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/preparations.jpg&#34; alt=&#34;Preparations are in full swing&#34; title=&#34;Preparations are in full swing&#34; /&gt;
&lt;em&gt;Preparations are in full swing&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/precious_gift.jpg&#34; alt=&#34;Speaker’s lunch and a mysterious and precious gift for Arek Benedykt given by Maciej Aniserowicz (It’s not a goldfish)&#34; title=&#34;Speaker’s lunch and a mysterious and precious gift for Arek Benedykt given by Maciej Aniserowicz&#34; /&gt;
&lt;em&gt;Speaker’s lunch and a mysterious and precious gift for Arek Benedykt given by Maciej Aniserowicz (It’s not a goldfish)&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/registration.jpg&#34; alt=&#34;During registration&#34; title=&#34;During registration&#34; /&gt;
&lt;em&gt;During registration (Photo Credit: Paweł Mazurczak)&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/welcoming.jpg&#34; alt=&#34;Welcoming by Piotr Szymura and Arek Benedykt (Photo Credit: Paweł Mazurczak)&#34; title=&#34;Welcoming by Piotr Szymura and Arek Benedykt&#34; /&gt;
&lt;em&gt;Welcoming by Piotr Szymura and Arek Benedykt (Photo Credit: Paweł Mazurczak)&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/opening.jpg&#34; alt=&#34;Opening talk by Janusz Szymura - chairman of Rekord Group (Photo Credit: Paweł Mazurczak)&#34; title=&#34;Opening talk by Janusz Szymura - chairman of Rekord Group&#34; /&gt;
&lt;em&gt;Opening talk by Janusz Szymura - chairman of Rekord Group (Photo Credit: Paweł Mazurczak)&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/first_speaker.jpg&#34; alt=&#34;First speaker - Maciej Aniserowicz immediately after his talk (Photo Credit: Paweł Mazurczak)&#34; title=&#34;First speaker - Maciej Aniserowicz immediately after his talk&#34; /&gt;
&lt;em&gt;First speaker - Maciej Aniserowicz immediately after his talk (Photo Credit: Paweł Mazurczak)&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/second_speaker.jpg&#34; alt=&#34;Thanks to Piotr Stapp for giving the second speech during bbq4.it (Photo Credit: Paweł Mazurczak)&#34; title=&#34;Thanks to Piotr Stapp for giving the second speech during bbq4.it&#34; /&gt;
&lt;em&gt;Thanks to Piotr Stapp for giving the second speech during bbq4.it (Photo Credit: Paweł Mazurczak)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/break.jpg&#34; alt=&#34;During the break (Photo Credit: Paweł Mazurczak)&#34; title=&#34;During the break&#34; /&gt;
&lt;em&gt;During the break (Photo Credit: Paweł Mazurczak)&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/szabelski_drobik.jpg&#34; alt=&#34;Krzysiek Szabelski and Marcin Drobik celebrating their victory (Photo Credit: Paweł Mazurczak)&#34; title=&#34;Krzysiek Szabelski and Marcin Drobik celebrating their victory&#34; /&gt;
&lt;em&gt;Krzysiek Szabelski and Marcin Drobik celebrating their victory (Photo Credit: Paweł Mazurczak)&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/jarek_palka.jpg&#34; alt=&#34;Jarek Pałka debunking another myth (Photo Credit: Paweł Mazurczak)&#34; title=&#34;Jarek Pałka debunking another myth&#34; /&gt;
&lt;em&gt;Jarek Pałka debunking another myth (Photo Credit: Paweł Mazurczak)&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/bbq.jpg&#34; alt=&#34;Barbeque time! (Photo Credit: Paweł Mazurczak)&#34; title=&#34;Barbeque time!&#34; /&gt;
&lt;em&gt;Barbeque time! (Photo Credit: Paweł Mazurczak)&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/soccer.jpg&#34; alt=&#34;IT people and soccer, is it possible? Oh yes. (Photo Credit: Paweł Mazurczak)&#34; title=&#34;IT people and soccer, is it possible? Oh yes&#34; /&gt;
&lt;em&gt;IT people and soccer, is it possible? Oh yes (Photo Credit: Paweł Mazurczak)&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/prize.jpg&#34; alt=&#34;Handing first prize to the winner. (Photo Credit: Paweł Mazurczak)&#34; title=&#34;Handing first prize to the winner&#34; /&gt;
&lt;em&gt;Handing first prize to the winner (Photo Credit: Paweł Mazurczak)&lt;/em&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/09/wind_down.jpg&#34; alt=&#34;The party was starting to wind down&#34; title=&#34;The party was starting to wind down&#34; /&gt;
&lt;em&gt;The party was starting to wind down&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A lot of people are requesting a second edition because they really enjoyed the first. I sincerely hope we can have a repeat next year, and I’ll keep you posted. Anyway, please start praying for good weather for the beginning of September 2017, as it is an outdoor event.&lt;/p&gt;

&lt;p&gt;P.S. Big thanks to my workmate Paweł Mazurczak for allowing me to use his wonderful pictures.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Quality Excites 2016</title>
      <link>http://koscielniak.me/post/2016/06/quality-excites-2016/</link>
      <pubDate>Tue, 28 Jun 2016 00:00:15 +0200</pubDate>
      
      <guid>http://koscielniak.me/post/2016/06/quality-excites-2016/</guid>
      <description>&lt;p&gt;The Quality Excites conference organized by the passionate
&lt;a href=&#34;https://qualityexcites.pl/organizers&#34; target=&#34;_blank&#34;&gt;team&lt;/a&gt; recently had its 5th edition. For me, this conference was exceptional because there were a lot of workshops and lectures, many of which were dedicated to testing. The speakers practice what they preach and everything related to the conference was high quality, as this is what excites the organizers and the invitees.&lt;/p&gt;

&lt;p&gt;That is why &lt;a href=&#34;https://qualityexcites.pl&#34; target=&#34;_blank&#34;&gt;Quality Excites&lt;/a&gt; remains one of my most anticipated yearly events, and every year since 2014, I’ve had the simultaneous fear and thrill of securing tickets. Fortunately, I was invited for the third time in a row.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/06/qe-cake.png&#34; alt=&#34;5th edition Quality Excites - celebration cake&#34; title=&#34;5th edition Quality Excites - celebration cake&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://twitter.com/GGalezowski&#34; target=&#34;_blank&#34;&gt;Grzegorz Gałęzowski&lt;/a&gt; was also invited as a speaker for the 3rd time in a row and this year his opening speech was titled &lt;em&gt;GIMMEH TDD! - O RLY?&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/06/qe-grzegorz.png&#34; alt=&#34;Grzegorz Gałęzowski - GIMMEH TDD! - O RLY?&#34; title=&#34;Grzegorz Gałęzowski - GIMMEH TDD! - O RLY?&#34; /&gt;&lt;/p&gt;

&lt;p&gt;He talked about his experiences with introducing TDD to teams but what he presented could easily be applied to many other new things which someone may introduce to their team. For me, talks given by Grzegorz are very interesting because they are concise and his presentation style is logical. I’m always impressed by his ability to weave words together, and each thought connects with the previous one and comes from his real life observations, eventually leading to a clear conclusion. You can see Grzegorz’s presentation from the previous Quality Excites conference
&lt;a href=&#34;https://www.youtube.com/watch?v=yNyMrjMawUY&#34; target=&#34;_blank&#34;&gt;here&lt;/a&gt; to see what I mean.&lt;/p&gt;

&lt;p&gt;After the opening session, I attended the workshop given by Bartłomiej Michalski and Łukasz Januszek. Workshops are my style and I think the workshops are what make Quality Excites so exceptional among other conferences. They are given for free of charge and are hosted by very passionate people who have great practical knowledge in their field. Additionally, the workshops presenters I spoke with, were all employees of Future Processing. This year, I attended the workshop &lt;em&gt;How to make work more profitable?&lt;/em&gt;. The workshop used an analogy that compared creating processes in a company to creating rules for board games and used this analogy to explain many different roles which people in a team can have and how they influence each other and the situation in the team.&lt;/p&gt;

&lt;p&gt;This workshop was insightful and opened my mind to new ideas, it’s given me a lot to think about.
It may be some time before I can use everything I’ve learned in real situations, but I may be able to use one takeaway from this workshop sooner rather than later: being able to discuss unpleasant things with my team as soon as possible.&lt;/p&gt;

&lt;p&gt;After the workshop and lunch break, I watched three lectures &lt;em&gt;Testing the Internet of things&lt;/em&gt; by Tomasz Janiszewski and Dawid Pacia and then &lt;em&gt;Star Trek: BDD Enterprise&lt;/em&gt; by Tomasz Dubikowski. Both of these lectures were very well-prepared and well-presented but currently I don’t have opportunities to use what I learned.&lt;/p&gt;

&lt;p&gt;The third lecturer which I attended in the afternoon block was given by
&lt;a href=&#34;https://twitter.com/j_palka&#34; target=&#34;_blank&#34;&gt;Jarosław Pałk&lt;/a&gt;.
I really like this speaker because of his sense of humor, profound knowledge and the way he talks about very serious and sometimes sad things.&lt;/p&gt;

&lt;p&gt;The most important part of Jarosław’s speech were sentences like what I’m about to translate. I&amp;rsquo;m paraphrasing from Polish to English, but he said something along the lines of: &lt;em&gt;Developers have benefits, and between these benefits, they create products/services for clients.&lt;/em&gt;&lt;br /&gt;
By benefits, he meant table football, billiards, ping pong, etc. In his speech, he had a couple of &lt;em&gt;the whole truth about the word&lt;/em&gt; sentences and that’s why I like his talks. I can’t wait to see Jarek at
&lt;a href=&#34;http://bbq4.it/&#34; target=&#34;_blank&#34;&gt;bbq4.it&lt;/a&gt; in September.&lt;/p&gt;

&lt;p&gt;After the last talk there was an after-party held in the Future Processing base where we were treated to a cake to celebrate the 5th staging of Quality Excites.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/06/qe-cake-with-organizers.png&#34; alt=&#34;5th edition Quality Excites - celebration cake and organizers&#34; title=&#34;5th edition Quality Excites - celebration cake and organizers&#34; /&gt;&lt;/p&gt;

&lt;p&gt;I think it was a well-deserved occasion to celebrate. Quality Excites provides a lot of opportunities to learn new things for free and I would like to thank the organizers for this and I would like to wish all the organisers and participations the best.&lt;/p&gt;

&lt;p&gt;With the workshops and lectures held during this conference, they inspired a lot of people including myself. You can see what it means for quality to excite, while attending this conference. It was my third time at Quality Excites and my third time seeing that the organizers believe in quality and provide it in every lecture and workshop. I hope the Quality Excites team keeps going and I hope to see them for the 4th time next year.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Devoxx 2016</title>
      <link>http://koscielniak.me/post/2016/06/devoxx-2016/</link>
      <pubDate>Mon, 27 Jun 2016 23:43:59 +0200</pubDate>
      
      <guid>http://koscielniak.me/post/2016/06/devoxx-2016/</guid>
      <description>&lt;p&gt;The conference beast living inside of me has awoken again but this time it was very hungry and I ended up having to feed it for 4 days. I spent the first 3 days at
&lt;a href=&#34;http://devoxx.pl/&#34; target=&#34;_blank&#34;&gt;the Devoxx Poland&lt;/a&gt; conference which ran from June 22nd to 25th.
It is one of the biggest conferences in Poland and this was the second staging. There were 2500 participants and 100 speakers at this edition, and among the speakers, was one of my work mates
&lt;a href=&#34;http://www.benedykt.net/&#34; target=&#34;_blank&#34;&gt;Arkadiusz Benedykt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/06/me-and-team.jpg&#34; alt=&#34;Me and my work mates at Devoxx Poland, after Arek’s speech&#34; title=&#34;Me and my work mates at Devoxx Poland, after Arek’s speech&#34; /&gt;&lt;/p&gt;

&lt;p&gt;The event was held at
&lt;a href=&#34;https://pl.wikipedia.org/wiki/Centrum_Kongresowe_ICE_Krak%C3%B3w&#34; target=&#34;_blank&#34;&gt;the International Conferences and Entertainment Center in Cracow&lt;/a&gt;.
I attended a lot of great talks and a couple which weren’t so great, but the most important thing for me was that this event gave me an opportunity to talk with many interesting people and I benefited from this opportunity.&lt;/p&gt;

&lt;p&gt;The most fascinating for me was being able to have a quick chat with
&lt;a href=&#34;https://twitter.com/mhevery&#34; target=&#34;_blank&#34;&gt;Misko Hevery&lt;/a&gt;.
Can you guess what his presentation was about? Of course&amp;hellip;it was
&lt;a href=&#34;https://angular.io/&#34; target=&#34;_blank&#34;&gt;Angular 2&lt;/a&gt;.
For me, his presentation was one of the best during this conference. He explained how powerful Angular 2 is and why. I met Misko at the speaker’s dinner organized by
&lt;a href=&#34;http://www.metrosoft.com/&#34; target=&#34;_blank&#34;&gt;Metrosoft®&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I started our conversation with the question: “when will Angular 3 come out?”. Misko smiled for a while and something to the effect of “it won&amp;rsquo;t”. I asked him “do you promise?”, and he said “yes I do”. So Dear Community, you can use Angular 2 and don&amp;rsquo;t worry about Angular 3 being released soon. Misko spoke during his speech about many different things related with Angular 2, which you can see in these
&lt;a href=&#34;https://docs.google.com/presentation/d/1fRw9VP6LCy4Fl-uruATfLq2V9UY9JBjgQCZaeJlW0WQ/edit&#34; target=&#34;_blank&#34;&gt;slides&lt;/a&gt;.
I asked him how many of them I can use today (23 June 2016) and he said everything. So Dear Community, it&amp;rsquo;s about time to jump into Angular 2 and take as much as you want from it has to offer.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/06/me-and-misko.jpg&#34; alt=&#34;Misko and I&#34; title=&#34;Misko and I&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Another interesting conversation I had was with
&lt;a href=&#34;https://twitter.com/saturnism&#34; target=&#34;_blank&#34;&gt;Ray Tsang&lt;/a&gt; after the speaker’s dinner.
We talked about &lt;a href=&#34;http://kubernetes.io/&#34; target=&#34;_blank&#34;&gt;Kubernetes&lt;/a&gt;, the cloud, Google, and many others. It was a very nice talk set against the pleasant scenery of the Vistula river and it encouraged me to attend Ray’s presentation the next day titled: &lt;em&gt;Scaling with Kubernetes, Automatically! Learn Kubernetes API through writing a visualizer to an autoscaler&lt;/em&gt;. It was an amazing presentation with very few slides and a lot of real time action with Kubernetes. Honestly speaking, I got lost somewhere in the middle of his presentation but I was happy to attend and it was a pleasure watching how Ray executed one shell command after another and watching him act like a child with a brand new toy.&lt;/p&gt;

&lt;p&gt;To sum up all the presentations: a lot of them were about microservices as many speakers at Devoxx Poland 2016 ended up focusing on this theme. There were presentations on how to: create microservices, monitor them, deploy them, configure a Continuous Delivery environment and other things more or less related to microservices.&lt;/p&gt;

&lt;p&gt;I like Devoxx Poland because it gives me the opportunity to meet new people and talk with them about the things they couldn’t say on stage. Devoxx primarily focuses on dozens of lectures, but this year that wasn’t the most important part for me. I was focused on meeting new people and communicating with them and this goal was 100% fulfilled.&lt;/p&gt;

&lt;p&gt;I want to thank
&lt;a href=&#34;https://twitter.com/grzegorzduda&#34; target=&#34;_blank&#34;&gt;Grzegorz Duda&lt;/a&gt; and his team for another amazing Devoxx Poland. I hope that he will organise the next edition and I’ll be there next year. I also want to thank Metrosoft® for organizing one of the best parties I’ve ever been to. My goal for next year is to be at this party again.&lt;/p&gt;

&lt;p&gt;For dessert, my conference beast was fed another event and you can read about it in this
&lt;a href=&#34;http://koscielniak.me/post/2016/06/quality-excites-2016/&#34;&gt;post&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Using only the generator of Angular-CLI</title>
      <link>http://koscielniak.me/post/2016/06/using-only-the-generator-of-angular-cli/</link>
      <pubDate>Thu, 02 Jun 2016 22:30:00 +0200</pubDate>
      
      <guid>http://koscielniak.me/post/2016/06/using-only-the-generator-of-angular-cli/</guid>
      <description>&lt;p&gt;In one of my previous &lt;a href=&#34;http://koscielniak.me/post/2016/05/experimenting-with-angular2-cli/&#34;&gt;posts&lt;/a&gt;,
I wrote about
&lt;a href=&#34;https://cli.angular.io/&#34; target=&#34;_blank&#34;&gt;Angular CLI&lt;/a&gt;.
With this tool, you can simplify your work when dealing with Angular2 projects. This tool can create a template of a new Angular2 application where everything is set up and works perfectly. However, what if you want to have a build process of your application that is a bit different from what Angular CLI offers or you want to use this tool in an existing project which already has its own structure and build process? Can you still use some goodies from this CLI? Is this possible?&lt;/p&gt;

&lt;p&gt;Yes it is. You can take as much as you want from this tool. All you need to do, is to install Angular-CLI with the command &lt;code&gt;npm install -g angular-cli&lt;/code&gt; and then add a file &lt;em&gt;angular-cli.json&lt;/em&gt; to the root folder of your project. Inside &lt;em&gt;angular-cli.json&lt;/em&gt;, I put the content like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  &amp;quot;defaults&amp;quot;: {
    &amp;quot;prefix&amp;quot;: &amp;quot;&amp;quot;,
    &amp;quot;sourceDir&amp;quot;: &amp;quot;wwwroot&amp;quot;,
    &amp;quot;styleExt&amp;quot;: &amp;quot;css&amp;quot;,
    &amp;quot;prefixInterfaces&amp;quot;: false
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can specify more options here for this CLI but this is enough for me. This file can be added to &lt;em&gt;.gitignore&lt;/em&gt; as it does not have any influence on your project.&lt;/p&gt;

&lt;p&gt;You also need this tool as a part of the development dependencies in &lt;em&gt;package.json&lt;/em&gt; of your project. A command like this does the job: &lt;code&gt;npm install angular-cli --save-dev&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After this you can use almost every command of CLI, for example:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;ng g service
ng g route
ng g component
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Some commands are impossible to use because we don’t have a full Angular-CLI project, for example:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;ng serve
ng build
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When use them, you get errors.&lt;/p&gt;

&lt;p&gt;As you can see, you can have happiness and receive a helping hand from Angular CLI with development workflow and the building process of your choice.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Epilogue: Daj się poznać series</title>
      <link>http://koscielniak.me/post/2016/05/epilogue-daj-sie-poznac-series/</link>
      <pubDate>Tue, 24 May 2016 22:00:00 +0200</pubDate>
      
      <guid>http://koscielniak.me/post/2016/05/epilogue-daj-sie-poznac-series/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://dajsiepoznac.pl&#34;&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/03/contestLogo.png&#34; alt=&#34;Daj się poznać&#34; title=&#34;Daj się poznać&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;Daj się poznać&lt;/em&gt; contest has come to an end. Now it’s time to sum up what I did, what I didn’t do and what I learnt during this period of time.&lt;/p&gt;

&lt;p&gt;First of all, I want to thank
&lt;a href=&#34;http://devstyle.pl/&#34; target=&#34;_blank&#34;&gt;Maciej Aniserowicz&lt;/a&gt; for organizing this contest. Initiatives like this do a lot for the Polish programming community as a whole, but even more for the individual programmers who participated in the contest, and even those on the sidelines who merely observed. I consider Maciej Aniserowicz to be a life mentor and now I can brag to the Polish tech community that he is the patron saint of Polish programmers.&lt;/p&gt;

&lt;p&gt;I think everyone who participated in this contest learnt something, whether they finished or not. I learnt a lot: of course, I learnt new technical stuff but more importantly I learnt a lot about my work style about how to organize my time. I thought about blogging for a long time but I always had an excuse: I don&amp;rsquo;t have time, my kids keep me busy, I need to sleep&amp;hellip;I started my blog in January, but this contest helped provide content to motivate me to continue blogged. My initial goal for my blog was to write at least one post a month but the contest required two posts a week. Initially, it seemed unrealistic for me but turned out that I managed to cope. This is my biggest lesson learned from this contest: yes, you have time to write two posts a week if you organize your time wisely. Maciek - thank you for creating an opportunity for me to learn this lesson for myself.&lt;/p&gt;

&lt;p&gt;In some cases, I was even able to write more than two posts per week. During the content I always had two posts in reserve in case something unexpected happened. I put aside 8 hours a week for this contest, and this was enough to write two posts and example code, but the contest itself also required me to create a project. This didn’t leave much time for writing the project and the project isn’t in the best condition. Despite focusing mainly on writing for this content, my goal has still been accomplished.&lt;/p&gt;

&lt;p&gt;During the contest, I worked with new technologies. I had to create a sample project for almost every thing that I learnt. All these projects are on github, complete with posts.&lt;/p&gt;

&lt;p&gt;The bleeding edge technologies that I used were a big obstacle in my development process. If bleeding edge technology were sharp enough to cut me in real life, then sometimes the blood would have been on the floor, the keyboard and dripping down my desk.
Especially when I &lt;a href=&#34;http://koscielniak.me/post/2016/05/upgrading-to-angulr2-rc1/&#34;&gt;upgraded Angular2&lt;/a&gt;
and
&lt;a href=&#34;http://koscielniak.me/post/2016/05/migrating-to-asp-net-core-rc2/&#34;&gt;ASP.NET Core&lt;/a&gt;.
But through this, I achieved another goal which was to learn a lot of new things.&lt;/p&gt;

&lt;p&gt;This contest took me out of my comfort zone and I am glad for it. Now when the contest is finished, I must think about new content for my blog. For sure, I will slow down a bit because two posts a week is too much for me. I must also think about the content which I am going to present on my blog but these considerations are for another occasion. Now let’s be happy with the final post of the &lt;em&gt;Daj się poznać&lt;/em&gt; series. Thanks once again Maciek, keep up the good work. Also, I’d like to thank my teammate
&lt;a href=&#34;http://www.benedykt.net/&#34; target=&#34;_blank&#34;&gt;Arkadiusz Benedykt&lt;/a&gt; who stood/sat next to me and sometimes gave me a lot of really helpful advice.&lt;/p&gt;

&lt;p&gt;&lt;h3&gt;Related posts:&lt;/h3&gt;





























&lt;ul style=&#34;list-style: none;&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/02/enrolling-in-daj-sie-poznac/&#34;&gt;Enrolling in &#34;Daj się poznać&#34;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/daj-sie-poznac-project-details/&#34;&gt;&#34;Daj się poznać&#34; - Project details&#34;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/i-m-holding-a-project-rider-eap/&#34;&gt;I&#39;m holding a Project Rider EAP&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/installing-asp-dot-net-core-1-on-ubuntu-14/&#34;&gt;Installing ASP .NET Core 1 on Ubuntu 14.04&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/my-first-asp-net-core-1-web-application/&#34;&gt;My first ASP NET Core 1.0 web application&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/project-setup-server-side/&#34;&gt;Project setup - server-side&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/project-setup-client-side/&#34;&gt;Project setup - client-side&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/adding-styling-to-my-application/&#34;&gt;Adding styling to my application&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/angular2-confirm-dialog-component/&#34;&gt;Angular 2 Confirm Dialog Component&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/before-going-into-production/&#34;&gt;Before going into production&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/publishing-to-azure/&#34;&gt;Publishing to Azure&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/setting-up-the-web-client-for-google-identity-platform/&#34;&gt;Setting up the Web client for Google Identity Platform&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/oidc-token-manager-library-with-google-identity-platform-part-1/&#34;&gt;oidc-token-manager library with Google Identity Platform - Part 1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/oidc-token-manager-library-with-google-identity-platform-part-2/&#34;&gt;oidc-token-manager library with Google Identity Platform - Part 2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/accesing-api-with-token-from-google-identity-provider/&#34;&gt;Accessing API with token from Google Identity Provider&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/how-portable-is-asp-dot-net-core/&#34;&gt;How portable is ASP .NET Core 1.0?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/when-dotpeek-can-save-your-live/&#34;&gt;When dotPeek can save your live&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/reading-code-as-if-it-were-a-book/&#34;&gt;Reading code as if it were a book&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/aps-dot-net-core-configuration/&#34;&gt;ASP .NET Core Configuration&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/getting-started-with-identity-server4/&#34;&gt;Getting started with IdentityServer4&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/identityserver-4-accessing-api/&#34;&gt;IdentityServer4 - accessing API&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/dealing-with-secrets-in-asp-net-core/&#34;&gt;Dealing with secrets in ASP .NET Core&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/google-identity-provider-with-identityserver4/&#34;&gt;Google Identity Provider with IdentityServer4&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/upgrading-to-angulr2-rc1/&#34;&gt;Upgrading to Angular2 RC1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/experimenting-with-angular2-cli/&#34;&gt;Experimenting with Angular2 CLI&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/migrating-to-asp-net-core-rc2/&#34;&gt;Migrating to ASP .NET Core RC2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/epilogue-daj-sie-poznac-series/&#34;&gt;Epilogue: Daj się poznać series&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Migrating to ASP .NET Core RC2</title>
      <link>http://koscielniak.me/post/2016/05/migrating-to-asp-net-core-rc2/</link>
      <pubDate>Sun, 22 May 2016 22:00:00 +0200</pubDate>
      
      <guid>http://koscielniak.me/post/2016/05/migrating-to-asp-net-core-rc2/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://dajsiepoznac.pl&#34;&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/03/contestLogo.png&#34; alt=&#34;Daj się poznać&#34; title=&#34;Daj się poznać&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After waiting for some time, I was happy when ASP.NET Core RC2 was recently released. This version should have debuted at the beginning of 2016, so imagine my anticipation and excitement to install it on my Linux machine and upgrade my project to this version.&lt;/p&gt;

&lt;p&gt;To install this version of ASP.NET Core I started on
&lt;a href=&#34;https://www.microsoft.com/net/core&#34; target=&#34;_blank&#34;&gt;this page&lt;/a&gt; and then I chose Linux -&amp;gt; Ubuntu 14.04. I followed the step-by-step instructions provided and after a while I could run the command &lt;code&gt;dotnet -h&lt;/code&gt; in my terminal, and I saw this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/migrating/dotnet-help.png&#34; alt=&#34;dotnet -h&#34; title=&#34;dotnet -h&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Now I could start to upgrade my project. There were pages where I could find instructions on how to adjust the project to the new version of ASP. On
&lt;a href=&#34;https://dotnet.github.io/docs/core-concepts/dnx-migration.html&#34; target=&#34;_blank&#34;&gt;this page&lt;/a&gt;
I found out how to migrate from &lt;em&gt;dnx&lt;/em&gt; to new the .NET Core CLI and on
&lt;a href=&#34;https://docs.asp.net/en/latest/migration/rc1-to-rc2.html&#34; target=&#34;_blank&#34;&gt;this page&lt;/a&gt;
I found out how to upgrade my project to the RC2 version.&lt;/p&gt;

&lt;p&gt;The first steps of the upgrade were rather simple and mechanical. I had to change the dependencies in &lt;em&gt;project.json&lt;/em&gt;. All packages with names that started with &lt;em&gt;Microsoft.AspNet.&lt;/em&gt; now have names starting with: &lt;em&gt;Microsoft.AspNetCore.&lt;/em&gt;. I also had to change the version of the packages. My &lt;em&gt;dependencies&lt;/em&gt; section looked like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;quot;dependencies&amp;quot;: {
    &amp;quot;Microsoft.AspNetCore.Diagnostics&amp;quot;: &amp;quot;1.0.0-rc2-final&amp;quot;,
    &amp;quot;Microsoft.AspNetCore.Server.IISIntegration&amp;quot;: &amp;quot;1.0.0-rc2-final&amp;quot;,
    &amp;quot;Microsoft.AspNetCore.Server.IISIntegration.Tools&amp;quot;: &amp;quot;1.0.0-preview1-final&amp;quot;,
    &amp;quot;Microsoft.AspNetCore.Server.Kestrel&amp;quot;: &amp;quot;1.0.0-rc2-final&amp;quot;,
    &amp;quot;Microsoft.AspNetCore.Mvc&amp;quot;: &amp;quot;1.0.0-rc2-final&amp;quot;,
    &amp;quot;Microsoft.AspNetCore.StaticFiles&amp;quot;: &amp;quot;1.0.0-rc2-final&amp;quot;,
    &amp;quot;Microsoft.Extensions.Configuration.Binder&amp;quot;: &amp;quot;1.0.0-rc2-final&amp;quot;,
    &amp;quot;Microsoft.Extensions.Configuration.Json&amp;quot;: &amp;quot;1.0.0-rc2-final&amp;quot;,
    &amp;quot;Microsoft.Extensions.Configuration.EnvironmentVariables&amp;quot;: &amp;quot;1.0.0-rc2-final&amp;quot;,
    &amp;quot;Microsoft.NETCore.App&amp;quot;: {
        &amp;quot;type&amp;quot;: &amp;quot;platform&amp;quot;,
        &amp;quot;version&amp;quot;: &amp;quot;1.0.0-*&amp;quot;
    }
},
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Another change is that a new package &lt;em&gt;Microsoft.NETCore.App&lt;/em&gt; appeared among the dependencies, and it was a runtime for the application.&lt;/p&gt;

&lt;p&gt;I could remove the dependency &lt;em&gt;Microsoft.AspNet.Mvc.TagHelpers&lt;/em&gt; because now it is included in the package &lt;em&gt;Microsoft.AspNetCore.Mvc&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I also had to fix the namespaces. I had to change each namespace which started with &lt;em&gt;Microsoft.AspNet.&lt;/em&gt; to &lt;em&gt;Microsoft.AspNetCore.&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The changes where required also in the structure of &lt;em&gt;project.json&lt;/em&gt;. Some properties are no longer valid, for example: &lt;em&gt;commands&lt;/em&gt;. I must also specify the frameworks section and it looked like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;quot;frameworks&amp;quot;: {
    &amp;quot;netcoreapp1.0&amp;quot;: {
        &amp;quot;imports&amp;quot;: [
            &amp;quot;dotnet5.6&amp;quot;,
            &amp;quot;dnxcore50&amp;quot;,
            &amp;quot;portable-net45+win8&amp;quot;
        ]
    }
},
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I also added the section &lt;em&gt;buildOptions&lt;/em&gt; with the following properties:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;quot;buildOptions&amp;quot;: {
    &amp;quot;emitEntryPoint&amp;quot;: true,
    &amp;quot;preserveCompilationContext&amp;quot;: true
},
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After upgrading to RC2, the ASP application became like an ordinary console application. That’s why I had to create a class with the main method where I started my ASP app. This class looked like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class Program
{  // Entry point for the application.
    public static void Main(string[] args) 
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())       
            .UseIISIntegration()
            .UseStartup&amp;lt;Startup&amp;gt;()
            .Build();

        host.Run();   
    }         
}  
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And I removed this line of code from Startup.cs&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// Entry point for the application.
public static void Main(string[] args) =&amp;gt; WebApplication.Run&amp;lt;Startup&amp;gt;(args);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I also had to remove the line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;app.UseIISPlatformHandler();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;from the &lt;em&gt;Startup.Configure&lt;/em&gt; method because now IIS is configured in &lt;em&gt;Program.Main&lt;/em&gt; method.&lt;/p&gt;

&lt;p&gt;After these steps, I could finally run the command:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;dotnet restore
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And then I was able to build my app with the command &lt;code&gt;dotnet build&lt;/code&gt; but I received two errors:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;/home/piotr/Repositories/notifier/src/web/Startup.cs(26,46): error CS1061: &#39;IConfigurationRoot&#39; does not contain a definition for &#39;Get&#39; and no extension method &#39;Get&#39; accepting a first argument of type &#39;IConfigurationRoot&#39; could be found (are you missing a using directive or an assembly reference?)
/home/piotr/Repositories/notifier/src/web/Startup.cs(27,22): error CS1061: &#39;IServiceCollection&#39; does not contain a definition for &#39;AddInstance&#39; and no extension method &#39;AddInstance&#39; accepting a first argument of type &#39;IServiceCollection&#39; could be found (are you missing a using directive or an assembly reference?)

Compilation failed.
    4 Warning(s)
    2 Error(s)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It seems like the extension methods &lt;em&gt;Get&lt;/em&gt; and &lt;em&gt;AddInstance&lt;/em&gt; no longer exist. A bit of research led to a solution for how to fix the lack of &lt;em&gt;AddInstance&lt;/em&gt; extension method. Now it is called &lt;em&gt;AddSingleton&lt;/em&gt;, but I couldn’t find a replacement for &lt;em&gt;Get&amp;lt;&amp;gt;&lt;/em&gt; extension method so I changed my code a bit and now it looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var authSettings = new AuthSettings(); 
var authSection = Configuration.GetSection(&amp;quot;AuthSettings&amp;quot;);
authSettings.ClientId = authSection[&amp;quot;ClientId&amp;quot;];
authSettings.Authority = authSection[&amp;quot;Authority&amp;quot;];
services.AddSingleton(authSettings);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After this, my code compiled and I could run it with the command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;env ASPNETCORE_ENVIRONMENT=&amp;quot;Development&amp;quot; dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The result of this command was another error:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;Unhandled Exception: System.IO.FileNotFoundException: The configuration file &#39;appsettings.json&#39; was not found and is not optional.
   at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load()
   at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
   at Notifier.Web.Startup..ctor(IHostingEnvironment env)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It looked like my application didn’t have a setup base path so it didn’t know where to look for &lt;em&gt;appsettings.json&lt;/em&gt;. In the new version of ASP, you specify the app basepath by setting it in the &lt;em&gt;ConfigurationBuilder&lt;/em&gt; with a code like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var builder = new ConfigurationBuilder()
                .SetBasePath(hostingEnvironment.ContentRootPath);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you may notice, the new version of ASP also changed the names of the environmental variables. To set the runtime environment of an application you now use the variable &lt;em&gt;ASPNETCORE_ENVIRONMENT&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;After setting up the base path, I ran the application again and it ran without errors. I navigated to the &lt;em&gt;localhost:5000&lt;/em&gt; and saw this screen:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/migrating/finalResult.png&#34; alt=&#34;Final result&#34; title=&#34;Final result&#34; /&gt;&lt;/p&gt;

&lt;p&gt;I think that this is proof that I managed to upgrade my ASP.NET Core application to the RC2 version. I must honestly say that this process was very boring and took me longer than I expected. I had to change the way I got the settings from the configuration file. I don’t know why I couldn’t get access to the extension method &lt;em&gt;Get&amp;lt;&amp;gt;&lt;/em&gt; on the &lt;em&gt;IConfigurationRoot&lt;/em&gt;. I&amp;rsquo;m not sure if it was removed or renamed, but I didn&amp;rsquo;t manage to find a replacement for this method. When I wrote this post, the RC2 version was fresh out the oven (3 days to be exact) so I am sure that I’ll find more information about this missing method soon.&lt;/p&gt;

&lt;p&gt;By the way, this is my last technical post in the &lt;em&gt;Daj się poznać&lt;/em&gt; contest series. In the next post, I’ll write a summary of my work for this contest.&lt;/p&gt;

&lt;h3&gt;Related posts:&lt;/h3&gt;





























&lt;ul style=&#34;list-style: none;&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/02/enrolling-in-daj-sie-poznac/&#34;&gt;Enrolling in &#34;Daj się poznać&#34;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/daj-sie-poznac-project-details/&#34;&gt;&#34;Daj się poznać&#34; - Project details&#34;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/i-m-holding-a-project-rider-eap/&#34;&gt;I&#39;m holding a Project Rider EAP&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/installing-asp-dot-net-core-1-on-ubuntu-14/&#34;&gt;Installing ASP .NET Core 1 on Ubuntu 14.04&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/my-first-asp-net-core-1-web-application/&#34;&gt;My first ASP NET Core 1.0 web application&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/project-setup-server-side/&#34;&gt;Project setup - server-side&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/project-setup-client-side/&#34;&gt;Project setup - client-side&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/adding-styling-to-my-application/&#34;&gt;Adding styling to my application&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/angular2-confirm-dialog-component/&#34;&gt;Angular 2 Confirm Dialog Component&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/before-going-into-production/&#34;&gt;Before going into production&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/publishing-to-azure/&#34;&gt;Publishing to Azure&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/setting-up-the-web-client-for-google-identity-platform/&#34;&gt;Setting up the Web client for Google Identity Platform&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/oidc-token-manager-library-with-google-identity-platform-part-1/&#34;&gt;oidc-token-manager library with Google Identity Platform - Part 1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/oidc-token-manager-library-with-google-identity-platform-part-2/&#34;&gt;oidc-token-manager library with Google Identity Platform - Part 2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/accesing-api-with-token-from-google-identity-provider/&#34;&gt;Accessing API with token from Google Identity Provider&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/how-portable-is-asp-dot-net-core/&#34;&gt;How portable is ASP .NET Core 1.0?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/when-dotpeek-can-save-your-live/&#34;&gt;When dotPeek can save your live&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/reading-code-as-if-it-were-a-book/&#34;&gt;Reading code as if it were a book&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/aps-dot-net-core-configuration/&#34;&gt;ASP .NET Core Configuration&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/getting-started-with-identity-server4/&#34;&gt;Getting started with IdentityServer4&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/identityserver-4-accessing-api/&#34;&gt;IdentityServer4 - accessing API&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/dealing-with-secrets-in-asp-net-core/&#34;&gt;Dealing with secrets in ASP .NET Core&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/google-identity-provider-with-identityserver4/&#34;&gt;Google Identity Provider with IdentityServer4&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/upgrading-to-angulr2-rc1/&#34;&gt;Upgrading to Angular2 RC1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/experimenting-with-angular2-cli/&#34;&gt;Experimenting with Angular2 CLI&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/migrating-to-asp-net-core-rc2/&#34;&gt;Migrating to ASP .NET Core RC2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/epilogue-daj-sie-poznac-series/&#34;&gt;Epilogue: Daj się poznać series&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



</description>
    </item>
    
    <item>
      <title>Experimenting with Angular2 CLI</title>
      <link>http://koscielniak.me/post/2016/05/experimenting-with-angular2-cli/</link>
      <pubDate>Thu, 19 May 2016 22:00:00 +0200</pubDate>
      
      <guid>http://koscielniak.me/post/2016/05/experimenting-with-angular2-cli/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://dajsiepoznac.pl&#34;&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/03/contestLogo.png&#34; alt=&#34;Daj się poznać&#34; title=&#34;Daj się poznać&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the &lt;a href=&#34;https://www.youtube.com/watch?v=gdlpE9vPQFs&amp;list=PLOETEcp3DkCq788xapkP_OU-78jhTf68j&amp;index=6&#34; target=&#34;_blank&#34;&gt;keynote of ng-conf 2016&lt;/a&gt;,
&lt;a href=&#34;https://twitter.com/bradlygreen&#34; target=&#34;_blank&#34;&gt;Brad Green&lt;/a&gt; presented a lot of cool stuff about Angular2 and one of them was a tool called
&lt;a href=&#34;https://cli.angular.io/&#34; target=&#34;_blank&#34;&gt;Angular-CLI&lt;/a&gt;. &lt;em&gt;Angular-CLI&lt;/em&gt; contains a bunch of simple commands to make your work easier with Angular2 projects. The tool essentially streamlines and simplifies your projects. I am always cautious about this kind of tool because often they create far more than you need and pollute your project but when used wisely, they can be helpful.&lt;/p&gt;

&lt;p&gt;To start playing with &lt;em&gt;Angular-CLI&lt;/em&gt; first I had to install it. This tool is built with Node.js and it requires the node version 4 or greater. You can install this tool with the command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;npm install -g angular-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To create a new application I used the command: &lt;code&gt;ng new SampleApp&lt;/code&gt;.
And the result I got was a working application with a folder structure like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/angular-cli/initialTree.png&#34; alt=&#34;Initial file tree&#34; title=&#34;Initial file tree&#34; /&gt;&lt;/p&gt;

&lt;p&gt;As you can see, a lot is done after you run this command. You have not only your app ready to use but also ready to build. You can even run tests.
After installation, I executed &lt;code&gt;ng build&lt;/code&gt; and &lt;code&gt;ng serve&lt;/code&gt; which allows us to see under the URI &lt;em&gt;&lt;a href=&#34;http://localhost:4200/&#34;&gt;http://localhost:4200/&lt;/a&gt;&lt;/em&gt; in the following screen:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/angular-cli/sample-app-works.png&#34; alt=&#34;sample-app works!&#34; title=&#34;sample-app works!&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Next, I wanted to create a new route. I did this with the command &lt;code&gt;ng generate route dashboard&lt;/code&gt; and I got the following output in the terminal:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;installing route
installing component
  create src/app/+dashboard/dashboard.component.css
  create src/app/+dashboard/dashboard.component.html
  create src/app/+dashboard/dashboard.component.spec.ts
  create src/app/+dashboard/dashboard.component.ts
  create src/app/+dashboard/index.ts
  create src/app/+dashboard/shared/index.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This tool is smart enough to create folders prefixed with a &lt;em&gt;+&lt;/em&gt; sign. It is required in order to have lazy loading of components.
You can watch
&lt;a href=&#34;https://www.youtube.com/watch?v=d8yAdeshpcw&amp;index=9&amp;list=PLOETEcp3DkCq788xapkP_OU-78jhTf68j&#34; target=&#34;_blank&#34;&gt;a talk&lt;/a&gt;
given by
&lt;a href=&#34;https://twitter.com/mhevery&#34; target=&#34;_blank&#34;&gt;Misko Hevery&lt;/a&gt;
at &lt;a href=&#34;https://www.ng-conf.org&#34; target=&#34;_blank&#34;&gt;ng-conf 2016&lt;/a&gt; to find out a bit more about it.&lt;/p&gt;

&lt;p&gt;You can use this command line tool to create services, modules, components, etc.&lt;/p&gt;

&lt;p&gt;Next, I tried this tool to see how it deals with nested routes. I executed the command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ng generate route dashboard/event-list
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And it turned out that &lt;em&gt;Angular-CLI&lt;/em&gt; deals with it pretty well. I got this structure of folders:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/angular-cli/componentFiles.png&#34; alt=&#34;Component files&#34; title=&#34;Component files&#34; /&gt;&lt;/p&gt;

&lt;p&gt;And the routing was created like this in &lt;em&gt;dashboard.component&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@Routes([
 {path: &#39;/event-list&#39;, component: EventListComponent}
])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And it was also changed in the &lt;em&gt;sample-app.component&lt;/em&gt; to this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@Routes([
 {path: &#39;/dashboard/...&#39;, component: DashboardComponent},
 {path: &#39;/main-page&#39;, component: MainPageComponent}
])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see, this tool creates all the files needed for the component. These files are: a template file, a style file, a component file. It also generates a &lt;em&gt;spec&lt;/em&gt; file where you have the scaffolding for testing your component.&lt;/p&gt;

&lt;p&gt;The only drawback of this generation was the “&amp;hellip;” ellipses at the end of the dashboard route. It didn’t work with the new router and I had to change the configuration to this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@Routes([
  {path: &#39;/dashboard&#39;, component: DashboardComponent},
  {path: &#39;/main-page&#39;, component: MainPageComponent}
])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can see the final result of me playing with &lt;em&gt;Angular-CLI&lt;/em&gt;  in
&lt;a href=&#34;https://github.com/pikoscielniak/angular2-rc1-routing-sample&#34; target=&#34;_blank&#34;&gt;this repository&lt;/a&gt;.
I am sure that this drawback with the ellipses will be fixed soon and by the time you read this it could have already happened.&lt;/p&gt;

&lt;p&gt;You can do a lot of things with this tool if you try it by yourself, as I have only touched the tip of the iceberg in this post. If you work with Angular2, for sure you should spend some time with this tool and discover what it can do for you.&lt;/p&gt;

&lt;h3&gt;Related posts:&lt;/h3&gt;





























&lt;ul style=&#34;list-style: none;&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/02/enrolling-in-daj-sie-poznac/&#34;&gt;Enrolling in &#34;Daj się poznać&#34;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/daj-sie-poznac-project-details/&#34;&gt;&#34;Daj się poznać&#34; - Project details&#34;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/i-m-holding-a-project-rider-eap/&#34;&gt;I&#39;m holding a Project Rider EAP&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/installing-asp-dot-net-core-1-on-ubuntu-14/&#34;&gt;Installing ASP .NET Core 1 on Ubuntu 14.04&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/my-first-asp-net-core-1-web-application/&#34;&gt;My first ASP NET Core 1.0 web application&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/project-setup-server-side/&#34;&gt;Project setup - server-side&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/project-setup-client-side/&#34;&gt;Project setup - client-side&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/adding-styling-to-my-application/&#34;&gt;Adding styling to my application&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/angular2-confirm-dialog-component/&#34;&gt;Angular 2 Confirm Dialog Component&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/before-going-into-production/&#34;&gt;Before going into production&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/publishing-to-azure/&#34;&gt;Publishing to Azure&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/setting-up-the-web-client-for-google-identity-platform/&#34;&gt;Setting up the Web client for Google Identity Platform&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/oidc-token-manager-library-with-google-identity-platform-part-1/&#34;&gt;oidc-token-manager library with Google Identity Platform - Part 1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/oidc-token-manager-library-with-google-identity-platform-part-2/&#34;&gt;oidc-token-manager library with Google Identity Platform - Part 2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/accesing-api-with-token-from-google-identity-provider/&#34;&gt;Accessing API with token from Google Identity Provider&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/how-portable-is-asp-dot-net-core/&#34;&gt;How portable is ASP .NET Core 1.0?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/when-dotpeek-can-save-your-live/&#34;&gt;When dotPeek can save your live&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/reading-code-as-if-it-were-a-book/&#34;&gt;Reading code as if it were a book&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/aps-dot-net-core-configuration/&#34;&gt;ASP .NET Core Configuration&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/getting-started-with-identity-server4/&#34;&gt;Getting started with IdentityServer4&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/identityserver-4-accessing-api/&#34;&gt;IdentityServer4 - accessing API&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/dealing-with-secrets-in-asp-net-core/&#34;&gt;Dealing with secrets in ASP .NET Core&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/google-identity-provider-with-identityserver4/&#34;&gt;Google Identity Provider with IdentityServer4&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/upgrading-to-angulr2-rc1/&#34;&gt;Upgrading to Angular2 RC1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/experimenting-with-angular2-cli/&#34;&gt;Experimenting with Angular2 CLI&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/migrating-to-asp-net-core-rc2/&#34;&gt;Migrating to ASP .NET Core RC2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/epilogue-daj-sie-poznac-series/&#34;&gt;Epilogue: Daj się poznać series&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



</description>
    </item>
    
    <item>
      <title>Upgrading to Angular2 RC1</title>
      <link>http://koscielniak.me/post/2016/05/upgrading-to-angulr2-rc1/</link>
      <pubDate>Mon, 16 May 2016 22:00:00 +0200</pubDate>
      
      <guid>http://koscielniak.me/post/2016/05/upgrading-to-angulr2-rc1/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://dajsiepoznac.pl&#34;&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/03/contestLogo.png&#34; alt=&#34;Daj się poznać&#34; title=&#34;Daj się poznać&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The “Daj się poznać” contest is coming to an end and I have learned a lot and experimented with many things. I created a couple of sample projects but my main project was a bit neglected. It’s about time to speed up the development of my contest application.&lt;/p&gt;

&lt;p&gt;Since I’ve started working on that app, a lot changed. The biggest change was the new version of Angular2 which at the time of writing this post, is called: RC1. I started my development with an upgrade to this version.&lt;/p&gt;

&lt;p&gt;The process of upgrading went rather smoothly but only because I had very few components. The upgrade involved the renaming of namespaces so if you have a lot of components this renaming could be very cumbersome.&lt;/p&gt;

&lt;p&gt;The second biggest change in Angular RC1 was router. The previous router became deprecated and was renamed to &lt;em&gt;@angular/router-deprecated&lt;/em&gt; and the new router named &lt;em&gt;@angular/router&lt;/em&gt; wasn’t documented on the official page of
&lt;a href=&#34;https://angular.io/&#34; target=&#34;_blank&#34;&gt;Angular2&lt;/a&gt; at the time of writing this post.&lt;/p&gt;

&lt;p&gt;Anyway, I decided to continue my development process and I created a couple of Angular2 components. First, what I did was to get rid of dependency &lt;em&gt;@angular/router-deprecated&lt;/em&gt; from &lt;em&gt;package.json&lt;/em&gt; and from &lt;em&gt;node_modules&lt;/em&gt;. All decorators, directives and services related to new routing are inside the namespace &lt;em&gt;@angular/router&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In Angular2 RC1, the configuration of routes is done by the decorator &lt;em&gt;@Routes&lt;/em&gt;, previously it was the &lt;em&gt;@RouteConfig&lt;/em&gt; decorator. Both decorators take array as their argument but now the type of array items are different. Previously, it was array of &lt;em&gt;RouteDefinition&lt;/em&gt; with the definition being:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;interface RouteDefinition {
   path?: string;
   aux?: string;
   component?: Type | ComponentDefinition;
   loader?: Function;
   redirectTo?: any[];
   as?: string;
   name?: string;
   data?: any;
   useAsDefault?: boolean;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Currently, it is an array of &lt;em&gt;RouteMetadata&lt;/em&gt; with the definition being:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;abstract class RouteMetadata {
   path: string;
   component: Type;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It means that now to create a route, you must only specify the path and the type of component. For example like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@Routes([
   {path: &#39;/main-page&#39;, component: MainPageComponent},
   {path: &#39;/dashboard/...&#39;, component: DashboardComponent}
])
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Firstly, what hit me at this stage was how to now specify the default route. I searched for a bit how to do this, but everything I found then was simply calling &lt;code&gt;this._router.navigate([&#39;/main-page&#39;])&lt;/code&gt; inside &lt;em&gt;ngOnInit&lt;/em&gt; of your main component. Then, I found that to make a route default you must specify its path with alone slash (/) as you can see in this snippet of code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@Component({
 moduleId: module.id,
 selector: &#39;sample-app-app&#39;,
 templateUrl: &#39;sample-app.component.html&#39;,
 styleUrls: [&#39;sample-app.component.css&#39;],
 directives: [ROUTER_DIRECTIVES],
 providers: [ROUTER_PROVIDERS]
})
@Routes([
 {path: &#39;/dashboard&#39;, component: DashboardComponent},
 {path: &#39;/&#39;, component: MainPageComponent}
])
export class SampleAppAppComponent implements OnInit {
 title = &#39;sample-app works!&#39;;

 constructor(private router:Router) {
 }

 ngOnInit() {
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In order to have this routing working, you must put &lt;code&gt;&amp;lt;router-outlet&amp;gt;&amp;lt;/router-outlet&amp;gt;&lt;/code&gt; inside your template. This is the same as it used to be, but now this directive comes from a different module.&lt;/p&gt;

&lt;p&gt;To configure nested routes you don’t use &lt;em&gt;&amp;hellip;&lt;/em&gt; as before, you simply specify part of your route and the component related to it. Then inside your component you must specify further route configurations. In my case, I used &lt;em&gt;DashboardComponent&lt;/em&gt; and it looked like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@Component({
 moduleId: module.id,
 selector: &#39;app-dashboard&#39;,
 templateUrl: &#39;dashboard.component.html&#39;,
 styleUrls: [&#39;dashboard.component.css&#39;],
 directives: [ROUTER_DIRECTIVES]
})
@Routes([
 {path: &#39;/event-list&#39;, component: EventListComponent},
 {path: &#39;/event-details&#39;, component: EventDetailsComponent}
])
export class DashboardComponent implements OnInit {

 constructor() {}

 ngOnInit() {
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can see the rest of files for my solution in this
&lt;a href=&#34;https://github.com/pikoscielniak/angular2-rc1-routing-sample&#34; target=&#34;_blank&#34;&gt;repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When you look at this repository, you may wonder why I prefixed the folder with a &lt;em&gt;+&lt;/em&gt; sign. It is required in order to have lazy loading of components.
You can watch a
&lt;a href=&#34;https://www.youtube.com/watch?v=d8yAdeshpcw&amp;index=9&amp;list=PLOETEcp3DkCq788xapkP_OU-78jhTf68j&#34; target=&#34;_blank&#34;&gt;talk&lt;/a&gt;
given by
&lt;a href=&#34;https://twitter.com/mhevery&#34; target=&#34;_blank&#34;&gt;Misko Hevery&lt;/a&gt;
at
&lt;a href=&#34;https://www.ng-conf.org/#/&#34; target=&#34;_blank&#34;&gt;ng-conf 2016&lt;/a&gt; to find out a bit more about it.&lt;/p&gt;

&lt;p&gt;The final result of this example looked like this in the browser.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/upgradingFinalResult.png&#34; alt=&#34;Final Result&#34; title=&#34;Final Result&#34; /&gt;&lt;/p&gt;

&lt;p&gt;The interesting part of the new router is that you can specify links in templates relative to the component where they are placed. You can see an example of this here:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a [routerLink]=&amp;quot;[&#39;./event-list&#39;]&amp;quot;&amp;gt;List&amp;lt;/a&amp;gt;
&amp;lt;a [routerLink]=&amp;quot;[&#39;./event-details&#39;]&amp;quot;&amp;gt;Details&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is a fragment of a &lt;em&gt;dashboard.component.html&lt;/em&gt; file. You can see that the links are specified relative to the &lt;em&gt;DashboardComponent&lt;/em&gt;.
Everything I’ve written up to now the result of searching and experimenting after Angular2 RC1 one was released. I mentioned that when I wrote this post there wasn’t official documentation for the new router which was introduced in this version. It’s quite probable that what I have stated in this post may be wrong but until there is an official reference to deal with the new router, my solution is sufficient for me and fortunately it works quite well.&lt;/p&gt;

&lt;h3&gt;Related posts:&lt;/h3&gt;





























&lt;ul style=&#34;list-style: none;&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/02/enrolling-in-daj-sie-poznac/&#34;&gt;Enrolling in &#34;Daj się poznać&#34;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/daj-sie-poznac-project-details/&#34;&gt;&#34;Daj się poznać&#34; - Project details&#34;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/i-m-holding-a-project-rider-eap/&#34;&gt;I&#39;m holding a Project Rider EAP&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/installing-asp-dot-net-core-1-on-ubuntu-14/&#34;&gt;Installing ASP .NET Core 1 on Ubuntu 14.04&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/my-first-asp-net-core-1-web-application/&#34;&gt;My first ASP NET Core 1.0 web application&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/project-setup-server-side/&#34;&gt;Project setup - server-side&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/project-setup-client-side/&#34;&gt;Project setup - client-side&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/adding-styling-to-my-application/&#34;&gt;Adding styling to my application&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/angular2-confirm-dialog-component/&#34;&gt;Angular 2 Confirm Dialog Component&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/before-going-into-production/&#34;&gt;Before going into production&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/publishing-to-azure/&#34;&gt;Publishing to Azure&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/setting-up-the-web-client-for-google-identity-platform/&#34;&gt;Setting up the Web client for Google Identity Platform&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/oidc-token-manager-library-with-google-identity-platform-part-1/&#34;&gt;oidc-token-manager library with Google Identity Platform - Part 1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/oidc-token-manager-library-with-google-identity-platform-part-2/&#34;&gt;oidc-token-manager library with Google Identity Platform - Part 2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/accesing-api-with-token-from-google-identity-provider/&#34;&gt;Accessing API with token from Google Identity Provider&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/how-portable-is-asp-dot-net-core/&#34;&gt;How portable is ASP .NET Core 1.0?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/when-dotpeek-can-save-your-live/&#34;&gt;When dotPeek can save your live&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/reading-code-as-if-it-were-a-book/&#34;&gt;Reading code as if it were a book&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/aps-dot-net-core-configuration/&#34;&gt;ASP .NET Core Configuration&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/getting-started-with-identity-server4/&#34;&gt;Getting started with IdentityServer4&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/identityserver-4-accessing-api/&#34;&gt;IdentityServer4 - accessing API&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/dealing-with-secrets-in-asp-net-core/&#34;&gt;Dealing with secrets in ASP .NET Core&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/google-identity-provider-with-identityserver4/&#34;&gt;Google Identity Provider with IdentityServer4&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/upgrading-to-angulr2-rc1/&#34;&gt;Upgrading to Angular2 RC1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/experimenting-with-angular2-cli/&#34;&gt;Experimenting with Angular2 CLI&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/migrating-to-asp-net-core-rc2/&#34;&gt;Migrating to ASP .NET Core RC2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/epilogue-daj-sie-poznac-series/&#34;&gt;Epilogue: Daj się poznać series&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



</description>
    </item>
    
    <item>
      <title>How to avoid global installs with NPM scripts</title>
      <link>http://koscielniak.me/post/2016/05/how-to-avoid-global-installs-with-npm-scripts/</link>
      <pubDate>Sat, 14 May 2016 12:30:00 +0200</pubDate>
      
      <guid>http://koscielniak.me/post/2016/05/how-to-avoid-global-installs-with-npm-scripts/</guid>
      <description>&lt;p&gt;Recently, I heard from a friend that he doesn’t know how to use Gulp and TypeScript locally, he only knows how to install them globally. I thought it could be an issue for others, and that’s why I decided to write this post.&lt;/p&gt;

&lt;p&gt;Using globally installed NPM packages can be very problematic, especially if you need these in different versions in a variety of projects. If you rely on global packages you don’t know what the dependencies of your project really are. It is better to have everything in one place without part of your dependencies in global and the other part of your dependencies in local space.&lt;/p&gt;

&lt;p&gt;To use &lt;em&gt;gulp&lt;/em&gt; and &lt;em&gt;tsc&lt;/em&gt; (TypeScript compiler) without polluting your global, you simply install it locally with a command like this: &lt;code&gt;npm install gulp typescript --save-dev&lt;/code&gt; and then you use the power of
&lt;a href=&#34;https://docs.npmjs.com/misc/scripts&#34; target=&#34;_blank&#34;&gt;NPM scripts&lt;/a&gt;.
As you can see, in that link there are a lot of predefined scripts but I will show you how to define custom ones.&lt;/p&gt;

&lt;p&gt;All you have to do is simply to define the name of script in the &lt;em&gt;scripts&lt;/em&gt; section in the &lt;em&gt;package.json&lt;/em&gt;. This is an example from one of my projects:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;quot;scripts&amp;quot;: {
    &amp;quot;tsc&amp;quot;: &amp;quot;tsc -w&amp;quot;,
    &amp;quot;typings&amp;quot;: &amp;quot;typings&amp;quot;,
    &amp;quot;build-dev&amp;quot;: &amp;quot;gulp build-dev&amp;quot;,
    &amp;quot;build-prod&amp;quot;: &amp;quot;gulp build-prod&amp;quot;,
    &amp;quot;postinstall&amp;quot;: &amp;quot;concurrently \&amp;quot;typings install\&amp;quot; \&amp;quot;npm run build-dev\&amp;quot;&amp;quot;,
    &amp;quot;start&amp;quot;: &amp;quot; http-server &amp;quot;
},
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I have defined four custom scripts and two predefined here.
You can run custom scripts with a command like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;npm run tsc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You must execute this command in the root folder of your project (where your &lt;em&gt;package.json&lt;/em&gt; is).&lt;/p&gt;

&lt;p&gt;Running a predefined script is as simple as: &lt;code&gt;npm start&lt;/code&gt;, you don’t have to put &lt;em&gt;run&lt;/em&gt;.
Some scripts are run automatically, for example &lt;em&gt;postinstall&lt;/em&gt;. This script is run after the package is installed. In my case, after the package was installed, I installed typings and I rebuilt the libraries using the script defined above which is &lt;em&gt;build-dev&lt;/em&gt;. As you can see, you can execute other scripts in NPM scripts and you also have access to the commands which are located in the &lt;em&gt;node_modules/.bin&lt;/em&gt; of your project. In this location, you will find your commands &lt;em&gt;gulp&lt;/em&gt; and &lt;em&gt;tsc&lt;/em&gt; and other locally installed packages.&lt;/p&gt;

&lt;p&gt;The scripts defined in &lt;em&gt;package.json&lt;/em&gt; look for commands inside this location and if they didn’t find one they then check your global packages. You can also run locally installed packages with a command like this: &lt;code&gt;node_modules/.bin/gulp&lt;/code&gt; but as you can see, this is a lot of typing and over time it can be very annoying. It is much better to use NPM scripts. I hope I have helped someone by writing this post.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Google Identity Provider with IdentityServer4</title>
      <link>http://koscielniak.me/post/2016/05/google-identity-provider-with-identityserver4/</link>
      <pubDate>Wed, 11 May 2016 22:00:00 +0200</pubDate>
      
      <guid>http://koscielniak.me/post/2016/05/google-identity-provider-with-identityserver4/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://dajsiepoznac.pl&#34;&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/03/contestLogo.png&#34; alt=&#34;Daj się poznać&#34; title=&#34;Daj się poznać&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this post, I am going to continue my series about
&lt;a href=&#34;https://github.com/IdentityServer/IdentityServer4&#34; target=&#34;_blank&#34;&gt;IdenityServer4&lt;/a&gt;.
I will write about forcing IdentityServer to use Google as an external identity token provider. Before I started, I had to register the application that will interact with Google which in my case is &lt;em&gt;IdSrvHost&lt;/em&gt;.
I am going to reuse the application that I registered in this
&lt;a href=&#34;http://koscielniak.me/post/2016/04/setting-up-the-web-client-for-google-identity-platform/&#34;&gt;post&lt;/a&gt;.
However, I altered the configuration of this application a bit by enabling access to &lt;em&gt;Google+ API&lt;/em&gt;. I did this by entering &lt;em&gt;Google APIs&lt;/em&gt; and then inside &lt;em&gt;Social APIs&lt;/em&gt; I clicked &lt;em&gt;Google+ API&lt;/em&gt;. You can see this on this screen:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/idsrv4-with-google/google-plus-api.png&#34; alt=&#34;Enabling Google+ API&#34; title=&#34;Enabling Google+ API&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Then I simply clicked &lt;em&gt;Enable&lt;/em&gt;. And that was it.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/idsrv4-with-google/enabling-google-plus-api.png&#34; alt=&#34;Enabling Google+ API&#34; title=&#34;Enabling Google+ API&#34; /&gt;&lt;/p&gt;

&lt;p&gt;I then added &lt;em&gt;clientId&lt;/em&gt; and &lt;em&gt;clientSecret&lt;/em&gt; to my secret settings. I wrote about that in
&lt;a href=&#34;http://koscielniak.me/post/2016/05/dealing-with-secrets-in-asp-net-core/&#34;&gt;this post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The next step was adding the Google external identity provider to my project with IdentityServer4. I wrote
&lt;a href=&#34;http://koscielniak.me/post/2016/05/getting-started-with-identity-server4/&#34;&gt;here&lt;/a&gt;
and
&lt;a href=&#34;http://koscielniak.me/post/2016/05/identityserver-4-accessing-api/&#34;&gt;here&lt;/a&gt;
about creating this project and now I have altered it to add an external provider.&lt;/p&gt;

&lt;p&gt;The first thing which I did was to add a dependency to &lt;em&gt;project.json&lt;/em&gt; and it was called &lt;em&gt;Microsoft.AspNet.Authentication.Google&lt;/em&gt;. At the time this post was written, it was in version: &lt;em&gt;1.0.0-rc1-final&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Then inside &lt;em&gt;Configure&lt;/em&gt; method of &lt;em&gt;Startup&lt;/em&gt; class I added:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;app.UseCookieAuthentication(options =&amp;gt;
    {
        options.AuthenticationScheme = &amp;quot;External&amp;quot;;
    });

    app.UseGoogleAuthentication(options =&amp;gt;
    {
        options.AuthenticationScheme = &amp;quot;Google&amp;quot;;
        options.SignInScheme = &amp;quot;External&amp;quot;;

        options.ClientId = Configuration[&amp;quot;GoogleIdentityProvider:ClientId&amp;quot;];
        options.ClientSecret = Configuration[&amp;quot;GoogleIdentityProvider:ClientSecret&amp;quot;];
        options.CallbackPath = new PathString(&amp;quot;/googlecallback&amp;quot;);                
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I did this right after the line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;app.UseIdentityServer();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I will explain a bit about what I did here. First of all, I specified &lt;em&gt;CallbackPath&lt;/em&gt; in the options for &lt;em&gt;UseGoogleAuthentication&lt;/em&gt; but that is not necessary. If you don’t specify the redirect URI, the default will be &lt;em&gt;&lt;a href=&#34;http://url_of_app/signin-google&#34;&gt;http://url_of_app/signin-google&lt;/a&gt;&lt;/em&gt; which I learned when I got the following error:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/idsrv4-with-google/redirect-uri-mismatch.png&#34; alt=&#34;Redirect URI mismatch&#34; title=&#34;Redirect URI mismatch&#34; /&gt;&lt;/p&gt;

&lt;p&gt;I decided to add something different to see if it would work.&lt;/p&gt;

&lt;p&gt;You may be asking: why did I need to add two middlewares? To answer to this question, I must explain that the flow follows the authentication to Google. Now when you login with my Identity Provider (&lt;em&gt;IdSrvHost&lt;/em&gt;) you see a screen like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/idsrv4-with-google/login-screen.png&#34; alt=&#34;Login Screen&#34; title=&#34;Login Screen&#34; /&gt;&lt;/p&gt;

&lt;p&gt;This &lt;em&gt;Google&lt;/em&gt; button comes from the code in the &lt;em&gt;Login/Index.cshtml&lt;/em&gt; view like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@if (Model.ExternalProviders.Any())
{
    &amp;lt;div class=&amp;quot;col-md-6 col-sm-6 external-providers&amp;quot;&amp;gt;
        &amp;lt;div class=&amp;quot;panel panel-default&amp;quot;&amp;gt;
            &amp;lt;div class=&amp;quot;panel-heading&amp;quot;&amp;gt;
                &amp;lt;h3 class=&amp;quot;panel-title&amp;quot;&amp;gt;External Login&amp;lt;/h3&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div class=&amp;quot;panel-body&amp;quot;&amp;gt;
                &amp;lt;ul class=&amp;quot;list-inline&amp;quot;&amp;gt;
                    @foreach (var externalProvider in Model.ExternalProviders)
                    {
                        &amp;lt;li&amp;gt;
                            &amp;lt;a class=&amp;quot;btn btn-default&amp;quot;
                               href=&amp;quot;@Url.Action(&amp;quot;ExternalLogin&amp;quot;, 
                                    new
                                    {
                                        provider = externalProvider.AuthenticationScheme,
                                        signInId = Model.SignInId
                                    })&amp;quot;&amp;gt;
                                @externalProvider.Text
                            &amp;lt;/a&amp;gt;
                        &amp;lt;/li&amp;gt;
                    }
                &amp;lt;/ul&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And &lt;em&gt;ExternalProviders&lt;/em&gt; in the model I added in the &lt;em&gt;Login&lt;/em&gt; method in &lt;em&gt;LoginController&lt;/em&gt; like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var vm = new LoginViewModel();
vm.ExternalProviders.Add(ExternalProvider.Google);
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;var loginProviders = HttpContext.Authentication.GetAuthenticationSchemes().ToList();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But then I would have to filter these schemes and choose only the external providers. I would rather be more explicit at this stage of my solution and that’s why I decided to create  an explicit list of external providers.&lt;/p&gt;

&lt;p&gt;So&amp;hellip;what happens when the user clicks the &lt;em&gt;Google&lt;/em&gt; button. They see a screen like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/idsrv4-with-google/allow-access.png&#34; alt=&#34;Allow access&#34; title=&#34;Allow access&#34; /&gt;&lt;/p&gt;

&lt;p&gt;When they click &lt;em&gt;Allow&lt;/em&gt; they see a screen like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/idsrv4-with-google/oidc-client-is-requesting-your-permission.png&#34; alt=&#34;OIDC Client is requesting your permission&#34; title=&#34;OIDC Client is requesting your permission&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Take a notice that this screen comes from my Identity Provider. Next, when the user clicks &lt;em&gt;Yes, Allow&lt;/em&gt; they are redirected to the application they came from.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://koscielniak.me/post/2016/05/idsrv4-with-google/final-result.png&#34; alt=&#34;Final result&#34; title=&#34;Final result&#34; /&gt;&lt;/p&gt;

&lt;p&gt;This is a flow from a GUI perspective. And now flow from the backend perspective.&lt;/p&gt;

&lt;p&gt;After clicking &lt;em&gt;Login Only&lt;/em&gt; in the &lt;em&gt;JavaScript Oidc Client&lt;/em&gt;, there is a redirection to the method &lt;em&gt;Index&lt;/em&gt; in the &lt;em&gt;LoginController&lt;/em&gt;. Then the &lt;em&gt;Index&lt;/em&gt; view is presented. After clicking the &lt;em&gt;Google&lt;/em&gt; button, the action &lt;em&gt;ExternalLogin&lt;/em&gt; is executed in the same controller and the parameter &lt;em&gt;provider&lt;/em&gt; is set to &lt;em&gt;Google&lt;/em&gt;. This method looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public IActionResult ExternalLogin(string provider, string signInId)
{
    var props = new AuthenticationProperties
    {
        RedirectUri = &amp;quot;/login/callback?signInId=&amp;quot; + signInId
    };

    return new ChallengeResult(provider, props);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I return &lt;em&gt;ChallengeResult&lt;/em&gt; with &lt;em&gt;Google&lt;/em&gt; as a provider which caused my &lt;em&gt;Google middleware&lt;/em&gt; to be triggered and I also specified the callback URI to be called after the auth process.&lt;/p&gt;

&lt;p&gt;The most important thing here is the property &lt;em&gt;SignInScheme&lt;/em&gt; which I set in the &lt;em&gt;UseGoogleAuthentication&lt;/em&gt; options, as this what completes the authentication process after it returns from Google, and then my callback is called.&lt;/p&gt;

&lt;p&gt;In this callback, the current working version looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public async Task&amp;lt;IActionResult&amp;gt; Callback(string signInId)
{
    var external = await HttpContext.Authentication.AuthenticateAsync(&amp;quot;External&amp;quot;);
    //todo create or get local account match by email         
    //for now alice is hardcoded            
    var subject = &amp;quot;818727&amp;quot;;//todo you get this after you create or get local user
    var name = &amp;quot;alice&amp;quot;;
    var claims = new[] {
                new Claim(JwtClaimTypes.Subject, subject),
                new Claim(JwtClaimTypes.Name, name),
                new Claim(JwtClaimTypes.IdentityProvider, &amp;quot;idsvr&amp;quot;),
                new Claim(JwtClaimTypes.AuthenticationTime, DateTime.UtcNow.ToEpochTime().ToString())
            };

    var ci = new ClaimsIdentity(claims, &amp;quot;password&amp;quot;, JwtClaimTypes.Name, JwtClaimTypes.Role);
    var cp = new ClaimsPrincipal(ci);

    await HttpContext.Authentication.SignInAsync(Constants.PrimaryAuthenticationType, cp);
    await HttpContext.Authentication.SignOutAsync(&amp;quot;External&amp;quot;);

    if (signInId != null)
    {                
        return new SignInResult(signInId);
    }

    return Redirect(&amp;quot;~/&amp;quot;);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I can get access to the claims received from Google with this line:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var external = await HttpContext.Authentication.AuthenticateAsync(&amp;quot;External&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That’s why I needed this extra middleware to get these Google claims. I should do something meaningful with these claims but that is a theme for another post. For now, I will simply map everyone logged in with a Google account to my local user &lt;em&gt;alice&lt;/em&gt;. Next, I signed out from the &lt;em&gt;External&lt;/em&gt; authentication schema, then signed in &lt;em&gt;alice&lt;/em&gt; with &lt;em&gt;PrimaryAuthenticationType&lt;/em&gt; which is IdentityServer. After, I return the &lt;em&gt;SignInResult&lt;/em&gt;. Here, I did here the same thing done in the post &lt;em&gt;Login&lt;/em&gt; method in &lt;em&gt;LoginController&lt;/em&gt;. Basically, IdentityServer is doing its job and I don’t need to micromanage what’s going on there. I provided everything it needs to authenticate and authorize a user.&lt;/p&gt;

&lt;p&gt;And that’s it&amp;hellip;this is how I setup Google as an external Identity Provider. You can find the whole source code for this sample project in
&lt;a href=&#34;https://github.com/pikoscielniak/idsrv-demo&#34; target=&#34;_blank&#34;&gt;this repository&lt;/a&gt;.
Similarly, for example, you can use Facebook as an external Identity Provider. I am going to do this but I will write about it only if I run into problems and I’m forced to troubleshoot.&lt;/p&gt;

&lt;p&gt;&lt;h3&gt;Related posts:&lt;/h3&gt;





























&lt;ul style=&#34;list-style: none;&#34;&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/02/enrolling-in-daj-sie-poznac/&#34;&gt;Enrolling in &#34;Daj się poznać&#34;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/daj-sie-poznac-project-details/&#34;&gt;&#34;Daj się poznać&#34; - Project details&#34;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/i-m-holding-a-project-rider-eap/&#34;&gt;I&#39;m holding a Project Rider EAP&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/installing-asp-dot-net-core-1-on-ubuntu-14/&#34;&gt;Installing ASP .NET Core 1 on Ubuntu 14.04&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/my-first-asp-net-core-1-web-application/&#34;&gt;My first ASP NET Core 1.0 web application&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/project-setup-server-side/&#34;&gt;Project setup - server-side&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/project-setup-client-side/&#34;&gt;Project setup - client-side&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/adding-styling-to-my-application/&#34;&gt;Adding styling to my application&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/angular2-confirm-dialog-component/&#34;&gt;Angular 2 Confirm Dialog Component&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/before-going-into-production/&#34;&gt;Before going into production&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/03/publishing-to-azure/&#34;&gt;Publishing to Azure&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/setting-up-the-web-client-for-google-identity-platform/&#34;&gt;Setting up the Web client for Google Identity Platform&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/oidc-token-manager-library-with-google-identity-platform-part-1/&#34;&gt;oidc-token-manager library with Google Identity Platform - Part 1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/oidc-token-manager-library-with-google-identity-platform-part-2/&#34;&gt;oidc-token-manager library with Google Identity Platform - Part 2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/accesing-api-with-token-from-google-identity-provider/&#34;&gt;Accessing API with token from Google Identity Provider&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/how-portable-is-asp-dot-net-core/&#34;&gt;How portable is ASP .NET Core 1.0?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/when-dotpeek-can-save-your-live/&#34;&gt;When dotPeek can save your live&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/reading-code-as-if-it-were-a-book/&#34;&gt;Reading code as if it were a book&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/04/aps-dot-net-core-configuration/&#34;&gt;ASP .NET Core Configuration&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/getting-started-with-identity-server4/&#34;&gt;Getting started with IdentityServer4&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/identityserver-4-accessing-api/&#34;&gt;IdentityServer4 - accessing API&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/dealing-with-secrets-in-asp-net-core/&#34;&gt;Dealing with secrets in ASP .NET Core&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/google-identity-provider-with-identityserver4/&#34;&gt;Google Identity Provider with IdentityServer4&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/upgrading-to-angulr2-rc1/&#34;&gt;Upgrading to Angular2 RC1&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/experimenting-with-angular2-cli/&#34;&gt;Experimenting with Angular2 CLI&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/migrating-to-asp-net-core-rc2/&#34;&gt;Migrating to ASP .NET Core RC2&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&#34;http://koscielniak.me/post/2016/05/epilogue-daj-sie-poznac-series/&#34;&gt;Epilogue: Daj się poznać series&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>