<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Software Development on Team Qameta</title>
		<link>https://qameta.com/</link>
		<description>Recent content in Software Development on Team Qameta</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Fri, 24 Apr 2026 13:55:45 +0200</lastBuildDate>
		
			<atom:link href="https://qameta.com/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>We Will Be Driving Autonomously Long Before Any AI Provider Is Liable for Generated Code</title>
				<link>https://qameta.com/posts/ai-liability-vs-autonomous-driving/</link>
				<pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate>
				<guid>https://qameta.com/posts/ai-liability-vs-autonomous-driving/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/posts/ai-liability-vs-autonomous-driving/ai-liablitiy-vs-autonomous-driving.png&#34; alt=&#34;We Will Be Driving Autonomously Long Before Any AI Provider Is Liable for Generated Code&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;At some point, no human will need to be behind the wheel anymore. That&amp;rsquo;s not a question of &lt;em&gt;if&lt;/em&gt;, but &lt;em&gt;when&lt;/em&gt;. Yet while autonomous vehicles are on their way to being fully accepted — socially and legally — will an AI provider ever take on liability for generated code? Very unlikely — and for one fundamental reason: the difference between a closed and an open system.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Deploy Vaultwarden Password Manager to Dokku Micro PaaS</title>
				<link>https://qameta.com/posts/deploy-vaultwarden-password-manager-to-dokku-micro-paas/</link>
				<pubDate>Sat, 28 Dec 2024 17:12:00 +0100</pubDate>
				<guid>https://qameta.com/posts/deploy-vaultwarden-password-manager-to-dokku-micro-paas/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/posts/deploy-vaultwarden-password-manager-to-dokku-micro-paas/vaultwarden-on-dokku.png&#34; alt=&#34;Vaultwarden on Dokku&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Having an easy to use password manager using an existing Dokku setup is a great&#xA;way to keep your passwords secure. In this post, I will show you how to deploy&#xA;&lt;a href=&#34;https://github.com/dani-garcia/vaultwarden&#34;&gt;Vaultwarden Password Manager&lt;/a&gt; to&#xA;&lt;a href=&#34;https://dokku.com/&#34;&gt;Dokku Micro PaaS&lt;/a&gt; using a&#xA;&lt;a href=&#34;https://docs.docker.com/reference/dockerfile/&#34;&gt;Dockerfile&lt;/a&gt;. Including DB setup,&#xA;SSL and backup.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Identify unused Routes in Ruby on Rails</title>
				<link>https://qameta.com/posts/identify-unused-routes-in-ruby-on-rails/</link>
				<pubDate>Fri, 17 May 2024 12:26:00 +0100</pubDate>
				<guid>https://qameta.com/posts/identify-unused-routes-in-ruby-on-rails/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/posts/identify-unused-routes-in-ruby-on-rails/identify-unused-routes-in-ruby-on-rails.png&#34; alt=&#34;Custom Rake Task: Identify unused routes in Ruby on Rails&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Rails routes map URLs of a Ruby on Rails application to controller actions. As&#xA;a project grows, many new routes get added and older ones might become obsolete.&#xA;Cleanup of unused routes is a good practice to keep the codebase clean and&#xA;maintainable. This article shows how you can identify unused routes in Ruby on&#xA;Rails before 7.1 and after 7.1 with built-in tooling.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Use Geocoder and MaxMind DB to Geocode IP Addresses</title>
				<link>https://qameta.com/posts/use-geocoder-and-maxmind-db-to-geocode-ip-addresses/</link>
				<pubDate>Wed, 29 Nov 2023 10:26:00 +0100</pubDate>
				<guid>https://qameta.com/posts/use-geocoder-and-maxmind-db-to-geocode-ip-addresses/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/posts/use-geocoder-and-maxmind-db-to-geocode-ip-addresses/ruby-on-rails-geocoder-maxmind-geoip2.png&#34; alt=&#34;Explore Google IP address data&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Utilizing IP addresses for communication is a fundamental aspect of many web&#xA;applications employing HTTP(S) as their protocol, particularly those&#xA;interconnected to the internet. However, a multitude of IP addresses are also&#xA;generated through protocols such as SSH, SMTP, or IMAP. In this article, we&amp;rsquo;ll&#xA;explore how to determine their origins and extract valuable data using the&#xA;&lt;a href=&#34;https://github.com/alexreisner/geocoder/&#34;&gt;geocoder gem&lt;/a&gt; in conjunction with the&#xA;&lt;a href=&#34;https://dev.maxmind.com/geoip/geolite2-free-geolocation-data&#34;&gt;MaxMind GeoLite2&#xA;Database&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Default URL Options in Ruby on Rails</title>
				<link>https://qameta.com/posts/default-url-options-in-ruby-on-rails/</link>
				<pubDate>Fri, 01 Sep 2023 15:45:00 +0100</pubDate>
				<guid>https://qameta.com/posts/default-url-options-in-ruby-on-rails/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/posts/default-url-options-in-ruby-on-rails/ruby-on-rails-default-url-options.png&#34; alt=&#34;Ruby on Rails default_url_options in console&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Like most &lt;a href=&#34;https://www.ruby-lang.org&#34;&gt;Ruby&lt;/a&gt; developers you have to set a&#xA;&lt;code&gt;default_url_options&lt;/code&gt; on a &lt;a href=&#34;https://rubyonrails.org&#34;&gt;Ruby on Rails&lt;/a&gt; project.&#xA;Depending on the use case you have to set several of them with different values.&lt;/p&gt;&#xA;&lt;p&gt;The name of the method &lt;code&gt;default_url_options&lt;/code&gt; is the same, but it is used in&#xA;different contexts&#xA;(&lt;a href=&#34;https://guides.rubyonrails.org/action_controller_overview.html&#34;&gt;controller&lt;/a&gt;,&#xA;&lt;a href=&#34;https://guides.rubyonrails.org/action_mailer_basics.html&#34;&gt;mail&lt;/a&gt;, or &lt;a href=&#34;https://guides.rubyonrails.org/active_storage_overview.html&#34;&gt;file&#xA;storage&lt;/a&gt;, it may be&#xA;confusing and can even have side effects for your project you have to figure out&#xA;yourself. Depending on the value you set, they may be reused in other contexts&#xA;like&#xA;&lt;a href=&#34;https://guides.rubyonrails.org/active_storage_overview.html&#34;&gt;ActiveStorage&lt;/a&gt;,&#xA;&lt;a href=&#34;https://guides.rubyonrails.org/action_mailer_basics.html&#34;&gt;ActionMailer&lt;/a&gt;, and&#xA;third-party gems like &lt;a href=&#34;https://rubygems.org/gems/devise&#34;&gt;devise&lt;/a&gt;. I couldn&amp;rsquo;t&#xA;find any official documentation for the most common cases (web, mail, file&#xA;storage, test), I&amp;rsquo;ve written one.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Working with Legacy Ruby on Rails: spring.gem fork() Crash</title>
				<link>https://qameta.com/posts/working-with-legacy-ruby-on-rails-spring-fork-crash/</link>
				<pubDate>Thu, 17 Aug 2023 10:25:00 +0100</pubDate>
				<guid>https://qameta.com/posts/working-with-legacy-ruby-on-rails-spring-fork-crash/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/posts/working-with-legacy-ruby-on-rails-spring-fork-crash/spring-thread-fork-crash.png&#34; alt=&#34;Spring Fork Crash on Ruby on Rails&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Working with legacy &lt;a href=&#34;https://rubyonrails.org&#34;&gt;Ruby on Rails&lt;/a&gt; applications is for&#xA;most developers a problem, as they have a lot of extra work to do:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use older documentation, which matches the legacy project&lt;/li&gt;&#xA;&lt;li&gt;can&amp;rsquo;t use fixes and improvements of programming language&lt;/li&gt;&#xA;&lt;li&gt;can&amp;rsquo;t use improvements and features of up-to-date framework version&lt;/li&gt;&#xA;&lt;li&gt;have to use older and mostly unsupported third-party extensions&lt;/li&gt;&#xA;&lt;li&gt;are maybe forced to write code, which must be changed for updates and upgrades&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;First of all, many developers will hit the CPU architecture change from&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/X86&#34;&gt;x86&lt;/a&gt;/&lt;a href=&#34;https://en.wikipedia.org/wiki/X86-64&#34;&gt;x64&lt;/a&gt;&#xA;to &lt;a href=&#34;https://en.wikipedia.org/wiki/ARM_architecture_family&#34;&gt;ARM64&lt;/a&gt; using &lt;a href=&#34;https://www.apple.com/mac/&#34;&gt;Apple&#xA;Macs&lt;/a&gt;. Even installing older&#xA;&lt;a href=&#34;https://www.ruby-lang.org/en/&#34;&gt;Ruby&lt;/a&gt; versions on a newer OS (operating system)&#xA;on a x86/x64 architecture is hard. It produces a lot of problems, warnings, and&#xA;errors.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Analyzing SassC::SyntaxError in Ruby on Rails 7.0</title>
				<link>https://qameta.com/posts/analyzing-sassc-syntax-error-in-ruby-on-rails-7-0/</link>
				<pubDate>Thu, 29 Jun 2023 14:16:00 +0100</pubDate>
				<guid>https://qameta.com/posts/analyzing-sassc-syntax-error-in-ruby-on-rails-7-0/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/posts/analyzing-sassc-syntax-error-in-ruby-on-rails-7-0/rails-sassc-syntaxerror.png&#34; alt=&#34;SassC::SyntaxError in Ruby on Rails&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I was running a up to date Ruby on Rails 7.0 project using&#xA;&lt;a href=&#34;https://github.com/rails/cssbundling-rails&#34;&gt;cssbundling-rails&lt;/a&gt;. The project was&#xA;in production for several months. After pushing the code to &lt;a href=&#34;https://en.wikipedia.org/wiki/Continuous_integration&#34;&gt;Continuous&#xA;Integration (CI)&lt;/a&gt; using&#xA;&lt;a href=&#34;https://docs.github.com/en/actions&#34;&gt;GitHub Actions&lt;/a&gt; it failed with an error:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Deploy Ruby on Rails 7.0 to Dokku micro PaaS</title>
				<link>https://qameta.com/posts/deploy-rails-7-0-to-dokku-micro-paas/</link>
				<pubDate>Thu, 22 Jun 2023 17:02:00 +0100</pubDate>
				<guid>https://qameta.com/posts/deploy-rails-7-0-to-dokku-micro-paas/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/posts/deploy-rails-7-0-to-dokku-micro-paas/ruby-on-rails-on-dokku.png&#34; alt=&#34;Ruby on Rails on Dokku&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;This tutorial was tested with Dokku version 0.34.0&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Deploying a &lt;a href=&#34;https://rubyonrails.org&#34;&gt;Ruby on Rails&lt;/a&gt; application to a&#xA;&lt;a href=&#34;https://dokku.com&#34;&gt;Dokku&lt;/a&gt; instance is pretty forward. There are only a few&#xA;things you have to consider. In this guide, I will tell you, what might be the&#xA;things and how to solve them. I was missing a complete guide with explanations&#xA;aligned to the deployment of a default Ruby on Rails application.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Fixing require LoadError as an example for the matrix gem</title>
				<link>https://qameta.com/posts/fixing-require-loaderror-as-example-for-matrix-gem/</link>
				<pubDate>Thu, 15 Jun 2023 16:52:00 +0100</pubDate>
				<guid>https://qameta.com/posts/fixing-require-loaderror-as-example-for-matrix-gem/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/images/posts/require-matrix-gem-load-error.png&#34; alt=&#34;cannot load such file matrix LoadError&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Some gems like &lt;a href=&#34;https://rubygems.org/gems/matrix&#34;&gt;matrix&lt;/a&gt; or&#xA;&lt;a href=&#34;https://rubygems.org/gems/rexml&#34;&gt;rexml&lt;/a&gt; were added at some point to ruby&#xA;becoming so-called default gems. But they may be removed from being default in&#xA;newer ruby versions, resulting in broken builds like for us with&#xA;&lt;a href=&#34;https://rubygems.org/gems/prawn&#34;&gt;prawn&lt;/a&gt;:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Analyzing Geofeed Technology to improve IP networks</title>
				<link>https://qameta.com/posts/analyzing-geofeed-technology-to-improve-ip-networks/</link>
				<pubDate>Tue, 28 Mar 2023 13:31:00 +0100</pubDate>
				<guid>https://qameta.com/posts/analyzing-geofeed-technology-to-improve-ip-networks/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/images/posts/geofeed.png&#34; alt=&#34;Geofeed example&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Geofeed is a list of IP networks with basic geolocation information. It is&#xA;published using CSV format through an http(s) address. Most of these addresses are&#xA;shared informally between trusted parties. Some were published on sites like&#xA;&lt;a href=&#34;https://www.reddit.com/r/StarlinkEngineering/comments/phas4h/starlink_has_published_ip_geolocation_mapping/&#34;&gt;Reddit: Starlink has published IP Geolocation mapping&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Subscribe to our Newsletter</title>
				<link>https://qameta.com/newsletter-subscribe/</link>
				<pubDate>Thu, 09 Mar 2023 15:35:00 +0100</pubDate>
				<guid>https://qameta.com/newsletter-subscribe/</guid>
				<description>&lt;script&#xA;    src=&#34;https://challenges.cloudflare.com/turnstile/v0/api.js&#34;&#xA;    async&#xA;    defer&#xA;&gt;&lt;/script&gt;&#xA;&#xA;&lt;div class=&#34;newsletter&#34;&gt;&#xA;    &lt;p class=&#34;pb-2&#34;&gt;&#xA;        Join us by subscribing to our newsletter and get tutorials, news posts&#xA;        and updates from Team Qameta.&#xA;    &lt;/p&gt;&#xA;    &lt;form&#xA;        action=&#34;https://sendy.qameta.com/subscribe&#34;&#xA;        method=&#34;POST&#34;&#xA;        accept-charset=&#34;utf-8&#34;&#xA;        id=&#34;newsletter-form&#34;&#xA;    &gt;&#xA;        &lt;label for=&#34;name&#34; class=&#34;mb-2 text-md&#34;&gt;Name&lt;/label&gt;&lt;br /&gt;&#xA;        &lt;input&#xA;            type=&#34;text&#34;&#xA;            name=&#34;name&#34;&#xA;            id=&#34;name&#34;&#xA;            placeholder=&#34;Your Name&#34;&#xA;            class=&#34;border py-2 px-3 mb-2 w-full md:w-1/2&#34;&#xA;        /&gt;&#xA;        &lt;br /&gt;&#xA;        &lt;label for=&#34;email&#34; class=&#34;mb-2 mt-2 text-md&#34;&gt;Email&lt;/label&gt;&lt;br /&gt;&#xA;        &lt;input&#xA;            type=&#34;email&#34;&#xA;            name=&#34;email&#34;&#xA;            id=&#34;email&#34;&#xA;            placeholder=&#34;Your E-Mail&#34;&#xA;            class=&#34;border py-2 px-3 w-full md:w-1/2&#34;&#xA;        /&gt;&#xA;        &lt;br /&gt;&lt;br /&gt;&#xA;        &lt;input type=&#34;checkbox&#34; name=&#34;gdpr&#34; id=&#34;gdpr&#34; /&gt;&#xA;        &lt;span&gt;&#xA;            &lt;strong&gt;Newsletter permission:&lt;/strong&gt;&#xA;            I give my consent to Team Qameta to be in touch with me via email&#xA;            using the information I have provided in this form for the purpose&#xA;            of news, updates and marketing.&#xA;        &lt;/span&gt;&#xA;        &lt;br /&gt;&lt;br /&gt;&#xA;        &lt;div&#xA;            class=&#34;cf-turnstile&#34;&#xA;            data-sitekey=&#34;0x4AAAAAACKOhQfFCoPqLcED&#34;&#xA;            data-callback=&#34;onTurnstileSuccess&#34;&#xA;            data-error-callback=&#34;onTurnstileError&#34;&#xA;            data-expired-callback=&#34;onTurnstileExpired&#34;&#xA;        &gt;&lt;/div&gt;&#xA;&#xA;        &lt;!-- &lt;span&gt; --&gt;&#xA;        &lt;!--   &lt;strong&gt;What to expect&lt;/strong&gt;: If you wish to withdraw your consent and --&gt;&#xA;        &lt;!--   stop hearing from us, simply click the unsubscribe link at the bottom of --&gt;&#xA;        &lt;!--   every email we send or contact us at newsletter@mailmum.io. We value and --&gt;&#xA;        &lt;!--   respect your personal data and privacy. To view our privacy policy, please --&gt;&#xA;        &lt;!--   visit our website. By submitting this form, you agree that we may process --&gt;&#xA;        &lt;!--   your information in accordance with these terms. --&gt;&#xA;        &lt;!-- &lt;/span&gt; --&gt;&#xA;        &lt;!-- &lt;br/&gt;&lt;br/&gt; --&gt;&#xA;        &lt;div style=&#34;display: none&#34;&gt;&#xA;            &lt;label for=&#34;hp&#34;&gt;HP&lt;/label&gt;&lt;br /&gt;&#xA;            &lt;input type=&#34;text&#34; name=&#34;hp&#34; id=&#34;hp&#34; /&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;input type=&#34;hidden&#34; name=&#34;list&#34; value=&#34;BY2NBjX0LeP892xMdqXptUdw&#34; /&gt;&#xA;        &lt;input type=&#34;hidden&#34; name=&#34;subform&#34; value=&#34;yes&#34; /&gt;&#xA;        &lt;input&#xA;            type=&#34;submit&#34;&#xA;            name=&#34;submit&#34;&#xA;            id=&#34;submit-btn&#34;&#xA;            disabled&#xA;            value=&#34;Subscribe now&#34;&#xA;            class=&#34;text-lg pl-6 pr-6 pt-2 pb-2 bg-primary text-white rounded&#34;&#xA;        /&gt;&#xA;    &lt;/form&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;style&gt;&#xA;    #submit-btn:disabled {&#xA;        opacity: 0.5;&#xA;        cursor: not-allowed;&#xA;    }&#xA;&lt;/style&gt;&#xA;&#xA;&lt;script&gt;&#xA;    function onTurnstileSuccess(token) {&#xA;        console.log(&#34;Turnstile success:&#34;, token);&#xA;        document.getElementById(&#34;submit-btn&#34;).disabled = false;&#xA;    }&#xA;    function onTurnstileError(errorCode) {&#xA;        console.error(&#34;Turnstile error:&#34;, errorCode);&#xA;        document.getElementById(&#34;submit-btn&#34;).disabled = true;&#xA;    }&#xA;    function onTurnstileExpired() {&#xA;        console.warn(&#34;Turnstile token expired&#34;);&#xA;        document.getElementById(&#34;submit-btn&#34;).disabled = true;&#xA;    }&#xA;&lt;/script&gt;</description>
			</item>
			<item>
				<title>Fix Flaky Rails System Tests caused by slow scrolling or animations</title>
				<link>https://qameta.com/posts/fix-flaky-rails-system-tests-caused-by-slow-scrolling-or-animations/</link>
				<pubDate>Fri, 03 Mar 2023 14:12:00 +0100</pubDate>
				<guid>https://qameta.com/posts/fix-flaky-rails-system-tests-caused-by-slow-scrolling-or-animations/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/images/posts/chrome-chromium-smooth-scrolling-flag.png&#34; alt=&#34;Chrome and Chromium Smooth scrolling flag&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Flakiness on browser-based &lt;a href=&#34;https://edgeguides.rubyonrails.org/testing.html#system-testing&#34;&gt;system&#xA;tests&lt;/a&gt;&#xA;(integration tests) in &lt;a href=&#34;https://rubyonrails.org&#34;&gt;Ruby on Rails&lt;/a&gt; may have a lot&#xA;of different reasons. One is scrolling, which may be slowed down by browser&#xA;setup (smooth scrolling), JavaScript callbacks which result in some kind of&#xA;events like for animations, etc.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Howto migrate from Webpacker to jsbundling-rails in Ruby on Rails</title>
				<link>https://qameta.com/posts/howto-migrate-from-webpacker-to-jsbundling-rails-in-ruby-on-rails/</link>
				<pubDate>Thu, 23 Feb 2023 12:23:00 +0100</pubDate>
				<guid>https://qameta.com/posts/howto-migrate-from-webpacker-to-jsbundling-rails-in-ruby-on-rails/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/images/posts/webpacker-to-js-bundling-in-ruby-on-rails.png&#34; alt=&#34;Using jsbundling-rails for JavaScript pipeline&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;A lot of &lt;a href=&#34;https://rubyonrails.org&#34;&gt;Ruby on Rails&lt;/a&gt; applications created with Ruby&#xA;on Rails version 5.x or 6.x or even upgraded from the previous versions are&#xA;using &lt;a href=&#34;https://github.com/rails/webpacker&#34;&gt;webpacker&lt;/a&gt; as their primary asset&#xA;pipeline. But now as webpacker has retired, it is time to move on.&#xA;&lt;a href=&#34;https://github.com/rails/jsbundling-rails&#34;&gt;jsbundling-rails&lt;/a&gt; is or will be&#xA;the most obvious step to go. Don&amp;rsquo;t try to move to&#xA;&lt;a href=&#34;https://github.com/rails/importmap-rails&#34;&gt;importmap-rails&lt;/a&gt; directly, as you may&#xA;encounter more problems you have to solve.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Howto migrate from Webpacker to cssbundling-rails in Ruby on Rails for CSS</title>
				<link>https://qameta.com/posts/howto-migrate-from-webpacker-to-cssbundling-rails-in-ruby-on-rails/</link>
				<pubDate>Wed, 15 Feb 2023 14:25:00 +0100</pubDate>
				<guid>https://qameta.com/posts/howto-migrate-from-webpacker-to-cssbundling-rails-in-ruby-on-rails/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/images/posts/webpacker-to-css-bundling-in-ruby-on-rails.png&#34; alt=&#34;Using cssbundling-rails for CSS pipeline&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;A lot of &lt;a href=&#34;https://rubyonrails.org&#34;&gt;Ruby on Rails&lt;/a&gt; applications created with Ruby&#xA;on Rails version 5.x or 6.x or even upgraded from the previous versions are&#xA;using &lt;a href=&#34;https://github.com/rails/webpacker&#34;&gt;webpacker&lt;/a&gt; as their primary asset&#xA;pipeline. But now as webpacker has retired, it is time to move on.&#xA;&lt;a href=&#34;https://github.com/rails/cssbundling-rails&#34;&gt;cssbundling-rails&lt;/a&gt; is or will be&#xA;the most obvious step to go.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Howto remove sprockets-rails from you Ruby on Rails project</title>
				<link>https://qameta.com/posts/howto-remove-sprockets-rails-from-your-ruby-on-rails-project/</link>
				<pubDate>Mon, 13 Feb 2023 14:21:00 +0100</pubDate>
				<guid>https://qameta.com/posts/howto-remove-sprockets-rails-from-your-ruby-on-rails-project/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/images/posts/remove-sprockets-rails-from-ruby-on-rails.png&#34; alt=&#34;Remove Sprockets from Ruby on Rails&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Before removing &lt;a href=&#34;https://github.com/rails/sprockets-rails&#34;&gt;sprockets-rails&lt;/a&gt; from&#xA;dependencies of your &lt;a href=&#34;https://rubyonrails.org&#34;&gt;Ruby on Rails&lt;/a&gt; project, check&#xA;whether you are surfing images or fonts using sprockets through assets paths&#xA;like:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;app/assets/images&lt;/li&gt;&#xA;&lt;li&gt;app/assets/fonts&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&amp;hellip; or any other assets except &lt;a href=&#34;https://en.wikipedia.org/wiki/Style_sheet_language&#34;&gt;Style Sheets&#xA;(CSS)&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;app/assets/js&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;If you are using&#xA;&lt;a href=&#34;https://github.com/rails/cssbundling-rails/&#34;&gt;cssbundling-rails&lt;/a&gt; the sprockets&#xA;default path for Style Sheets is used by default:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Copy Files Compressed with Tar via ssh from and to a Linux Server</title>
				<link>https://qameta.com/posts/copy-files-compressed-with-tar-via-ssh-to-a-linux-server/</link>
				<pubDate>Mon, 30 Jan 2023 17:09:00 +0100</pubDate>
				<guid>https://qameta.com/posts/copy-files-compressed-with-tar-via-ssh-to-a-linux-server/</guid>
				<description>&lt;p&gt;Copying files from a development machine or a server to another one may take up&#xA;a lot of time, resources and traffic which dependent on the task may be more or&#xA;less a problem. There are common Linux/Unix tools like&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Secure_copy_protocol&#34;&gt;scp&lt;/a&gt; and&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Rsync&#34;&gt;rsync&lt;/a&gt; to do the job, but they may be a&#xA;wrong choice dependent on the task like:&lt;/p&gt;</description>
			</item>
			<item>
				<title>New Alternative Search Engine: neeva and neevaAI</title>
				<link>https://qameta.com/posts/new-alternative-search-engine-neeva-ai/</link>
				<pubDate>Thu, 26 Jan 2023 15:26:00 +0100</pubDate>
				<guid>https://qameta.com/posts/new-alternative-search-engine-neeva-ai/</guid>
				<description>&lt;p&gt;&lt;img src=&#34;https://qameta.com/images/posts/neeva-search-result-qameta.png&#34; alt=&#34;neeva search results for qameta&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Today the new &lt;a href=&#34;https://neeva.com&#34;&gt;neevaAI search engine&lt;/a&gt; launched on &lt;a href=&#34;https://www.producthunt.com&#34;&gt;Product&#xA;Hunt&lt;/a&gt;. This is the &lt;a href=&#34;https://www.producthunt.com/posts/neevaai&#34;&gt;third launch on Product&#xA;Hunt&lt;/a&gt; with all new added AI&#xA;functionality.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-neeva&#34;&gt;What is neeva?&lt;/h2&gt;&#xA;&lt;p&gt;Neeva is an alternative search engine focusing on better results. They say about&#xA;theirself:&lt;/p&gt;</description>
			</item>
			<item>
				<title>To use or not to use assert_predicate with minitest in Ruby</title>
				<link>https://qameta.com/posts/use-assert-predicate-with-minitest-ruby-by-rubocop/</link>
				<pubDate>Mon, 16 Jan 2023 16:50:00 +0100</pubDate>
				<guid>https://qameta.com/posts/use-assert-predicate-with-minitest-ruby-by-rubocop/</guid>
				<description>&lt;p&gt;Recently &lt;a href=&#34;https://rubocop.org&#34;&gt;RuboCop&lt;/a&gt; started to blame my &lt;code&gt;assert something.booked?&lt;/code&gt; style tests in&#xA;&lt;a href=&#34;https://github.com/minitest/minitest&#34;&gt;minitest&lt;/a&gt; and telling me this:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Minitest/AssertPredicate: Prefer using `assert_predicate(something, :booked?)`.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I&amp;rsquo;ve looked for the corresponding &lt;a href=&#34;https://github.com/rubocop/rubocop-minitest/pull/161&#34;&gt;Pull&#xA;Request&lt;/a&gt; and also checked&#xA;the final &lt;a href=&#34;https://minitest.rubystyle.guide/#assert-predicate&#34;&gt;Rubocop Minitest Style Guide: Assert&#xA;Predicate&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;According to the documentation, we can read:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Target Alternative Search Engines through IndexNow</title>
				<link>https://qameta.com/posts/target-alternative-search-engines-through-indexnow/</link>
				<pubDate>Tue, 03 Jan 2023 16:19:00 +0100</pubDate>
				<guid>https://qameta.com/posts/target-alternative-search-engines-through-indexnow/</guid>
				<description>&lt;p&gt;Targeting alternative Search engines by simply looking to search engines market&#xA;number may look like a waste of time, but there is a lot of value we may miss.&#xA;IndexNow Technology is here to help you with this target.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-targeting-alternative-search-engines-at-all&#34;&gt;Why targeting alternative search engines at all?&lt;/h2&gt;&#xA;&lt;p&gt;Targeting alternative Search engines to Google may look like a waste of time&#xA;because of the market reach Google has, but there are many reasons you may&#xA;consider:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Continuous Delivery</title>
				<link>https://qameta.com/continuous-delivery/</link>
				<pubDate>Thu, 08 Dec 2022 13:12:49 +0100</pubDate>
				<guid>https://qameta.com/continuous-delivery/</guid>
				<description>&lt;p&gt;Delivering continuous and high-quality software is an important part of software&#xA;development. By combining &lt;a href=&#34;https://qameta.com/continuous-integration/&#34;&gt;Continuous Integration&lt;/a&gt; and&#xA;automated deployment through a Continuous Delivery System we can:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Deploy a branch on a separate staging environment for review&lt;/li&gt;&#xA;&lt;li&gt;Merged code into staging branch can be deployed to staging test system for&#xA;review.&lt;/li&gt;&#xA;&lt;li&gt;Production-ready code merged to the production branch can be deployed&#xA;automatically by the system without a trigger by the developer making it a&#xA;repeatable and bulletproof process.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;These are only view cases you may use a Continuous Delivery for. But to make&#xA;it a success, you need to provide a special ground in your software development.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Define Default URL for ActiveStorage to fix Mixed Content Error</title>
				<link>https://qameta.com/posts/define-default-url-for-active-storage-to-fix-mixed-content-error/</link>
				<pubDate>Tue, 15 Nov 2022 17:06:00 +0100</pubDate>
				<guid>https://qameta.com/posts/define-default-url-for-active-storage-to-fix-mixed-content-error/</guid>
				<description>&lt;p&gt;Using ActiveStorage with external services like AWS S3 for saving and surfing&#xA;attachments like images is great. The setup is well explained in &lt;a href=&#34;https://guides.rubyonrails.org/active_storage_overview.html&#34;&gt;Active Storage&#xA;Overview&lt;/a&gt; in &lt;a href=&#34;https://guides.rubyonrails.org&#34;&gt;Ruby&#xA;on Rails Guides&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;But if you start using it, you will maybe encounter some problems, which are not&#xA;that easy to find or debug, as they mostly appear in production. One of the&#xA;problems we encountered was a &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content&#34;&gt;Mixed&#xA;content&lt;/a&gt;&#xA;related to ActiveStorage. This was not a big problem at first, as you get only a&#xA;warning in a browser with default configuration. But after we added an iOS App,&#xA;which was using&#xA;&lt;a href=&#34;https://developer.apple.com/documentation/webkit/wkwebview&#34;&gt;WkWebViews&lt;/a&gt;, some&#xA;random redirects to AWS S3 images stopped working. We couldn&amp;rsquo;t even see&#xA;connections for these images to ActiveStorage endpoint of our &lt;a href=&#34;https://rubyonrails.org&#34;&gt;Ruby on&#xA;Rails&lt;/a&gt; Application in logs, which made it harder to&#xA;debug.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Continuous Integration</title>
				<link>https://qameta.com/continuous-integration/</link>
				<pubDate>Fri, 11 Nov 2022 13:12:49 +0100</pubDate>
				<guid>https://qameta.com/continuous-integration/</guid>
				<description>&lt;p&gt;As software change all time, modern software development needs a system, which&#xA;checks these changes for:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;can be built?&lt;/li&gt;&#xA;&lt;li&gt;can be started?&lt;/li&gt;&#xA;&lt;li&gt;is working as expected&lt;/li&gt;&#xA;&lt;li&gt;is secure&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;A Continuous Integration System (CI) is an essential tool in our workflow and&#xA;can:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Test Driven Development</title>
				<link>https://qameta.com/test-driven-development/</link>
				<pubDate>Wed, 09 Nov 2022 10:12:49 +0100</pubDate>
				<guid>https://qameta.com/test-driven-development/</guid>
				<description>&lt;p&gt;Test Driven Software Development is our philosophy and for us the most important&#xA;quality factor we can rely and improve on. By having a reliable test suite you:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Have a living documentation of your software&lt;/li&gt;&#xA;&lt;li&gt;Knowledge around implementation is readable and executable&lt;/li&gt;&#xA;&lt;li&gt;Have tests to stop bugs reappear in production&lt;/li&gt;&#xA;&lt;li&gt;You can automate on it a lot of additional things like updates of third-party&#xA;components&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;we-write-tests-first&#34;&gt;We Write Tests First&lt;/h2&gt;&#xA;&lt;p&gt;A very important point is to write tests first, to cover the thoughts and cases&#xA;a developer is thinking about while trying to solve them in software. What you&#xA;get on this approach for free:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Define Canonical URL in a Hugo Theme</title>
				<link>https://qameta.com/posts/define-canonical-url-in-a-hugo-theme/</link>
				<pubDate>Mon, 31 Oct 2022 10:59:00 +0100</pubDate>
				<guid>https://qameta.com/posts/define-canonical-url-in-a-hugo-theme/</guid>
				<description>&lt;p&gt;&lt;a href=&#34;https://gohugo.io&#34;&gt;Hugo&lt;/a&gt; is a &lt;a href=&#34;https://en.wikipedia.org/wiki/Static_site_generator&#34;&gt;Static site&#xA;generator&lt;/a&gt;, but links to&#xA;your site may contain optional parameters like &lt;code&gt;ref=...&lt;/code&gt; which may produce&#xA;duplicate content for search engines. You can use canonical URL to define, which&#xA;URL should be used by Google and co.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Imprint</title>
				<link>https://qameta.com/imprint/</link>
				<pubDate>Mon, 10 Oct 2022 10:40:25 +0100</pubDate>
				<guid>https://qameta.com/imprint/</guid>
				<description>&lt;p&gt;Konstantin Filtschew&lt;br&gt;&#xA;Using business name: Team Qameta&lt;br&gt;&#xA;Rudolf-Dietz-Str. 4&lt;br&gt;&#xA;65550 Limburg&lt;br&gt;&#xA;Germany&lt;/p&gt;&#xA;&lt;p&gt;Vat ID: DE263051243&lt;/p&gt;&#xA;&lt;p&gt;D-U-N-S®-Number: 3141 97656&lt;/p&gt;&#xA;&lt;p&gt;Contact by mail: &lt;a href=&#34;mailto:info@qameta.com&#34;&gt;info@qameta.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Happy to get also unwanted (spam) mail. We will use them for good.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Data Protection Policy</title>
				<link>https://qameta.com/data-protection-policy/</link>
				<pubDate>Sun, 15 May 2022 10:32:47 +0100</pubDate>
				<guid>https://qameta.com/data-protection-policy/</guid>
				<description>&lt;p&gt;The Team Qameta website is operated by individuals who prioritize data&#xA;protection. We expect our privacy and personal information to be respected, just&#xA;as we respect yours.&lt;/p&gt;&#xA;&lt;h2 id=&#34;who-is-responsible&#34;&gt;Who is responsible?&lt;/h2&gt;&#xA;&lt;p&gt;Konstantin Filtschew&lt;br&gt;&#xA;Rudolf-Dietz-Str. 4&lt;br&gt;&#xA;65550 Limburg&lt;br&gt;&#xA;Germany&lt;/p&gt;&#xA;&lt;p&gt;Phone: &lt;a href=&#34;tel:+491776751053&#34;&gt;+49 (0)177 675 10 53&lt;/a&gt;&lt;br&gt;&#xA;Email: &lt;a href=&#34;mailto:privacy@qameta.com&#34;&gt;privacy@qameta.com&lt;/a&gt;&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
