<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Tomasz Dziurko</title>
        <description>VP of Engineering at SoftwareMill. Scaling engineering organizations, post-acquisition integration, and engineering progression systems.</description>
        <link>https://tomaszdziurko.com/</link>
        <atom:link href="https://tomaszdziurko.com/feed.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Wed, 11 Nov 2026 23:01:11 +0000</pubDate>
        <lastBuildDate>Wed, 11 Nov 2026 23:01:11 +0000</lastBuildDate>
        <generator>Jekyll v3.10.0</generator>
        
            <item>
                <title>Świąteczna opowieść. Polska branża IT w 2023</title>
                <description>&lt;p&gt;Tuż przed Świętami 2023, w ramach łapania oddechu, pojawiłem się jako gość w podcaście &lt;a href=&quot;https://www.youtube.com/@OSOBOWOSCIIT&quot;&gt;Osobowości IT&lt;/a&gt; prowadzonym 
przez Agę Myśliwczyk, gdzie razem z Grażyną Dadej próbowaliśmy podsumować ultraciekawy w IT rok 2023, trochę wróżyliśmy, co nas 
czeka w 2024. Poza tym rozmawialiśmy o byciu dobrym liderem, przywództwie i ścieżkach kariery, które nas doprowadziły do miejsc, 
w których jesteśmy i jaką z tego można czerpać naukę.&lt;/p&gt;
</description>
                <pubDate>Sat, 23 Dec 2023 12:01:35 +0000</pubDate>
                <link>https://tomaszdziurko.com/blog/swiateczna-opowiesc-osobowosci-it</link>
                <guid isPermaLink="true">https://tomaszdziurko.com/blog/swiateczna-opowiesc-osobowosci-it</guid>
                
                <category>Video</category>
                
                <category>In Polish</category>
                
                <category>Leadership</category>
                
                
            </item>
        
            <item>
                <title>Czy warto się specjalizować - mini wywiad w Brand w IT</title>
                <description>&lt;p&gt;W sierpniu &lt;a href=&quot;https://www.linkedin.com/in/aleksandra-rajkowska-244829148/&quot;&gt;Aleksandra Rajkowska&lt;/a&gt;, znajoma z branży IT, poprosiła mnie o wypowiedź na temat blasków i cieni specjalizowania się w naszym zawodzie.&lt;/p&gt;

&lt;p&gt;Pierwsze kilka akapitów poniżej, a całość (w tym wypowiedzi &lt;a href=&quot;https://porozmawiajmyoit.pl/&quot;&gt;Krzysztofa Kempińskiego&lt;/a&gt; i &lt;a href=&quot;https://www.linkedin.com/in/akunysz/&quot;&gt;Oli Kunysz&lt;/a&gt;) można przeczytać &lt;a href=&quot;https://brandwit.pl/specjalizacja-w-branzy-it/&quot;&gt;na stronie Brand w IT&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;czy-warto-się-specjalizować-co-byś-doradził-tym-którzy-mają-ten-dylemat&quot;&gt;Czy warto się specjalizować? Co byś doradził tym, którzy mają ten dylemat?&lt;/h3&gt;

&lt;p&gt;To zależy od wielu czynników, ale przede wszystkim od etapu kariery w naszej branży. Na samym początku skoncentrowałbym się na tym, co nas najbardziej kręci w tej ścieżce kariery: czy frontend, czy backend, czy może DevOps. Na miejscu zaczynających w IT wybrałbym sobie taką dziedzinę, język oraz 2-3 technologie towarzyszące. A następnie właśnie na te rzeczy położyłbym główny nacisk nauki.&lt;/p&gt;

&lt;p&gt;Dlaczego akurat tak? Większość firm szukających juniorów koncentruje się na jakiejś specjalizacji, np. Junior Java Developer, Junior DevOps Engineer czy Junior Frontend Developer. Na takie ogłoszenie spływa do firmy kilkadziesiąt, a czasem kilkaset CV. Żeby się wybić, trzeba w tym CV mieć coś wyróżniającego się; coś, co sprawi, że przeglądający je zobaczy, że może i jest to osoba na początku swojej drogi w IT, ale przynajmniej wie już, jaka to droga.&lt;/p&gt;

&lt;p&gt;Po drugie, im więcej będzie pasji w tym wyborze, tym łatwiej będzie przychodziła nauka, pisanie własnych projektów, poznawanie narzędzi i ogólnie pojęty rozwój. Jeśli nie odczuwasz satysfakcji po spędzeniu kilku godzin dziennie na pisaniu kodu, oglądaniu kursów, czytaniu dokumentacji, będzie Ci bardzo trudno zmotywować się do regularnej nauki, a tylko takie podejście może przynieść widoczne efekty i sukces w postaci zdobycia pierwszej czy drugiej pracy.&lt;/p&gt;

&lt;p&gt;Pełny wywiad jest dostępny &lt;a href=&quot;https://brandwit.pl/specjalizacja-w-branzy-it/&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;
</description>
                <pubDate>Wed, 31 Aug 2022 12:00:00 +0000</pubDate>
                <link>https://tomaszdziurko.com/blog/specjalizowac-sie-czy-nie-mini-wywiad-brand-w-it</link>
                <guid isPermaLink="true">https://tomaszdziurko.com/blog/specjalizowac-sie-czy-nie-mini-wywiad-brand-w-it</guid>
                
                <category>In Polish</category>
                
                <category>Interview</category>
                
                
            </item>
        
            <item>
                <title>Nigdy nie mieliśmy biura. Case study SoftwareMill - artykuł i temat numeru w czasopiśmie HR Business Partner</title>
                <description>&lt;p&gt;W majowo-czerwcowym wydaniu czasopisma &lt;a href=&quot;https://hrbusinesspartner.pl/&quot;&gt;HR Business Partner&lt;/a&gt; jako temat numeru ukazał się mój
artykuł “Nigdy nie mieliśmy biura. Case study SoftwareMill”, w którym opisuję nasze (SoftwareMill) podejście do budowania kultury organizacyjnej, 
zaangażowania oraz efektywności w ponad 80-osobowej firmie zdalnej.&lt;/p&gt;

&lt;p&gt;Pierwsze kilka akapitów poniżej, a całość można przeczytać albo w wersji papierowej numeru, albo &lt;a href=&quot;https://hrbusinesspartner.pl/artykul/nigdy-nie-mielismy-biura-case-study-softwaremill&quot;&gt;na stronie czasopisma&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Zaprogramowaliśmy się w SoftwareMill na 100-procentową pracę zdalną od dnia zero. Obecnie jesteśmy ponad 80-osobową organizacją, 
w której osoby z firmy znają się lepiej nawzajem, niż kiedy pracowały stacjonarnie w biurze. Oto, co u nas działa i pozwala budować 
przywiązanie do firmy na tak trudnym rynku pracownika, jakim jest branża IT.&lt;/p&gt;

&lt;p&gt;Od zawsze jesteśmy w pełni zdalni, działamy w modelu, który inni odkryli ponad 10 lat później. Tworzymy projekty IT dla całego świata,
każdy z nas z własnego domu czy co-worku. Nigdy nie mieliśmy i nie planujemy mieć biura. A wszystko zaczęło się w 2009 r., gdy 
właściciele zachęceni wcześniejszymi doświadczeniami pracy zdalnej dla RedHata stworzyli SoftwareMill. Od tego czasu wypróbowaliśmy 
wiele sposobów na budowanie kultury w firmie, tak by zdalność nie przeszkadzała, a była wyróżnikiem i wspierała budowanie silnego zespołu. 
Wdrożyliśmy procesy i zasady, które pomagają nam pielęgnować relacje w zespole rozproszonym, a jednocześnie pozwalają korzystać z elastyczności, 
jaką daje telepraca. Wyróżniamy się na rynku pracodawców IT jako organizacja, która po prostu „umie w pracę zdalną”.&lt;/p&gt;

&lt;h2 id=&quot;organizacja-pracy-w-80-osobowej-zdalnej-firmie&quot;&gt;Organizacja pracy w 80-osobowej zdalnej firmie&lt;/h2&gt;
&lt;p&gt;W pełni zdalny model pracy to jedna z cech charakterystycznych SoftwareMill. W DNA organizacji mamy zapisane jeszcze zarówno płaską 
strukturę, która z czasem wyewoluowała w model wzorowany na holakracji, jak i pełną transparentność, także finansową. Te czynniki 
sprawiają, że w zakresie zarządzania zespołem i całą firmą różnimy się od klasycznych organizacji i konkurencji. By pokazać pełen 
kontekst, przedstawię odrobinę historii.&lt;/p&gt;

&lt;h2 id=&quot;od-turkusu-po-rewolucję&quot;&gt;Od turkusu po (r)ewolucję&lt;/h2&gt;
&lt;p&gt;Gdy SoftwareMill miał około 25 osób – Zarząd, który ciągle chciał programować i brać udział w projektach, zdecydował się przejść na 
bardzo wtedy rewolucyjny model firmy, dziś nazywany „turkusowym”, z tzw. płaską strukturą.&lt;/p&gt;

&lt;p&gt;Główne założenie było takie, by wszystkie decyzje podejmować jak najbliżej źródła problemu. Dzięki wprowadzeniu pełnej transparentności 
(w tym także wynagrodzeń oraz stawek dla klientów) zespoły projektowe mogły podejmować samodzielne decyzje na podstawie 
pełnego obrazu sytuacji. Do większych inicjatyw stworzyliśmy Grupy Robocze i opracowaliśmy zasady demokratycznych głosowań całej 
firmy nad wypracowaną w Grupie propozycją. Taki model zarządzania sprawdzał się u nas przez dobrych kilka lat.&lt;/p&gt;

&lt;p&gt;Ciąg dalszy &lt;a href=&quot;https://hrbusinesspartner.pl/artykul/nigdy-nie-mielismy-biura-case-study-softwaremill&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;
</description>
                <pubDate>Mon, 13 Jun 2022 12:00:00 +0000</pubDate>
                <link>https://tomaszdziurko.com/blog/nigdy-nie-mielismy-biura-hr-business-partner</link>
                <guid isPermaLink="true">https://tomaszdziurko.com/blog/nigdy-nie-mielismy-biura-hr-business-partner</guid>
                
                <category>Remote work</category>
                
                <category>Company culture</category>
                
                <category>IT Management</category>
                
                <category>In Polish</category>
                
                
            </item>
        
            <item>
                <title>Holacracy in a software house</title>
                <description>&lt;h2 id=&quot;part-2-of-the-interview-with-tomek-dziurko-softwaremills-vp-of-engineering&quot;&gt;Part 2 of the interview with Tomek Dziurko, SoftwareMill’s VP of Engineering&lt;/h2&gt;

&lt;p&gt;Part 1 is available &lt;a href=&quot;/blog/vp-of-engineering-working-in-hr&quot;&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kamila Stępniowska talks to Tomek Dziurko about how decisions are made at SoftwareMill, how guilds work, and 
why the company opted for their own version of holacracy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kamila Stępniowska (KS)&lt;/strong&gt;: The closer I got to know SoftwareMill, the more it began to remind me of Spotify in terms 
of its culture of organization. From what I know, that’s not where your inspiration came from, but Netflix 
is a kind of newly-discovered source of inspiration. You discussed Reed Hastings’ “No Rules Rules: Netflix and 
the Culture of Reinvention” at your reading club’s meetings. Are you thinking of implementing any of the 
organizational solutions presented in the book?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tomasz Dziurko (TD)&lt;/strong&gt;: We’re planning to. What we really liked was the emphasis on feedback culture – very honest, 
regular feedback, focused on what can be done better. The book broadly describes a fairly developed system for giving 
feedback so that it’s constructive and not taken as a personal attack. At SoftwareMill, we work in a similar manner, 
however, we feel we can still improve in this area. We are aware that giving and receiving feedback is generally 
a tough nut to crack. I assume that little by little, we will get to where Netflix is: providing feedback as often 
as possible. Feedback that’s timely, delivered following a given situation is a lot more effective because both sides 
still remember all of it and it’s easier to communicate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KS&lt;/strong&gt;: It seems that SoftwareMill is open to internal discussion. You don’t have departments but so-called guilds. 
I take it there’s more to that than just a different name?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TD&lt;/strong&gt;: SoftwareMill used to be a flat company, so everyone could express themselves in any area. Whenever a decision 
had to be made, we asked for everyone’s opinion, and we made decisions together by a company-wide vote. And it was great, 
it worked well until we grew to about 40 people. It then turned out that not all decisions can be made together. Some 
people simply don’t have the knowledge or context to consciously vote for or against something. That’s when we decided 
that we need to narrow the groups down a little in terms of competences – to people who really want to contribute in a 
certain area, are interested in what’s going on, and are somewhat familiar with a given part of the company’s activity. 
We introduced a holacracy, or at least that was our starting point.&lt;/p&gt;

&lt;p&gt;At SoftwareMill, as you mentioned, we have guilds – every area of the company’s activity has its own guild. It also 
has a guild master who coordinates activities and makes sure that the things that need to happen actually happen. 
At the moment, many smaller decisions concerning a specific area of activity of the company are made within the guilds. 
The decisions are made by people who really have the knowledge and context, and who know what the risks, consequences, 
business goals, and reasons for the course of action are. It’s important to note that anyone can belong to a guild – 
you simply need to express interest and consciously decide that “OK, I’m interested in this area of the company’s activity, 
so I want to do this, I want to and have the time to keep track of this.” We haven’t completely got rid of our flat 
structure. Decisions that impact the entire company are still made via voting by every member of the company. Here, 
we stick to the values SoftwareMill grew out of – everyone can do their own bit and shape the company.&lt;/p&gt;

&lt;p&gt;Full article can be read at SoftwareMill’s Blog &lt;a href=&quot;https://softwaremill.com/holacracy-in-a-software-house/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</description>
                <pubDate>Thu, 29 Jul 2021 12:00:00 +0000</pubDate>
                <link>https://tomaszdziurko.com/blog/holacracy-in-a-software-house</link>
                <guid isPermaLink="true">https://tomaszdziurko.com/blog/holacracy-in-a-software-house</guid>
                
                <category>Company culture</category>
                
                <category>IT Management</category>
                
                <category>Remote work</category>
                
                <category>Holacracy</category>
                
                
            </item>
        
            <item>
                <title>VP of Engineering working in HR?</title>
                <description>&lt;h2 id=&quot;can-vp-of-engineering-handle-recruitment-processes-too&quot;&gt;Can VP of Engineering handle recruitment processes too?&lt;/h2&gt;

&lt;h4 id=&quot;first-part-of-an-interview-with-tomek-dziurko-softwaremills-vp-of-engineering&quot;&gt;First part of an interview with Tomek Dziurko, SoftwareMill’s VP of Engineering&lt;/h4&gt;

&lt;p&gt;Part 2 is available &lt;a href=&quot;/blog/holacracy-in-a-software-house&quot;&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kamila Stępniowska (KS)&lt;/strong&gt;: Tomek, your title on your LinkedIn profile is VP of Engineering, but you also scout for new talents 
and watch over the recruitment process, so what’s going on here? ;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tomek Dziurko (TD)&lt;/strong&gt;: Yes, that’s right. Choosing the right people to join SoftwareMill is one of my most important responsibilities. 
The IT market is very demanding, especially when it comes to experienced specialists, so the help of a programmer with 
13 years of experience can only help, both when it comes to finding the right people and to convincing them that SoftwareMill 
is a good place for them to develop further.&lt;/p&gt;

&lt;p&gt;Luckily that’s not the only thing I work on, although I admit that it’s quite important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KS&lt;/strong&gt;: What else does your job involve?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TD&lt;/strong&gt;: In product companies that build an app, the role of the VP of Engineering is much more closely tied to technical aspects. 
Such a person really supports the technological direction, working together with the CTO on selecting tools, languages, 
architecture – that is elements with strategic importance for the product’s development, and so for the existence of the 
whole company. Since most programmers work on developing the same application, the VP of Engineering also focuses on 
&lt;strong&gt;improving communication and collaboration between teams&lt;/strong&gt;. All this increases the chances of the app’s success and the 
financial success of the company. After all, at the end of the day, it’s the most mundane mission of each company: to make 
money that can then be spent on pay rises or a new Ferrari for the CEO. Exactly in that order, of course :)&lt;/p&gt;

&lt;p&gt;In the case of a software house, my role is a little different, although of course our CEO probably wouldn’t mind 
having a Ferrari either :) My main task, other than coordinating the recruitment process for different technical 
positions, is &lt;strong&gt;supporting teams in effective work, by which I mean: supporting the development of technical 
knowledge, creating paths for development in different technical positions together with senior developers and architects, 
and taking care of the development of soft skills in the team as well as supporting the exchange of experiences and know-how 
between teams.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KS&lt;/strong&gt;: What does that mean in practice? How do you encourage the exchange of knowledge at SoftwareMill?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TD&lt;/strong&gt;: When it comes to learning, I either organize or help to get different groups of knowledge exchange going within 
the company. We make sure that people who want to learn or – what’s even more valuable – share their experiences 
have plenty of opportunities to do so here. We currently have &lt;strong&gt;two groups preparing for certifications&lt;/strong&gt; (AWS and Apache Kafka),
a &lt;strong&gt;Technical Reading Club&lt;/strong&gt; (currently discussing “Design It” and previously went over “Designing Data-Intensive Applications” 
by Martin Kleppmann), and a &lt;strong&gt;Soft Skills Reading Club&lt;/strong&gt;, where we read more about the human aspect of leading teams and companies. 
We started by going over the classic “Peopleware: Productive Projects and Teams”, and then we read 
“No Rules Rules: Netflix and the Culture of Reinvention.”&lt;/p&gt;

&lt;p&gt;Full article can be read at SoftwareMill’s Blog &lt;a href=&quot;https://softwaremill.com/vp-of-engineering-working-in-hr/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</description>
                <pubDate>Wed, 21 Jul 2021 12:00:00 +0000</pubDate>
                <link>https://tomaszdziurko.com/blog/vp-of-engineering-working-in-hr</link>
                <guid isPermaLink="true">https://tomaszdziurko.com/blog/vp-of-engineering-working-in-hr</guid>
                
                <category>Company culture</category>
                
                <category>IT Management</category>
                
                <category>Remote work</category>
                
                
            </item>
        
            <item>
                <title>O wspieraniu rozwoju i integracji programistów w czasach koronawirusa - 4Developers 2021</title>
                <description>&lt;p&gt;Moje wystąpienie na konferencji 4Developers 2021 na temat jak to robimy, że jesteśmy zgraną drużyną, pracując w 100% zdalnie? 
Jakie aktywności i rozwiązania wypracowaliśmy przez prawie 10 lat pracy zdalnej, które mogą wam,
waszym zespołom czy nawet firmom, pomóc w czasach pracy zdalnej zadbać zarówno o integrację ludzi,
jak i wspieranie ich rozwoju.&lt;/p&gt;
</description>
                <pubDate>Thu, 27 May 2021 12:00:00 +0000</pubDate>
                <link>https://tomaszdziurko.com/blog/o-wspieraniu-rozwoju-i-integracji-online-w-firmie-zdalnej</link>
                <guid isPermaLink="true">https://tomaszdziurko.com/blog/o-wspieraniu-rozwoju-i-integracji-online-w-firmie-zdalnej</guid>
                
                <category>Video</category>
                
                <category>In Polish</category>
                
                <category>Conference</category>
                
                <category>Remote Work</category>
                
                <category>Company Culture</category>
                
                
            </item>
        
            <item>
                <title>Lobotomy to your object-oriented thinking - &quot;Elegant Objects, volume 1&quot; book review</title>
                <description>&lt;blockquote&gt;
  &lt;p&gt;Step one in the transformation of a successful procedural developer into a successful object developer is a lobotomy.&lt;/p&gt;

  &lt;p&gt;&lt;cite&gt;– David West&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the first sentence in &lt;a href=&quot;https://www.amazon.com/Elegant-Objects-1-Yegor-Bugayenko/dp/1519166915&quot;&gt;“Elegant Objects, volume 1”&lt;/a&gt; book by Yegor Bugayenko and after reading it from cover to cover 
I could not agree more. This book will not leave you neutral, you will either strongly agree or disagree 
with claims stated there, but it is definitely worth your time. It will challenge what you know about programming, 
it will challenge what you think a proper object-oriented design is and it will challenge many old, well-established 
so called “good practices” you have seen during your career. Fasten your belts, move your coffee mug away from your 
keyboard and keep reading.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/homer-brain.jpg&quot; alt=&quot;Lobotomy to your brain&quot; /&gt;
&lt;em&gt;Image from http://simpsons.wikia.com&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;content&quot;&gt;Content&lt;/h2&gt;

&lt;p&gt;“Elegant Objects, vol. 1” in over 200 pages gives you 23 practical tips for developers to write more object-oriented, 
thus more maintainable code. The author uses a very interesting allegory by treating every object as a human being 
and splitting these suggestions into four anthropomorphized chapters: birth, school, employment, and retirement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The Birth&lt;/em&gt;&lt;/strong&gt; chapter is rather short and covers object creation, starting from naming strategies through suggestions 
how to keep constructors clean and easy to test. Education and Employment are the core of the book and 
contain paragraphs describing how to build encapsulated, immutable and easy to test objects, how to use interfaces 
with stub implementations to simplify testing without mocking hell. Then we could read some rants about 
“encapsulation by getters/setters”, sections about the clear distinction between data structures known from 
procedural languages and well-defined classes and objects from OO programming. Last paragraph Retirement is about 
avoiding nulls, using only checked (yes, yes, no typo here :) ) exceptions and recovering from errors.&lt;/p&gt;

&lt;p&gt;Each suggestion is clearly described with code snippets showing bad, and then, proper approaches to solve the discussed topic. There are also links to discussions on author’s blog so you could read what others have to say about each suggestion. Most paragraphs are short so the reader could split reading sessions into smaller ones without the need to re-read several pages. Paragraphs are also rather autonomous so you could read them in any order, even if there is a reference to something covered elsewhere, it will be a direct reference to paragraph number where the reader should look for mentioned information.&lt;/p&gt;

&lt;h2 id=&quot;my-notes&quot;&gt;My Notes&lt;/h2&gt;

&lt;p&gt;During the reading, I put many sticky notes with sentences worth remembering, below the most important or intriguing ones.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Avoid names ending with “-er”, it suggests that such an object is only a collection of procedures that manipulate data 
and not a fully-independent entity that is capable of acting on its own&lt;/li&gt;
  &lt;li&gt;Each class should have only one primary constructor with initialization logic there, non-primary (secondary) constructors should only prepare data (params conversion, etc.) and call a primary one.&lt;/li&gt;
  &lt;li&gt;Each class should have a maximum of four properties. Author makes an analogy to coordinates in the universe (x, y, z and time)&lt;/li&gt;
  &lt;li&gt;Instantiation should be strictly separated from execution, new operator is allowed only inside secondary constructors&lt;/li&gt;
  &lt;li&gt;Every public method must be a part of some interface. Why? See note below.&lt;/li&gt;
  &lt;li&gt;Avoid mocking hell by using no mocks, provide default (fake) implementations of all interfaces that could be later used in your tests. This way other developers won’t have to set up everything in each test, they could simply use fake implementations that need to be written once.&lt;/li&gt;
  &lt;li&gt;Avoid mutable state.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Mutable objects are an abuse of the entire object-oriented paradigm.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Avoid temporal coupling between lines: with immutable objects you do not have two separate phases of 
object instantiation and object initialization (first “new”, then multiple setters) so we cannot 
accidentally put any logic before the object is fully ready to use. The immutable object is either 
non-existing or fully initialized entity ready to work for you, so reordering lines won’t have any 
effect on application logic, the same immutable object will be used.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Show your respect to others by writing code that assumes they are junior programmers. Not by showing 
off and demonstrating your skills but by writing simple and easy to follow code.&lt;/li&gt;
  &lt;li&gt;Favor small objects with the well-defined scope and responsibility -&amp;gt; max four public/protected 
methods. If this number goes above five, think carefully as probably this class has more than one responsibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Static methods are like a cancer to your objects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;You can’t trust objects returning null, every time at some point you will have to check for nullability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can see some of them are only a bit more strict rules that we used to apply during our daily job, 
but some are quite radical. If you want to understand them better or read if readers agree or disagree 
with presented approach you could use a link to the discussion on Yegor’s blog (e.g. &lt;a href=&quot;https://www.yegor256.com/2014/09/23/built-in-fake-objects.html&quot;&gt;Don’t mock, use fakes&lt;/a&gt;). 
I am not sure that applying all of them is possible, but in my opinion, the more you try the better your code will be.&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;Without any doubt, I am placing “Elegant Objects, vol. 1” next to my other favorite programming books like 
“Clean Coder”, “Clean Code”, “Software Craftsman” and “The Pragmatic Programmer: From Journeyman to Master” 
(some of them have reviews here on my blog). It shows a very different point of view to object-oriented 
programming and challenges much stuff we all take for granted. It presents something I would call a 
Radical Object-Oriented paradigm that will broaden your horizons and make you think twice before 
following any standard approach. There is a second part named &lt;a href=&quot;https://www.amazon.com/Elegant-Objects-2-Yegor-Bugayenko/dp/1534908307&quot;&gt;“Elegant Objects, volume 2”&lt;/a&gt; 
that I am planning to read as well.&lt;/p&gt;
</description>
                <pubDate>Wed, 26 Jul 2017 00:00:00 +0000</pubDate>
                <link>https://tomaszdziurko.com/blog/lobotomy-to-your-object-oriented-thinking-elegant-objects-book-review</link>
                <guid isPermaLink="true">https://tomaszdziurko.com/blog/lobotomy-to-your-object-oriented-thinking-elegant-objects-book-review</guid>
                
                <category>Reading</category>
                
                <category>Programming</category>
                
                
            </item>
        
            <item>
                <title>Confitura 2017 – greatness delivered</title>
                <description>&lt;p&gt;Last weekend, I attended Confitura 2017. This year’s conference had about 1,400 attendees, 5 tracks, and 35 presentations; everyone could find something interesting to listen to and learn from. This post is a review of that great event.&lt;/p&gt;

&lt;h2 id=&quot;a-bit-of-history&quot;&gt;A Bit of History&lt;/h2&gt;

&lt;p&gt;Confitura 2017 was the 11th edition of this Java/JVM/programming conference in Poland. When I realized the event has been around for so long, I checked my notes and found that I have only missed the first two editions. This was my 9th Confitura: twice as an organizer, once as a speaker (&lt;a href=&quot;https://www.youtube.com/watch?v=4Dr3dTTxiEk&quot;&gt;2nd best talk&lt;/a&gt; in 2015, yay!), once as a volunteer, and the rest as a regular attendee.&lt;/p&gt;

&lt;p&gt;Confitura started in 2007 as Javarsovia. However, due to a mysterious company trying to ban the word, it was renamed to its current brand. It has grown from a single-track event to the biggest free-to-attend (with a small donation to charity) JVM conference in the country, featuring 5 tracks and over thirty speakers.&lt;/p&gt;

&lt;h2 id=&quot;the-talks&quot;&gt;The Talks&lt;/h2&gt;

&lt;p&gt;When I reached the conference venue, I was surprised by the very short queues at the registration desks. Everything went smoothly—perhaps thanks to the use of QR codes as e-tickets. Within a minute, I had my bag, which even included a trendy fidget spinner toy! 🙂&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep IT clean: mid-sized building blocks and hexagonal architecture in real life by &lt;a href=&quot;https://twitter.com/jnabrdalik&quot;&gt;Jakub Nabrdalik&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every time you attend one of Jakub’s talks, you can be sure your time won’t be wasted. This time was no different: a very good presentation on limiting class visibility as a step toward cleaner architecture, better testability, and happier developers. He also covered packages and subpackages, managing the visibility of Spring beans, and a high-level look at CQRS architecture. With Kuba’s talk, Confitura started with some very “meaty” technical content. &lt;a href=&quot;https://jakubn.gitlab.io/keepitclean/#1&quot;&gt;Link to the slides&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Studium przypadku wystarczająco dobrej architektury by &lt;a href=&quot;https://twitter.com/jkubrynski&quot;&gt;Jakub Kubryński&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The story of a startup and a CEO who needs to balance the eagerness to refactor with the cost of doing so. It included many useful tips on how to apply a “good enough” approach to a project, what to automate, and which metrics to measure to understand what is happening in your system. Kuba explained how they ensure microservices can communicate with each other (&lt;a href=&quot;https://spring.io/projects/spring-cloud-contract&quot;&gt;Spring Cloud Contract&lt;/a&gt;), why end-to-end tests should only cover the most critical paths, and why your users are often your best testers. &lt;a href=&quot;https://speakerdeck.com/jkubrynski/case-study-of-the-good-enough-architecture&quot;&gt;Link to the slides&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reactive web services by &lt;a href=&quot;https://twitter.com/kszdev&quot;&gt;Kamil Szymański&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A live coding demo showing how to introduce a reactive approach to your project without using too many external libraries (using only the latest Spring and Hibernate). I respect all speakers who are brave enough to write code during a talk, and Kamil did it well, with only one or two minor pauses. He covered Mono and Flux from Reactive Spring as well as features from the latest Hibernate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evolving Architecture by &lt;a href=&quot;https://twitter.com/dpokusa&quot;&gt;Daniel Pokusa&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A talk about the career of a software developer trying to understand what makes a “good” architecture and how to build such a system, while making some costly mistakes along the way. It was a very good talk, especially for junior developers; those more experienced might find some of the material familiar. Daniel mentioned several excellent books to read; I personally added the free &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/architecture/patterns/&quot;&gt;Cloud Design Patterns&lt;/a&gt; from Microsoft to my reading list. &lt;a href=&quot;https://www.slideshare.net/danielpokusa/evolving-architecture-4-confitura-2017&quot;&gt;Link to the slides&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visa Developer Center by Tomasz Cisowski&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was a sponsored presentation, so I didn’t expect too much, but the topic was interesting. I have some experience integrating payment providers and wanted to see what Visa has to offer. In short: visit &lt;a href=&quot;https://developer.visa.com/#&quot;&gt;developer.visa.com&lt;/a&gt; to check their documentation; they have many different APIs to experiment with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testy wydajności z Gatlingiem by &lt;a href=&quot;https://twitter.com/aludwikowski&quot;&gt;Andrzej Ludwikowski&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My colleague from SoftwareMill retold the familiar story that measuring performance is hard. However, with &lt;a href=&quot;http://gatling.io/&quot;&gt;Gatling&lt;/a&gt;—a tool written in Scala, Akka, and Netty—performing these tests using its elegant DSL should no longer be a pain (we all remember the “great” UX of JMeter). &lt;a href=&quot;https://www.slideshare.net/AndrzejLudwikowski/performance-tests-with-gatling-77489992&quot;&gt;Link to the slides&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7 things which you should care about before release your code to production by Mateusz Dyminski&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A solid talk about things like API versioning (especially important for mobile app backends), database migration versioning, and learning how to profile your code &lt;em&gt;before&lt;/em&gt; you go to production. Lots of useful practical advice! &lt;a href=&quot;https://github.com/mateuszdyminski/7things-java&quot;&gt;Link to the slides&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plantacje programistów – kolonializm XXI wieku by Wojciech Seliga&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I skipped this to do some networking instead, but I had seen this talk at GeeCON earlier this year. Wojtek argued that being “just a coder” is no longer enough; we should strive to understand the business better. We need to be more than someone who just writes code (which is becoming a commodity) and instead understand the product and the organization to bring extra value. He suggested that instead of just software engineering, we should focus on “product engineering,” which involves user experience, market research, data analysis, and more. It was a great talk with many interesting insights. &lt;a href=&quot;https://www.slideshare.net/wseliga/developer-plantations-colonialism-of-xxi-century-geecon-2017&quot;&gt;Link to the slides&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;after-party&quot;&gt;After-party&lt;/h2&gt;

&lt;p&gt;I cannot emphasize this enough: after-parties are at least one-third of the value of any technical event. If you have the chance to attend, &lt;strong&gt;never&lt;/strong&gt; hesitate. You will meet speakers, organizers, JUG leaders, and many other fascinating people. You can talk to them about anything: their presentations, their open-source projects, or off-topic subjects like cars, kids, Lego sets, or even the strangest place you’ve ever pushed a Git commit from.&lt;/p&gt;

&lt;p&gt;The atmosphere is relaxed, and since no one is rushing to the next session, networking is easy. Just grab a drink and join a group. “Spoina,” the party after Confitura, was great as usual. This time, we had &lt;a href=&quot;http://miejsce.to/&quot;&gt;an entire barge&lt;/a&gt; to ourselves in a very atmospheric location, with good food, plenty of drinks, and no loud music to drown out the conversation.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/miejsce-to.jpg&quot; alt=&quot;Spoina Party&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Of course, we didn’t finish there and eventually moved to the city center for the next phase of socializing! 🙂&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;As usual, Confitura delivered: great talks and even greater people. I saw many old friends and met some new faces too. The old venue (with its upgraded air conditioning) held up surprisingly well. Honestly, aside from there being too many interesting talks to attend and the breaks being too short to talk to everyone I wanted, I couldn’t find any drawbacks. If you are into programming, this event is definitely for you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Credits: photos by &lt;a href=&quot;https://twitter.com/bartekzdanowski&quot;&gt;@bartekzdanowski&lt;/a&gt; and &lt;a href=&quot;http://miejsce.to/&quot;&gt;miejsce.to&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</description>
                <pubDate>Tue, 04 Jul 2017 00:00:00 +0000</pubDate>
                <link>https://tomaszdziurko.com/blog/confitura-2017-greatness-delivered</link>
                <guid isPermaLink="true">https://tomaszdziurko.com/blog/confitura-2017-greatness-delivered</guid>
                
                <category>Conferences</category>
                
                <category>Java</category>
                
                <category>Confitura</category>
                
                
            </item>
        
            <item>
                <title>Java word banned once and for all?</title>
                <description>&lt;p&gt;This article is my reaction to the recent Javaslang changing name to Vavr. Please be aware that all content is &lt;strong&gt;completely fictitious&lt;/strong&gt; and in many cases ironic.&lt;/p&gt;

&lt;p&gt;Reports are coming in from all over the world that some mysterious man in a dark suit contacted various companies strongly suggesting that they should stop using the word “Java” in any form or “bad things might happen”.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/java-banned-selection.png&quot; alt=&quot;Fake News Times front page headline: Will Java almost disappear?&quot; /&gt;&lt;/p&gt;

&lt;p&gt;By now we were not aware of the number of such incidents but recently many people from different countries and various industries contacted us to share their stories. Below we present some of them:&lt;/p&gt;

&lt;h2 id=&quot;javaslang&quot;&gt;Javaslang&lt;/h2&gt;

&lt;p&gt;One of the core contributors of this library told us anonymously that a few weeks ago the team behind &lt;a href=&quot;http://vavr.io/&quot;&gt;Javaslang&lt;/a&gt; was approached by a serious-looking man who told them that they should stop using the “Java” word as a part of their library name. He also added that his corporation already has an internal slang called &lt;em&gt;javaslang&lt;/em&gt; so nothing with the same name should exist. He even gave one example of one phrase they coined:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“postponed to the next major release” means “not gonna happen”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;java-the-island&quot;&gt;Java, the island&lt;/h2&gt;

&lt;p&gt;It turns out that not only regular people are approached by these mysterious individuals. Our source in the Indonesian government told us that they also had a very similar situation: a tall man wearing an expensive black suit contacted their delegation during a visit to San Escobar. He urged that nothing could be called Java except their product. When he heard “But we can not change the name of an island, that would force over 140 million of our citizens to change their IDs, addresses and as a result would push our country into chaos” in response, he shouted “But over 3 billion devices use OUR Java! This is much more!”.&lt;/p&gt;

&lt;h2 id=&quot;javart-the-company&quot;&gt;Javart, the company&lt;/h2&gt;

&lt;p&gt;Individuals, governments, but also companies were on the radar of this unknown and mysterious corporation. A former employee of Javart, a Polish software house, called us to share his relation. During a short session over Skype he claimed that their board was forced to change the name of the company because it contained the “Java” word. He also said that the man in a suit told them that&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Javart name suggests that Java has something in common with the art and that is an obvious lie.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;jawa-the-motorbike&quot;&gt;Jawa, the motorbike&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/jawa-353.jpg&quot; alt=&quot;Jawa 353 motorbike&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Another company that was contacted by “Java word defenders” was a Czech motorbike manufacturer named &lt;a href=&quot;http://jawa.eu/&quot;&gt;Jawa&lt;/a&gt;. In this case a phrase describing their latest model “The fastest Jawa in the history” was the reason why a suited man appeared in their headquarters near Prague claiming that&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;the fastest Java in the history is the incoming Java 9 and they should change their slogan immediately&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;javapolis-the-conference&quot;&gt;Javapolis, the conference&lt;/h2&gt;

&lt;p&gt;Many of you might have heard about &lt;a href=&quot;https://devoxx.com/&quot;&gt;Devoxx&lt;/a&gt; conference originating from Belgium, but not many probably know that its original name was Javapolis. But, according to one of the former members of the team behind this event, the name was also affected by external pressure: “Java is a brand known widely in the many countries, many people don’t know English well and&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;someone might think that Javapolis is a secret Java Police department in our corporation responsible for hunting for incorrect usages of ‘Java’ word which is of course ridiculous and might show our company in a bad light&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;/images/breaking-news.jpg&quot; alt=&quot;Breaking news&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;spartak-myjava-the-football-club&quot;&gt;Spartak Myjava, the football club&lt;/h2&gt;

&lt;p&gt;All presented incidents are strange, but we have kept the best one until the end of this article. Please read a message we have found in our email box:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I am the chairman of &lt;a href=&quot;https://en.wikipedia.org/wiki/Spartak_Myjava&quot;&gt;Spartak Myjava&lt;/a&gt;, a small football club in Slovakia. We planned to build a new stadium, improve youth facilities but it was very difficult to find a sponsor willing to help us. Then suddenly, a company called Lightbend contacted us willing to pay 1 million Euro each year for becoming our main sponsor. The only thing they wanted is that club should be renamed to &lt;strong&gt;Lightbend MyJava&lt;/strong&gt;. At first I was reluctant to do so, but our supporters convinced the board that it would allow us to move to a higher level, maybe even qualify to the Champions League so I agreed. Everything was ready, the contract was waiting only for the signature of the Lightbend CEO, but suddenly everything collapsed. After several calls to find out what had happened, the only thing we were able to get from them (of course off the record) was that another company threatened to sue them if the Lightbend name appeared close to ‘Java’ word.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We leave it without a comment.&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;We have seen many different things but recent attempts to practically ban one word from usage in the many countries, by different companies, places and people are very strange and hard to explain. We think that examples presented above are not the only ones and more will come. We promise to keep you updated. And of course, if you know any other examples, please let us know.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image credits: Pexels.com and Wikipedia&lt;/em&gt;&lt;/p&gt;
</description>
                <pubDate>Fri, 21 Apr 2017 00:00:00 +0000</pubDate>
                <link>https://tomaszdziurko.com/blog/java-word-will-be-banned</link>
                <guid isPermaLink="true">https://tomaszdziurko.com/blog/java-word-will-be-banned</guid>
                
                <category>Programming</category>
                
                <category>Java</category>
                
                <category>Random thoughts</category>
                
                
            </item>
        
            <item>
                <title>Forcing Wicket to place JavaScript files at the bottom</title>
                <description>&lt;p&gt;When you add any Wicket component library, e.g. Wicket-Bootstrap to your project, usually it adds some JavaScript and CSS resources to every page or panel. But the problem is that these JS files are added in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section of your page while all Internet knowledge says that JS should be placed at the bottom of the page for better performance and faster loading times. In this post I will show how we could configure Wicket to place JS files wherever we want.&lt;/p&gt;

&lt;h2 id=&quot;initial-project-setup&quot;&gt;Initial project setup&lt;/h2&gt;

&lt;p&gt;Let’s start with a simple one-page-one-form Wicket application counting days from the user’s birthday:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/wicket-js-bottom-sample-app.png&quot; alt=&quot;Sample Wicket application counting days since the user&apos;s birthday&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It has a dependency on the earlier mentioned Wicket-Bootstrap because we need its DatePicker component:&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;de.agilecoders.wicket&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;wicket-bootstrap-core&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.10.11&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;de.agilecoders.wicket&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;wicket-bootstrap-extensions&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.10.6&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Our web page contains a form, one text field and one date picker:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;HomePage&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;WebPage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

	&lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Date&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;birthDate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

	&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;HomePage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PageParameters&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;parameters&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
	  &lt;span class=&quot;kd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parameters&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

	  &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;FeedbackPanel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;feedbackPanel&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
          &lt;span class=&quot;nc&quot;&gt;Form&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;HomePage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;form&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Form&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;HomePage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;form&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CompoundPropertyModel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
            &lt;span class=&quot;kd&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;onSubmit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello %s. It&apos;s nice to meet you! You are %d days old!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;calculateDaysSinceBirthDay&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;birthDate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)));&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;o&quot;&gt;};&lt;/span&gt;

          &lt;span class=&quot;n&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TextField&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setRequired&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setLabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Name&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)));&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;DateTextField&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;birthDate&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;DateTextFieldConfig&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;autoClose&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;withLanguage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;pl&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;withFormat&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;dd/MM/yyyy&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setLabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Date of birth&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;setRequired&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

      &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;calculateDaysSinceBirthDay&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Date&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;birthDate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Days&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;daysBetween&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;LocalDate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;fromDateFields&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;birthDate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;LocalDate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getDays&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;problem&quot;&gt;Problem&lt;/h2&gt;

&lt;p&gt;When we run our application we will see that all Bootstrap related JS files are placed in the page header:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;./wicket/resource/de.agilecoders.wicket.extensions.markup.html.bootstrap.references.BootstrapDatepickerJsReference/js/datepicker-ver-1484131947646.js&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;./wicket/resource/de.agilecoders.wicket.extensions.markup.html.bootstrap.references.BootstrapDatepickerLangJsReference/js/lang/bootstrap-datepicker.pl-ver-1484131947646.js&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;bootstrap-js&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;./wicket/resource/de.agilecoders.wicket.webjars.request.resource.WebjarsJavaScriptResourceReference/webjars/bootstrap/3.3.7-1/js/bootstrap-ver-1484131946909.js&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It is not what we wanted, so we need to configure our application to add JS files somewhere at the bottom.&lt;/p&gt;

&lt;h2 id=&quot;solution&quot;&gt;Solution&lt;/h2&gt;

&lt;p&gt;First, let’s start with some background. Each time a component wants to add something to the page header (for example using &lt;a href=&quot;https://nightlies.apache.org/wicket/apidocs/7.x/org/apache/wicket/markup/html/IHeaderContributor.html&quot;&gt;IHeaderContributor&lt;/a&gt;) it creates a new instance of &lt;a href=&quot;https://nightlies.apache.org/wicket/apidocs/7.x/org/apache/wicket/markup/head/HeaderItem.html&quot;&gt;HeaderItem&lt;/a&gt; object. By default all HeaderItems are rendered in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt;, but we could modify this behaviour using &lt;a href=&quot;https://nightlies.apache.org/wicket/apidocs/7.x/org/apache/wicket/markup/html/IHeaderResponseDecorator.html&quot;&gt;IHeaderResponseDecorator&lt;/a&gt; and &lt;a href=&quot;https://nightlies.apache.org/wicket/apidocs/7.x/org/apache/wicket/markup/head/filter/FilteringHeaderResponse.html&quot;&gt;FilteringHeaderResponse&lt;/a&gt; to separate HeaderItems into two places to render: header and a defined place in our page body.&lt;/p&gt;

&lt;p&gt;First, we should define a place where all JS files should be rendered by adding a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;wicket:container&amp;gt;&lt;/code&gt; element with id:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;html&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns:wicket=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://wicket.apache.org&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
	&lt;span class=&quot;nt&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ... --&amp;gt;&lt;/span&gt;
		&lt;span class=&quot;nt&quot;&gt;&amp;lt;wicket:container&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;wicket:id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;footer-container&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;

	&lt;span class=&quot;nt&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and add it to the Page class:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;HeaderResponseContainer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;footer-container&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;footer-container&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The next step is to configure a response decorator and response filter that will direct some items to our &lt;em&gt;footer-container&lt;/em&gt; bucket. This should be done in the &lt;em&gt;init()&lt;/em&gt; method of our WicketApplication class:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

    &lt;span class=&quot;nc&quot;&gt;IBootstrapSettings&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;settings&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;BootstrapSettings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;nc&quot;&gt;Bootstrap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;settings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;setHeaderResponseDecorator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JavaScriptToBucketResponseDecorator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;footer-container&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Our decorator should use a filter that is already in Wicket core module, a &lt;a href=&quot;https://nightlies.apache.org/wicket/apidocs/7.x/org/apache/wicket/markup/head/filter/JavaScriptFilteredIntoFooterHeaderResponse.html&quot;&gt;JavaScriptFilteredIntoFooterHeaderResponse&lt;/a&gt; that does exactly what we need:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A header response that creates two buckets. The header bucket will contain all references to CSS and markup from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section from the page. The other bucket will contain all other header items, and you will need to add a HeaderResponseContainer to the footer of your page (typically just before the end body tag) to render those items.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So it will split all our HeaderItems into two buckets, one (default) that will be rendered in the page header and the second rendered where we placed &lt;em&gt;footer-container&lt;/em&gt; element. The working version of our decorator looks as presented below:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JavaScriptToBucketResponseDecorator&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;IHeaderResponseDecorator&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bucketName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;JavaScriptToBucketResponseDecorator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bucketName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;bucketName&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bucketName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;IHeaderResponse&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;decorate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;IHeaderResponse&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;JavaScriptFilteredIntoFooterHeaderResponse&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bucketName&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After that we can rebuild our application and see that all our Bootstrap related JS files are rendered at the bottom of our page, improving performance and the overall experience of our users.&lt;/p&gt;
</description>
                <pubDate>Tue, 21 Feb 2017 00:00:00 +0000</pubDate>
                <link>https://tomaszdziurko.com/blog/forcing-wicket-place-javascript-files-bottom</link>
                <guid isPermaLink="true">https://tomaszdziurko.com/blog/forcing-wicket-place-javascript-files-bottom</guid>
                
                <category>Programming</category>
                
                <category>Java</category>
                
                
            </item>
        
    </channel>
</rss>