Skip to content

Instantly share code, notes, and snippets.

@janodev
janodev / Person.m
Created May 16, 2017 14:32
Right and wrong ways to call a block property
#import <Foundation/Foundation.h>
#undef X
typedef void (^salute_t)();
@interface Person : NSObject
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) salute_t salute;
@janodev
janodev / PackageApplication
Created May 31, 2017 14:24
PackageApplication script from Xcode 8.2.1
#!/usr/bin/perl
#
# PackageApplication
#
# Copyright (c) 2009-2012 Apple Inc. All rights reserved.
#
# Package an iPhone Application into an .ipa wrapper
#
use Pod::Usage;
@janodev
janodev / BouncyButton.swift
Created March 16, 2018 10:22
A delegate implemented with generics and a static method
// From “Better Strategies Through Types”
// http://www.figure.ink/blog/2018/3/11/better-strategies-through-types
import UIKit
protocol BouncyDelegate {
static func animateBounce(for view: UIView)
}
enum ShakeStrategy: BouncyDelegate
@janodev
janodev / Downloader.swift
Created April 8, 2018 13:51
Weakly retaining an object in a closure without having to write [weak]
// I saw this trick in “Do you often forget [weak self], here is a solution”
// https://medium.com/anysuggestion/preventing-memory-leaks-with-swift-compile-time-safety-49b845df4dc6
import UIKit
class ViewController: UIViewController {
// move this variable inside viewDidLoad to see it being released
let downloader = Downloader()
@janodev
janodev / ControllerLifecycle.swift
Created April 16, 2018 09:06
Unit testing a view controller
// From https://albertodebortoli.com/2018/03/12/easy-view-controller-unit-testing/
import XCTest
import UIKit
class ControllerLifecycle<T: UIViewController>
{
private lazy var this = type(of: self).self
private var rootWindow: UIWindow?
var rootController: T? {
@janodev
janodev / ObjC.h
Last active April 16, 2018 09:18
Capture ObjC exceptions. From https://stackoverflow.com/a/36454808/412916
#import <Foundation/Foundation.h>
@interface ObjC: NSObject
+ (BOOL)catchException:(void(^)(void))tryBlock error:(__autoreleasing NSError **)error;
@end
@janodev
janodev / idioms.swift
Last active June 29, 2018 16:17
initialising idioms
import UIKit
// this one doesn’t require a helper function
var label: UILabel = {
$0.backgroundColor = .blue
$0.text = "This is a playground"
$0.textColor = .white
$0.textAlignment = .center
return $0
@janodev
janodev / Makefile
Last active August 5, 2020 12:48
Securing Apache with client certificate authorisation
.DEFAULT_GOAL := hello
CA = ca
CA_NAME = Janodev CA
SERVER = jano
SERVER_DOMAIN = jano.dev
CLIENT = client
CLIENT_NAME = Janodev Notes User
SERVER_CONF = server.conf
CLIENT_CONF = client.conf
@janodev
janodev / karabiner.json
Created December 10, 2018 01:16
My Karabiner rules containing "WASD arrow Keys toggled by Capslock". See https://stackoverflow.com/a/53698322/412916
{
"global": {
"check_for_updates_on_startup": true,
"show_in_menu_bar": true,
"show_profile_name_in_menu_bar": false
},
"profiles": [
{
"complex_modifications": {
"parameters": {
@janodev
janodev / AutoLayout.swift
Created April 30, 2019 14:05
Buttons with equal width using Visual Format Language
import UIKit
public extension UIView {
var autoLayout: AutoLayout {
return AutoLayout(self)
}
}