Skip to content

Instantly share code, notes, and snippets.

kevinwright

Block or report user

Report or block kevinwright

Hide content and notifications from this user.

Learn more about blocking users

Contact Support about this user’s behavior.

Learn more about reporting abuse

Report abuse
View GitHub Profile
@kevinwright
kevinwright / HandlebarsEngine.scala
Created Jul 20, 2018
Handlebars.java -> scala adaptor
View HandlebarsEngine.scala
import java.{util => ju}
import com.github.jknack.handlebars.context.{JavaBeanValueResolver, MapValueResolver, MethodValueResolver}
import com.github.jknack.handlebars._
import com.github.jknack.handlebars.helper.EachHelper
import com.github.jknack.handlebars.io.ClassPathTemplateLoader
import scala.reflect.runtime.{universe => ru}
import scala.util.Try
import scala.collection.JavaConverters._
@kevinwright
kevinwright / proresproxy.sh
Last active Aug 17, 2018
Use ffmpeg to build prores proxies for Premiere Pro
View proresproxy.sh
#!/usr/bin/env bash
# Usage notes
# ===========
#
# proxy_watermark.png needs to be in the same directory as the script
# download from here: http://whoismatt.com/images/2016/7-july/adobe_proxy_logo.png
#
# on OSX, both pv and ffmpeg will need to be installed via homebrew
@kevinwright
kevinwright / Main.scala
Created May 31, 2016
Improved syntax for scopt
View Main.scala
case class Params(
mode: String = "",
input: Option[File] = None,
output: Option[File] = None,
keyRing: Option[File] = None,
key: String = "",
password: String = "",
genDigest: Boolean = false
) {
def withEncrypt() = this.copy(mode = "encrypt")
View AsyncUtils.scala
import scala.collection.generic.CanBuildFrom
import scala.concurrent.{ExecutionContext, Future}
import scala.language.higherKinds
import scala.util.{Failure, Success}
object AsyncUtils {
/**
* A subtle variant on `Future.traverse` that forces the Futures to be executed one at a time
* instead of allowing parallelism
View filesystems.md

What is a file?

It's more than just a path, you can have a well formed path that refers to a non-existant file.

It's not just a sequence of bytes on a storage medium, it also involves other metadata - such as a path, modification timestamp, etc.

Then we have "files" under procfs on linux systems, and named pipes, and network streams - all accessible fia "file handles". There are different and deeply interwoven concepts that are all known as "file" in different contexts. Some of these can be immutable.

First, there's the path. This is completely immutable. Paths can have many operations, you can get the parent path, find the path of the some subdirectory(as a new immutable path instance), etc. Path needn't have an operation to determine if it's well-formed, as this can be done at construction time.

View ansi_up.css
.ansi-black-fg { color: rgb(0,0,0); }
.ansi-red-fg { color: rgb(205,0,0); }
.ansi-green-fg { color: rgb(0,205,0); }
.ansi-yellow-fg { color: rgb(205,205,0); }
.ansi-blue-fg { color: rgb(0,0,238); }
.ansi-magenta-fg { color: rgb(205,0,205); }
.ansi-cyan-fg { color: rgb(0,205,205); }
.ansi-white-fg { color: rgb(229,229,229); }
.ansi-bright-black-fg { color: rgb(127,127,127); }
@kevinwright
kevinwright / test.scala
Last active Aug 29, 2015
Exploring LabelledGeneric
View test.scala
case class Wibble(x: Int, y: String)
val wib = Wibble(42, "towel")
val gen = LabelledGeneric.product[Wibble]
// shapeless.LabelledGeneric[Wibble]{type Repr = shapeless.::[shapeless.record.FieldType[shapeless.tag.@@[Symbol,String("x")],Int],shapeless.::[shapeless.record.FieldType[shapeless.tag.@@[Symbol,String("y")],String],shapeless.HNil]]} = $1$$1@56670aec
:t gen
//shapeless.LabelledGeneric[Wibble]{type Repr = shapeless.::[shapeless.record.FieldType[shapeless.tag.@@[Symbol,String("x")],Int],shapeless.::[shapeless.record.FieldType[shapeless.tag.@@[Symbol,String("y")],String],shapeless.HNil]]}
val out = gen.to(wib)
View autoThingy.scala
import shapeless._
trait Thingy[T] { def stringy(t:T): String }
implicit def autoThingy[T <: Product](implicit gen: LabelledGeneric[T]) : Thingy[T] = new Thingy[T] {
def toRecord[T <: Product, Repr](obj: T)(implicit lg: LabelledGeneric.Aux[T, Repr]): Repr = lg.to(obj)
def stringy(t: T) = {
val rec = toRecord(t)
val keys = rec.keys
keys.mkString
View LabelledGenericOddness.scala
import shapeless._
case class Wibble(x: Int, y: String)
val wib = Wibble(42, "towel")
def recOf[T](obj: T)(implicit gen: LabelledGeneric[T]) = gen.to(obj)
recOf(wib) // works beautifully
class ClassyRecOf[T](implicit gen: LabelledGeneric[T]) {
def doIt(obj: T) = gen.to(obj)
@kevinwright
kevinwright / DeferredActorRef.scala
Last active Aug 29, 2015
Sending to an actor you don't know yet...
View DeferredActorRef.scala
import akka.actor._
import scala.collection.mutable
case class DeferredActorRef(implicit factory: ActorRefFactory) {
private[this] val innerActor = factory.actorOf(Props(new TheActor))
private[this] case class SetRef(ref: ActorRef)
private[this] class TheActor extends Actor with ActorLogging {
val buffer: mutable.Queue[(Any, ActorRef)] = mutable.Queue.empty
You can’t perform that action at this time.