<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Smart Coders' Blog]]></title><description><![CDATA[Thoughts, discoveries, and other findings.]]></description><link>https://blog.smartcoders.xyz/</link><image><url>https://blog.smartcoders.xyz/favicon.png</url><title>Smart Coders&apos; Blog</title><link>https://blog.smartcoders.xyz/</link></image><generator>Ghost 5.59</generator><lastBuildDate>Sat, 26 Jul 2025 00:13:25 GMT</lastBuildDate><atom:link href="https://blog.smartcoders.xyz/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Introducing paid integration tests]]></title><description><![CDATA[<p>Very often systems that you work on connect with external services. Some of the interactions with those are paid, some are free. Testing the free integrations is straightforward - you write tests and execute them every time you want. The only constraint here can be rate limits set by different</p>]]></description><link>https://blog.smartcoders.xyz/2021/07/12/introducing-paid-integration-tests/</link><guid isPermaLink="false">60e71aae5c55ce07d4cbc243</guid><category><![CDATA[tests]]></category><category><![CDATA[integration]]></category><category><![CDATA[external services]]></category><category><![CDATA[junit]]></category><category><![CDATA[CI]]></category><dc:creator><![CDATA[Artur Pałka]]></dc:creator><pubDate>Mon, 12 Jul 2021 12:54:29 GMT</pubDate><content:encoded><![CDATA[<p>Very often systems that you work on connect with external services. Some of the interactions with those are paid, some are free. Testing the free integrations is straightforward - you write tests and execute them every time you want. The only constraint here can be rate limits set by different providers. When it comes to the paid ones, things are more complicated (unless you have an unlimited budget of course). The simplest solution is to get around without paid ones, but sometimes they are required, especially for critical paths. When your expenses are limited, you cannot freely execute paid tests whenever you want. It must be regulated somehow by a chosen strategy.</p><h2 id="strategies">Strategies</h2><p>One of the simplest is to run those tests manually and check if the monthly budget has not been exceeded. And then do it again and again. However, this does not scale up and sounds ridiculous in the era of automation. Let&apos;s proceed to the automated strategy. By marking chosen tests, we can designate when we want to execute them. There are several options here:</p><ul><li>CRON build - run test suites every some determined period e.g. one week, ten days, etc.</li><li>the main branch build - execute tests when something is merged into it</li><li>PR build - run test suites when new changes are pushed into a PR build</li></ul><p>Depending on the established budget, you need to choose the best options that fit your needs. In our case, the main build combined with CRON every two weeks does the job well. Enough with the theory. Let&apos;s do some real-life coding. As I work mainly with Java, I will show you how to tag and filter tests using the most popular testing framework, JUnit 5.</p><h2 id="marking-and-filtering-tests">Marking and filtering tests</h2><p>We have two approaches here, one of them is to use the <code>@Tag</code> annotation. Example test:</p><pre><code>@Test
@Tag(&quot;AWS_S3&quot;) 
void upload_file_with_size_exceeding_1gb_succeeds() { }</code></pre><p>Marked tests can be filtered in the Maven Surefire plugin configuration. Sample plugin registration:</p><pre><code>&lt;plugin&gt;
    &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
    &lt;version&gt;2.20.1&lt;/version&gt;
    &lt;configuration&gt;
        &lt;groups&gt;AWS_S3&lt;/groups&gt;
    &lt;/configuration&gt;
&lt;/plugin&gt;</code></pre><p>When we want to run those suites dynamically for example: in the CI, then we must pass the <code>groups</code> parameter. &#xA0;For instance: <code>mvn test -Dgroups=AWS_S3</code>. For Gradle users, I recommend the guide for testing: <a href="https://docs.gradle.org/current/userguide/java_testing.html?ref=blog.smartcoders.xyz">https://docs.gradle.org/current/userguide/java_testing.html</a><br><br>The second option for marking tests is to create and use custom annotations. The key element here will be <code>EnabledIfSystemProperty</code><em> </em>decoration. Here is the example:</p><pre><code>@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@EnabledIfSystemProperty(named = &quot;ENABLE_PAID_TESTS&quot;, matches = &quot;(?i)true&quot;)
public @interface Paid {
}</code></pre><p>Having the annotation declared we can decorate a test using it:</p><pre><code>@Paid
@Test
public void upload_file_with_size_exceeding_1gb_succeeds() { }</code></pre><p>In the above example, we used <code>EnabledIfSystemProperty</code> which means that decorated tests will be executed only if the <code>ENABLE_PAID_TESTS</code><em> </em>variable is set to true<em>. </em>Some<em> </em>other conditions that can help us achieve the expected result are:</p><ul><li><code>EnabledIf</code></li><li><code>EnabledIfSystemProperty</code></li><li><code>DisabledIf</code></li><li><code>DisabledIfEnvironmentVariable</code></li></ul><p>I prefer the second approach because it&apos;s more readable for me, and configurable than the first one. We can also produce a more concise version of this annotation by adding the <code>@Test</code> annotation:</p><pre><code>@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@EnabledIfSystemProperty(named = &quot;enable.paid.tests&quot;, matches = &quot;(?i)true&quot;)
@Test
public @interface PaidTest {
}
</code></pre><p></p><p>I hope these techniques will help you with introducing paid tests as they helped us.<br></p>]]></content:encoded></item><item><title><![CDATA[Why speaking at a conference is a good idea...]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="even-if-the-conference-is-online-only">...even if the conference is online only</h1>
<p>Participation in the events like conferences and/or meetups was always a good idea. There are lots of articles about it eg. top ones <a href="https://curtiscoulter.com/why-do-people-attend-conferences-5-key-reasons-for-attendees-and-event-organizers/?ref=blog.smartcoders.xyz">1</a>, <a href="https://www.takeflyte.com/reasons-to-attend-conferences?ref=blog.smartcoders.xyz">2</a> or <a href="https://medium.com/swlh/attending-a-conference-is-worth-your-money-but-not-because-of-the-information-25256763b814?ref=blog.smartcoders.xyz">3</a> even the simple query gave you about ~ 150 mln results. <img src="https://blog.smartcoders.xyz/content/images/2021/05/Screenshot-2021-05-26-at-19.29.15.png" alt="Screenshot-2021-05-26-at-19.29.15" loading="lazy"></p>
<p>Ok, we are pretty sure</p>]]></description><link>https://blog.smartcoders.xyz/2021/06/02/why-speaking-at-a-conference-is-a-good-idea/</link><guid isPermaLink="false">60ae73e60e9858198a799a1c</guid><dc:creator><![CDATA[Sebastian Małyska]]></dc:creator><pubDate>Wed, 02 Jun 2021 11:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="even-if-the-conference-is-online-only">...even if the conference is online only</h1>
<p>Participation in the events like conferences and/or meetups was always a good idea. There are lots of articles about it eg. top ones <a href="https://curtiscoulter.com/why-do-people-attend-conferences-5-key-reasons-for-attendees-and-event-organizers/?ref=blog.smartcoders.xyz">1</a>, <a href="https://www.takeflyte.com/reasons-to-attend-conferences?ref=blog.smartcoders.xyz">2</a> or <a href="https://medium.com/swlh/attending-a-conference-is-worth-your-money-but-not-because-of-the-information-25256763b814?ref=blog.smartcoders.xyz">3</a> even the simple query gave you about ~ 150 mln results. <img src="https://blog.smartcoders.xyz/content/images/2021/05/Screenshot-2021-05-26-at-19.29.15.png" alt="Screenshot-2021-05-26-at-19.29.15" loading="lazy"></p>
<p>Ok, we are pretty sure about the value it brings. However, let&apos;s look closer at the topic. In short, the biggest benefit comes from people interaction. So what we got if we are in the pandemic time, where we can&apos;t meet the other people face to face. Well, I&apos;m a tester so I don&apos;t take the words for true unless I&apos;ll check them by myself. The opportunity I got was an invitation for <a href="https://a4qworldcongress.com/?ref=blog.smartcoders.xyz">A4Q World Congress</a>.<br>
A4Q is an organization that &quot;...empowering people and organizations...&quot;. It creates syllabuses that give people the ability for certification. Because of this/thanks to this, they are co-working with communities worldwide. And this was the trigger to organize something for the worldwide community. Eventually, the event was a big success, see the numbers (<a href="https://a4qworldcongress.com/highlights/?ref=blog.smartcoders.xyz">https://a4qworldcongress.com/highlights/</a>), they reached 6,8 mln people.</p>
<h1 id="how-about-the-f2f-meeting">How about the f2f meeting</h1>
<p>The organizers tried to address the communication issues a lot. One of the ideas was to use <a href="https://gather.town/?ref=blog.smartcoders.xyz">https://gather.town/</a>. Startup platform where you are becoming the avatar on the previously prepared board. When two avatars are close enough then mic and video are being launched allowing people to talk. If more people are close enough then all of them can talk. Leaving these groups your connection is being dropped. See the lobby. <img src="https://blog.smartcoders.xyz/content/images/2021/05/GatherTown_Lobby.jpg" alt="GatherTown_Lobby" loading="lazy"><br>
There was also a dedicated place for company exhibitions when you could talk with its representations.<br>
<img src="https://blog.smartcoders.xyz/content/images/2021/05/GatherTown_Exhibition-Hall_2.jpg" alt="GatherTown_Exhibition-Hall_2" loading="lazy"></p>
<p>My feedback: it was my third time when I have the opportunity to interact with gather.town. And I need to admit that only once I was able that say: good idea. The model of the whole open day is not the best idea. People were coming, sightseeing has some small chats and leaving without benefits. Thus my favorite model was about 2h meeting once per day with 1-2 short talks and an open mic option. I don&apos;t know how much important was to be part of a somehow already integrated group like mine but I have the feeling that would not change too much.</p>
<h1 id="lets-be-in-touch">Let&apos;s be in touch</h1>
<p>The second idea was pretty obvious. The organizers shared the speaker&apos;s social media. So that method was working as well as usual. Or even better :-) my LinkedIn profile was hot that day and a few after. Even now, because talks are publicly available people are coming back to talks and comments. Well I encourage you to do so as well</p>
<!--kg-card-end: markdown--><!--kg-card-begin: html--><iframe src="https://www.facebook.com/plugins/video.php?height=314&amp;href=https%3A%2F%2Fwww.facebook.com%2FA4Q.Alliance4Qualification%2Fvideos%2F1400563076950100%2F&amp;show_text=false&amp;width=560" width="560" height="314" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowfullscreen="true" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share"></iframe><!--kg-card-end: html--><!--kg-card-begin: markdown--><h1 id="takeaways">Takeaways</h1>
<p>The events especially the virtual ones are even some bigger challenges. Some methods that worked for the on-site still working fine. Some others can not be replaced &apos;one to one&apos;. People like to interact with each other but they need a guide or moderation, especially at the beginning. As a speaker, you have the same adrenaline, especially that feedback comes not only after the talk but also time after.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Using IBM Cloud AppID with WebSphere Liberty OpenID Connect Client]]></title><description><![CDATA[<p>Recently I needed to create a POC setup for a client where our software would run in a k8s cluster in IBM Cloud, and the authentication and authorization would be handled by some external user registry.</p><p>Since we&apos;re in the IBM Cloud ecosystem, I thought of <a href="https://www.ibm.com/cloud/app-id?ref=blog.smartcoders.xyz">App ID</a></p>]]></description><link>https://blog.smartcoders.xyz/2021/05/21/using-ibm-cloud-appid-with-websphere-liberty-openid-connect-client/</link><guid isPermaLink="false">60a785790e9858198a79992d</guid><dc:creator><![CDATA[Jakub Jelonek]]></dc:creator><pubDate>Fri, 21 May 2021 10:32:58 GMT</pubDate><content:encoded><![CDATA[<p>Recently I needed to create a POC setup for a client where our software would run in a k8s cluster in IBM Cloud, and the authentication and authorization would be handled by some external user registry.</p><p>Since we&apos;re in the IBM Cloud ecosystem, I thought of <a href="https://www.ibm.com/cloud/app-id?ref=blog.smartcoders.xyz">App ID</a>&#x2014;it&apos;s an IBM service, and they also provide a very handy sample for WAS Liberty! Almost too good to be true!</p><p>It was too good to be true.</p><p>The way that OIDC connect client is set up (at least for us!) along with JAX-RS (the underlying framework for our REST service) is that it takes group information from the JWT and uses annotations <code>@RolesAllowed</code> to figure out what is allowed and what is not. App ID, on the other hand, puts this information in the <code>scopes</code> claim of the JWT... I played around with it, I asked on forums, I <a href="https://duckduckgo.com/?ref=blog.smartcoders.xyz">googled</a> the hell out of it, I visited every place I could on the App ID&apos;s service on IBM Cloud, and I failed: I couldn&apos;t find any way to put the information I wanted in the token.</p><p>So I use Azure Active Directory&#x2014;that setup took 10 minutes from start to finish to set up*.</p><p>After that setup was done, I finally stumbled upon a part of the docs for App ID I missed last time around: <a href="https://cloud.ibm.com/docs/appid?topic=appid-customizing-tokens&amp;ref=blog.smartcoders.xyz">Customizing tokens</a>. It turns out you <em>can</em> customize the tokens all you want, but you need to do this via the <code>ibmcloud</code> CLI!</p><p>The final setup is more or less like this.</p><!--kg-card-begin: html--><ol>
    <li><p>Create an IBM Cloud API key for use with the CLI</p>
        <pre><code class="language-bash">API_KEY=$(ibmcloud iam api-key-create APPID)</code></pre>
    </li>
    <li><p>Obtain an IAM access token using the API key</p>
        <pre><code class="language-bash">IAM_TOKEN=$(curl -k -X POST &quot;https://iam.cloud.ibm.com/identity/token&quot; \
--header &quot;Content-Type: application/x-www-form-urlencoded&quot; \
--header &quot;Accept: application/json&quot; \
--data-urlencode &quot;grant_type=urn:ibm:params:oauth:grant-type:apikey&quot; \
--data-urlencode &quot;apikey=$API_KEY&quot;)</code></pre>
    </li>
    <li><p>Obtain your Tenant ID (e.g. from the Applications panel of App ID in IBM Cloud), store it as <code>TENANT_ID</code> environment variable.</p>
    </li>
    <li><p><a href="https://cloud.ibm.com/docs/containers?topic=containers-regions-and-zones&amp;ref=blog.smartcoders.xyz">Obtain the region</a> of your App ID instance abd store it as <code>REGION</code> enviroment variable.</p>
    </li>
    <li><p>Use curl to update the token configuration</p>
        <pre><code class="language-bash">curl -X PUT &quot;https://$REGION.appid.cloud.ibm.com/management/v4/$TENANT_ID/config/tokens&quot; -H &apos;Content-Type: application/json&apos; -H &quot;Authorization: Bearer $IAM_TOKEN&quot; -d &apos;
{
  &quot;access&quot;: {
    &quot;expires_in&quot;: 3600
  },
  &quot;refresh&quot;: {
    &quot;enabled&quot;: true,
    &quot;expires_in&quot;: 2592001
  },
  &quot;anonymousAccess&quot;: {
    &quot;enabled&quot;: false
  },
  &quot;accessTokenClaims&quot;: [
    {
      &quot;source&quot;: &quot;roles&quot;,
      &quot;destinationClaim&quot;: &quot;groupIds&quot;
    }
  ],
  &quot;idTokenClaims&quot;: [
    {
      &quot;source&quot;: &quot;roles&quot;,
      &quot;destinationClaim&quot;: &quot;groupIds&quot;
    }
  ]
}&apos;
    </code></pre>
    </li>
</ol><!--kg-card-end: html--><p>Combine that with the Open ID Connect Client configuration on the WAS Liberty side:</p><pre><code class="language-xml">&lt;openidConnectClient 
    id=&quot;appID&quot;
    clientId=&quot;${env.APP_ID_CLIENT_ID}&quot;
    clientSecret=&quot;${env.APP_ID_CLIENT_SECRET}&quot;
    authorizationEndpointUrl=&quot;https://${env.APP_ID_REGION}.appid.cloud.ibm.com/oauth/v4/${env.APP_ID_TENANT_ID}/authorization&quot;
    tokenEndpointUrl=&quot;https://${env.APP_ID_REGION}.appid.cloud.ibm.com/oauth/v4/${env.APP_ID_TENANT_ID}/token&quot;
    issuerIdentifier=&quot;https://${env.APP_ID_REGION}.appid.cloud.ibm.com/oauth/v4/${env.APP_ID_TENANT_ID}&quot;
    jwkEndpointUrl=&quot;https://${env.APP_ID_REGION}.appid.cloud.ibm.com/oauth/v4/${env.APP_ID_TENANT_ID}/publickeys&quot;
    userInfoEndpointUrl=&quot;https://${env.APP_ID_REGION}.appid.cloud.ibm.com/oauth/v4/${env.APP_ID_TENANT_ID}/userinfo&quot;
    userInfoEndpointEnabled=&quot;true&quot;
    groupIdentifier=&quot;groupIds&quot;
    realmName=&quot;appIDrealm&quot;
    authFilterRef=&quot;appIdAuthFilter&quot;
    signatureAlgorithm=&quot;RS256&quot;
/&gt;</code></pre><p>And you have a working setup!</p><p>Now you can assign access to your application:</p><pre><code class="language-xml">&lt;security-role name=&quot;reader&quot;&gt;
    &lt;group name=&quot;appid-reader&quot; access-id=&quot;group:appIDrealm/${APP_ID_READER_GROUP_NAME}&quot; /&gt;
&lt;/security-role&gt;</code></pre><p>* Not counting the bug I discovered in WAS Liberty that prevented auto-discovery feature to work.</p>]]></content:encoded></item><item><title><![CDATA[Docker on M1 Mac]]></title><description><![CDATA[<p>Using Docker on an M1 Mac for day-to-day activities is still a pain; a lot of plugins we use don&apos;t support the platform switch, and even when executed manually in the terminal, QEMU is painfully slow (I gave up after about 10 minutes of it processing the <code>db2start</code></p>]]></description><link>https://blog.smartcoders.xyz/2021/05/18/docker-on-m1-mac/</link><guid isPermaLink="false">60a38fbd0e9858198a7998ec</guid><dc:creator><![CDATA[Jakub Jelonek]]></dc:creator><pubDate>Tue, 18 May 2021 10:10:18 GMT</pubDate><content:encoded><![CDATA[<p>Using Docker on an M1 Mac for day-to-day activities is still a pain; a lot of plugins we use don&apos;t support the platform switch, and even when executed manually in the terminal, QEMU is painfully slow (I gave up after about 10 minutes of it processing the <code>db2start</code> command...). </p><p>One way to &apos;solve&apos; this, if you have an x86 computer, is to use <a href="https://docs.docker.com/engine/context/working-with-contexts/?ref=blog.smartcoders.xyz">Docker contexts</a>. The process is very simple.</p><ol><li>Make sure you have Docker running on the target machine (in my case it&apos;s my 2017 MacBook Pro)</li><li>Also make sure you have SSH (aka Remote Login) turned on on that machine</li><li>Create a context on the M1 Mac: <code>docker context create mbp --docker &quot;host=ssh://jakub@jakubs-macbook-pro-2017&quot;</code></li><li>Switch to that context: <code>docker context use mbp</code></li></ol><p>You <em>should</em> be able to do <code>docker ps</code>, and that <em>should</em> show you the running containers on the target machine.</p><p>On my setup (which is the default, I suppose), I immediately encountered a problem:</p><pre><code class="language-bash">error during connect: Post &quot;http://docker/v1.24/build?buildargs=%7B%7D&amp;cachefrom=%5B%5D&amp;cgroupparent=&amp;cpuperiod=0&amp;cpuquota=0&amp;cpusetcpus=&amp;cpusetmems=&amp;cpushares=0&amp;dockerfile=Dockerfile&amp;labels=%7B%7D&amp;memory=0&amp;memswap=0&amp;networkmode=default&amp;rm=1&amp;shmsize=0&amp;target=&amp;ulimits=null&amp;version=1&quot;: command [ssh -l jakub -- jakubs-macbook-pro-2017 docker system dial-stdio] has exited with exit status 127, please make sure the URL is valid, and Docker 18.09 or later is installed on the remote host: stderr=zsh:1: command not found: docker</code></pre><p>Err... ok... command not found...? The problem was that when connecting via SSH, by default, the <code>PATH</code> is just <code>/usr/bin:/bin:/usr/sbin:/sbin</code>. To change it, I needed to modify <code>/etc/ssh/sshd_config</code> by enabling user environments: <code>PermitUserEnvironment yes</code>, and modifying the value of <code>PATH</code> in <code>~/.ssh/environment</code> to include <code>/usr/local/bin</code>.</p><p>That made the whole setup work, and my old Mac is still useful, while not sounding like a jet taking off (and it can be kept away in the laundry room).</p>]]></content:encoded></item><item><title><![CDATA[Office]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>So we have an office now.</p>
<p>My co-founder and I have been working remotely for more than eight years and for three at Smart Coders.</p>
<p>That&apos;s quite a change, and there are a few reasons for it, some of them are driven by our clients.<br>
Anyways, we&apos;</p>]]></description><link>https://blog.smartcoders.xyz/2019/01/05/office/</link><guid isPermaLink="false">5c30d927fb552f0449eeecc5</guid><dc:creator><![CDATA[Błażej Pawlak]]></dc:creator><pubDate>Sat, 05 Jan 2019 16:33:27 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>So we have an office now.</p>
<p>My co-founder and I have been working remotely for more than eight years and for three at Smart Coders.</p>
<p>That&apos;s quite a change, and there are a few reasons for it, some of them are driven by our clients.<br>
Anyways, we&apos;re just getting started, and we still would like to keep the remote-first vibe in our little family, so eventually we&apos;d like our office to be rather a place we can drop-in to have some peace of mind or just to meet in a comfy physical place.<br>
Things one might not be able to get in a regular co-working space.<br>
Another reason is to have desing meetings (both engineering and UX), which proved to be rather hard to have in a remote fashion.</p>
<p>Let&apos;s see where this takes us.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[One step closer to abandoning time changes twice a year in the EU]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The Guardian <a href="https://www.theguardian.com/world/2018/aug/31/eu-recommend-member-states-abolish-daylight-saving-time?ref=blog.smartcoders.xyz">writes</a>:</p>
<blockquote>
<p>The European commission will recommend that EU member states abandon the practice of changing the clocks in spring and autumn, with many people in favour of staying on summer time throughout the year.</p>
</blockquote>
<p>Apparently 80% of 4.6 million respondents in an official consultation favored staying on</p>]]></description><link>https://blog.smartcoders.xyz/2018/09/01/one-step-closer-to/</link><guid isPermaLink="false">5b8a56fd7da105044007a4cc</guid><dc:creator><![CDATA[Jakub Jelonek]]></dc:creator><pubDate>Sat, 01 Sep 2018 09:36:02 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>The Guardian <a href="https://www.theguardian.com/world/2018/aug/31/eu-recommend-member-states-abolish-daylight-saving-time?ref=blog.smartcoders.xyz">writes</a>:</p>
<blockquote>
<p>The European commission will recommend that EU member states abandon the practice of changing the clocks in spring and autumn, with many people in favour of staying on summer time throughout the year.</p>
</blockquote>
<p>Apparently 80% of 4.6 million respondents in an official consultation favored staying on summer time all year round.</p>
<p>I would like to see some studies (other than the experiment in Russia a few years ago) about permanent summer vs. winter time.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Anywhere Workers]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>An interesting and very well presented <a href="https://www.and.co/anywhere-workers?ref=blog.smartcoders.xyz">study</a> from <a href="https://www.and.co/?ref=blog.smartcoders.xyz">AND CO</a> about remote work. Being a remote worker myself, on and off, for a number of years now, I find their study to be a great inspiration for some introspection.</p>
<blockquote>
<p>Those who&#x2019;ve worked remotely for 7+ years were far</p></blockquote>]]></description><link>https://blog.smartcoders.xyz/2018/08/24/anywhere-workers/</link><guid isPermaLink="false">5b7fa5867da105044007a4b9</guid><category><![CDATA[remote work]]></category><category><![CDATA[introspective]]></category><dc:creator><![CDATA[Jakub Jelonek]]></dc:creator><pubDate>Fri, 24 Aug 2018 07:20:58 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>An interesting and very well presented <a href="https://www.and.co/anywhere-workers?ref=blog.smartcoders.xyz">study</a> from <a href="https://www.and.co/?ref=blog.smartcoders.xyz">AND CO</a> about remote work. Being a remote worker myself, on and off, for a number of years now, I find their study to be a great inspiration for some introspection.</p>
<blockquote>
<p>Those who&#x2019;ve worked remotely for 7+ years were far more likely to intend on working remotely forever than those who are freshly remote (0-1yrs). Respondents who&#x2019;ve worked remotely for under a year are more likely (9%) to find it difficult to stay motivated without a boss looking over their shoulder than long-term remotes (4%).</p>
</blockquote>
<p>While I <em>love</em> it now, I wasn&apos;t a big fan of working from home at the beginning. I liked the idea, but I wasn&apos;t very good at it; the multitude of distractions at home were too big of an issue, I just couldn&apos;t concentrate. After an uproductive day, I felt <em>worse</em> if it happened while working from home, than if I had worked at the office.</p>
<p>The breaking point for me came when I didn&apos;t have a choice&#x2014;I moved to Taiwan for 2 months, and going to the office wasn&apos;t an option anymore. Like with a flip of a switch, I found that a routine (an oh-so-important aspect of a regular day for me!) of going to a Starbucks, setting up, <strong>working hard for 8 hours</strong>, and shutting down my computer at the end, was the recipe I was missing.</p>
<p>Truly shutting down at the end of the day turned out to be the next challenge, further exacerbated by the fact that Taipei was 6 hours ahead of Copenhagen, so the end of the day for me was the beginning of my colleagues&apos;. Our daily scrum was the beginning of the day for them, and a sign-off for me. Making exercise a top priority helped with that&#x2014;I really needed to go for a run before dinner!</p>
<p>The most difficult and frustrating aspect of working remotely&#x2014;in an environment where most still work from a single office&#x2014;has been, over the years, that a lot of things are established at the water cooler, away from Slack or any other online tools, and I have to put in way more effort to be a part of all important discussions.</p>
<p>But my colleagues are more and more accustomed to a remote way of working, and we&apos;re all more empathic towards the challenges that remote work poses to both remote and co-located workers.</p>
<p>And empathy is probably the most important trait of any co-worker, sharing an office or not.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[assertTrue vs assertThat vs assertJ]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>A while ago we&#x2019;ve participated in a discussion about the pros and cons of using <code>assertJ</code> and <code>assertThat</code> over <code>assertTrue</code><sup>1</sup>.</p>
<p>We&#x2019;ve heard some arguments against using <code>assertThat</code> and <code>assertJ</code> that we really did not anticipate (e.g. a dev expressed that he prefers to see</p>]]></description><link>https://blog.smartcoders.xyz/2018/02/14/asserttrue-vs-assertthat-vs-assertj/</link><guid isPermaLink="false">5a84a0bd9fbd57d172d4ee45</guid><category><![CDATA[Java]]></category><category><![CDATA[unit tests]]></category><category><![CDATA[testing]]></category><dc:creator><![CDATA[Jakub Jelonek]]></dc:creator><pubDate>Wed, 14 Feb 2018 07:47:39 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>A while ago we&#x2019;ve participated in a discussion about the pros and cons of using <code>assertJ</code> and <code>assertThat</code> over <code>assertTrue</code><sup>1</sup>.</p>
<p>We&#x2019;ve heard some arguments against using <code>assertThat</code> and <code>assertJ</code> that we really did not anticipate (e.g. a dev expressed that he prefers to see exactly what methods are being tested, as opposed to relying on auto generated code). We&#x2019;ve given examples and arguments of why <code>assertTrue</code> is inferior to the two other methods, but we couldn&#x2019;t quite convince <code>assertTrue</code> supporters.</p>
<p>Recently, after being affected by a test written using <code>assertTrue</code>, I&apos;ve decided to</p>
<h2 id="firstalittlebackstory">First, a little back story</h2>
<p>I&apos;ve just merged changes made on <code>develop</code> into my own branch. I&apos;ve noticed that a couple of things weren&apos;t compiling, so I went ahead and fixed them. The issues with compilation were fine, because I changed the return type of a method from <code>String</code> (that was a hex-encoded <code>byte[]</code>) to <code>byte[]</code>.</p>
<p>After making some code fixes, I ran the tests (which also needed slight tweaking), and got a failure.</p>
<h2 id="thetests">The Tests</h2>
<h3 id="asserttrue">Assert True</h3>
<p>Observe the following test method, written using assertTrue:</p>
<pre><code class="language-java">@Test
public void get_public_key_hash_returns_hex_encoded_sha256_assertTrue() {
  // get the public key hash
  CryptoSystemApiDelegate api = new CryptoSystemApiDelegate(ivCryptoApiLifeCycle, ivApiKeyVerifier);
  Response res = api.getPublicKeyHash(API_KEY, null);
  Object entity = res.getEntity();

  // test the hash
  Assert.assertNotNull(entity);
  Assert.assertTrue(entity instanceof PublicKeyHash);
  PublicKeyHash pubKeyHash = (PublicKeyHash) entity;
  Assert.assertTrue(&quot;PublicKeyHash.algorithm is not SHA-256&quot;, pubKeyHash.getAlgorithm().toString().equals(&quot;SHA-256&quot;));
  Assert.assertTrue(&quot;PublicKeyHash.value is null.&quot;, pubKeyHash.getValue() != null);
  Assert.assertTrue(&quot;Public Key Hash Value is not a SHA-256 value&quot;, pubKeyHash.getValue().length == 64); // Hex Encoded SHA-256 is 64 chars
}
</code></pre>
<p>and the output it produced:</p>
<pre><code class="language-java">java.lang.AssertionError: Public Key Hash Value is not a SHA-256 value

at
xyz.smartcoders.CryptoApiLifeCycleIT.get_public_key_hash_returns_hex_encoded_sha256_assertTrue(CryptoApiLifeCycleIT.java:94)
</code></pre>
<p>Ok... what the hell does it mean that it&apos;s not a SHA-256 value?!? What does that mean? The way to find out? <em>Debug</em>. What does it cost? <strong>Time</strong>.</p>
<p>In an attempt to learn more (and to have a better insight to see if there&apos;s qualitative improvement in using different approaches), I&apos;ve rewritten the test using <code>assertThat</code> and <code>assertJ</code>.</p>
<h3 id="assertthat">Assert That</h3>
<p>Now observe output of a modified test method, written using <code>assertThat</code>:</p>
<pre><code class="language-java">@Test
public void get_public_key_hash_returns_hex_encoded_sha256_assertThat() {
  // get the public key hash
  CryptoSystemApiDelegate api = new CryptoSystemApiDelegate(ivCryptoApiLifeCycle, ivApiKeyVerifier);
  Response res = api.getPublicKeyHash(API_KEY, null);
  Object entity = res.getEntity();

  assertThat(entity, is(instanceOf(PublicKeyHash.class)));

  PublicKeyHash pubKeyHash = (PublicKeyHash) entity;

  assertThat(pubKeyHash.getAlgorithm(), equalTo(&quot;SHA-256&quot;));
  assertThat(pubKeyHash.getValue(), notNullValue());
  assertThat(pubKeyHash.getValue().length, equalTo(64));
}
</code></pre>
<p>and the output it produced:</p>
<pre><code class="language-java">java.lang.AssertionError: 
Expected: &lt;64&gt;
     but: was &lt;32&gt;

at xyz.smartcoders.CryptoApiLifeCycleIT.get_public_key_hash_returns_hex_encoded_sha256_assertThat(CryptoApiLifeCycleIT.java:115)
</code></pre>
<p>Bingo! That&apos;s more like it! The returned value is 32 bytes long, not 64 as was expected! Because it&apos;s not hex-encoded anymore, it&apos;s just a byte array, so the value is 32 bytes long, indeed!</p>
<p>That&apos;s already enough to quickly figure out what&apos;s wrong, and how to fix it.</p>
<h3 id="assertj">AssertJ</h3>
<p>To get a better picture of what I could expect from <code>assertJ</code>, I&apos;ve decided to write the same test using just that.</p>
<pre><code class="language-java">@Test
public void get_public_key_hash_returns_hex_encoded_sha256_assertj() {
  // get the public key hash
  CryptoSystemApiDelegate api = new CryptoSystemApiDelegate(ivCryptoApiLifeCycle, ivApiKeyVerifier);
  Response res = api.getPublicKeyHash(API_KEY, null);

  Object entity = res.getEntity();

  assertThat(entity, is(instanceOf(PublicKeyHash.class)));

  PublicKeyHash publicKeyHash = (PublicKeyHash) entity;

  PublicKeyHashExtendedAssert.assertThat(publicKeyHash)
    .hasAlgorithm(&quot;SHA-256&quot;)
    .hasValueWithLength(64);
}
</code></pre>
<p>Let&apos;s pause here for a moment, before looking at the output. Looking at the code, you immediately see that you&apos;re expecting the public key hash to be a 64-byte long SHA-256 value! With so little code! And just take a look at the output it produces:</p>
<pre><code class="language-java">java.lang.AssertionError:
Expected size:&lt;64&gt; but was:&lt;32&gt; in:
  &lt;[-63, -17, 64, -6, 41, -75, -40, 75, 74, 89, 35, -12, 81, 91, 97, 47, 47, -21, -77, 32, -41, -30, -106, 26, 50, -65, 69, -94, -1, -55, 96, -65]&gt;

at xyz.smartcoders.CryptoApiLifeCycleIT.get_public_key_hash_returns_hex_encoded_sha256_assertj(CryptoApiLifeCycleIT.java:135)
</code></pre>
<p>The output is just as useful as that of <code>assertThat</code>, but it also provides the <code>byte[]</code> that was being tested. While in this case it&apos;s not very useful, as the value is random, it might be very handy in other tests!</p>
<h2 id="conclusions">Conclusions</h2>
<p>I think that this demonstrates, beyond any doubt, in my mind, that <code>assertTrue</code> is by far the worst, giving you the least context. <code>assertTrue</code> also heavily depends on the developer correctly and clearly expressing what is being tested. If the description is not clear, the result of the test will not give you any indication about what&apos;s wrong at best. At worst, it&apos;ll confuse the heck out of you.</p>
<p><code>assertThat</code> is far better; it&apos;s good enough to quickly figure out what&apos;s wrong. The description is provided by the framework, so the developer doesn&apos;t need to spend time writing potentially confusing messages.</p>
<p><code>assertJ</code> is by far the best. It&apos;s not only concise in expressing expectations, but also in providing the most context to facilitate quick and painless fix.</p>
<h6 id="footnote">Footnote</h6>
<p>If you say that I should have thought about changing the expected length of the public key hash from <code>64</code> to <code>32</code> upon changing encoding&#x2014;you&apos;re right! I&apos;m sure you would&apos;ve caught it and it wouldn&apos;t be an issue. But I&apos;m not that good; I&apos;ll take any help I can get to fix things quickly.</p>
<ol>
<li>I need to underline that my gripe is with the abuse of <code>assertTrue</code> for <em>all</em> assertions in test code. I&apos;m not saying that <code>assertTrue</code> is not the way to go when testing boolean values. What prompted me to write this was the proliferation of tests written using <code>assertTrue</code> exclusively.</li>
</ol>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Could it be the beginning of the end of DST in Europe?]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Ars Technica <a href="https://arstechnica.com/tech-policy/2018/02/daylight-saving-time-isnt-worth-it-european-parliament-ministers-say/?ref=blog.smartcoders.xyz">reports</a>:</p>
<blockquote>
<p>Earlier this week the European Parliament voted 384 to 153 to review whether Daylight Saving Time is actually worth it. Although the resolution it voted on was non-binding, the majority reflected a growing dissatisfaction with a system that has been used by the US, Canada, most of</p></blockquote>]]></description><link>https://blog.smartcoders.xyz/2018/02/12/could-it-be-the-beginning-of-the-end-of-dst-in-europe/</link><guid isPermaLink="false">5a84a0bd9fbd57d172d4ee44</guid><category><![CDATA[random]]></category><dc:creator><![CDATA[Jakub Jelonek]]></dc:creator><pubDate>Mon, 12 Feb 2018 14:14:17 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Ars Technica <a href="https://arstechnica.com/tech-policy/2018/02/daylight-saving-time-isnt-worth-it-european-parliament-ministers-say/?ref=blog.smartcoders.xyz">reports</a>:</p>
<blockquote>
<p>Earlier this week the European Parliament voted 384 to 153 to review whether Daylight Saving Time is actually worth it. Although the resolution it voted on was non-binding, the majority reflected a growing dissatisfaction with a system that has been used by the US, Canada, most of Europe, and regions in Asia, Africa, and South America for decades.</p>
</blockquote>
<p>While I <em>feel</em> that we should settle on summer time (not winter time), it&#x2019;s not as clear cut as I thought it would be:</p>
<blockquote>
<p>Still, it seems that choosing whether to stick with winter time or summer time is key in a transition away from Daylight Saving Time. Years ago, Russia tried to go on permanent summer time, but changed to permanent winter time in 2014 after the summer-time-in-winter change gave people stress and health problems when it stayed darker for longer during winter mornings, according to the BBC.</p>
</blockquote>
<p>I hope that <a href="https://en.wikipedia.org/wiki/Betteridge%27s_law_of_headlines?ref=blog.smartcoders.xyz">Betteridge&#x2019;s law of headlines</a> doesn&#x2019;t provide the answer.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Continuous Authentication]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Rich Mogul, writing for <a href="https://securosis.com/blog/face-id-is-the-future-of-security-authentication?ref=blog.smartcoders.xyz">Securosis</a>:</p>
<blockquote>
<p>Apple didn&#x2019;t just throw a facial recognition sensor into the iPhone and replace a fingerprint sensor &#x2013; they <em>enabled a new security modality</em>. I call this &#x201C;continuous authentication&#x201D;.</p>
</blockquote>
<p>I&#x2019;ve been thinking about it ever since getting the new iPhone</p>]]></description><link>https://blog.smartcoders.xyz/2017/11/19/continuous-authentication/</link><guid isPermaLink="false">5a84a0bd9fbd57d172d4ee42</guid><dc:creator><![CDATA[Jakub Jelonek]]></dc:creator><pubDate>Sun, 19 Nov 2017 04:08:09 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Rich Mogul, writing for <a href="https://securosis.com/blog/face-id-is-the-future-of-security-authentication?ref=blog.smartcoders.xyz">Securosis</a>:</p>
<blockquote>
<p>Apple didn&#x2019;t just throw a facial recognition sensor into the iPhone and replace a fingerprint sensor &#x2013; they <em>enabled a new security modality</em>. I call this &#x201C;continuous authentication&#x201D;.</p>
</blockquote>
<p>I&#x2019;ve been thinking about it ever since getting the new iPhone X. The way Apple implemented integration between parts of iOS and FaceID shows a level of attention to detail unseen in other companies, and a great security design overall.</p>
<p>Via <a href="https://daringfireball.net/linked/2017/11/15/mogull-face-id-continuous-authentication-?ref=blog.smartcoders.xyz">Daring Fireball</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Working only with iOS]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I&#x2019;ve been on vacation* since Friday afternoon, but I didn&#x2019;t manage to close everything that needed to be closed before leaving. My wife also needed to finish some things for work, so both of us spent Monday and a chunk of Tuesday working. My wife came</p>]]></description><link>https://blog.smartcoders.xyz/2017/11/14/working-only-with-ios/</link><guid isPermaLink="false">5a84a0bd9fbd57d172d4ee41</guid><dc:creator><![CDATA[Jakub Jelonek]]></dc:creator><pubDate>Tue, 14 Nov 2017 04:47:23 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>I&#x2019;ve been on vacation* since Friday afternoon, but I didn&#x2019;t manage to close everything that needed to be closed before leaving. My wife also needed to finish some things for work, so both of us spent Monday and a chunk of Tuesday working. My wife came better prepared; she came with her laptop, since she&#x2019;ll be going to a conference straight from our vacation, 3 weeks from now.</p>
<p>I made a conscious choice of not taking my laptop with me. I only came with my iPhone and iPad.</p>
<p>This is the first time I actually needed to get things done using only my iOS devices, and they passed the test with flying colors! Thanks to IBM&#x2019;s embrace of GitHub Enterprise, Slack, Bluemix, and Box, I was able to access all my files, code, and talk to my colleagues without a hitch.</p>
<p>I did not do any coding, but I did review some PRs, comment on and close some issues, and update some wiki entries.</p>
<p>What I&#x2019;ll need to make it even better in he future is a keyboard; the virtual one takes up too much of the screen.</p>
<p>*No one said work-life balance was easy, especially when you care about the project.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Maven Release Plugin and Jazz SCM: Prepare]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The <a href="http://jazz.net/?ref=blog.smartcoders.xyz">Jazz</a> <code>scm</code> command does not seem to play nice with <code>maven-release-plugin</code>.</p>
<p>When doing a <code>mvn release:prepare</code>, things are going fine, until, at the very end, Maven returns a build failure:</p>
<pre><code>Error code for Jazz SCM deliver command - 53
</code></pre>
<p>After a <a href="https://duckduckgo.com/?q=Error+code+for+Jazz+SCM+deliver+command+-+53&amp;ref=blog.smartcoders.xyz">quick internet search</a>, it <a href="https://www.ibm.com/support/knowledgecenter/SSYMRC_6.0.3/com.ibm.team.scm.doc/topics/r_scm_cli_retcodes.html?ref=blog.smartcoders.xyz">turned out</a> that</p>]]></description><link>https://blog.smartcoders.xyz/2017/03/23/maven-release-plugin-and-jazz-scm-prepare/</link><guid isPermaLink="false">5a84a0bd9fbd57d172d4ee3b</guid><category><![CDATA[jazz]]></category><category><![CDATA[rtc]]></category><category><![CDATA[devops]]></category><category><![CDATA[maven]]></category><dc:creator><![CDATA[Jakub Jelonek]]></dc:creator><pubDate>Thu, 23 Mar 2017 14:33:32 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>The <a href="http://jazz.net/?ref=blog.smartcoders.xyz">Jazz</a> <code>scm</code> command does not seem to play nice with <code>maven-release-plugin</code>.</p>
<p>When doing a <code>mvn release:prepare</code>, things are going fine, until, at the very end, Maven returns a build failure:</p>
<pre><code>Error code for Jazz SCM deliver command - 53
</code></pre>
<p>After a <a href="https://duckduckgo.com/?q=Error+code+for+Jazz+SCM+deliver+command+-+53&amp;ref=blog.smartcoders.xyz">quick internet search</a>, it <a href="https://www.ibm.com/support/knowledgecenter/SSYMRC_6.0.3/com.ibm.team.scm.doc/topics/r_scm_cli_retcodes.html?ref=blog.smartcoders.xyz">turned out</a> that error code 53 &quot;Indicates that a deliver succeeded, but there were no changes to deliver to the repository&quot;.</p>
<p>Well... ok...</p>
<p>Luckily, the Jazz <code>scm</code> command is nothing more than a shell script! So it was very easy to change that &quot;error code that means success&quot; into an actual 0 that Maven expects from successful executions:</p>
<pre><code class="language-bash">if [ &quot;$USE_NATIVE&quot; = &quot;1&quot; ]; then
    &quot;${PRGPATH}/fec&quot; &quot;$@&quot;
else
    java -classpath &quot;${PRGPATH}/plugins/com.ibm.team.filesystem.cli.minimal_3.1.600.v20140108_0240.jar:${PRGPATH}/plugins/com.ibm.team.rtc.cli.infrastructure_3.1.800.v20140619_0246.jar:${PRGPATH}/plugins/com.ibm.team.filesystem.cli.core_3.2.400.v20141011_0139.jar:${PRGPATH}/plugins/com.ibm.team.filesystem.client.daemon_3.1.500.v20130930_0113.jar:${PRGPATH}/plugins/org.eclipse.equinox.common_3.6.0.v20100503.jar:${PRGPATH}/plugins/com.ibm.team.filesystem.client_3.2.400.v20141015_1622.jar:${PRGPATH}/plugins/org.eclipse.osgi_3.6.50.R36x_v20120315-1500.jar:${PRGPATH}/plugins/com.ibm.team.repository.common_1.4.200.v20141015_2351.jar&quot; com.ibm.team.filesystem.cli.minimal.client.FrontEndClient &quot;$0&quot; &quot;$@&quot;
fi
</code></pre>
<p>required addition of just a couple of lines right below:</p>
<pre><code class="language-bash">RESULT=$?

if [[ $RESULT -eq 53 || $RESULT -eq 52 ]]; then
  exit 0
else
  exit $RESULT
fi
</code></pre>
<p>And that&apos;s it! The <code>mvn release:prepare</code> command completes successfully.</p>
<p>Unfortunately, running <code>mvn release:perform</code> yields yet another error, that I&apos;ll discuss some other day.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[AMD is Back with Ryzen]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Ian Cuttress for Anandtech:</p>
<blockquote>
<p>Price for Performance is still one of AMD&apos;s strong points. For the multitude of tests where that $499 1800X is able to match or beat a $1049 i7-6900K, it directly translates to a 2x in price/performance.</p>
</blockquote>
<p>Other processors have a smaller price/performance</p>]]></description><link>https://blog.smartcoders.xyz/2017/03/03/amd-is-back-with-ryzen/</link><guid isPermaLink="false">5a84a0bd9fbd57d172d4ee36</guid><category><![CDATA[Linked List]]></category><category><![CDATA[intel]]></category><category><![CDATA[amd]]></category><dc:creator><![CDATA[Jakub Jelonek]]></dc:creator><pubDate>Fri, 03 Mar 2017 11:24:55 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Ian Cuttress for Anandtech:</p>
<blockquote>
<p>Price for Performance is still one of AMD&apos;s strong points. For the multitude of tests where that $499 1800X is able to match or beat a $1049 i7-6900K, it directly translates to a 2x in price/performance.</p>
</blockquote>
<p>Other processors have a smaller price/performance ratios, but they&apos;re still giving Intel a run for its money.</p>
<p>It&apos;s good to see competition in the x86 CPU space again. Looking forward to future updates.</p>
<p>Source: <a href="http://www.anandtech.com/show/11170/the-amd-zen-and-ryzen-7-review-a-deep-dive-on-1800x-1700x-and-1700?ref=blog.smartcoders.xyz">anandtech.com</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Server Timeout in Eclipse]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>When you&apos;re hit with a server startup timeout in Eclipse, suggesting you should increase the value, it&apos;s actually Eclipse&apos;s setting, not the server&apos;s. You can change it in the server&#x2019;s settings in Eclipse:<br>
<img src="https://blog.smartcoders.xyz/content/images/2017/03/Screen-Shot-2017-03-01-at-13.34.54.png" alt loading="lazy"></p>
<!--kg-card-end: markdown-->]]></description><link>https://blog.smartcoders.xyz/2017/03/01/server-timeout-in-eclipse/</link><guid isPermaLink="false">5a84a0bd9fbd57d172d4ee32</guid><category><![CDATA[eclipse]]></category><category><![CDATA[server]]></category><category><![CDATA[setting]]></category><dc:creator><![CDATA[Jakub Jelonek]]></dc:creator><pubDate>Wed, 01 Mar 2017 12:38:07 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>When you&apos;re hit with a server startup timeout in Eclipse, suggesting you should increase the value, it&apos;s actually Eclipse&apos;s setting, not the server&apos;s. You can change it in the server&#x2019;s settings in Eclipse:<br>
<img src="https://blog.smartcoders.xyz/content/images/2017/03/Screen-Shot-2017-03-01-at-13.34.54.png" alt loading="lazy"></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[That was Fast]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>The two PDF files shared as proof of the attack can be considered weapons:</p>
<blockquote>
<p>[...] <a href="https://bugs.webkit.org/show_bug.cgi?id=168774&amp;ref=blog.smartcoders.xyz#c23%3CPaste%3E">SHA-1 colliding files are currently breaking SVN repositories</a>. Subversion servers use SHA-1 for deduplication and repositories become corrupted when two colliding files are committed to the repository. This has been discovered in WebKit&apos;s Subversion</p></blockquote>]]></description><link>https://blog.smartcoders.xyz/2017/02/25/that-was-fast/</link><guid isPermaLink="false">5a84a0bd9fbd57d172d4ee2e</guid><category><![CDATA[crypto]]></category><category><![CDATA[hash]]></category><category><![CDATA[sha-1]]></category><dc:creator><![CDATA[Jakub Jelonek]]></dc:creator><pubDate>Sat, 25 Feb 2017 08:54:25 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>The two PDF files shared as proof of the attack can be considered weapons:</p>
<blockquote>
<p>[...] <a href="https://bugs.webkit.org/show_bug.cgi?id=168774&amp;ref=blog.smartcoders.xyz#c23%3CPaste%3E">SHA-1 colliding files are currently breaking SVN repositories</a>. Subversion servers use SHA-1 for deduplication and repositories become corrupted when two colliding files are committed to the repository. This has been discovered in WebKit&apos;s Subversion repository and independently confirmed by us. We noticed that in some cases, due to the corruption, further commits are blocked.</p>
</blockquote>
<p>Via <a href="https://shattered.io/?ref=blog.smartcoders.xyz">shattered.io</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>