Skip to content

Instantly share code, notes, and snippets.

View jspahrsummers's full-sized avatar

Justin Spahr-Summers jspahrsummers

View GitHub Profile
@jspahrsummers
jspahrsummers / GHRunLoopWatchdog.h
Created January 28, 2015 20:50
A class for logging excessive blocking on the main thread
/// Observes a run loop to detect any stalling or blocking that occurs.
///
/// This class is thread-safe.
@interface GHRunLoopWatchdog : NSObject
/// Initializes the receiver to watch the specified run loop, using a default
/// stalling threshold.
- (id)initWithRunLoop:(CFRunLoopRef)runLoop;
/// Initializes the receiver to detect when the specified run loop blocks for
@jspahrsummers
jspahrsummers / AsynchronousGenerators.md
Last active December 19, 2024 06:52
Python asynchronous generator semantics and types

How to use asynchronous generators

The documentation 6.2.9.4. "Asynchronous generator-iterator methods" is phrased really ambiguously. To make matters worse, typing.AsyncGenerator is not specified fully correctly.

Here, I attempt to more clearly capture the actual interface contract, based on what I've read and observed. See also PEP 492 -- Coroutines with async and await syntax and PEP 525 -- Asynchronous Generators.

This might be useful to implement lower-level behaviors than you can with async for, like sending values into the generator function.

TSend = TypeVar('TSend', contravariant=True)
@jspahrsummers
jspahrsummers / MultipleDispatch.cpp
Last active August 16, 2024 10:52
Example of using RTTI and template specialization for multiple dispatch in C++
template<typename Left, typename Right>
struct Intersect
{
// This will fail to compile if there's no specialization for Intersect<Right, Left>,
// thereby verifying that we've handled all combinations.
typename Intersect<Right, Left>::Result operator() (const Left &lhs, const Right &rhs) const
{
return Intersect<Right, Left>()(rhs, lhs);
}
};
@jspahrsummers
jspahrsummers / Idera Acquires Travis CI.md
Created September 14, 2021 22:47
Idera Acquires Travis CI

Dear Customer,

I am Randy Jacops, the CEO of Idera, Inc. You likely saw the press announcement last month announcing Idera’s acquisition of Travis CI (hereafter, Travis). Here is a link to the announcement if you have not seen it: Idera, Inc. Acquires Travis CI GmbH for Continuous Integration Capabilities.

I’d like to welcome you to the Idera family and look forward to building on Travis’ history of market leading continuous integration products for software developers and testing professionals. I’m writing this letter to introduce Idera and explain why we are excited to acquire Travis.

Idera delivers B2B software productivity tools that allow technical users to do more with less, faster. The company's brands span three divisions—Database Tools, Developer Tools and Testing Tools—with products used and evangelized by millions of community members and more than 50,000 customers worldwide. Continuous integration accelerates software delivery, improves developer productivity, and enables technical innovation t

@jspahrsummers
jspahrsummers / gist:4305792
Last active April 29, 2021 01:55
CGRectDivideWithPadding illustrations

Simple visual illustrations of how CGRectDivideWithPadding works.

Slicing from CGRectMinXEdge
  +-------+---------+------------>
e |       |         |
d | slice | padding | remainder…
g |       |         |
e |       |         |
@jspahrsummers
jspahrsummers / bad.m
Last active January 20, 2021 11:55
Synchronizing with multiple GCD queues
//
// DON'T do this, or else you risk a deadlock (e.g., by accidentally performing it in a different order somewhere)
//
dispatch_async(firstQueue, ^{
dispatch_sync(secondQueue, ^{
// code requiring both queues
});
});
@jspahrsummers
jspahrsummers / gist:5780224
Last active September 26, 2019 05:24
Untested proof of concept for a better @weakify macro.
#define $(...) \
({ \
__weak __typeof__(self) weakSelf = self; \
\
^(__VA_ARGS__) { \
__strong __typeof__(weakSelf) self = weakSelf; \
$_body_
#define $_body_(...) \
__VA_ARGS__ \
@jspahrsummers
jspahrsummers / gist:7080228
Last active May 2, 2019 11:56
Advantages and disadvantages to RACCommand under MVVM

MVVM example

For a command that initiates a network request when:

  • The network connection is up (precondition)
  • The network request is not already in progress (enforced serialization)

The lifecycle proceeds as follows:

  1. The view model exposes the command and describes its behavior
@jspahrsummers
jspahrsummers / main.m
Created November 24, 2015 16:11
[NSThread isMainThread] is probably not what you want!
#import <Foundation/Foundation.h>
int main (int argc, const char **argv) {
@autoreleasepool {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"is main thread? %i", (int)[NSThread isMainThread]);
});
});
@jspahrsummers
jspahrsummers / gist:1670404
Created January 24, 2012 14:22
Macro for safer key-value coding
#define ObjectKeyPath(OBJECT, KEYPATH) \
((void)(NO && ((void)OBJECT.KEYPATH, NO)), @ # KEYPATH )
NSString *str = @"foobar";
NSLog(@"%@", [str valueForKey:ObjectKeyPath(str, length)]);