Bandwidth monitor script

As a continuation on my last post about the bandwidth usage on this server, I wanted to share with you something I had a hard time to find. To monitor my actual bandwidth usage on the server I searched for a long time without finding a simple enough application that could do what I wanted. So I did what every true code nerd does. I (probably) reinvented the wheel!

The script needs to be run periodically. I run it from as a cron job every five minutes and pipe stdout and stderr to a log file. The script outputs usage by the hour, day, week, month and year. It also shows some preliminary numbers.

Link to script on pastebin

Posted in Coding, English | Tagged , , , | Leave a comment

New host

This blog was until recently hosted on a Atom-based server standing in a closet in our apartment. We had 100 Mbit/s fiber connection with an ISP that allowed me to have my own server at home. But a month ago we decided to move to a house. The possibilities of Internet connections were not many, the choices were DSL or mobile. We actually went for the untested technology LTE for our home connection.

Needless to say, my server needed another home. So I decided to get a virtual server in The Cloud. After a lot of investigations I went for the Swedish Iaas City Cloud. I actually haven’t regretted it once since then. I got my server up and running in just a few minutes with OS (Ubuntu server) installed. The Internet connection is fast and even the smallest instance greatly outperforms the Atom server at the quite reasonable price 130:-/month (around $20).

What caught my eyes and is quite strange about their service is the pricing for bandwidth. I all instances 1000 GB/month is included, which is a quite generous amount. After those 1000 GB you have to pay 0.3:-/GB ($0.045). This means that if you use 1000 GB during one month the cost of the server is 130:-/~$20. If you use 2000 GB during one month the cost goes up to 430:-/~$66, which is more than three times as much. This, of course, makes the server extremely sensitive to the Slashdot effect.

My remedy for this was the following. Spending 1000 GB every month means that you will be spending {1000 * 10^{9} * 8}/{31 * 24 * 60 * 60} approx 3 Mbit per second. So what I wanted to do was to limit the bandwidth usage of my Apache web server to 1 Mbit per second (to stay on the safe side). So I installed the Debian package libapache2-mod-bw. This is a bandwidth limiting module for Apache. In the file /etc/apache2/conf.d/bw I entered the following lines:

BandWidthModule On
ForceBandWidthModule On
BandWidth all 125000

This means that the bandwidth limiting was enabled for all virtual hosts, and limits the bandwidth to 125 kB (1 Mbit) per second. Server latencies for single requests are still as low as they were before and fetching smaller files still is fast enough. In fact, for just surfing this site, I haven’t noticed any difference. However, I am protected from the much feared Slashdot effect.

Posted in English | Tagged , , , , , | Leave a comment

Semester

Solen skiner, imorgon är det midsommarafton och sedan bär det av på en veckas fjällvandring. Dagar som denna önskar man nästan att man hade ett niotillfemjobb. Då hade man sagt “So long, suckers!” till sina kollegor och försvunnit. Istället klämmer man ur sig något om att man nog kommer ta lite extra lång tid på sig att svara på mailen ett tag framöver. Det är väl priset man får betala för att man har en intressant anställning full av friheter antar jag.

Posted in Funderat | Leave a comment

Software synthesizer app, Synth2 Beta

So, I finally decided I’d release my old software synthesizer app for Android. Since it isn’t finished yet I decided to call it “Synth2 Beta”. You can download it here!

You simply touch the screen of you device to play tones. To the left are the lower tones and to the right the higher tones. Vertically you can choose to have gain, balance or nothing.

Some of the features so far:

  • Several waveforms to choose from.
  • Option to add overtones.
  • Configurable which, and how many, octaves to show on screen.
  • Snap to tones. Enable to always hit whole tones, disable to sweep between them.
  • Configurable sample rate. High values for crisp tones, lower for that retro feeling.

Screenshots:

Posted in Coding | Leave a comment

Guld och Malm

Guldpriset har nu (i vanlig ordning) slagit prisrekord. Ett gram guld kostade (enligt förra veckans Ny Teknik) i augusti 363:-. Med en världsproduktion på 2 500 ton är värdet på den totala mängden producerat guld cirka 655 000 000 000:-.

År 2012 ska Boliden öppna sin nya gruva Kankberg. Där har malmen en medelhalt på cirka 4.1 g guld/ton malm. Detta innebär att guldet i ett ton guldmalm är värt cirka 1 500:-. Detta ger åtminstone mig en känsla av hur extremt effektiv utvinningen måste vara. Femton hundra spänn för ett ton malm?

Posted in Funderat, Observerat | Tagged , , , , | Leave a comment

Site name generator

Do you want to start a site, but don’t know what domain to get? This is the site name generator! It generates random domain names using popular buzz words. Give it a shot! Continue reading

Posted in Coding, Fun | Tagged , , , | Leave a comment

Garbage Collecting Threads

During the work on my master thesis, I found myself sitting and running Java simulations on a implementation of a database model. The implementation had one worker thread (anonymous enclosed class extending java.lang.Thread) running in the background and made callers to the model wait for different times depending on load and such. What I then realised after running a long simulation involving several instances of the model implementation was that they all stay in memory.

The program I wrote made hundreds of calls to a method which started by instantiating the model implementation. When that experiment was done, it released the reference to the model object by simply returning. This meant the worker thread would still be running in the background.

One of the nice features in Java is that objects without any references to them are cleaned away by the Java Garbage Collector (GC). The GC starts from all running threads and sees which objects it can reach. Non-reachable objects are safe to clean away.

But since my worker thread was running in the background, the GC could not clean away my old instances of the model implementation. Also, making the worker thread a daemon thread was one thought, but that doesn’t affect the GC, only the ending of a Java program.

The solution I found was in the package java.lang.ref. The WeakReference class holds a reference to an object. But the weak reference doesn’t stop the GC from cleaning the object away. In other words, if an object can only be reached through a chain of references were at least one is weak, then the object is weakly reachable, and clean away that object. Atomically, at the same time, all weak references to that object will be set to null.

So, it was only a matter of extracting the worker thread from the model implementation, making it a normal class, giving it a weak reference to the model implementation and checking whether the reference is null before using it. Also, it is important to remove all references to the model implementation as soon as you are done with them, because hard references prevent the object from being cleaned away.

Some Java code… Both classes can be en the same file, Database.java.

public class Database {
    void updateStatesAndStuff() {
        // ...
    }
}
 
private class WorkerThread extends Thread {
    WeakReference<Database> dbRef = ...;
 
    public void run() {
        while (true) {
            Database db = dbRef.get();
 
            if (db == null)
                // Object has been cleaned away! Stop thread
                return;
 
            db.updateStatesAndStuff();
 
            // Remove hard reference, allowing it to be cleaned away
            db = null;
 
            // Sleep until it's time to update again
            timingAndSleep();
        }
    }
}
Posted in Coding | Tagged , , , , | Leave a comment

OS vs. MS

Efter att ha suttit ett antal timmar med att försöka få Windows 7 att få tillgång till mina utdelade filer på Ubuntu-burken körandes Samba gav jag upp. Men nu kom jag på att jag även hade sshd igång. Så jag laddar ner WinSCP och kopplar upp mig. Allt fungerade direkt, efter cirka 30 sekunders jobb.

Posted in Teknik | 2 Comments

Bdb upload script

Jag har länge tänkt att jag på något sätt skulle vilja dela med mig av min vardag till folk jag känner genom foton. Jag höll på med bilddagboken ett tag, men det blev så tråkigt att ladda upp bilder där med deras formulär. Men nu har jag äntligen fått tummen ur och löst problemet för mig själv, åtminstone tillfälligt.

Jag har nämligen, med hjälp av en del exempel och en bristfällig API-dokumentation slängt ihop ett script för att ladda upp bilder på Bilddagboken. Det är skrivet i PHP och använder sig av curl (både programmet curl och libcurl i PHP, funderar på att ändra till bara libcurl), notify-send och zenity. Jag kör det i Ubuntu Karmic 64 bit, men det funkar alldeles säkerligen under andra operativsystem också, kanske med lite pill. Jag tänkte hur som helst dela med mig av scriptet i fråga. Jag personligen har lagt scriptet i ~/.gnome2/nautilus-scripts/ för att kunna högerklicka på bilder och ladda upp dem direkt från Nautilus, men det går ju att göra på andra sätt.

Scriptet läser även ut datumet som namnet på katalogen bilden ligger i, i formatet ÅÅÅÅ-MM-DD eller ÅÅÅÅ_MM_DD. Det går givetvis lätt att fixa på något annat vis om så önskas (exempelvis från EXIF-taggarna).

För att använda Bdbs API krävs en API-key och ditt userid. Kommentarer i koden beskriver hur man skaffar apikey och tar reda på userid.

Och här är koden (hos pastebin).

Update: Jag har jobbat vidare en del på koden. Här är en senare variant.

Posted in Programmering | Tagged , , , , , , , , , , , | 3 Comments

Det Sista Programmet™

Inte helt sällan inom mitt område av studier är det problem man ska lösa. Dessutom problem kan ofta delas in i grupper av problem där de olika problemen har olika metoder för hur de ska lösas. Ibland kan en grupp problem ha som lösning att man omformulerar problemet och joxar runt det lite grand så att det ser ut som en annan grupp av problem som går att lösa mer direkt.

För någon vecka kom jag att tänka på det här med mjukvara. Hur många olika mjukvaror har det utvecklats under historien? Även om vi inte räknar uppdateringar och mindre utökningar som nya program så skulle jag tro att kvoten (antal utvecklade program) / (antal olika, av dess program, lösta problem) är ganska hög. Alltså att det finns väldigt många program/system som löser exakt samma grundläggande problem. Om man bara kunde identifiera dessa distinkta problem-typer borde man väl i teorin kunna skriva Det Sista Programmet™. Alltså skriva det sista programmet som någonsin behövde skrivas. Programmet som kan lösa alla tänkbara problem som någonsin skulle kunna tänkas behöva lösas av en dator. Man kanske skulle få jobba med att anpassa användargränssnitt och annan kosmetik efter rådande normer och mode. Men i övrigt skulle världens problemlösning vara tryggad.

Nackdelen med den här tanken skulle jag väl kunna tänka mig är att mängden problem som kan behöva lösas är så astronomiskt stort att det… Jag behöver nog inte skriva mer nu.

Posted in Funderat, Programmering | Tagged , , , | Leave a comment