Welcome!
For whatever reason you're here now. What you see is interpreted by your browser and rendered by your machine; altered by the technology and finally by your perception.
Here's a person, it's me. :)
There used to be more here but the Internet isn't what it was back in 1999, so I have deleted pretty much everything.
This website is a tiny window, and outdated. But I've been here since before blogging was even a word.Projects (some of them, anyway)
Notable Links
Golang
Here is my solution to the "A Tour of Go Exercise: Web Crawler" problem.
package main import ( "fmt" "time" ) type Fetcher interface { // Fetch returns the body of URL and // a slice of URLs found on that page. Fetch(url string) (body string, urls []string, err error) } // Crawl uses fetcher to recursively crawl // pages starting with url, to a maximum of depth. func Crawl(url string, depth int, urlchan chan CrawlUrl, crawlsem chan int, fetcher Fetcher) { defer func() { <- crawlsem }() // pull our start fact off the semaphore if depth <= 0 { return } body, urls, err := fetcher.Fetch(url) if err != nil { fmt.Println(err) return } fmt.Printf("found: %s %q\n", url, body) for _, u := range urls { urlchan <- CrawlUrl{u, depth} } return } type CrawlUrl struct { url string depth int } func Crawler(url string, depth int, fetcher Fetcher) { fmt.Printf("Crawling: %s\n", url); urlchan := make(chan CrawlUrl) crawlsem := make(chan int, 5) donelist := make(map [string]bool) crawlsem <- 0 go Crawl(url, depth, urlchan, crawlsem, fetcher) for { select { case u := <- urlchan: if _,found := donelist[u.url]; found == false { donelist[u.url] = true crawlsem <- 0 go Crawl(u.url, u.depth-1, urlchan, crawlsem, fetcher) } case sem := <- crawlsem: // crawlers are still active crawlsem <- sem time.Sleep(time.Millisecond) // yield default: // No crawlers are active, and no urls left return } } } func main() { Crawler("http://golang.org/", 4, fetcher) }
Java
I'm pleased to have discovered how a Java program can modify its own environment variables, so that programs or libraries subsequently loaded can use them. Here it is:
import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; /** This class sets environment variables, using libc via JNA. * It's actually quite a simple use of the powerful and promising * JNA library, which Sun produced. */ public class SetEnv { // This is the standard, stable way of mapping, which supports extensive // customization and mapping of Java to native types. public interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class); int setenv(String name, String value, int overwrite); String getenv(String name); } public static void main(String[] args) { String var = "VARNAME"; String val = CLibrary.INSTANCE.getenv(var); System.out.printf("%s\t%s\n", var, val); CLibrary.INSTANCE.setenv(var, "PKCS11_LIB", 1); val = CLibrary.INSTANCE.getenv(var); System.out.printf("%s\t%s\n", var, val); } }
Fin
Tact involves skill and patience; patience involves love.