<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Agis Anastasopoulos</title>
    <link>https://agis.io/</link>
    <description>Recent content on Agis Anastasopoulos</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <copyright>&amp;copy; 2026 Agis Anastasopoulos</copyright>
    <lastBuildDate>Fri, 23 Aug 2019 11:39:01 +0000</lastBuildDate>
    <atom:link href="https://agis.io/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Speeding Up Our Build Pipelines</title>
      <link>https://agis.io/post/speeding-up-builds/</link>
      <pubDate>Fri, 23 Aug 2019 11:39:01 +0000</pubDate>
      <guid>https://agis.io/post/speeding-up-builds/</guid>
      <description>&lt;p&gt;A cross-post from the Skroutz Engineering blog, showing how we optimized&#xA;our build pipelines and introducing &lt;a href=&#34;https://github.com/skroutz/mistry&#34;&gt;mistry&lt;/a&gt;,&#xA;a general-purpose build server.&lt;/p&gt;&#xA;&lt;p&gt;Read the article &lt;a href=&#34;https://engineering.skroutz.gr/blog/speeding-up-build-pipelines-with-mistry/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Slides from &#34;Go at Skroutz&#34; talk</title>
      <link>https://agis.io/post/go-at-skroutz/</link>
      <pubDate>Wed, 13 Mar 2019 00:00:00 +0000</pubDate>
      <guid>https://agis.io/post/go-at-skroutz/</guid>
      <description>&lt;p&gt;Following are the slides of a talk I gave at the &lt;a href=&#34;https://www.meetup.com/Athens-Gophers/events/258725366/&#34;&gt;4th Athens Gopher Meetup&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;At a glance we present:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;why we introduced a new language in the organization and why that&#xA;was Go&lt;/li&gt;&#xA;&lt;li&gt;how we approached the transition&lt;/li&gt;&#xA;&lt;li&gt;some of the projects we built in Go&lt;/li&gt;&#xA;&lt;li&gt;the challenges we faced and the lessons we learned in the process&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;br /&gt;&#xA;&lt;iframe src=&#34;//www.slideshare.net/slideshow/embed_code/key/yInEJ3aviP68m3&#34; width=&#34;595&#34; height=&#34;485&#34; frameborder=&#34;0&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; scrolling=&#34;no&#34; style=&#34;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&#34; allowfullscreen&gt;&lt;/iframe&gt;&#xA;&lt;p&gt;You can also &lt;a href=&#34;https://agis.io/go_at_skroutz.pdf&#34;&gt;download the slides&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introducing Kafka to a monolithic Rails application</title>
      <link>https://agis.io/post/kafka-rails-integration/</link>
      <pubDate>Mon, 16 Apr 2018 00:00:00 +0000</pubDate>
      <guid>https://agis.io/post/kafka-rails-integration/</guid>
      <description>&lt;p&gt;A cross-post from the Skroutz Engineering blog, showing how we introduced&#xA;Kafka to our large, monolithic Rails codebase.&lt;/p&gt;&#xA;&lt;p&gt;Read the article &lt;a href=&#34;https://engineering.skroutz.gr/blog/kafka-rails-integration/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rewriting an analytics tracking service in Go</title>
      <link>https://agis.io/post/rewriting-analytics-service-golang/</link>
      <pubDate>Sun, 02 Jul 2017 00:00:00 +0000</pubDate>
      <guid>https://agis.io/post/rewriting-analytics-service-golang/</guid>
      <description>&lt;p&gt;A cross-post from the Skroutz Engineering blog, showing how we spawned&#xA;a Go microservice from a big Rails monolith and the challenges we faced along&#xA;the way.&lt;/p&gt;&#xA;&lt;p&gt;Read the article &lt;a href=&#34;https://engineering.skroutz.gr/blog/rewriting-web-analytics-tracking-in-go/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Contiguous stacks in Go</title>
      <link>https://agis.io/post/contiguous-stacks-golang/</link>
      <pubDate>Sun, 23 Mar 2014 00:00:00 +0000</pubDate>
      <guid>https://agis.io/post/contiguous-stacks-golang/</guid>
      <description>&lt;p&gt;Lately I&amp;rsquo;ve been messing with Go and I really like it. The 1.3 release is &lt;a href=&#34;http://talks.golang.org/2014/go1.3.slide#2&#34;&gt;due in June 2014&lt;/a&gt; and among other &lt;a href=&#34;https://docs.google.com/document/d/1s6MxBsLyBG45SRS60a-aM01DmZ4hD1nMzGAKdTopKGY/edit&#34;&gt;performance improvements&lt;/a&gt;, the runtime will implement &lt;a href=&#34;http://golang.org/s/contigstacks&#34;&gt;&lt;em&gt;contiguous&lt;/em&gt; stacks&lt;/a&gt;. Let&amp;rsquo;s see what this is about.&lt;/p&gt;&#xA;&lt;h2 id=&#34;segmented-stacks&#34;&gt;Segmented stacks&lt;/h2&gt;&#xA;&lt;p&gt;The 1.2 runtime uses &lt;em&gt;segmented stacks&lt;/em&gt;, also known as &lt;em&gt;split stacks&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In this approach, stacks are discontiguous and grow incrementally.&lt;/p&gt;&#xA;&lt;p&gt;Each stack starts with a single &lt;em&gt;segment&lt;/em&gt;. When the stack needs to grow, another segment is allocated and linked to the previous one, and so forth. Each stack is effectively a doubly linked list of one or more segments.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dabbling in Erlang, part 2: A minimal introduction</title>
      <link>https://agis.io/post/dabbling-in-erlang-a-minimal-introduction/</link>
      <pubDate>Sat, 12 Oct 2013 00:00:00 +0000</pubDate>
      <guid>https://agis.io/post/dabbling-in-erlang-a-minimal-introduction/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s been a while since the &lt;a href=&#34;https://agis.io/post/dabbling-in-erlang-a-minimal-introduction/&#34;&gt;last post&lt;/a&gt; which was a short introduction into functional programming in general and now it&amp;rsquo;s time to dive into some of the basic concepts of the language.&lt;/p&gt;&#xA;&lt;h2 id=&#34;single-assignment--pattern-matching&#34;&gt;Single assignment &amp;amp; pattern matching&lt;/h2&gt;&#xA;&lt;p&gt;In Erlang we should think variables in a mathematical sense of the term, which means that &lt;em&gt;once you&amp;rsquo;ve bound a variable, you cannot change its value&lt;/em&gt; . If you state that &lt;code&gt;X&lt;/code&gt; is &lt;code&gt;5&lt;/code&gt;, then it will always be &lt;code&gt;5&lt;/code&gt; (a variable is called &lt;em&gt;bound&lt;/em&gt; if already contains a value, &lt;em&gt;unbound&lt;/em&gt; otherwise):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dabbling in Erlang, part 1: Hello function</title>
      <link>https://agis.io/post/dabbling-in-erlang-hello-function/</link>
      <pubDate>Sun, 19 May 2013 00:00:00 +0000</pubDate>
      <guid>https://agis.io/post/dabbling-in-erlang-hello-function/</guid>
      <description>&lt;p&gt;Recently I&amp;rsquo;ve been dabbling in Erlang and I&amp;rsquo;m enjoying it a lot. I decided to start a series of posts in which I&amp;rsquo;ll address things that I believe are worth mentioning.&lt;/p&gt;&#xA;&lt;h2 id=&#34;meet-erlang&#34;&gt;Meet Erlang&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Erlang_%28programming_language%29&#34;&gt;Erlang&lt;/a&gt; is a functional, concurrent, dynamically-typed language initially developed at Ericsson around 1986 in order to power its telecom infrastructure.&lt;/p&gt;&#xA;&lt;p&gt;It is a great fit when scalability, availability and distribution are crucial (exactly what telecom applications need). This greatness stems from Erlang&amp;rsquo;s concurrency model, its error-handling capabilities and the OTP framework.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rails tips, part 2</title>
      <link>https://agis.io/post/rails-tips-part-2/</link>
      <pubDate>Mon, 17 Dec 2012 00:00:00 +0000</pubDate>
      <guid>https://agis.io/post/rails-tips-part-2/</guid>
      <description>&lt;p&gt;I have finally found some time for another post.&#xA;Here are some more Rails tips I wish I&amp;rsquo;d known earlier.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;(In case you missed it, &lt;a href=&#34;https://agis.io/post/my-rails-notes/&#34;&gt;here is the first part&lt;/a&gt; of this post.)&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;tip-4-silence-postgres-warnings&#34;&gt;Tip #4: Silence Postgres Warnings&lt;/h2&gt;&#xA;&lt;p&gt;Are you annoyed by messages like these in your terminal when you run migrations?&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;NOTICE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;CREATE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;TABLE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;will&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;implicit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sequence&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;notification_settings_id_seq&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;serial&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;column&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;notification_settings.id&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;NOTICE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;CREATE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;TABLE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;PRIMARY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;KEY&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;will&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;implicit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;notification_settings_pkey&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;table&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;notification_settings&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;p&gt;Well these are notifications, not warnings, that inform us about the awesome stuff Postgres is doing for us. But what do they actually tell us?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Validating Paperclip image dimensions in Rails</title>
      <link>https://agis.io/post/validating-paperclip-image-dimensions-in-rails/</link>
      <pubDate>Fri, 14 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://agis.io/post/validating-paperclip-image-dimensions-in-rails/</guid>
      <description>&lt;p&gt;I love using &lt;a href=&#34;http://github.com/thoughtbot/paperclip&#34;&gt;Paperclip&lt;/a&gt; for handling image uploads in my Rails apps. It&amp;rsquo;s super easy to use and &lt;a href=&#34;https://github.com/thoughtbot/paperclip#storage&#34;&gt;plays nice with Amazon S3&lt;/a&gt;. It even has validators for attachment&amp;rsquo;s content-type, filesize &amp;amp; presence.&lt;/p&gt;&#xA;&lt;p&gt;What it lacks is a built-in validator for image dimensions, but I&amp;rsquo;ve found out that it&amp;rsquo;s not so hard to build one yourself. In my last project, &lt;a href=&#34;http://bathliving.herokuapp.com&#34;&gt;BathLiving&lt;/a&gt;, I needed the user to upload images of specific dimensions. These images where going to be used in image sliders, thumbnails etc. I didn&amp;rsquo;t want to use ImageMagick&amp;rsquo;s resizing/scaling options since I wanted the quality of the image to remain intact. So I had to force the admins to create images with the proper width &amp;amp; height in the first place.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hands-on Rack</title>
      <link>https://agis.io/post/hands-on-rack-ruby/</link>
      <pubDate>Thu, 31 May 2012 00:00:00 +0000</pubDate>
      <guid>https://agis.io/post/hands-on-rack-ruby/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Rack provides a minimal interface between webservers supporting Ruby and Ruby frameworks.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Our first project in the &lt;a href=&#34;https://tinyletter.com/codereading&#34;&gt;Code Reading&lt;/a&gt; group was Rack. At first I thought it was going to be a complex project to go through but Rack&amp;rsquo;s logic is really simple. This is an overview of how it actually works.&lt;/p&gt;&#xA;&lt;p&gt;Indeed, the Rack API is as simple as it gets:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A Rack application is any Ruby object that responds to &lt;code&gt;call&lt;/code&gt;. It takes exactly one argument, the environment hash, and returns an Array of exactly three values: The status, the headers, and the body.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rails tips, part 1</title>
      <link>https://agis.io/post/my-rails-notes/</link>
      <pubDate>Thu, 24 May 2012 00:00:00 +0000</pubDate>
      <guid>https://agis.io/post/my-rails-notes/</guid>
      <description>&lt;p&gt;Mostly like a note to myself, here are some tips that were proved useful to me over time.&lt;/p&gt;&#xA;&lt;h2 id=&#34;tip-1-skipping-testunit&#34;&gt;Tip #1: Skipping Test::Unit&lt;/h2&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re like me, you prefer RSpec over Test::Unit for its expressiveness and the awesome DSL it provides. Everytime you create a new app, you can use the -T option to skip all the folders and files related to Test::Unit.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rails&lt;/span&gt; &lt;span class=&#34;kp&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;app&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;p&gt;Note that this will not only skip the test directory, but also won&amp;rsquo;t create any new test files when you use the built-in controller &amp;amp; model generators.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
