<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Pastey's Blog</title><link>https://pastey.github.io/blog/</link><description>Recent content on Pastey's Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sun, 15 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://pastey.github.io/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Over-Extended Types. On the overuse of Swift Extensions.</title><link>https://pastey.github.io/blog/2026-02-15-extensions/</link><pubDate>Sun, 15 Feb 2026 00:00:00 +0000</pubDate><guid>https://pastey.github.io/blog/2026-02-15-extensions/</guid><description>&lt;p&gt;Sometimes I see one thing in code, and it bugs me. An excessive love for Swift extensions. We extend everything left, and right.&lt;/p&gt;</description></item><item><title>Don't trust your eyes when looking at weak pointers</title><link>https://pastey.github.io/blog/2024-09-14-weak-pointer-vs-lldb/</link><pubDate>Sat, 14 Sep 2024 00:00:00 +0000</pubDate><guid>https://pastey.github.io/blog/2024-09-14-weak-pointer-vs-lldb/</guid><description>&lt;p&gt;We have some really old piece of code. It&amp;rsquo;s basically a proxy for an NSTimer retained by the timer instead of our precious View Controller that shows the PDF file. The code was written in the manual reference counting times, then semi-automatically translated to ARC and left for good. Turned out that all these years, since the translation to ARC, it had a bug that led to a leak that went under the radar of leak detection tools.&lt;/p&gt;</description></item><item><title>Remove a Git tag. Mission impossible</title><link>https://pastey.github.io/blog/2024-02-11-remove-git-tag-if-you-can/</link><pubDate>Sun, 11 Feb 2024 00:00:00 +0000</pubDate><guid>https://pastey.github.io/blog/2024-02-11-remove-git-tag-if-you-can/</guid><description>&lt;p&gt;Sure, you can do &lt;code&gt;git tag -d &amp;lt;tagname&amp;gt;&lt;/code&gt; and then &lt;code&gt;git push --delete origin &amp;lt;tagname&amp;gt;&lt;/code&gt;. But chances are high that the tag will resurrect soon. Keep reading if you want to know more.&lt;/p&gt;</description></item><item><title>Journey HOME</title><link>https://pastey.github.io/blog/2023-09-08-path/</link><pubDate>Fri, 08 Sep 2023 00:00:00 +0000</pubDate><guid>https://pastey.github.io/blog/2023-09-08-path/</guid><description>&lt;p&gt;This is the story about &lt;code&gt;PATH&lt;/code&gt;, &lt;code&gt;/usr/local/bin&lt;/code&gt; and a little bit about &lt;code&gt;Homebrew&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>An unexpected human-machine interaction peculiarity in an iOS app</title><link>https://pastey.github.io/blog/2023-06-18-unexpected-hmi-issue/</link><pubDate>Sun, 18 Jun 2023 00:00:00 +0000</pubDate><guid>https://pastey.github.io/blog/2023-06-18-unexpected-hmi-issue/</guid><description>&lt;p&gt;We&amp;rsquo;ve got a bug. The pen tool didn&amp;rsquo;t work on M2 iPad with the Wrist Protection setting enabled.&lt;/p&gt;
&lt;p&gt;Our Wrist Protection was added long ago when we were making Remarks – the note-taking app based on our PDF library. Pen was the main tool in that app. In our testing, we found that quite often the palm laying on the iPad screen would produce some touches. Our code didn&amp;rsquo;t know if a finger or a wrist had produced the &lt;code&gt;UITouch&lt;/code&gt;, so those accidental touches made pen marks on the page bottom. Wrist Protection filters our touches with &lt;code&gt;majorRadius&lt;/code&gt; larger than a threshold that we heuristically found out.&lt;/p&gt;
&lt;p&gt;So, back to the nowadays bug. Please take a look at &lt;a href="https://drive.google.com/file/d/1XOQHgbfw8xmffSimVNnyXKT-glBNv4SD/view?usp=sharing" class="external-link" target="_blank" rel="noopener"&gt;the video demonstrating it&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>UIBandSelectionInteraction vs. UICollectionViewCell background color</title><link>https://pastey.github.io/blog/2023-06-11-band-selection-vs-collection-view-cell-backgroud/</link><pubDate>Sun, 11 Jun 2023 00:00:00 +0000</pubDate><guid>https://pastey.github.io/blog/2023-06-11-band-selection-vs-collection-view-cell-backgroud/</guid><description>&lt;p&gt;One of my colleagues (kudos, Nik) added the proper support of the pointer at iPad OS during our Ship It days (approximately once a month we can do any feature/improvement we want). After some time the team jumped in and we all were preparing it for release.&lt;/p&gt;
&lt;p&gt;When it came to QA, we&amp;rsquo;ve got a strange ticket: file list view in Select mode would sometimes deselect all previously selected items. I drew the stick for this ticket and dived into it. The reason for the bug was obvious at first glance – band selection (&lt;code&gt;UIBandSelectionInteraction&lt;/code&gt;) triggered 1x1 selection at the &lt;em&gt;tapped&lt;/em&gt; cell, which did what it had to do – cleared the previous selection and selected the cells (that single one) that were intersected by the &lt;code&gt;selectionRect&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>A sad story about Swift Equatable</title><link>https://pastey.github.io/blog/2023-02-27-equatable/</link><pubDate>Mon, 27 Feb 2023 00:00:00 +0000</pubDate><guid>https://pastey.github.io/blog/2023-02-27-equatable/</guid><description>&lt;p&gt;This is the story about the cunning Equatable in Swift.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start as advertised. Everything&amp;rsquo;s cool, everything works:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Equatable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kc"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Swift&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="bp"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;gt;&amp;gt; Person operator == called&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Ususally I won&amp;#39;t implement this operator – compiler will generate one.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// I just want to add some logs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Even if I had to implement !=, I would impelement it via ==.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// For the sake of logging, let it be really dumb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Swift&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="bp"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;gt;&amp;gt; Person operator != called&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;john&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;John&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;jack&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Jack&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check. All correct. Let&amp;rsquo;s dive into the real life.&lt;/p&gt;</description></item></channel></rss>