<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Wooji Juice — Blog Feed</title><link href="https://www.wooji-juice.com/" title="Wooji Juice"/><link rel="self" href="https://www.wooji-juice.com/blog/atom.xml" title="Wooji Juice — Blog Feed"/><updated>2025-01-06T10:17:30Z</updated><rights>© 2025 Wooji Juice</rights><icon>https://www.wooji-juice.com/i/glyph@2x.png</icon><id>https://www.wooji-juice.com/blog/atom.xml</id><entry><title type="text">Stupid SwiftUI Tricks: Async-Await Alerts</title><link href="https://www.wooji-juice.com/blog/stupid-swiftui-tricks-async-await-alerts.html"/><author>Canis</author><id>https://www.wooji-juice.com/blog/stupid-swiftui-tricks-async-await-alerts.html</id><updated>2024-11-18T00:00:00Z</updated><summary type="html">&lt;p&gt;It’s been a while since I wrote one of these, but I put a bit of code together recently, and felt like writing it up.&lt;/p&gt;&lt;p&gt;SwiftUI makes it easy to pop up alerts using &lt;var&gt;.alert()&lt;/var&gt; modifiers, but the way they work often doesn’t suit the ways that I need to use them. You typically end up needing four different components in four separate places to make it all happen:&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/stupid-swiftui-tricks-async-await-alerts.html"&gt;Read more...&lt;/a&gt;</summary><content type="html">&lt;p&gt;It’s been a while since I wrote one of these, but I put a bit of code together recently, and felt like writing it up.&lt;/p&gt;&lt;p&gt;SwiftUI makes it easy to pop up alerts using &lt;var&gt;.alert()&lt;/var&gt; modifiers, but the way they work often doesn’t suit the ways that I need to use them. You typically end up needing four different components in four separate places to make it all happen:&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/stupid-swiftui-tricks-async-await-alerts.html"&gt;Read more...&lt;/a&gt;</content><category term="swift"></category><category term="swiftui"></category></entry><entry><title type="text">Transcriptionist 1.0</title><link href="https://www.wooji-juice.com/blog/transcriptionist-1-0.html"/><author>Canis</author><id>https://www.wooji-juice.com/blog/transcriptionist-1-0.html</id><updated>2023-09-18T16:42:55Z</updated><summary type="html">&lt;p&gt;It’s &lt;a href="/blog/ferrite-recording-studio-out-now"&gt;been a long while&lt;/a&gt; since the last time Wooji Juice released an all-new app. There’s been no shortage of work keeping Ferrite, Hokusai and others up-to-date, but the time is finally here to welcome our latest app, &lt;a href="/products/transcriptionist"&gt;Transcriptionist&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;img src="/img/transcriptionist/device-family@2x.png" alt="Transcriptionist Art" title="Transcriptionist Art"/&gt; Transcriptionist is an app for iPhone, iPad &lt;em&gt;and&lt;/em&gt; Apple Silicon Mac that imports recordings of speech, and turns them into text that you can read, edit, search, use to navigate around the recording, and export in various formats — privately, on your device.&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/transcriptionist-1-0.html"&gt;Read more...&lt;/a&gt;</summary><content type="html">&lt;p&gt;It’s &lt;a href="/blog/ferrite-recording-studio-out-now"&gt;been a long while&lt;/a&gt; since the last time Wooji Juice released an all-new app. There’s been no shortage of work keeping Ferrite, Hokusai and others up-to-date, but the time is finally here to welcome our latest app, &lt;a href="/products/transcriptionist"&gt;Transcriptionist&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;img src="/img/transcriptionist/device-family@2x.png" alt="Transcriptionist Art" title="Transcriptionist Art"/&gt; Transcriptionist is an app for iPhone, iPad &lt;em&gt;and&lt;/em&gt; Apple Silicon Mac that imports recordings of speech, and turns them into text that you can read, edit, search, use to navigate around the recording, and export in various formats — privately, on your device.&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/transcriptionist-1-0.html"&gt;Read more...&lt;/a&gt;</content><category term="products,"></category><category term="transcriptionist"></category></entry><entry><title type="text">Random Dev Issue: Exporting Localisations from Xcode</title><link href="https://www.wooji-juice.com/blog/random-dev-xcode-loc-export.html"/><author>Canis</author><id>https://www.wooji-juice.com/blog/random-dev-xcode-loc-export.html</id><updated>2022-12-15T00:00:00Z</updated><summary type="html">&lt;p&gt;This is one of those posts I’m making, not because anyone cares about it right now, but because perhaps one day someone will search the web for a solution to this error message, find this post, and be glad.&lt;/p&gt;&lt;p&gt;(Also, because there’s a non-zero chance that person might be &lt;em&gt;me&lt;/em&gt; in a couple of years, once I’ve forgotten about it.)&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/random-dev-xcode-loc-export.html"&gt;Read more...&lt;/a&gt;</summary><content type="html">&lt;p&gt;This is one of those posts I’m making, not because anyone cares about it right now, but because perhaps one day someone will search the web for a solution to this error message, find this post, and be glad.&lt;/p&gt;&lt;p&gt;(Also, because there’s a non-zero chance that person might be &lt;em&gt;me&lt;/em&gt; in a couple of years, once I’ve forgotten about it.)&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/random-dev-xcode-loc-export.html"&gt;Read more...&lt;/a&gt;</content><category term="dev"></category><category term="xcode"></category></entry><entry><title type="text">Now Available: Ferrite 3</title><link href="https://www.wooji-juice.com/blog/now-available-ferrite-3.html"/><author>Canis</author><id>https://www.wooji-juice.com/blog/now-available-ferrite-3.html</id><updated>2022-12-08T00:00:00Z</updated><summary type="html">&lt;p&gt;The latest update to our radio and podcast production tool &lt;a href="/products/ferrite"&gt;Ferrite Recording Studio&lt;/a&gt; is now &lt;a href="https://apps.apple.com/app/id1018780185"&gt;available in the App Store&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;Ferrite 3 offers an enhanced, modernised UI all across the app. Major new features for Ferrite 3 Pro customers include:&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/now-available-ferrite-3.html"&gt;Read more...&lt;/a&gt;</summary><content type="html">&lt;p&gt;The latest update to our radio and podcast production tool &lt;a href="/products/ferrite"&gt;Ferrite Recording Studio&lt;/a&gt; is now &lt;a href="https://apps.apple.com/app/id1018780185"&gt;available in the App Store&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;Ferrite 3 offers an enhanced, modernised UI all across the app. Major new features for Ferrite 3 Pro customers include:&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/now-available-ferrite-3.html"&gt;Read more...&lt;/a&gt;</content><category term="ferrite"></category><category term="products"></category><category term="updates"></category></entry><entry><title type="text">Another Fresh Coat of Paint</title><link href="https://www.wooji-juice.com/blog/another-fresh-coat-of-paint-2022.html"/><author>Canis</author><id>https://www.wooji-juice.com/blog/another-fresh-coat-of-paint-2022.html</id><updated>2022-11-03T16:44:40Z</updated><summary type="html">&lt;p&gt;Welcome to the new look Wooji Juice site! It’s been a few years — I think the last redesign was in 2014? This refresh took a little longer because it wasn’t just a redesign, it was also a rewrite of the site builder that renders it.&lt;/p&gt;&lt;p&gt;The previous site builder was written back in 2006 in Python 2, and was way overdue for replacement. It served the site well for over 15 years — dating to long before Wooji Juice was a company, and was instead just a blog!&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/another-fresh-coat-of-paint-2022.html"&gt;Read more...&lt;/a&gt;</summary><content type="html">&lt;p&gt;Welcome to the new look Wooji Juice site! It’s been a few years — I think the last redesign was in 2014? This refresh took a little longer because it wasn’t just a redesign, it was also a rewrite of the site builder that renders it.&lt;/p&gt;&lt;p&gt;The previous site builder was written back in 2006 in Python 2, and was way overdue for replacement. It served the site well for over 15 years — dating to long before Wooji Juice was a company, and was instead just a blog!&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/another-fresh-coat-of-paint-2022.html"&gt;Read more...&lt;/a&gt;</content><category term="meta"></category></entry><entry><title type="text">Stupid SwiftUI Tricks: Single-Axis Geometry Reader</title><link href="https://www.wooji-juice.com/blog/stupid-swiftui-tricks-single-axis-geometry-reader.html"/><author>Canis</author><id>https://www.wooji-juice.com/blog/stupid-swiftui-tricks-single-axis-geometry-reader.html</id><updated>2020-09-23T00:00:00Z</updated><summary type="html">&lt;p&gt;I mentioned in &lt;a href="/blog/stupid-swiftui-tricks-equal-sizes.html"&gt;a previous article&lt;/a&gt; that, to find out the size of a view in SwiftUI, you use &lt;var&gt;GeometryReader&lt;/var&gt;. It passes a &lt;var&gt;GeometryProxy&lt;/var&gt; in to the content, which can read the size to make adjustments to itself — to calculate “responsive” layouts, figure out appropriate sizes for its own content, and so on.&lt;/p&gt;&lt;p&gt;But, when you actually use a &lt;var&gt;GeometryReader&lt;/var&gt;, it changes the layout of the view, which can cause all sorts of other problems.&lt;/p&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;a href="https://www.wooji-juice.com/blog/stupid-swiftui-tricks-single-axis-geometry-reader.html"&gt;Read more...&lt;/a&gt;</summary><content type="html">&lt;p&gt;I mentioned in &lt;a href="/blog/stupid-swiftui-tricks-equal-sizes.html"&gt;a previous article&lt;/a&gt; that, to find out the size of a view in SwiftUI, you use &lt;var&gt;GeometryReader&lt;/var&gt;. It passes a &lt;var&gt;GeometryProxy&lt;/var&gt; in to the content, which can read the size to make adjustments to itself — to calculate “responsive” layouts, figure out appropriate sizes for its own content, and so on.&lt;/p&gt;&lt;p&gt;But, when you actually use a &lt;var&gt;GeometryReader&lt;/var&gt;, it changes the layout of the view, which can cause all sorts of other problems.&lt;/p&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;a href="https://www.wooji-juice.com/blog/stupid-swiftui-tricks-single-axis-geometry-reader.html"&gt;Read more...&lt;/a&gt;</content><category term="swift"></category><category term="swiftui"></category></entry><entry><title type="text">Stupid SwiftUI Tricks: Emulating Equal-Size Constraints</title><link href="https://www.wooji-juice.com/blog/stupid-swiftui-tricks-equal-sizes.html"/><author>Canis</author><id>https://www.wooji-juice.com/blog/stupid-swiftui-tricks-equal-sizes.html</id><updated>2020-08-04T12:13:31Z</updated><summary type="html">&lt;p&gt;SwiftUI is quite a new technology, and it still has some rough edges. There are bugs, and there are missing features – but mostly, the &lt;em&gt;design&lt;/em&gt; is pretty solid. Over time the bugs will get fixed, and the missing features filled in.&lt;/p&gt;&lt;p&gt;But the layout engine has a significant limitation: unlike Auto Layout, it’s strictly one-way. Superviews tell subviews how much space they have available, not the other way around. This makes many common tasks fairly straightforward, but it lacks some of the features of Auto Layout – most notably, equal-size constraints.&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/stupid-swiftui-tricks-equal-sizes.html"&gt;Read more...&lt;/a&gt;</summary><content type="html">&lt;p&gt;SwiftUI is quite a new technology, and it still has some rough edges. There are bugs, and there are missing features – but mostly, the &lt;em&gt;design&lt;/em&gt; is pretty solid. Over time the bugs will get fixed, and the missing features filled in.&lt;/p&gt;&lt;p&gt;But the layout engine has a significant limitation: unlike Auto Layout, it’s strictly one-way. Superviews tell subviews how much space they have available, not the other way around. This makes many common tasks fairly straightforward, but it lacks some of the features of Auto Layout – most notably, equal-size constraints.&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/stupid-swiftui-tricks-equal-sizes.html"&gt;Read more...&lt;/a&gt;</content><category term="swift"></category><category term="swiftui"></category></entry><entry><title type="text">Stupid Swift Tricks #7½: Writing a User Guide In It</title><link href="https://www.wooji-juice.com/blog/stupid-swift-tricks-7b-user-guide.html"/><author>Canis</author><id>https://www.wooji-juice.com/blog/stupid-swift-tricks-7b-user-guide.html</id><updated>2020-04-10T00:00:00Z</updated><summary type="html">&lt;p&gt;In the &lt;a href="/blog/stupid-swift-tricks-7-user-guide.html"&gt;first part of this article&lt;/a&gt;, I explained that I put together a system for producing user guides for apps, by writing the guides in Swift itself, and having the compiler turn that into code/data. It can then be turned into HTML on demand, or inspected by the app to generate the table of contents, search indices, and so on.&lt;/p&gt;&lt;p&gt;In this part, we’re going to look into how that actually happens: How does it work? How does the code get turned into a data structure? And most importantly, how do you make it &lt;em&gt;easy and comfortable for a human&lt;/em&gt; to write a user guide in a language intended for programming computers?&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/stupid-swift-tricks-7b-user-guide.html"&gt;Read more...&lt;/a&gt;</summary><content type="html">&lt;p&gt;In the &lt;a href="/blog/stupid-swift-tricks-7-user-guide.html"&gt;first part of this article&lt;/a&gt;, I explained that I put together a system for producing user guides for apps, by writing the guides in Swift itself, and having the compiler turn that into code/data. It can then be turned into HTML on demand, or inspected by the app to generate the table of contents, search indices, and so on.&lt;/p&gt;&lt;p&gt;In this part, we’re going to look into how that actually happens: How does it work? How does the code get turned into a data structure? And most importantly, how do you make it &lt;em&gt;easy and comfortable for a human&lt;/em&gt; to write a user guide in a language intended for programming computers?&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/stupid-swift-tricks-7b-user-guide.html"&gt;Read more...&lt;/a&gt;</content><category term="swift"></category></entry><entry><title type="text">Stupid Swift Tricks #7: Writing a User Guide In It</title><link href="https://www.wooji-juice.com/blog/stupid-swift-tricks-7-user-guide.html"/><author>Canis</author><id>https://www.wooji-juice.com/blog/stupid-swift-tricks-7-user-guide.html</id><updated>2020-03-06T18:04:00Z</updated><summary type="html">&lt;p&gt;There’s a school of thought that says iOS apps shouldn’t have user guides, because they should be simple enough not to require them. This is a pretty good rule of thumb for many consumer apps, but for Pro apps like &lt;a href="/products/ferrite"&gt;Ferrite&lt;/a&gt; or &lt;a href="/products/hokusai"&gt;Hokusai&lt;/a&gt; it breaks down, because if you simplified them enough that a user guide was never required, they would no longer be Pro apps.&lt;/p&gt;&lt;p&gt;Of course, this isn’t an excuse for neglecting the user experience. You should still try to make an app as clear and easy to use as possible — apart from anything else, it’s well-known that many people will never read the user guide even if you make one.&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/stupid-swift-tricks-7-user-guide.html"&gt;Read more...&lt;/a&gt;</summary><content type="html">&lt;p&gt;There’s a school of thought that says iOS apps shouldn’t have user guides, because they should be simple enough not to require them. This is a pretty good rule of thumb for many consumer apps, but for Pro apps like &lt;a href="/products/ferrite"&gt;Ferrite&lt;/a&gt; or &lt;a href="/products/hokusai"&gt;Hokusai&lt;/a&gt; it breaks down, because if you simplified them enough that a user guide was never required, they would no longer be Pro apps.&lt;/p&gt;&lt;p&gt;Of course, this isn’t an excuse for neglecting the user experience. You should still try to make an app as clear and easy to use as possible — apart from anything else, it’s well-known that many people will never read the user guide even if you make one.&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/stupid-swift-tricks-7-user-guide.html"&gt;Read more...&lt;/a&gt;</content><category term="swift"></category></entry><entry><title type="text">Audio Clipping (And Normalisation And More)</title><link href="https://www.wooji-juice.com/blog/audio-clipping.html"/><author>Canis</author><id>https://www.wooji-juice.com/blog/audio-clipping.html</id><updated>2020-02-17T00:00:00Z</updated><summary type="html">&lt;p&gt;This is another post in which we discuss a common issue that’s useful to know when working with audio (in any app, but also showing how it can be relevant to Wooji Juice apps like &lt;a href="/products/ferrite"&gt;Ferrite Recording Studio&lt;/a&gt; or &lt;a href="/products/hokusai"&gt;Hokusai Audio Editor&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Today, we’ll be discussing “clipping”. As we’ve &lt;a href="/blog/zero-crossings-and-you"&gt;discussed previously&lt;/a&gt;, audio is represented by a waveform that represents the movement of the mic/speakers over time:&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/audio-clipping.html"&gt;Read more...&lt;/a&gt;</summary><content type="html">&lt;p&gt;This is another post in which we discuss a common issue that’s useful to know when working with audio (in any app, but also showing how it can be relevant to Wooji Juice apps like &lt;a href="/products/ferrite"&gt;Ferrite Recording Studio&lt;/a&gt; or &lt;a href="/products/hokusai"&gt;Hokusai Audio Editor&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Today, we’ll be discussing “clipping”. As we’ve &lt;a href="/blog/zero-crossings-and-you"&gt;discussed previously&lt;/a&gt;, audio is represented by a waveform that represents the movement of the mic/speakers over time:&lt;/p&gt;&lt;a href="https://www.wooji-juice.com/blog/audio-clipping.html"&gt;Read more...&lt;/a&gt;</content><category term="ferrite"></category><category term="hokusai"></category><category term="tips"></category></entry></feed>