? Editing: Post:21.body Save Delete Cancel
Content changed Sign & Publish new content

Deavmi's Blog

A blog about programming, food, documentation (specification) writing and more!

All content is licensed under the Creative Commons Attribution-ShareAlike 4.0 International.

Latest comments:

Better description on the "What exactly is the FreedomCrate?"

on Oct 02, 2015 ·

I have a new post up on "What exactly is the FreedomCrate?" on the FreedomCrate Blog.

Read more

mkIndex v1.0 released!

on Oct 01, 2015

mkIndex is now available for your CGI server here.

Read more

mkIndex - Directory index generator

on Oct 01, 2015

I am currently working on a little HTML directory indexer which will be run as a CGI script which will then index the current directory and generate a HTML file containing links to those files. I am coding it all today and will be getting it up on Notabug.org soon later today.

Read more

libhash - hashing made easy

on Sep 30, 2015

Since I have started developing some wrapper libraries in Python and my curiosity in cryptography has grew if have since decided to contribute to the sustainability of the programmers and cryptographers community by developing easy to use cryptographic hash function wrapper libraries in Python. I started with libmd5sum (which will be released soon) and now have decided to make a series of these libraries and soon combine them all into one big wrapper library called libhash.

Read more

I shan't write my own crypto! But I still will try.

on Sep 30, 2015

I am not a cryptographer and have no experience with crypto, hence I shan't write any crypto. I will write related programs though and will write this project Encryption protocol with character map and this one Blueberry encryption protocol (for educational purposes).

Do not use any crypto protocol I have proposed, unless you can analyse it to make sure it is secure. ~Hopefully you are a cryptographer.

Read more

Silex web browser syntax

on Sep 30, 2015

I want to do a little overview of the syntax of Silex's. This won't be a long post at all, so let's get started.

To set the title or change the title of the page you use the title{ tag which you put your title in between like so: title{ Hello World }.

Read more

Encryption protocol with character map

on Sep 30, 2015 ·

This is an idea that I had from I think Term 2 that after I watched The Imitation GamEncryption protocol with character mape.

So I came up with an idea of a character map that could be used for symmetrical encryption (because asymmetric is just too hard to comprehend). I think describing it with text right now is too hard.

The situation

Bob wants to send a text file over the Internet (insecure channel) to Alice, but there is a bad guy in between, he is Zuma and he can see our message if we do not encrypt it with a key that he does not know.

Bob's text file is like so:

Hi Alice. What is your phone number?

What Bob now does is he creates a character map that will map each character being used in the text file to a secret pass-phrase.

"My character map looks like so," said Bob.

Bob creates his crib or character map and saves it as map.txt.

A=R&^GB^^&TT&^^T&T^&^T&YT IV&VVB^T&

"Hey Alice (wasup babe). I'm going to send you my crib file (character map)," said Bob.

"Bob, that is preposterous. Do you even Public Key Crypto Bro?"

Now Bob will send the crib to Alice using public-key cryptography. Once completed he will then encrypt his message using the encryption program that can replace each occurrence of the the character (say now H) with its value (nt4ej4vhynyttiueryguithrjkrhbjhgjfdfb). It then takes the encrypted values and separates them by commas (,). By the way commas are not allowed in the map, shame. When Alice gets the encrypted file she will reverse the process by using the same crib file (character map) to decrypt the file into Hi Alice. What is your phone number?.

"You ain't getting my number," said Alice.

Update, don't use me (unless you always use Caeser ciphers)

Read more

Database protocol proposal

on Sep 29, 2015

I have recently been thinking of creating my own database scheme of which I would implement in Python. I wanted it to be very simple but have some little features of which empower the user of the database and give it a feeling of databases-within-databases (not how you would imagine (that would be hard)). Below is the layout for the database I want to create, everything is separated by one SPACE like so:

name local Tristan B. Kildaire
age external myOtherDB.db
gender remote https://lolsec.com/passwords.db
  1. The first item in the SPACE separated values database is the key. This is like a variable and is sued to reference a value stored in the database.
  2. The second item is the location of the value, is it in the current database (local), in a separate database (external) or is it on a remote machine's database (remote).

When you request a value from the database you request it by giving the database the key containing the value you want to get. Once you have given the database program the key you want a value retrieved from, the database will scan through the database file specified and look for that key. Once a match is found the value bound to the key is returned and Bob's your uncle.

This database scheme will be manageable via a REPL or the command-line or via a Python wrapper which uses the command-line.

I will post updates on this soon. I am also thinking of making a simple database in Bash also, but not like this database scheme but rather way more simpler.

Read more

libmd5sum coming soon!

on Sep 29, 2015 ·

I said to myself that I had to make a hash digest library for Python of which was not the included one of the standard library of which I do not understand the syntax and the use of the b in front of the content of which needs to be hashed. So I then created libmd5sum which can create an md5 message digest from either a file or from a string of text. It will be up very soon on Notabug. It will include usage help too.

Read more

My own Lisp dialect proposal

on Sep 29, 2015

I want to quickly type up a cheat sheet of what I would like my own Lisp dialect to look like. This post won't explain anything of the language's syntax and how things are interpreted but just all of the available syntax.

  1. Defining a variable
     (defvar age int 2)
     (comment "Hello There")
  3. Functions
     (defun addNumbers (x y)
     (return (+ x y))
  4. Subroutine
     (defsub printName (name)
     (print name)
  5. Addition
     (add 1 1)
     (+ 1 1)
  6. Subtraction
     (sub 1 1)
     (- 1 1)
  7. Multiplication
     (mul 1 1)
     (* 1 1)
  8. Division
     (div 1 1)
     (/ 1 1)
  9. Modulus
     (mod 1 1)
     (% 1 1)
  10. while loop
    (while (== 1 1)
    (print "Hello World")
  11. for loop (it's actually a foreach loop)
    (for [1,2,3,4] 2
    (print "Hello World")
  12. if statement
    (if (and (== 1 1) (== 2 2))
    (print "It's true that 1 equals 1 and 2 equals 2.")
  13. assigning values
    (defvar name "Tristan")
    (setval name "Bobby")
  14. undeclaring a variable
    (defvar name "Tristan")
    (undefvar name)
  15. undeclaring variable
    (defsub addNumbers (x, y)
    (+ x y))
    (undefsub addNumbers)
  16. undeclaring a function
    (defun addNumbers (x, y)
    (return (+ x y))
    (undefun addNumbers)
  17. split string into array
    (split "hello world" "")
  18. md5 hash of string
    (md5 "Hello World")

As you can see I am trying to keep the language as polish notational as possible and keeping it true to the Lisp motto.

Read more

Blueberry encryption protocol (is this good?)

on Sep 29, 2015

Following up on a long thread on Quitter about hashing and how there can be times where a hash of a completely different message results in the same message digest as another seed.

Hello World - encrypt with hash (hash is 77Y)

Bye World - encrypt with hash (hash is 77Y)

Person could do dictionary attack and get 'Bye World' as the dictionary value and then hash it and get a message digest and then un-encrypt the text file containing Hello World.

This is due to the possibility of collisions in hash functions.

Hence I have come up with a simpler approach to a password generator for encryption. Let me give you the breakdown below.

You have a text file containing the text below:

Hello World

Step 1

You split the contents of the file into an array containing each character in the string Hello World, you array would be array = ["H","e","l","l","o"," ","W","o","r","l","d"] and a length of 11 characters.

Step 2

You get the Unicode value for each character in the array and concatenate this into a string called x.

Step 3

You convert x to a hexadecimal for beauty sakes and because umbers can be easy to guess, but when you add letters to the situation the brute force attack will take longer. This new password in the hexadecimal number format is a as a variable.


Now you encrypt your file using your favourite encryption software using the password a.

Update, don't use me (unless you always use Caeser ciphers)

Read more

Bash Page Hit Counter for CGI

on Sep 29, 2015

I have release a small little suite of tools that allow you to have a little hit counter for your website's page by running the Bash script on every page load via an iframe tag which will have the src attribute set to the CGI script (bash script).

Here is the source code: https://notabug.org/deavmi/phc4CGI

Read more

BashDNS - The origins

on Sep 29, 2015

I still have to update this later on in a new revised version of this idea, but for now this is what I wrote.

I have a really badass idea for a DNS system of which will work just with files and yeah.

You will have a directory containing IP addresses and one containing domain names.

When you do a look up for an IP address to find the domain names that point to it, you will open each domain name file in the domain names directory and check if that IP is in the domain name file.

When you do a look up for domain names it will scan the IP address directory and open and read each IP address file to see which IP addresses and linked with certain domain names.

When creating a domain name you create a file in the domain names directory named as the domain name, you then add an IP address to it. This IP address will be written to the domain name file and also a new IP address file in the IP addresses folder will be created named by the IP address you chose and the contents of this file will be the domain name you created.

When updating the IP address of a domain you will change the IP address by creating a new IP address and then writing it to the domain name file and then you will delete the old IP address file in the IP addresses folder and create a new one containing the domain name as the file contents.

When updating the domain name you will create a new domain name file and take the IP address from the old domain name file and place it into the new domain name file. You will also update the IP address file in the IP addresses folder to point to the new domain.

There are two terminal modes, the command-line arguments mode and the interactive mode.

The interactive mode acts like a REPL and the command-line argument modes lets you issue commands to the BashDNS database.
Such as adding a domain name to the registrar. This can be done in both the command-line argument mode and the interactive (REPL) mode.

Read more

A (terrible) new Encryption Protocol - Scrapped idea

on Sep 29, 2015 ·

I have come up with a brilliant way (probably already thought of) system for securely encrypting files. There are three methods that I have come up with which I will list below:

  1. The contents of the file are the password method
  2. The contents of the file are the password method (with more maths involved)
  3. A uniform password (contents hashing (digest as password))
  4. The best way

I am now going to explain exactly what I mean by each of these three methods mentioned above so that you can fully understand the all.

The contents of the file are the password method

"The contents of the file are the password method" involves taking the contents of a file and using that as the password, this creates what I call the recursion effect as to know the password you need to know the contents of the file.

Below is an example:

Here is the un-encrypted file named contents.txt:

Hello World

And the password used to encrypt this file will be Hello World.


  • I would say that this is the most secure method.


  • Encrypting something big like an essay would mean remembering or writing on paper the whole essay as it is now your password to unencrypted your essay.

The contents of the file are the password method (with more maths involved)

"The contents of the file are the password method (with more maths involved)" involves using a mathematical formula/algorithm to generate long numbers of which grow proportionally in size while the file that needs to be encrypted grows in size. Wait, isn't this like an MD5 hash or something. The answer is no. Crptographic hashes have a forumula of whcih maintains size in a range, just look below and you will see how the MD5 hash digest of hello and helloo are the same in length of characters.

helloo: b373870b9139bbade83396a49b1afc9a
hello: 5d41402abc4b2a76b9719d911017c592

Anyway, our system will do something like this:

Generating a password for encrypting the file:

File name: hello1.txt

Hello World

Would generate a password of say now length of length/2 which is 11/2. (Our encryption formula is this length of string/2)

Now the next file below would generate something different (by the way there is an extra space character of the word World which you cannot see):

File name hello2.txt

Hello World

Would generate a password of say now length of length/2 which is 12/2.


  • Very similar to the first method but the passwords are more memorable.


  • Not as secure as the first method
  • Passwords are not uniform like hash digest, the length varies on the size of the file being encrypted.

A uniform password (contents hashing (digest as password))

"A uniform password (contents hashing (digest as password))" involves creating a cryptographic hash digest of the contents of the file being encrypted and then use the generated hash digest as the password to encrypt the file.

So let's encrypt the below file named hello.txt:

File name: hello.txt

Hello World

Now what we would do is create a MD5 hash digest of Hello World, which is b10a8db164e0754105b7a99be72e3fe5 by the way, and then encrypt the file hello.txt using that hash digest.

The best way

"The best way" involves a more intricate design with a better formula (I personally think).

Let me give you a break down of how it would work. I will make a future post on this protocol of which I am dubbing "Blueberry" but for now here it is.

Say now you have a file named pizza.txt and it has the contents below:

File name: pizza.txt

Hello World

What we do to generate a password for this file to be used in encrypting the file goes as follows.

Section 1 - Splitting the contents in half

  1. Step 1: We split the contents into halves. Make x the length of the file contents as characters and y1 the first half of these contents and y2 the second half of these contents.
  2. Step 2: x = 11
  3. Step 3: y1 = 5
  4. Step 4: y2 = 6
  5. Step 5: Our array of characters is now contents = ["Hello", " World"]

Section 2 - Getting the two hash digests of y1 and y2

  1. Step 1: We now do an md5 hash of both y1 and y2.
  2. Step 2: md5(y1) = 8b1a9953c4611296a827abf8c47804d7`
  3. Step 3: md5(y2) = 540e2430990447ba7e9c43578b30955b`

Section 3 - Some variable assignment

  1. Step 1: We make a variable named a and assign it the value returned from the md5 function of which is compostioned within the value returned from the dec function; like so dec(md5(y1)) (This converts the hex value returned from the md5 function into the decimal number system).
  2. Step 2: We make a variable named b and assign it the value returned from the md5 function of which is compositioned within the value returned from the dec function; like so dec(md5(y2)) (This converts the hex value returned from the md5 function into the decimal number system).

Section 4 - Let's compose this altogether now

  1. Step 1: We create a variable named div and set its value to a/b.
  2. Step 2: We now concatenate the values a, div and b together into a variable we call p.


Now you can encrypt your file using the password of p!

Update, don't use me (unless you always use Caeser ciphers)

Read more

Version Control System of my own.

on Sep 29, 2015

I want to create my own Version Control System because why not, it means handling big amounts of data which is something I enjoy a lot. Before we start I want to give a brief overview of what it will use as the transport protocol. It will use the SFTP protocol for transferring files back and forth, the server side will run a SFTP server and the client will run a SFTP client. Using the SFTP protocol we have a transport protocol now of which we can use for the client to send files over to the client and vice-versa.

Our VCS stack

In our VCS stack we will probably be using the lsh SSH server/client bundle which includes a server program named lsh-server and a client program named lsh-client.

How it all works

Creating a repository

You create a repository by running leny init [repo name], once this has run you will have a new repository created in the form of a directory named whatever you typed after the init command-line argument.

Inside the repository directory you will find a sub-directory named .leny. This is where all the data such as the directory that holds the commits will be and also the .ignore file will be which tells Leny which files to not track.

Creating your first commit

First let's create a file to add to this commit. Do so by running touch myFile.txt.

Now add this file to the tracking list so that it will be added to the commit we are making now and all future commits. (the file tracking list is in the .leny/ directory and is a plain text file named tracking). You can add a file to the tracked files list by typing in leny track [filename].

Now let's create our first commit, do this by typing in leny commit [commit message]. This will archive all the contents of the working directory of which are tracked and are not in the ignored files list and then do an md5 hash of the archive once the archive has been created and then rename the archive to that message digest generated by the md5 function.
This archive is located in the .leny/commits/ directory.

After that has happened we then append to the commits.list file the message digest retrieved from the md5 hash function of which the seed for the function was the data of the archive that was created.
Everything appended to the commits.list file is obviously in chronological order.

Read more

E-Mail on ZeroNet...

on Sep 28, 2015

There are two approaaches to this.

Read more

Mark Programming Language proposal

on Sep 28, 2015 ·

I have been thinking of a syntax for a language that is modern but simple like the C programming language. I wanted something taht has block styling lile Visual Basic, Basic, Ruby and Fortran because if you think about it, it is very attractive and makes your source code look liek English poetry which is great!

What is this blog post about then?

Well I want to try and specificfy the syntax right here in this blog. I will probably end up specifying the whole language. You know what, let's do that rather.

Mark Programming Language Specification

This is a work-in-progress documentation for the Mark Programming Language.


In this section I will be discussing the syntax for the Mark programming language, all of it. I will explain everything in-depth so that you can basically learn the language right here.

So let's get started already!

Structure of a Mark program

The main code block of every program is the program code block. The program code block looks like so:

program HelloWorld

end program
  1. The program code block starts with the identifier program then a SPACE and then the name of the program with no spaces in between.

  2. All the code that your Mark program will be running will be within the program [programName] and end program identifiers.

  3. The identifiers program and end program must be written as is; all lower-case.

Extra-information: This code block styling is reminiscent of that of Fortran's. We copied the Fortran main program code blocking style.

Creating your first Mark program

In this topic we will be creating our first Mark program that does a simple thing; prints out Hello World to the screen.

Start off with your basic program structure using the pragmas program and end program that will enclose our code:

program HelloWorld

end program
  1. We are going to call our program HelloWorld.

Now let's add the code that will print the text Hello World to the screen.

program HelloWorld

    print("Hello World");

end program

Now save this program as myProgram.mark.

  1. We are using the built-in (a function or subroutine that is built into the language itself) print which will print whatever is between the parenthesis to the screen (standard output).
  2. Between the brackets is "Hello World", anything enclosed between two double quotes are known as strings. Strings are a data type in Mark (think like data types in maths, integer, decimal, complex etc.).
  3. The first value, a string ("Hello World"), is the first argument of the print built-in subroutine accepts. It must be of type string.
  4. We end off the line with a semi-colon. In case you didn't know what that was, it's the ; symbol on your keyboard.

Now we compile the above program in the terminal using ./mark -c myProgram.mark and then run our program by typing in ./a.out. a.out is the default name for the compiled executable. You can change this by using the -cn command-line argument for the mark executable; running ./mark -cn myProgram.mark swagMonster would compile myProgram.mark to an executable named swagMonster and can be run using ./swagMonster.

If you ever need to find a certain command-line argument for the mark compiler and a description of the command-line argument then just type in ./mark --help.

Read more

Raspberry Pi running WordPress via LAMP stack

on Sep 28, 2015

A great tutorial on how to set-up a LAMP stack (Linux, Apache web server, MySQL and PHP) can be found on the RaspberryPi site here.

I am going to be using this tutorial for setting up the one RaspberryPi in the Freedom Box that I am creating.

Read more

RaspberryPi Professional Setup Script

on Sep 28, 2015

The RaspberryPi's Official distribution of GNU/Linux is Raspbian which comes with many pre-installed programs one might not need if you are say now a developer for example, then minecraft-pi won't be needed (unless you enjoy a good game of one of the best games ever). ANother example is if you are using the Raspberry Pi as a dedicated server for some application you do not need to have packages installed that you will not need, like scratch.

The question: SO Deavmi, tell us then how you can fix this.
The Answer: Simply do some copy-pasta of this below script in your terminal and it will actually do more than what I said above. Yes, it will remove the unneeded packages but will do several other things to your GNU/Linux system which are listed below the script.

One-line version (great for people that have a graphical environment and can copy and paste into the terminal. Great for Putty sessions.)

sudo apt-get -y remove minecraft-pi wolfram-engine sonic-pi scratch && sudo apt-get clean && sudo apt-get update && sudo apt-get -y upgrade && sudo apt-get -y dist-upgrade && sudo apt-get autoclean && sudo apt-get -y autoremove

Separated line version:

sudo apt-get -y remove minecraft-pi wolfram-engine sonic-pi scratch
sudo apt-get clean
sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get -y dist-upgrade
sudo apt-get autoclean
sudo apt-get -y autoremove

What this script will do (also) is as follows:

  1. Clean the pre-installed packages lists (delete them)
  2. Re-download the current packages lists
  3. Do a system upgrade (apt-get upgrade)
  4. Do a full upgrade (apt-get dist-upgrade)
  5. Remove all downloaded .deb files downloaded during (installs and upgrades)
  6. Remove all other dependencies that the removed packages (e.g. wolfram-engine) relied on. (Also packages no longer needed due to new packages being installed via upgrading the packages)

All of these seven commands in total:

Give you a fresh-ish (we could of used --purge) system of which you can now use for whatever you want without any programs that you do not need being installed.

Read more

The Freedom Box - Offline, anonymous file sharing.

on Sep 28, 2015

Project ID: D43

During the school holidays I embarked on a project to create a crate of an assortment of pieces of technology to facilitate offline file-sharing and such. It creates an open WiFi hotspot of which people can connect to using their laptops, phones or whatever WiFi-enabled device they have with them in the vicinity of the access point. Once connected to the access point they can try to visit a site like duckduckgo.com but will then be redirected to the Raspberry Pi router running the awesome PirateBox software which contains a homepage that has a chat box, a file uploader/browser and also forum software.

Let's review what the first Raspberry Pi does:

  1. It is the centralised router for the Freedom Box's network.
  2. It has a landing page for...
    • Uploading files
    • Viewing uploaded files
    • Anonymous chat
    • Forum

The second RaspberryPi has a pretty simple job, it runs the MotionPie camera surveillance software which in this case I use to get snapshot images from the web cam and stream them onto the PirateBox's landing page. This RaspberryPi will also run an IRC server hopefully.

And lastly, the third Raspberry Pi. This one runs the Buddypress social networking software, so that people can create social accounts to send each other messages and post content.

No one can sensor the Freedom Box, besides the owner, but the point is that many Freedom Boxes can be built to create a physical distributed network of information.

You can really help by donating money via the below methods:

  1. Bitcoin: 1F8QPFbG3eMhPRAHVPFyNtbdgGgRfjX5AJ
  2. Dogecoin: D99AJvnx9w3ic3rrThXbSJ8pHcYLEtQPS1

Thanks by the way!

This money will go to Deavmi and he will see where it will go, for this project or not.

Read more

Spiral - A small micro-blogging-like social network for Zeronet (WIP)

on Sep 25, 2015 ·

Project ID: DQ10

I have come up with a little idea to also, as part of my many ZeroNet project ideas, create a little micro-blogging like social network that runs on the ZeroNet and is text-based and runs in your terminal.

How will it work?

This is a very simple application and it works, very simply.

Setup of client/server

What you will need:

  1. A new empty ZeroNet site (we will probably make this automatic but you will have to get the address of the site created.)

When you start Spiral, it will open ask you for the address to the site you just created in ZeroNet and then save that to the home_addr.conf file located in ~/.spiral/home_addr.conf.

Once this is completed Spiral will then ask you to follow friends. The ID of a friend is his/her ZeroNet address and also a friendly name that will be bound to that ID (so that you do not have to attempt to remember a long string of gibberish), once you have completed entering these ID's they will then be saved to the file ~/.spiral/friends.list and will look like so:

ID friendly_name

Note: You may only bind the unique friendly name to one ID. No duplicate friendly names may exist.

Following a user

To follow a user you type into the Spiral REPL follow [ZeroNet site address], what happens next is as follows.

Quick Note If you follow someone in Spiral then you will get their posts in your feed. They can then mention you and you will be able to pick up the mention. But for you to mention them and to have them successfully see your mention, they must follow you.

  1. We make a request to get our own copy of their ZeroNet site by doing an HTTP connection to[ZeroNet site address]. This will trigger our ZeroNet client to try and get a copy of that site mirrored onto our ZeroNet client, we will continuously make requests with a ten second interval to that site until a directory named [ZeroNet site address] exists in your ZeroNet data/ directory.

Un-following a user

To unfollow a user you type into the Spiral REPL unfollow [friendly name (if one exists) OR ZeroNet site address], what happens next is as follows.

  1. Sprial will recursively delete the whole directory in your ZeroNet's data/ directory named [ZeroNet site address].
  2. Sprial will then update the friends.list file located in the ~/.sprial/ directory to remove the friend being un-followed (namely the ZeroNet site address and the friendly name).

Creating a post - Work in progress

To create a post type into the Spiral REPL post [your post data], what happens next is as follow.

  1. Spiral will create a new post by appending to the posts file named feed.posts which is located in the [ZeroNet folder]/data/[your ID]/.spiral/posts/ directory.
Read more

Silex - A web browser that runs on the ZeroNet stack

on Sep 25, 2015 ·

Project ID: DQ431

In a nutshell what is Silex?

I came up with an awesome idea to create a text-based web browser that uses its own basic specification for web pages unlike that of our current browsers that use the HTML specification. Our specification is the Silex specification. Silex is a basic text-based web browser that I will write in Python (because Python is so easy.).

More in depth, please....

Silex has its own specification as we previously said, the .silex files are our HTML equivalent which contain a tag for the title of the page (title: and :end title), the body of the page (body: and :end body), the authors of the page (authors: and :end authors), the description of the page (description: and :end description) and lastly the license of the page if any (license: and :end license).
We currently only have 5 tags, but for what Silex does that should be enough. This is because it is not meant to be a very visually appealing browser as it is only a text-based browser.

What do the web pages look like?

A site with the following source code in its .silex web page file:

title{Hello World}
license{GNU GPL v3.0 or above}
Welcome to my Silex site. This site runs on the ZeroNet.

Hope you enjoy it.

Would look like so in your terminal while viewing it with Silex:

++++ Hello World - Silex ++++
Author(s): Deavmi
License(s): GNU GPL v3.0 or above
Welcome to my Silex site. This site runs on the ZeroNet.

Hope you enjoy it.

The Core

I now want to explain how the actual program works; the Silex web browser.

Pages are retrieved from the ZeroNet from ZeroNet sites which we call in the Silex ecosystem, brokers. Think of brokers as big servers that hold many sites (.silex files).

When you request a Silex site/page in the Silex web-browser you just type in the address of the site (which is a cryptographic has of the contents of the .silex file combined with a cryptographic hash of the ZeroNet sites hosting it and then these two hash concatenated together and hashed as a concatenated string; all of this leads up to the site/page address which you type into your browser.) This cryptographic hash of say now a site named hello.silex containing the value Hello World will be hashed to create a digest of x, then we will get the public-key of the ZeroNet site (broker) that the hello.silex file is hosted on and get a hash digest of y, the we concatenate the digest x and y together to get xy, we then hash xy to get a hash digest of xy. Now we add this to the book.

What's the book?

The book is a file book.list located in ~/.silex/book.list which holds a copy of the digest of xy we created previously and right next to that, the file name of the site hello.silex. It would look like so:

xx567TFffry45fdgtyr333HHfggd hello.silex

When you request the site xx567T&Fffry45fdgtyr333HHfggd, Silex will go scan all ZeroNet sites (brokers) for the file hello.silex and will have each occurrence of the file hello.silex and see if the whole hashing process we did earlier matches the hash digest xx567T&Fffry45fdgtyr333HHfggd, if so the site will then be served to you.

How did the book get populated

Upon each start up of Silex web browser, the Silex daemon will run and write to a file named status, if the value (contents) of the file status equal ready then Silex web browser will stop waiting and will allow you to type in a URL to visit.

So the Silex daemon does all the hashing and upon each start it overwrites the contents of the book.list file adding the name of the file, in this case hello.silex and a hash digest of the file, in this case xy.

How does it know which ZeroNet sites to use?

Goo question, or else we would scan all of the directories (making the daemon's process even longer and slower (yes, a downside to the Silex system)) in your data/ directory in your ZeroNet program data.

What we have to fix this is a file named brokers.list which contains all the public-keys (addresses) of the ZeroNet sites which are to be used as brokers. Any site (public-key) not in here will be skipped upon the daemon doing it's hash 'n scan process.

So what does this mean in the end?

It means that you can browse sites that need not have images or any dynamic content extremely fast because of the torrenting system and the fact that it is text-only (small file size) and that the parsing done is minimal due to the minimal syntax of the Silex specification or what I should actually be calling the SML which stands for the Silex Mark-up Language.

Read more

libtype coming out soon!

on Sep 23, 2015

Do you need an easy way to figure out if a certain value is of a certain type in Python and also if a certain value (object) is of a matching type to another type. Well then you're in luck libtype is here to save you.

Libtype is currently in development and will be available tomorrow afternoon.

Read the forum post on Programming.Net .

Read more

Apps.net forum launched!

on Sep 23, 2015

I have just launched a brand new forum on ZeroNet called Apps.net. It is a "apps" or applications forum as you can tell by the name. I created it as a way for all of the people to share software (not pirating software) on the forum (rather links to the sites, still not pirating).

Link to forum: http://bit.no.com:43110/17YUF4geTD7gBDPeMtQtnV7uhhNcjrYi9u


The site is fully online as of now and has one peer/node of which is mirroring its contents.

Read more

Noob to ZeroNet. (Public private-key)

on Sep 23, 2015

I really started getting into ZeroNet yesterday but I started to realise that using proxies as your own node is a bad thing. Just don't log in there and register the name you want on their machine becaue first of all:

  1. There goes your now public, private-key.
  2. You cannot get the sites you host there and edit them locally without asking the owner of the proxy to send them to you via email or something.

So this is what I suggest.

  1. For editors, run your node locally and then once you have your site's public-key, simple go and visit this address in your browser http://bit.no.com:43110/[site's public-key goes here] and then tell your freinds to read your blog here. Notice: It will take some time to I guess announce the torrent file or whatever accross the network, so be patient, it should take like ten minutes, once it is done, you can edit your blog locally and then viw it whilest you are away from your node by visitng the link http://bit.no.com:43110/[site's public-key goes here].
Read more

Programming.net forum launched!

on Sep 22, 2015

I have just launched a brand new forum on ZeroNet called Programming.net. It is a programming forum as you can tell by the name. I created it as a way for me to be able to learn programming and ask my questions very easily, I felt that if we had something like /r/learnpython on reddit then why not try to replicate all of the programming sub-reddits on reddit into one forum on the ZeroNet.

Link to forum: http://bit.no.com:43110/17YUF4geTD7gBDPeMtQtnV7uhhNcjrYi9u


The site is fully online as of now and has one peer/node of which is mirroring its contents.

Read more

Bash Basics

on Sep 22, 2015

I will be starting a new series soon on Bash called "Bash Basics". I am going to try and cover many aspects of the Bash scripting language that I can by posting them as individual blog posts. I will be posting as much as I can from what I have so far learnt from Bash, as I myself am still learning to script in Bash.

Why Bash?

Bash is a great scripting language, it is damn easy to learn and is not advanced at all but relatively simple.


You can now find the first tutorial (<-- there) and the site here.

Read more

Welcome to Deavmi's blog!

on May 31, 2015

Welcome to my blog. I will be putting some cool stuff up here. Like all the stuff I learn from computer programming and such. Also maybe stuff related to food and such because food is yummy and I love it. I might also post some links to the pictures I have taken that I upload to Wikimedia Commons (for use hopefully in Wikimedia, anywhere else will be great also :D). And lastly all the stuff relating to the documents that I am writing, all of which are specifications.

Who is Deavmi?

var name: string = "Deavmi"
echo("Hello my name is ", name)

But a little more about me quickly. I am Deavmi, I love computer programming, it is an art of which whatever you dream you can (most of the time) make possible, even if you cannot make it possible you can get damn close to making it possible.

What programming languages do I love?

  1. Python
    • Because it is so damn easy and the pure-oop approach makes everything very easy
  2. Julia
    • Functions for so many things is actually very nice but when I wanted to first try out functional programming I started with a pure functional programming language, Haskell, of which was just too hard for me to comprehend. Maybe next time, Haskell.
  3. Nim
    • Because when Python tries to use the pure-oop approach it gets very confusing in some aspects, therefore Nim is here to the rescue to be like C or Perl where everything is not an object, Nim is great because of this exact point.
  4. C
    • Because it's the father of all languages.
    • Is very understandable.
  5. Fortran
    • My grandmother was a Fortran programmer hence I am following the family trait and programming things in Fortran. You would be surprised with what you can actually do in Fortran (at least I was). Fortran actually has a very nice syntax when it comes to the styling code blocks.
  6. Bash
    • Because when everything is a string stuff gets confusing. But really, I love Bash for the ability of being able to actually write some great software (not just scripts) in a language like this. This is probably due to the fact that you have an abundance of command-line tools out there to use in your Bash scripts.
  7. Lisp
    • Using Polish-notation for everything actually can be quite appealing in a uniform syntax approach, although I would need to format my Lisp code very well for it to be readable (if that's even possible in Lisp ;) ).

Where can you find my projects and papers?

I don't have many projects, I used to, but that was back when I was a noob playing around in Visual Studio IDE with Visual Basic (programmers are actually always noob, because we are always learning). Anyway, there is a maintained list of all the stuff that I am currently working on at the Deavmi Archive Network (DAN) which is, as you can see, an archive of all the stuff I am working on. The DAN includes the project's title, description and links to the source code (ain't got no time for compiling).

Read more
Add new post


21 hours ago · 2 min read ·
Read more


21 hours ago · 2 min read


user_name1 day ago
This page is a snapshot of ZeroNet. Start your own ZeroNet for complete experience. Learn More