Skip to content

Instantly share code, notes, and snippets.

@viperscape
viperscape / init.el
Created November 12, 2014 18:44
toggle cleanmode (no menu,scroll,toolbars)
(set 'cleanmode 1)
(defun toggle-cleanmode ()
"toggles clean mode"
(interactive)
(cond ((not cleanmode)
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
(set 'cleanmode 1))
((eq 1 cleanmode)
@viperscape
viperscape / nasa-apod.py
Created November 6, 2014 00:53
pull down hi-res of nasa astronomical pic of the day
import urllib.request
address = 'http://apod.nasa.gov/apod/astropix.html'
file = urllib.request.urlopen(address) #read in the site and hunt for the image url
html = file.read()
data = html.decode('utf-8')
#print (data)
s = data.find("<a href=\"image")+14 #find the first instance of the image hyperlink
@viperscape
viperscape / core.clj
Created September 3, 2014 15:59
async chans and kuroshio streams
(ns chan-test.core
(:gen-class)
(:require [clojure.core.async :as async]
[kuroshio.core :as k]))
(defn create-string []
(apply str (take 10000 (repeat ".\r\n"))))
(defn println-err [& args]
(binding [*out* *err*]
@viperscape
viperscape / gridgraph.clj
Last active August 29, 2015 14:04
square grid to relationship graph for loom
(defn gen-graph [s]
(graph ;;generate loom graph
(reduce merge {} ;; format...
(apply concat ;; for loom
(for [r (range s)] ;;for each row
(for [c (range s)] ;;for each column in the row
(let [nl [[r (+ 1 c)]
[(- r 1) c]
[r (- c 1)]
[(+ 1 r) c]]]
@viperscape
viperscape / broadcast-stream.clj
Last active August 29, 2015 14:01
many-to-many broadcast stream
(defn v-> [s v]
"pushes value onto stack, if possible, returns new head/tail"
(let [p (promise)]
(if (deliver s (cons v (list p)))
p)))
(defn v<- [s]
"returns lazy sequence of actual values, without head/tail"
(when (realized? s)
(cons (first @s)
@viperscape
viperscape / many-to-many-queues.clj
Last active August 29, 2015 14:01
A small comparison of many to many thread-safe queues in Clojure
(import 'java.util.concurrent.LinkedBlockingQueue)
(use 'criterium.core)
(defn lbq-test []
(let [q ^LinkedBlockingQueue (LinkedBlockingQueue.)]
(.start(Thread. #(dotimes [n 50000] (.take q))))
(.start(Thread. #(dotimes [n 50000] (.take q))))
(.start(Thread. #(dotimes [n 50000] (.take q))))
(.start(Thread. #(dotimes [n 1000000] (.add q n))))
@viperscape
viperscape / int-to-bytes.clj
Created February 22, 2014 22:48
int32 to 4 bytes, which could be used to send size of a following datagram, like a bytes header
(let [i 128900, b (map #(unchecked-byte(bit-shift-right i (* % 8))) (range 0 4))]
{i (reduce +(map #(bit-shift-left (bit-and %1 255) (* %2 8)) b (range 0 4)))})
@viperscape
viperscape / bits-lit.clj
Last active August 29, 2015 13:56
returns map of which bits where flagged
(defn- bits-lit [b]
"cerates seq of bits that are flagged"
(map #(bit-and b (bit-shift-left 1 %)) (range 8)))
(bits-lit 23) ;;(1 2 4 0 16 0 0 0)
(map pos? (bits-lit 23)) ;; (true true true false true false false false)
(defn get-chunk [conn buf]
"returns map of bytes and size of buffer for data recieved in stream (buffered input stream);
buf would be something like: (make-array Byte/TYPE 4096)"
(let [bufsize (.read conn buf)] ;;blocking
{:size bufsize :data buf}))
(defn- ws-decode [frame]
"decodes websocket frame"
(let [data (:data frame)
@viperscape
viperscape / handler_clients.clj
Created January 20, 2014 21:22
http-kit connection timeout handling, client tracking. ping-clients should probably be named differently. assumes traffic is json.
(def clients (atom {}))
(defn remove-client [ch] (close ch)(swap! clients dissoc ch))
(defn purge-clients! []
(doseq [c @clients]
(if (> (- (.getTime (java.util.Date.)) (.getTime (:last-seen (val c)))) 60000)
(remove-client (key c)))))