sobota, 23. oktober 2010

Zaprašeni biti

Ko sem pregledoval stare cd-je sem našel par zanimivih zadev. Slike, zapise, glasbo, filme. Vse pa je tako ali drugače povezano z Veluščkovo 1c v Mariboru kjer sem s tremi cimri bival dve leti, od 2003 do 2005. Je že tako, da se ob koncu radi spomnimo začetkov.

Kot se za računalničarje spodobi smo nabavili hiter kabelski internet. Slišati je bilo govorice, da smo imeli 3Mb linijo a je naš admin »mongo« poskrbel, da ni bilo prevelike evforije. Z njegovimi skriptami je do nas prišla samo tretjina, če je bil ravno lep dan. Star računalnik je služil za usmernik, ki je bil hkrati tudi server. Imenoval se je YeYz (beri jejž). Na njemu pa je tekel tudi FTP strežnik. Zdaj pa sem našel na stari zgoščenki kopijo tega ftpja. Nanj sem nalagal zelo različne zadeve – kar se mi je pač zdelo takrat zabavno.

Zgodbo pa bom začel še malo prej. Takrat, ko sem si urejal prvi analogni dostop do interneta. Najprej sem v Elektro času kupil 10m telefonskega kabla s konektorji potem pa še Motorolo SM56 od CoOoLeR-ja. In smo šli na lov za SiOL-ovimi promocijskimi zgoščenkami. Naročevali smo jih od vseh možnih sorodnikov in znancev. Pet ur interneta je bilo na posamezni promocijski kodi. Seveda smo vsako kodo izkoristili do konca in še več. Če povezave namreč nisi sam prekinil, ko je pet ur poteklo, si lahko bil na internetu še poljubno časa. Seveda pa so linije padale kar same od sebe zato prekoračitve niso bile tako dobro izkoriščene kot bi lahko bile.

Ko pa teh promocijskih akcij ni bilo več pa smo dostop spet plačevali normalno. Jaz sem imel kar dva ponudnika. ARNES, ki je bil cenejši a je imel omejitev (mislim da 10 ur na teden) in pa VOLJA.NET. Obe prijavni gesli sem dobil od CoOoLeR-ja. Računi so bili ogromni, do 10.000 sit samo za telefon. Spodaj je zgodovina dostopov iz programa NetTimer za avgust 2003. Naredil sem 83 dostopov s skupnim časom 66 ur in ceno 7900 sit.

Spodaj pa je edini dokaz, da smo imeli 3Mb kabelski internet. Beden torrent klient z leetcherskimi nastavitvami. Enosmerni sharing.

Še preden pa sem kupil nov računalnik sem navil in testiral starega. AMD Thunderbirda 800MHz sem navil na 921MHz hlajen s TT Volcano 2, GeForca 2MX pa na 200MHz. Vse skupaj na matični plošči ABIT KT7A-Raid. Tukaj pa je rezultat v 3DMarku2001 SE.

Potem pa je bil čas za nov računalnik. Naročil sem ga po delih preko spletnih trgovin. Kjer je pač bilo najceneje.

Ogromno časa smo preživeli tudi na IRC-u. Takrat je bilo res ogromno ljudi saj je bil to najpopularnejši protokol za izmenjavo neposrednih sporočil. Pisale so se skripte, slapal se je folk, prevzemali so se kanali. Pomembno je bilo tudi, da si ostale obveščal o tem kaj počneš. Ime na ircu je odražalo, če nisi bil prisoten, če si bil na kosilu… Vsi privatni pogovori z nasprotnim spolom pa so bili iste oblike: »Kako si?«, »Kolk si stara?«, »Maš sliko?«. In običajno je bilo to tudi vse. Prirejali so se tudi ti. Irc Partyi. Naš privatni kanal je bil #Tekila, ki še vedno obstaja. Na ircu se je dogajalo vse. Spremljali smo tekme. Slika je iz tekme med Portugalsko in Anglijo, ko so streljali enajst metrovke.

Seveda smo bili tudi na kanalu #Velenje in imeli +, ti. voice. Veliko zelo različnega folka.

Seveda pa nikoli niso samo lepi trenutki. Bilo je tudi nekaj izpadov.

Takrat se mi je zdelo zanimivo tudi zbiranje zajcev. Vsakemu sem določil svojega zajca.

Pozabiti ne smem niti moje zbirke hudih bejb. Poimenoval sem jih bombice, evo najboljše.

Ko smo pa dobili še mikrofon je bilo pa konec. Zbrali so se trije, ki so imeli volja do petja. Ponavljam, imeli so samo voljo, nič drugega. Tudi izbor »komadov« je zelo pester, da o interpretaciji ne govorim. OPOZORILO: Če imaš posluh raje tega ne poslušaj! Gre za zelo abstraktno zadevo. Opisal bi jo kot One-hit failure.


Veliko smo preigrali tudi mod za Quake 3, Urban Terror. To je bilo preden sem odkril CSS.

Preko interneta pa smo tudi malo nažigali Quake 3. Ampak smo običajno hitro končali. Ni bilo skilla.

Prodrli smo tudi na filmska platna. Zmontiral sem najbolj zanimive trenutke tistega jutra. Očitno je bilo super.


Popularni so bili še Bananopapi (Handsome Teens Eat Bananas :) ,Severina in njen pornič, Taja in njene gole slike (za fanta in Slovenijo). Takrat je internet ustvaril Freddya Millerja (podobno kot danes Ekrema Jevrića). CP Laško pa je bila evropski prvak.

Potem je pa prišel MSN in vse se je izrodilo.

ponedeljek, 4. oktober 2010

Iz C# v F# in nazaj

Po dolgem času sem spet zbral malo volje da nekaj spišem. Šlo bo za zadevo, ki sem jo sprogramiral že pred časom, da sem si malo ogledal C# 4.0. Nekaj F#-a in paralelizacije ter medsebojne uporabe knjižnic.

Kontekst
Računanje fakultete. Gre za matematično funkcijo, ki je zmnožek vseh manjših števil, vključno z n -
(5! = 1 * 2 * 3 * 4 * 5 = 120). Funkcije za računanje fakultet sem napisal na več načinov – za primerjavo.

F#
Gre za funkcijski programski jezik s podporo objektnemu programiranju, ki temelji na .NET platformi. Primeren je za kompleksne algoritme, simulacije, analize, matematične izračune, paralelizacijo, podatkovno rudarjenje, umetno inteligenco...

Implementacija


Rekurzivno funkcijo za izračun fakultete sem dal v posebno knjižnico, da ni bilo krožne reference. To funkcijo kličemo potem iz F#. Uporabiti je potrebno BigInteger saj rezultati kmalu postanejo ogromni.
using System.Numerics;

namespace FactorialLibrary
{
    public struct RecursiveFactorial
    {
        public static BigInteger FactorialRecursive(BigInteger number)
        {
            return number > 1 ? number * FactorialRecursive(number - 1) : 1;
        }
    }
}
F# modul z rekurzivno, iterativno in eksotično funkcijo za izračun fakultete. Spodnja funkcija pa je klic funkcije iz zgoraj omenjene C# knjižnice.
module FactorialFSharpLibrary
open FactorialLibrary

let factorialExotic(n) = Seq.fold ( * ) 1I [1I .. n];;

let rec factorialRecursive(n) =
    if n < 1I then 1I
    else n * factorialRecursive (n - 1I);;

let factorialIterative(n:bigint) = 
    let mutable result = 1I
    for i=1 to (int)n do
       result <- result * bigint(i)
    done
    result;;

let factorialRecursiveCSharp(n) =
    RecursiveFactorial.FactorialRecursive(n);;
V C# strukturi pa imamo iterativno in paralelno funkcijo za izračun fakultete. Prav tako pa kličemo tudi vse zgoraj napisane funkcije.
public struct Factorial
    {
        public static BigInteger Number { get; set; }

        public static BigInteger FactorialIterative()
        {
            var fact = new BigInteger(1);
            for (var i = 1; i <= Number; i++) { fact *= i; }
            return fact;
        }

        public static BigInteger FactorialIParallel()
        {
            var fact = new BigInteger(1);
            Parallel.For(1, (long)Number + 1, i => { fact *= i; });
            return fact;
        }

        public static BigInteger FactorialFSharpExotic()
        {
            return FactorialFSharpLibrary.factorialExotic(Number);
        }

        public static BigInteger FactorialFSharpRecursive()
        {
            return FactorialFSharpLibrary.factorialRecursive(Number);
        }

        public static BigInteger FactorialFSharpIterative()
        {
            return FactorialFSharpLibrary.factorialIterative(Number);
        }

        public static BigInteger FactorialRecursiveOverFSharp()
        {
            return FactorialFSharpLibrary.factorialRecursiveCSharp(Number);
        }
    }
V glavnem programu samo pokličemo vse metode in izpišemo rezultate. Čas izvajanja posamezne metode tudi izmerimo.
struct FactorialExamples
    {
        private const string Print = ":\n{0}";

        public delegate BigInteger ExecuteMethod();

        public static void MeasureMethod(string printLine, ExecuteMethod method)
        {
            var timer = Stopwatch.StartNew();
            var result = method();
            timer.Stop();
            Console.WriteLine(string.Format(printLine + Print, result) + "\ntime: " + timer.ElapsedMilliseconds + "ms");
        }

        public static void Main()
        {
            Factorial.Number = 100;
            Console.WriteLine("Factorial of {0}", Factorial.Number);
            MeasureMethod("recursive C# over F#", Factorial.FactorialRecursiveOverFSharp);
            MeasureMethod("iterative", Factorial.FactorialIterative);
            MeasureMethod("parallel", Factorial.FactorialIParallel);
            MeasureMethod("exotic F#", Factorial.FactorialFSharpExotic);
            MeasureMethod("recursive F#", Factorial.FactorialFSharpRecursive);
            MeasureMethod("iterative F#", Factorial.FactorialFSharpIterative);
            Console.ReadKey();
        }
    }
Rezultati fakultete števila 200 in čas izvajanja.

Testiranje
Vse funkcije tudi testiramo z Unit testi. Zgoraj so konstante za obvestila o napakah, spodaj pa klici vseh metod in primerjava njihovih rezultatov s pravilnim. Metode testiramo z različnimi argumenti.
[TestClass]
    public class TestFactorial
    {

        #region Printout fields
        private const string Recursive = "Error in recursive function";
        private const string Iterative = "Error in iterative function";
        private const string Parallel = "Error in parallel function";
        private const string ExoticF = "Error in exotic F# function";
        private const string IterativeF = "Error in iterative F# function";
        private const string RecursiveF = "Error in recursive F# function";
        #endregion

        private static void MethodRun(BigInteger parameter, BigInteger expectedResult)
        {
            Factorial.Number = parameter;
            var actual = Factorial.FactorialRecursiveOverFSharp();
            Assert.AreEqual(expectedResult, actual, Recursive);
            actual = Factorial.FactorialIterative();
            Assert.AreEqual(expectedResult, actual, Iterative);
            actual = Factorial.FactorialIParallel();
            Assert.AreEqual(expectedResult, actual, Parallel);
            actual = Factorial.FactorialFSharpExotic();
            Assert.AreEqual(expectedResult, actual, ExoticF);
            actual = Factorial.FactorialFSharpIterative();
            Assert.AreEqual(expectedResult, actual, IterativeF);
            actual = Factorial.FactorialFSharpRecursive();
            Assert.AreEqual(expectedResult, actual, RecursiveF);
        }

        #region Test Methods
        [TestMethod]
        public void TestFactorialsFor0()
        {
            MethodRun(0, 1);
        }

        [TestMethod]
        public void TestFactorialsFor1()
        {
            MethodRun(1, 1);
        }

        [TestMethod]
        public void TestFactorialsFor10()
        {
            MethodRun(10, 3628800);
        }

        [TestMethod]
        public void TestFactorialsFor20()
        {
            MethodRun(20, 2432902008176640000);
        }
        #endregion

    }
}
Rezultati testa - vsi testi so uspešni.
Za konec pa še metrika kode za C# projekte v tej rešitvi.