<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Gergely Gombos</title>
    <description>The latest articles on Forem by Gergely Gombos (@gombosg).</description>
    <link>https://forem.com/gombosg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F377984%2F15174c0b-8316-44eb-ad7a-7976a1857b1e.jpeg</url>
      <title>Forem: Gergely Gombos</title>
      <link>https://forem.com/gombosg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gombosg"/>
    <language>en</language>
    <item>
      <title>Attending Craft Conference 2023</title>
      <dc:creator>Gergely Gombos</dc:creator>
      <pubDate>Sun, 21 May 2023 19:28:01 +0000</pubDate>
      <link>https://forem.com/gombosg/attending-craft-conference-2023-4g7f</link>
      <guid>https://forem.com/gombosg/attending-craft-conference-2023-4g7f</guid>
      <description>&lt;p&gt;I had the opportunity to attend to this year’s &lt;a href="https://craft-conf.com/2023"&gt;Craft Conference&lt;/a&gt; – well, after learning that there was a software engineering conference regularly being organized each year in my hometown. I’ve been missing this piece of info for years on my end! 😅&lt;/p&gt;

&lt;h2&gt;
  
  
  General experience
&lt;/h2&gt;

&lt;p&gt;The conference was located at the Hungarian Railroad History Museum which was great – we were hanging out around some old railroad tracks and an exhibition of railroad engines. I think it was inspiring and fun, and I loved the occasional faint smell of machine grease in the air! 🚂&lt;/p&gt;

&lt;p&gt;The venue was partially outside, with some stages located in large “festival” tents and a circus tents. It was fairly easy to navigate around thanks to the conference guide. This way, although we were on full house, the venue never felt overcrowded. And it was fun to run between tents in the rain, during the first day!&lt;/p&gt;

&lt;p&gt;Generally, I found the event to be well organized – there was plenty of staff, food was fine and catering was really professional. (Just as I’d expect from an internationally acclaimed conference.) They served breakfast, lunch, supper and complimentary snacks, drinks &amp;amp; coffee all over the place. I especially loved the sausage booth!&lt;/p&gt;

&lt;p&gt;All of the talks were on-time, there was basically never a hitch with the equipment, the sound or online streaming. Each stage came with their own host who gave them some ‘personality’. The whole thing was really a smooth and welcoming experience.&lt;/p&gt;

&lt;p&gt;There were also a few dozen sponsor booths to check out in between the talks – they unfortunately reflected the state of the IT job market pretty well. Imagine some large financial co. having a booth and then when you walked up and inquired, they mentioned having something like 2 open positions and gossiped about a recent layoff. 🤷&lt;/p&gt;

&lt;h2&gt;
  
  
  Talks
&lt;/h2&gt;

&lt;p&gt;Of course, the talks – that’s why we’re all heading to a conference, not just for the free food, &lt;em&gt;right?!&lt;/em&gt; Well, my expectations were not sky high, this being my first time at &lt;em&gt;any&lt;/em&gt; SWE conference. I also haven’t really been watching any conference talks before during my career, always preferring readable resources when it comes to learning new concepts.&lt;/p&gt;

&lt;p&gt;Anyway, there was plenty to choose from with about 7 stages hosting talks in parallel. The separate tracks allowed for much variety.&lt;/p&gt;

&lt;p&gt;The talks themselves… I’d call them a &lt;em&gt;hit or miss&lt;/em&gt;. I think it’s inherent to the genre: imagine you’re some engineer or consultant offered the opportunity to give a talk at a conference. What would you prepare with?&lt;/p&gt;

&lt;p&gt;You have hundreds of random people among the audience, all with different agendas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some have absolutely no experience in your field and are expecting a primer to the topic, something to help them get oriented and pique their interest.&lt;/li&gt;
&lt;li&gt;Others already know the basics or even more, and are expecting a cool new idea, a thoughtful message or a novel viewpoint.&lt;/li&gt;
&lt;li&gt;Yet another group of people are just casually listening, trying to catch the most important takeaways while browsing on their phone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my opinion it’s really challenging to strike the right balance so that all these groups are satisfied – and some talks managed to be plain underwhelming, offering little more than reading a short blog post or the “About” page of some project.&lt;/p&gt;

&lt;p&gt;I personally enjoyed those talks the most which contained at least a simple introduction to the topic in question, with a key takeaway and meaty slides containing references to check out after the talk.&lt;/p&gt;

&lt;p&gt;Unfortunately, several talks were not like this, and in some cases it was challenging to follow the speaker, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slides containing general stock photos or inexpressive figures instead of the main context for the talking point (in case your mind wanders for a second, it gets increasingly challenging to follow)&lt;/li&gt;
&lt;li&gt;Lack of key messages or a general ‘arc’ of the talk&lt;/li&gt;
&lt;li&gt;Talking too much in generics instead of specifics – most of us are &lt;em&gt;not&lt;/em&gt; enterprise architects/consultants solving organizational challenges in front of a whiteboard. We’re down in the trenches, trying to make a difference as an IC or team lead.&lt;/li&gt;
&lt;li&gt;Not having a clean terminology. Fortunately, some talks were solely focused on applying proper terminology to our field. 🙂&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I know that this was not some scientific conference where researchers were presenting their rigorously prepared papers – these talks were meant for a much wider audience. But that’s why I expected more from some speakers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Highlights – my 3 personal favorites
&lt;/h3&gt;

&lt;p&gt;I was taking notes throughout the talks, so here are my 3 favorite ones.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;“Beyond the Buzzword – A psychologist’s thoughts on psychological safety”&lt;/em&gt; by &lt;a href="https://craft-conf.com/2023/talk/beyond-the-buzzword-a-psychologists-thoughts-on-psychological-safety"&gt;Joseph Pelrine&lt;/a&gt;.
An unexpected, underrated surprise on my end. Something that’s not directly related to software engineering, yet, we’re experiencing it day to day.
When it comes to psychological safety at the workplace, the devil is in the details – the subtle emotional cues and interactions (“bids”) between team members.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;“Lessons learned teaching tech leaders for 10+ years”&lt;/em&gt; by &lt;a href="https://craft-conf.com/2023/talk/lessons-learned-teaching-tech-leaders-for-10-years"&gt;Patrick Kua&lt;/a&gt;
I just had to attend this one now that I’m working as a tech lead! 😅 As it turned out during a quick poll at the beginning of the talk, about 80% of the audience was composed of leads, managers and executives!
Loved the arc of the talk, condensing years of leadership experience, reflecting on what changed throughout and what hasn’t, and can definitely relate to the philosophy of leading through example.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;“Orchestration vs Choreography, A Guide To Composing Your Monolith”&lt;/em&gt; by &lt;a href="https://craft-conf.com/2023/talk/orchestration-vs-choreography-a-guide-to-composing-your-monolith"&gt;Ian Thomas&lt;/a&gt;
We’ve had multiple really solid talks on microservices, I’d like to call this one out. Actually the last talk during the conference! Some very solid slides, a good primer on interaction patterns (orchestration vs. choreography), several nice examples and a general approach of caution around all the complex systems we are building. 🙂&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HDaJgsrl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://gombosg.com/wp-content/uploads/2023/05/20230519_174226-1024x461.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HDaJgsrl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://gombosg.com/wp-content/uploads/2023/05/20230519_174226-1024x461.jpg" alt="" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was definitely worth going to Craft Conf 2023! I’m still planning to spend some time reviewing the slides and watching some missed but interesting talks.&lt;/p&gt;

&lt;p&gt;Loved the social aspect of the conference – just talking to strangers during lunch (there was a considerable amount of folks from abroad like Germany, Poland, Netherlands etc.), hanging out at some company booth, chatting with ex-coworkers and generally enjoying the presence of like-minded engineers.&lt;/p&gt;

&lt;p&gt;See you next year at Craft!&lt;/p&gt;

</description>
      <category>general</category>
      <category>craftconf</category>
    </item>
    <item>
      <title>Running macOS inside Linux with Docker-OSX</title>
      <dc:creator>Gergely Gombos</dc:creator>
      <pubDate>Sun, 16 Jan 2022 19:48:41 +0000</pubDate>
      <link>https://forem.com/gombosg/running-macos-inside-linux-with-docker-osx-4e1i</link>
      <guid>https://forem.com/gombosg/running-macos-inside-linux-with-docker-osx-4e1i</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally appeared on &lt;a href="https://gombosg.com/2022/01/running-macos-inside-linux/" rel="noopener noreferrer"&gt;my blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It just happened to me that at my current workplace, &lt;a href="http://process.st/" rel="noopener noreferrer"&gt;Process Street&lt;/a&gt;, I had to fix a bug in our &lt;a href="https://apps.apple.com/us/app/process-street/id1523499559" rel="noopener noreferrer"&gt;iOS application&lt;/a&gt;. But… I’d like to do this on a Linux box, and not on a MacBook. What to do in this case? Let’s run macOS inside a virtual machine!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgombosg.com%2Fwp-content%2Fuploads%2F2022%2F01%2Fimage-1024x576.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgombosg.com%2Fwp-content%2Fuploads%2F2022%2F01%2Fimage-1024x576.png" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Table Of Contents &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
Prerequisites

&lt;ul&gt;
&lt;li&gt;CPU virtualization&lt;/li&gt;
&lt;li&gt;RAM, disk space&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Installing Docker-OSX

&lt;ul&gt;
&lt;li&gt;Get started!&lt;/li&gt;
&lt;li&gt;Install the OS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Customizing your installation

&lt;ul&gt;
&lt;li&gt;Extracting the disk image&lt;/li&gt;
&lt;li&gt;Adding RAM &amp;amp; CPU&lt;/li&gt;
&lt;li&gt;Sharing folders from the host machine&lt;/li&gt;
&lt;li&gt;Writing shared folders&lt;/li&gt;
&lt;li&gt;Networking, accessing ports&lt;/li&gt;
&lt;li&gt;Setting up host networking&lt;/li&gt;
&lt;li&gt;Using a VNC client&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CPU virtualization
&lt;/h3&gt;

&lt;p&gt;Your CPU should support virtualization like Intel VT or AMD-V. &lt;a href="https://www.bleepingcomputer.com/tutorials/how-to-enable-cpu-virtualization-in-your-computer-bios/" rel="noopener noreferrer"&gt;Enable it&lt;/a&gt; in your BIOS/UEFI before proceeding. (For example, on my Ryzen system, it was an “AMD SVM” setting that had to be enabled in BIOS.)&lt;/p&gt;

&lt;p&gt;Then install Kernel Virtualization Manager (KVM) and QEMU. For Fedora Linux, see docs &lt;a href="https://docs.fedoraproject.org/en-US/quick-docs/getting-started-with-virtualization/" rel="noopener noreferrer"&gt;here&lt;/a&gt;. It’s as simple as:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

# sudo dnf install @virtualization


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Then start the &lt;code&gt;libvirtd&lt;/code&gt; systemd service and check if the &lt;code&gt;kvm&lt;/code&gt; kernel module is running.&lt;/p&gt;

&lt;p&gt;With KVM, x86 virtualization offers near-native performance, which means that CPU calls from the Mac virtual machine are routed directly to your processor in a secure way without any kind of emulation penalty.&lt;/p&gt;

&lt;p&gt;Although graphics and general UI responsiveness will be slow, but with KVM, software will run blazing fast provided that you have some strong CPU like a more recent Intel i7 or Ryzen 7.&lt;/p&gt;

&lt;p&gt;Compare the efficiency of KVM with for example &lt;a href="https://dosbox.com/" rel="noopener noreferrer"&gt;DOSBox&lt;/a&gt;, where full emulation is needed because of DOS programs using low-level BIOS interrupts and &lt;a href="https://en.wikipedia.org/wiki/Real_mode" rel="noopener noreferrer"&gt;real CPU mode&lt;/a&gt;. That kind of emulation can be orders of magnitude slower, though on today’s machines this is not an issue when emulating DOOM. :)&lt;/p&gt;

&lt;h3&gt;
  
  
  RAM, disk space
&lt;/h3&gt;

&lt;p&gt;If you want to run Xcode, have at least 16Gb of RAM installed so that you can allocate about 8Gb to the virtual machine.&lt;/p&gt;

&lt;p&gt;You’ll need tens of gigabytes of disk space. QEMU &lt;a href="https://en.wikipedia.org/wiki/Qcow" rel="noopener noreferrer"&gt;“qcow”&lt;/a&gt; images will expand like crazy once you start installing software, until they hit a preset limit of 200 Gb. My image file grew to 170 Gb after a few days of use. So have a HDD/SSD ready with plenty of free space.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker
&lt;/h3&gt;

&lt;p&gt;As we’ll be using the &lt;a href="https://github.com/sickcodes/Docker-OSX" rel="noopener noreferrer"&gt;Docker-OSX&lt;/a&gt; project, you’ll need to pull, run and maybe create Docker images locally. You might have luck with &lt;a href="https://fedoramagazine.org/getting-started-with-podman-in-fedora/" rel="noopener noreferrer"&gt;podman&lt;/a&gt;, though it interacts with your system in a different way than Docker does. YMMV. For installing Docker, follow the &lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Docker-OSX
&lt;/h2&gt;

&lt;p&gt;Get acquainted with the Docker-OSX &lt;a href="https://github.com/sickcodes/Docker-OSX" rel="noopener noreferrer"&gt;download page&lt;/a&gt;. It has a nice, long README! Commands are subject to change, so please refer to the README for the latest version.&lt;/p&gt;

&lt;p&gt;In short, Docker-OSX runs an Arch Linux container that executes QEMU and sets up preinstalled or vanilla macOS images for you. It’s insanely customizable: you can get started quickly via a single &lt;code&gt;docker run&lt;/code&gt; command, but depending on your needs, you can customize several aspects of how the virtual machine is run, like screen resolution, shared folders, USB passthrough, VNC connection and so on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Get started!
&lt;/h3&gt;

&lt;p&gt;Just run a basic image. Choose your OS version (Catalina, Big Sur, Monterey). I suggest choosing Big Sur which is still supported, but not as new as Monterey which may have some emulation issues.&lt;/p&gt;

&lt;p&gt;Run the appropriate &lt;a href="https://github.com/sickcodes/Docker-OSX#big-sur-" rel="noopener noreferrer"&gt;command&lt;/a&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

docker run -it \
    --device /dev/kvm \
    -p 50922:10022 \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e "DISPLAY=${DISPLAY:-:0.0}" \
    sickcodes/docker-osx:big-sur


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;What does this do? It pulls a prebuilt Big Sur image, forwards your /&lt;code&gt;dev/kvm&lt;/code&gt; device and an X11 socket into the container. It exposes the 10022 port inside the container at 50922 port in your host machine for SSH access (optional). Also it sets up an environment variable which tells the container which X display to use.&lt;/p&gt;

&lt;p&gt;For managing Docker containers, I suggest using the &lt;a href="https://code.visualstudio.com/docs/containers/overview" rel="noopener noreferrer"&gt;Docker extension for Visual Studio code&lt;/a&gt; if you don’t want to deal with the command line. It’s very convenient!&lt;/p&gt;

&lt;p&gt;Basically, while the container is running, the QEMU virtual machine will keep on running. If you shut down the machine from inside macOS, the container would stop. &lt;code&gt;docker run&lt;/code&gt; starts a brand new container, but you can start the same one later via &lt;code&gt;docker start&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install the OS
&lt;/h3&gt;

&lt;p&gt;After booting up, you’ll be greeted with the recovery installer of macOS:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgombosg.com%2Fwp-content%2Fuploads%2F2022%2F01%2Fimage-1-1024x612.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgombosg.com%2Fwp-content%2Fuploads%2F2022%2F01%2Fimage-1-1024x612.png" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Boot loader of the Mac VM&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You have to follow the README’s &lt;a href="https://github.com/sickcodes/Docker-OSX#additional-boot-instructions-for-when-you-are-creating-your-container" rel="noopener noreferrer"&gt;“additional boot instructions”&lt;/a&gt; part to format the virtual disk image and install macOS on it (the image contains pre-mounted Big Sur installation media).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgombosg.com%2Fwp-content%2Fuploads%2F2022%2F01%2Fimage-2-1024x563.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgombosg.com%2Fwp-content%2Fuploads%2F2022%2F01%2Fimage-2-1024x563.png" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Formatting the virtual disk image&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It’s really simple point-and click work and you’ll soon be greeted with your own macOS installation!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgombosg.com%2Fwp-content%2Fuploads%2F2022%2F01%2Fimage-3-1024x575.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgombosg.com%2Fwp-content%2Fuploads%2F2022%2F01%2Fimage-3-1024x575.png" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Enjoy the new installation!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;From here on it’s up to you how you want to customize your image. I’m going to show a few tricks here!&lt;/p&gt;

&lt;h2&gt;
  
  
  Customizing your installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Extracting the disk image
&lt;/h3&gt;

&lt;p&gt;The first thing I suggest doing is extracting the macOS disk image so that you’ll have a persistent installation with all your work and settings while you’re experimenting with VM settings. It’s just a single, large file inside &lt;code&gt;/var/lib/docker&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo find /var/lib/docker -size +10G | grep mac_hdd_ng.img


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Copy the file to a convenient location where it has space to grow (2-300Gb!). From here on, you can create your own custom image using one of the “naked” containers where this file is simply mounted as a volume:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

docker run -it \
    --device /dev/kvm \
    -v "${PWD}/mac_hdd_ng.img:/image" \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e "DISPLAY=${DISPLAY:-:0.0}" \
    sickcodes/docker-osx:naked


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;From here on, I suggest creating a text file where you store versions of the &lt;code&gt;docker run&lt;/code&gt; command for your convenience. Time to hack!&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding RAM &amp;amp; CPU
&lt;/h3&gt;

&lt;p&gt;By default, the VM is only created with 4 cores and 4 Gb of RAM. Why not use more? Depending on your system, add the arguments &lt;code&gt;-e RAM=8 -e CPU_STRING=16&lt;/code&gt; to make it much, much faster!&lt;/p&gt;

&lt;h3&gt;
  
  
  Sharing folders from the host machine
&lt;/h3&gt;

&lt;p&gt;This one is really useful as you might want to share some files from the host. Unfortunately, it’s not trivially simple. Because networking works out of the box, you may actually be better of sharing files via a cloud provider like Dropbox, if it’s just a few smaller files!&lt;/p&gt;

&lt;p&gt;See instructions &lt;a href="https://github.com/sickcodes/Docker-OSX#share-folder-with-docker-osx-qemu-macos" rel="noopener noreferrer"&gt;here&lt;/a&gt;. You basically pass the folder name as a &lt;code&gt;docker run&lt;/code&gt; parameter like &lt;code&gt;-v "$HOME/mac/shared:/mnt/hostshare"&lt;/code&gt; and add some extra QEMU parameters which define this folder as a device called &lt;code&gt;hostshare&lt;/code&gt;. Moreover, inside the VM, after each boot, you have to mount this folder: &lt;code&gt;sudo -S mount_9p hostshare&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In Finder’s menu bar, click on “Go – Computer” to access this shared folder. This kind of shared folder is not as fast as the native “qcow” disk image; don’t use it for folders with thousands of files like Git repos, it will be a slow experience.&lt;/p&gt;

&lt;h4&gt;
  
  
  Writing shared folders
&lt;/h4&gt;

&lt;p&gt;You may notice that you’re unable to write to shared folders. It’s because of how the Linux permission system works: each user has an ID which is associated with each file. When determining filesystem permissions, this ID is actually being used instead of your user name.&lt;/p&gt;

&lt;p&gt;macOS, also being a POSIX-compliant operating system, uses the same access model, but your macOS user very likely has a different ID by default, so permission will be denied by the host OS.&lt;/p&gt;

&lt;p&gt;Making the shared folder writable by anyone might work but is awful from a security standpoint. Fortunately you can change your macOS user ID with a few commands. See a guide &lt;a href="https://linuxhandbook.com/uid-linux/" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Not super complicated, but not very simple either. If you plan on doing this, I suggest doing it before installing any software in your VM, as each file needs their user IDs reset.&lt;/p&gt;

&lt;h3&gt;
  
  
  Networking, accessing ports
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.docker.com/network/" rel="noopener noreferrer"&gt;Networking in Docker&lt;/a&gt; is hard in itself, moreover, we’re having this VM being run inside QEMU. Ouch. You might have different use cases beyond just browsing the web, which should work out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forwarding ports&lt;/strong&gt; from the VM to the host, like for example, running nginx or some server backend in the VM is a valid use case. For each port being forwarded, a few extra arguments are needed when setting up the container, see the README section &lt;a href="https://github.com/sickcodes/Docker-OSX#forward-additional-ports-nginx-hosting-example" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accessing host machine ports&lt;/strong&gt; from the VM i.e. &lt;code&gt;localhost&lt;/code&gt; access is also possible by forwarding the corresponding port to the container with the &lt;code&gt;-p&lt;/code&gt; Docker argument. QEMU sets up the host machine’s &lt;code&gt;localhost&lt;/code&gt; (which is inside Docker!) as &lt;code&gt;10.0.2.2&lt;/code&gt; so after that,&lt;/p&gt;

&lt;h4&gt;
  
  
  Setting up host networking
&lt;/h4&gt;

&lt;p&gt;If you don’t want to individually forward ports into the Docker container, you can opt to use the &lt;a href="https://docs.docker.com/network/network-tutorial-host/" rel="noopener noreferrer"&gt;“host networking” driver&lt;/a&gt;. In this case, you can access all of your Linux machine’s ports via &lt;code&gt;10.0.2.2&lt;/code&gt;. This is also a downside from a security standpoint: only do this if you know what you’re doing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using a VNC client
&lt;/h3&gt;

&lt;p&gt;The default QEMU window does the job, but it’s a lot more convenient to access your VM through a VNC client. It has advantages like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not having to stop the VM when closing the emulator window&lt;/li&gt;
&lt;li&gt;Showing the host’s mouse cursor for a smoother experience&lt;/li&gt;
&lt;li&gt;Capturing keyboard shortcuts like &lt;code&gt;CMD+C&lt;/code&gt; etc.&lt;/li&gt;
&lt;li&gt;“Inserting” from the host clipboard by typing it in (even if there is no direct clipboard sharing)&lt;/li&gt;
&lt;li&gt;Changing connection quality etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I suggest the &lt;a href="https://remmina.org/" rel="noopener noreferrer"&gt;Remmina&lt;/a&gt; VNC client as it’s pretty advanced, but feel free to use your own. There are multiple ways to get a VNC-capable version, the simplest is probably building a &lt;a href="https://github.com/sickcodes/Docker-OSX/blob/master/vnc-version/Dockerfile.nakedvnc" rel="noopener noreferrer"&gt;custom Dockerfile&lt;/a&gt; in the repo (edit the file if you want a different resolution):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

$ git clone git@github.com:sickcodes/Docker-OSX.git
$ cd Docker-OSX/vnc-version
$ docker build -t docker-osx:nakedvnc -f Dockerfile.nakedvnc .


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Note down the VNC password printed during building the container! It will be permanent for each run so you can save it to your VNC client. You can connect to it via &lt;code&gt;localhost:5999&lt;/code&gt;. Don’t forget to set “grab input” and “hide menubar” both in the QEMU menu bar &lt;em&gt;and&lt;/em&gt; the VNC client.&lt;/p&gt;

&lt;p&gt;If you terminate the VNC connection, your macOS system will keep on running. Neat!&lt;/p&gt;

&lt;p&gt;Here’s my example Docker command for reference, running a VNC-capable container (built above) with a shared folder, a custom image and host networking.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;docker run \&lt;br&gt;
    --device /dev/kvm \&lt;br&gt;
    --network host \&lt;br&gt;
    -v "$HOME/mac/mac_hdd_ng.img:/image" \&lt;br&gt;
    -v "$HOME/mac/shared:/mnt/hostshare" \&lt;br&gt;
    -e EXTRA="-virtfs local,path=/mnt/hostshare,mount_tag=hostshare,security_model=passthrough,id=hostshare" \&lt;br&gt;
    -e RAM=8 \&lt;br&gt;
    -e CPU_STRING=16 \&lt;br&gt;
    docker-osx:nakedvnc&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Conclusion&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;I hope you enjoyed reading this small guide. Trying this experiment really shows how advanced our current virtualization technology is and allows you to use macOS for legitimate use cases like security research inside a secure virtual machine.&lt;/p&gt;

</description>
      <category>general</category>
      <category>linux</category>
      <category>docker</category>
      <category>macos</category>
    </item>
    <item>
      <title>My personal site is now opted out of Google FLoC</title>
      <dc:creator>Gergely Gombos</dc:creator>
      <pubDate>Fri, 16 Apr 2021 13:19:20 +0000</pubDate>
      <link>https://forem.com/gombosg/my-personal-site-is-now-opted-out-of-google-floc-2e50</link>
      <guid>https://forem.com/gombosg/my-personal-site-is-now-opted-out-of-google-floc-2e50</guid>
      <description>&lt;p&gt;Google is rolling out Federated Learning of Cohorts (FLoC) in Chrome browsers – which is more than 60% of all browsers worldwide, &lt;a href="https://gs.statcounter.com/browser-market-share"&gt;based on page visits&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I never used Chrome and am an avid Firefox user, but this is important for every Web user and the Web as the whole.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is FLoC?
&lt;/h2&gt;

&lt;p&gt;Basically, third-party (aka. tracking) cookies are being blocked now in every major browser, and Chrome is soon to follow. This is a nice change that prevents advertisers from identifying and tracking us as we browse the web.&lt;/p&gt;

&lt;p&gt;With FLoC on the other hand, your Chrome browser would anonymously profile you by analyzing your browser history. Few specifics are known except that this is an ongoing experiment being gradually rolled out.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does this affect the Web?
&lt;/h2&gt;

&lt;p&gt;There are &lt;a href="https://www.eff.org/deeplinks/2021/03/googles-floc-terrible-idea"&gt;several other issue points&lt;/a&gt; where FLoC is being actively criticized, but I would like to emphasize two consequences of this practice.&lt;/p&gt;

&lt;p&gt;First, this neatly helps reducing ad-tech competition for Google. Any advertiser can use third-party cookies to track visitors on partner sites, but FLoC results can only be gathered, learned, analyzed and then marketed by Google. Whatever they promise about sharing FLoC IDs, it’s still under their total control. I can hardly feel sorry for any advertising company, but further increasing Google’s web monopoly sounds daunting.&lt;/p&gt;

&lt;p&gt;Second, this shifts control from website owners to Google on how visitor data is being collected and capitalized on. Before this, website owners could decide which third-party ad tracker they add to their site, by using tracking pixels or embedded ad scripts.&lt;/p&gt;

&lt;p&gt;We dislike ads and the whole web ad business model is arguably flawed, but this at least generated revenue for valuable sites we love.&lt;/p&gt;

&lt;p&gt;On the contrary, with FLoC, in every Chrome browser, for every user, every visit is automatically recorded. The whole Web is automatically opted in, and you, as a website owner would have to opt out to prevent Google from harvesting your visitor’s data, even if you have been consciously not using any tracking scripts on your site.&lt;/p&gt;

&lt;p&gt;And even if you had tracking/ads on your site, you wouldn’t get any share of revenue with FLoC. (Not mentioning the possibility that Google could rank sites that opt out lower among their search results.)&lt;/p&gt;

&lt;p&gt;In my opinion, this would change the Web for the worse: increasing monopoly of Google, decreasing competition and user privacy. 65% of Web users’ visitor data being harvested by some black box algorithm, unless they individually opt out.&lt;/p&gt;

&lt;h2&gt;
  
  
  How can I opt out?
&lt;/h2&gt;

&lt;p&gt;Take action! Fortunately, there are &lt;a href="https://paramdeo.com/blog/opting-your-website-out-of-googles-floc-network"&gt;several ways to opt out&lt;/a&gt; from Floc as a webmaster. For &lt;a href="https://gombosg.com"&gt;gombosg.com&lt;/a&gt; I simply disallowed FLoC in a &lt;em&gt;.htaccess&lt;/em&gt; file. If you look at the response headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~ $ curl -Lv https://gombosg.com  
[...]
&amp;lt; HTTP/2 200 
&amp;lt; date: Fri, 16 Apr 2021 12:21:50 GMT
&amp;lt; permissions-policy: interest-cohort=()`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This header is supposed to turn off data collection regarding this site. Still, we are at Google’s mercy when it comes to actually respecting the received header.&lt;/p&gt;

&lt;p&gt;On the client side: just don’t use Chrome. Use Chromium, Firefox, or any other browser.&lt;/p&gt;

&lt;p&gt;Ok, if you’re a Chrome user I’m not going to redirect you to &lt;a href="https://www.floc-away-from-chrome.com/"&gt;floc-away-from-chrome.com&lt;/a&gt;… just yet.&lt;/p&gt;

&lt;p&gt;It’s important to know that at the time of this writing FLoC is not being tested in countries where the &lt;a href="https://gdpr.eu/"&gt;GDPR&lt;/a&gt; is in effect. It is possible that some countries’ authorities would take action to deal with this privacy violation. Yet, court cases could take years to pass through, and we have already learned that regulators can hardly manage to contain the greed of tech monopolies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources, further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.eff.org/deeplinks/2021/03/googles-floc-terrible-idea"&gt;eff.org: Google’s FLoC Is a Terrible Idea&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://paramdeo.com/blog/opting-your-website-out-of-googles-floc-network"&gt;paramdeo.com: Opting your Website out of Google’s FLoC Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.dev/floc/"&gt;web.dev: What is Federated Learning of Cohorts (FLoC)?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>general</category>
      <category>google</category>
      <category>floc</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Speaking at People Team camp</title>
      <dc:creator>Gergely Gombos</dc:creator>
      <pubDate>Mon, 27 Jul 2020 07:52:58 +0000</pubDate>
      <link>https://forem.com/gombosg/speaking-at-people-team-camp-1a3p</link>
      <guid>https://forem.com/gombosg/speaking-at-people-team-camp-1a3p</guid>
      <description>&lt;p&gt;I had the privilege to hold a web development workshop at the People Team summer camp. &lt;a href="https://peopleteam.hu/people-team-camp-english/"&gt;People Team&lt;/a&gt; is a fairly popular youth camp where participating kids choose some focus topic and attend to various lectures, workshops and activities during the week.&lt;/p&gt;

&lt;p&gt;The topics range from learning languages, through arts, sciences, robotics, cooking, environmental protection to of course IT and programming. They are all pretty interesting, and for the last few years the IT HR company &lt;a href="https://iseeq.co/home"&gt;IseeQ&lt;/a&gt; has been responsible for organizing volunteering speakers and trainers for the IT focus topic – this is where I got into the picture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IcJhV3Sa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://gombosg.com/wp-content/uploads/2020/07/116131961_3508976925820474_4823682782634142705_o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IcJhV3Sa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://gombosg.com/wp-content/uploads/2020/07/116131961_3508976925820474_4823682782634142705_o.jpg" alt="" width="880" height="587"&gt;&lt;/a&gt;via &lt;a href="https://www.facebook.com/peopleteam/photos/a.3508956842489149/3508976919153808"&gt;People Team Facebook&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparations
&lt;/h2&gt;

&lt;p&gt;Of course I had a lot of questions, mostly the usual ones when you prepare with some training or presentation: what’s the topic? Who is the audience, their number, age group, skill level? How interested, involved are they going to be?&lt;/p&gt;

&lt;p&gt;Most of these parameters were unknown or only partially known, basically, the training was for 11-17 year olds who are generally interested in IT but not necessarily have prior programming experience.&lt;/p&gt;

&lt;p&gt;As title, I chose “Web development and security” – a popular topic. I wanted to introduce them into the world of the Internet that we use every day but probably don’t know what happens behind the curtains.&lt;/p&gt;

&lt;p&gt;It’s not just about how HTML and JS works, because there is a lot more to the Web than just web programming.&lt;/p&gt;

&lt;p&gt;How did the Web start out and how did it grow and evolve into what we see and experience today? What were its original goals and values, who used it? How does it work on a principal level? What are the most important topics, issues and controversies surrounding the state of the Internet and its usage today?&lt;/p&gt;

&lt;p&gt;I think that these topics are especially important to the digital native generation, for whom being online is like water or air: they have never lived in a world without perpetually staying online.&lt;/p&gt;

&lt;p&gt;I created a presentation draft in &lt;a href="https://joplinapp.org/"&gt;Joplin&lt;/a&gt; and some &lt;a href="https://codesandbox.io/new-dashboard/home"&gt;Codesandbox&lt;/a&gt; samples to tinker with in the browser. I decided not to make a classic Powerpoint presentation: it’s too much effort, and given the circumstances, I knew I’d likely have to improvise. Moreover, using a good old whiteboard or flip chart is more personal, credible and may even &lt;a href="https://corporatevisions.com/whiteboard-vs-powerpoint/"&gt;boost information retention&lt;/a&gt; (i.e. listeners will remember more).&lt;/p&gt;

&lt;h2&gt;
  
  
  Action
&lt;/h2&gt;

&lt;p&gt;After waking up early in the morning, finishing the outline and saving some supplementary images into a folder, I jumped on my trusty Kawasaki bike to make my way to the venue.&lt;/p&gt;

&lt;p&gt;During the first part, which was the presentation about the Web itself, the participants were as involved as a group of random kids could be at 8:30 AM in a summer camp. Fortunately, good conversations emerged once we started unpacking more interesting topics such as cybersecurity and data protection. The audience seemed to be genuinely interested and hopefully are now eager to learn more about these important topics.&lt;/p&gt;

&lt;p&gt;After a break, we moved into the computer lab, which was set up in a long and narrow corridor. This was the only way to ensure that everybody gets a computer to work on.&lt;/p&gt;

&lt;p&gt;Unfortunately, the moment they opened their browsers, their attention level was seriously diminished. Just imagine the difference of effort between opening a code sandbox and starting to learn HTML, vs. opening your favorite game or just chatting. See…?&lt;/p&gt;

&lt;p&gt;Nevertheless, after a short intro into what server-client architecture means and playing with the browser’s developer tools, we managed to create a few simple HTML pages linked to each other. Having no time for complex JS interactivity, we just maxed out what one could fit into an hour-long workshop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If you don’t know your audience ahead of time, prepare with multiple scenarios. I haven’t used about a third of my presentation material (&lt;a href="https://medium.com/@int0x33/day-51-understanding-the-osi-model-f22d5f3df756"&gt;OSI layers&lt;/a&gt; turned out to be too advanced for this morning in a summer camp…)&lt;/li&gt;
&lt;li&gt;Prepare for the worst circumstances – for me, this was not having a whiteboard and projector during the workshop session. I made a chat session, but it didn’t work out well – in hindsight, a screenshare could have worked better.&lt;/li&gt;
&lt;li&gt;If the session is not a formal speech or lecture, not having a PPT presentation works just fine. You can easily lead the conversation and use a whiteboard to take notes.&lt;/li&gt;
&lt;li&gt;In general, you’ll have less time than you think and less material to teach than planned.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All in all, this was an exciting experience for me as a lecturer. I enjoyed preparing for these workshops and giving back to the youth as a volunteer. I’m looking forward to repeating this next year, too!&lt;/p&gt;

</description>
      <category>general</category>
    </item>
    <item>
      <title>Does ‘software engineering’ even exist?</title>
      <dc:creator>Gergely Gombos</dc:creator>
      <pubDate>Thu, 07 May 2020 21:09:57 +0000</pubDate>
      <link>https://forem.com/gombosg/does-software-engineering-even-exist-3jo0</link>
      <guid>https://forem.com/gombosg/does-software-engineering-even-exist-3jo0</guid>
      <description>&lt;p&gt;I’m not even sure if software engineering exists, or whether it should be called as such. See my opinionated post below.&lt;/p&gt;

&lt;h2&gt;
  
  
  How software emerged
&lt;/h2&gt;

&lt;p&gt;As a reference, I have a ‘mechatronics engineering’ MSc, which is mostly a mix of electronics and mechanincal engineering. These classic engineering fields are called ‘engineering disciplines’.&lt;/p&gt;

&lt;p&gt;Mechanical (and also civil) engineering is about 200 years old, electrical engineering is about 70-80. Whatever you’re designing, you’re leaning on the ‘shoulders of giants’, leveraging knowledge that may be more than a hundred years old.&lt;/p&gt;

&lt;p&gt;Computer science has in fact branched from mathematics. In order to create computers and programming languages, we needed the computability notion of Turing completeness and the primal computer architecture (still holding today) envisioned by John Von Neumann.&lt;/p&gt;

&lt;p&gt;Computer engineering, the practical side, kind of branched from electronics engineering, since software in first- and second-level programming languages were very close to the hardware.&lt;/p&gt;

&lt;p&gt;You couldn’t just write an app in some high-level language, but rather needed to know a lot about low-level stuff like hardware architecture and CPU instructions.&lt;/p&gt;

&lt;p&gt;Software gained huge traction in about 35 years ago, when personal computers became affordable, and &lt;a href="https://a16z.com/2011/08/20/why-software-is-eating-the-world/"&gt;embarked on a journey to eat the world&lt;/a&gt;. and now people call themselves ‘software engineers’. Heck, my employer calls me a software engineer!&lt;/p&gt;

&lt;h2&gt;
  
  
  Software engineering vs. hard sciences
&lt;/h2&gt;

&lt;p&gt;Software engineering activities are similar to existing engineering practice in that you are modeling, measuring, researching and methodically refining a design in order to work towards some concrete end goal i.e. a software product. You can apply all the known engineering approaches and methods to design, implement, test and maintain software.&lt;/p&gt;

&lt;p&gt;On the other hand, software engineering is totally different, much ‘softer’ (no pun intended) than mechanical, electrical, chemical or civil engineering that have something in common: they build on natural sciences.&lt;/p&gt;

&lt;p&gt;In these classical disciplines, if you want to do something, you refer to some relevant physical or other scientific models, formulae, tables, standards whatever; get some results, maybe measure and simulate a bit and get a concrete result. Multiply by it some safety factor and there you go.&lt;/p&gt;

&lt;p&gt;You can be sure because these standards and laws have been known for decades if not hundreds of years, they have been battle-tested in millions of applications. (Buildings, power and electronic systems, infrastructure, machinery, chemical processes etc.)&lt;/p&gt;

&lt;p&gt;Compare this with software? Not so much. In that sense, it reminds me of non-natural sciences like social sciences or economics.&lt;/p&gt;

&lt;p&gt;For each software problem to solve, you have 10 different languages, 100 frameworks, 20 totally different ‘paradigms’ with their own consultants, zealots and flamewars. Several could produce a satisfying solution to your problem, but they usually get replaced every 5 years.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good old times?
&lt;/h2&gt;

&lt;p&gt;5 years old software is called ‘legacy’, software that is 15 years old is often called a classic game or an anachronistic joke. Software expands like gas, taking up all available storage space and computing performance, but as time passes, in return we get many more layers of abstractions and a more complex development infrastructure. (Plus a nice UX, more ads and less privacy.)&lt;/p&gt;

&lt;p&gt;We may think back of the ‘good old times’ when an operating system with several userspace software was able to run on e.g. a 233 MHz computer with 16 Mb of RAM (this was way after ‘640 kb was ought to be enough for anybody’). But we definitely don’t want to develop software the way it had been done back then, because we can create more, (maybe better) products, significantly faster.&lt;/p&gt;

&lt;p&gt;As Uwe Friedrichsen &lt;a href="https://www.ufried.com/blog/reusability_fallacy_4/"&gt;puts it&lt;/a&gt; in his post about reusability:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;…assume you need to build a not too challenging solution, e.g., a small e-commerce web shop that needs to run in a desktop browser and on mobile devices. If we leave aside for a moment that we can create such solutions today with tools like &lt;a href="https://www.shopify.com/"&gt;Shopify&lt;/a&gt; in a day or two, then this would be a task for a small team (5-7 persons) for 3-6 months.&lt;/p&gt;

&lt;p&gt;But if you would need to start at the level of a bare programming language (3GL, turing-complete, no standard libraries, no ecosystem), this would be a daunting task: Probably a 100 or more people working for years, not knowing if they will succeed at all.&lt;/p&gt;

&lt;p&gt;This enormous difference in productivity is the merit of reusability. If you needed string processing in C++ in the early 1990s, you needed to implement it yourself. Today, you start a whole HTTP server and more with a single line of code. This is reusability!&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Uwe Friedrichsen, &lt;a href="https://ufried.com/blog/reusability_fallacy_4/"&gt;The reusability fallacy – Part 4&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  E for engineering, S for software
&lt;/h2&gt;

&lt;p&gt;As we see, with classical engineering disciplines, the primary driver of progress was scientific research. Published in peer-reviewed journals, they meant a foundation for engineers to create well-documented and tested applications.&lt;/p&gt;

&lt;p&gt;Software is changing much faster and it’s… well, soft.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We don’t have (natural) laws, we have ‘paradigms’ – one essentially never changes, the other apparently changes every few years. &lt;/li&gt;
&lt;li&gt;We don’t have measurements, we have ‘metrics’ – we measure &lt;em&gt;something&lt;/em&gt; but the goal is usually not to improve some model or control a system in a feedback loop, just to examine some system as it’s running, and restart it when it crashes…&lt;/li&gt;
&lt;li&gt;We do have some standards (like ISO, ANSI), but compared to the speed of standards bodies, software is moving at a neck-breaking speed, and they are unable to catch up. Organizations like &lt;a href="https://www.ietf.org/"&gt;IETF&lt;/a&gt; and &lt;a href="https://www.w3.org/"&gt;W3C&lt;/a&gt; represent ‘software standards’ much better, and work in a substantially different way.&lt;/li&gt;
&lt;li&gt;We have some common terminology, but there is &lt;em&gt;a lot&lt;/em&gt; of hype and buzzwords going around. The 'next-generation' framework, architecture, language, paradigm, engineering method, whatever, promising easy and fast results. Of course.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mother Nature doesn’t want to earn money on you when it comes to physical models. Consultants on the other hand do, when trying to sell their latest &amp;amp; greatest paradigms, ’10x’ engineering practices and lean methodologies.&lt;/p&gt;

&lt;p&gt;Firms and managers can’t buy natural laws (though they do pay a lot to access ISO standards :)), but they love to rewrite their software into the latest and greatest architecture or framework, often without enough justification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summing up
&lt;/h2&gt;

&lt;p&gt;What engineers/developers are doing may be similar to classical engineering practice but is way less exact. We may reason about programming languages, application architecture and business logic, but ‘clean coding’ practices and everyday ‘which library/framework should I use?’ questions are far from anything formal.&lt;/p&gt;

&lt;p&gt;All in all, ‘software engineering’, although shows some similarities in approaching problems, is fundamentally different from existing classical engineering disciplines, changes much-much faster and probably we should come up with a better term for it, rather than abusing existing terminology.&lt;/p&gt;

&lt;p&gt;I heard for example &lt;a href="http://manifesto.softwarecraftsmanship.org/"&gt;software craftsmanship&lt;/a&gt;… but I’m unsure.&lt;/p&gt;

&lt;p&gt;What do you think about this?&lt;/p&gt;

</description>
      <category>general</category>
      <category>rant</category>
      <category>engineering</category>
    </item>
    <item>
      <title>My Java experience as a Javascript developer</title>
      <dc:creator>Gergely Gombos</dc:creator>
      <pubDate>Mon, 30 Dec 2019 09:00:12 +0000</pubDate>
      <link>https://forem.com/gombosg/my-java-experience-as-a-javascript-developer-52ji</link>
      <guid>https://forem.com/gombosg/my-java-experience-as-a-javascript-developer-52ji</guid>
      <description>&lt;p&gt;(Mirrored from &lt;a href="https://gombosg.com/2019/12/my-java-experience-as-a-javascript-developer/"&gt;my site&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivation – why learn Java as a JS dev?
&lt;/h2&gt;

&lt;p&gt;As a software engineer for about 2 years, I learned a lot. Starting out as a Typescript/Node.js developer, I quickly got the gripes of the Javascript world.&lt;/p&gt;

&lt;p&gt;As we know, Javascript is a dynamically typed language, with an ‘objects linked to other objects’ (or prototype linking) approach. ES2015 adds some class-like syntax sugar on top which I personally don’t like, but frameworks such as Angular really embrace them.&lt;/p&gt;

&lt;p&gt;Typescript adds static, compile-time type checking to the picture with a neatly engineered type system but it ultimately has no effect during run-time (apart from juggling with source maps).&lt;/p&gt;

&lt;p&gt;I think that if as a developer you specialize in one or two languages, &lt;strong&gt;it’s still important to learn other languages&lt;/strong&gt; , too, to widen your views and better understand general programming principles.&lt;/p&gt;

&lt;p&gt;I believe general understanding &lt;strong&gt;turns you into a better engineer even if you don’t have a CS degree&lt;/strong&gt; , plus it helps you pick up other tools of the trade (languages, frameworks) easier during your career.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where have I been before?
&lt;/h3&gt;

&lt;p&gt;During the &lt;a href="https://www.coursera.org/learn/programming-languages"&gt;Programming Languages A-B-C MOOC&lt;/a&gt;, I also tried several other languages with different flavors:&lt;/p&gt;

&lt;p&gt;Standard ML has nice type checking, type pattern matching and a cool functional approach.&lt;/p&gt;

&lt;p&gt;Racket is a dynamically typed, functional LISP-like language, which looks like a total mess but once you learn how to twist your brain inside out, it starts to make sense. Nevertheless code written in languages like this looks like a pain to reason about and maintain. (Hopefully I’m wrong here!)&lt;/p&gt;

&lt;p&gt;And there was Ruby in part C of this course, as an example of a dynamically typed but extremely object-oriented language. At least Ruby is still widely used, thanks to modern frameworks like &lt;a href="https://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After all these, I ventured into Python – learning it was a very pleasant experience, as simple as reading the &lt;a href="https://docs.python.org/3/tutorial/index.html"&gt;official tutorial&lt;/a&gt; and printing a cheat sheet.&lt;/p&gt;

&lt;p&gt;That’s a lot of languages, some more exotic, some more widespread, but &lt;strong&gt;where’s Java&lt;/strong&gt;?!&lt;/p&gt;

&lt;h3&gt;
  
  
  Strengths of Java
&lt;/h3&gt;

&lt;p&gt;Java is statically typed with a robust type system, extremely popular and widespread, used everywhere in backend and desktop apps, and also frequently being picked up by newbies as a first programming language.&lt;/p&gt;

&lt;p&gt;It’s stable, runs on a lot of devices thanks to the JVM system and it’s still being actively developed and improved with new versions nearly each year. It’s also comparably fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to start learning Java?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Head-first: a hit and miss
&lt;/h3&gt;

&lt;p&gt;If you search for &lt;a href="https://duckduckgo.com/?q=Java+tutorial"&gt;‘Java tutorial’&lt;/a&gt; on the internet, you’ll find countless sites, videos, plus of course the official documentation. I tried this approach, diving straight into coding after some minimal documentation browsing.&lt;/p&gt;

&lt;p&gt;It worked so nice for Python and JS, why not?&lt;/p&gt;

&lt;p&gt;I was so wrong… I couldn’t even make a proper Array… what is the difference between &lt;code&gt;int&lt;/code&gt; and &lt;code&gt;Integer&lt;/code&gt; (despite the fact that I knew about primitive boxing in Javascript), &lt;code&gt;String&lt;/code&gt; and &lt;code&gt;StringBuilder&lt;/code&gt;, &lt;code&gt;int[]&lt;/code&gt; and &lt;code&gt;ArrayList&amp;lt;Integer&amp;gt;&lt;/code&gt;? Why so many Array and Map, Set etc. implementations? Where is my &lt;code&gt;Array.map&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;And more importantly, how can I think and reason properly in an object-oriented way, to create scalable and maintainable code?&lt;/p&gt;

&lt;p&gt;Oh, heavens. The takeaway was that Java as a language is &lt;strong&gt;not nearly as beginner-friendly as, say, Python&lt;/strong&gt;. Maybe if I were just doing some Spring tutorial then it would have worked better, but I wanted to understand the basics of the language enough to implement a simple algorithm like a binary search or a quicksort.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mooc.fi course
&lt;/h2&gt;

&lt;p&gt;Most ‘Java tutorials’ on the web were essentially beefed up versions of the ‘official’ Oracle documentation. Don’t get me wrong, there’s a ton of material out there promising you to teach all the basics.&lt;/p&gt;

&lt;p&gt;After looking around on &lt;a href="https://www.reddit.com/r/java/"&gt;/r/java&lt;/a&gt;, I found a highly recommended online course by the University of Helsinki. Here are the links to access &lt;a href="https://moocfi.github.io/courses/2013/programming-part-1/"&gt;Part I&lt;/a&gt; and &lt;a href="https://moocfi.github.io/courses/2013/programming-part-2/"&gt;Part II&lt;/a&gt;. Each are supposed to be 6 weeks long and use an excellent NetBeans plugin called TMC (TestMyCode) to upload exercises.&lt;/p&gt;

&lt;p&gt;And jeesh, there are &lt;em&gt;a lot of&lt;/em&gt; exercises in the course! I highly recommend it for beginners, although &lt;strong&gt;they get pretty repetitive if you are a more experienced developer&lt;/strong&gt;. Nevertheless, it &lt;strong&gt;pays to stay humble&lt;/strong&gt; and go through most of them since they address lots of pain points of the Java language and offer a frustration-free way to go through these hoops.&lt;/p&gt;

&lt;p&gt;Doing several ‘books in containers in a library’ and ‘animals in farms’ types of exercises also helps you get the basics of thinking in and object-oriented fashion. The exercises are designed in a way so that you’ll naturally follow rules such as the single responsibility principle.&lt;/p&gt;

&lt;p&gt;Most tie your hand and you’ll just have to implement a class following some specification, but at the end of each week you’ll have the chance to write more complex programs in any way you wish – the excellent testing algorithms of the TMC plugin will make sure to test each corner case.&lt;/p&gt;

&lt;p&gt;(Edit: the bundled NetBeans offered on the mooc.fi website is a bit outdated, you can use the TMC plugin with the latest NetBeans by following the instructions &lt;a href="https://thedeadnode.blogspot.com/2016/10/netbeans-installing-tmc-plugin-in_43.html"&gt;described here&lt;/a&gt;.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Could it be better?
&lt;/h3&gt;

&lt;p&gt;The course, having been launched in 2013 is a bit outdated. Java 8 is not even enabled when you upload so you won’t be able to use streams for example. Exactly because of this, the authors are creating an &lt;a href="https://ohjelmointi-20.mooc.fi/"&gt;updated version&lt;/a&gt; – currently only available in Finnish.&lt;/p&gt;

&lt;p&gt;(Edit: the English version of the updated course is scheduled for Q1 2020. I’ll definitely take a look at it once it’s updated! In the meantime you can try the original one or use Google Translate!&lt;/p&gt;

&lt;p&gt;Also I only skimmed the last two weeks – fortunately I won’t need to build UIs in &lt;a href="https://en.wikipedia.org/wiki/Swing_(Java)"&gt;Swing&lt;/a&gt; in the foreseeable future.&lt;/p&gt;

&lt;p&gt;So yes, the Java you would use today in practice looks a bit different from the one you use in this course. Nearly zero &lt;code&gt;for&lt;/code&gt; cycles, a bit more annotations and less boilerplate of course. But after doing the course, you’ll be knowledgeable enough to easily look up the missing stuff and any kind of API in essence.&lt;/p&gt;

&lt;p&gt;The mooc.fi course is of very high quality, with carefully built exercises and the unbeatable price of free, with zero ads – something that’s pretty valuable by itself in the modern web. Heck, the whole material is Creative Commons licensed.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to learn next?
&lt;/h3&gt;

&lt;p&gt;I’ll definitely keep on learning Java. Now that I’m confident with language basics (not messing up basic data structures), I’ll be more than happy to take more backend tickets at work.&lt;/p&gt;

&lt;p&gt;Also I’ll keep on learning about new Java features: streams, lambdas, futures, plus widely-used tools such as JUnit, Mockito or Lombok. Learning the basics of Spring is a must (I’d like to study multiple full-stack frameworks in 2020).&lt;/p&gt;

&lt;p&gt;All in all, it’s almost impossible to walk past Java in today’s programming world. Even if I find the language a bit too verbose for my taste, learning a bit about it was an important experience. Learning some OOP basics is also nice, plus it opens the door to other similar languages such as C#.&lt;/p&gt;

&lt;p&gt;Another tool in the toolbox to solve more problems in new and more efficient ways.&lt;/p&gt;

&lt;p&gt;Update 2020 May: I made some more progress, now fixing some basic bugs and whatever in production code. &lt;a href="https://stackify.com/streams-guide-java-8/"&gt;This guide on streams&lt;/a&gt; turned out to be really useful! Now I'm learning some Spring framework basics on Pluralsight.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>java</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Hello!</title>
      <dc:creator>Gergely Gombos</dc:creator>
      <pubDate>Wed, 25 Dec 2019 18:18:54 +0000</pubDate>
      <link>https://forem.com/gombosg/hello-2b8o</link>
      <guid>https://forem.com/gombosg/hello-2b8o</guid>
      <description>&lt;p&gt;(Mirrored from my site &lt;a href="https://gombosg.com/2019/12/hello/"&gt;https://gombosg.com/2019/12/hello/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;My first blog post. If you are reading this, welcome! I’m happy that you are here.&lt;/p&gt;

&lt;p&gt;I’m Gergely (Greg), a software engineer from Budapest, Hungary, who loves solving problems while at work (anywhere it catches me), hacking at home and boxing at the dojo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why?
&lt;/h3&gt;

&lt;p&gt;I decided to start a blog for multiple reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get stuff out of my head i.e. share useful information&lt;/li&gt;
&lt;li&gt;Reflect on my journey as a professional software engineer&lt;/li&gt;
&lt;li&gt;Connect with people&lt;/li&gt;
&lt;li&gt;Find my own style and practice writing&lt;/li&gt;
&lt;li&gt;Have my personal corner of the internet, aligning with my values about how the web should look like despite being an active developer of the modern web.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Expect posts every now and then, once a week by the least.&lt;/p&gt;

&lt;h4&gt;
  
  
  Upcoming stuff
&lt;/h4&gt;

&lt;p&gt;Well, for starters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A proper contact area&lt;/li&gt;
&lt;li&gt;Add a photo of myself?&lt;/li&gt;
&lt;li&gt;Expand the &lt;a href="https://gombosg.com/about/"&gt;About&lt;/a&gt; page a bit with my personal creed&lt;/li&gt;
&lt;li&gt;Create a skills list &amp;amp; roadmap to share my learning journey&lt;/li&gt;
&lt;li&gt;Reflect on my current career goals and general experience as an enterprise employee&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What now? Feel free to say hi in the comments and subscribe to my &lt;a href="https://gombosg.com/feed"&gt;RSS feed&lt;/a&gt;. Sorry, no mailing list this time, but let me know if you would prefer an email notification.&lt;/p&gt;

</description>
      <category>general</category>
    </item>
  </channel>
</rss>
