Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Jakub Galgonek

Stran: [1] 2 3 ... 23
1
Vývoj / Re:Je utf8 univerzální?
« kdy: 04. 07. 2018, 21:39:41 »
UTF8 má rozsah 32 bitů a měly by tam být všechny Unicode znaky. Narazit lze leda v Javě, kde UTF8 má limit 16 bitů. To je ale vada Javy, ne UTF.

Máte to trochu pomíchané. Unicode je 21 bitový. Pokud použiteje k zapsání unikodu UTF-8, pak jeden unicode znak je kódován pomocí jednoho až čtyř bajtů (což plně pokryje těch 21 bitů). Pokud použijete UTF-16, pak jeden unicode znak je kódován pomocí jednoho až dvou 16 bitových hodnot (což opět pokryje plně těch 21 bitů). Java používá UTF-16 a není to vada :-)

2
Odkladiště / Re:Střední škola - matematický příklad
« kdy: 18. 06. 2016, 08:57:04 »
A vydělit třemi to určitě nestačí.

Protože čísla 3000 a 2001 jsou dělitelná třemi, stačí jejich rozdíl vydělit třemi a odečíst jedničku: (3000 - 2001) / 3 - 1

3
Čtu teď Mathematical methods in linguistics (Partee a spol.), jsem u logiky a není mi jasné, co to je "úplnost". Může mě někdo nakopnout správným směrem?

Tak to se podívej jako na první stopu kudy se vydat sem:
https://cs.wikipedia.org/wiki/G%C3%B6delovy_v%C4%9Bty_o_ne%C3%BAplnosti
Ber to jako směr kudy se vydat, ohledně neúplnosti. V žádném případě ten odkaz neber jako materiál ke studiu.

Věty o neúplnosti nejsou o úplnosti. Spíše se podívej sem: https://cs.wikipedia.org/wiki/G%C3%B6delova_v%C4%9Bta_o_%C3%BAplnosti_predik%C3%A1tov%C3%A9_logiky

4
Odkladiště / Re:Steam pre rodinu
« kdy: 17. 01. 2016, 22:41:27 »
Jo a krabicovka s Voobly běhá celkem v pohodě ve Wine, zatímco HD jsem takhle nerozchodil.

To mně zase HD verze běhá (až na drobnosti) pod wine bez problémů, stačilo winetricks steam.

5
Vývoj / Re:Vyplatí se učit C++?
« kdy: 29. 12. 2015, 11:50:54 »
V Javě s JDBC by stejný dotaz vypadal asi takto, s použitím try ... finally pro bezpečné zavření spojení:
Kód: [Vybrat]
Connection c = DriverManager.getConnection(db,jmeno,heslo);
try {
 PreparedStatement ps = c.prepareStatement("select jmeno,prijmeni from tabulka where rodnecislo=?");
 ps.setString(1, rodne_cislo);
 ResultSet rs = c.createStatement().executeQuery("select jmeno,prijmeni from tabulka where rodnecislo=?");
 if (rs.next())
 {
   jmeno = rs.getString(1);
   prijmeni = rs.getString(2);
 }
} finally {
 c.close();
}

Nebo nějak takto:
Kód: [Vybrat]
try (Connection c = DriverManager.getConnection(db,jmeno,heslo)) {
 try (PreparedStatement ps = c.prepareStatement("select jmeno,prijmeni from tabulka where rodnecislo=?")) {
   ps.setString(1, rodne_cislo);
   ResultSet rs = ps.executeQuery();
   if (rs.next()) {
     jmeno = rs.getString(1);
     prijmeni = rs.getString(2);
   }
  }
}

6
Studium a uplatnění / Re:Studium v zahraničí
« kdy: 11. 12. 2015, 14:47:24 »
Ano byl to problém, protože vyučující měl svoji představu, jak by to podle něho mělo vyjít a cokoliv jiného bylo špatně.

Ta historka na mne působila tak, že tohle byl spíše jen váš předpoklad. Nevím, má (idealistická) představa je spíše taková, že studentka měla jít na konzultaci a tam se měli pokusit s vyučujícím společně přijít na to, proč výsledky nevycházejí dle očekávání.

7
Studium a uplatnění / Re:Studium v zahraničí
« kdy: 11. 12. 2015, 14:07:10 »
Dělala to fakt poctivě, asi týden běhala po parku, zapisovala všechno do tabulek a nakonec jí to vyšlo uplně jinak

A byl by to problém?

8
Vývoj / Re:Runtime model jazyka Rust
« kdy: 07. 12. 2015, 01:17:51 »
Můžu např. do pub struktury v jednom cratu přidat nějaký člen, aniž bych musel rekompilovat nějaký jiný crat, který tu strukturu používá?

Souvisí ten dotaz s tím předchozím a hledáš náhradu za C++? Možná by tě mohlo zajímat Objective-C, tam přidání položky do třídy nenaruší ABI.

9
Vývoj / Re:Pro C++ experty.
« kdy: 04. 12. 2015, 21:52:25 »
V tom tvem pripade by to pak zvolilo spatny index do TVM no. Se prave snazim vymyslet, jak tohle resit jinak, nez podobnym zpusobem, jak si ukazoval. Ono to ale asi bez toho zdvojnasobeni poctu volani metod proste nepujde, jak uz jsem pochopil. To bude urcite hrozny vykonostni propad, kdyz se takhle budou vsechny argumenty vkladat na zasobnik dvakrat jakoby dvakrat - jednou pri volani te public metody a pak pri volani te privatni.

No, ještě by sis mohl udělat vlastní virtuální metody, ale to už by byl docela úlet :)

Kód: [Vybrat]
#include <iostream>

class A
{
  public:
    A();

  private:
    static void metoda1_impl(A* x);
    static void metoda2_impl(A* x);

    class A_table
    {
      public:
        void (*metoda1_ptr)(A* x);
        void (*metoda2_ptr)(A* x);
    };

  protected:
    A_table *A_tbl;

  public:
    inline void metoda1()
    {
        A_tbl->metoda1_ptr(this);
    }

    inline void metoda2()
    {
        A_tbl->metoda2_ptr(this);
    }
};



class B : public A
{
  public:
    B();

  private:
    static void metoda3_impl(B *);
    static void metoda2_impl(B *);  // nová implementace

    class B_table
    {
      public:
        void (*metoda3_ptr)(B *);
    };

  protected:
    B_table *B_tbl;

  public:
    inline void metoda3()
    {
        B_tbl->metoda3_ptr(this);
    }
};



A::A()
{
    A_tbl = new A_table;
    A_tbl->metoda1_ptr = &A::metoda1_impl;
    A_tbl->metoda2_ptr = &A::metoda2_impl;
}

void A::metoda1_impl(A* x)
{
    std::cout << "A::metoda1" << std::endl;
}

void A::metoda2_impl(A* x)
{
    std::cout << "A::metoda2" << std::endl;
}

B::B()
{
    B_tbl = new B_table;
    A_tbl->metoda2_ptr = (void (*)(A *)) &B::metoda2_impl;
    B_tbl->metoda3_ptr = &B::metoda3_impl;
}

void B::metoda3_impl(B* x)
{
    std::cout << "B::metoda3" << std::endl;
}

void B::metoda2_impl(B* x)
{
    std::cout << "B::metoda2" << std::endl;
}


int main()
{
    B *b = new B;
    b->metoda1();
    b->metoda2();
    b->metoda3();

    A *a = new A;
    a->metoda1();
    a->metoda2();

    a = b;
    a->metoda1();
    a->metoda2();
}

10
Vývoj / Re:Pro C++ experty.
« kdy: 04. 12. 2015, 19:53:21 »
Me se na tom nelibi prave uz to kopirovani tech metod, ze trida A musi mit defakto stejne rozhrani jako APrivate a vsechna volani jenom delegovat na tu privatni tridu. Je to vlastne i docela zhorseni vykonnosti, protoze se zdvojnasobi pocet volani metod.

Ale zase ti to umožní přidat do třídy A metody, aníž by to narušilo ABI. Jak totiž plánuješ řešit například situaci, že modul byl přeložen vůči tomuto rozhraní:

Kód: [Vybrat]
class A
{
  public:
    virtual void metoda1();
};

class B : public A
{
  public:
    virtual void metoda3();
};

Ale knihovna je novější a používá už takovéto nové rozhraní:

Kód: [Vybrat]
class A
{
  public:
    virtual void metoda1();
    virtual void metoda2();
};

class B : public A
{
  public:
    virtual void metoda3();
};

Protože pokud ten modul obsahuje například kód (new B)->metoda3(), tak při použití nové verze knihovny ti to zavolá A::metoda2(). Ona možná rozdílná velikost instance totiž nebude jediný problém.

11
Vývoj / Re:Pro C++ experty.
« kdy: 04. 12. 2015, 17:57:05 »
Na Qt už jsme koukal, ale to mi nevyhovuje, protože když potřebuju přidat nové rozhraní a rozhodnu se ten privátní typ podědit např. ještě z třídy Context, tak pak musím do té public třídy přidat všechny metody z toho rozhraní a ty metody budu delegovat na ten privátní typ. To je hrozný. Jako už chápu, proč se všechno dělá v Javě, protože C++ je OOP asi jako Java funkcionální.

Pokud by člověku nevadil dynamic_cast, tak by se tomu kopírování šlo vyhnout. Něco na způsob (je to jen nápad):

Privátní třídy:
Kód: [Vybrat]
class base_private
{
  public:
    virtual ~base_private() {}
};

class A_private : public virtual base_private
{
  private:
    int a,b;

  public:
    virtual void metoda1();
    virtual void metoda2();
};

class B_private : public virtual base_private
{
  private:
    int y,x;

  public:
    virtual void metoda3();
};

class C_private : public A_private, public B_private
{
};


Veřejné rozhraní:
Kód: [Vybrat]
class base
{
  protected:
    base_private *implementation;
    base(base_private *implementation) : implementation(implementation) {}
    ~base() { delete implementation; }
};

class A : public virtual base
{
  public:
    A();
    void metoda1();
    void metoda2();
};

class B : public virtual base
{
  public:
    B();
    void metoda3();
};

class C : public A, public B
{
  public:
    C();
};


Implementace do knihovny:
Kód: [Vybrat]
A::A() : base(new A_private())
{
}

void A::metoda1()
{
  (dynamic_cast<A_private*> (implementation))->metoda1();
}

void A::metoda2()
{
  (dynamic_cast<A_private*> (implementation))->metoda2();
}

B::B() : base(new B_private())
{
}

void B::metoda3()
{
  (dynamic_cast<B_private*> (implementation))->metoda3();
}

C::C() : base(new C_private())
{
}


Uživatel pak bude moci používat třídy přímočaře:
Kód: [Vybrat]
void use()
{
    C *c = new C();
    c->metoda3();
}

12
Vývoj / Re:Pro C++ experty.
« kdy: 04. 12. 2015, 17:24:18 »
V debugu to nepovoli ani pouzivat primo new, ani alokovat na stacku.

Jenže aktuálně ti to alokaci na stacku pořád umožní například přes implicitní copy kontruktor.

13
Vývoj / Re:Pro C++ experty.
« kdy: 04. 12. 2015, 16:45:54 »
To jsem mel poresene. V debug nastaveni (tzn. pri vyvoji) je new operator a konstruktory privatni, takze na stacku nikdo nic nevytvori, stejne tak nepouzije normalni new, ale musi pres makro, ktere se nahrazuje volanim metody ve tride, ktera je jako friend.

Hmm, ta knihovna teda ty konstruktory sice bude exportovat, ale přesto by neměly být používány. Takže uživatel dostane speciální makro, které bude při vývoji hlídat, zda to náhodou neudělal. No, pominu-li, že mi to přijde ulítlé, tak jen dodám, aby sis dal pozor na implicitní konstruktory, protože jejich volání jsi nezabránil.

14
Vývoj / Re:Pro C++ experty.
« kdy: 04. 12. 2015, 08:27:53 »
Nebude to fungovat třeba z toho důvodu, že default constructor je inline, takže se nevykoná v dynamické libce, ale u klienta. Správná velikost na správnou inicializaci objektu nestačí, musí být splněna celá řada další podmínek.

Hlavně i kdyby nějak vyřešil ten problém s new, tak pořád tu bude možnost, že uživatel knihovny bude chtít vytvořit instanci té třídy na zásobníku.

15
Distribuce / Re:Neskutečně pomalý boot
« kdy: 08. 10. 2015, 15:27:50 »
@vitekpin: Můžu zkusit, třeba nějaký starší ubuntu, to by snad mohlo nabootovat i s UEFI.

A co zkusit i legacy boot?

Stran: [1] 2 3 ... 23