Skip to content

Instantly share code, notes, and snippets.

View ramonsmits's full-sized avatar

Ramon Smits ramonsmits

View GitHub Profile
@ramonsmits
ramonsmits / Move-MsmqMessages.ps1
Last active April 19, 2024 12:11
Powershell script to move MSMQ messages between queues with support for transactions and partial sets based on size.
<#
.SYNOPSIS
Moves messages between queues.
.DESCRIPTION
Moves messages between queues, move isn't really the right word as moving can only occur
between a queue and its sub-queues but its the Verb allowed by Powershell.
Is allows moving messages between queues of different transaction type.
@ramonsmits
ramonsmits / HOWTO.md
Last active April 11, 2024 23:01
Install .NET 8 on Raspberry pi
@ramonsmits
ramonsmits / gist:7563502
Created November 20, 2013 13:52
Example of Mandrill webhook JSON data.
[
{
"event": "send",
"msg": {
"ts": 1365109999,
"subject": "This an example webhook message",
"email": "example.webhook@mandrillapp.com",
"sender": "example.sender@mandrillapp.com",
"tags": [
"webhook-example"
@ramonsmits
ramonsmits / solution.md
Last active January 22, 2024 11:47
1152: Error extracting to the temporary location

I had issue running the Yamaha USB driver installer part of um3141x64.zip. Running the setup.exe showed dialog with the message:

1152: Error extracting to the temporary location

I used Sysintermals Procmon to check what failed but that didn't reveal the problem. My current TEMP folder points to the folder S:\.tmp on a ReFS partition. After temporarily creating a c:\tmp, set TEMP and TMP environment variables to that value the setup.exe ran without any issues. That means the installer could:

  1. Required C: drive
  2. Didn't like the period character in the path
  3. Isn't working with ReFS partitions
@ramonsmits
ramonsmits / howto.md
Created December 30, 2023 22:15
Backup restore Postgres between major versions via docker
  1. Ensure that a shared folder exists between the containers. For example, I have the following volume mapping on both instances: - ./backups:/backups
  2. Create a backup via the command pg_dump. For example, the following docker container myapp_db_1:
  • docker exec myapp_db_1 bash -c "pg_dump --username=myuser --no-password --format=c mydatabase > /backups/1.dump"
    
  1. Restore via the command pg_restore on another (newer major) of postgres:
  • docker exec myapp_db_2 bash -c  "pg_restore --username=myuser --no-password --dbname=mydatabase --verbose /backups/1.dump"
    
@ramonsmits
ramonsmits / Truncate.cs
Last active December 10, 2023 11:20
string.Truncate extension method that if longer than the specific maximum truncates the string and adds `…` character (tree dots)
static class StringExt
{
public static string? Truncate(this string? value, int maxLength)
{
if (value == null) return value;
return value.Length <= maxLength ? value : string.Concat(value.AsSpan(0, maxLength - 1), "…");
}
}
@ramonsmits
ramonsmits / FileIsInUse.cs
Created November 30, 2023 12:19
Check if a file is in use by trying to open it exclusively
static class FileHelper
{
public static bool FileInUse(string path)
{
try
{
using var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None);
return false;
}
catch (IOException)
// Placeholder
@ramonsmits
ramonsmits / SagaJsonPatcher.cs
Created November 16, 2023 10:25
NServiceBus.Persistence.Sql v7.0.3 JSON patch for saga tables
// <PackageReference Include="Microsoft.Data.SqlClient" Version="5.1.2" />
// <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
using Microsoft.Data.SqlClient;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Data;
internal class Program
{
@ramonsmits
ramonsmits / TimeoutBehavior.cs
Last active September 27, 2023 15:59
NServiceBus TimeoutBehavior
class TimeoutBehavior : Behavior<IIncomingPhysicalMessageContext>
{
static readonly ILog Log = LogManager.GetLogger<TimeoutBehavior>();
static readonly TimeSpan TimeoutDuration = TimeSpan.FromSeconds(5);
static readonly TimeSpan CancellationThresholdDuration = TimeSpan.FromSeconds(5);
static readonly TimeSpan TerminationDetectionDuration = TimeoutDuration + CancellationThresholdDuration;
public override async Task Invoke(IIncomingPhysicalMessageContext context, Func<Task> next)
{
using var timeoutCTS = new CancellationTokenSource(TimeoutDuration);