Skip to content

Instantly share code, notes, and snippets.

View zentrope's full-sized avatar

Keith Irwin zentrope

  • Portland, Oregon
View GitHub Profile
var activity: NSBackgroundActivityScheduler?
func runActivity() {
activity = NSBackgroundActivityScheduler(identifier: "lkasjdlaksjdaslkjd")
activity?.repeats = true
activity?.interval = 15
activity?.schedule { completion in
// This doesn't make sense: defer should be periodically checked in
// the middle of a long job.
@zentrope
zentrope / sema.swift
Last active January 19, 2020 04:34
Use a semaphore to block
func xmlDocument(url: String) -> Document? {
var doc: Document?
let semaphore = DispatchSemaphore(value: 0)
AF.request(url).response { response in
if let data = response.data, let xml = String(data: data, encoding: .utf8) {
do {
doc = try SwiftSoup.parse(xml, "", Parser.xmlParser())
} catch {
print("error: \(error.localizedDescription)")
@zentrope
zentrope / OverlapViewController.swift
Created August 25, 2019 18:58
Overlapping views in a view controller
override func loadView() {
let view = NSView(frame: .zero)
view.addSubview(vfxView)
view.addSubview(webView)
vfxView.translatesAutoresizingMaskIntoConstraints = false
webView.configuration.preferences.javaScriptEnabled = true
webView.setValue(false, forKey: "drawsBackground")
@zentrope
zentrope / offscreen.js
Created January 18, 2015 17:09
three.js detect off-screen objects?
var frustum = new THREE.Frustum();
var cameraViewProjectionMatrix = new THREE.Matrix4();
// every time the camera or objects change position (or every frame)
camera.updateMatrixWorld(); // make sure the camera matrix is updated
camera.matrixWorldInverse.getInverse( camera.matrixWorld );
cameraViewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
frustum.setFromMatrix( cameraViewProjectionMatrix );
@zentrope
zentrope / grib2-local.scala
Created June 27, 2011 18:40
Fragment: decoding weather strings in a weather.gov grib2 file
// convert a byte into a list of ones and zeros
def bits(num: Int): List[Int] = (for (i <- Range(0,8)) yield (((num << i) & 0xff) >>> 7)).toList
// given a list, take the first N bits
def next(bits: List[Int], numBits: Int) = {
val filler = List[Int](8 - numBits) map (_ => 0)
val bitList = filler ++ bits.take(numBits)
@zentrope
zentrope / AppDelegate.swift
Last active June 19, 2019 19:08
Open a window programmatically
//
// AppDelegate.swift
//
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
private var preferencesWindow = NSWindowController()
@zentrope
zentrope / webviewInject.swift
Last active December 23, 2018 21:44
Set dark/light for web content
private func setMode(_ isDark: Bool) {
let mode = isDark ? "add" : "remove"
let script = "document.body.classList.\(mode)(\"dark\");"
webView.evaluateJavaScript(script) { result, error in
if let err = error {
os_log("%{public}s", log: logger, type: .error, "js error: \(err).")
}
}
}
@zentrope
zentrope / buildemacs.md
Last active June 10, 2018 03:04
Build emacs on macOS

Build emacs on macOS

Build from scratch because most of the packages you use have updated to the nearly-completed next version, so why not pull that?

An alternative is to use home brew HEAD, but this is more fun.

Xcode

Probably should have Xcode installed, but at least try:

@zentrope
zentrope / transform.scala
Created December 4, 2010 08:23
Transforming XML using RewriteRule and RuleTransformer
// Import the magic libraries
import scala.xml._
import scala.xml.transform._
// Source xml. In Scala, xml is literal.
val xml =
<user>
<email>joe@example.com</email>
@zentrope
zentrope / core.clj
Created January 21, 2016 17:49
core.logic scratch
(ns ls.core
(:gen-class)
(:refer-clojure :exclude [==])
(:require [clojure.core.logic :refer :all]
[clojure.core.logic.pldb :refer :all]))
;;-----------------------------------------------------------------------------
;; Interesting Links
;;
;; http://michaelrbernste.in/2013/05/12/featurec-and-maps.html