Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
AntiPseudonym
Apr 1, 2007
I EAT BABIES

:dukedog:

Jo posted:

Finally made my tileset editor usable. I love sprite games and there are a bunch of good options for map editors (like Tiled), but very few for tileset editors. Pixothello was awesome, but it ran like poo poo on my machine and couldn't import/export png.





That is the best name for a tileset editor ever.

Adbot
ADBOT LOVES YOU

Ferg
May 6, 2007

Lipstick Apathy


I wanted to gain a deeper understanding of the JVM so I built a language that runs on top of it. It doesn't do much right now (in fact I've aptly named the language "Stoopid"), but after less than a week I've got the compiler to a point that's worth mentioning. Here's the reference code for that screenshot:

code:
function juicy(juice) {
    print(juice);
}

function main() {
    var x = 0;

    if (x == 0) {
        juicy("Hello world!");
    }
}
Conditionals and function calls work, and there is very very rudimentary support for local variables. print() is a builtin that is pretty much verbatim a "Hello world!" in JVM bytecode. Now that I've got the parsing out of the way, along with some basic features, I'm going to start tacking on features and see where things go.

Suspicious Dish
Sep 24, 2011

2020 is the year of linux on the desktop, bro
Fun Shoe
Are you doing any optimization at any level, or is this going to compile to something like:

code:
void juicy(String arg0) {
    aload_0
    invokestatic print
    return
}

void main() {
    iconst_0
    istore_0
    iload_0
    iconst_0

    if_icmpeq .call_juicy
    return

  .call_juicy:
    ldc "Hello, World!"
    invokestatic juicy
}
(I don't know JVM bytecode at all, I just guessed a compilation based on my knowledge of other bytecode systems and this reference. I'm guessing that arguments to function calls are stored as a bunch of locals)

Ferg
May 6, 2007

Lipstick Apathy

Suspicious Dish posted:

Are you doing any optimization at any level, or is this going to compile to something like:

code:
void juicy(String arg0) {
    aload_0
    invokestatic print
    return
}

void main() {
    iconst_0
    istore_0
    iload_0
    iconst_0

    if_icmpeq .call_juicy
    return

  .call_juicy:
    ldc "Hello, World!"
    invokestatic juicy
}
(I don't know JVM bytecode at all, I just guessed a compilation based on my knowledge of other bytecode systems and this reference. I'm guessing that arguments to function calls are stored as a bunch of locals)

No optimizations yet, that's pretty much what it compiles down to. I'm decompiling (via javap) similar Java code to get a feel for the JVM's behavior for different things and I'll tweak and optimize that as I go. Right now I've got the parser properly building the AST from what I want the language to look like (there's a lot more that is parsing than what that small bit shows) and now I'm getting the compiler built to support each bit.

And you're correct about function call arguments. The 0th indexed local is "this" in Java, and then the rest are the function parameters, and any that are declared in the method.

Belgarath
Feb 21, 2003
Anyone who's read my blog will know I spent far too long loving around with a Github library in C#, but I decided I really need to learn WPF, so I ditched that pathetic waste of time and grabbed someone else's library, and got started. Here's what I've got so far, which is displaying a list of public gists, who created it, the time and the description.



There are some formatting issues on the gist descriptions, and it's missing gravatars and other useful bits of information like number of comments and so on. Obviously, the right-hand side of the grid-splitter will be used to display the actual contents of the selected gist.

Suspicious Dish
Sep 24, 2011

2020 is the year of linux on the desktop, bro
Fun Shoe

Ferg posted:

No optimizations yet, that's pretty much what it compiles down to. I'm decompiling (via javap) similar Java code to get a feel for the JVM's behavior for different things and I'll tweak and optimize that as I go. Right now I've got the parser properly building the AST from what I want the language to look like (there's a lot more that is parsing than what that small bit shows) and now I'm getting the compiler built to support each bit.

And you're correct about function call arguments. The 0th indexed local is "this" in Java, and then the rest are the function parameters, and any that are declared in the method.

This inspired me to do my own take on it. I don't quite have if statements done, yet (to do it right, I'd have to start implement a basic graph algorithm, and I don't feel like doing that right now), but "Hello, world!" works!

I'd love to see how you tackled the problem.

Contains Acetone
Aug 22, 2004
DROP IN ANY US MAILBOX, POST PAID BY SECUR-A-KEY

Contains Acetone fucked around with this message at 17:57 on Jun 24, 2020

Ferg
May 6, 2007

Lipstick Apathy

Suspicious Dish posted:

This inspired me to do my own take on it. I don't quite have if statements done, yet (to do it right, I'd have to start implement a basic graph algorithm, and I don't feel like doing that right now), but "Hello, world!" works!

I'd love to see how you tackled the problem.

I started with recursive descent parsing and then switched to PEG since it was a bit more elegant in letting you describe the grammar. The resulting AST is pretty easy. I basically only need to iterate down to specific nodes and can hardcode where to grab any additional bits (i.e. I identify an assignment operation, I know that 2 nodes down is the operand). The only recursion in the compilation process is processing a block of {}.

Edit: responded earlier while at a concert. Just read through your Github. Looks like you went the hardcore route and generate 100% of the classfile yourself. I took the lazy route and use ASM to handle the nitty gritty of actually generating the classfile and instead I handle all of the details of what's in it. I should also mention mine is written in Jython, since ASM is a Java library. ASM seems to be the most popular. Jython uses it and I think Jruby does too, though there are several alternatives.

Ferg fucked around with this message at 07:13 on Dec 12, 2011

Jo
Jan 24, 2005

:allears:
Soiled Meat

Contains Acetone posted:

Working on a user-friendly, GPU-Accelerated, Restricted Boltzmann Machine training system that follows the guide put out by Dr. Hinton: http://www.cs.toronto.edu/~hinton/absps/guideTR.pdf

*snip*

This is awesome. I've tried (and failed) repeatedly to do a functional implementation. Any chance you'll put your code online?

Contains Acetone
Aug 22, 2004
DROP IN ANY US MAILBOX, POST PAID BY SECUR-A-KEY

Contains Acetone fucked around with this message at 17:58 on Jun 24, 2020

duck monster
Dec 15, 2004

shrughes posted:

It's not my fault you're all optically challenged.

I used to work with a guy who was fanatical about web useability that would likely shank anyone who said that within his earshot.

Actually he was optically challened. 100% blind infact. Dude spent more time on the net than I did and would go crazy about the use of images for menus. Which is fair enough when you think about it.

Rohaq
Aug 11, 2006

duck monster posted:

I used to work with a guy who was fanatical about web useability that would likely shank anyone who said that within his earshot.

Actually he was optically challened. 100% blind infact. Dude spent more time on the net than I did and would go crazy about the use of images for menus. Which is fair enough when you think about it.
Easy as hell way to check usability is to install a text only browser like lynx or elinks, and try to open your page from there.

If you can't read it in a text only browser, chances are that browsers designed for sight impaired people are going to struggle too.

Nippashish
Nov 2, 2005

Let me see you dance!

Contains Acetone posted:

Working on a user-friendly, GPU-Accelerated, Restricted Boltzmann Machine training system that follows the guide put out by Dr. Hinton: http://www.cs.toronto.edu/~hinton/absps/guideTR.pdf

Hey, neat, someone building RBMs. Allow me to ask several questions.

Contains Acetone posted:

Next up I'm going to get weight visualization working, and a graph of reconstruction error and free energy over time. Then I'm going to actually implement those buttons on the visible reconstruction tab (and similar on feature detector tab). Further down the line I want to add support for Gaussian visible units and the SRBM model. Oh and actually exporting trained networks I guess.

Are you training with CD or stochastic maximum likelihood (Hinton calls this PCD)? Do you have any plans to support other (non-stochastic?) learning rules? Are you planning to support using some of the visible units as labels? How about plans for deep networks? Have you considered implementing annealed importance sampling to estimate the partition function of a trained model? How about plotting pseudo-likelihood during training? Are you going to implement HMC for sampling in Gaussian-Binary models? How about the newer variants of RBMs that model covariance in the visible units?

Edit: Watching free energy over time is misleading because when you update the weights you change the partition function. Free energy lets you compare the relative probabilities of two visible vectors under a fixed model but you can't really compare free energies between models without knowing the partition function. Basically the probability of a visible vector looks like P(v) = exp(-free_energy(v))/Z so you might expect plotting free_energy(v) vs time would show you how the probability of v is changing when you update the weights, but when you do a weight update you change the value of Z as well so you really have no idea what's happening to P(v). Typically when you're training the weights change slowly enough that plotting free energy vs time appears to give useful information but it's actually not telling you what you might expect.

Nippashish fucked around with this message at 21:56 on Dec 13, 2011

Contains Acetone
Aug 22, 2004
DROP IN ANY US MAILBOX, POST PAID BY SECUR-A-KEY

Contains Acetone fucked around with this message at 17:59 on Jun 24, 2020

Nippashish
Nov 2, 2005

Let me see you dance!

Contains Acetone posted:

I'm currently using plain old CD learning with 1 step of Gibbs sampling. If there are resources detailing other training methods and their benefits I'll certainly look into it, but for now CD certainly seems to be 'good enough.'

CD works fine, and is nearly identical to SML. I like SML because maximum likelihood is well understood statistically so it's easier to reason about what's happening than with CD. The only difference during training is that when sampling in CD you start the negative phase at the data whereas with SML you start at the old negative samples.

Contains Acetone posted:

I primarily want to use the RBM weights for use in larger MLP, so I don't think I have any need for learning the partition function.

You can use the partition function to compare different RBMs, for instance the partition function can answer questions like "I have one RBM with 500 hidden units and another RBM with 700 hidden units, which one is a better model of the data?"

Contains Acetone posted:

I wasn't aware you could calculate an estimate of the likelihood! Can you point me to any relevant publications?

Pseudo likelihood isn't quite the same as likelihood but it's an approximation that you can compute quickly. Instead of computing the P(v) you instead compute sum_i P(v_i|v_{-i}) (that is, you sum the probabilities of each individual visible unit conditioned on all the others). You can even do stochastic estimates of this which makes it a very cheap quantity to track. See Yoshua Bengio's response to this newsgroup thread.

Contains Acetone posted:

I haven't heard of HMC until now, what's it do and what is it good for?

HMC is hybrid monte carlo. When you have continuous visible units you can use it to sample them (it doesn't work for discrete valued visibles because sampling in discrete spaces is bloody hard). The idea is that rather than sampling P(v,h) jointly you instead compute P(v) = sum_h P(v,h) and sample from P(v) directly, which is a reasonable thing to do since the sum over all the hidden units can be done analytically. This is a good thing because it means you're sampling fewer variables so your variance will be lower. It's also important for some of the newer RBM models because in some of them P(v|h) becomes hard to compute (although P(h|v) remains easy).

I can't think off hand of a paper that explains how HMC works in RBMs, but Radford Neal has a good tutorial online for using HMC in general.

Contains Acetone posted:

I am planning on implementing SRBM training which adds connections between visible units. These models are supposedly better with natural image patches.

This is true. I'd encourage you to also look at mcRBMs. See Generating More Realistic Images Using Gated MRF's and Modeling Pixel Means and Covariances Using Factorized Third-Order Boltzmann Machines from here: http://www.cs.toronto.edu/~ranzato/publications/publications.html

Contains Acetone posted:

My intent is to display the free energy of a subset of the training set and a separate validation set never seen during training. My understanding is that you can avoid over-fitting by stopping-early when the two values start to diverge. Otherwise yeah I agree, free-energy is useless without the partition function.

This sounds reasonable. I was worried you were going to compare free energies computed with different sets of weights.

Contains Acetone posted:

My immediate interest is in seeing if the SRBM model can be used to generate tileable textures based on a dataset of image-patches. I'm also interested in their use as auto-encoders and for use in initializing the weights in a larger MLP architecture.

Interesting goal! Kevin Swersky's Masters thesis demonstrates some nice connections between autoencoders and RBMs.

Huragok
Sep 14, 2011
Well, save for a few minor features/tweaks, documentation, benchmarking and some JSON API stuff, we're almost ready for a beta launch of our JS-based numerical processing service. A really neat test of it's capabilities was performed a few days ago: we took some accelerometer data from an iPhone, uploaded the JSON to the service, passed it through a natively-bound fft() and graphed the frequency components of the signal.

Anyway, a question relating to IDE design. We've got two concepts (below) and both have their pros and cons.

First style (side-by-side):

  • Pro: uses all the screen real-estate
  • Pro: you can see local variables and your tools/data on the right while coding/writing
  • Con: kills the responsive layout deployed across the rest of the site
  • Con: looks cluttered and junky

Second style (all-in-one):

  • Pro: cleaner, more minimalist
  • Pro: maintains the responsive layout, so that you can still use this IDE pretty well on an iPad or smaller screened devices
  • Con: while you can type shortcuts to other tabs, you still need to mouse to click back to the terminal
  • Con: looks a little empty (?)

I like the second one better, but I feel that the first is more familiar to desktop IDE users. Suggestions?

NaughtyHusky
Mar 11, 2004
Offical Kristen Bell Stalker
Thanks to PDP-1 and dangerz (love your blog) I finally dug out my Gameboy emulator (well the start of anyway) and aim to chip away and progress both my programming skills and my knowledge of the Gameboy hardware.

I started a weblog over here to try and keep me motivated - http://ryansrandomthings.blogspot.com/

Only registered members can see post attachments!

Contains Acetone
Aug 22, 2004
DROP IN ANY US MAILBOX, POST PAID BY SECUR-A-KEY

Contains Acetone fucked around with this message at 18:00 on Jun 24, 2020

Strong Sauce
Jul 2, 2003

You know I am not really your father.





Wanted to try something with Canvas. Worked on this off and on so right now I'm focused I'm making it size well regardless of the width/height of the bounding box and fitting text in before moving on to other plans, like integrating different libraries (using Raphael, maybe also allow d3) and making it somewhat themeable/customizable.
Edit: well image uploading didn't work out. here it is on imgur

Nippashish
Nov 2, 2005

Let me see you dance!

Contains Acetone posted:

Do you know if there are any resources that identify what 'good' features look like? I mean, obviously it's going to vary from data-set to data-set, but for MNIST which is better: those trippy swirly filters or the filters which are mostly 0 with a few localized strokes/splotches? And why is one preferable?

For images people usually prefer localized Gabor like filters, so filers that are mostly uniform with a local oriented edge like feature somewhere. This is justified by analogy to models of the visual cortex where you have simple cells which act like edge detectors. Similarly, if you train a deep network you hope that the higer level features (i.e. what tou get by turnining one one unit in a deep layer and projecting its activity down to the visible layer) look like corners and crosses by analogy to complex cells.

If you model pixel covariances of color images (eg with an mcrbm) you also want to see separation of shape and color, that is you should have a mixture of localized greyscale edge filters and globaly diffuse color filters.

For data that is not image patches what good filters look like is much less clear.

Mental Filler
May 5, 2007

She can ride or walk
either leave it or love it

Huragok posted:

I like the second one better, but I feel that the first is more familiar to desktop IDE users. Suggestions?

Personally I like the second layout for similar reasons, although the black background for the terminal in the first is good (maybe you can make that a preference?) As long as you can switch easily to the other tabs for looking stuff up I don't think the first layout has any particular benefit.

Modern Pragmatist
Aug 20, 2008

Huragok posted:

Second style (all-in-one):

  • Pro: cleaner, more minimalist
  • Pro: maintains the responsive layout, so that you can still use this IDE pretty well on an iPad or smaller screened devices
  • Con: while you can type shortcuts to other tabs, you still need to mouse to click back to the terminal
  • Con: looks a little empty (?)

In this layout, does the terminal disappear when you select any of the tabs on the left? I personally prefer to see the variables that I have access to and their respective sizes etc. Maybe have a split option?

Huragok
Sep 14, 2011

Mental Filler posted:

As long as you can switch easily to the other tabs for looking stuff up I don't think the first layout has any particular benefit.

Yeah, I like the contrast of white on black too, so I made it a configurable shell preference.

Modern Pragmatist posted:

In this layout, does the terminal disappear when you select any of the tabs on the left? I personally prefer to see the variables that I have access to and their respective sizes etc. Maybe have a split option?

Yes. So say you call a function that graphs some data, it switches to the graphing pane. I was thinking of a toolbar up the top that has a button/popover combination. The locals tab shows your VM vars which you can explore OS X style.

MononcQc
May 29, 2007



This isn't much, but it's what my testing window looks like for real time bidding gateways.

Top-left is Entop, an Erlang app that works like 'top' but for processes in the VM. Bottom left is the gateway's debug reporting window, telling me whether request to a particular exchange server went fine (ok), timed out (to), got its connections refused (cr), etc.

Bottom right is an exchange simulator, sending about a hundred bids a second (x) and a few wins through it (w). Middle right is a client (or bidder) simulator, returning whether it suggested a bid to the gateway (b) or sent a 'no bid' (n). Top right shows what the client receives when a bid request is won.

Production must stand from 4000 to ~7000 queries per second, per node.

bobthecheese
Jun 7, 2006
Although I've never met Martha Stewart, I'll probably never birth her child.


I'm not obsessed with Conway's Game of Life - honest! It just makes a nice platform to test out ideas.

This one is a 'multiplayer' version, which is a shared board that everyone viewing sees.

It's appears a little laggy because I decided to restrict the 'new generations' to one every second, and the client only checks for an update every half a second. I could probably improve the perceived 'responsiveness' by upping the speed at which the client checks for updates, but it's sitting on a Dreamhost server, so I didn't want to let it get too hard.

Anyway, you can see the install/demo here and see the source on github.

tef
May 30, 2004

-> some l-system crap ->

Ferg posted:

I wanted to gain a deeper understanding of the JVM so I built a language that runs on top of it. It doesn't do much right now (in fact I've aptly named the language "Stoopid"), but after less than a week I've got the compiler to a point that's worth mentioning. Here's the reference code for that screenshot:

Suspicious Dish posted:

This inspired me to do my own take on it. I don't quite have if statements done, yet (to do it right, I'd have to start implement a basic graph algorithm, and I don't feel like doing that right now), but "Hello, world!" works!

I'd love to see how you tackled the problem.

toy languages :keke:

I've been meaning to write something myself, but I have a terrible habit of writing one part of the compiler and changing the design as a result.

Dolex
May 5, 2001

I'm making a game for cats.

Only registered members can see post attachments!

Lurchington
Jan 2, 2003

Forums Dragoon
Wow, ^^^ that's really neat :)

I release version 0.1.0 of my python module: "logging_unterpolation" which patches the python standard logging module to accept the new-style {curly bracket} syntax for formatting strings, in addition to falling back to the old and bust %(string interpolation operator)s syntax.

http://pypi.python.org/pypi/logging_unterpolation/0.1.0
https://bitbucket.org/rdennis463/logging_unterpolation/

Worked on it off and on the last couple of months, being really anal about testing since you just don't want to mess with logging in a big project.

from the bitbucket page, hope the examples are ok as screenshots :(:
logging_unterpolation is a very simple module that will patch the built-in logging module to accept PEP-3101 compliant string formatting (using the str.format method) as well as falling back to accept the original string interpolation operator (% or 'modulo')

Here's a basic example:
code:
>>> import logging
>>> from logging_unterpolation import patch_logging
>>> logging.basicConfig(level=logging.DEBUG)
>>> logging.debug('test')
DEBUG:root:test
>>> logging.debug('%s', 'test')
DEBUG:root:test
>>> patch_logging()
>>> logging.debug('{0}', 'test') # not supported unless patched with logging_unterpolation
DEBUG:root:test
Unterpolation is the name for this patcher due to the fact it adds in support for formatting syntax other than that used by the '%' operator, also known has the string interpolation operator (source). Interpolation doesn't have an antonym suitable for this purpose, so *Un*terpolation is is.

Lurchington fucked around with this message at 06:14 on Dec 22, 2011

duck monster
Dec 15, 2004

Dolex posted:

I'm making a game for cats.



Ok this has me intregued. What exactly is a game for cats?

Pretty much any computer with a keyboard is a game for cats (At least my cat seems to think so). The current game is "Wait till duck hasn't saved for over an hour then jump all over the keyboard somehow managing a command combination that shuts the computer down without saving". She's quite good at it.

Dolex
May 5, 2001

duck monster posted:

Ok this has me intregued. What exactly is a game for cats?

Pretty much any computer with a keyboard is a game for cats (At least my cat seems to think so). The current game is "Wait till duck hasn't saved for over an hour then jump all over the keyboard somehow managing a command combination that shuts the computer down without saving". She's quite good at it.
Kinect + Projector + predator prey flocking algorithms = good times had by all.

akadajet
Sep 14, 2003

Dolex posted:

Kinect + Projector + predator prey flocking algorithms = good times had by all.

This sounds like it would be neat in motion. Any chance of a video?

duck monster
Dec 15, 2004

Dolex posted:

Kinect + Projector + predator prey flocking algorithms = good times had by all.

This is loving awesome, and I would definately like to see a video of it in action.

gwar3k1
Jan 10, 2005

Someday soon
I think I've seen something like that before in the Nottingham light night: the projector displays fish in a barrel or ants in a box... etc. and the players (people in this case, cats in yours) jump on the fish/ant to squash them and get points. I wasn't sure how they registered the input because this was pre Kinect days, I assumed laser or some kind of light registration where if a dark spot intersects an object, the object is squashed and points given.

duck monster
Dec 15, 2004

I just love the photo. The cat pondering this alien bloccky landscape makes a striking image. As if fluffkins had just stumbled into minecraft or something.

Still want to know more about these cat games! You've managed to combine my two favorite things, computergames and cats.

Post videos pls!

duck monster fucked around with this message at 09:51 on Dec 25, 2011

Scaevolus
Apr 16, 2007

Here's a frog playing a video game:

https://www.youtube.com/watch?v=WlEzvdlYRes

Thermopyle
Jul 1, 2003

...the stupid are cocksure while the intelligent are full of doubt. —Bertrand Russell

I've never done any GUI stuff, so this is a learning experience for me, but...



Work-in-progess. App lets you change active sound devices in Windows 7 via hotkey, tray icon, or maybe a desktop gadget.

Cryolite
Oct 2, 2006
sodium aluminum fluoride
What GUI framework are you using?

Scaevolus
Apr 16, 2007

Thermopyle posted:

I've never done any GUI stuff, so this is a learning experience for me, but...


You could simplify the "Device Type" column into Play/Record (Green Triangle/Red Circle) icons.

Thermopyle
Jul 1, 2003

...the stupid are cocksure while the intelligent are full of doubt. —Bertrand Russell

Cryolite posted:

What GUI framework are you using?

I started out writing this in python because I like python. Unfortunately I discovered that GUI programming with python on Windows 7 is poo poo. To quote myself:


Thermopyle in the Python thread posted:

The state of Python GUI frameworks for Windows (especially for a GUI noob) is frustrating.

GTK+
Needs an unavailable version of PyGObject.

wxPython
AFAICT, impossible to use with virtualenv.

PySide
No designer available.

TkInter
Seems OK, but the screenshots I've seen of TKinter apps don't look native. Need to look into this more.

There are the major ones I've looked at so far. Just getting irritated that each one has some big-ish thing that makes me not want to use it.

So, since I was already using the COM bindings to AutoIT in Python via win32com.client to automate some stuff in Windows I decided to give AutoIT's GUI tools a try and have been just chugging along with that.

Scaevolus posted:

You could simplify the "Device Type" column into Play/Record (Green Triangle/Red Circle) icons.

Great idea, thanks!

Adbot
ADBOT LOVES YOU

Vanadium
Jan 8, 2005

So Mumble, the group voice chat client of fully grown nerds, has an overlay that shows who is talking while you're in a fullscreen game. Because my game of choice is running under 32bit wine while mumble was a native 64bit process it took a bit of fumbling around to set up properly and realise it still wouldn't work for some reason.

In the process of loving around with it I figured I might as well take it as a learning project over the christmas weekend to replicate the overlay as a standalone program. For linux/opengl it's apparently implemented as a dynamic library that gets preloaded into the game process, overriding the buffer swapping function to open a unix domain socket, getting the name of a shared memory object holding a texture and receiving instructions to blit parts of it and throw them over the game's opengl stuff. I don't speak any opengl but it was easy enough to see where the unix ipc went in and the pixels came out so here goes:



It's a fairly straightforward Gtk program, though it took me a bit to figure out how to make transparent windows. To make it a bit more interesting and also to make sure that this couldn't possibly ever be useful to anyone but me even if they bothered to replace the hardcoded paths and resolution, the whole thing is written in (lovely, imperative, lowlevel) Haskell.

Now I just need to figure out how to make it click-throughable. :smith:

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply