How to Add Alt + Tab to macOS (Windows-like behavior)

I recently starting using a Mac laptop again for the first time in almost 6 years, and the stark contrast between the two major OSes was made all the more clear to me. Little things about macOS I never noticed before my long stint with windows practically jumped out at me.

One such glaring oversight that seemed to be unforgivable is the fact that macOS doesn’t currently have a good built in window switcher. If you hold CMD (command) + Tab, you will get an application switcher, but it does not switch between active windows of the same program. This limitation is hard to form a habit around, as I found myself frequently attempted to CMD + Tab to another Firefox window, or another instance of a Finder window I had open. However, I found a nifty application that can bring that behavior to macOS, and I highly recommend you try it out. If you build the fast switching window shortcut into your daily routine, it will help maximize your productivity.

Here’s how to get it:

Download Standalone App Here (Alt-Tab)

You can also get it through brew, in which case I will assume you don’t need further instructions.

  1. Download Alt-Tab from here OR the link above (same link)
  2. Drag it to your /Applications folder by clicking Finder > Applications on sidebar & drag+dropping into the window
  3. Double click to launch
  4. Click the Controls tab
    1. Make sure shortcut 1 is highlighted
  5. Change the shortcut to your desired keys by clicking the keys in the line “Hold [KEY] and press: [KEY] Select next window”
    1. I highly recommend using CMD + Tab for the average user
  6. Now, close the window, don’t quit it.
  7. Test! You should be able to switch between applications and their windows with a nice, graphical interface upon pressing CMD + Tab. If you want to switch to the last used application then press CMD + Tab ONCE, meaning if you press CMD + Tab and release, you will continue to switch between your recently used applications. This is a great trick for copying down information, or quickly referencing another window while completing the current task.

☺️

 


It helps me if you share this post

Published 2021-10-09 09:20:15

Windows 11… Simply Unnecessary

Windows 11 is wholly unnecessary, and shouldn’t even exist.

If we ignore the fact that Microsoft stated Windows 10 was the last version of their operating system, and the seemingly obvious missed opportunity to simply rebrand Windows 10 to “Windows” alone like Apple did, then we can look at their proposed reasons for the change.

Why Microsoft is Rebranding

When Windows 10 came out, it was supposed to usher in a new standard of operating under the Microsoft family. The start menu was brought all the way back in comparison with Windows 8.1, and they finally fixed a number of graphical issues users were having.

The rebrand to Windows 10 was for the numerous changes they’d done to the operating system, back then.

So what changes to instigate a new OS now?

A New Name Means Distance from Old Identity

Changing a name is a great way to distance a person, place, or thing from old actions or non applicable qualities that exist currently. It’s a way to signal change, that something is not the same as before.

Microsoft and other corporations use this strategy often to create positive attention for their brand or distance themselves from negative attention.

And Windows 10 has had a lot of negative attention:

A quick search will pull up almost unlimited articles complaining about Windows 10.

With the recent failure of Windows 10 X, Microsoft had enough.

So What’s New?

Really, that’s the most important thing, isn’t it? Are the changes any good?

Well, no.

Unless you want a bunch of features you could already achieve in Windows 10 with more bloat, more integrated applications, less customization, and more restrictions on which hardware you can install it on.

Windows 11 still has bloatware in the preview builds, and they’ve had updates before which has reinstall all preinstalled apps. Microsoft Teams will now be integrated into the taskbar. I don’t have high hopes for the Teams integration if the weather icon they tried to add to the taskbar and failed miserably with is any indication. The “News and Interests” taskbar option causes the taskbar to update arbitrarily and File Explorer to lag, and the font is grainy and pixelated on a monitor with higher than 1080p.

Well what about the centered taskbar?

Wouldn’t it be great if you could already do that in Windows 10?

Center Taskbar Windows 10 Dark Theme

Oh wait. You can.

This is what my desktop looks like currently on 21H1. I also have a custom dark theme installed to properly theme some of the discrepancies out of the OS like the Task Manager, the dialogue options, and even Notepad.

Using TaskbarX, SecureUXTheme, and a few other dependencies, you can already create what I believe to be a better look than what Windows 11 delivers out of the box.

Changing UX Design

Notice that the start button is on the bottom left in the image above. Now look at a picture of the new Windows 11 taskbar:

The start button has moved to the center with the other icons.

THIS IS BAD UX DESIGN.

Why?

Because when a button is on an edge that you can move your mouse against, it has an infinite width. If you drag your mouse against the left edge of your (leftmost) monitor, it cannot move outside the screen and thus any button on the edge of the screen would be easier to quickly whip the mouse over and click.

In the same way, when a button is in a corner such as the start button was in most previous versions of Windows, it is much easier to drag your mouse to the corner quickly without aiming at all, as two sides have infinite width. This makes it extremely efficient to locate the start button, no matter the cursor location.

However, by moving the start button to the center of the taskbar, Microsoft eliminates that smart UX choice they made all those years ago.

Perhaps Microsoft will realize this and provide an option to restore the default alignment in a later update. As of 8/2/2021, this is not possible.

Additionally, they eliminated the option to align the taskbar to the left or right in the latest version.

The main concern for me as Microsoft continually whips around GUI updates is… how has Windows fundamentally changed since the last big update? And how are they fixing the small issues that continue to plague normal operations throughout the working day? Well, the answers to both of those questions are pretty disappointing.

A) It hasn’t changed that much, so don’t expect to notice much difference

B) They haven’t fixed that much, so don’t expect to notice much difference

And that’s where we are. Another graphical change to an OS in an era where to this day, on the latest Windows build, you can open command prompt and hold F11 down to see the old Windows 7 UI underneath for a split second as the GUI is overwritten with the new theme.

Split second after you hit F11 to minimize the CMD prompt window out of fullscreen.

Progress Is Not Bad

But there has to be progress. Windows 11 is completely unnecessary for what they are bringing to the table in the new versions. In a perfect world, maybe Windows 10 would have been rebranded to “Windows” with thematic naming to keep versions clear, saved the sweeping UI upgrades until AFTER THEY’VE FINISHED THE EXISTING DARK THEME FOR THEIR CURRENT OS, and maybe don’t make yet another “Settings” app before the old Control Panel is even removed.

I’ll say it again, I would love for Microsoft to be innovating here, but where is it? What can be achieved on Windows 11 that can’t already be accomplished on existing hardware and software?

“Windows 11 has all the power and security of Windows 10 with a redesigned and refreshed look. It also comes with new tools, sounds, and apps. Every detail has been considered. All of it comes together to bring you a refreshing experience on your PC.”

I suppose nothing. It’s not like I would consider whatever Microsoft is shipping with their OS to be essential apps, probably just a new version of candy crush 😉.

At the very least, Microsoft says they will still support Windows 10 for 4 more years, until 2025. Maybe by that time, Windows Infinity will have hit shelves and I can skip 11.

Honestly, just please make one settings app and I’ll be happy. 🙏


If you want to improve your Windows 10 experience by searching with any browser and Google from your start menu instead of Bing, read this.


It helps me if you share this post

Published 2021-07-27 18:55:20

Searchifier not working? Windows updated. Read this.

EDIT: As of 3/20/2022, Searchifier does not work anymore due to Microsoft blocking it. The post and download links will stay up for now, but they could be removed at any point. At some point in the future if a workaround is found this post will be updated.

Something changed between Windows 11 builds 22483 and 22494 (both Windows Insider Preview builds.) The build changelog makes a few mentions of changes to the protocol and file associations/default apps system. However, it omitted the headline news: You can no longer bypass Microsoft Edge [protocol links].


Searchifier works by handling the request send by your start menu to Edge and translating that to a link your other browser can handle. Windows 10’s latest update breaks this functionality by preventing automatically updating your default link handler at all.

You can fix it by doing this:

  1. Install Searchifier
  2. Go to Windows 10’s Settings
  3. Apps > Default Apps > Choose default apps by protocol (scroll down)
  4. Scroll to where it says “Microsoft-Edge”
  5. Click and change to Searchifier

It should work now!

Keywords not working, update, gmr, genevra, search, browser, link handling, bing redirect, broken


It helps me if you share this post

Published 2021-04-26 04:48:42

New Ransomware Attack Vector – Virtual Machines

No one likes malware, but a particularly malicious type is called Ransomware, and it specifically preys on people’s data.

Ransomware essentially encrypts the entire user’s computer or specific files until a sum of money is paid to the attacker. While there is no guarantee the attacker will make the files or computer available again, it seems to be in their best interest to return access to the computer, otherwise no one else would pay once word got around.

A particularly nasty type of new ransomware has just been discovered, and it utilizes a surprising attack vector: virtual machines.

In a new report by Sophos, the operators of the Ragnar Locker are using another novel method to avoid being detected when encrypting files.

They are now deploying VirtualBox Windows XP virtual machines to execute the ransomware and encrypt files so that they are not detected by security software running on the host.

This attack is started by first creating a tool folder that includes VirtualBox, a mini Windows XP virtual disk called micro.vdi, and various executables and scripts to prep the system.

https://www.bleepingcomputer.com/news/security/ransomware-encrypts-from-virtual-machines-to-evade-antivirus

As the security software running on the victim’s host will not detect the ransomware executable or activity on the virtual machine, it will happily keep running without detecting that the victim’s files are now being encrypted.

Interestingly, Windows 10’s “Controlled Folder Access” may prevent this attack, as it prevents any unauthorized changes by applications without a password.

This is especially problematic for government organizations, business, and hospitals. In fact, one of their more recent attacks was on an energy company EDP (https://www.edp.com/en), where the attackers stole more than 10 TB of files and received a ransom of over 10 million dollars.

This attack illustrates how security software with behavioral monitoring is becoming more important to stem the tide of ransomware infections.

It’s more important than ever to implement safe browsing habits, and common sense when executing unknown files, as once the attacker is in your system, it’s game over.


It helps me if you share this post

Published 2020-05-23 17:27:04

Networking in C#, a simple library

Recently I wanted to make a simple multiplayer game in Unity, but I didn’t want to use their terribly made UNET, as even though it’s barely a few years old, it’s already deprecated. I also didn’t want to go with a third party like Photon Networking, because I don’t want to pay for CCU (Concurrent User) usage, server costs, and other misc fees.

No, what I wanted was a solution such as Minecraft implements, where you directly connect to a server and it’s served through peer-to-peer networking, with one player being a server. The solution? A small library called LiteNetLib. This library allows you to build multiplayer games in .NET (C#), including Unity, with no limitations on usage, including player count. It was exactly what I needed.

The documentation is slightly sparse but it wasn’t rocket science to get a small example up and running, and the developer seems pretty open to questions. There’s also a small sample included so you can see what it entails.

Cheers!


It helps me if you share this post

Published 2020-02-13 00:39:20

Google can track iOS users through fonts

https://twitter.com/sandofsky/status/1172200578207772672

Google’s Crashyltics allow them to track crashes from the “Beta” version of the app through a font.

https://twitter.com/sandofsky/status/1172215993625505792

However, there is at least a prompt to install it.

One of the things iOS has always lacked is the ability to install custom fonts. Apple has delayed it, stating security concerns. Proving Apple’s point, Google-owned Crashlytics is abusing the feature to track users by installing a font with a custom identifier embedded. Because fonts are installed system-wide in order to be used across multiple apps, it could be possible for any app to use Crashlytics’s font to uniquely identify users, and piggy-back off the tracking without doing any workthemselves.

This sets up a host of security and privacy concerns and problems. The basic fact remains that something as innocuous as a font should not be used for fingerprinting users, because most consumers will not know a font should/could be used for that purpose.


It helps me if you share this post

Published 2019-09-13 07:59:35

How to create a simple voice-activated assistant in C#.

This is really old. I will release another tutorial updating this eventually. Follow my blog to get an update when that happens. Thanks!

While this sounds advanced (and it can be), it’s not that hard to set up a very basic setup where a custom application runs in the background in C# by using the built in speech recognition libraries in Windows 10.

Taking this idea further, I personally have a “Jarvis” that runs on my computer, automating basically all of my common actions, including launching games, music, sleeping my computer, adjusting the volume, minimizing windows, controlling the lights, and (best of all), sending emails and messages. I recommend using an external API for speech recognition if you’re serious about building something similar, as Microsoft’s sucks. You can build your own, or attempt to use something like Google’s API.

Anyway, here’s some simple C# code that should get some ideas flowing.


using System;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using Microsoft.Speech.Recognition;
using Process = System.Diagnostics.Process;
using System.Diagnostics;
namespace VoiceAssistant
{
class Program
{
#region Native Stuff
const int Hide = 0;
const int Show = 1;
[DllImport("Kernel32.dll")]
private static extern IntPtr GetConsoleWindow();
[DllImport("User32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int cmdShow);
[DllImport("PowrProf.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool SetSuspendState(bool hiberate, bool forceCritical, bool disableWakeEvent);
#endregion
static SpeechRecognitionEngine speechRecognitionEngine;
static bool speechOn = true;
private static string clipboardText;
private static bool shouldLog = true;
private static readonly string[] commands =
{
"assistant mute",
"assistant open clipboard",
"assistant new tab",
"assistant work music",
"assistant new github",
"assistant sleep computer confirmation 101",
"assistant shut down computer confirmation 101",
"assistant open story",
"assistant open rocket league"
};
static void HideWindow()
{
//Hide window
IntPtr hWndConsole = GetConsoleWindow();
if (hWndConsole != IntPtr.Zero)
{
ShowWindow(hWndConsole, Hide);
shouldLog = false;
//ShowWindow(hWndConsole, Show);
}
}
static void Main(string[] args)
{
HideWindow();
//Console.WriteLine("[ASSISTANT AI INITIALIZED]");
CultureInfo cultureInfo = new CultureInfo("en-us");
speechRecognitionEngine = new SpeechRecognitionEngine(cultureInfo);
speechRecognitionEngine.SetInputToDefaultAudioDevice();
speechRecognitionEngine.SpeechRecognized += SpeechRecognition;
speechRecognitionEngine.SpeechDetected += SpeechDetected;
speechRecognitionEngine.SpeechHypothesized += SpeechHypothesized;
LoadCommands();
while (true)
{
Thread.Sleep(60000);
}
}
static void LoadCommands()
{
/*Grammar muteCommand = new Grammar(new GrammarBuilder(commands[0]));
Grammar browserOpenCopiedLink = new Grammar(new GrammarBuilder(commands[1]));
Grammar browserCopyLink = new Grammar(new GrammarBuilder(commands[2]));
speechRecognitionEngine.LoadGrammar(muteCommand);
speechRecognitionEngine.LoadGrammar(browserOpenCopiedLink);
speechRecognitionEngine.LoadGrammar(browserCopyLink);*/
foreach (string command in commands)
{
speechRecognitionEngine.LoadGrammarAsync(new Grammar(new GrammarBuilder(command)));
}
speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
Console.Beep(600, 200);
Console.Beep(600, 200);
}
static void SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
{
//Log(e.Result.Text);
}
static void SpeechDetected(object sender, SpeechDetectedEventArgs e)
{
//Log("Detected speech.");
}
static void SpeechRecognition(object sender, SpeechRecognizedEventArgs e)
{
string resultText = e.Result.Text.ToLower();
float confidence = e.Result.Confidence;
SemanticValue semantics = e.Result.Semantics;
Log("\nRecognized: " + resultText + " | Confidence:" + confidence);
if (confidence < 0.6)
{
Log("Not sure what if you said that. Not proceeding.", ConsoleColor.Red);
return;
}
if (resultText == commands[0])
{
speechOn = !speechOn;
Log("Speech on: " + speechOn);
if (speechOn)
{
Console.Beep(600, 200);
Console.Beep(600, 200);
}
else
{
Console.Beep(400, 400);
}
return;
}
if (!speechOn)
{
Log("AI is muted. Not doing any commands.");
Console.Beep(400, 200);
return;
}
if (resultText == commands[1]) //Open link on clipboard.
{
Thread clipboardThread = new Thread(param =>
{
if (Clipboard.ContainsText(TextDataFormat.Text))
{
clipboardText = Clipboard.GetText(TextDataFormat.Text);
}
});
clipboardThread.SetApartmentState(ApartmentState.STA);
clipboardThread.Start();
clipboardThread.Join();
Log(clipboardText);
Process.Start(clipboardText);
}
if (resultText == commands[2]) //Open browser
{
Process.Start("https://google.com");
}
if (resultText == commands[3]) //Open work music
{
Process.Start("https://youtu.be/Qku9aoUlTXA?list=PLESPkMaANzSj91tvYnQkKwgx41vkxp6hs");
}
if (resultText == commands[4]) //Open Github new repository
{
Process.Start("https://github.com/new");
}
if (resultText == commands[5]) //Sleep computer
{
SetSuspendState(false, true, true);
}
if (resultText == commands[6]) //Shutdown computer
{
Process.Start("shutdown", "/s /t 0");
}
if (resultText == commands[7]) //Open story
{
Process.Start("https://docs.new");
}
if (resultText == commands[9]) //Open Rocket League
{
Process.Start("C:\\Users\\USER\\Documents\\SteamLauncher\\RocketLeague.exe");
}
}
static void Log(string input, ConsoleColor color = ConsoleColor.White)
{
if (shouldLog)
{
Console.ForegroundColor = color;
Console.WriteLine(input);
Console.ResetColor();
}
}
}
}


It helps me if you share this post

Published 2019-05-22 18:10:00