Skip to content

Instantly share code, notes, and snippets.

View JonCanning's full-sized avatar

Jon Canning JonCanning

View GitHub Profile
@JonCanning
JonCanning / install.sh
Created December 18, 2023 10:04
Install latest docker-compose
curl -s https://api.github.com/repos/docker/compose/releases/latest | grep browser_download_url | grep -i "$(uname -s)-$(uname -m)" | cut -d '"' -f 4 | head -n 1 | xargs curl -L -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
@JonCanning
JonCanning / kafka.fsx
Last active January 24, 2023 11:02
Kafka F# example
#r "nuget: Confluent.Kafka"
#r "nuget: System.Text.Json"
open Confluent.Kafka
open System
open System.Text.Json
open System.Threading.Tasks
open Confluent.Kafka.Admin
let server = "localhost:9092"
@JonCanning
JonCanning / packet.fsx
Last active January 12, 2023 22:19
Send a packet using SharpPcap and PacketDotNet
#r "nuget: PacketDotNet"
#r "nuget: SharpPcap"
open PacketDotNet
open SharpPcap
open System.Net.NetworkInformation
open System.Net
open System.IO
let deviceName = "eth0"
@JonCanning
JonCanning / benchmark.fsx
Last active January 14, 2023 12:27
F# BenchmarkDotNet script
#r "nuget:BenchmarkDotNet"
open BenchmarkDotNet.Running
open BenchmarkDotNet.Attributes
[<InProcessAttribute true; MemoryDiagnoser>]
type Runner() =
[<Benchmark>]
member _.Test1() = "test1"
@JonCanning
JonCanning / dedupe.fs
Created July 8, 2022 09:08
Dedupe items in a seq
let dedupe source =
seq {
let mutable previous = ValueNone
for item in source do
match previous with
| ValueSome x when x = item -> ()
| _ -> yield item
previous <- ValueSome item
}
#!/bin/bash
while IFS=, read -r col1 ; do
echo "$col1"
done <"$1"
@JonCanning
JonCanning / OptionsMonitor.fs
Last active March 4, 2022 16:30
FSharp IOptionsMonitor for ConsoleLoggerProvider
open Microsoft.Extensions.Logging.Console
open Microsoft.Extensions.Options
type OptionsMonitor<'T>(options) =
interface IOptionsMonitor<'T> with
member _.CurrentValue = options
member _.Get _ = options
member _.OnChange _ = { new IDisposable with member _.Dispose() = () }
let loggerProvider = new ConsoleLoggerProvider(OptionsMonitor(ConsoleLoggerOptions(FormatterName = "Json")))
@JonCanning
JonCanning / Json.fs
Created August 13, 2021 16:20
Sensible json defaults
module Json
open Microsoft.FSharpLu.Json
open Newtonsoft.Json
open Newtonsoft.Json.Serialization
open Newtonsoft.Json.Converters
let private compactJsonSerializerSettings =
let settings = Compact.TupleAsArraySettings.settings
@JonCanning
JonCanning / AzureDataTables.fsx
Last active July 30, 2021 21:36
F# Azure.Data.Tables
#r "nuget: Azure.Data.Tables"
#r "nuget: FSharp.Control.FusionTasks"
open Azure.Data.Tables
let connectionString =
"DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;"
let tableName = "test"
let tableClient = TableClient(connectionString, tableName)
@JonCanning
JonCanning / middleware.cs
Created April 22, 2021 11:05
ASP .NET Core Api Key Auth
app.Use(async (ctx, next) =>
{
var apiKey = Environment.GetEnvironmentVariable("APIKEY");
var apiKeyHeader = ctx.Request.Headers["X-API-KEY"].ToString();
var apiKeyQuery = ctx.Request.Query["apikey"].ToString();
var providedApiKey = String.IsNullOrEmpty(apiKeyHeader) ? apiKeyQuery : apiKeyHeader;
var authorized = String.IsNullOrEmpty(apiKey) ? false : apiKey == providedApiKey;
if (authorized)
{
await next();