Recently my task at Kinzoo was to add an option to reverse audio files. I’ve found a few examples, but they weren’t fast. I decided to use the reverse function from the Accelerate framework. It works fast!!!

It’s important to note that file format is not the same as processing format, messing it up can lead to weird errors or wrong sample rate.

The main job is done inside a loop processing floatChannelData for each input file channel.

guard let data = buffer.floatChannelData else { return nil }for i in 0..<buffer.format.channelCount {
let stride = vDSP_Stride(1)
vDSP_vrvrs(data.advanced(by: Int(i)).pointee, stride, vDSP_Length(frameLength))

That’s it!
Please check my Twitter and my apps!

I’ve been using h3lix ( in the past on my Iphone. Recently I needed it again, but it turned out Cydia Impactor doesn’t let you install h3lix anymore.

There was a tweet about it:

and followed the steps:

  1. Download h3lix (
  2. Download (or copy paste) script and run it, patching downloaded h3lix.ipa.
  3. Create a new project in Xcode, run it on iPhone, to update certificates
  4. Run IOS App Signer (,

4a. Enter your valid Certificate

4b. Enter Provisioning Profile using the one you created with your new project

4c. Change App Display Name if you wish

5. After…

Install depot_tools:

git clone
export PATH=/path/to/fetched/depot_tools:$PATH


mkdir webrtc
cd webrtc
fetch --nohooks webrtc_ios
gclient sync
cd webrtc/src

Enable bitcode and specify architecutres needed.

tools_webrtc/ios/ --bitcode --arch arm64 x64 arm

Framework is inside:


Official docs:

How to strip unwanted architectures (when distributing to app store you need to strip x64 or i386).

That’s it!

Today we’ll explore how to send messages between multiple Apple devices using the Network framework, without the need of having external server. We’ll also use Bonjour service to let clients discover the each others automatically.

Let’s start with the first task: discovering devices using Bonjour (

To accomplish this task we’ll need a server a browser. The server does the advertising and handles clients, the browser finds available servers (listeners).

First of all, we need to add NSBonjourServices key to Info.plist (, and pass an array of Bonjour service types. In our case, we’ll define one type and we’ll use…

Hands-On analysis of Apple’s Cache Policies working together with a Node.js Express Server to increase API efficiency and performance

Photo by Cleyder Duque from Pexels

There are only two hard things in Computer Science: cache invalidation and naming things.

— Phil Karlton

Fortunately for us, Apple helps us by providing robust and powerful cache policies. Policies we should use instead of building a custom (NSCache) solution!

In this post, we’ll explore different URLRequest cache policies and the consequences of using them. Those policies apply to both iOS and macOS. We’ll use a hands-on approach looking both on server and front-end sides.

To make things easy, the Node.js Express Server (the Backend) will return strings, and we’ll log the responses in the console.

Reset mysql root access:

sudo service mysql stop
sudo mysqld_safe —skip-grant-tables —skip-networking &
mysql -u root

In the mysql:

use mysql;
update user set authentication_string=password('NEWPASSWORD') where user='root';
flush privileges;

Restart mysql:

sudo service mysql restart

In case of: mysqld_safe Directory ‘/var/run/mysqld’ for UNIX socket file don’t exists. error, create this directory and set ownership:

mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld

Grant access to mysql from other host:


Check for running server in local network:

for i in {2..255}; do echo $i; curl --connect-timeout 1…

Let’s create a new Vue / Nuxt app:

npx create-nuxt-app google-sign

Enable Axios, choose Single Page App rendering mode. Add firebase to our Nuxt app:

npm install firebase --save

Create a firebase plugin, add new file ‘firebase.js’ inside /plugins and register it inside nuxt.config.js

Next, create a Firebase project. Go to

and create a new project, call it ‘google-sign’.

Inside the Firebase project, go to Settings and add a new Web app. Call it ‘google-sign’.

With DispatchGroup and DispatchSemaphore

Photo by oakie on Unsplash

Let say you need to perform multiple network calls and need to wait for them to complete to aggregate results.

I think the simplest solution would be to use DispatchGroup (if the order of execution doesn’t matter) or DispatchSemaphore.

I will demonstrate both the problem and its solutions by using a function which will combine two async calls and then using a loop containing async calls.

Let’s create a command-line project.

Create a function which will convert Int to String after a pre-defined delay.

The First Scenario Without a Loop

Create a function which will combine two async calls:

When we run it, the…

After finishing our family blog from our journey through Sulawesi, we still haven’t decided where we will host it. I decided using docker to contain it and make it easy to switch hosts in the future.

Backup both content and database.

Connect to your host (for example via ssh).

Zip the folder containing wordpress wp-content directory. For example /var/www/html/wp-content:

sudo tar -czf wp-content.tar.gz wp-content

Export database, where wordpress is the name of wordpress database “add-drop-table” will drop tables when importing this backed up database into existing one:

mysqldump wordpress --add-drop-table -uuser -ppassword | gzip  > wordpress.sql.gz

Recreate Wordpress on the…

This post shows how to use UICollectionView inside UIView with custom UICollectionView cells and interface builder, this is super basic example without any extras.

First Create new Single View App.

Create custom view using File… New / Cocoa Touch Class, call it CustomView and make sure it subclasses UIView

Next create CustomView.xib, open New File… and select View, call it CustomView

Borama Apps

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store