(without hack workarounds) via RDP shadowing.
Warning: Do not proceed without fully understanding the steps involved and how to secure your network.
System Properties (sysdm.cpl) → Remote
Enable "Allow remote connections to this computer" → OK
Group Policy Editor (gpedit.msc) → Local Computer Policy → Computer Configuration → Administrative Templates → Windows Components → Remote Desktop Services → Remote Desktop Session Host → Connections
Double click "Set rules for remote control of Remote Desktop Services user sessions" → select "Enabled" → set "Options:" to "Full Control without user's permission" → OK
Windows Defender Firewall with Advanced Security (wf.msc) → check "File and Printer Sharing (SMB-In)" and "Remote Desktop - Shadow (TCP-In)" are enabled for LAN connections (see Restrict Windows Remote Desktop connections to LAN only)
If the local and remote credentials differ, store the remote username and password in Windows Credential Manager:
cmdkey /add:
<hostname|IP> /user:
<remote_user> /pass:
<remote_pass>
Retrieve the remote user's session ID (will generally be "1" or "2" on single-user systems):
qwinsta /server:
<hostname|IP>
Connect:
mstsc.exe /shadow:
<sessionID> /v:
<hostname|IP> /noconsentprompt /control
Modify and save this batch file, then run it to automatically retrieve the user session ID and establish a connection:
@echo off setlocal enabledelayedexpansion :: Set your remote username and hostname or IP address set remote_user=
<USERNAME>set remote_host=
<HOSTNAME|IP>:: Get the session ID for the specified username where the session state is Active for /f "tokens=2,3,4" %%a in ('qwinsta /server:%remote_host% ^| findstr /R "^ %remote_user%"') do ( if "%%c"=="Active" ( set session_id=%%b ) ) :: If an active session ID was found for the specified user, connect automatically if defined session_id ( start "" mstsc /v:%remote_host% /shadow:%session_id% /control /noConsentPrompt ) else ( echo No active session found for user "%remote_user%". ) exit
Errors:
Long delay on initial login followed by "Shadow Error: This computer name is invalid" – Resolved by enabling the "File and Printer Sharing (SMB-In)" and "Remote Desktop - Shadow (TCP-In)" rules in the server's firewall settings.
"Shadow Error: Access is denied" – Fixed by saving remote credentials in the Credential Manager using cmdkey
. Alternatively, you can use the /prompt
flag with mstsc.exe
to manually enter credentials. However, this option isn't available for qwinsta.exe /server:
or query.exe
<username|session> /server:
, so they will return Error [5]: Access is denied
unless local and remote credentials match.
"Shadow Error: The session identification does not specify a valid session." – For manual login, this is resolved by retrieving the correct session ID on the server with query user
. The batch script automatically finds the correct session ID, so no manual intervention is needed.
In Microsoft's Remote Desktop lexicon, the terms "local session", "interactive session", and "console session" all refer to the session in which the user is physically present at the computer.
View stored credentials via cmdkey /list
and delete them with cmdkey /delete:
<hostname|IP>. Both actions can also be performed through the Credential Manager GUI (control keymgr.dll
).
Viewing a Remote User’s Desktop Session with Shadow Mode in Windows
Windows Server 2008 R2 Remote Desktop Services Resource Kit; "Shadowing a User Session" in the "Providing Help with Remote Control" section of Chapter 11, "Managing Remote Desktop Sessions"
Shadow Remote Desktop Session (RDS) Without Permission Prompt
Spying on users using Remote Desktop Shadowing - Living off the Land
How to perform RDP shadowing from Win10 Pro to another Win10 Pro
How to Shadow (Remote Control) a User’s RDP session on Windows Server RDS
/windows | Sep 04, 2024
TightVNC Service Configuration → Access Control
Click Add… → set "First matching" and "Last matching IP" values to cover desired LAN range (e.g., 192.168.0.1 and 192.168.0.254) → set "Action" to Allow → click OK
Click Add… → set "First matching" to 0.0.0.0 and "Last matching IP" to 255.255.255.255 → set "Action" to Deny → click OK
Click Apply
Optionally adjust local and remote IP address scope for TightVNC's default inbound rule in Windows Defender Firewall with Advanced Security; see Restrict Windows Remote Desktop connections to LAN only.
/windows | Aug 31, 2024
Open Windows Defender Firewall with Advanced Security (Win+R → wf.msc → Enter)
Click "Inbound Rules" under "Windows Defender Firewall with Advanced Security on Local Computer"
For each Remote Desktop entry, double click to open Properties then select the "Scope" tab
Under "Remote IP address" select "These IP addresses:"
Click Add…
Select "Predefined set of computers", choose "Local subnet", then click OK twice
Thanks to @void_in for the pointer.
/windows | Aug 31, 2024
Although disc burning was removed from Disk Utility in OS X 10.11 El Capitan, two native methods and a venerable open-source app still work even in macOS Sonoma:
Finder: With an optical disc drive connected, the context menu for an ISO file will display "Burn to Disk…":
Terminal: hdiutil burn /path/to/ISO
# terser than dd + no sudo
Burn: Compatible with OS X 10.9 through macOS 14(!). Besides burning ISO files, Burn can author a wide range of data, audio, and video discs.
/mac | Aug 30, 2024
with Demucs, an open source "state-of-the-art music source separation model, currently capable of separating drums, bass, and vocals from the rest of the accompaniment."
Install: pip3 install demucs soundfile
Run: /path/to/demucs --two-stems=vocals --out=
/path/to/output_dir/ /path/to/audio.flac
Listen: Find vocals.wav & no_vocals.wav inside output_dir/audio/.
Including soundfile
resolved RuntimeError: Couldn't find appropriate backend to handle uri.
The --jobs
flag (e.g., demucs --jobs
10 audio.flac) significantly speeds up processing when multiple cores are available, albeit at the cost of increased memory usage.
vocals.wav contained a few brief instrumental segments; removed the vocal segments in Fission (by selecting and silencing them) then overlaid vocals.wav with no_vocals.wav to preseve all non-vocal elements like so:
pip3 install pydub
In Python:
from pydub import AudioSegment # Load the two WAV files sound1 = AudioSegment.from_wav("vocals.wav") sound2 = AudioSegment.from_wav("no_vocals.wav") # Combine the two audio files combined = sound1.overlay(sound2) # Export the combined file combined.export("
combined.wav", format="wav")
/mac | Aug 28, 2024
My meager guide to mounting exFAT partitions with unsupported cluster sizes in macOS clearly needed a dollop of detail. The following steps were tested in macOS 14.6.1 with macFUSE 4.8.0 and exFAT 1.4.0:
(Though required as of Sonoma, Sequoia's FSKit (which implements a file system in user space) may render this unnecessary. In the meantime, Apple warns: "Kexts are no longer recommended for macOS. Kexts risk the integrity and reliability of the operating system. Users should prefer solutions that don’t require extending the kernel and use system extensions instead.")
Start up in macOS Recovery
Click Options → Continue Utilities → Startup Security Utility → Security Policy...
Change from "Full Security" to "Reduced Security" → enable "Allow user management of kernel extensions from identified developers" → click OK → enter password → click OK → Restart
Download and run the PKG installer (Universal binary that supports macOS 10.9 through 14(!))
When "System Extension Blocked" appears, click "Open System Settings"
Click "Allow" under "System software from developer 'Benjamin Fleischer' was blocked from loading." → enter password twice when prompted → click "Restart"
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install autoconf automake pkg-config
git clone https://github.com/relan/exfat.git && cd exfat && autoreconf --install && ./configure && make
While installing to /usr/local/sbin/ is possible via sudo make install
, running from the fuse subdirectory after compiling is fine, e.g., sudo ./fuse/mount.exfat-fuse /dev/disk2s2 ~/mnt
exFAT for FUSE: If you opted to install in step 5.2, run sudo make uninstall
from the exfat directory. Otherwise, simply delete the exfat directory created in step 5.1.
Homebrew:
Uninstall packages installed via brew: brew list | xargs brew uninstall --force
Clean up any remaining files: brew cleanup --prune=all
Uninstall Homebrew: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
If you ran (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/yourusername/.zprofile
and eval "$(/opt/homebrew/bin/brew shellenv)"
as instructed after the Homebrew installation completed, you may also want to remove eval "$(/opt/homebrew/bin/brew shellenv)"
from ~/.zprofile or simply delete ~/.zprofile altogether if there are no other lines in it.
macFUSE: Run /Extras/Uninstaller.app from the mounted DMG.
Security Settings: Repeat steps 1.1 & 1.2, then switch "Reduced Security" back to "Full Security".
Apple's Virtualization Framework cannot load third party kexts by default, returning: "System Extension Error - An error occurred with your system extensions during startup and they need to be rebuilt before they can be used. Go to Privacy & Security System Settings to re-enable them." Steven Michaud outlines a workaround in his Running Third Party Kernel Extensions on Virtualization Framework macOS Guest VMs.
Homebrew alternatives include MacPorts (replace pkg-config
with pkgconfig
), Conda, pkgsrc, and Fink.
/mac | Aug 10, 2024
Windows lacks an equivalent to macOS's Preview app, but these free tools can handle simple PDF markup tasks:
/windows | Jul 10, 2024
Spent far too long trying to troubleshoot a new App Shortcut for Messages with commands like defaults find NSUserKeyEquivalents
and mucking about with files such as com.apple.MobileSMS
and .GlobalPreferences.plist
before stumbling onto App Keyboard Shortcuts Don't Work in Sonoma. Newly-added App Shortcuts in Sonoma do not work for Messages.app; other tested apps (Calendar, Contacts, Dictionary) appear unaffected.
As jamesfromhaymarket points out, one workaround is to set the desired keyboard shortcut for All Applications instead of just Messages; assigning "Delete Conversation…" (press Opt
+;
for the ellipsis) to Cmd
+D
this way was successful.
/mac | Jun 23, 2024
Launch ActivePresenter 9 (free for trial and non-commercial use; watermark-free output)
Click Open → select desired video
Click on the time axis to reveal the playhead then drag it to the desired location
Click the "Insert Time" icon on the timeline toolbar → enter desired duration (default is 2000 ms) → OK
Click the Insert tab → Spotlight → use the crosshairs cursor in the video player to highlight the desired athlete
Adjust the spotlight in the timeline by clicking and dragging its box or outer edges
Optionally slow down or speed up frames:
How to Insert Time to Videos in ActivePresenter 8 | Embedded video tutorial
How to Insert Freeze-Frames in ActivePresenter. | Embedded video tutorial
Define a Range Before Editing Audio/Video - ActivePresenter 8
/misc | Jun 15, 2024
Edit Python script below, adjusting fade_duration
and input_folder
as desired, then save (e.g., combine_videos.py
):
import os from moviepy.editor import VideoFileClip, concatenate_videoclips def add_fade_effects(clips, duration=2): faded_clips = [] for i, clip in enumerate(clips): if i != 0: clip = clip.set_start(clips[i-1].end) clip = clip.crossfadein(duration) clip = clip.fadein(duration).fadeout(duration) # Apply fade-in and fade-out to each clip faded_clips.append(clip) return faded_clips def combine_videos_with_fades(input_folder, output_file, fade_duration=
0.5): video_files = [os.path.join(input_folder, f) for f in sorted(os.listdir(input_folder)) if f.endswith('.mp4')] video_clips = [VideoFileClip(video) for video in video_files] video_clips = add_fade_effects(video_clips, fade_duration) final_clip = concatenate_videoclips(video_clips, method="compose") final_clip.write_videofile(output_file, codec="libx264") if __name__ == "__main__": input_folder = "
/path/to/mp4s" # Replace with the path to your folder containing MP4 files output_file = "combined_video_with_fades.mp4" combine_videos_with_fades(input_folder, output_file)
python3 combine_videos.py
/nix | Jun 15, 2024