To nibble on the meat!

Image

Igår träffade jag en gammal vän som jag ser ganska sällan nuförtiden. Han är kock i bakgrunden och jägare. Döm om min förvåning när han hade ett tillkännagivande att göra under tiden vi fikade. ”De ska få barn och det är trillingar” tänkte jag.

”Jag har blivit vegetarian”- sade han. ”Va!”. Jag trodde väl att den sista mannen som skulle bli det var just han. ”Jag kommer att fortsätta att jaga, men köttet kommer jag att ge till andra” fortsatte han. Sedan följde en diskussion där han redogjorde för sina funderingar och hur han hade kommit fram till sitt beslut, ”Du har tagit ett beslut som jag tror att många tänkande människor skulle ta om de bara fick tid att fundera över frågan” svarade jag.

För mig började det för några år sedan av två enkla skäl. Det ena var att jag i många år aldrig reflekterat över vad jag stoppade i min stackars kropp, utan att jag bara sett allt som ren födoenergi. Tänk så många kebab:er med risigt kött av konstigt ursprung det har passerat genom denna kropp. Det andra var att jag ville göra ett experiment med mig själv. (Det är typiskt mig, jag vill alltid utforska alternativen). Frågan var ”Klarar jag att vara utan kött i dagens kött-centriska samhälle?”.

Det var faktiskt ingen större omställning. Hade jag egen matlåda så var det ju inga problem med ett gott alternativ. Åt jag ute var det oftast inte heller ett problem, de flesta ställen erbjuder ett vegetariskt alternativ, eller någon typ av fisk. (Notera: jag är demi-vegetarian – jag äter skaldjur. Jag lämnar den filosofiska debatten om detta, och varför jag ändå kallar mig vegetarian till en annat blogginlägg)

Efter ett tag växte omfånget på mina skäl. Någonstans kom också de etiska skälen och funderingarna in. Är det rätt att slakta ett djur ”bara för att det är gott”. Står inte vi som människa över den primala och idag inte alls nödvändiga driften?

För en del verkar köttet nästan vara som ett heligt knark – jag tänker då t.ex. på den uppmärksamhet festivalen ”Way out west” fick när man bestämde sig för att bara servera vegetariska alternativ sommaren 2012.

Sådana händelser gör mig bara mer övertygad om att jag har rätt i mitt val – det är något fel när en sådan händelse överhuvudtaget växer uppmärksamhet i vårat samhälle. Och som ett par som hälsade på från Indien kommenterade: ”The Swedes! All they do is nibble on meat, all the time”.

Jag anser att det finns tillfällen där vi både kan äta, döda samt jaga ett djur. Det jag inte kan med är den tankeslösa girigheten kring köttätandet, den kött-centriska matkulturen i samhället, och framför allt den brist på respekt för djuret som satt livet till för att du ska få din hamburgare i magen.

2 böcker jag kan rekommendera oavsett om du är vegetarian eller bara intresserad av ämnet är:

Äta djur, Foer

Jordens herrar, Strindlund

Annonser

Set up logging in a Java webapplication

There’s a lot of sources on the net for configuring and using the different logging frameworks in Java, so i’m just going to show you how you can use an listener for initializing a Log4J configuration in an Web application.

Put the listener-init in your web.xml

 <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>log4j-frontend.xml</param-value>
    </context-param>
    <listener>
        <listener-class>
            se.lif.www.site.Log4jConfigListener
        </listener-class>
    </listener>

The listener (also using Apache Commons ConfigurationUtils)

public class Log4jConfigListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        URL configUrl = null;

        ServletContext servletContext = sce.getServletContext();
        String log4jConfigName = servletContext.getInitParameter("log4jConfigLocation");

        // Try to locate file in classpath
        configUrl = ConfigurationUtils.locate(log4jConfigName);

        if (configUrl != null) {
            //if the location is other than the root
            DOMConfigurator.configure(configUrl.getPath());
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        //cleanup or be forever silent
    }
}

and that should be it!

Some other things of usage when logging:

  • If you run with ”-Dlog4j.debug” then log4j will print out info to standard output telling how it is trying to configure itself. Looking through that will tell you where it is looking for the config file.
  • And Please, do use SLF4J even if you use Log4J (or another logging framwork) for your logging. It’s a drop-in replacement for many logging frameworks with too many benefits to write about here.
  • Static or new instance’s for your loggers? The pattern for getting a logger is usually like this:
package some.package;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyClass {
       final (static) Logger logger = LoggerFactory.getLogger(MyClass.class);
... etc
}

but some argue that you should make new instances. SLF4J has an little interesting read, and recommends static.

Oh, BTW, here’s an alternative way to do the same as in this post, but without a listener.

Generating pseudorandom numbers in Java

I had a closer look at generating pseudorandom numbers in Java the other day. Mainly nailing the difference between using Math,random, new Random() or (since Java 7) ThreadLocalRandom. Enjoy the little example, (and if i did something wrong, please correct me in the comments).


package com.funstuff.javapractices.commontasks;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

/**
 * Examples of different ways to run random.
 *
 * This shows 3 different ways of generating a basic pseudorandomnumber in
 * Java.
 *
 * 

* Using: Math.random, new Random and ThreadLocalRandom * *

* Math.random uses Random.nextDouble() underneath the hood; Random.nextDouble * is not as efficient as for example Random.nextInt * http://stackoverflow.com/questions/738629/math-random-versus-random-nextintint * * Math.random() uses a single static java.util.Random instance, which itself is * thread-safe? This can generate contention- if you have multiple threads * that are supposed to run in parallel, through Math.random() they will all * compete for its lock and can deteriorate into running serially. * *

* The Random object has different utility methods, and by default gets it's * seed from the systemtime. It has constructor that let's you set your own * seed. As this is pseudorandom algorithms - If you initialize multiple Random * objects with the same seed they'll generate the same numbersequence. * *

* * From the javadocs: "the concurrent use of the same java.util.Random * instance across threads may encounter contention and consequent poor * performance. Consider instead using ThreadLocalRandom in multithreaded * designs." * * With java 7 comes ThreadLocalRandom in the java.util.concurrency package * (wich extends java.util.Random) Characteristics is that it prohibits setSeed * (gives UnsupportedOperationException), it's static and it's threadlocal. And while * Math.random() works on a static singleton instance of Random, * ThreadLocalRandom works on a thread local instance. See * http://niklasschlimm.blogspot.se/2012/01/java-7-how-to-write-really-fast-java.html * for a good and deep explanation. * * * * * @author whatever whatever */ public final class RandomNumbers { private static int loopCtr = 10000; private static long startTime; private static long endTime; public static void main(String... args) { System.out.println(System.lineSeparator()); mathRandom(); newRandom(); threadLocalRandom(); System.out.println(System.lineSeparator()); //raise the stakes.. loopCtr = 1600000; mathRandom(); newRandom(); threadLocalRandom(); System.out.println(System.lineSeparator()); //just a range example newRandomWithRange(); } private static void mathRandom() { startTime = System.currentTimeMillis(); for (int i = 0; i < loopCtr; i++) { ////gives a double between 0.0 and less than 1.0 //but often seen used like this ( here to give a number between 1 and 10) long mathRandomDoubleRounded = Math.round(Math.random() * 10); } endTime = System.currentTimeMillis(); System.out.println("Total execution time: " + (endTime - startTime) + "ms"); } private static void newRandom() { startTime = System.currentTimeMillis(); Random random = new Random(); for (int i = 0; i < loopCtr; i++) { double randomDouble = random.nextDouble(); } endTime = System.currentTimeMillis(); System.out.println("Total execution time: " + (endTime - startTime) + "ms"); } private static void newRandomWithRange() { //random x between 0 and less than 11 - (Remember Java usually handles ranges like [inclusive, exclusive]) //and to get a range, just add the MIN of your range .i.e //we want something between 10 and 17, and init with (MAX-MIN)+1 int min = 10; int max = 17; Random random = new Random(); int randomValue = (random.nextInt((max - min) + 1) + min); System.out.println("RandomValue:" + randomValue); } private static void threadLocalRandom() { startTime = System.currentTimeMillis(); for (int i = 0; i < loopCtr; i++) { double threadLocalRandom = ThreadLocalRandom.current().nextDouble(); } endTime = System.currentTimeMillis(); System.out.println("Total execution time: " + (endTime - startTime) + "ms"); } }

See this blog for digging deeper!.

Min klassresa

Min högsta önskan när jag var liten var att jag skulle få jobba som långtradarchaufför när jag växte upp. Inga högre ambitioner, för det var ju inget man kunde råda över. Trodde jag då. Såhär i efterhand har jag insett att det inte var chaffis jag vill bli, utan att jag såg mig själv i en romantisk dimma, svävandes med lastbilen i högsta fart över land och rike. Friheten i blick , och vägarnas kung. Stanna till för att sova, läsa en bok och betrakta omvärlden genom min inglasade facett till omvärlden.

Uppväxt i en småstad och bruksort, där de flesta skaffar barn tidigt eller flyttar därifrån tycktes mig framtiden utstakad. I min klass och umgängeskrets betraktades det som fult och töntigt att studera, så uppmuntran fick komma inifrån. Dåligt självförtroende, jante och hela det där. Det tog därför lång tid innan jag vaknade till. Jag visste alltid att jag ville göra något, men vad, vad – det var frågan. Jag brottades också med andra funderingar, då jag alltid varit en bokläsare, och intresserad av att ta reda på ”varför” och ”hur” saker och ting fungerar. Efter gymnasium på 2 år (Vård), och fast förhållande i bruksorten så levde jag så några år. Min största hobby på fritiden var 2 saker:  Att spela musik och att mecka med datorer. Jag tror att det var därför jag höll. Mitt lågavlönade, icke skapande jobb var väl ok, men .. jag ville hela tiden vidare.

Efter många andra turer och historier började jag att studera och fördjupa en av mina andra passioner, datorer och programmering. Utbildade mig till Ingenjör och läste datavetenskap. Levde studentliv, vidgade mina vyer, reste, bodde i Stockholm, Uppsala, sysslade lite med politik, Konsultade, intresserade mig mer och mer för världen och träffade många,många människor på resan. Någonstans hände också min klassresa, utan att jag märkte det. Jag har idag ett jobb så roligt att jag nästan skulle kunnat göra  det gratis, dagliga vanorna skulle nog kunna klassas som ”borgare” och många i min omgivningskrets sysslar med kreativa jobb, eller är högutbildade i någon form.

För några år sedan fick jag en behövlig tankeställare. Jag träffade ett gäng jag umgicks med för länge sedan. Det man pratade om där var hur krisen slagit, hur folk fick gå, hur svårt det var få jobb osv. Ett annat universum än den lilla bubbla jag går omkring i dagligen.

Har jag då glömt min arbetarklassbakgrund nu i mitt ”tjänstemannaliv”. Nej,  jag är stolt över den. Stolt över att prova olika saker, att själv få komma på vad jag ville, att ta mig dit. Och erfarenheten av att jobba inom vården är något få inom mitt område har. Det har också gett mig erfarenheter av livet och döden på nära håll. Jag reser också en hel del, och jag blir ibland förbannad på hur orättvis världen är – eller ska jag säga vissa människor, eftersom det är vi människor som bestämmer över samhället. Fast man behöver inte resa långt för att se det – klasskillnaderna i Sverige har ökat sedan Alliansen började att styra.

Miljövänliga träningskläder för män

Det var dags att uppdatera löpgarderoben, då de gamla sakerna hängt med i evigheter. Kanske skulle de snart kunna klassas som sanitära olägenheter…

Nuförtiden kollar jag alltid miljö+fairtradespecificationerna på det jag köper. (Inte för att jag tror  på att vi kan shoppa oss till att rädda planeten, men det visar kanske tillverkarna att vi konsumenter bryr oss. Den moderna tidens avlatsbrev:)

Det jag var ute efter var följande:

* En lätt löpjacka

* En par löptights

* Ett par bra löparskor.

Dessutom hade jag kraven att de skulle vara snygga och respektabla.

Hur gick det? Det var mycket svårare att hitta dessa i miljövänliga material än jag trodde. Bland annat hittade jag den här posten, men det innehöll inte det jag letade efter.

Efter mycket sökande hittade jag dessa

Image

* Patagonia nine trails jacket

* Patagonia speedwork tights

* Brooks green silence running shoes

Jäkligt nöjd, efter att ha tagit några mil i löpspåren!

 

Patagonia har sedan starten integrerat miljötänk i deras produkter och de håller hög kvalitet. Brooks är väl kanske inte lika föredömliga, men har ändå några miljlövänliga produkter som dessa löpskor.

Det kan vara svårt att få tag i dessa prylar i Sverige.Patagonia prylarna hittade jag hos Åre äventyrsbutik, och skorna hos Amazon UK.

 

Jag hoppas verkligen att vi får se ett större utbud av miljövänliga produkter även inom träningsbranchen i framtiden. Ut med er o träna bort vinterfläsket nu!

Tor on my Raspberry PI

The other week i got my cute little RaspberryPI.  Amongst the different projects i tried (it’s very nice to just have a set of SD-cards ready for this), i wanted a silent, small,low power Tor-relay.

Yey, I already had a Tor-relay, on an old Atompowered Asus EEE, with a broken flatscreen and a non-working keyboard. Works, but starting to reach it’s end-of-life. I read somewhere that the Raspberry PI can handle about 6 MBytes/Sec and that’s more than enough for me.

Well, the setup was really,really easy, here’s how to do it:

* Follow this guide for the basic Tor-install

Now, if you want a gui/monitor for Tor, there’s 2 ways to go. If you’re planning to run X, install Vidalia. Otherwise (or if you want something more lightweight) go for Tor-arm. My recomendation is that you install them both.

Installing arm

sudo apt-get install tor-arm

and that’s about it. Run it after you have started the Tor-process. You may need to have set the password for connectiong to Tor before this (/etc/tor/torrc)

screenshot_page1

Installing Vidalia

do

sudo apt-get install vidalia

  • you might have to change some folder permissions, check the vidalia message log from the vidaliaGUI, it’ll tell you.
  • Also, don’t forget to change the pathway to the config file in vidalia, so that it uses the same config as your original TOR install. ( /etc/tor/torrc).

And don’t forget to open the ports ORPort and DirPort (default 9001, 9030) in your firewall. And maybe do some portforwarding to your Raspberry in your router.

I’m very happy with my litte silent, low power-consumption,cheap Tor-relay. Working for freedom 24/7. After about one day i have the 50-80% cpu usage, and average of 2.1 MB/S down 2.5 MB/s up. No X started.

IMAG0517

Next, i’ll try to setup another one with I2P on it.