<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Roman Veselý: Notes</title><description>Personal blog. Notes not only about web development.</description><link>https://romanvesely.com/</link><language>en-us</language><lastBuildDate>Sat, 18 Apr 2026 10:47:41 GMT</lastBuildDate><item><title>Comforting to know</title><link>https://romanvesely.com/comforting-to-know</link><guid isPermaLink="true">https://romanvesely.com/comforting-to-know</guid><description>Currently, I am reading &amp;lt;cite&amp;gt;The Star Diaries&amp;lt;/cite&amp;gt;, a book by Stanisław Lem, a Polish sci-fi writer, in which he describes the stories of protagonist Ijon Tichy. Stories about space voy...</description><pubDate>Mon, 05 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Currently, I am reading &lt;cite&gt;&lt;/cite&gt;The Star Diaries, a book by Stanisław Lem, a Polish sci-fi writer, in which he describes the stories of protagonist Ijon Tichy. Stories about space voyages, time traveling, extraterrestrial life, and robots.&lt;/p&gt;
&lt;p&gt;Having different AIs fall onto us from all sides, it&apos;s comforting to know people thought about artificial brains way long before they started being introduced in every other product we use.
Products that are either software or hardware.&lt;/p&gt;
&lt;p&gt;While AI may present its own set of challenges and complexities, it ultimately lacks the nuanced moral compass that defines human behavior.
For good or for bad, as Ijon&apos;s thoughts suggest as one of his journeys concluded (emphasis mine):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thus concluded one of the most unusual of my adventures and voyages. Notwithstanding all the hardship and pain it had occasioned me, I was glad of the outcome, since it restored my faith, shaken by corrupt cosmic officeholders, in the natural decency of electronic brains. &lt;em&gt;Yes, it’s comforting to know, when you think about it, that only man can be a bastard.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I read the book in Czech language edition, I&apos;m adding the translated quote as well:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tak skončila jedna z mých nejpodivnějších cest. Přes všechny ty nesnáze a strádání, které jsem na ní zažil, jsem byl rád, že se všechno takto vysvětlilo, protože se mi vrátila víra v přirozenou důstojnost elektronických mozků, jejichž dobré jméno ti kosmičtí šejdíři tak zneuctili. &lt;em&gt;Je to přece jen milé pomyšlení, že ničemou může být jedině člověk.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Krystal, a TiddlyWiki plugin</title><link>https://romanvesely.com/tiddlywiki-plugin-krystal</link><guid isPermaLink="true">https://romanvesely.com/tiddlywiki-plugin-krystal</guid><description>A couple of years ago, during the Covid pandemic lockdowns,
I focused more on how to improve my notes and note-taking process in general.
Back then, I was not satisfied with my notes spread across sev...</description><pubDate>Sun, 24 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A couple of years ago, during the Covid pandemic lockdowns,
I focused more on how to improve my notes and note-taking process in general.&lt;/p&gt;
&lt;p&gt;Back then, I was not satisfied with my notes spread across several documents&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;.
Many times, I could not decide where to put something because I felt it belonged to more than one specific category.
Also, for some reason, I barely came back to look for what I had already noted.
In the end, it felt almost useless to spend time with note-taking at all.&lt;/p&gt;
&lt;p&gt;I came across &lt;a href=&quot;https://anne-laure.net/&quot;&gt;Anne-Laure Le Cunff&lt;/a&gt; and her &lt;a href=&quot;https://nesslabs.com/&quot;&gt;blog&lt;/a&gt; full of loads of articles about productivity, learning, and journaling.
Thanks to these I have found a great tool &lt;a href=&quot;https://tiddlywiki.com/&quot;&gt;TiddlyWiki&lt;/a&gt;—a non-linear personal web notebook—and a great source of &lt;a href=&quot;https://notes.andymatuschak.org/&quot;&gt;thoughts on note-taking&lt;/a&gt; by &lt;a href=&quot;https://andymatuschak.org/&quot;&gt;Andy Matuschak&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I liked the TiddlyWiki philosophy as well as its possibility of having backlinks between different notes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So I have built Krystal&lt;/strong&gt; - a lightweight plugin for TiddlyWiki that changes its vertical &quot;story river&quot; to a horizontal one to imitate the UI of Andy&apos;s notes system&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;figure&gt;
    
    &lt;figcaption&gt;Video showing how the TiddlyWiki UI changes with the Krystal plugin.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Since then, I have rewritten my old notes as atomic and interconnected notes.
I put them into this system having a couple of hundreds tiddlers&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn3&quot; id=&quot;fnref3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt; as of the time of writing.
Along with that, I have also incorporated flashcards (with the &lt;a href=&quot;https://sobjornstad.github.io/TiddlyRemember/&quot;&gt;TiddlyRember plugin&lt;/a&gt;) that I can export to &lt;a href=&quot;https://apps.ankiweb.net/&quot;&gt;Anki&lt;/a&gt;, a spaced repetition system.&lt;/p&gt;
&lt;p&gt;There&apos;s a great power when notes and flashcards are being kept in the same place.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[...] it’s (finally!) a nice minimal and pleasing theme for TiddlyWiki (it even looks great on mobile!).&lt;/p&gt;
&lt;footer&gt;— Tom Critchlow, &lt;cite&gt;&lt;a href=&quot;https://tomcritchlow.com/2020/05/19/tiddlywiki-krystal/&quot;&gt;A Good Looking Tiddly Theme for Digital Gardens&lt;/a&gt;&lt;/cite&gt;&lt;/footer&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, let&apos;s go ahead and check the Krystal plugin:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://crazko.github.io/krystal/&quot;&gt;homepage&lt;/a&gt; and &lt;a href=&quot;https://crazko.github.io/krystal/#Installation:Krystal%20Installation&quot;&gt;installation guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/crazko/krystal&quot;&gt;source code on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you build something on the top of Krystal, share it with others in the &lt;a href=&quot;https://github.com/crazko/krystal/discussions/45&quot;&gt;discussion&lt;/a&gt;, so we can learn from each other.&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot; /&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Not only documents, I also used to use &lt;a href=&quot;https://romanvesely.com/journaling&quot;&gt;calendar events for journaling&lt;/a&gt;. I still keep my training logs in calendar, though. &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Andy has &lt;a href=&quot;https://twitter.com/andy_matuschak/status/1568032775210692609&quot;&gt;expressed some concerns&lt;/a&gt; about the design. &lt;a href=&quot;#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;In TiddlyWiki, a &quot;tiddler&quot; is one specific note. Or, more broadly, &lt;a href=&quot;https://tiddlywiki.com/#Tiddlers&quot;&gt;the fundamental unit of information&lt;/a&gt;. &lt;a href=&quot;#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>CSS Nesting Survey</title><link>https://romanvesely.com/css-nesting-survey</link><guid isPermaLink="true">https://romanvesely.com/css-nesting-survey</guid><description>One of the most anticipated features in CSS, nesting, is indeed coming to be part of vanilla CSS. There are currently three different options for the syntax and people can choose from them in an ongoi...</description><pubDate>Sat, 17 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One of the most anticipated features in CSS, nesting, is indeed coming to be part of vanilla CSS. There are currently three different options for the syntax and people can choose from them in an &lt;a href=&quot;https://webkit.org/blog/13607/help-choose-from-options-for-css-nesting-syntax/&quot;&gt;ongoing survey&lt;/a&gt; to help the implementers make the decision. What are the options and what did I vote for?&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;All of the presented options produce the same result:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;header {
  color: tomato;
}

header nav {
  display: flex;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here are the options and my views on them.&lt;/p&gt;
&lt;h3&gt;Option 3&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;header {
  color: tomato;

  &amp;amp; nav {
    display: flex;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This option is the most similar to Sass out of all the options. However, it is not the same! The nested selector cannot start with a letter. That&apos;s why in the example above, the nested rule &lt;em&gt;must be&lt;/em&gt; prefixed with &lt;code&gt;&amp;amp;&lt;/code&gt; even though it is optional in every other case (and option).&lt;/p&gt;
&lt;p&gt;Also, when the parent selector should come after the nested selector, it must be wrapped with, for example, &lt;code&gt;:is()&lt;/code&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;, like in this contrived example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;header {
  color: tomato;

  :is(nav) &amp;amp; {
    display: flex;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I think this exception may cause a lot of errors during development when this option is implemented. The question that arises is why can&apos;t the syntax &lt;a href=&quot;https://www.bram.us/2022/12/16/help-choose-the-syntax-for-css-nesting/#faq&quot;&gt;be exactly like in Sass&lt;/a&gt;?&lt;/p&gt;
&lt;h3&gt;Option 4&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;header {
  color: tomato;
}
 {
  nav {
    display: flex;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nested selectors and declarations are put in a separate scope. This is what I voted for because I find it the most convenient of all three options.&lt;/p&gt;
&lt;p&gt;It may lead to some weird declarations in certain situations, though. When the parent selector does not have any declarations, its scope is empty:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;header {
}
 {
  nav {
    display: flex;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Option 5&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;@nest header {
  &amp;amp; {
    color: tomato;
  }

  nav {
    display: flex;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;@nest&lt;/code&gt; declaration comes before the parent selector. This reminds many people of media query declarations. For me, it&apos;s a bit cumbersome - it forces you to think ahead and write it before nested declarations can be used, or makes you move back in front of the parent selectors and write it afterwards.&lt;/p&gt;
&lt;h2&gt;Current results&lt;/h2&gt;
&lt;p&gt;I was not surprised to see Option 3 having the most votes (as of mid-December 2022):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Option 3 - 77%&lt;/li&gt;
&lt;li&gt;Option 4 - 9%&lt;/li&gt;
&lt;li&gt;Option 5 - 14%&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although the survey is still ongoing, it&apos;s pretty clear that people like the Sass-like syntax the most. Probably because it is the most similar to what many of them have been using in the past few years.
Even though I currently do not consider myself to be a user of the CSS Nesting feature&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;, I&apos;m a bit sad my preferred option is least favored so far.&lt;/p&gt;
&lt;p&gt;If you want to shape the future of CSS, &lt;a href=&quot;https://webkit.org/blog/13607/help-choose-from-options-for-css-nesting-syntax/&quot;&gt;participate in the survey&lt;/a&gt;! The survey is accompanied by lots of examples and comprehensive explanations, so it is beneficial to check it out even when you do not want to vote. If you are interested in more in-depth discussions, take a look at the &lt;a href=&quot;https://github.com/w3c/csswg-drafts/issues/7834&quot;&gt;Github&lt;/a&gt; &lt;a href=&quot;https://github.com/w3c/csswg-drafts/issues/7970&quot;&gt;issues&lt;/a&gt; of the CSS working group.&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot; /&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;It&apos;s not about the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/:is&quot;&gt;&lt;code&gt;:is()&lt;/code&gt;&lt;/a&gt; pseudo-class having some special meaning in this particular case, it just starts with a colon, therefore it satisfies the rule &quot;cannot start with a letter&quot;. &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I think that my need (or desire?) to use CSS Nesting in my day-to-day projects has been declining for a couple of years and it is currently almost zero. This blog is probably the last project written with CSS Nesting from scratch so far. &lt;a href=&quot;#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Highlight Text With Text Fragments</title><link>https://romanvesely.com/text-fragments</link><guid isPermaLink="true">https://romanvesely.com/text-fragments</guid><description>import CanIUse from &apos;../../components/CanIUse.astro&apos;;
import { Highlight } from &apos;./_components/Highlight&apos;;
New API for navigating to the specific part of the webpage is slowly starting to be part of t...</description><pubDate>Wed, 24 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import CanIUse from &apos;../../components/CanIUse.astro&apos;;
import { Highlight } from &apos;./_components/Highlight&apos;;&lt;/p&gt;
&lt;p&gt;New API for navigating to the specific part of the webpage is slowly starting to be part of the browsers. In many cases, it may replace anchor linking, which has been part of the web development for decades.&lt;/p&gt;
&lt;p&gt;Lately, I noticed some new behavior of &lt;a href=&quot;https://stackoverflow.com/&quot;&gt;StackOverflow&lt;/a&gt; in my browser. The answer I was looking for was highlighted as if I had used the &lt;a href=&quot;https://romanvesely.com/browser-search/&quot;&gt;browser&apos;s search functionality&lt;/a&gt;. However, this highlighted text was produced by Google Search, ...or not?&lt;/p&gt;
&lt;p&gt;https://twitter.com/rmnvsl/status/1268259255418839042&lt;/p&gt;
&lt;p&gt;This functionality is called &lt;a href=&quot;https://wicg.github.io/scroll-to-text-fragment/&quot;&gt;Text Fragments&lt;/a&gt; and its specification was published by WICG&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;, which means it is &lt;em&gt;de facto&lt;/em&gt; only a proposal, not a standard. Regardless of that, it seems it&apos;s not a problem to &lt;a href=&quot;https://blog.chromium.org/2019/12/chrome-80-content-indexing-es-modules.html#:~:text=Text%20URL%20Fragments&quot;&gt;implement&lt;/a&gt; such a feature into a browser now.&lt;/p&gt;
&lt;p&gt;I will explain this new functionality, check the browser support, and also provide a &lt;strong&gt;working example&lt;/strong&gt; further in this article.&lt;/p&gt;
&lt;h2&gt;Text Fragments&lt;/h2&gt;
&lt;p&gt;Text Fragments adds support for navigating and highlighting specified text snippet in a page and so immediately brings user&apos;s attention to it.&lt;/p&gt;

&lt;p&gt;Up to this time, we had to use anchors, links pointing to the elements with &lt;code&gt;id&lt;/code&gt; attributes defined. You can try to &lt;a href=&quot;#social&quot;&gt;jump to the comments section&lt;/a&gt; to see it in action.&lt;/p&gt;

&lt;p&gt;The main uses cases are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;search engines&lt;/strong&gt; - they serve links to the pages you are looking for. With text fragments, they can lead you to the exact searched content rather than linking to the top of the page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sharing from the browser&lt;/strong&gt; - let&apos;s say you want to share some text from the web page with a friend. You select that part of the text and from the browser&apos;s context menu you choose &quot;Share this text&quot; - and browser puts the URL with correct text fragment to your clipboard. Now your friend is navigated to the same part of the page. (e.g. Wikipedia article).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;How a browser should respond&lt;/strong&gt; to the text fragment is purposely not defined. While my browser highlights the text and scroll to that part of the page, it may also active search functionality on that text or show a notification with some &quot;click to scroll to the text&quot; message.&lt;/p&gt;
&lt;h3&gt;So, how does a text fragment look?&lt;/h3&gt;
&lt;p&gt;It&apos;s defined with &lt;code&gt;:~:text=&lt;/code&gt; after the &lt;code&gt;#&lt;/code&gt; (hash) in the URL, e.g.:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://romanvesely.com/text-fragments/#:~:text=How a browser should respond,with some &quot;click to scroll to the text&quot; message.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Specifically, it consists of four parts:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#:~:text=[prefix-,]textStart[,textEnd][,-suffix]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Text to highlight is defined by &lt;code&gt;textStart&lt;/code&gt;, which is also the only required parameter of fragment directive. If it&apos;s too long, it can be split into two shorter parts. The second one defines the end of the snippet (&lt;code&gt;textEnd&lt;/code&gt;). The browser will highlight everything in between those parts.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;prefix&lt;/code&gt; and &lt;code&gt;suffix&lt;/code&gt; define a context, so the browser knows which text to select if there is more than one occurrence of it. They represent the text immediately preceding (&lt;code&gt;prefix&lt;/code&gt;) and following (&lt;code&gt;suffix&lt;/code&gt;) the text that should be highlighted. It means, context &lt;em&gt;is not&lt;/em&gt; part of the text snippet.&lt;/p&gt;
&lt;h3&gt;Some Notable Characteristics&lt;/h3&gt;
&lt;p&gt;Whole words have to be specified, just a portion of a word will not work.&lt;/p&gt;
&lt;p&gt;Some characters have to be percent-decoded, namely, dash &lt;code&gt;-&lt;/code&gt;, comma &lt;code&gt;,&lt;/code&gt; and ampersand &lt;code&gt;&amp;amp;&lt;/code&gt;, to avoid being interpreted as a part of the text directive syntax.&lt;/p&gt;
&lt;p&gt;Fragment (anchor) can be used together with text fragments. It may happen that text on the page has changed since text fragment was created, so the browser can still point at least to the appropriate section of the page.&lt;/p&gt;
&lt;p&gt;Highlighting more text snippets is possible by adding more text fragments to the URL. Just join them with the ampersand(s).&lt;/p&gt;
&lt;p&gt;Unfortunately, as of the time of writing this article, there is no way to customize the style of highlighted text snippets.&lt;/p&gt;
&lt;h2&gt;Is Your Browser Ready?&lt;/h2&gt;
&lt;p&gt;Let&apos;s look at what browsers currently support this new feature:&lt;/p&gt;

&lt;p&gt;Not that much. But, if you have one of the supporting browsers, you can...&lt;/p&gt;
&lt;h2&gt;See It in Action&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Select any text&lt;/strong&gt; on this page and  again to see the highlighted text snippet.&lt;/p&gt;
&lt;p&gt;For the simplicity and purpose of this example, the selection range expands across the whole selected elements.&lt;/p&gt;
&lt;p&gt;You can use the same functionality on any page with this new &lt;a href=&quot;https://chrome.google.com/webstore/detail/link-to-text-fragment/pbcodcjpfjdpcineamnnmbkkmkdpajjg&quot;&gt;Link to Text Fragment&lt;/a&gt; Chrome extension.&lt;/p&gt;
&lt;h2&gt;Privacy Concerns&lt;/h2&gt;
&lt;p&gt;As we all do know, not everything is bright and shiny. This new feature, which has already rolled out to hundreds of thousands of devices, might be misused against their users without their knowledge.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/nileshtrivedi/status/1268390936913952768&quot;&gt;I was pointed&lt;/a&gt; to the &lt;a href=&quot;https://www.forbes.com/sites/gordonkelly/2020/02/23/google-chrome-80-upgrade-deep-linking-update-chrome-browser/&quot;&gt;article elaborating&lt;/a&gt; further on this matter. I would also recommend you to check &lt;a href=&quot;https://twitter.com/pes10k/status/1230958596780785664&quot;&gt;this tweet thread&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/pes10k&quot;&gt;Pete Snyder&lt;/a&gt;, which should give you a better picture. I couldn&apos;t explain it better.&lt;/p&gt;
&lt;p&gt;I would like to learn more about this security topic, so if you know about any related resource, please, ping me.&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot; /&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.w3.org/community/wicg/&quot;&gt;W3C Web Platform Incubator Community Group&lt;/a&gt;. I was not aware of this group before. How could I, there are &lt;a href=&quot;https://www.w3.org/groups/&quot;&gt;&lt;em&gt;many&lt;/em&gt; of them&lt;/a&gt;. &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Learning Log #4</title><link>https://romanvesely.com/log4</link><guid isPermaLink="true">https://romanvesely.com/log4</guid><description>More JavaScript and TypeScript stuff, tips for GitHub and offline world.
Sidenote: now, you can find the content of all my Learning Log together in one place. It should be easier for me to add new pie...</description><pubDate>Sun, 14 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;More JavaScript and TypeScript stuff, tips for GitHub and offline world.&lt;/p&gt;
&lt;p&gt;Sidenote: now, you can find the content of all my &lt;a href=&quot;https://romanvesely.com/log&quot;&gt;Learning Log&lt;/a&gt; together in one place. It should be easier for me to add new pieces more frequently. I can also &lt;a href=&quot;https://en.wikipedia.org/wiki/Transclusion&quot;&gt;transclude&lt;/a&gt; the content of any individual log anywhere where a React component can be used thanks to the new &lt;a href=&quot;https://github.com/crazko/romanvesely.com/blob/master/src/components/Log.jsx&quot;&gt;&lt;code&gt;&amp;lt;Log /&amp;gt;&lt;/code&gt; component&lt;/a&gt;. RSS &lt;s&gt;may come later&lt;/s&gt; is &lt;a href=&quot;https://romanvesely.com/log.xml&quot;&gt;also available&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;JS/TS related:&lt;/h2&gt;




&lt;h2&gt;GitHub Tip&lt;/h2&gt;

&lt;h2&gt;Offline Behaviour&lt;/h2&gt;

&lt;p&gt;That&apos;s enough for now, see you next time!&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>React hook generating crypting text effect</title><link>https://romanvesely.com/dencrypt</link><guid isPermaLink="true">https://romanvesely.com/dencrypt</guid><description>Add Matrix-like effect to your text with this simple and customizable React hook.

url: https://www.npmjs.com/package/use-dencrypt-effect
repository: https://github.com/crazko/use-dencrypt-effect


...</description><pubDate>Sun, 23 Feb 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Add Matrix-like effect to your text with this simple and customizable React hook.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;url: https://www.npmjs.com/package/use-dencrypt-effect&lt;/li&gt;
&lt;li&gt;repository: https://github.com/crazko/use-dencrypt-effect&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/usedencrypt.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Learning Log #3</title><link>https://romanvesely.com/log3</link><guid isPermaLink="true">https://romanvesely.com/log3</guid><description>List of interesting news, resources or issues and their solutions I have been lately dealing with.
&amp;lt;Log id=&quot;0012&quot; /&amp;gt;
&amp;lt;Log id=&quot;0013&quot; /&amp;gt;
&amp;lt;Log id=&quot;0014&quot; /&amp;gt;
&amp;lt;Log id=&quot;0015&quot; /&amp;gt;
&amp;lt;L...</description><pubDate>Sat, 08 Feb 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;List of interesting news, resources or issues and their solutions I have been lately dealing with.&lt;/p&gt;






&lt;p&gt;That&apos;s enough for now, see you next time!&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Where do you journal?</title><link>https://romanvesely.com/journaling</link><guid isPermaLink="true">https://romanvesely.com/journaling</guid><description>Have you ever tried to keep your own daily journal? Maybe you had been journaling at a very young age. Maybe you keep your journal even today. Maybe you think you should give it a try, at least. In an...</description><pubDate>Mon, 27 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Have you ever tried to keep your own daily journal? Maybe you had been journaling at a very young age. Maybe you keep your journal even today. Maybe you think you should give it a try, at least. In any case, there are dozens of options to use for thought preservation. Which one to choose?&lt;/p&gt;
&lt;p&gt;One can use a physical notebook, but in the computers and mobile phones era, some journaling app is as much at our fingerprints. Even though many people prefer handwriting over typing on the keyboard, for a big portion of the population computers are equally natural - we work with them every day. So maybe it makes sense to use them also for journaling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; try to keep your journal in the daily events of your calendar. And if you by any chance use Google Calendar, try also a new &lt;a href=&quot;https://kalendario.com&quot;&gt;browser extension Kalendario&lt;/a&gt;, which I made. It shows event descriptions in agenda and search views, and thanks to that it makes reading through descriptions of many displayed events easier.&lt;/p&gt;

&lt;p&gt;I&apos;ve tried several apps to save the notion of my daily experiences for my future self but never been a fan of any for a long time. I have spent the most time in the Google Docs, though. Documents are accessible from any device and sync automatically, which is very convenient. Many journaling apps have similar features, but a simple document feels just like a blank piece of paper.&lt;/p&gt;
&lt;p&gt;Having everything in one document was good enough for me until I hit around one hundred pages full of text which caused severe lagging every time I opened it to read or add something new. I was also missing a feature allowing me to search by a specific date. Of course, it wouldn&apos;t be a problem if I stick to some (templating) rules. I also thought that a journaling app could imitate an &lt;a href=&quot;https://www.google.com/search?tbm=isch&amp;amp;q=advent+calendar&quot;&gt;advent calendar&lt;/a&gt; - where you can see used slots and those yet untouched.&lt;/p&gt;
&lt;p&gt;My search for a new app slowly started again... until I realized I&apos;ve had it in front of my eyes all that time!&lt;/p&gt;
&lt;h2&gt;Welcome, Calendar&lt;/h2&gt;
&lt;p&gt;As I wrote in the previous paragraph - I was thinking about a calendar-like application - and, of course, I use one - Google Calendar. Why not use it also for journaling? My approach has become as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;create one event for any type of an entry&lt;/li&gt;
&lt;li&gt;name of an event follows its type (daily, weekly, monthly; quarterly and yearly evaluations)&lt;/li&gt;
&lt;li&gt;set it as &quot;all day event&quot;&lt;/li&gt;
&lt;li&gt;put everything in the description (I use markdown)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that&apos;s all! You can search easily, by date (range), name, or by any content type. It&apos;s fast, it&apos;s simple to use.&lt;/p&gt;
&lt;p&gt;After some tinkering, I&apos;ve also started to add notes from my training sessions - weightlifting, running, etc. Actually, now I have my whole workout plan from the past years in a separate calendar with all the exercises, weights, and notes on how I felt during a session. It&apos;s very easy to find some CrossFit routine I liked, but can&apos;t remember anymore - search for thrusters &amp;amp; box jumps suffice my need in a fraction of seconds. (a tough combination of exercises, by the way).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/journaling/trainings.png&quot; alt=&quot;Training calendar in Google Calendar&quot; /&gt;&lt;/p&gt;
&lt;p&gt;One feature I still miss in Google Calendar (and others as well), though. It is not possible to display descriptions of more the one event at a time...&lt;/p&gt;
&lt;p&gt;I thought I can fix it. Well, not fix &lt;em&gt;directly&lt;/em&gt;, but add that missing functionality and make me happy. And maybe some other fellas with me.&lt;/p&gt;
&lt;h2&gt;Meet Kalendario&lt;/h2&gt;
&lt;p&gt;So I made &lt;a href=&quot;https://kalendario.org/&quot;&gt;Kalendario&lt;/a&gt; - a browser extension for Chrome (and other Chromium-based browsers) and Firefox, which shows event descriptions in agenda and search views of the Google Calendar.&lt;/p&gt;
&lt;p&gt;Reading through many events is now much more easier. A picture is worth a thousand words:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://kalendario.org/live.gif&quot; alt=&quot;Preview of Kalendario browser extension&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Visit https://kalendario.org for more information or download it for &lt;a href=&quot;https://chrome.google.com/webstore/detail/kalendario-for-google-calendar/ccoehijdbponhcemihobmdpaeenmgchg&quot;&gt;Chrome&lt;/a&gt; or &lt;a href=&quot;https://addons.mozilla.org/en-GB/firefox/addon/kalendario-for-google-calendar/&quot;&gt;Firefox&lt;/a&gt; right away.&lt;/p&gt;

&lt;p&gt;What&apos;s your journaling approach? Let me know what you think when you give it a try!&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Moved to Gatsby</title><link>https://romanvesely.com/gatsby-move</link><guid isPermaLink="true">https://romanvesely.com/gatsby-move</guid><description>Up until now, this site ran on PHP, but as time passed I felt like it needed a change. I&apos;ve been interested in the JAMstack since I&apos;ve heard about the term some two years ago. I also work with React i...</description><pubDate>Mon, 23 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Up until now, this site ran on PHP, but as time passed I felt like it needed a change. I&apos;ve been interested in the JAMstack since I&apos;ve heard about the term some two years ago. I also work with React in my job so it was obvious I would reach for &lt;a href=&quot;https://www.gatsbyjs.org&quot;&gt;Gatsby&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Previously I used &lt;a href=&quot;https://www.statie.org&quot;&gt;Statie&lt;/a&gt;, PHP static site generator, and was pretty much satisfied with it as it met my needs. I&apos;ve written my very first &lt;a href=&quot;https://romanvesely.com/statie-generate-and-refresh&quot;&gt;blog&lt;/a&gt; &lt;a href=&quot;https://romanvesely.com/statie-with-css-preprocessor&quot;&gt;posts&lt;/a&gt; about it, and also made it&apos;s own &lt;a href=&quot;https://romanvesely.com/a-place-to-meet-statie&quot;&gt;homepage&lt;/a&gt; to help &lt;a href=&quot;https://www.tomasvotruba.com&quot;&gt;Tomas&lt;/a&gt;, author of the tool, to spread the word. But over the time my toolset has changed, and one of my dearest features, &lt;a href=&quot;https://latte.nette.org/&quot;&gt;Latte templating system&lt;/a&gt;, &lt;a href=&quot;https://github.com/Symplify/Symplify/pull/1641&quot;&gt;has been removed&lt;/a&gt; from the tool - which made me a bit sad. Although I truly understand this move and appreciate Tomas&apos; effort in creating and maintaining the project, it was time to move on.&lt;/p&gt;
&lt;p&gt;It&apos;s not my first Gatsby project, though. I used it for &lt;a href=&quot;https://www.paralelnapoliskosice.sk&quot;&gt;Paralelná Polis Košice&lt;/a&gt;, which used the first version of the tool in the beginning and was refactored to the second version when it became available. So, I felt pretty much confident starting a new project as I thought I gained some good experiences.&lt;/p&gt;
&lt;p&gt;I&apos;ve identified three main things that slowed me down during the refactoring more than I expected:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Statie aimed for simple sites and blogs - global &lt;code&gt;$posts&lt;/code&gt; array was available throughout the files&lt;/li&gt;
&lt;li&gt;Gatsby and its ecosystem have a very vital development - there are numerous ways of how to do things, so you have to constantly think about how to approach even the basic stuff&lt;/li&gt;
&lt;li&gt;I needed to switch from template-based system to React components&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, the whole process took twice as much time as I expected, while I still miss some features I previously had. That makes me think if my decision of switching the tools does worth it. If I will use effortless React components in blog posts in the future, maybe it will. One can say that Gatsby generates fast websites, and it&apos;s true, but pure HTML sites Statie generates are as fast. Actually, with Statie I had &lt;strong&gt;100&lt;/strong&gt; points in performance Lighthouse test, while &lt;strong&gt;97&lt;/strong&gt; points with Gatsby :).&lt;/p&gt;
&lt;p&gt;List of missing features and things to fix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;s&gt;the active menu item &quot;notes&quot; when reading a blog post&lt;/s&gt; - there is no longer such item in the main navigation &lt;a href=&quot;https://github.com/crazko/romanvesely.com/commit/df7cc150be0af94c1a7bf1763ea6e55dd618c217&quot;&gt;&lt;code&gt;df7cc15&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;image max-width and usage of Gatsby advanced image - done in &lt;a href=&quot;https://github.com/crazko/romanvesely.com/commit/08c736d53eab8b9f3f2bb9412db758b6a238254d&quot;&gt;&lt;code&gt;08c736d&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;HTML in the lead paragraph&lt;/s&gt; - style removed in &lt;a href=&quot;https://github.com/crazko/romanvesely.com/commit/36c0748972b10adef1fdefbd5c859aff20d4ba38&quot;&gt;&lt;code&gt;36c0748&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;images for social sites - I used &lt;a href=&quot;https://packagist.org/packages/crazko/post-social-image&quot;&gt;my PHP package&lt;/a&gt;, and still can, but not as a part of the project&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;abbr&amp;gt;&lt;/code&gt; element in pages/posts - done in &lt;a href=&quot;https://github.com/crazko/romanvesely.com/commit/757b5b0e6b2fc69249dc30f0ef5378871fd3f88e&quot;&gt;&lt;code&gt;757b5b0&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;s&gt;JSON feed&lt;/s&gt; - it doesn&apos;t matter as it was probably not used by anyone&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I will come back and update the list accordingly.&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Learning Log #2</title><link>https://romanvesely.com/log2</link><guid isPermaLink="true">https://romanvesely.com/log2</guid><description>A new day ahead of us, time to remind newly gathered knowledge. This is a part of my notes taken during dealing with my day-to-day tasks.
&amp;lt;Log id=&quot;0006&quot; /&amp;gt;
&amp;lt;Log id=&quot;0007&quot; /&amp;gt;
&amp;lt;Log id=&quot;00...</description><pubDate>Wed, 13 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A new day ahead of us, time to remind newly gathered knowledge. This is a part of my notes taken during dealing with my day-to-day tasks.&lt;/p&gt;






&lt;p&gt;See you next time.&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Knowledge Sharing</title><link>https://romanvesely.com/knowledge</link><guid isPermaLink="true">https://romanvesely.com/knowledge</guid><description>Do you have something you want to share? Meetups and conferences are great places where anyone can learn new things. They are also a great opportunity for anybody to teach something they think may be ...</description><pubDate>Mon, 11 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Do you have something you want to share? Meetups and conferences are great places where anyone can learn new things. They are also a great opportunity for anybody to teach something they think may be valuable for others. But public speaking is not for everybody. Well, at least not for their first time to stand in front of the audience as a speaker. What &lt;em&gt;else&lt;/em&gt; can we do? Are there any other options? What about to be in an environment you are already familiar with?&lt;/p&gt;
&lt;p&gt;Being in front of unknown people and speak about some topic could be daunting. And what&apos;s more, if you are kind of an introvert person you may feel it&apos;s a terrible idea at all! But if you really want to start somehow I propose to make it happen together with your colleagues. Either in the company you work for or within the community of a co-working space you visit in case you freelance.&lt;/p&gt;
&lt;p&gt;In my previous team, we had a quite nice habit of such a way of knowledge sharing - we called it &lt;strong&gt;Mini Geeky Tuesday&lt;/strong&gt;. &quot;Mini&quot; because the whole thing meant to be short to fit into a regular day filled with coding and meetings, &quot;Geeky&quot; because that&apos;s what we think we are - wise and funny, and &quot;Tuesday&quot;, because ... only sometimes it fell on a different day in the week.&lt;/p&gt;
&lt;p&gt;What was it all about? To share something valuable within the team. Something everyone could pick out of interest, like an introduction to a new tool or technology, but also speak about an interesting problem one was confronted with and its solution.&lt;/p&gt;
&lt;p&gt;Most of our talks took up to about 10 to 15 minutes and didn&apos;t require to have any slides prepared. Only a blackboard if that was necessary. It was voluntarily based, so it happened that once we had 4 talk streak in a month and one talk in a quarter thereafter. Either case is good!&lt;/p&gt;
&lt;p&gt;And what to talk about, you ask? Well, you choose! Topics may vary greatly. Or not :)&lt;/p&gt;
&lt;h2&gt;Topics I&apos;ve spoken about&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTTP methods&lt;/strong&gt;, responses, statuses and how do they play with &lt;strong&gt;RESTful APIs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;peculiar errors with &lt;strong&gt;PHP &amp;amp; JavaScript magic methods&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;what is &lt;strong&gt;Game of Life&lt;/strong&gt; (not The Sims :), also with a puzzle to solve&lt;/li&gt;
&lt;li&gt;how to measure &lt;strong&gt;code quality&lt;/strong&gt;, how to spot code smells, what is code coverage, cyclomatic complexity and what the hell is C.R.A.P.&lt;/li&gt;
&lt;li&gt;relative vs. absolute &lt;strong&gt;CSS units&lt;/strong&gt; - &lt;code&gt;px&lt;/code&gt;, &lt;code&gt;rem&lt;/code&gt;, &lt;code&gt;em&lt;/code&gt;, &lt;code&gt;ch&lt;/code&gt; - where and when, how do they work with the cascade&lt;/li&gt;
&lt;li&gt;what is &lt;strong&gt;CSS Houdini&lt;/strong&gt; and where it stands in the current web technologies&lt;/li&gt;
&lt;li&gt;static web generators and &lt;strong&gt;JAMstack&lt;/strong&gt; - in theory, and from practice&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Beyond short talks&lt;/h2&gt;
&lt;p&gt;There are also other options, though. You can prepare &lt;strong&gt;puzzles&lt;/strong&gt; or interesting &lt;strong&gt;math problems&lt;/strong&gt;. Share them in the morning and let time for your team to find a solution, which you can present in the afternoon. I find it relieving, especially in the long or hard days.&lt;/p&gt;
&lt;p&gt;To dive into the more advanced matter you can arrange a &lt;strong&gt;workshop&lt;/strong&gt;. We had a couple of them. Topics we dealt with, from the top of my mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;advanced Git techniques&lt;/li&gt;
&lt;li&gt;regular expressions step by step&lt;/li&gt;
&lt;li&gt;introduction to push notifications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can even have a &lt;strong&gt;competition&lt;/strong&gt; - &lt;a href=&quot;https://romanvesely.com/code-together-and-have-fun/&quot;&gt;code together and have fun&lt;/a&gt;!&lt;/p&gt;
&lt;h2&gt;Benefits&lt;/h2&gt;
&lt;p&gt;You see, there are many methods you can use to share your knowledge without the fear of the unknown. You and people around you can learn a lot together, double up new ideas or discover new possibilities.&lt;/p&gt;
&lt;p&gt;For sure, you can think of many different forms to those aforementioned, but the result remains the same. To &lt;strong&gt;push forward&lt;/strong&gt;, you, others, us. And in the end, it can lead you to whole &lt;strong&gt;new experiences&lt;/strong&gt; if you &lt;a href=&quot;https://romanvesely.com/a-path-to-my-first-speaking-experience/&quot;&gt;step out of your comfort zone&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Learning Log #1</title><link>https://romanvesely.com/log1</link><guid isPermaLink="true">https://romanvesely.com/log1</guid><description>Learning in public has gained pretty big popularity across my twitter circles. Surely, the concept isn&apos;t new, but now it has a name. As being a curious person myself, I&apos;ve started collecting my findin...</description><pubDate>Mon, 07 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.swyx.io/writing/learn-in-public/&quot;&gt;Learning in public&lt;/a&gt; has gained pretty big popularity across my twitter circles. Surely, the concept isn&apos;t new, but now it has a name. As being a curious person myself, I&apos;ve started collecting my findings from dealing with day-to-day tasks a while ago. Now it&apos;s time to publish the coherent form of the notes in the first post of the learning log series and so become the part of the wave.&lt;/p&gt;





&lt;p&gt;See you next time.&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Batch install extensions for Visual Studio Code</title><link>https://romanvesely.com/vscode-extensions</link><guid isPermaLink="true">https://romanvesely.com/vscode-extensions</guid><description>So, you move to another machine (permanently or temporarily) and need your favorite editor to behave the same. How to easily take the installed extensions with you?
When you try to google vscode synch...</description><pubDate>Thu, 29 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So, you move to another machine (permanently or temporarily) and need your favorite &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;editor&lt;/a&gt; to behave the same. How to easily take the installed extensions with you?&lt;/p&gt;
&lt;p&gt;When you try to google &lt;strong&gt;vscode synchronization&lt;/strong&gt; you are presented with an extension called &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync&quot;&gt;Settings Sync&lt;/a&gt; that can pretty much cover this problem and do even more. In my laziness, I found the set up a bit complex as I only wanted to get all extensions from my old device and install them to the new one. Once and for all. Preferably without any GitHub token fiddling around.&lt;/p&gt;
&lt;p&gt;OK, let&apos;s make it quick; we can do that just with a few commands. Open your terminal and execute:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;code --list-extensions &amp;gt; extensions.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will put the list of your VSCode extensions in the &lt;code&gt;extensions.md&lt;/code&gt; file, one name per line.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Side note: I use markdown for almost all text-only files currently, but clearly, it can be anything.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now you need to move this file to your new machine. Use Dropbox, Drive, email, USB stick, whatever suits you most. Finally, execute:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;xargs -n1 code --install-extension &amp;lt; extensions.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;xargs&lt;/code&gt; will execute &lt;code&gt;code --install-extension&lt;/code&gt; for provided input. More precisely, argument &lt;code&gt;-n1&lt;/code&gt; means that a command is executed one-by-one for every line of the input file. First item may produce &lt;code&gt;code --install-extension esbenp.prettier-vscode&lt;/code&gt; to install &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode&quot;&gt;Prettier - Code formatter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And that&apos;s it! You have successfully installed all your extensions with &lt;strong&gt;only two commands&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For more info check all VSCode &lt;a href=&quot;https://code.visualstudio.com/docs/editor/extension-gallery#_command-line-extension-management&quot;&gt;commands for managing extensions&lt;/a&gt;. For evidence, here is the list of my extensions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Kasik96.latte&quot;&gt;Nette Latte + Neon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=AlanWalk.markdown-toc&quot;&gt;Markdown TOC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=bierner.markdown-checkbox&quot;&gt;Markdown Checkboxes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss&quot;&gt;Tailwind CSS IntelliSense&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=bungcip.better-toml&quot;&gt;Better TOML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer&quot;&gt;Bracket Pair Colorizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens&quot;&gt;GitLens — Git supercharged&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig&quot;&gt;EditorConfig for VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Equinusocio.vsc-material-theme&quot;&gt;Material Theme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode&quot;&gt;Prettier - Code formatter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-intellisense&quot;&gt;PHP IntelliSense&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner&quot;&gt;Code Runner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=humao.rest-client&quot;&gt;REST Client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=jinsihou.diff-tool&quot;&gt;Diff Tool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=jpoissonnier.vscode-styled-components&quot;&gt;vscode-styled-components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=kumar-harsh.graphql-for-vscode&quot;&gt;GraphQL for VSCode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph&quot;&gt;Git Graph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=mikestead.dotenv&quot;&gt;DotENV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=mrmlnc.vscode-apache&quot;&gt;Apache Conf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker&quot;&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vsliveshare.vsliveshare&quot;&gt;Live Share&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome&quot;&gt;Debugger for Chrome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Prisma.vscode-graphql&quot;&gt;GraphQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&quot;&gt;Live Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ronnidc.nunjucks&quot;&gt;Nunjucks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=silvenon.mdx&quot;&gt;MDX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Tyriar.sort-lines&quot;&gt;Sort lines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons&quot;&gt;vscode-icons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=WallabyJs.quokka-vscode&quot;&gt;Quokka.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight&quot;&gt;TODO Highlight&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Collection of remarkable tweets</title><link>https://romanvesely.com/remarkable-tweets</link><guid isPermaLink="true">https://romanvesely.com/remarkable-tweets</guid><description>For the past month I&apos;ve published several articles on dev.to containing some of my favorite tweets I&apos;ve collected (liked) so far. I think you would like them too!
I tend to use Twitter likes to bookma...</description><pubDate>Thu, 15 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For the past month I&apos;ve published several articles on &lt;a href=&quot;https://dev.to&quot;&gt;dev.to&lt;/a&gt; containing some of my favorite tweets I&apos;ve collected (liked) so far. I think you would like them too!&lt;/p&gt;
&lt;p&gt;I tend to use Twitter likes to bookmark interesting content, just not for everything I consider likable. From time-to-time, I also go through the list and un-like what I don&apos;t find interesting anymore. This approach keeps my list of liked tweets short, consisting only from the content I&apos;d enjoy in the future.&lt;/p&gt;
&lt;p&gt;That&apos;s what happened with tweets I found as wise as funny - in the end, I got dozens of them. So why not to share? The series includes 4 posts, issued every Friday in the past month.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1 post equals 10 tweets&lt;/strong&gt;. Here they are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/rmnvsl/why-so-serious-1-276j&quot;&gt;part #1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/rmnvsl/why-so-serious-collection-of-remarkable-tweets-2-10hj&quot;&gt;part #2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/rmnvsl/why-so-serious-collection-of-remarkable-tweets-3-mgo&quot;&gt;part #3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/rmnvsl/why-so-serious-collection-of-remarkable-tweets-4-28g0&quot;&gt;part #4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pause for a while, go through them and a have a good time!&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Do not waste your time on Facebook</title><link>https://romanvesely.com/facebook</link><guid isPermaLink="true">https://romanvesely.com/facebook</guid><description>People spend a lot of time on Facebook. Statistics differ from source to source - they say that one user spends (or squanders?) on average about 30 minutes up to 2 hours on this social network per day...</description><pubDate>Fri, 28 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;People spend a lot of time on Facebook. Statistics differ from source to source - they say that one user spends (or squanders?) on average about 30 minutes up to 2 hours on this social network per day. We can put these numbers into a simple equation to find out that it represents 7 to 30 days in a year, yuck! What can we do about that?&lt;/p&gt;
&lt;p&gt;Of course, a resolute way is always at hand, which is simple account deletion. However, it&apos;s not for everyone. Many found their way back after some time, primarily after they came to the conclusion they miss something and especially when a deletion is never definitive from a technical perspective. For me, the most important is communication with my friends, and on Facebook are simply &lt;em&gt;all&lt;/em&gt; of them. Well, to exchange messages, Messenger is good enough. But events and a wide variety of groups are similarly essential channels for communication. Simply put, everybody has their own preference.&lt;/p&gt;

&lt;p&gt;You can also read &lt;a href=&quot;https://www.paralelnapoliskosice.sk/blog/2019-03-27-facebook-nestracaj-svoj-cas&quot;&gt;the original post in the Slovak language&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nevertheless, it needs to be said that space for our friends&apos; and liked pages&apos; statuses - &lt;strong&gt;News Feed - is the one and only glutton that takes the most of our attention&lt;/strong&gt;. Everything they share, like or what behind-the-scene algorithms evaluate as interesting for you. And they know it really well, small statistics in the intro stands as proof. Every feed is different, created to be consumed by its user all the time. The reason for that is simple - advertisement and revenues flow.&lt;/p&gt;
&lt;p&gt;Is the account deletion the best option for you? Congratulation. &lt;a href=&quot;https://www.facebook.com/help/delete_account/&quot;&gt;You can do so in the settings&lt;/a&gt; and the rest of this article has now become irrelevant for you. Just take a look at the site that speaks about &lt;a href=&quot;https://justdeleteme.xyz/&quot;&gt;accounts deletion&lt;/a&gt; even further.&lt;/p&gt;
&lt;p&gt;Below you can find more options, that allow you to keep your account active. Fast and less complicated options which you can also jump over if you want to check the &lt;a href=&quot;#permanent-method&quot;&gt;permanent method&lt;/a&gt; of how to gain power over your time back to your hands.&lt;/p&gt;
&lt;h2&gt;Fast methods&lt;/h2&gt;
&lt;p&gt;The fastest and, at the same time, the easiest way of spending as less time on Facebook as possible is probably the making use of browser add-ons that can hide the feed entirely with all its content. Whether the content originates from people, pages, or groups.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No content means no reason to lay over.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Add-ons like &lt;a href=&quot;https://chrome.google.com/webstore/detail/kill-news-feed/hjobfcedfgohjkaieocljfcppjbkglfd&quot;&gt;Kill News Feed&lt;/a&gt; and &lt;a href=&quot;https://chrome.google.com/webstore/detail/news-feed-eradicator-for/fjcldmjmjhkklehbacihaiopjklihlgg&quot;&gt;News Feed Eradicator&lt;/a&gt; (both for Chrome), or &lt;a href=&quot;https://addons.mozilla.org/en-US/android/addon/disable-facebook-news-feed/&quot;&gt;Disable Facebook News Feed&lt;/a&gt; and &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/news-feed-eradicator/&quot;&gt;News Feed Eradicator&lt;/a&gt; (Firefox) do exactly what their names indicate. However, you cannot add these add-ons to your mobile device, therefore that handy little thing is still a trap for your time.&lt;/p&gt;
&lt;p&gt;An advanced alternative which offers more options is an installation of programs (and apps in phones), that have a broader focus than just Facebook. Programs like &lt;a href=&quot;https://freedom.to/&quot;&gt;Freedom&lt;/a&gt; or &lt;a href=&quot;https://www.rescuetime.com/focustime&quot;&gt;Focustime&lt;/a&gt; are capable of blocking access to selected websites entirely. With their help, you can set the time when the site is not accessible at all. It is a bit more radical approach in opposite to add-ons because you lost access to everything - you can&apos;t even get to the messages.&lt;/p&gt;
&lt;p&gt;There is also another drawback, hidden in the usage of these programs. &lt;em&gt;You&lt;/em&gt; have to choose the times important for you. Times in which the interruption is not tolerable. But can you really say where to put the boundaries? When the time-span you set is too narrow the outcome will be small. Too broad time-span and you will feel limited and tempted to turn off selected settings. Trial and error.&lt;/p&gt;
&lt;h2&gt;Permanent method&lt;/h2&gt;
&lt;p&gt;What will be the result of our effort? Clean, empty feed:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/facebook/fb-feed.png&quot; alt=&quot;Empty Facebook feed&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There is nothing trying for your attention. The resulting effect is the same as &lt;a href=&quot;#fast-methods&quot;&gt;with add-ons&lt;/a&gt;, but with one additional value - the mobile website will look equally the same. &lt;strong&gt;Yes, I suggest not to use the Facebook application and access the site solely from your mobile browser.&lt;/strong&gt; Doing so you take the full advantage of the permanent method. But the message exchange is a bit cumbersome on the mobile web version, therefore I recommend to use Messenger Lite, which, as the name suggests, contains only basic functionality.&lt;/p&gt;
&lt;p&gt;If you log in to your account from a different browser or from a completely different computer, it will still look the same (good).&lt;/p&gt;
&lt;h3&gt;How to do that?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Unfollow all your friends, liked pages and groups&lt;/strong&gt; you are a member. I know, I know, it sounds too extreme and based on the number of your connection the unfollow process will take its time. But you have to do it only once (and with every new friend or liked page/group). When it&apos;s done their posts will no longer take place in your feed.&lt;/p&gt;
&lt;p&gt;If you don&apos;t want to lose all the information, here are some alternatives:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;turn notifications on for people, pages or groups you care about - you will be always notified about their activity&lt;/li&gt;
&lt;li&gt;follow your 10 most significant friends - your feed will have just a bare minimum information&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/facebook/fb-unfollow.png&quot; alt=&quot;Unfollow process&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It will take time to set it all up, but your reward will be the flexibility and the working solution on every platform.&lt;/p&gt;
&lt;p&gt;That&apos;s it!&lt;/p&gt;
&lt;h2&gt;What to do next?&lt;/h2&gt;
&lt;p&gt;For even better effect you can subscribe to pages&apos; newsletters instead of following them. Of course, if they offer any. Their quality is growing and they aren&apos;t being sent too often (once a week let&apos;s say), so they contain only relevant information.&lt;/p&gt;
&lt;p&gt;You can turn off notifications in the mobile apps, but frankly, the time horizon can be set only up to 24 hours. In the system settings, it&apos;s possible to turn off notifications for specific applications permanently. Another helpful feature is Do Not Disturb mode, especially in the time you need maximum concentration.&lt;/p&gt;
&lt;p&gt;Other great minimalism tips could be found at https://verekia.com/zeromalist/ which was my source of inspiration (not only for this article).&lt;/p&gt;
&lt;p&gt;Finally, my last piece of advice for you - less time spent on Facebook shouldn&apos;t mean more time spent on, let&apos;s say, &lt;a href=&quot;https://twitter.com/rmnvsl&quot;&gt;Twitter&lt;/a&gt; :).&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Useful search engine shortcuts for browsers</title><link>https://romanvesely.com/browser-search</link><guid isPermaLink="true">https://romanvesely.com/browser-search</guid><description>Most of the modern web browsers today contain functionality to set multiple search engines that can reduce your day-to-day time spent on finding the best results. Some time ago I tweeted about adding ...</description><pubDate>Mon, 06 May 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most of the modern web browsers today contain functionality to set multiple search engines that can reduce your day-to-day time spent on finding the best results. Some time ago I &lt;a href=&quot;https://twitter.com/rmnvsl/status/1027533760387002368&quot;&gt;tweeted&lt;/a&gt; about adding GitHub to the browser&apos;s search engines list. My list has grown in size since then and I think you may find it useful.&lt;/p&gt;
&lt;p&gt;My default browser is &lt;a href=&quot;https://vivaldi.com/&quot;&gt;Vivaldi&lt;/a&gt;, but you can find the same setting in all of the following: Firefox, Chrome, Opera or Brave. I currently don&apos;t have access to IE/Edge and haven&apos;t found it in Safari; sometimes it&apos;s really old-fashioned in comparison with others...&lt;/p&gt;
&lt;p&gt;This is how the usage of a custom search engine looks like in the wild:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/browser-search/search-engine-browser.gif&quot; alt=&quot;Search with custom search engine&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Where to look for? Use the following addresses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a&gt;vivaldi://settings/search/&lt;/a&gt; in Vivaldi, under Search Engines&lt;/li&gt;
&lt;li&gt;&lt;a&gt;about:preferences#search&lt;/a&gt; in Firefox, under One-Click Search Engines&lt;/li&gt;
&lt;li&gt;&lt;a&gt;chrome://settings/searchEngines&lt;/a&gt; in Chrome, Opera and Brave, as all of them will redirect you to correct address&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You have to add engine name, keyword or nickname which is the shortcut you use in the address bar and search URL containing &lt;code&gt;%s&lt;/code&gt; which is a placeholder for the phrase you are looking for. So in the case of Stack Overflow, the settings are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;name: Stack Overflow&lt;/li&gt;
&lt;li&gt;nickname/keyword: &lt;code&gt;so&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;https://stackoverflow.com/search?q=%s&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s a bit different in Firefox where you add custom engines as add-ons, so you have to search them up in their &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/search/?sort=rating&amp;amp;type=search&quot;&gt;add-ons portal&lt;/a&gt;. You can set a custom keyword afterward.&lt;/p&gt;
&lt;h2&gt;My current settings&lt;/h2&gt;
&lt;div style=&quot;overflow-x:auto&quot; markdown=&quot;1&quot;&gt;
&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;keyword&lt;/th&gt;
&lt;th&gt;url&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DuckDuckGo&lt;/td&gt;
&lt;td&gt;&lt;code&gt;d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://duckduckgo.com/?q=%s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wikipedia&lt;/td&gt;
&lt;td&gt;&lt;code&gt;w&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://en.wikipedia.org/wiki/Special:Search?search=%s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;&lt;code&gt;g&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://www.google.com/search?q=%s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://github.com/search?q=%s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can I use...&lt;/td&gt;
&lt;td&gt;&lt;code&gt;c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://caniuse.com/#search=%s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://www.npmjs.com/search?q=%s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stack Overflow&lt;/td&gt;
&lt;td&gt;&lt;code&gt;so&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://stackoverflow.com/search?q=%s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YouTube&lt;/td&gt;
&lt;td&gt;&lt;code&gt;yt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://www.youtube.com/results?search_query=%s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MDN&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mdn&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://developer.mozilla.org/en-US/search?q=%s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;&lt;code&gt;php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://www.php.net/manual-lookup.php?pattern=%s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/browser-search/vivaldi-search-engine-settings.png&quot; alt=&quot;List of search engines&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Pitfall&lt;/h2&gt;
&lt;p&gt;Let&apos;s say I want to know more about npm console options.&lt;/p&gt;
&lt;p&gt;In a hurry, I type &lt;code&gt;npm cli options&lt;/code&gt; in the address bar and get &lt;a href=&quot;https://www.npmjs.com/search?q=cli%20options&quot;&gt;&quot;0 packages found&quot;&lt;/a&gt; as a result. Huh? That&apos;s because I set &lt;code&gt;npm&lt;/code&gt; keyword to search in the npm package database. To overcome this behavior I need to use &lt;code&gt;g npm cli options&lt;/code&gt; to tell the browser to use Google as a search engine.&lt;/p&gt;
&lt;p&gt;That&apos;s definitely not the end of the world, but it can be confusing sometimes. It may be solved by choosing different keywords, it&apos;s up to your preferences!&lt;/p&gt;

&lt;p&gt;Do you have any other interesting use cases?&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Code together and have fun</title><link>https://romanvesely.com/code-together-and-have-fun</link><guid isPermaLink="true">https://romanvesely.com/code-together-and-have-fun</guid><description>Some time ago I came upon the term Code in the Dark, an event for true frontend lovers. Probably it was a part of some conference, where visitors became participants and competed together in creating ...</description><pubDate>Thu, 28 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Some time ago I came upon the term Code in the Dark, an event for true frontend lovers. Probably it was a part of some conference, where visitors became participants and competed together in creating HTML and CSS completely without seeing the results. I thought it could be fun to be part of such a competition. Not very recently this idea popped up into my mind again and I decided to organize a similar event with my colleagues.&lt;/p&gt;
&lt;p&gt;Here is the &lt;cite&gt;&lt;/cite&gt;&lt;a href=&quot;http://codeinthedark.com/&quot;&gt;original concept&lt;/a&gt; of the contest:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Code in the Dark is a front-end (HTML, CSS) competition, originating from Tictail, where each contestant competes to implement a website design given only a screenshot. The catch is that no previews of the results are allowed during the implementation, and no measuring tools can be used. The winner is decided by the audience.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A competitor is also restricted only to use the &lt;a href=&quot;http://codeinthedark.com/editor/&quot;&gt;web-based editor&lt;/a&gt; and has 15 minutes time cap to complete the task.&lt;/p&gt;
&lt;h2&gt;Grab some 🍺 and have fun&lt;/h2&gt;
&lt;p&gt;So, the idea was to hold an event locally in our office after the working hours. I wanted it to be not so restrictive about the used editor - all of us like to work with something else - and let everyone leverage the strengths of their choice. Yes, I&apos;m talking about &lt;a href=&quot;https://emmet.io/&quot;&gt;Emmet&lt;/a&gt; and snippets support. I knew that PhpStorm, Sublime Text, and vscode are used among us, but in the end, all of us decided for vscode.&lt;/p&gt;
&lt;p&gt;Another difference, in comparison with the original idea, was that the audience (everybody not coding at that moment) could have see the preview of those currently competing. This was very important for me. I&apos;d say it was the main purpose of the event: grab some beer, watch and have fun while others are dying trying and not knowing what they are doing. And here and there it was really a comedy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/code-together-and-have-fun/blindness-coding.jpg&quot; alt=&quot;BlindNess coding #0&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Setup and technical aspects&lt;/h2&gt;
&lt;p&gt;We had two people coding in one round. The rest were watching the preview at projector screen in a real-time. I as a moderator was choosing a design to code, taking care of time and smooth course.&lt;/p&gt;
&lt;p&gt;In front of every competitor was a screen with a current task, that was not connected to their computer and could be changed on demand by me/moderator. That way they could care only about the code. The projector screen was split into halves to show the results of both contestants side-by-side.&lt;/p&gt;
&lt;p&gt;All of this was easily possible thanks to the Browsersync&apos;s feature called &lt;a href=&quot;https://www.browsersync.io/docs/options#option-tunnel&quot;&gt;tunneling&lt;/a&gt;, provided by &lt;a href=&quot;localtunnel.me&quot;&gt;localtunnel.me&lt;/a&gt;. Every coder created a tunnel and shared a URL with me, so I could put it on the screen for the audience. I created a tunnel to show the design for the competitors.&lt;/p&gt;
&lt;p&gt;Browsersync watch for changes and refresh the tunneled URL, &lt;strong&gt;real-time updates for all&lt;/strong&gt;! Note that changes have to be saved for Browsersync to catch them so enabling auto-saving option is recommended.&lt;/p&gt;

&lt;p&gt;I put together a &lt;a href=&quot;https://github.com/crazko/blindness-coding&quot;&gt;simple repository with all the settings&lt;/a&gt;. Feel free to use it (and let me know, what do you think).&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;As I already said - it was much more fun than I expected. I really recommend you to try it and spend some informal time with your colleagues (or friends), it could be a part of your team-building activities.&lt;/p&gt;
&lt;p&gt;No one would say 15 minutes can pass so quickly. You &lt;em&gt;shouldn&apos;t&lt;/em&gt; expect any fundamental results after that time, but it is just enough to not let the audience get bored. So be prepared that at the end of the time cap the results might be ... unsatisfying for a proud coder 😀.&lt;/p&gt;
&lt;p&gt;Here are &lt;a href=&quot;https://drive.google.com/open?id=1bt872tB7ICe_4dz9oZ2omP0_gfAw0C7g&quot;&gt;some designs I chose for us&lt;/a&gt;, but for the next round, I&apos;m thinking about less sophisticated ones. To design only a logo, or only some part of the site, like navigation, let&apos;s say.&lt;/p&gt;
&lt;p&gt;Let me know if you have had a similar experience!&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Post social image</title><link>https://romanvesely.com/post-social-images</link><guid isPermaLink="true">https://romanvesely.com/post-social-images</guid><description>Creates images suitable for social sharing.
PHP library and a simple command line tool to generate images suitable for sharing on social media sites. I made it to generate meta images for my blog post...</description><pubDate>Mon, 11 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Creates images suitable for social sharing.&lt;/p&gt;
&lt;p&gt;PHP library and a simple command line tool to generate images suitable for sharing on social media sites. I made it to generate meta images for my blog posts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;url: https://packagist.org/packages/crazko/post-social-image&lt;/li&gt;
&lt;li&gt;repository: https://github.com/crazko/post-social-image&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/post-social-image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Blindness coding</title><link>https://romanvesely.com/blindness-coding</link><guid isPermaLink="true">https://romanvesely.com/blindness-coding</guid><description>Simple yet fully-working solution for your own contest.
Whether you are interested in a strength or in a muscle gaining, powerlifting may be a good bet for you. Fomin is one of the prescribed programs...</description><pubDate>Tue, 05 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Simple yet fully-working solution for your own contest.&lt;/p&gt;
&lt;p&gt;Whether you are interested in a strength or in a muscle gaining, powerlifting may be a good bet for you. Fomin is one of the prescribed programs out there. This small app helps you to calculate your weights needed to complete this routine.&lt;/p&gt;
&lt;p&gt;Read about &lt;a href=&quot;https://romanvesely.com/code-together-and-have-fun&quot;&gt;how we did our contest&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;repository: https://github.com/crazko/blindness-coding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/blindness-coding.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Easy frontend development</title><link>https://romanvesely.com/easy-frontend-development</link><guid isPermaLink="true">https://romanvesely.com/easy-frontend-development</guid><description>Create, store, present and distribute HTML templates painlessly with the current offer of the tools that are ready to help you. And completely for free!
Background
At the beginning of my developer&apos;s c...</description><pubDate>Wed, 02 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Create, store, present and distribute HTML templates painlessly with the current offer of the tools that are ready to help you. And completely for free!&lt;/p&gt;
&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;At the beginning of my developer&apos;s career and throughout the years, I was tinkering mainly with the frontend, specifically, I was converting website designs created in Photoshop to templates using HTML and CSS, with a little help of JavaScript (jQuery to the rescue!). Those templates were later implemented together with some CMS by client&apos;s backend programmer. Although technologies, processes, and use cases from that time have changed, sometimes radically, we always get back to the roots - plain &lt;code&gt;*.html&lt;/code&gt; files.&lt;/p&gt;
&lt;p&gt;Back then, &lt;em&gt;a lot&lt;/em&gt; of work was repetitive (or maybe I just didn&apos;t know the better way of doing things): copy-pasting common parts of the design to every template, like a header or a footer. Imagine a dozen different subpages - templates for the main page, article, product, cart, etc., and a moment you realize you forgot to add a site&apos;s logo to some part of the footer. You&apos;d had to open every template and add it to the place. Of course, PHP later helped me to generate resulting templates, but I found it a bit cumbersome.&lt;/p&gt;
&lt;p&gt;Now, when I was done I had to share my work, let it be checked if everything&apos;s OK. It meant to create a ZIP with all the files, send it via email and wait for the response. An error found? Designer realized he wants to change something, even a small piece? The whole process began again.&lt;/p&gt;
&lt;p&gt;With free hostings available, in the FTP era, it was a bit easier, but with continual changes in design still very error-prone and laborious.&lt;/p&gt;
&lt;h2&gt;What I was looking for/look for now?&lt;/h2&gt;
&lt;p&gt;Not that much:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;share common parts&lt;/strong&gt; of the templates - no more copy-pasting same thing to several places&lt;/li&gt;
&lt;li&gt;have some &lt;strong&gt;updated preview&lt;/strong&gt; for a designer or a client - so they can react immediately upon changes (or when they have time for that)&lt;/li&gt;
&lt;li&gt;a simple &lt;strong&gt;possibility of updates&lt;/strong&gt; - to get rid of another copy-pasting over FTP&lt;/li&gt;
&lt;li&gt;a better way of &lt;strong&gt;distribution of the final solution&lt;/strong&gt; - ZIP files, really?&lt;/li&gt;
&lt;li&gt;faster &lt;strong&gt;feedback handling&lt;/strong&gt; - email or chat communication can get messy really fast, and one can overlook important things easily&lt;/li&gt;
&lt;li&gt;have some &lt;strong&gt;space for documentation&lt;/strong&gt; - not only for final backend implementer but also for my future self&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Today&apos;s possibilities&lt;/h2&gt;
&lt;p&gt;Like I described at the beginning of the article, everything&apos;s always changing, but after several tries and failures my current tech-stack consists of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mozilla.github.io/nunjucks/&quot;&gt;Nunjucks&lt;/a&gt; - JavaScript templating language&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gulpjs.com/&quot;&gt;Gulp&lt;/a&gt; - handles repetitive tasks&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.browsersync.io/&quot;&gt;Browsersync&lt;/a&gt; - offers live reloading, really beneficial through the development phase&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bitbucket.org/&quot;&gt;Bitbucket&lt;/a&gt; - provides (private) storage for your files&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt; - hosts your preview&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Nunjucks&lt;/h3&gt;
&lt;p&gt;Nunjucks as a templating language provides everything I was looking for, it comes with support for variables, template inheritance, which is great for defining global layouts, macros, which means custom functions, filters, that modify output and much more. It allows you to split parts of the templates to multiple files to preserve DRY principle.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;{% extends &quot;base.html&quot; %}

{% block header %}
&amp;lt;h1&amp;gt;{{ title }}&amp;lt;/h1&amp;gt;
{% endblock %}

{% block content %}
&amp;lt;ul&amp;gt;
  {% for name, item in items %}
  &amp;lt;li&amp;gt;{{ name }}: {{ item }}&amp;lt;/li&amp;gt;
  {% endfor %}
&amp;lt;/ul&amp;gt;
{% endblock %}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here comes the question - why not just use any of these &lt;a href=&quot;https://www.staticgen.com/&quot;&gt;static site generators&lt;/a&gt;? Or maybe React, which is component based by default? I think it would be unnecessary overkill to create dummy templates with those. I have to keep in mind I don&apos;t know who is going to use my work, either its output or the source code, so I try to make things as simple as possible for the end user, let it be anyone. Recently I also came upon the &lt;a href=&quot;https://ejs.co/&quot;&gt;Embedded JavaScript templating&lt;/a&gt; that seems like a good alternative.&lt;/p&gt;
&lt;h3&gt;Gulp &amp;amp; Browsersync&lt;/h3&gt;
&lt;p&gt;Widely known task automation manager gulp still has its place in today&apos;s web development even though we have powerful Webpack now. Tasks configured via plain JavaScript functions are understandable for a broad audience. Browsersync speeds up your development process with automatic synchronizing of your changes that are reflected in the browser, or multiple browsers, or even mobile devices, at the same moment. It saves a lot of time.&lt;/p&gt;
&lt;p&gt;Here is an &lt;a href=&quot;https://gist.github.com/crazko/d59053a5f3c236a20d27eacbb8a5e920&quot;&gt;example&lt;/a&gt; how a &lt;code&gt;gulpfile.js&lt;/code&gt; could look like. It&apos;s a bit simplified because no project has the same settings.&lt;/p&gt;
&lt;h3&gt;Bitbucket&lt;/h3&gt;
&lt;p&gt;Bitbucket is Git code management, it stores your code, which you can share with the others when you add them as contributors. It offers unlimited private repositories, which is simply great. With a repository for every project you can keep simple documentation in &lt;code&gt;README.md&lt;/code&gt; file or use embedded wiki pages for more sophisticated help.&lt;/p&gt;
&lt;p&gt;But what is actually valuable is the issue tracker. You can lead a discussion for every bug or a new feature separately in specific tickets and mark them as done when you are done. You are no more lost in countless email chains. This is very powerful.&lt;/p&gt;
&lt;h3&gt;Netlify&lt;/h3&gt;
&lt;p&gt;Finally, Netlify is a static hosting. You cannot run PHP or other languages on the backend, which is fine since all we want is to present dummy HTML pages. It connects to your Bitbucket&apos;s repository and can run the specific task(s) on every change (every commit).&lt;/p&gt;
&lt;p&gt;Do you remember gulp?&lt;/p&gt;
&lt;p&gt;When you connect everything together, Netlify can run gulp task that builds your templates written in Nunjucks (or any other templating language) and host them for free on a custom subdomain, such as https://metropole-33b4eb.netlify.com/. And it will do that on every change in your source files that you push to the repository.&lt;/p&gt;
&lt;p&gt;Now you just have to share a domain name with your client and at any time he or she will see the most updated version of your work. Automation is strong.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Every project is different, so I didn&apos;t specify any CSS preprocessors or JavaScript libraries that may be used in the process. Possibilities are probably countless. My current setting consisting of aforementioned Nunjucks+Gulp+Browsersync+Bitbucket+Netlify works for me now but might change in the future.&lt;/p&gt;
&lt;p&gt;Just keep in mind, not everyone is used to work with things like issue tracker or gulp tasks/npm scripts. But it really pays off to teach your clients or coworkers to use them properly. For both sides.&lt;/p&gt;

&lt;p&gt;Find it useful? Great! But I can imagine you have a different approach. What does it look like?&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Heslá a ich ochrana</title><link>https://romanvesely.com/hesla2</link><guid isPermaLink="true">https://romanvesely.com/hesla2</guid><description>What are the current recommendations on how to handle passwords securely from the user perspective? Presentation is in Slovak language.
Presentation slides. Read also about Paralelná Polis.

...</description><pubDate>Wed, 19 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;What are the current recommendations on how to handle passwords securely from the user perspective? Presentation is in Slovak language.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/18a_c3XuInO9LK6_IGx1Vnst8qu5KF6pw2S3oPNKryZ4&quot;&gt;Presentation slides&lt;/a&gt;. Read also about &lt;a href=&quot;https://www.paralelnapoliskosice.sk/&quot;&gt;Paralelná Polis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/ppke-talk.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>WebExpo 2018</title><link>https://romanvesely.com/webexpo-2018</link><guid isPermaLink="true">https://romanvesely.com/webexpo-2018</guid><description>I wasn&apos;t considering to attend any other conference this year besides Hackers Congress in Paralelni Polis, but, sadly, I haven&apos;t noticed the launch of the tickets sales until all of them were gone. Bu...</description><pubDate>Tue, 25 Sep 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I wasn&apos;t considering to attend any other conference this year besides &lt;a href=&quot;https://neworder.hcpp.cz&quot;&gt;Hackers Congress&lt;/a&gt; in &lt;a href=&quot;https://www.paralelnipolis.cz/o-nas/en/&quot;&gt;Paralelni Polis&lt;/a&gt;, but, sadly, I haven&apos;t noticed the launch of the tickets sales until all of them were gone. But I got a free ride to &lt;a href=&quot;https://www.webexpo.net/prague2018&quot;&gt;WebExpo&lt;/a&gt; thanks to my colleague Erik from &lt;a href=&quot;https://www.nesskdc.sk/&quot;&gt;Ness KDC&lt;/a&gt; who was not able to attend. Same venue, different topic, same excitement.&lt;/p&gt;
&lt;p&gt;It was the first time I attended such a big event inherently connected with what I like to do (in or outside of my job), so I&apos;m very pleased I got an opportunity to be there, although, I can expect more such events to come in the future. The place of the event - &lt;a href=&quot;http://www.lucerna.cz/&quot;&gt;Lucerna&lt;/a&gt; - is really nice (and big!), organizers did a great job to prepare everything for the good of the visitors, I didn&apos;t miss anything.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/webexpo-2018/webexpo04.jpg&quot; alt=&quot;WebExpo&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.webexpo.net/videos/&quot;&gt;Keynotes&apos; recordings&lt;/a&gt; are already available, so I added them below, to the individual presentation reviews. They were released only one day after the end of the conference, superfast! Some people didn&apos;t have a chance to go to the afterparty, I guess...&lt;/p&gt;
&lt;h2&gt;Talks&lt;/h2&gt;
&lt;p&gt;I tried not to attend many technical oriented presentations, mostly because I know I would not withstand the temptation to try new things for a very long time. Instead, my intention was to gather thoughts and to just think about theoretical topics, which would lead me to some kind of &quot;big picture&quot;, I think I did my selection well.&lt;/p&gt;
&lt;h3&gt;Day 1&lt;/h3&gt;
&lt;h4&gt;&lt;a href=&quot;https://www.webexpo.net/prague2018/talk?id=impactful-storytelling-for-innovators-and-disruptors&quot;&gt;Impactful Storytelling for Innovators and Disruptors&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/susanlindnerem&quot;&gt;Susan&apos;s&lt;/a&gt; career started in Thailand, where she was helping to reduce AIDS spreading. &quot;If you don&apos;t use a condom you die.&quot; Usage of the fear in persuasion can work for some time but doesn&apos;t last forever. Your customer needs to be a hero, you have to sell stories in which your listener feels like one. Stories can be explicit when a company creates them. Or, implicit, when its customers use a product to deliver their story, which becomes the story of the brand (e.g. &lt;a href=&quot;https://gopro.com/&quot;&gt;GoPro&lt;/a&gt; cameras). The best way is to create a bridge between the history, what was it like, and the present, a product currently being produced.&lt;/p&gt;
&lt;h4&gt;Adaptive Upskilling as the Future of Workforce&lt;/h4&gt;
&lt;p&gt;Everyday learning is a must, something not only developers know very well. Exponential technologies are here and we have to be ready for them. Most of the kids studying currently in primary schools will work in industries not yet existing. Knowledge gathered in a school is not enough (probably never was), it is becoming obsolete in an increasing speed. Many tasks could be automatized, companies are using freelancers instead of full-time employees. Thanks to the huge competition in the market they tend to learn more. &lt;a href=&quot;https://willrobotstakemyjob.com/&quot;&gt;Will robots take our jobs&lt;/a&gt;? New technologies are already used in production, yet most of the recruiters can&apos;t catch a train, do not understand current demand needs. &lt;a href=&quot;https://twitter.com/juhasm&quot;&gt;Michal&lt;/a&gt; is on the mission to upskill 1 million people.&lt;/p&gt;
&lt;h4&gt;Changing the world with the web&lt;/h4&gt;
&lt;p&gt;Finding new connections between data scattered in different locations through &lt;a href=&quot;https://theodi.org/&quot;&gt;open data&lt;/a&gt;. &lt;a href=&quot;https://twitter.com/sallylait&quot;&gt;Sally&lt;/a&gt; wants more people to be active in the UK. She showed booking portals where many different areas (places to visit, food tourism, insurance...) of people&apos;s needs are interconnected and used them as an example of what can be done in making their lifestyle better - bringing communities of different sports, places to train, etc. into one place. And that it can be done without deep knowledge with the leverage of existing (and free) tools like Google Sheets or &lt;a href=&quot;https://glitch.com/&quot;&gt;Glitch&lt;/a&gt;. DX - developer experience and supporting people with different level of knowledge is a way how to get more people to the project.&lt;/p&gt;
&lt;h4&gt;Animations beyond CSS&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://state-animations.surge.sh/&quot;&gt;Nice demo&lt;/a&gt; on how we can create animations in CSS &amp;amp; JS given by &lt;a href=&quot;https://twitter.com/posva&quot;&gt;Eduardo&lt;/a&gt;. By using declarative way of defining them we can get easily more things done. Of course, more abstraction needs to be created. There are two types of animations - easings and springs. In the CSS only former can be used, for the later we need some assistance of the JS world, but can get more smooth results.&lt;/p&gt;
&lt;h4&gt;How can tech teams help or destroy a startup?&lt;/h4&gt;
&lt;p&gt;A startup cannot be built only with freelancers. Job jumping is too frequent due to high demand for developers and other creatives. It can harm their seriousness.&lt;/p&gt;
&lt;h4&gt;VR/AR are not flashy toys anymore&lt;/h4&gt;
&lt;p&gt;Great talk of what can happen when people creating AR product are not in place; that it is hard to build application only by photos taken by one person. No one should expect that target audience behave a way a product needs. Recommendation? Get real actors to the place of the act, don&apos;t rely much on things to be delivered by a customer. And give yourself enough time to prepare everything beforehand.&lt;/p&gt;
&lt;h4&gt;Design Systems at Scale&lt;/h4&gt;
&lt;p&gt;From a small team including only one designer to the moment, when designers cannot see everything that was created with their work. That means they can consult neither correct way of the implementation together with developers nor edge cases that can happen throughout the realization.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What&apos;s not written didn&apos;t happen&lt;/li&gt;
&lt;li&gt;Turning makers to educators&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Document everything.&lt;/p&gt;
&lt;p&gt;https://twitter.com/rmnvsl/status/1043134838683910144&lt;/p&gt;
&lt;h4&gt;React.js portals and modern JS apps for CMS&lt;/h4&gt;
&lt;p&gt;I was expecting something more Portals-oriented, but the almost whole talk was about other things. &lt;a href=&quot;https://twitter.com/konnnyy&quot;&gt;Tomas&lt;/a&gt; created &lt;a href=&quot;https://react-union.org/&quot;&gt;React Union&lt;/a&gt; and I hoped for the deeper explanation of how portals were used in this project.&lt;/p&gt;
&lt;h4&gt;Interview with Jakub Nešetřil&lt;/h4&gt;
&lt;p&gt;Just a small note aside from the interview - immediately after the discussion started people went to sli.do to &lt;a href=&quot;https://romanvesely.com/images/webexpo-2018/webexpo05.jpg&quot;&gt;ask their question&lt;/a&gt;. They were very creative, which, I suppose, was caused by the late hour of the day filled with great presentations. One of them, not a question that&apos;d fulfill a description of &quot;request for information&quot; got the attention of the many:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/webexpo-2018/webexpo01.jpg&quot; alt=&quot;WebExpo&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ain&apos;t nothing has happened...&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;https://www.webexpo.net/prague2018/talk?id=config-less-server-less-effort-less&quot;&gt;Config-less. Server-less. Effort-less.&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The main idea of &lt;a href=&quot;https://twitter.com/rauchg&quot;&gt;Guillermo&apos;s&lt;/a&gt; presentation was &lt;strong&gt;do less to achieve more&lt;/strong&gt;. In a nutshell, it&apos;s how his work can be described. He led us through the history of the development of his projects - &lt;a href=&quot;https://github.com/socketio/socket.io&quot;&gt;socket.io&lt;/a&gt;, &lt;a href=&quot;https://github.com/socketio/socket.io&quot;&gt;nextjs&lt;/a&gt;, &lt;a href=&quot;https://zeit.co/&quot;&gt;zeit&lt;/a&gt; and explained why they are so popular. A team should be able to deploy every minute, not every quarter. Stressless, many *-less words were used. And yeah, duplication is cheaper than the wrong abstraction.&lt;/p&gt;
&lt;h3&gt;Day 2&lt;/h3&gt;
&lt;h4&gt;People &amp;amp; Algorithms&lt;/h4&gt;
&lt;p&gt;Machine learning is still tough and creates biased results based on human customs and assumptions (man-doctor, woman-nurse). Data is not objective or fair. FB algorithm picked for a year review a photo of a child who died recently (hint: don&apos;t post sensitive information publicly). Don&apos;t assume anything without context.&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;https://www.webexpo.net/prague2018/talk?id=how-to-design-the-future&quot;&gt;How to design the future&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;People tend to overestimate near future while underestimating distant future. No one can&apos;t trust what they see because of personalized bubbles they created.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/webexpo-2018/webexpo03.jpg&quot; alt=&quot;WebExpo&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;How to Build an Evil-Free Social Network&lt;/h4&gt;
&lt;p&gt;One of the best talks with a really nice and interactive slides. World of professional athletes needs a community to thrive. How to achieve that with a &lt;a href=&quot;https://play.google.com/store/apps/details?id=cz.NuArt.moyobo&quot;&gt;social network&lt;/a&gt; when professional athletes don&apos;t have time for that? Less on-screen, online time, less anxiety through the smaller amount of posts updates.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/webexpo-2018/webexpo02.jpg&quot; alt=&quot;WebExpo&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Power of Programming&lt;/h4&gt;
&lt;p&gt;This was a very inspirational presentation given by &lt;a href=&quot;https://twitter.com/jakubnesetril&quot;&gt;Jakub&lt;/a&gt;, though I had a feeling I have had already &lt;a href=&quot;https://slideslive.com/38908392/mate-na-vic-nez-si-myslite&quot;&gt;seen it&lt;/a&gt;, indeed. How to help as a programmer? &lt;a href=&quot;https://www.effectivealtruism.org/&quot;&gt;Effective Altruism&lt;/a&gt;. Efficient use of resources isn&apos;t volunteering (or giving money to the charity), but developing - that&apos;s what we can do best and affect hundreds, thousands or even more people. Research and software bought with public money (via taxes) should be public. If you want to help, but don&apos;t know where to start, look here for projects in &lt;a href=&quot;https://github.com/slovensko-digital&quot;&gt;Slovakia&lt;/a&gt; and &lt;a href=&quot;https://github.com/hlidacstatu&quot;&gt;Czechia&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;The right stuff - orchestrating experiments at scale&lt;/h4&gt;
&lt;p&gt;What the developer understands is what will the product become. Please, don&apos;t give them Excel sheets filled with meaningless tasks. People responsible for delivering the product should be part of decision making before the kick-off.&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;https://www.webexpo.net/prague2018/talk?id=constant-curiosity-how-brands-earn-trust-by-asking-firecracker-questions&quot;&gt;Constant Curiosity: How Brands Earn Trust By Asking Firecracker Questions&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;It was more a TED-like talk. &lt;a href=&quot;https://twitter.com/jonburkhart&quot;&gt;Jon&apos;s&lt;/a&gt; performance was a bit too much for me after the two long days. Still, I applaud him for that, also for that he was able to amend his presentation with many photos, notes and hints from previous talks or even from the afterparty (lots of beer). Ask provocative and original questions, play with them and surprise with the results. Bring emotions to the process.&lt;/p&gt;
&lt;h2&gt;A small note on taking notes&lt;/h2&gt;
&lt;p&gt;Personally, I&apos;ve tried many different ways of taking them, currently settled with Google Keep on my phone. I somehow like how easy is to swipe with a finger on the keyboard displayed on the screen and get results I expect thanks to the good recognition and prediction algorithms. Still, I&apos;m curious what others tend to use. So I was looking around from time-to-time to see what other attendees do in a hope I can learn something from them.&lt;/p&gt;
&lt;p&gt;Mostly nothing, just listening, ... or coding (Why the heck anyone codes while attending a conference? Especially, when having an opportunity to choose from several presentations at the same time. It&apos;s just hidden from me). Those who did take notes used various software: Google Docs, Microsoft Word or OneNote, Notes for Mac or Evernote. Those from the offline world used pens and notepads and one of them stood out with the more creative approach:&lt;/p&gt;
&lt;p&gt;https://twitter.com/rmnvsl/status/1043489704883236867&lt;/p&gt;
&lt;p&gt;Just amazing!&lt;/p&gt;
&lt;h2&gt;Overall view&lt;/h2&gt;
&lt;p&gt;What I really liked is that all things started as scheduled. No wasted time. This is probably common on such big events, but it happens here and there and I can get really furious when persons in charge don&apos;t value the time of those who are responsible and can set their watch. Thankfully, this was not a thing at WebExpo.&lt;/p&gt;
&lt;p&gt;One thing took my interest - live, place-oriented, notifications. It&apos;s called &lt;a href=&quot;https://developers.google.com/nearby/&quot;&gt;Nearby&lt;/a&gt; (for Android) and it allows to receive or even exchange data between devices regardless of the network connection. In this case, I received information about an ongoing talk and also other news from the event, like one ensuring attendees a key-speaker is on his way to the venue.&lt;/p&gt;
&lt;p&gt;This is so great, I&apos;d like to tinker with this technology myself.&lt;/p&gt;
&lt;p&gt;Overall, it was a great experience!&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>A path to my first speaking experience</title><link>https://romanvesely.com/a-path-to-my-first-speaking-experience</link><guid isPermaLink="true">https://romanvesely.com/a-path-to-my-first-speaking-experience</guid><description>In 2016 I attended &amp;lt;a href=&quot;http://www.phplive.cz/&quot;&amp;gt;PHPLive conference&amp;lt;/a&amp;gt;, first bigger tech conference in my field at that time (as far as I know). A couple of months ago I got an opport...</description><pubDate>Sun, 12 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In 2016 I attended &lt;a href=&quot;http://www.phplive.cz/&quot;&gt;&lt;/a&gt;PHPLive conference, first bigger tech conference in my field at that time (as far as I know). A couple of months ago I got an opportunity to flip the sides to stand on the stage as a speaker. This is my little confession of what did it look like.&lt;/p&gt;
&lt;p&gt;At the end of January, I was contacted by Janka from &lt;a href=&quot;https://www.shopsys.com/&quot;&gt;Shopsys&lt;/a&gt; company, the conference organizer, that they are looking for new faces. My email was shared by &lt;a href=&quot;https://www.tomasvotruba.cz/&quot;&gt;Tomas&lt;/a&gt; who is a known speaker not only at this event and who I was in a touch for quite a time.&lt;/p&gt;
&lt;p&gt;&quot;To become a speaker?&quot; I thought to myself. You know, many developers daydream about sharing knowledge this way at least from time to time and I&apos;m not an exception. But when the opportunity is real you start to think about the pros and cons of your choice, let it be acceptance of the offer or its rejection. And the rejection was something I was heavily thinking about, because, &quot;Who am I to be there, whom others should be listening to?&quot;, right? Moreover, as the name of the event suggests, PHP is the main topic, but I&apos;d been working with React on the frontend side for more time than it&apos;s healthy to be able to prepare a presentation at a level I&apos;d be happy with.&lt;/p&gt;
&lt;p&gt;After some hesitation, I made the first step, step outside of the well-known comfort zone, and accepted the offer. Next step was to find a topic. It turned out I had something to start with. I got some inspiration from my (short) &lt;a href=&quot;https://romanvesely.com/strange-codes-multiple-identities-team-habits/#meeting-habits&quot;&gt;notes on meeting habits&lt;/a&gt; - company and team culture is part of my favorite subjects - and came with the working title &lt;strong&gt;How to make a work-life better&lt;/strong&gt;, so nothing connected with PHP nor technical in any other way. And to my surprise, it was gladly received.&lt;/p&gt;
&lt;p&gt;Phew, that was easy! Yeah, but the harder part to come. I had just around three weeks to prepare myself for my first performance in front of hundreds of people.&lt;/p&gt;

&lt;p&gt;Side note: PHPLive is specific in a way that it is held in two cities for two days. In Ostrava, Czech Republic, first day and in Zilina, Slovak Republic, the day after.&lt;/p&gt;

&lt;h2&gt;Preparation&lt;/h2&gt;
&lt;p&gt;How to make a work-life better? I knew meetings is only one thing among many others I wanted to talk about. To be more happy at a job you have to be satisfied with your results. Good meeting habits may be helpful on your way of delivering the outcomes you seek for, but they are only one piece of the puzzle. To do a work that brings satisfying results you need some knowledge, enough of uninterrupted free time, the more the better. And of course, we all do need to take a rest. One cannot work from dawn to sunset every day on and on.&lt;/p&gt;
&lt;p&gt;I&apos;d divide the process of the talk preparation into three stages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;gathering knowledge about the topic&lt;/li&gt;
&lt;li&gt;organizing content into the presentation&lt;/li&gt;
&lt;li&gt;training the talk&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Though, I didn&apos;t jump to the next stage when I&apos;d thought I&apos;m done with the previous one, clearly, because I&apos;d never known that. The process looked more like a &lt;a href=&quot;https://en.wikipedia.org/wiki/Triquetra&quot;&gt;triquetra&lt;/a&gt; and I never felt as satisfied.&lt;/p&gt;
&lt;h3&gt;Knowledge gathering&lt;/h3&gt;
&lt;p&gt;I started to collect material from books I had read to that time and was so glad I had not been afraid to use the marker and to bend page corners to label interesting ideas for later use. Books are precious to me but they are still just a source of knowledge, just a tool, like a saw for a carpenter. One shouldn&apos;t hesitate to work with them that way like they were some historical relics (only if they really aren&apos;t, of course).&lt;/p&gt;
&lt;p&gt;I also picked and reread several tweets and blog posts from &lt;a href=&quot;https://romanvesely.com/blogroll&quot;&gt;others in the field&lt;/a&gt;. Added my own thoughts (not even mentioning photos) and in the end, my notes bloated up to nearly 10 pages.&lt;/p&gt;
&lt;h3&gt;Creating prestentation&lt;/h3&gt;
&lt;p&gt;At the school, we were learned how to create a presentation. Anyone who had slides without the page numbers was given black points. Nevertheless, I didn&apos;t add any numbers now. Not because I like the simple design and much of free space (which I do), nor because I&apos;m a rebel (probably not, or?), but because it was clear enough for every event visitor that any talk will have up to 25 minutes. I just wanted them to focus on more important stuff (erm, me!).&lt;/p&gt;
&lt;p&gt;I had done one more thing before I opened Google Slides. I needed to give those notes correct structure so I created a &lt;a href=&quot;https://coggle.it/diagram/WoHihAWJuAABqwgD/t/ako-si-sprijemnit-pracovny-zivot/978659faac09ba4d56e5a919b6a0c1df106830ce1b7f12d3ba7c9b34e7259450&quot;&gt;mind map&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/a-path-to-my-first-speaking-experience/mind-map.png&quot; alt=&quot;Presentation mind map&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The map served me well in forming the slides as well as for a &quot;final notes&quot; for what I was actually going to say on d-day. Each slide couldn&apos;t be simpler with either a short title, a photo or a graph.&lt;/p&gt;
&lt;h3&gt;Training&lt;/h3&gt;
&lt;p&gt;I bet many of you know TED, either the main conference or many individual derivates called TEDx. Most of the talks there have several things in common with one specialty - which is that no one reads from the slides (and those are also uncommon), but rather has the whole talk memorized. I think this gives more energy and tempo to the presentation. I came around a perfect article on &lt;a href=&quot;https://waitbutwhy.com/2016/03/doing-a-ted-talk-the-full-story.html&quot;&gt;Doing a TED Talk&lt;/a&gt; written by Tim Urban from my favorite &lt;a href=&quot;https://waitbutwhy.com/&quot;&gt;waitbutwhy.com&lt;/a&gt;. I&apos;m going to borrow one of the perfect diagrams he makes to illustrate his posts, the one about public speaking methods:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/a-path-to-my-first-speaking-experience/method-graph.jpg&quot; alt=&quot;Public Speaking Methods. Source: Wait But Why&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Funny thing is that all three items in the key are bad. They can just be bad or very bad. It seems like public speaking is a very stressful thing to do. I decided to go with the second method (talk through the set of structure), inclining more to the right side, which means I prepared some key sentences and, let&apos;s say, jokes, sort of... I had also read a book called &lt;a href=&quot;https://www.goodreads.com/book/show/33804062-hovor-ako-ted&quot;&gt;Talk like TED&lt;/a&gt; and had watched several TED talks and commencement speeches. Not all of them were strictly connected with how to give a talk but really were inspirational in one way or another. Here are some I really enjoyed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=plWexCID-kA&quot;&gt;commencement speech by perfect fiction author Neil Gaiman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=RWZluriQUzE&quot;&gt;TED talk on body language by Amy Cuddy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I made several training rounds of my talk home alone. After every round, I did some changed in the slides, rearranged them, edited wording, removed one thing just to add another while tried to fit into aforementioned 25 minutes block for one talk. That prepared me to the next big step - first test in front of the people - my colleagues. They were so kind and agreed they would serve me as guinea pigs, what I&apos;m very thankful for. I prepared a &lt;a href=&quot;http://dobra-cajovna.sk/&quot;&gt;place&lt;/a&gt;, chairs, projector and when everyone was ready to listen, started my talk. And &lt;strong&gt;it was horrible&lt;/strong&gt;. Literally.&lt;/p&gt;
&lt;p&gt;It turned out everything I did up to that miserable test talk still wasn&apos;t enough. I realized I need to &lt;em&gt;give a talk&lt;/em&gt; to become somehow ready. Not just play solo and speak silently to no one. Actually giving a talk is the only way one can train speed, play with tempo, figure out where the pauses are appropriate and act upon what the audience do while talk is being given. Yeah, I ended that misery after 45 minutes covered in sweat. No need to note I still wasn&apos;t done with all I wanted to say - the end was in the last third of the presentation.&lt;/p&gt;
&lt;p&gt;Nevertheless, I persisted and processed all the comments my calm friendly colleagues gave me, discarded a good third of the content and did next round of the solo testing, now with accurate volume and gestures and finally felt ready.&lt;/p&gt;
&lt;h2&gt;Going live&lt;/h2&gt;
&lt;p&gt;I was sitting in the back, watching &lt;a href=&quot;https://www.tomaspilar.cz/&quot;&gt;Tomas Pilar&lt;/a&gt; giving his talk on Doctrine and thinking about how different our talks are. His strongly technical one with lots of code examples will nicely contradict with mine, without any mention of the code itself.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/a-path-to-my-first-speaking-experience/phplive-live01.jpg&quot; alt=&quot;PHP Live&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I also really appreciated I was the next speaker following him.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;&quot;Oh my, many people are here, aren&apos;t they?&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/a-path-to-my-first-speaking-experience/phplive-live02.jpg&quot; alt=&quot;PHP Live&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&quot;Don&apos;t they have better things to do on today&apos;s Tuesday?&quot;&lt;/p&gt;
&lt;p&gt;&quot;...&quot;&lt;/p&gt;
&lt;p&gt;&quot;What the hell is going on with my vision?&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/a-path-to-my-first-speaking-experience/phplive-live03.jpg&quot; alt=&quot;PHP Live&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&quot;OK enough, I need some water. Where is the ...&quot;&lt;/p&gt;
&lt;p&gt;&quot;Thanks, Tomas! Next talk is about habits at work, please welcome Roman!&quot;&lt;/p&gt;
&lt;p&gt;&quot;Oh, fuck ...&quot;&lt;/p&gt;
&lt;h2&gt;Looking back (Questions &amp;amp; Answers)&lt;/h2&gt;
&lt;h3&gt;Was it all that bad?&lt;/h3&gt;
&lt;p&gt;Not at all! It was a great experience and I met some interesting people. I also learned many new things while taking notes for my presentation.&lt;/p&gt;
&lt;h3&gt;What is your advice to not-speaker-yet people?&lt;/h3&gt;
&lt;p&gt;First of all - find an audience open to listening to your talk and train beforehand. Bear in mind you&apos;ll probably have a mike in one hand so great gesticulation will mostly not be possible (especially with slide remote controller in the other hand) - this is something I really didn&apos;t think about. Watch your time - at home, I set the timer to be increasing from 00:00, but at the conference, it was counting down from 25:00. That confused me to the point from which I was not able to pay attention to the remaining time anymore.&lt;/p&gt;
&lt;h3&gt;What have you discarded from the presentation?&lt;/h3&gt;
&lt;p&gt;There is a lot I had to remove. I wanted to add more or less from the following sources (the whole list is a bit longer, though):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://slides.com/nethemba/the-most-free-company&quot;&gt;The Most Free Company&lt;/a&gt; - on team working habits&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://waitbutwhy.com/2016/01/horizontal-history.html&quot;&gt;Horizontal History&lt;/a&gt; - regarding knowledge sharing&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://produkty.vladozlatos.com/zivotne-dolezite-otazky.html&quot;&gt;Important Life Questions&lt;/a&gt; (in Slovak) - when work is not everything&lt;/li&gt;
&lt;li&gt;I wanted to talk more on &lt;a href=&quot;https://hugelolcdn.com/i/454636.jpg&quot;&gt;puzzle solving&lt;/a&gt; at work&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Do you have &lt;a href=&quot;https://www.facebook.com/pehapelive/photos/a.180752525465917.1073741830.168767076664462/745649208976243/&quot;&gt;nostalgic feelings&lt;/a&gt; for Flash?&lt;/h3&gt;
&lt;p&gt;Well, I do! The experiences with Flash led me into the web development. I created a small &lt;a href=&quot;https://crazko.github.io/perfect-button/&quot;&gt;example of what wasn&apos;t possible without Flash&lt;/a&gt; (&lt;a href=&quot;https://github.com/crazko/perfect-button&quot;&gt;source&lt;/a&gt;), rounded corners took my attention when I saw them on the web for the first time. I just didn&apos;t use it at the conference in the end.&lt;/p&gt;
&lt;h3&gt;Can we watch your talk?&lt;/h3&gt;
&lt;p&gt;Of course, you can! &lt;a href=&quot;https://www.youtube.com/watch?v=EW2DwVhrZEw&quot;&gt;Roman Veselý – Jak si zpříjemnit pracovní život&lt;/a&gt; - hopefully, you understand Slovak. Let me know what you think.&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Ways To Make Work Life Better</title><link>https://romanvesely.com/better-work-life</link><guid isPermaLink="true">https://romanvesely.com/better-work-life</guid><description>At PHPlive conference I tried to show how one can make life in an office or outside of it more enjoyable. I shared my own experiences gathered during work in a corporate and within a distributed team....</description><pubDate>Tue, 27 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;At &lt;a href=&quot;http://www.phplive.cz/&quot;&gt;PHPlive&lt;/a&gt; conference I tried to show how one can make life in an office or outside of it more enjoyable. I shared my own experiences gathered during work in a corporate and within a distributed team.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1jXR04uWfTf8w5rnPxuFIPGo4QMBzkzpMs2Cbocs_ggs&quot;&gt;Presentation slides&lt;/a&gt;. Read also about &lt;a href=&quot;https://romanvesely.com/a-path-to-my-first-speaking-experience&quot;&gt;a path to my first speaking experience&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/phplive-2018-talk.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Heslá a ich ochrana v prepojenom svete</title><link>https://romanvesely.com/hesla1</link><guid isPermaLink="true">https://romanvesely.com/hesla1</guid><description>What are the current recommendations on how to handle passwords securely from the user perspective? Presentation is in Slovak language.
Presentation slides.

...</description><pubDate>Sat, 20 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;What are the current recommendations on how to handle passwords securely from the user perspective? Presentation is in Slovak language.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1JlYwX6RHpk1TwFXbOqljVp6dYLP1YTD7YzkBfnx0ytU&quot;&gt;Presentation slides&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/nlt2-talk.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>A place to meet Statie</title><link>https://romanvesely.com/a-place-to-meet-statie</link><guid isPermaLink="true">https://romanvesely.com/a-place-to-meet-statie</guid><description>I&apos;m happy to announce that Statie, a newcomer to the field of static site generators written in PHP, received a place where it could promote itself better. It&apos;s own website. Though a really simple one...</description><pubDate>Mon, 08 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;m happy to announce that Statie, a newcomer to the field of static site generators written in PHP, received a place where it could promote itself better. &lt;a href=&quot;https://www.statie.org/&quot;&gt;It&apos;s own website&lt;/a&gt;. Though a really simple one; but it&apos;s healthy to start with small things, they say.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notice:&lt;/strong&gt; &lt;a href=&quot;https://www.tomasvotruba.com/blog/2020/03/16/statie-is-dead-long-live-symfony-static-dumper/&quot;&gt;Statie was deprecated&lt;/a&gt;. This blog is now built with &lt;a href=&quot;https://www.gatsbyjs.org/&quot;&gt;Gatsby&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;My own blog is being built with &lt;a href=&quot;https://github.com/Symplify/Statie&quot;&gt;Statie&lt;/a&gt;. But why did I choose something with almost no history and with just a few users, when plenty of other possibilities are out there?&lt;/p&gt;
&lt;h2&gt;A bit of story&lt;/h2&gt;
&lt;p&gt;Well, if you come from Slovakia or Czechia you probably know &lt;a href=&quot;https://nette.org/&quot;&gt;Nette framework&lt;/a&gt; and its awesome &lt;a href=&quot;https://latte.nette.org/&quot;&gt;Latte templating engine&lt;/a&gt;. If you haven&apos;t heard about it before I recommend you to take a break and give it a shot to make yourself familiar. It may be useful in the future.&lt;/p&gt;
&lt;p&gt;To continue, I consider Latte the most elegant among others and that&apos;s the reason I chose Statie. Yep, it&apos;s that straightforward. Really, just look at it.&lt;/p&gt;
&lt;p&gt;I wanted to spread the word and add a mention to &lt;a href=&quot;https://www.staticgen.com/&quot;&gt;the catalog of static generators&lt;/a&gt; when I realized there is no homepage. By the way, it just blew my mind to see how many of the generators are in there only waiting to be used. Maybe another day...&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.statie.org/&quot;&gt;&lt;img src=&quot;https://romanvesely.com/images/a-place-to-meet-statie/statie-web.png&quot; alt=&quot;Statie website&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;A bit of stack&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.statie.org/&quot;&gt;The website&lt;/a&gt; runs on Statie, obviously. I just took markdown documentation files, written by the creator &lt;a href=&quot;https://www.tomasvotruba.cz/&quot;&gt;Tomas&lt;/a&gt;, which were lying on GitHub, covered them with a handful of templates, threw some configuration and &lt;em&gt;voilà&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I thought I could play a bit and use some things I haven&apos;t had a pleasure to try on other projects. Many articles about new (okay, let&apos;s say different) CSS principles called &lt;strong&gt;utility-first&lt;/strong&gt; wander around the internet. Especially &lt;a href=&quot;https://adamwathan.me/css-utility-classes-and-separation-of-concerns/&quot;&gt;one by Adam Wathan&lt;/a&gt;, a really thorough one, convinced me to try such a technique. Why not use &lt;a href=&quot;https://tailwindcss.com/&quot;&gt;the framework&lt;/a&gt; he created straight ahead? It was easy and resulting &lt;a href=&quot;https://github.com/crazko/statie-web/blob/master/source/assets/css/styles.css&quot;&gt;styles.css&lt;/a&gt; is so lean I want to applaud (not sure whether me or him).&lt;/p&gt;
&lt;p&gt;Even though Statie&apos;s learning material isn&apos;t very verbose (yet!) a feature one would certainly expect from a documentation site is the &lt;strong&gt;possibility to search&lt;/strong&gt;. I knew I want to use &lt;a href=&quot;https://community.algolia.com/docsearch/&quot;&gt;Algolia&lt;/a&gt;, widely used in the open-source scene. The setup was a piece of cake and it&apos;s working like a charm. Apropos, definitely try their &lt;a href=&quot;https://github.algolia.com/&quot;&gt;browser plugin&lt;/a&gt; adding new functionality to the GitHub search; have could I live without that.&lt;/p&gt;
&lt;p&gt;What&apos;s left? &lt;a href=&quot;https://github.com/crazko/statie-web&quot;&gt;Source code&lt;/a&gt; lives on GitHub, it is &lt;a href=&quot;https://travis-ci.org/crazko/statie-web/&quot;&gt;built with Travis&lt;/a&gt; and &lt;a href=&quot;https://www.statie.org/docs/github-pages/&quot;&gt;hosted on GitHub Pages&lt;/a&gt;, while SSL certificate comes from &lt;a href=&quot;https://www.cloudflare.com/&quot;&gt;Cloudflare&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;A bit of end&lt;/h2&gt;
&lt;p&gt;And that&apos;s it. I hope the site will grow together with Statie and that some of you will pitch in as well.&lt;/p&gt;

&lt;p&gt;Do you use Statie? Contribute now and &lt;a href=&quot;https://github.com/crazko/statie-web/edit/master/source/_data/projects.yml&quot;&gt;add your site&lt;/a&gt; to the list of projects!&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Statie Site</title><link>https://romanvesely.com/statie</link><guid isPermaLink="true">https://romanvesely.com/statie</guid><description>Documentation site for Statie, simple PHP static site generator.
In late 2017 I found an Adam Wathan&apos;s article on CSS utility classes. I had only heard about tachyons until that time and didn&apos;t like t...</description><pubDate>Tue, 02 Jan 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Documentation site for Statie, simple PHP static site generator.&lt;/p&gt;
&lt;p&gt;In late 2017 I found an Adam Wathan&apos;s article on &lt;a href=&quot;https://adamwathan.me/css-utility-classes-and-separation-of-concerns/&quot;&gt;CSS utility classes&lt;/a&gt;. I had only heard about tachyons until that time and didn&apos;t like the concept very much. But I dived in and changed my mind. I wanted to use his Tailwind CSS framework, but I was not working on anything suitable for it to try. Shortly I came with an idea for a new site for Statie, simple PHP static site generator, which I had been already using for my own site. It lacked its home, so I acquainted with the new CSS methodology while making one for it!&lt;/p&gt;
&lt;p&gt;Read more about the &lt;a href=&quot;https://romanvesely.com/a-place-to-meet-statie&quot;&gt;develelopment process&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;url: https://www.statie.org&lt;/li&gt;
&lt;li&gt;repository: https://github.com/crazko/statie-web&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/statie.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Simple Timer</title><link>https://romanvesely.com/timer</link><guid isPermaLink="true">https://romanvesely.com/timer</guid><description>Yet another timer written in React.
I was desperately looking for some timer that&apos;d be working from a computer as well as from a cell phone. My hunt for the one meeting my requirements wasn&apos;t successf...</description><pubDate>Mon, 11 Dec 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yet another timer written in React.&lt;/p&gt;
&lt;p&gt;I was desperately looking for some timer that&apos;d be working from a computer as well as from a cell phone. My hunt for the one meeting my requirements wasn&apos;t successful, so I had to create something myself.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;url: https://crazko.github.io/timer/&lt;/li&gt;
&lt;li&gt;repository: https://github.com/crazko/timer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/timer.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Strange codes, multiple identities and team habits</title><link>https://romanvesely.com/strange-codes-multiple-identities-team-habits</link><guid isPermaLink="true">https://romanvesely.com/strange-codes-multiple-identities-team-habits</guid><description>Just what I had in my mind or have tackled with in the recent past underlayed with the knowledge of the others.
T_PAAMAYIM_NEKUDOTAYIM
Even though the PHP language is improving and the next version is...</description><pubDate>Mon, 16 Oct 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Just what I had in my mind or have tackled with in the recent past underlayed with the knowledge of the others.&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;T_PAAMAYIM_NEKUDOTAYIM&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Even though the PHP language is improving and &lt;a href=&quot;https://wiki.php.net/todo/php72&quot;&gt;the next version&lt;/a&gt; is around a corner, there are some parts it carries from dark ages to the present and will most likely even beyond. Strange things you do not expect to see. Surely, one of them is following message:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;...unexpected T_PAAMAYIM_NEKUDOTAYIM&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&quot;What?&quot; a junior programmer might ask. But it happens that also advanced techies could be left speechless. Well, probably you can just check &lt;a href=&quot;https://stackoverflow.com/a/592326/5549874&quot;&gt;StackOverflow&lt;/a&gt;. Or, of course, could start &lt;a href=&quot;https://philsturgeon.uk/php/2013/09/09/t-paamayim-nekudotayim-v-sanity/&quot;&gt;learning Hebrew to know&lt;/a&gt; what&apos;s going on.&lt;/p&gt;
&lt;p&gt;Thankfully, there is &lt;a href=&quot;http://www.urbandictionary.com/define.php?term=TGI(A)F&quot;&gt;Urban Dictionary&lt;/a&gt; for all other unknown acronyms and phrases.&lt;/p&gt;
&lt;h2&gt;Git over schizophrenia&lt;/h2&gt;
&lt;p&gt;You know you shouldn&apos;t use your company&apos;s computer to work on your personal projects, do you? For those who don&apos;t consider it&apos;s a bad idea, aren&apos;t aware of possible consequences or those who just work on multiple projects and need to commit under different identities git introduced a &lt;a href=&quot;https://github.com/blog/2360-git-2-13-has-been-released#conditional-configuration&quot;&gt;new feature allowing conditional includes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now you can set different configuration for any project directory. This way you can &lt;a href=&quot;https://dev.to/maxlmator/maintaining-different-git-identities&quot;&gt;maintain several identities&lt;/a&gt; without pain and fear of being caught at pushing badly signed commits.&lt;/p&gt;
&lt;h2&gt;Meeting habits&lt;/h2&gt;
&lt;p&gt;I hate to attend most of the team meetings since my first fulltime job (current one is the second, but nevertheless). The roots of my aversion probably started sooner, but, clearly, once in a room full of people when even air condition can help no more and you are forced to open all doors to get a sip of fresh air it starts to be clear this isn&apos;t the best way to share information.&lt;/p&gt;
&lt;p&gt;Calculations of &lt;a href=&quot;https://m.signalvnoise.com/status-meetings-are-the-scourge-39f49267ca90&quot;&gt;wasted time and money during standup meetings&lt;/a&gt; only underline my feelings so I quickly became a fan of various ways of &lt;a href=&quot;https://m.signalvnoise.com/status-meetings-are-the-scourge-39f49267ca90&quot;&gt;asynchronous communication&lt;/a&gt; and started to advocate its benefits. On one hand, I was (jokingly) labeled as a non-team player because of my beliefs, while, on the other hand, an idea of not having any meeting during Fridays was accepted instantly. Who knows why?&lt;/p&gt;
&lt;p&gt;I will conclude with this perfect tweet I found (of course, not during any important meeting!):&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Anyone who ever schedules meetings with developers, please burn this image into your brain, thanks &lt;a href=&quot;https://t.co/IEoy10cgxW&quot;&gt;pic.twitter.com/IEoy10cgxW&lt;/a&gt;&lt;/p&gt;— Hatbox Phil 🍕 (@phil_wade) &lt;a href=&quot;https://twitter.com/phil_wade/status/896010517617180672?ref_src=twsrc%5Etfw&quot;&gt;August 11, 2017&lt;/a&gt;&lt;/blockquote&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Connect Bitbucket Cloud commit messages with different issue tracker</title><link>https://romanvesely.com/bitbucket-with-different-issue-tracker</link><guid isPermaLink="true">https://romanvesely.com/bitbucket-with-different-issue-tracker</guid><description>Bitbucket Cloud can link issues and commit messages not only in itself alone but also with outside world. Let&apos;s have a look how to create connections with a different tool for issue tracking.
Oftentim...</description><pubDate>Sun, 16 Jul 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Bitbucket Cloud &lt;a href=&quot;https://blog.bitbucket.org/2012/06/18/use-custom-regex-to-link-anywhere-on-bitbucket/&quot;&gt;can link&lt;/a&gt; issues and commit messages not only in itself alone but also with outside world. Let&apos;s have a look how to create connections with a different tool for issue tracking.&lt;/p&gt;
&lt;p&gt;Oftentimes I like to wander around a program&apos;s or an app&apos;s settings and try every possible feature to see what can be adjusted. In the &lt;a href=&quot;http://www.nesskdc.sk/&quot;&gt;company&lt;/a&gt; I work for, we use Bitbucket intensively for projects developed for &lt;a href=&quot;http://www.nesskdc.sk/en/community-support/ness-kdc-to-kosice/&quot;&gt;non-profit organizations in our region&lt;/a&gt; as well as a place we store our own company-life-supporting applications.&lt;/p&gt;
&lt;p&gt;Given that, Bitbucket Cloud was not an exception in my seeking for enhancements. After a while, I came around &lt;strong&gt;Link setting&lt;/strong&gt; and started digging deeper to see how can it be leveraged in our development process.&lt;/p&gt;
&lt;h2&gt;An issue tracker&lt;/h2&gt;
&lt;p&gt;First I need to say - we do not use Bitbucket Cloud to track issues. Developers frequently need to talk about new features or enhancements with our non-technical colleagues from PR or HR section for whom such a tool could be quite too much.&lt;/p&gt;
&lt;p&gt;Because of that, we settled with Trello, which is more user-friendly to keep the discussion about all projects&apos; topics among all involved participants. Simply, a card represents an issue for us - the developers.&lt;/p&gt;
&lt;h2&gt;Custom links&lt;/h2&gt;
&lt;p&gt;Bitbucket Cloud can link a commit message with an issue in the way a Github can do:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/bitbucket-with-different-issue-tracker/bitbucket-issues.png&quot; alt=&quot;Bitbucket issues&quot; title=&quot;Bitbucket issue tracker&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s great, however not usable in our workflow with Trello. Though, we can use &lt;a href=&quot;https://confluence.atlassian.com/bitbucket/link-to-a-web-service-283641959.html&quot;&gt;Link to a web service&lt;/a&gt; setting, probably not so widely known feature of Bitbucket Cloud, and get following results that point directly to Trello&apos;s card:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/bitbucket-with-different-issue-tracker/bitbucket-issues-custom-01.png&quot; alt=&quot;Bitbucket issues&quot; title=&quot;link is at the beginning of the message&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/bitbucket-with-different-issue-tracker/bitbucket-issues-custom-02.png&quot; alt=&quot;Bitbucket issues&quot; title=&quot;link can be also somewhere in the middle&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nice, how to achieve it?&lt;/p&gt;
&lt;p&gt;You need to go to the &lt;strong&gt;repository Settings&lt;/strong&gt; and find &lt;strong&gt;Links&lt;/strong&gt; under &lt;strong&gt;Workflow&lt;/strong&gt; section. You can see that there is already one present - Bitbucket Cloud issue tracker - which is exactly what it says it is.&lt;/p&gt;
&lt;p&gt;To add a new one just click on the &lt;strong&gt;Add new link&lt;/strong&gt; in the upper right corner and fill the dialog with the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Link type: Custom&lt;/li&gt;
&lt;li&gt;Link url: &lt;code&gt;https://trello.com/c/\1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Link key: &lt;code&gt;^(\w+)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The link key is a regex rule which selects the first word of a message and makes a group of it. Then it is exchanged with the &lt;code&gt;\1&lt;/code&gt; placeholder in the link url which will make a correct link in a message.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/bitbucket-with-different-issue-tracker/bitbucket-issues-dialog.png&quot; alt=&quot;Bitbucket issues&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.regular-expressions.info/brackets.html&quot;&gt;Learn more about regex&lt;/a&gt; and how to use parentheses for grouping. You can also &lt;a href=&quot;https://regex101.com/&quot;&gt;try your regex rules online&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want to have card ID somewhere in the message body, you can change Link key to &lt;code&gt;#(\w+)&lt;/code&gt;. Now every word prefixed with &lt;em&gt;# symbol&lt;/em&gt; will contain a link.&lt;/p&gt;
&lt;p&gt;Of course, you can use a different symbol. Just be sure you have one, so the ID could be recognizable amongst the other regular words in a message.&lt;/p&gt;
&lt;p&gt;You are also allowed to add more concurrent rules.&lt;/p&gt;
&lt;h2&gt;In conclusion&lt;/h2&gt;
&lt;p&gt;Everything&apos;s good but it&apos;s not elegant enough. I&apos;m a bit disappointed that Trello &lt;a href=&quot;https://trello.com/c/sSldoiVf/46-deprecated-mentioning-cards-by-number-e-g-46-creates-hyperlinks&quot;&gt;deprecated option&lt;/a&gt; that allowed mentioning (thus linking) cards by their number, which would be surely easier to remember and to write into commit message than to copy-paste entire UUID of a card.&lt;/p&gt;
&lt;p&gt;Eventually, we opted for another solution. Every pull request carries whole card&apos;s URL in the description, which makes it easy for us to get information about an issue, though, just not in every commit.&lt;/p&gt;
&lt;p&gt;Are you in a similar situation? Do you use a different approach? If so, I&apos;d like to hear what&apos;s your solution or how do you utilize the custom link option.&lt;/p&gt;
&lt;h2&gt;Update 2017-08-23&lt;/h2&gt;
&lt;p&gt;Recently I noticed interesting addon inside Bitbucket Cloud integrations - a power up for Trello that allows you join repositories to boards.&lt;/p&gt;
&lt;p&gt;Once you add one (or more) repo, you are able to create links from Trello&apos;s cards to commits, branches or pull requests. Even status of PR is visible; you can see directly who gave an approval, for example. We have adopted this feature very quickly. Read more about new possibilities &lt;a href=&quot;https://blog.trello.com/trello-power-ups-for-jira-bitbucket-confluence-hipchat&quot;&gt;in their blog&lt;/a&gt;.&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Null Object design pattern</title><link>https://romanvesely.com/null-object-design-pattern</link><guid isPermaLink="true">https://romanvesely.com/null-object-design-pattern</guid><description>An object with no value or defined behavior can be helpful when no other &quot;real&quot; object is present so it can mimic its usage. It may help you to avoid unnecessary conditionals and make your code more r...</description><pubDate>Sun, 04 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;An object with no value or defined behavior can be helpful when no other &quot;real&quot; object is present so it can mimic its usage. It may help you to avoid unnecessary conditionals and make your code more readable.&lt;/p&gt;
&lt;p&gt;Recently I saw a presentation called &lt;a href=&quot;https://www.youtube.com/watch?v=5DVDewOReoY&quot;&gt;Chasing &quot;Perfect&quot;&lt;/a&gt; given by &lt;a href=&quot;https://twitter.com/adamwathan&quot;&gt;Adam Wathan&lt;/a&gt; at Laracon EU in 2015. In case you don&apos;t know him I strongly recommend you to follow him on Twitter, at least. I definitely did so.&lt;/p&gt;
&lt;p&gt;Consider this article as my notes or thoughts on presented topic so I won&apos;t forget this whole thing in the future.&lt;/p&gt;
&lt;h2&gt;The idea&lt;/h2&gt;
&lt;p&gt;In the presentation, Adam illustrated how to structure application code when new requirements keep come around. In his example, a book ordering system can use coupons to give a discount for a customer.&lt;/p&gt;
&lt;p&gt;I will use exact same code to present the initial conditions (quite simplified, of course):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class Order
{
    private $books;

    private $coupon;

    public __construct($books)
    {
        $this-&amp;gt;books = $books;
    }

    public function applyCoupon($coupon)
    {
        $this-&amp;gt;coupon = $coupon;
    }

    public function total()
    {
        $discount = 0;

        if (isset($this-&amp;gt;coupon)) {
            $discount = $this-&amp;gt;coupon-&amp;gt;value;
        }

        return $this-&amp;gt;books-&amp;gt;sum(&apos;price&apos;) - $discount;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So the &lt;code&gt;Order::total()&lt;/code&gt; method calculates the total value of ordered books and in a case a coupon is applied, it subtracts total by the value of a coupon. Pretty straightforward.&lt;/p&gt;
&lt;p&gt;Now, let&apos;s imagine a new requirement from your boss: &lt;em&gt;&quot;we need to implement a new coupon that is percentage based&quot;&lt;/em&gt;. You say &lt;em&gt;&quot;no problem&quot;&lt;/em&gt; and enhance the code in &lt;code&gt;total()&lt;/code&gt; method (or maybe not, but it might be tempting to make such an easy change):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;public function total()
{
    $discount = 0;

    if (isset($this-&amp;gt;coupon)) {
        if ($this-&amp;gt;coupon-&amp;gt;isPercentage()) {
            $discount = $this-&amp;gt;books-&amp;gt;sum(&apos;price&apos;) * ($this-&amp;gt;coupon-&amp;gt;value / 100);
        } else {
            $discount = $this-&amp;gt;coupon-&amp;gt;value;
        }
    }

    return $this-&amp;gt;books-&amp;gt;sum(&apos;price&apos;) - $discount;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There is no null object yet, but we are getting to the point. We can see a lot of conditions which are not very popular (yes, because &lt;strong&gt;nested conditions are ugly&lt;/strong&gt;). The problem in this example can only grow when new requirements come, not even &lt;code&gt;switch&lt;/code&gt; statement can help us solve this problem nicely.&lt;/p&gt;
&lt;p&gt;The best we can do is to &lt;strong&gt;extract discount logic somewhere else&lt;/strong&gt; and in that way introduce Coupon classes - one class for every type of a coupon. And after several rounds of refactoring here is the result:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class ValueCoupon
{
    public function discount($order)
    {
        return $this-&amp;gt;value;
    }
}

class PercentageCoupon
{
    public function discount($order)
    {
        return $order-&amp;gt;grossTotal() * ($this-&amp;gt;value / 100);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Order::class&lt;/code&gt; has also changed a bit:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class Order
{
    // ...

    public function grossTotal($order)
    {
        return $this-&amp;gt;books-&amp;gt;sum(&apos;price&apos;);
    }

    public function total()
    {
        return $this-&amp;gt;grossTotal() - $this-&amp;gt;discount();
    }

    private function discount()
    {
        if (isset($this-&amp;gt;coupon)) {
            return $this-&amp;gt;coupon-&amp;gt;discount($this);
        }

        return 0;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So, what has changed exactly?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;new Coupon classes have only one &lt;code&gt;discount()&lt;/code&gt; method that consists of only one line of code&lt;/li&gt;
&lt;li&gt;added &lt;code&gt;Order::grossTotal()&lt;/code&gt; to get value of the books&lt;/li&gt;
&lt;li&gt;almost all methods in &lt;code&gt;Order::class&lt;/code&gt; are really simple, except &lt;code&gt;Order::discount()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maybe it would be better to implement also an interface &lt;code&gt;ICoupon&lt;/code&gt;, but this is another story.&lt;/p&gt;

&lt;h2&gt;The solution&lt;/h2&gt;
&lt;p&gt;I would be personally quite happy with this code and leave it as it is. But here comes the whole point - we can get rid of that one additional condition with the usage of the Null Object pattern.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;class NullCoupon
{
    public function discount($order)
    {
        return 0;
    }
}

class Order
{
    public function __construct()
    {
        $this-&amp;gt;books = $books;
        $this-&amp;gt;coupon = new NullCoupon();
    }

    // ...

    private function discount()
    {
        return $this-&amp;gt;coupon-&amp;gt;discount($this);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead of always checking if something is null or not present and react differently in such a situation you can deliberately implement a behavior that represents, well, nothing. And the Null Object exists to solve such specific situations. When &lt;code&gt;Order::applyCoupon()&lt;/code&gt; is used, it rewrites &lt;code&gt;NullCoupon&lt;/code&gt; with a new one and the usage remains same.&lt;/p&gt;
&lt;p&gt;Another useful application of a Null Object could be to create it as a stub in your tests.&lt;/p&gt;
&lt;h2&gt;It does not end here&lt;/h2&gt;
&lt;p&gt;Below the video, one of the commenters pointed out a question: &lt;em&gt;&quot;How can we instantiate a coupon based on the user input with the same approach?&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Adam responded with another &lt;a href=&quot;https://adamwathan.me/2015/09/03/pushing-polymorphism-to-the-database/&quot;&gt;screencast&lt;/a&gt; and came with &lt;strong&gt;Database Polymorphism&lt;/strong&gt; implemented with Laravel Eloquent. A remarkably elegant solution, I would say. For those of you, who work with Laravel, it might be truly educational.&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Implement a CSS preprocessor into Statie project</title><link>https://romanvesely.com/statie-with-css-preprocessor</link><guid isPermaLink="true">https://romanvesely.com/statie-with-css-preprocessor</guid><description>The most important part of a web page is its content. And I think that every web page content deserves to have some look. Take a look at how to implement Less preprocessor into Statie project built wi...</description><pubDate>Fri, 07 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The most important part of a web page is its content. And I think that every web page content deserves to have some look. Take a look at how to implement &lt;a href=&quot;http://lesscss.org/&quot;&gt;Less&lt;/a&gt; preprocessor into Statie project built with gulp-based workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notice:&lt;/strong&gt; &lt;a href=&quot;https://www.tomasvotruba.com/blog/2020/03/16/statie-is-dead-long-live-symfony-static-dumper/&quot;&gt;Statie was deprecated&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the &lt;a href=&quot;https://romanvesely.com/statie-generate-and-refresh&quot;&gt;previous post&lt;/a&gt; I showed a convenient way of browser live reloading at every change made in source files of Statie project. To make it even better we can add a gulp task for processing the CSS, so every change made in the styles will be immediately presented in the browser.&lt;/p&gt;
&lt;p&gt;I often use a preprocessor to not get a headache with working with CSS. There are several popular tools ready for use: &lt;a href=&quot;http://sass-lang.com/&quot;&gt;Sass&lt;/a&gt;, &lt;a href=&quot;http://lesscss.org/&quot;&gt;Less&lt;/a&gt; and &lt;a href=&quot;http://stylus-lang.com/&quot;&gt;Stylus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My chosen one is Less, but &lt;strong&gt;you can use whatever one is suitable for you&lt;/strong&gt;. The process of addition would be the same.&lt;/p&gt;
&lt;p&gt;Now, let&apos;s add it to our project and integrate it into the generating workflow.&lt;/p&gt;
&lt;h2&gt;Preparation&lt;/h2&gt;
&lt;p&gt;Add a package that can work with Less:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ npm install --save-dev gulp-less
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Prepare a function which will be used later in the default gulp task. Do not forget to require the package in the head of your &lt;code&gt;gulpfile.js&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;var less = require(&apos;gulp-less&apos;);

function styles() {
  return gulp.src(&apos;source/less/styles.less&apos;).pipe(less()).pipe(gulp.dest(&apos;output/css/&apos;)).pipe(browserSync.stream());
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do you see that &lt;code&gt;browserSync.stream()&lt;/code&gt; in the last pipe? [It tells Browsersync][3] to reload at the time when compiling is finished.&lt;/p&gt;
&lt;h2&gt;Put pieces together&lt;/h2&gt;
&lt;p&gt;Now we need to add this function to the default gulp task, and also edit the &lt;code&gt;watch()&lt;/code&gt; function - we don&apos;t want to generate new content when &lt;em&gt;*.less&lt;/em&gt; files were changed, but instead create new styles.&lt;/p&gt;
&lt;p&gt;Here is the final version of &lt;code&gt;gulpfile.js&lt;/code&gt; - original code from the previous post with new changes. You can check what is new or updated:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;var gulp = require(&apos;gulp&apos;);
var run = require(&apos;gulp-run&apos;);
var less = require(&apos;gulp-less&apos;); // added
var browserSync = require(&apos;browser-sync&apos;).create();

gulp.task(&apos;default&apos;, gulp.parallel(styles, generate, watch)); // updated

// added
function styles() {
  return gulp.src(&apos;source/less/styles.less&apos;).pipe(less()).pipe(gulp.dest(&apos;output/css/&apos;)).pipe(browserSync.stream());
}

function generate() {
  return run(&apos;vendor/bin/statie generate&apos;).exec();
}

function reload(done) {
  browserSync.reload();
  done();
}

function watch() {
  browserSync.init({
    server: &apos;output&apos;,
  });

  gulp.watch(&apos;source/**/*.less&apos;, styles); // added
  gulp.watch([&apos;source/**/*&apos;, &apos;!source/less/**/*&apos;], gulp.series(generate, reload)); // updated
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Check the &lt;a href=&quot;https://github.com/crazko/statie-gulp-example&quot;&gt;example project&lt;/a&gt; that uses Statie and gulp-driven workflow.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Automation rules the development, right? Statie, gulp and Less, what a pleasure to create something great.&lt;/p&gt;
&lt;p&gt;Some additional thoughts on improvement:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can &lt;strong&gt;deal with javascript&lt;/strong&gt; in the same way as with Less styles, just create a new function for that and edit the watch function and gulp task.&lt;/li&gt;
&lt;li&gt;You can also add a different task to &lt;strong&gt;build production-ready code&lt;/strong&gt; (minification, media queries grouping, etc.) - as I did. Have a look at the &lt;a href=&quot;https://github.com/crazko/romanvesely.com/blob/master/gulpfile.js&quot;&gt;gulpfile.js of this site&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>How to re-generate and refresh static website in Statie?</title><link>https://romanvesely.com/statie-generate-and-refresh</link><guid isPermaLink="true">https://romanvesely.com/statie-generate-and-refresh</guid><description>Make development with Statie a bit more convenient with a little use of gulp and Browsersync.
&amp;lt;Tip&amp;gt;
Notice: Statie was deprecated.
&amp;lt;/Tip&amp;gt;
With a rising popularity of static site generators...</description><pubDate>Sat, 01 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Make development with &lt;a href=&quot;https://github.com/Symplify/Statie&quot;&gt;Statie&lt;/a&gt; a bit more convenient with a little use of &lt;a href=&quot;http://gulpjs.com/&quot;&gt;gulp&lt;/a&gt; and &lt;a href=&quot;https://browsersync.io/&quot;&gt;Browsersync&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notice:&lt;/strong&gt; &lt;a href=&quot;https://www.tomasvotruba.com/blog/2020/03/16/statie-is-dead-long-live-symfony-static-dumper/&quot;&gt;Statie was deprecated&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With a rising popularity of static site generators, we can find that there are &lt;a href=&quot;http://www.staticgen.com/&quot;&gt;many of them&lt;/a&gt; already in use. This blog runs on &lt;a href=&quot;https://github.com/Symplify/Statie&quot;&gt;Statie&lt;/a&gt;, another such a tool written by &lt;a href=&quot;https://www.tomasvotruba.cz/&quot;&gt;Tomas Votruba&lt;/a&gt;, which differs from the others with &lt;a href=&quot;https://nette.org/&quot;&gt;Nette&lt;/a&gt; and its templating engine &lt;a href=&quot;https://latte.nette.org/&quot;&gt;Latte&lt;/a&gt; used in the background.&lt;/p&gt;
&lt;p&gt;If you are not aware what is this tool all about let&apos;s take a look at a post series about it on &lt;a href=&quot;https://www.tomasvotruba.cz/blog/2017/02/20/statie-how-to-run-it-locally/&quot;&gt;Tomas&apos; blog&lt;/a&gt; firstly. It will lead you from the very beginning on how to run your own site upon Statie, so I won&apos;t deal with this here.&lt;/p&gt;
&lt;p&gt;In the end of the mentioned blog post, we can find a &lt;a href=&quot;https://www.tomasvotruba.cz/blog/2017/02/20/statie-how-to-run-it-locally/#minitip-use-gulp-work-for-you&quot;&gt;simple gulp task&lt;/a&gt; that runs generate command on every change in the source files. This is surely handy, but you still need to refresh your browser to be able to see your changes. With &lt;strong&gt;Browsersync&lt;/strong&gt; we can make this step unnecessary.&lt;/p&gt;
&lt;h2&gt;Running an executable command&lt;/h2&gt;
&lt;p&gt;With &lt;code&gt;vendor/bin/statie generate&lt;/code&gt; command we can generate our site content. In &lt;code&gt;gulpfile.js&lt;/code&gt; we may have something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;var gulp = require(&apos;gulp&apos;);
var exec = require(&apos;child_process&apos;).exec;

gulp.task(&apos;default&apos;, function () {
  exec(&apos;vendor/bin/statie generate&apos;);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The problem is &lt;strong&gt;it doesn&apos;t give you a message when the job is done&lt;/strong&gt;, so you cannot tell when to refresh a browser to see new content. To get over this problem &lt;a href=&quot;https://github.com/MrBoolean/gulp-run&quot;&gt;gulp-run&lt;/a&gt; package may be used.&lt;/p&gt;
&lt;p&gt;Also, I recently found there is a new version of gulp coming with some handy features, namely: &lt;strong&gt;gulp.series&lt;/strong&gt; and &lt;strong&gt;gulp.parallel&lt;/strong&gt; which combine multiple functions together so tasks don&apos;t have to have dependencies anymore. And we can use those features now!&lt;/p&gt;

&lt;p&gt;Please, read a &lt;a href=&quot;https://www.joezimjs.com/javascript/complete-guide-upgrading-gulp-4/&quot;&gt;guide how to set up gulp 4&lt;/a&gt; before you proceed.&lt;/p&gt;

&lt;h2&gt;Watching over changes&lt;/h2&gt;
&lt;p&gt;Get everything needed to start:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$ npm install --save-dev gulpjs/gulp.git#4.0 gulp-watch gulp-run browser-sync
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add some foundation to the &lt;code&gt;gulpfile.js&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;var gulp = require(&apos;gulp&apos;);
var run = require(&apos;gulp-run&apos;);
var browserSync = require(&apos;browser-sync&apos;).create();

function generate() {
  return run(&apos;vendor/bin/statie generate&apos;).exec();
}

function reload(done) {
  browserSync.reload();
  done();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Such simple functions, aren&apos;t they? Simple, yet they do everything we need to have to set up a watcher function. Short notes on above code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;in &lt;code&gt;generate()&lt;/code&gt; function &lt;code&gt;return&lt;/code&gt; has to be used in order to use it in a &lt;code&gt;gulp.series()&lt;/code&gt; properly&lt;/li&gt;
&lt;li&gt;same applies for &lt;code&gt;done()&lt;/code&gt; function used in &lt;a href=&quot;https://www.browsersync.io/docs/gulp#gulp-reload&quot;&gt;&lt;code&gt;reload()&lt;/code&gt;&lt;/a&gt; - repeated reloading would be not possible without it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here comes the watcher function:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function watch() {
  browserSync.init({
    server: &apos;output&apos;,
  });

  gulp.watch(&apos;source/**/*&apos;, gulp.series(generate, reload));
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With a use of &lt;code&gt;gulp.series(generate, reload)&lt;/code&gt; we define that we want to reload the browser when new content generation finished, not before. The last step is to create a gulp task that will use previously defined functions:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;gulp.task(&apos;default&apos;, gulp.parallel(generate, watch));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, when you run &lt;code&gt;gulp&lt;/code&gt;, new content is generated by Statie along with local server running on &lt;a href=&quot;http://localhost:3000&quot;&gt;localhost:3000&lt;/a&gt; (default settings). Try to edit source files and save them. Browsersync should spot the changes that were generated into &lt;code&gt;output&lt;/code&gt; folder and instantly refresh the browser.&lt;/p&gt;
&lt;p&gt;We have just removed one step in our development process. &lt;strong&gt;Content edition is no pain anymore!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here is the complete &lt;code&gt;gulpfile.js&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;var gulp = require(&apos;gulp&apos;);
var run = require(&apos;gulp-run&apos;);
var browserSync = require(&apos;browser-sync&apos;).create();

gulp.task(&apos;default&apos;, gulp.parallel(generate, watch));

function generate() {
  return run(&apos;vendor/bin/statie generate&apos;).exec();
}

function reload(done) {
  browserSync.reload();
  done();
}

function watch() {
  browserSync.init({
    server: &apos;output&apos;,
  });

  gulp.watch(&apos;source/**/*&apos;, gulp.series(generate, reload));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you are interested also in the frontend development, take a look at &lt;a href=&quot;https://romanvesely.com/statie-with-css-preprocessor&quot;&gt;how to implement a CSS preprocessor&lt;/a&gt; into this workflow.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;With gulp 4 new features &lt;strong&gt;gulp.series&lt;/strong&gt; and &lt;strong&gt;gulp.parallel&lt;/strong&gt; is really easy to create a building workflow when one function depends on another.&lt;/p&gt;
&lt;p&gt;Do you know about anything that can improve my approach or do you use something completely different? Let me know.&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Kalendario</title><link>https://romanvesely.com/kalendario</link><guid isPermaLink="true">https://romanvesely.com/kalendario</guid><description>Browser extension that shows event descriptions in Google Calendar.
I like to take notes and keep a daily journal so I have tried many apps for that purpose, but none of them fulfilled my expectations...</description><pubDate>Tue, 14 Feb 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Browser extension that shows event descriptions in Google Calendar.&lt;/p&gt;
&lt;p&gt;I like to take notes and keep a daily journal so I have tried many apps for that purpose, but none of them fulfilled my expectations. Since I use Google Calendar quite a lot and in many different aspects of my life, I decided to keep notes inside, in the descriptions of the events. This browser extension makes it easier to read them. Give it a try.&lt;/p&gt;
&lt;p&gt;Read more about &lt;a href=&quot;https://romanvesely.com/journaling&quot;&gt;journaling&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;url: https://kalendario.org&lt;/li&gt;
&lt;li&gt;repository: https://github.com/crazko/kalendario&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/kalendario.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>Fomin</title><link>https://romanvesely.com/fomin</link><guid isPermaLink="true">https://romanvesely.com/fomin</guid><description>Powerlifting routine weight calculator.
Whether you are interested in a strength or in a muscle gaining, powerlifting may be a good bet for you. Fomin is one of the prescribed programs out there. This...</description><pubDate>Mon, 13 Feb 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Powerlifting routine weight calculator.&lt;/p&gt;
&lt;p&gt;Whether you are interested in a strength or in a muscle gaining, powerlifting may be a good bet for you. Fomin is one of the prescribed programs out there. This small app helps you to calculate your weights needed to complete this routine.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;url: https://crazko.github.io/fomin/&lt;/li&gt;
&lt;li&gt;repository: https://github.com/crazko/fomin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/fomin.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item><item><title>WordPress Modern Development</title><link>https://romanvesely.com/wordpress-development</link><guid isPermaLink="true">https://romanvesely.com/wordpress-development</guid><description>As a part of Geeky Friday sessions I showed how to leverage tools like git and composer to develop more maintainable WordPress applications.
Presentation slides.

...</description><pubDate>Fri, 11 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As a part of &lt;a href=&quot;http://geeky-friday.nesskdc.sk&quot;&gt;Geeky Friday&lt;/a&gt; sessions I showed how to leverage tools like git and composer to develop more maintainable WordPress applications.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1FRTdJs372HnbWXdjbwXkkfJf0LgMztAo-CJm9KvHqYI&quot;&gt;Presentation slides&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://romanvesely.com/images/wp-modern-development.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><author>roman@romanvesely.com (Roman Veselý)</author></item></channel></rss>