selfmodifier.org is up!
Unfortunately, due to a limitation of redmine, you cannot create projects when you first sign in.
Email admin@selfmodifier.org if you have any problems.
Also, if anyone doesn't like my message in the front page then please suggest improvements.
Apologies to anyone who tried to email me in the last two days: it's been rather out of order, what with setting everything up.
7 January 2011
selfmodifier.org finance
I'm going to have to start a blog for this. That would be a good way to push news updates.
Anyhoo, I'm going to see about getting charitable status. That will allow us to receive donations without having to get shafted by paypal, nor pay a business tariff.
Server is back online. I'll give you a shout when redmine is up.
Anyhoo, I'm going to see about getting charitable status. That will allow us to receive donations without having to get shafted by paypal, nor pay a business tariff.
Server is back online. I'll give you a shout when redmine is up.
selfmodifier.org upgrade
selfmodifier.org is receiving an upgrade at 15:00, so it can cope with redmine.
Grand opening should be this evening, at some point.
In the meantime, I'm going to write a little html frontpage. And order some electronics :)
Grand opening should be this evening, at some point.
In the meantime, I'm going to write a little html frontpage. And order some electronics :)
redmine is slow
I got redmine all set up, but it's really slow - so slow I've had to take it down out fear the system would become unstable.
Gonna need to upgrade the server.
Gonna need to upgrade the server.
selfmodifier.org, take 2
Since we're going to use redmine, for technical documentation and all projects - assuming that works well (it might not crash until week 3...) - we don't need such a complex site as I thought. However we're still going to need a simple site that:
- Hosts static material: disclaimers, legal things, our mission!
- Publish a news stream - are there currently any technical faults with the site?
- Donate/shop, the second if we create anything legit enough to sell.
- Other things?
4 January 2011
Sensory augmentation experiment log website, request for comments
selfmodifier.org shall be a website designed to support the aims and development of the "scrapyard transhumanism movement". It will:
It shall attempt to fulfill these aims, by meeting these specific requirements in software:
- Document what exactly is happening, in a neutral manner. This will help explain the situation to outsiders.
- Improve safety, for anyone who may be interesting in trying out some of the ideas, by being clear on all methods used.
- Carry a disclaimer to show that this isn't medical science; that it's more like a mix of piercing and computer science; even then it isn't recognized by piercers. "Don't be an idiot."
- Make it easier for users to find information
- Make things easier for lepht, who is the only moderator of a blog which is the centre of a growing movement.
- Encourage community development.
It shall attempt to fulfill these aims, by meeting these specific requirements in software:
- selfmodifier.org shall be a collection of experiment logs on low-cost sensory augmentation.
- The site shall have three classes of user who are capable of modifying the site:
- registered users
- moderators
- site administrators
- Experiment logs shall only be submitted by registered members and moderators.
- On each log's page, it shall be clearly stated that it is not a safe piercing, or medical procedure. It shall also state that the work has not been peer reviewed by researchers. It shall state that it is the log of an experiment by a private individual, and that it is not an instruction manual on how to perform home surgery.
- Experiments will be structured as the most plain and simple scientific reports. Each may have:
- Title
- Abstract
- Introduction
- Method
- Results
- Discussion
- Reference list
- Appendices
- This format shall not be enforced by site design, but it shall be encouraged by the moderators.
- The moderations shall be able to ban users, and edit all experiment logs.
- Users may be promoted to moderators, and moderators may be demoted to users, or banned, by the administrators.
- There shall be a comment system, to allow users to encourage good work and discourage poor work.
- There shall be a search engine, and tagging scheme, to enable users to find experiment logs
- Registered members retain copyright of their experiment logs. They shall license them to the users themselves, using the GNU Free Documentation License.
- The site reserves the right to remove content and suspend services at any time.
- The site shall respect, and only respect, the legal authorities of the United Kingdom. I.E. the only people whom the administrators are obliged to obey, are the U.K. police.
- Since this is a fairly harmless site about implanting things into your skin, anything that is obviously illegal is also irrelevant content, and shall be deleted.
- All source code shall be made available under the GNU GPL.
3 January 2011
gory website
EDIT: I have decided these ideas are not great - it just sounds so unscientific, which is exactly what people are complaining about. See the next entry for new ideas.
So I've decided to go ahead and make a website to host instructions for sensory augmentation. It will have several caveats, designed to minimize the site's involvement with Her Majesty's servants:
EDIT: this all looks a bit strict. Perhaps I better revise my ideas? After all, some people just post pictures of themselves chopping their own balls off online.
So I've decided to go ahead and make a website to host instructions for sensory augmentation. It will have several caveats, designed to minimize the site's involvement with Her Majesty's servants:
- It shall be clearly stated that the instructions on the site are not safe, and are not condoned by medical professionals nor anyone else. Readers should not attempt to execute the instructions. The instructions are only intended to provoke thought about the limits of human sensory perception or abilities.
- Users shall not be able to comment nor vote upon the instructions. Allowing this would imply that the site approves of some instructions.
- Articles shall only be submitted by registered members.
- Registered members retain copyright of the instructions. They shall license them to the users themselves: no instructions shall be the intellectual property of the site.
- The site reserves the right to remove content and suspend services at any time.
EDIT: this all looks a bit strict. Perhaps I better revise my ideas? After all, some people just post pictures of themselves chopping their own balls off online.
websites with gory content
Extreme body modification would benefit from an website where people can share their recipes. However, it's a thing generally frowned upon, and perhaps illegal in some contexts.
It's not alone in this. As certain people found out, publishing instructions to hack into the Bank of America is also going to get you into trouble.
This puts the publisher in a strange position. I don't do these things. I don't condone all (most?) of these things! But some things that are generally frowned upon are great, and it would be brilliant to see them progress!
I'm not sure what it needs, but a one-owner, one-responsibility website seems a tad inappropriate.
It's not alone in this. As certain people found out, publishing instructions to hack into the Bank of America is also going to get you into trouble.
This puts the publisher in a strange position. I don't do these things. I don't condone all (most?) of these things! But some things that are generally frowned upon are great, and it would be brilliant to see them progress!
I'm not sure what it needs, but a one-owner, one-responsibility website seems a tad inappropriate.
1 January 2011
Cybernetics for the masses repair stream on linux
The wmas coming out of the ccc are fucked atm, so here's a command for GNU/Linux users which simultaneously:
downloads
repairs (though transcribing to mp4)
sensibly renames the video
For the questions and answers:
Obviously you need ffmpeg installed for that.
downloads
repairs (though transcribing to mp4)
sensibly renames the video
wget -qO- http://c3.ex23.de/saal2-2010-12-30_11-21-43.wmv | ffmpeg -i pipe: cybernetics_for_the_masses1.mp4
For the questions and answers:
wget -qO- http://c3.ex23.de/saal2-2010-12-30_13-37-07.wmv | ffmpeg -i pipe: cybernetics_for_the_masses2.mp4
Obviously you need ffmpeg installed for that.
Labels:
biohacking,
gnu/linux
21 December 2010
Positive About Negative Aberdonian Crusty
NOTE: I edited this a couple of times around 22:16, on 21 December 2010, and the morning of the 22nd.
I wrote a song. Give it a listen!
It's a happy blues song about crust music in Aberdeen.
For the benefit of a couple of friends, here are the tabs:
I wrote a song. Give it a listen!
It's a happy blues song about crust music in Aberdeen.
For the benefit of a couple of friends, here are the tabs:
Positive About Negative Aberdonian Crusty
By John Morrice 2010
This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/ or send a letter to
Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
Hi guys!
Tuning is a half step down, Eb Bb Db Gb Bb Eb
Time signature is 6/8 for most of the song, but 4/4 at the end.
Notation:
Next bar: |
Hammer on: h
Pull off: p
Don't play this string: x
Notes:
* I skimp on some work by just saying what chord to play for that part.
* The chords used are given at the end of this file.
* Always listen to the song for the rhythm.
* This tab file does not describe the songs structure, only its riffs.
* I know I wrote the bloody song but these tabs may still not be perfect.
Verse:
Eb|-------------0---------|-------------0-----0-
Bb|---------0h2---2p0-----|---------0h2---2p0---
Gb|-------0---------------|-------0-------------
Db|---0h2-------------2p0-|---0h2---------------
Ab|-0---------------------|-0-------------------
Eb|-----------------------|---------------------
Eb|-------------0---------|-------------------------
Bb|---------0h1---1p0-----|-1p0h1p0h1p0h1p0h1p0h1p0-
Gb|-------0---------------|-------------------------
Db|---0h2-------------2p0-|-------------------------
Ab|-3---------------------|-------------------------
Eb|-----------------------|-------------------------
Eb|-------------0---------|--------------0-----0-
Bb|---------0h2---2p0-----|----------0h2---2p0---
Gb|-------0---------------|--------0-------------
Db|---0h2-------------2p0-|---0h2----------------
Ab|-0---------------------|-0--------------------
Eb|-----------------------|----------------------
For the last two bars, strum Gb6 (see the end of this file)
Chorus rhythm part:
Strum
Ab7
Ab7
Gb6
Cb7
Chorus lead part:
Eb|-9p7---9p7---9p7---9p7---9p7---9p7---9p7---9p7---
Bb|-----8-----8-----8-----8-----8-----8-----8-----8-
Gb|-------------------------------------------------
Db|-------------------------------------------------
Ab|-------------------------------------------------
Eb|-------------------------------------------------
Eb|-----3------3------3------3-
Bb|-3h5----3h5----3h5----3h5---
Gb|----------------------------
Db|----------------------------
Ab|----------------------------
Eb|----------------------------
Back into verse, let ring
Eb|-------------------------|--
Bb|-------------------------|--
Gb|-3p0h3p0h3p0h3p0h3p0h3p0-|-0
Db|-------------------------|--
Ab|-------------------------|--
Eb|-------------------------|--
"Solo", on top of the chorus, goes something a little like:
Eb|-------------------------------------------------
Bb|-------------------------5-5-5-5-5-5-5-5-5-5-5-5-
Gb|-7-7-7-7-7-7-7-7-7-7-7-7-------------------------
Db|-------------------------------------------------
Ab|-------------------------------------------------
Eb|-------------------------------------------------
Eb|-------------------------------------------------
Bb|-------------------------------------------------
Gb|-------------------------5-5-5-5-5-5-5-5-5-5-5-5-
Db|-7-7-7-7-7-7-7-7-7-7-7-7-------------------------
Ab|-------------------------------------------------
Eb|-------------------------------------------------
Eb|-------------------------------------------------
Bb|-------------------------------------------------
Gb|-------------------------------------------------
Db|-------------------------5-5-5-5-5-5-5-5-5-5-5-5-
Ab|-7-7-7-7-7-7-7-7-7-7-7-7-------------------------
Eb|-------------------------------------------------
Eb|-------------------------------------------------
Bb|-------------------------------------------------
Gb|-------------------------------------------------
Db|-------------------------------------------------
Ab|-5-5-5-5-5-5-3-3-3-3-3-3-------------------------
Eb|-------------------------5-5-5-5-5-5-5-5-5-5-5-5-
End part is in 4/4 and goes:
Ab5
Gb5
Cb5
Db5
That's it!
The chords:
Ab7
Eb 0
Bb 2
Gb 0
Db 2
Ab 0
Eb x
Gb6
Eb 0
Bb 3
Gb 0
Db 0
Ab x
Eb 3
(Weird) Cb7
Eb x
Bb x
Gb 3
Db 5
Ab 3
Eb x
Powerchords (Fifths)
Ab5
Eb x
Bb x
Gb x
Db 2
Ab 0
Eb x
Gb5
Eb x
Bb x
Gb x
Db x
Ab 5
Eb 3
Cb5
Eb x
Bb x
Gb x
Db 5
Ab 3
Eb x
Db5
Eb x
Bb x
Gb x
Db 7
Ab 5
Eb x
Have a lot of fun :)
Labels:
music
7 December 2010
Wireworld
On my quest for enlightenment, I have completed the Wireworld cellular automaton task on Rosetta code. Smalltalk wasn't on the list, so I gave learning GNU Smalltalk a try, and I experienced some success in this!
I find cellular automata fascinating. It's just the biological nature of it - that it can grow, and where there was previously no life, something suddenly exists! I digress, but there are interesting applications for more traditional mathematics (like finding the contour of the graph).
However, my solution is a bit big - in fact, it's written in both Smalltalk and C, and generates animated GIFs.

Also I wanted to write a nice flexible bit of software in Smalltalk, to learn it properly and to find why those in my books rate it so highly, so aye, it grew a bit.
Anyway, here is the README so you can find out about it, with an additional link to the source added there.
I find cellular automata fascinating. It's just the biological nature of it - that it can grow, and where there was previously no life, something suddenly exists! I digress, but there are interesting applications for more traditional mathematics (like finding the contour of the graph).
However, my solution is a bit big - in fact, it's written in both Smalltalk and C, and generates animated GIFs.

Also I wanted to write a nice flexible bit of software in Smalltalk, to learn it properly and to find why those in my books rate it so highly, so aye, it grew a bit.
Anyway, here is the README so you can find out about it, with an additional link to the source added there.
NAME
jwgif - Johnny's Wireworld GIF creator.
ABOUT
jwgif is a simulator for the Wireworld cellular automaton. It renders to an animated GIF,
which it sends to stdout.
REQUIREMENTS
gcc
GNU Plotutils
GNU Smalltalk
COMPILATION
./compile.sh
USAGE
jwgif FILENAME GENERATIONS WIDTH HEIGHT SQUARESIZE
OPTIONS
FILENAME is a path to a Wireworld file - see WIREWORLD FILE FORMAT below.
The following must be positive integers:
GENERATIONS determines the number of frames produced.
WIDTH the width of the output GIF, in pixels.
HEIGHT the height of the output GIF, in pixels.
SQUARESIZE the size of the square cells, in pixels.
EXAMPLE
./jwgif arena/cyc3inhib.ww 200 110 50 10 > 3cycle.gif
WIREWORLD FILE FORMAT
Wireworld is a cellular automaton with some similarities to Conway's Game of Life. It is
capable of doing sophisticated computations (e.g., calculating primeness!) with appropriate
programs, and is much simpler to program for.
A wireworld arena consists of a cartesian grid of cells, each of which can be in one of
four states. All cell transitions happen simultaneously. The cell transition rules are this:
Input State Output State Condition
empty empty
electron head electron tail
electron tail conductor
conductor electron head if 1 or 2 cells in the neighborhood of the cell are in the state “electron head”
conductor conductor otherwise
A Wireworld program can be stored in a file using the following notation:
"H" for an electron head
"t" for a tail
"." for a conductor
space for empty.
Here is an example program, which demonstrates two cycle-3 generators and an inhibit gate:
tH.........
. .
...
. .
Ht.. ......
The output for this program is included with the jwgif distribution, with the file name 3cycle.gif
jwgif uses the following convention for colouring cells in the output GIF:
An electron head is red.
A tail is blue.
A conductor is green.
Empty cells are black.
This section was ripped off from http://rosettacode.org/wiki/Wireworld on 6th December 2010. Thanks guys!
LICENSE
jwgif is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
jwgif is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with jwgif. If not, see <http://www.gnu.org/licenses/
Studying
So I got CARPS text mode stable, and I have plans to create a graphical version.
At 10ksloc and with client, server, superserver, use of maths and support for modding, it is the largest and most complex project I've forced to stagger into some sort of fruition. And I faced so many problems, encountered so many things, and I learned this:
I suck! Oh god, I suck. There are so many reasons why I suck, and thankfully I have learned some of them.
So I had a bit of a think, and decided that before I do any more development on this, I really need to improve. I really like the Rosetta Code website! It challenges you to solve tasks in a language of your choice. So I'm going to spend my time learning some new languages, and solving some interesting problems.
At 10ksloc and with client, server, superserver, use of maths and support for modding, it is the largest and most complex project I've forced to stagger into some sort of fruition. And I faced so many problems, encountered so many things, and I learned this:
I suck! Oh god, I suck. There are so many reasons why I suck, and thankfully I have learned some of them.
So I had a bit of a think, and decided that before I do any more development on this, I really need to improve. I really like the Rosetta Code website! It challenges you to solve tasks in a language of your choice. So I'm going to spend my time learning some new languages, and solving some interesting problems.
11 November 2010
CARPS
Wow, I appear to have finally put out a stable release of CARPS!
From the CARPS README:
CARPS, the Computer Assisted Role-Playing Game System, is a tool for playing pen and paper RPGs over the internet.
CARPS differs from other such systems because CARPS is not a ‘real-time’ system. It suits people who want to log on once or twice a day, take a turn, and then log out again. While OpenRPG could be described as being similar to a chat-room, CARPS is more similar to an email client.
CARPS is an extensible system: game rules are provided by ‘mods’.
CARPS supports these mods by providing:
* Text-mode user interfaces for the players and the dungeon master.
* An easy to use probabilistic API which not only rolls the dice, but can report the probability of various game events occurring.
* Automated static character sheet verification, according to a schema defined in YAML. For example, a game might require your strength to be an integer.
* Support for the semantic validation of character sheets according to game rules. For example, a game might require the sum of character’s attributes to be below a certain maximum value.
* Together the validation features allow a mod writer to encode game rules cleanly, as they do not need to consider the possibility of receiving an invalid sheet.
CARPS has other strengths:
* Anyone can play or host a CARPS game! All you need is an email account.
* CARPS is designed to be secure. Multiple email security options are supported, and all CARPS messages are cryptographically signed to prevent spoofing.
* You can instruct CARPS to use your favourite text editor and terminal emulator.
* CARPS is easy to configure because it includes a wizard.
However, CARPS is new and the following features, which you might take for granted, are not yet supported:
* No GUI
* No support for maps
* No chat - all communication goes through the Game Master.
* Games are currently invite only, at the discretion of the Game Master.
* Security mechanisms are not well audited.
Requirements:
For users:
* GNU/Linux
* ruby 1.9
* rubygems
* openssl
* highline
For developing CARPS, you will also need:
* hoe
* rake
* newgem
* cucumber
To Install:
# Install the gem
sudo gem install carps
# Initialize the carps user directory. Run this as your everyday user.
carps_init
Basic Instructions:
Run carps -h for help
The first time CARPS is run, it will launch a wizard to help you configure your email settings, and choose a text editor and a terminal emulator.
It is a good idea to specify a terminal emulator, as then CARPS can launch a mod in a new window (or similar). Then the first CARPS window will act as an email logger, letting you see when you receive mails, without interfering with the text you type into the new window.
You’re also going to need to install a mod to play CARPS. See the example ‘fools’ mod:
* github.com/elginer/fools
Campaigns (For the DM):
When you set up a new game, CARPS will ask for you to enter the name of a campaign.
This allows you to create game resources prior to starting a game.
For example, the following applies if your mod is called foo, the campaign is called bar, and your carps user data directory is /home/user/carps
You should create the following directories
the campaign directory:
/home/user/carps/dm/campaigns/foo/bar
the NPCSs directory:
/home/user/carps/dm/campaigns/foo/bar/npcs
the rooms directory:
/home/user/carps/dm/campaigns/foo/bar/rooms
NPCs are defined as YAML files, according to the mod’s schema. Put them in the NPCs directory. They MUST have the .yaml extension.
Rooms are defined as text files. These are just predefined pieces of prose that the DM will send to the players when they enter a room, for instance. Put them in the rooms directory. They MUST have the .txt extension.
I'm gonna spend the next little while trying to organise a play session, working on the windows port, and then trying to create a DND D20 mod for it.
From the CARPS README:
CARPS, the Computer Assisted Role-Playing Game System, is a tool for playing pen and paper RPGs over the internet.
CARPS differs from other such systems because CARPS is not a ‘real-time’ system. It suits people who want to log on once or twice a day, take a turn, and then log out again. While OpenRPG could be described as being similar to a chat-room, CARPS is more similar to an email client.
CARPS is an extensible system: game rules are provided by ‘mods’.
CARPS supports these mods by providing:
* Text-mode user interfaces for the players and the dungeon master.
* An easy to use probabilistic API which not only rolls the dice, but can report the probability of various game events occurring.
* Automated static character sheet verification, according to a schema defined in YAML. For example, a game might require your strength to be an integer.
* Support for the semantic validation of character sheets according to game rules. For example, a game might require the sum of character’s attributes to be below a certain maximum value.
* Together the validation features allow a mod writer to encode game rules cleanly, as they do not need to consider the possibility of receiving an invalid sheet.
CARPS has other strengths:
* Anyone can play or host a CARPS game! All you need is an email account.
* CARPS is designed to be secure. Multiple email security options are supported, and all CARPS messages are cryptographically signed to prevent spoofing.
* You can instruct CARPS to use your favourite text editor and terminal emulator.
* CARPS is easy to configure because it includes a wizard.
However, CARPS is new and the following features, which you might take for granted, are not yet supported:
* No GUI
* No support for maps
* No chat - all communication goes through the Game Master.
* Games are currently invite only, at the discretion of the Game Master.
* Security mechanisms are not well audited.
Requirements:
For users:
* GNU/Linux
* ruby 1.9
* rubygems
* openssl
* highline
For developing CARPS, you will also need:
* hoe
* rake
* newgem
* cucumber
To Install:
# Install the gem
sudo gem install carps
# Initialize the carps user directory. Run this as your everyday user.
carps_init
Basic Instructions:
Run carps -h for help
The first time CARPS is run, it will launch a wizard to help you configure your email settings, and choose a text editor and a terminal emulator.
It is a good idea to specify a terminal emulator, as then CARPS can launch a mod in a new window (or similar). Then the first CARPS window will act as an email logger, letting you see when you receive mails, without interfering with the text you type into the new window.
You’re also going to need to install a mod to play CARPS. See the example ‘fools’ mod:
* github.com/elginer/fools
Campaigns (For the DM):
When you set up a new game, CARPS will ask for you to enter the name of a campaign.
This allows you to create game resources prior to starting a game.
For example, the following applies if your mod is called foo, the campaign is called bar, and your carps user data directory is /home/user/carps
You should create the following directories
the campaign directory:
/home/user/carps/dm/campaigns/foo/bar
the NPCSs directory:
/home/user/carps/dm/campaigns/foo/bar/npcs
the rooms directory:
/home/user/carps/dm/campaigns/foo/bar/rooms
NPCs are defined as YAML files, according to the mod’s schema. Put them in the NPCs directory. They MUST have the .yaml extension.
Rooms are defined as text files. These are just predefined pieces of prose that the DM will send to the players when they enter a room, for instance. Put them in the rooms directory. They MUST have the .txt extension.
I'm gonna spend the next little while trying to organise a play session, working on the windows port, and then trying to create a DND D20 mod for it.
25 October 2010
Esperanto X-System fun
A friend of mine asked me to make a tiny website for them: it converts between Esperanto X-System in ASCII and the unicode characters.
It's a it of fun.
Here you go.
There isn't much to it but I am smug at how neat and tidy the html and javascript looks :)
It's a it of fun.
Here you go.
There isn't much to it but I am smug at how neat and tidy the html and javascript looks :)
22 September 2010
PROGRAMMER KEYBOARD
EDIT: fixed a bug! Results should be good now :) Damn, why did I forget to run the tests :p
Computer keyboards are fucking stupid, especially for programmers.
They fuck everyone too: QWERTY is so we don't jam the machinery. Even dvorak keyboards have staggered keys so the MECHANICAL arms can reach them.
However, as programmers, we use all sorts of symbols not in the ken of mere mortals (like *). And for most, you have to press shift just to get at them.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
The solution: design a programmer keyboard!
First off, we need some numbers so it can be known which keys are most often pressed. To do this I wrote a key frequency program*. I then used it to find the key frequencies of the source files of a number of different programs, in various languages. These are:
linux - C
adagide - ada
axiom - c#
django - python
ghc - haskell
go - go
irrlicht - c++
limewire - java
phpbb3 - php
prototype and jquery - javascript
rails - ruby
regexkit - objective c
racket - racket
To simplify things, I only considered characters ASCII characters between horizontal tab (ASCII 9) and '~' (ASCII 126). These are usually the ones I type, at least.
My hypothesis is that many symbols are going to be more popular than letters. This would prove a need for these symbols to have their OWN FUCKING KEYS instead of being the hangers on and miscreants of the keyboard world.
Here are the results of my analysis. The character is on the left, the fraction of the whole is on the right. They are presented in descending order of popularity.
' ': 0.12601734868442382
'e': 5.672758827442585e-2
't': 4.506425247731305e-2
'i': 3.6282361484752744e-2
'r': 3.5587647133639044e-2
'\t': 3.52634742130502e-2
'\n': 3.45691915152049e-2
'_': 3.438222642926237e-2
's': 3.201379627014596e-2
'n': 3.0954960014858875e-2
'a': 3.058217872499613e-2
'o': 2.6776405034843204e-2
'c': 2.3632039961301494e-2
'd': 2.329124049378265e-2
'l': 1.9319481645750994e-2
'u': 1.761928496254444e-2
'0': 1.737397825253189e-2
'p': 1.6228575776688497e-2
'f': 1.5556196850182672e-2
',': 1.4572080038859849e-2
'*': 1.3460275453084754e-2
'm': 1.2857509828221805e-2
')': 1.2389877996691128e-2
'(': 1.2383996720909098e-2
';': 1.140731013627353e-2
'h': 1.0710680981789305e-2
'-': 1.0232090684508581e-2
'x': 1.0086694597923173e-2
'g': 9.400323788643899e-3
'b': 8.972889667733516e-3
'E': 8.898045202243342e-3
'=': 8.357994322825149e-3
'v': 7.983041606459754e-3
'S': 7.407318795659219e-3
'T': 7.301129459599258e-3
'R': 7.1601262346295165e-3
'/': 7.1380145327522146e-3
'A': 7.117130673860958e-3
'I': 7.099489478546994e-3
'C': 6.66979575805779e-3
'>': 6.316573098911656e-3
'.': 5.726058267571846e-3
'1': 5.685534184968124e-3
'N': 5.413383379318554e-3
'D': 5.24449377399052e-3
'P': 5.0353985619458206e-3
'L': 5.008180717747133e-3
'O': 5.000104327173332e-3
'k': 4.9537792457673745e-3
'w': 4.742584988103445e-3
'y': 4.725471515230428e-3
'2': 4.638324931590688e-3
'M': 4.5006262229531635e-3
'"': 3.800355652024797e-3
'F': 3.764420517430011e-3
'U': 3.1530152471186336e-3
'{': 3.055959062530431e-3
'}': 3.0551233923309254e-3
'B': 3.0211399095564015e-3
'3': 2.9180155749053346e-3
'G': 2.7770136659516554e-3
'4': 2.5617397584948654e-3
'8': 2.3449629606950287e-3
'#': 2.2478633475767726e-3
'&': 2.2210126718594423e-3
'6': 2.162497333669207e-3
':': 1.9414777000847955e-3
'H': 1.8788563917804559e-3
'q': 1.8209240487057808e-3
'<': 1.6977541573950867e-3
'5': 1.6778586265665519e-3
'V': 1.665461755260506e-3
'\\': 1.5621847627462226e-3
'X': 1.4939677541453535e-3
'[': 1.4782940028443977e-3
']': 1.4776491549739134e-3
'+': 1.4496245929290891e-3
'9': 1.3384093915275372e-3
'7': 1.3184046313658388e-3
'W': 1.2953598741004282e-3
'K': 1.2184137309589008e-3
'z': 1.2113717290099994e-3
'\r': 1.143696919026762e-3
'\'': 1.0093106228178275e-3
'Y': 9.986745810030226e-4
'|': 9.358519222411643e-4
'%': 8.897926760797742e-4
'!': 7.546115061692628e-4
'j': 6.665502913662852e-4
'Q': 4.7705713856824653e-4
'Z': 3.924557299928266e-4
'@': 3.550282331834911e-4
'?': 1.816549611314985e-4
'$': 1.7383124564164268e-4
'J': 1.5937875724642036e-4
'~': 1.2080895849508404e-4
'^': 3.6191757726917574e-5
'`': 3.1301442039734356e-5
'\f': 3.8032864197953453e-7
'\ESC': 5.264064248851689e-9
Total characters: 759869145
You suck \ESC. No one loves you!
Note that the total does not reflect the number of characters I ignored ala the last paragraph.
It's interesting to observe that _ is a rather popular character for programmers indeed! Also it is interesting that * and , are both more popular than m.
By far the most interesting thing to note is that '(' is more popular than ')'. Don't they come in pairs?
The next step is to design a keyboard layout which makes it easy for people to type the more popular characters. I think I will do this by experimentation - how easy it it to type various phrases? Some research is available on the topic, but a lot of things are easy to get, eg:
Most people are right handed.
Your index fingers are stronger than your pinkies.
Hence, you're gonna want the most used keys in the middle-right of the keyboard.
The last step is to actually make the bastarding thing.
I'm not exactly sure on the best way to actually create a keyboard. With enough time, I could design a program which would run on a microcontroller, interface with the keyboard matrix and communicate with the pc over PS/2.
However, that sounds complicated. Perhaps I shall just move the keys around (but how to put enter and tab in the middle?), and see if I can make it work under Xorg and the terminal.
* The program is split into two parts.
frequency.hs:
-- Copyright John Morrice 2010.
-- Distributed under the terms of the GNU General Public License v 3
{-# LANGUAGE BangPatterns #-}
module Main
(freq_test
,file_test
,main) where
-- | GHC haskell key frequency program
import Control.Monad
import qualified Data.ByteString.Lazy.Char8 as Z
import qualified Data.ByteString.Char8 as B
import Data.Array.MArray
import Data.Array.IO
import Data.List
import System.IO
import System.Posix.Process
import System.Environment
import GHC.Int
main :: IO ()
main = do
as <- getArgs
if length as /= 1
then
error "Usage: frequency DIR"
else do
let dir = head as
prgs <- find_prgs dir program_exts
contents <- fmap Z.concat $ mapM strict_read prgs
(freq, total) <- frequency contents
format_frequency freq
putStrLn $ "Total characters: " ++ show total
strict_read :: FilePath -> IO Z.ByteString
strict_read fp = do
contents <- B.readFile fp
return $ Z.fromChunks [contents]
format_frequency :: IOArray Char Double -> IO ()
format_frequency ma = do
as <- getAssocs ma
let sorted = reverse $ sortBy (\(_,fr1) (_,fr2) -> fr1 `compare` fr2) as
mapM_ (\ (ch,fr) -> putStrLn $ (show ch) ++ ": " ++ show fr) sorted
freq_test :: IO Bool
freq_test = do
d <- freq_data >>= getAssocs
roccs <- new_occs
right <- mapArray fromIntegral roccs
writeArray right 'e' 0.5
writeArray right 'd' (3/8)
writeArray right 'a' (1/8)
rightl <- getAssocs right
return $ d == rightl
freq_data :: IO (IOArray Char Double)
freq_data =
fmap fst $ frequency freq_input
freq_input :: Z.ByteString
freq_input = Z.pack "eeeeddda"
file_test :: IO Bool
file_test = do
files <- fmap sort $ find_prgs "test_files" ["c", "rb"]
putStrLn "Found:"
print files
let expected = sort (actual "test_files/")
putStrLn "Expected"
print expected
return $ files == expected
where
actual dir = map (dir ++) ["a.c", "b.c", "c.rb", "d.rb"]
-- | Determine the frequency of characters in a bytestring as a fraction of the whole
frequency :: Z.ByteString -> IO (IOArray Char Double, Int64)
frequency by = do
fr <- occur by >>= mapArray (\o -> fromIntegral o / fromIntegral total)
return (fr, total)
where
total = Z.length by
new_occs :: IO (IOArray Char Int64)
new_occs =
newListArray (min_char, max_char) (repeat 0)
min_char :: Char
min_char = '\9'
max_char :: Char
max_char = '\126'
occur :: Z.ByteString -> IO (IOArray Char Int64)
occur bz = do
occs <- new_occs
zfoldrM increase occs bz
where
increase :: Char -> IOArray Char Int64 -> IO ()
increase ch oc =
if ch >= min_char && ch <= max_char
then do
count <- readArray oc ch
let n = count + 1
n `seq` writeArray oc ch n
else
return ()
zfoldrM :: (Char -> IOArray Char Int64 -> IO ()) -> IOArray Char Int64 -> Z.ByteString -> IO (IOArray Char Int64)
zfoldrM f ar bz =
if Z.null bz
then return ar
else do
f (Z.head bz) ar
zfoldrM f ar (Z.tail bz)
program_exts :: [String]
program_exts =
["bas", -- basic
"java", -- java
"hs", -- haskell
"rb", -- ruby
"py", -- python
"php", -- php
"m", -- objective c
"c", "h", -- c
"cs", -- c#
"js", -- javascript
"ads", "adb", -- ada
"cxx", "cpp", "c++", -- c++
"scm", -- scheme, racket
"pas", -- pascal, delphi
"go" -- go
]
-- | A regular expression which matches files with the given extension
extension_regex :: String -> String
extension_regex = (".+\\." ++)
-- | Find program files in the given directory matching the given extensions
find_prgs :: String -> [String] -> IO [String]
find_prgs dir exts = do
writeFile "result" ""
mapM_ (find_prg dir) exts
fmap lines $ readFile "result"
--- | Find program files in the given directory matching the given extension
find_prg :: String -> String -> IO ()
find_prg dir ext = do
pid <- forkProcess $
executeFile "./finder.sh" False [dir, "-regex", extension_regex ext] Nothing
getProcessStatus True True pid
return ()
-- Source ends with this line
finder.sh
# Source begins with this line
#! /bin/bash
find $* >> result
# Source ends with this line
Computer keyboards are fucking stupid, especially for programmers.
They fuck everyone too: QWERTY is so we don't jam the machinery. Even dvorak keyboards have staggered keys so the MECHANICAL arms can reach them.
However, as programmers, we use all sorts of symbols not in the ken of mere mortals (like *). And for most, you have to press shift just to get at them.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
The solution: design a programmer keyboard!
First off, we need some numbers so it can be known which keys are most often pressed. To do this I wrote a key frequency program*. I then used it to find the key frequencies of the source files of a number of different programs, in various languages. These are:
linux - C
adagide - ada
axiom - c#
django - python
ghc - haskell
go - go
irrlicht - c++
limewire - java
phpbb3 - php
prototype and jquery - javascript
rails - ruby
regexkit - objective c
racket - racket
To simplify things, I only considered characters ASCII characters between horizontal tab (ASCII 9) and '~' (ASCII 126). These are usually the ones I type, at least.
My hypothesis is that many symbols are going to be more popular than letters. This would prove a need for these symbols to have their OWN FUCKING KEYS instead of being the hangers on and miscreants of the keyboard world.
Here are the results of my analysis. The character is on the left, the fraction of the whole is on the right. They are presented in descending order of popularity.
' ': 0.12601734868442382
'e': 5.672758827442585e-2
't': 4.506425247731305e-2
'i': 3.6282361484752744e-2
'r': 3.5587647133639044e-2
'\t': 3.52634742130502e-2
'\n': 3.45691915152049e-2
'_': 3.438222642926237e-2
's': 3.201379627014596e-2
'n': 3.0954960014858875e-2
'a': 3.058217872499613e-2
'o': 2.6776405034843204e-2
'c': 2.3632039961301494e-2
'd': 2.329124049378265e-2
'l': 1.9319481645750994e-2
'u': 1.761928496254444e-2
'0': 1.737397825253189e-2
'p': 1.6228575776688497e-2
'f': 1.5556196850182672e-2
',': 1.4572080038859849e-2
'*': 1.3460275453084754e-2
'm': 1.2857509828221805e-2
')': 1.2389877996691128e-2
'(': 1.2383996720909098e-2
';': 1.140731013627353e-2
'h': 1.0710680981789305e-2
'-': 1.0232090684508581e-2
'x': 1.0086694597923173e-2
'g': 9.400323788643899e-3
'b': 8.972889667733516e-3
'E': 8.898045202243342e-3
'=': 8.357994322825149e-3
'v': 7.983041606459754e-3
'S': 7.407318795659219e-3
'T': 7.301129459599258e-3
'R': 7.1601262346295165e-3
'/': 7.1380145327522146e-3
'A': 7.117130673860958e-3
'I': 7.099489478546994e-3
'C': 6.66979575805779e-3
'>': 6.316573098911656e-3
'.': 5.726058267571846e-3
'1': 5.685534184968124e-3
'N': 5.413383379318554e-3
'D': 5.24449377399052e-3
'P': 5.0353985619458206e-3
'L': 5.008180717747133e-3
'O': 5.000104327173332e-3
'k': 4.9537792457673745e-3
'w': 4.742584988103445e-3
'y': 4.725471515230428e-3
'2': 4.638324931590688e-3
'M': 4.5006262229531635e-3
'"': 3.800355652024797e-3
'F': 3.764420517430011e-3
'U': 3.1530152471186336e-3
'{': 3.055959062530431e-3
'}': 3.0551233923309254e-3
'B': 3.0211399095564015e-3
'3': 2.9180155749053346e-3
'G': 2.7770136659516554e-3
'4': 2.5617397584948654e-3
'8': 2.3449629606950287e-3
'#': 2.2478633475767726e-3
'&': 2.2210126718594423e-3
'6': 2.162497333669207e-3
':': 1.9414777000847955e-3
'H': 1.8788563917804559e-3
'q': 1.8209240487057808e-3
'<': 1.6977541573950867e-3
'5': 1.6778586265665519e-3
'V': 1.665461755260506e-3
'\\': 1.5621847627462226e-3
'X': 1.4939677541453535e-3
'[': 1.4782940028443977e-3
']': 1.4776491549739134e-3
'+': 1.4496245929290891e-3
'9': 1.3384093915275372e-3
'7': 1.3184046313658388e-3
'W': 1.2953598741004282e-3
'K': 1.2184137309589008e-3
'z': 1.2113717290099994e-3
'\r': 1.143696919026762e-3
'\'': 1.0093106228178275e-3
'Y': 9.986745810030226e-4
'|': 9.358519222411643e-4
'%': 8.897926760797742e-4
'!': 7.546115061692628e-4
'j': 6.665502913662852e-4
'Q': 4.7705713856824653e-4
'Z': 3.924557299928266e-4
'@': 3.550282331834911e-4
'?': 1.816549611314985e-4
'$': 1.7383124564164268e-4
'J': 1.5937875724642036e-4
'~': 1.2080895849508404e-4
'^': 3.6191757726917574e-5
'`': 3.1301442039734356e-5
'\f': 3.8032864197953453e-7
'\ESC': 5.264064248851689e-9
Total characters: 759869145
You suck \ESC. No one loves you!
Note that the total does not reflect the number of characters I ignored ala the last paragraph.
It's interesting to observe that _ is a rather popular character for programmers indeed! Also it is interesting that * and , are both more popular than m.
By far the most interesting thing to note is that '(' is more popular than ')'. Don't they come in pairs?
The next step is to design a keyboard layout which makes it easy for people to type the more popular characters. I think I will do this by experimentation - how easy it it to type various phrases? Some research is available on the topic, but a lot of things are easy to get, eg:
Most people are right handed.
Your index fingers are stronger than your pinkies.
Hence, you're gonna want the most used keys in the middle-right of the keyboard.
The last step is to actually make the bastarding thing.
I'm not exactly sure on the best way to actually create a keyboard. With enough time, I could design a program which would run on a microcontroller, interface with the keyboard matrix and communicate with the pc over PS/2.
However, that sounds complicated. Perhaps I shall just move the keys around (but how to put enter and tab in the middle?), and see if I can make it work under Xorg and the terminal.
* The program is split into two parts.
frequency.hs:
-- Copyright John Morrice 2010.
-- Distributed under the terms of the GNU General Public License v 3
{-# LANGUAGE BangPatterns #-}
module Main
(freq_test
,file_test
,main) where
-- | GHC haskell key frequency program
import Control.Monad
import qualified Data.ByteString.Lazy.Char8 as Z
import qualified Data.ByteString.Char8 as B
import Data.Array.MArray
import Data.Array.IO
import Data.List
import System.IO
import System.Posix.Process
import System.Environment
import GHC.Int
main :: IO ()
main = do
as <- getArgs
if length as /= 1
then
error "Usage: frequency DIR"
else do
let dir = head as
prgs <- find_prgs dir program_exts
contents <- fmap Z.concat $ mapM strict_read prgs
(freq, total) <- frequency contents
format_frequency freq
putStrLn $ "Total characters: " ++ show total
strict_read :: FilePath -> IO Z.ByteString
strict_read fp = do
contents <- B.readFile fp
return $ Z.fromChunks [contents]
format_frequency :: IOArray Char Double -> IO ()
format_frequency ma = do
as <- getAssocs ma
let sorted = reverse $ sortBy (\(_,fr1) (_,fr2) -> fr1 `compare` fr2) as
mapM_ (\ (ch,fr) -> putStrLn $ (show ch) ++ ": " ++ show fr) sorted
freq_test :: IO Bool
freq_test = do
d <- freq_data >>= getAssocs
roccs <- new_occs
right <- mapArray fromIntegral roccs
writeArray right 'e' 0.5
writeArray right 'd' (3/8)
writeArray right 'a' (1/8)
rightl <- getAssocs right
return $ d == rightl
freq_data :: IO (IOArray Char Double)
freq_data =
fmap fst $ frequency freq_input
freq_input :: Z.ByteString
freq_input = Z.pack "eeeeddda"
file_test :: IO Bool
file_test = do
files <- fmap sort $ find_prgs "test_files" ["c", "rb"]
putStrLn "Found:"
print files
let expected = sort (actual "test_files/")
putStrLn "Expected"
print expected
return $ files == expected
where
actual dir = map (dir ++) ["a.c", "b.c", "c.rb", "d.rb"]
-- | Determine the frequency of characters in a bytestring as a fraction of the whole
frequency :: Z.ByteString -> IO (IOArray Char Double, Int64)
frequency by = do
fr <- occur by >>= mapArray (\o -> fromIntegral o / fromIntegral total)
return (fr, total)
where
total = Z.length by
new_occs :: IO (IOArray Char Int64)
new_occs =
newListArray (min_char, max_char) (repeat 0)
min_char :: Char
min_char = '\9'
max_char :: Char
max_char = '\126'
occur :: Z.ByteString -> IO (IOArray Char Int64)
occur bz = do
occs <- new_occs
zfoldrM increase occs bz
where
increase :: Char -> IOArray Char Int64 -> IO ()
increase ch oc =
if ch >= min_char && ch <= max_char
then do
count <- readArray oc ch
let n = count + 1
n `seq` writeArray oc ch n
else
return ()
zfoldrM :: (Char -> IOArray Char Int64 -> IO ()) -> IOArray Char Int64 -> Z.ByteString -> IO (IOArray Char Int64)
zfoldrM f ar bz =
if Z.null bz
then return ar
else do
f (Z.head bz) ar
zfoldrM f ar (Z.tail bz)
program_exts :: [String]
program_exts =
["bas", -- basic
"java", -- java
"hs", -- haskell
"rb", -- ruby
"py", -- python
"php", -- php
"m", -- objective c
"c", "h", -- c
"cs", -- c#
"js", -- javascript
"ads", "adb", -- ada
"cxx", "cpp", "c++", -- c++
"scm", -- scheme, racket
"pas", -- pascal, delphi
"go" -- go
]
-- | A regular expression which matches files with the given extension
extension_regex :: String -> String
extension_regex = (".+\\." ++)
-- | Find program files in the given directory matching the given extensions
find_prgs :: String -> [String] -> IO [String]
find_prgs dir exts = do
writeFile "result" ""
mapM_ (find_prg dir) exts
fmap lines $ readFile "result"
--- | Find program files in the given directory matching the given extension
find_prg :: String -> String -> IO ()
find_prg dir ext = do
pid <- forkProcess $
executeFile "./finder.sh" False [dir, "-regex", extension_regex ext] Nothing
getProcessStatus True True pid
return ()
-- Source ends with this line
finder.sh
# Source begins with this line
#! /bin/bash
find $* >> result
# Source ends with this line
8 September 2010
JOrbit
I finished my last software engineering assignment today, and I needed to relax, so I wrotekludged a little Orbit clone.
I used to love that game, so this afternoon I murdered it ;)
To the best of my knowledge it only works on firefox! It does _not_ work on IE or opera. And it has only been tested on firefox3.6 on windows and ubuntu (I don't have my cable on me to check with latest on gentoo)
It's also full of bugs. How many can you find?!
Instructions:
Attempt to hit the target
Move the mouse to aim
Press the left mouse button to charge
Watch the force meter!
Let go to fire
If you get an impossible level just refresh
If you want to see the code, there's the development repository
It's a total hack but I'm still pleased because:
It's written entirely in javascript! I use raphael for rendering and jquery for lots of things
It has proper physics, with gravity and everyfink
I wrote it in an afternoon!
I used to love that game, so this afternoon I murdered it ;)
To the best of my knowledge it only works on firefox! It does _not_ work on IE or opera. And it has only been tested on firefox3.6 on windows and ubuntu (I don't have my cable on me to check with latest on gentoo)
It's also full of bugs. How many can you find?!
Instructions:
Attempt to hit the target
Move the mouse to aim
Press the left mouse button to charge
Watch the force meter!
Let go to fire
If you get an impossible level just refresh
If you want to see the code, there's the development repository
It's a total hack but I'm still pleased because:
It's written entirely in javascript! I use raphael for rendering and jquery for lots of things
It has proper physics, with gravity and everyfink
I wrote it in an afternoon!
7 September 2010
New look (again)
Just had a look at this on a windows machine and saw how fucked up it looked! MY GOD IT HAD COMIC SANS.
Despite the nasty fonts, my own fault, I'd forgotten how shitty everything looks on windows anyway.
I've tried to make it have less of a contrast, as well, for the eye pain.
Anyhoos, I set up a wiki on my local machine, with rails and wagn. It's good because I know ruby pretty well, and I'm planning on modifying the thing ala last post's ideas.
I've put on a boring sort of style - I better check it on windows before I release it to the wild, though!
Despite the nasty fonts, my own fault, I'd forgotten how shitty everything looks on windows anyway.
I've tried to make it have less of a contrast, as well, for the eye pain.
Anyhoos, I set up a wiki on my local machine, with rails and wagn. It's good because I know ruby pretty well, and I'm planning on modifying the thing ala last post's ideas.
I've put on a boring sort of style - I better check it on windows before I release it to the wild, though!
6 September 2010
carps is nearly done
carps is very nearly done: tonight I shall just about polish it off. Then I have to write a user manual (with snm ;) and find some time to test it properly over the Internet with a friend. I'm happy because I've basically done the hard bits :)
I'm hoping it might get more developer support and users than my other projects - all written in Haskell - because it's written in a more popular programming language - ruby.
Also, since carps is winding down, I'm taking on another project - a technically minded body modifcation wiki: for discussing electronic implants and such. I'm thinking about trying out CLiki, because it looks cool and I've been wanting to learn lisp.
The reason that we need such a thing is because a bit of a community built around lepht's blog - that links to a post about poetry that uh, I instigated into becoming a discussion on implants. I guess I feel guilty! But it would be good to have a better forum for this.
First I will attempt to set up basic wiki functionality - with little metawiki content, because as a group, at the moment, there is only one project we're working on.
Then, since it sounds very useful, I want to write another page (or whatnot) that functions as a circuit diagram editor. This is actually MUCH easier than it sounds, because of the existence of the joint diagramming library, which I've used before and found to be stable, easy to use, easy to write plugins for and generally shiny.
Then I want to write another page (or whatnot) so that we could have a competition to create a nice style sheet for the wiki. If you're reading this, you can probably tell I'm not a CSS expert!
That would probably do it, as long as everyone is happy.
I'm hoping it might get more developer support and users than my other projects - all written in Haskell - because it's written in a more popular programming language - ruby.
Also, since carps is winding down, I'm taking on another project - a technically minded body modifcation wiki: for discussing electronic implants and such. I'm thinking about trying out CLiki, because it looks cool and I've been wanting to learn lisp.
The reason that we need such a thing is because a bit of a community built around lepht's blog - that links to a post about poetry that uh, I instigated into becoming a discussion on implants. I guess I feel guilty! But it would be good to have a better forum for this.
First I will attempt to set up basic wiki functionality - with little metawiki content, because as a group, at the moment, there is only one project we're working on.
Then, since it sounds very useful, I want to write another page (or whatnot) that functions as a circuit diagram editor. This is actually MUCH easier than it sounds, because of the existence of the joint diagramming library, which I've used before and found to be stable, easy to use, easy to write plugins for and generally shiny.
Then I want to write another page (or whatnot) so that we could have a competition to create a nice style sheet for the wiki. If you're reading this, you can probably tell I'm not a CSS expert!
That would probably do it, as long as everyone is happy.
29 August 2010
CARPS repository
Hi, just putting out a shout about carps: it has a repository now.
Another couple of hacking sessions and it'll be ready for mod writing.
Also, I realized the underlying protocol would be useful for writing other systems which communicate over email. Strategy games come to mind.
Another couple of hacking sessions and it'll be ready for mod writing.
Also, I realized the underlying protocol would be useful for writing other systems which communicate over email. Strategy games come to mind.
23 August 2010
mud
From writing my little projects I've learned one thing:
I cannot do very much.
It's a bit sad really, but it's true. However this knowledge now empowers me!
Ironically, I'm applying the lesson by taking on another project. However, I have structured it around having other people write all the code :)
It is: an rpg engine, for dungeon master and players, which uses email as a protocol. Hence to play, you only need an email address, and no one needs to own a server.
Game rules and interfaces will be implemented as mods. Hence, initially, I only need to write the lower level software.
I will post the repository soon!
I cannot do very much.
It's a bit sad really, but it's true. However this knowledge now empowers me!
Ironically, I'm applying the lesson by taking on another project. However, I have structured it around having other people write all the code :)
It is: an rpg engine, for dungeon master and players, which uses email as a protocol. Hence to play, you only need an email address, and no one needs to own a server.
Game rules and interfaces will be implemented as mods. Hence, initially, I only need to write the lower level software.
I will post the repository soon!
Subscribe to:
Posts (Atom)