Skip to content

Instantly share code, notes, and snippets.

View saagarjha's full-sized avatar

Saagar Jha saagarjha

View GitHub Profile
@saagarjha
saagarjha / pause4debug.c
Last active March 22, 2019 04:48
Simple dynamic library that, when injected, pauses programs during initialization
// Dynamic library that pauses a short lived program during launch so that a
// debugger can attach to it. To use it, compile it on macOS:
// clang -dynamiclib pause4debug.c -o pause4debug.dylib
// On Linux:
// gcc -shared -fPIC pause4debug.c -o pause4debug.so
// To use it, make the dynamic linker inject it using DYLD_INSERT_LIBRARIES or
// LD_PRELOAD, depending on your platform. On macOS:
// DYLD_INSERT_LIBRARIES=/path/to/pause4debug.dylib debugme
// On Linux,
// LD_PRELOAD=/path/to/pause4debug.so debugme
@saagarjha
saagarjha / calculate.swift
Created May 7, 2018 10:58
A small command line calculator for macOS, using Calculate.framework
import Foundation
let handle = dlopen("/System/Library/PrivateFrameworks/Calculate.framework/Calculate", RTLD_LAZY)
let CalculatePerformExpression = unsafeBitCast(dlsym(handle, "CalculatePerformExpression"), to:
(@convention(c) (UnsafePointer<CChar>, Int, Int, UnsafePointer<CChar>) -> Bool).self)
let expression = Array(CommandLine.arguments.dropFirst()).joined(separator: " ")
let answer = Array<CChar>(repeating: 0, count: 100)
if CalculatePerformExpression(expression, 16, 1, answer) {
print(String(cString: answer))
}
@saagarjha
saagarjha / AppKit Abusers
Created May 21, 2018 05:38
Apps that have special-case workarounds in Apple's core frameworks, sorted by number of exceptions (from https://worthdoingbadly.com/appkitcompat/)
22 com.apple.iWork.Keynote
18 com.apple.iWork.Pages
16 com.apple.iWork.Numbers
15 com.apple.iPhoto
13 com.microsoft.Powerpoint
9 com.microsoft.Excel
9 com.apple.logic.pro
9 com.adobe.Photoshop
8 com.microsoft.Outlook
7 com.microsoft.Word
//
// Logic necessary to implement a "closing handler" for a NSDocument
//
// This is inspired by:
// - https://stackoverflow.com/questions/49343307/best-practice-to-implement-canclosewithdelegateshouldclosecontextinfo
// - https://github.com/keith/radars/blob/master/NSDocumentSwiftAnnotations/NSDocumentSwiftAnnotations/Document.swift
// Keith's supporting documentation for his radar submission: http://www.openradar.me/33422662
// Documentation:
// - https://developer.apple.com/library/content/releasenotes/AppKit/RN-AppKitOlderNotes/
// Paragraph called: "Advice for Overriders of Methods that Follow the delegate:didSomethingSelector:contextInfo: Pattern"
@saagarjha
saagarjha / iterm-set-profile.m
Last active February 8, 2021 23:51
Set the correct iTerm profile based on whether dark mode is enabled or not
// Compile with clang -F/System/Library/PrivateFrameworks -framework SkyLight iterm-set-profile.m
#import <Foundation/Foundation.h>
BOOL SLSGetAppearanceThemeLegacy(void);
int main() {
if (SLSGetAppearanceThemeLegacy()) {
printf("\033]50;SetProfile=Solarized Dark\a");
} else {
printf("\033]50;SetProfile=Solarized Light\a");
@saagarjha
saagarjha / darknano.c
Last active March 22, 2019 04:46
Disables bright colors in nano on macOS
#include <string.h>
int overridden_strncasecmp(const char *s1, const char *s2, size_t n) {
if (n != 6 || strncmp(s2, "bright", n)) {
return strncasecmp(s1, s2, n);
} else {
return !0;
}
}
@saagarjha
saagarjha / theme.py
Last active October 25, 2021 16:35
iTerm2 Script to change the theme automatically based on the system appearance
#!/usr/bin/env python3
import iterm2
async def set_theme(connection, theme):
# Themes have space-delimited attributes, one of which will be light or dark.
parts = theme.split(" ")
if "dark" in parts:
preset = await iterm2.ColorPreset.async_get(connection, "Fixed Solarized Dark")
@saagarjha
saagarjha / webserver.sh
Created May 26, 2019 06:09
OpenRC init script to run a webserver
#!/sbin/openrc-run
start() {
start-stop-daemon --start --chdir /share --background --exec /usr/bin/python3 -- -m http.server 80
}
stop() {
start-stop-daemon --stop --chdir /share --exec /usr/bin/python3 -- -m http.server
}
@saagarjha
saagarjha / hn_timestamps.py
Created August 6, 2019 16:25
Grab timestamps for all your Hacker News comments
#!/usr/bin/env python3
import json
import re
import urllib.request
if __name__ == "__main__":
comments = json.load(urllib.request.urlopen("https://hacker-news.firebaseio.com/v0/user/saagarjha.json"))["submitted"][::-1]
for comment in comments:
timestamp = json.load(urllib.request.urlopen("https://hacker-news.firebaseio.com/v0/item/" + str(comment) + ".json"))["time"]
@saagarjha
saagarjha / webserver.service
Created October 6, 2019 03:38
systemd service to run a webserver
[Unit]
Description=Python Web Server
After=network.target
[Service]
Type=simple
Restart=always
User=root
WorkingDirectory=/share
ExecStart=/usr/bin/python3 -m http.server 80