Microsoft Kinect side projects

Microsoft Kinect might become one of the most interesting projects coming out from Redmond. This brilliant future for the kinect is probably due to the Open Source driver that already made Microsoft say that they welcome what people invent.  (That’s new, for a change). But let’s stop talking about politics and list some interesting cool things people are doing with Kinect (in no particular order):

I’ll updated this list with new projects and ideas. If you find one please put own in the comments so I’ll check them and update this list. (more…)

Cheating? and Speed Gains… Correlated?

Modern computers are fast but usually developers overload them with all the stuff they can find. I know I do that. And then they start to slow down again. On this topic I’ve found two interesting stories lately:

  • The first one is about Browser speeds. It seems that IE 9 might be “cheating” the SunSpider Javascript test. It could be that IE9 was only doing deadcode analysis before trying to run it a la Haskell, but some tests showed that it might not be the case. Go figure!
  • The other news has to do with speeding up the Linux Desktop, by a small change (~200 lines) in the kernel scheduler source code. The rationality behind this patch is that groups tasks according the TTY they are attached to. Some videos showed that this new approach can increase dramatically the perceived responsiveness of the system.

So, why have I put this two items in one post? The main reason is that both have to do with the PERCEIVED computational speed of pieces of software. In the first case, IE9 did some tweeking to it’s Javascript so it would look good in benchmarks (after all the reading this is my opinion), and in the second case the tweeking to the kernel scheduler was done to look good for the user. This two thing are at different morality levels, but in the end they show something:

(PERCEIVED) SPEED MATTERS! A LOT!

ICC Profiles Browsers show wrong colors

I’ve look at the way Firefox implements ICC Color profiles in the past, finding that Firefox wasn’t able to render color properly. This might not be a problem for some applications, but is a pain for others like photography or web-development, where for example a designer might want to fade a picture into a solid background color.

Some time has passed and I decided to go for another run and test the browsers for the correct implementation of ICC profiles. In this test I tried Safari 5.0.2, Firefox 3.6.12 and Google Chrome 9.0.572.1 dev. All of them have their strengths and many people are now moving from FF to chrome for speed reasons, or for safari for fashion reasons. I wanted to know which was the best browser if I wanted to edit photos in Lightroom and then publish them online.

I took 1 picture I made and exported from my Lightroom with 3 different ICC profiles: sRGB, Adobe RGB(1988) and ProPhoto RGB. These 3 are the butter and bread of ICC profiles in photo editing. Then I opened each file in a different tab of each browser and made screen captures so I could show you the differences. Than I selected the same are in all the 3 and created a 3×3 matrix of images with all results. And then I was heading for a big surprise:

(more…)

Square Root of Big Numbers in Java

Computing the square root of big numbers is a problem for computers. The way computations happen, computers don’t really like the huge numbers some scientists like to put out. Even if For several applications you can easily go from int to long or from float to double, there are times when even those aren’t enough.

Java has a few classes that deal with large numbers. They are BigInteger and BigDecimal. Between the two you’ll probably get almost everything you need for big number computation.

Although the way to do operations with the BigInteger and BigDecimal can be counter-intuitive in mathematical terms, it is correct in an object oriented way. The only thing that I found lacking until now is a method to calculate square roots in BigDecimals… That is annoying.

I searched around the internet and found an elegant (and fast) implementation for BigDecimals of the square root by Michael Gilleland. I’m copying is code here at the end of this post for the sake of preservation (I hate sites going away and these things being lost).

Java code for large number computing of square roots

The code bellow for computing the square root of large numbers works very well. You just need to remember to set the scale (the number of digits you want in the fractional part) to 100 or more. Yes, that’s the kind of precision one sometimes needs and that’s why I can’t convert to doubles, do sqrt, and go back to BigDecimal. 

The class BigSquareRoot for computing large numbers square roots in Java. Next step: Compute the number PI as a large number computation with the same precision.

//----------------------------------------------------------
// Compute square root of large numbers using Heron's method
//----------------------------------------------------------
 
import java.math.*;
 
public class BigSquareRoot {
 
    private static BigDecimal ZERO                   = new BigDecimal("0");
    private static BigDecimal ONE                    = new BigDecimal("1");
    private static BigDecimal TWO                    = new BigDecimal("2");
    public static final int   DEFAULT_MAX_ITERATIONS = 50;
    public static final int   DEFAULT_SCALE          = 10;
 
    private BigDecimal        error;
    private int               iterations;
    private boolean           traceFlag;
    private int               scale                  = DEFAULT_SCALE;
    private int               maxIterations          = DEFAULT_MAX_ITERATIONS;
 
    // ---------------------------------------
    // The error is the original number minus
    // (sqrt * sqrt). If the original number
    // was a perfect square, the error is 0.
    // ---------------------------------------
 
    public BigDecimal getError() {
        return error;
    }
 
    // -------------------------------------------------------------
    // Number of iterations performed when square root was computed
    // -------------------------------------------------------------
 
    public int getIterations() {
        return iterations;
    }
 
    // -----------
    // Trace flag
    // -----------
 
    public boolean getTraceFlag() {
        return traceFlag;
    }
 
    public void setTraceFlag(boolean flag) {
        traceFlag = flag;
    }
 
    // ------
    // Scale
    // ------
 
    public int getScale() {
        return scale;
    }
 
    public void setScale(int scale) {
        this.scale = scale;
    }
 
    // -------------------
    // Maximum iterations
    // -------------------
 
    public int getMaxIterations() {
        return maxIterations;
    }
 
    public void setMaxIterations(int maxIterations) {
        this.maxIterations = maxIterations;
    }
 
    // --------------------------
    // Get initial approximation
    // --------------------------
 
    private static BigDecimal getInitialApproximation(BigDecimal n) {
        BigInteger integerPart = n.toBigInteger();
        int length = integerPart.toString().length();
        if ((length % 2) == 0) {
            length--;
        }
        length /= 2;
        BigDecimal guess = ONE.movePointRight(length);
        return guess;
    }
 
    // ----------------
    // Get square root
    // ----------------
 
    public BigDecimal get(BigInteger n) {
        return get(new BigDecimal(n));
    }
 
    public BigDecimal get(BigDecimal n) {
 
        // Make sure n is a positive number
 
        if (n.compareTo(ZERO) <= 0) {
            throw new IllegalArgumentException();
        }
 
        BigDecimal initialGuess = getInitialApproximation(n);
        trace("Initial guess " + initialGuess.toString());
        BigDecimal lastGuess = ZERO;
        BigDecimal guess = new BigDecimal(initialGuess.toString());
 
        // Iterate
 
        iterations = 0;
        boolean more = true;
        while (more) {
            lastGuess = guess;
            guess = n.divide(guess, scale, BigDecimal.ROUND_HALF_UP);
            guess = guess.add(lastGuess);
            guess = guess.divide(TWO, scale, BigDecimal.ROUND_HALF_UP);
            trace("Next guess " + guess.toString());
            error = n.subtract(guess.multiply(guess));
            if (++iterations >= maxIterations) {
                more = false;
            } else if (lastGuess.equals(guess)) {
                more = error.abs().compareTo(ONE) >= 0;
            }
        }
        return guess;
 
    }
 
    // ------
    // Trace
    // ------
 
    private void trace(String s) {
        if (traceFlag) {
            System.out.println(s);
        }
    }
 
    // ----------------------
    // Get random BigInteger
    // ----------------------
 
    public static BigInteger getRandomBigInteger(int nDigits) {
        StringBuffer sb = new StringBuffer();
        java.util.Random r = new java.util.Random();
        for (int i = 0; i < nDigits; i++) {
            sb.append(r.nextInt(10));
        }
        return new BigInteger(sb.toString());
    }
 
    // -----
    // Test
    // -----
 
    public static void main(String[] args) {
 
        BigInteger n;
        BigDecimal sqrt;
        BigSquareRoot app = new BigSquareRoot();
        app.setTraceFlag(true);
 
        // Generate a random big integer with a hundred digits
 
        n = BigSquareRoot.getRandomBigInteger(100);
 
        // Build an array of test numbers
 
        String testNums[] = { "9", "30", "720", "1024", n.toString() };
 
        for (int i = 0; i < testNums.length; i++) {
            n = new BigInteger(testNums[i]);
            if (i > 0) {
                System.out.println("----------------------------");
            }
            System.out.println("Computing the square root of");
            System.out.println(n.toString());
            int length = n.toString().length();
            if (length > 20) {
                app.setScale(length / 2);
            }
            sqrt = app.get(n);
            System.out.println("Iterations " + app.getIterations());
            System.out.println("Sqrt " + sqrt.toString());
            System.out.println(sqrt.multiply(sqrt).toString());
            System.out.println(n.toString());
            System.out.println("Error " + app.getError().toString());
        }
 
    }
 
}

bigsquareroot class in java how to find big square root of a big number in java using biginteger java biginteger square root sqrt big sqrt long java

Java em duas versões… uma das quais é paga…

A Oracle finalmente começou a mostrar o que pretende fazer com o Java, e naturalmente não são boas notícias. A Oracle pretende ter duas versões do Java, uma gratuita (como até aqui) e outra paga pretendendo juntar a sua JRockit com a Hotspot que comprou à Sun. Pelos vistos vai haver diferentes performances do Java e quem pagar terá mais desempenho enquanto os restantes se arrastarão.

A meu ver esta estratégia de dois produtos é só o primeiro passo para a dado momento a Oracle alegar alguma incompatibilidade/custo económico/ etc para abandonar a versão gratuita… Daí que seja urgente que mais membros pesados da comunidade open source tomem parte do processo (IBM?), caso contrário a Oracle vai acabar por fechar o Java num nicho de mercado de onde vai extorquir fortunas.

Ao nível da guerra de linguagens de programação, esta poderia ser uma excelente altura para emergirem outras linguagens nos currículos universitários… hm…

Can we haz python, plz?

Macbook Air 2010

Faz mais ou menos 2 anos que o antigo Macbook Air foi lançado. Na altura muita tinta correu sobre o facto do Macbook Air caber dentro de um envelope manila. Finalmente foi lançada a segunda iteração do produto e a grande novidade é a versão de 11,6″ que consegue ser mais pequena que uma folha A4. No entanto  o preço vai fazer com que este produto continue a não ser alternativa ao Macbook de entrada na Apple. 1000 euros por uma máquina com um processador lento, com pouca capacidade de disco e com uma autonomia reduzia que não lhe permite estar o dia todo numa conferência ou atravessar o atlântico é puxado. Por metade do preço consegue-se mais se se aceitar sair do ecossistema Apple.

Há algum tempo falou-se na Apple Tax em que os utilizadores pagariam mais pelo hardware apple do que os preços dos componentes. Estes Macbook Air serão talvez, de toda a gama apple, os produtos onde a percepção da Apple Tax é mais clara.

Ainda em jeito de resumo sobre a sessão de lançamento destes Macbook Air ficou patente que o futuro da Apple vai passar por tudo menos computadores. O App Store que será introduzida proximamente será o princípio do fechar de uma plataforma, transformando o computador num gadget.

Outra das indicações desta evolução da apple passou pelo fim do desenvolvimento do Java pela própria apple sendo que a partir de agora será necessário que a Oracle ou a comunidade Open Source faça o desenvolvimento do Java para Mac. Isto para além de funcionar como indicador dos interesses da Apple pode acabar por ser benéfico para os utilizadores Java no mundo Mac. O Java da Apple está normalmente atrasado em relação ao oficial e apresenta alguns problemas. Em experiências efectuadas no ISCTE temos chegado à conclusão que o Java da Apple é tão ou mais rápido que os restantes, mas é-o à custa de consumir muita mais memória. Aplicações que em Windows / Linux consomem ~30 Mb no mac utilizam ~540Mb. O passar do Java para outras mãos talvez faça com que a próxima versão do Java 7 seja realmente mais uniforme entre as diversas plataformas.

No entanto isto criou uma situação de indecisão até que tal aconteça. Por exemplo, nós estamos a entrar num ciclo em que teremos que fazer compras de equipamento. Esta notícia do fim do suporte de Java caiu como uma pequena bomba e quando chegar à altura das decisões iremos ter alguma ponderação em relação aos produtos apple numa situação em que normalmente não teríamos dúvidas.

Esta semana de anúncios Apple poderia vir a ser interessante mas acabou muito morna e até com algum sabor amargo. O ataque do CEO da apple ao android utilizando termos apenas vistos nas piores fases FUD da microsoft mostram um CEO com manias oligopolistas e com medo que lhe retirem o protagonismo. Os anúncios do novo OS X Lion souberam a muito pouco e ainda por cima com o sabor amargo de uma app store com a qual a apple procura mais lucros. Os netbooks (ups) macbook air foram uma lufada de ar que não chegou a ser fresco quando se soube os preços. E a atitude do CEO da apple durante toda a semana mostra que está numa espécie de cruzada pessoal contra tudo o que é não apple.

Dear Steve

You know I hate you and the crap products you’ve been producing lately at Apple. The beloved Mac COMPUTERS that we bought to do our work are being sidestepped by some mass products for Kids and hipsters. I know your company has to adapt and become broader. And all that is just fine except… I don’t care about it… I care about GREAT COMPUTERS that last long, are dependable, and work tirelessly. I don’t really care about your Sony envy at all…

So, please Steve, could you really make Wednesday event something COMPUTER users can get excited about, or are you going to be talking to 3rd graders, again?