pátek 31. srpna 2012

Mercurial hg vs. Git

Ten článek je ještě rozepsaný a ještě by potřeboval dost upravit, ale stejně už ho publikuju... :)

Už nějakou dobu se zabývám otázkou, jestli je lepší používat Mercurial (hg), nebo Git. A ať počítám, jak počítám vcelku jasným vítězem je Mercurial. Zkusím tu uvést pár věcí, proč si myslím, že je to tak.

-

Proč Mercurial:

  • Mercurial je jednodušší

    To je dle mého velmi důležité. Pokud něco programujete, chcete se zaobírat tím, jak to udělat, a učit se věci, které potřebujete k psaní kódu, a ne trávit hodiny nad Gitem a řešit, co a jak kam commitnout.

    Další věc je, že klasicky neprogramujeme sami. A rozhodně je mnohem jednodušší naučit nováčka Mercurial než Git. Navíc se s Mercuriálem o dost snižuje riziko, že tam nováček něco vymňoukne, protože je to střelec. Nebudete pak pracně zachraňovat jeho kód, nebo nedej bože Váš vlastní.

    Git je mocný a umožní Vám udělat skoro všechno, o co mu řeknete (což beru jako velkou nevýhodu). Může se stát, že Vám někdo nezkušený zavolá "git-push --force" a to může vést k přepsání a ztrátě historie na serveru. Takže nováček Vám zruší váš kód a to tak, že ho už nikdy neuvidíte. To v Mercuriálu naštěstí nejde. A věřte mi, hlavní, co chci po verzovacím systému, je abych nepřišel o to, co tam dávám, a cokoli mohl výtáhnout z historie (proto ho mám). Ne že mi to Vonásek zlikviduje.
    Git se dá nějak nastavit, aby to zakazoval, ale vy si vždycky vzpomenete to nastavit? Já teda ne!
    To je věc, u které takřka ztrácím důvěru k verzovacímu systému...

    Pak Vám také lidi budou více mluvit o programování a nebudou tolik řešit, jakou skvělou fintu mohou udělat s verzovacím nástrojem (což je, přiznejme si, lákavé, ale kontraproduktivní).

    Git má více commandů s více způsoby použití, což je pro učení náročnější.


    Popravdě nad Gitem i Hg vede v jednoduchosti Subversion, kterou jsou po školení schopni úspěšně používat i lidé na úřadě. Pro verzovaní a sdílení svých dokumentů. Ale Subversion zase není distribuovaná, což se při vývoji může vskutku hodit.

  • Git má špatnou podporu pro Windows

    Mercuriál je od začátku psaný, aby byl multiplatformní, zatímco Git byl napsán pro správu zdrojáků Linuxového jádra. Jeho podpora pro Windows je spíš dílem "bandy nadšenců" a je rozhodně na druhé koleji. Z toho pramení dost problémů s Gitem na Windows, které vskutku nejsou dílem náhody.

    Lidé zkrátka používají různé Operační systémy. A verzovací systém je musí plně podporovat. Zde Git pokulhává a Hg exceluje.

  • V podstatě není pravda, že by Git měl více funkcí než Mercurial

    Mercurial je totiž stále ve vývoji. Sice byly věci, které oproti Gitu neuměl, ale ve většině případů tam už byly dodělány.

    Spousta příkazů Gitu jsou na Windows mnohem pomalejší.

  • Github

    Github je skvělý a popravdě v současné době nejlepší. Je to hlavní, a z mého pohledu jediná, výhoda Gitu (protože Github umí jen Git). Nicméně třeba tokový Bitbucket je rovněž velmi dobrý, zlepšuje se a pochybuji, že by Vám nestačil.

  • Git je 15x pomalejší při práci přes http

    Při použití http protokolu je Git drasticky pomalejší než Mercurial. Zase musíte jít a nastavit Gitu, aby se použil jeho speciální protokol. Při použití gitového protokolu je pomalejší už jen o zanedbatelně málo. Takže zase jestli chcete řešit, proč je to pomalé, a chcete si dávat pozor na to, co jak kde nastavíte, vezměte si Git.

  • GUI nástroje pro Mercurial

    Pro Mercuriál existuje pěkný a především udržovaný a funkční GUI nástroj TortoiseHg. Pro Windows i Linux. (GUI existuje snad i pro Mac)

    Podpora v různých IDE je srovnatelná.

  • Mercurial dbá na zpětnou kompatibilitu.
  • Mercurial má krásně udělané pluginy.

Takový vtipný bonmot:
Proč se o Gitu hodně mluví? Protože ho skoro nikdo neumí pořádně používat a všichni řeší, jak udělat tohle a tamto, místo toho aby programovali. Kdežto Mercuriál prostě funguje, a tak jeho uživatelé nemají potřebu tlachat o tom, jak verzovat svůj kód.

Závěr

Git není špatný, ale proboha používejte Mercurial, protože s ním prostě verzujete.

pátek 3. srpna 2012

Java - Jak poznat, že adresa je localhost

Již několikrát jsem bojoval s tím, že jsem nebyl schopen rozumě poznat, že adresy "myComputer", "192.168.2.8" patří localhostu. Bylo to, když jsem potřeboval zjistit, že ten s kým komunikuji běží na stejném počítači.

Zdá se, že jsem náhodou konečně narazil na řešení, které se zdá být zatím funkční. Našel jsem ho na stackoverflow http://stackoverflow.com/questions/2406341/how-to-check-if-an-ip-address-is-the-local-host-on-a-multi-homed-system.

A vypadá takto:

import java.net.*;

public class Util {

    public static boolean isLocalhost(String address) {
        InetAddress addr = null;
        try {
            addr = InetAddress.getByName(address);
            if (addr.isAnyLocalAddress() || addr.isLoopbackAddress()) {
                return true;
            }
            // Check if the address is defined on any interface
            try {
                return NetworkInterface.getByInetAddress(addr) != null;
            } catch (SocketException e) {
                return false;
            }
        } catch (UnknownHostException e) {
            return false;
        }
    }
}