• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    XCHAOSANSI C/C99 (specifikace), GNU C (gcc, glibc), Tiny C (tcc) a POSIX - ne nutně C++,g++,libstdc++ nebo Win32 API
    /* Toto je klub především pro lidi, pro které je programování jednou z mnoha massive multiplayer online počítačových her, které lze hrát.
        V tomto klubu hrozí sémantická hereze a nezdravě vysoký obsah syntaktického cukru. Nevhodné pro algoritmické diabetiky.
        Od účastníků debaty se předpokládá automaticky přístup k instalovanému GNU C: sudo apt-get install build-essential
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    C (programovací jazyk)#C99 Heslo na české Wikipedii
    Jazyk C - Základy praktického programování V Praze 2oo7 pro SSPŠ Tomáš Harvie Mudruňka a kolektiv - jak si programování v C představuje většina lidí
    http://stevenkobes.com/ctest.html C Programming Puzzlers - nepouštějte se do flamewars v tomhle klubu, pokud neuhodnete aspoň polovinu správně!
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    http://en.wikipedia.org/wiki/C99 C99 is a modern dialect of the C programming language.
    http://cprogramminglanguage.net/ C programming language
    http://cprogramminglanguage.net/c-programming-language-tutorial.aspx C programming language - úvod
    http://en.wikipedia.org/wiki/Criticism_of_the_C_programming_language C makes it easy to shoot yourself in the foot. (ještě že ne do hlavy...)
    http://en.wikipedia.org/wiki/C_preprocessor
    http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html C99 makra s proměnným počtem argumentů - __VA_ARGS__
    http://gcc.gnu.org/onlinedocs/gcc/ GNU C Compiler
    http://gcc.gnu.org/onlinedocs/gcc-4.2.2/gcc/Optimize-Options.html
    http://bellard.org/tcc/ Tiny C Compiler - prý C99 compliant (min. umí __VA_ARGS__) - vhodný pro skriptování v C - umí #!/usr/bin/tcc -run
    http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest - pokud jste neviděli tohle, tak jste ještě neviděli opravdu nečitelný C zdroják
    http://bellard.org/otcc/ Obfuscated Tiny C Compiler - z tohohle vtípku vznikl Tiny C compiler
    http://en.wikipedia.org/wiki/ANSI_C Jak se střelit do nohy standardizovaným způsobem.
    http://eli-project.sourceforge.net/c_html/c.html ANSI C Specification
    http://www.lysator.liu.se/c/ Různý ANSI C bordel
    http://www.cs.rit.edu/~ats/books/ooc.pdf Object Oriented Programming with ANSI-C - a pak že to nejde
    http://en.wikipedia.org/wiki/Longjmp co jsou to setjmp()/longjmp() knihovní funkce (pro všechny, podle kterých to bez C++ try { } catch() ... nejde)
    http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/dcdc710c27f47c72 C neumí správně počítat (?)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    http://www.fastcgi.com/ FastCGI is simple because it is actually CGI with only a few extensions.
    http://www.metalshell.com/source_code/18/Mysql_Select.html How to do a simple connection and select with mysql
    http://xmlsoft.org/ The XML C parser and toolkit of Gnome
    http://curl.haxx.se/libcurl/ libcurl - the multiprotocol file transfer library
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    https://dev.arachne.cz/svn/cll1h SVN/Trac jazyka C<<1 (user-friendly nadstavba nad ANSI C99 - ve stylu JQuery vs. JavaScript)
    Benchmark iterace a serializace stringů v různých jazycích vs. v C
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        moderátor se velice zhruba řídí zvyklostmi moderace, která kdysi platila v řadě konferencí sítě FidoNet ... C != 0xdead */
    rozbalit záhlaví
    ALMAD
    ALMAD --- ---
    TENCOKACISTROMY: Samozrejme, ale o to tu preci jde, ne? Zajistilo to zrychleni pro jeden konkretni xchaosuv priklad.

    Nesnaz se tu prosim v tomto klubu zobecnovat. To neprojde ,)
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    XCHAOS: Ze napises nekam "=" ve smyslu prirazeni, jeste neznamena ze to je imperativni jazyk.
    Nicmene ano, napriklad u procedur se projevuje imperativ-like cast jazyka.

    Zrovna MySQL neni technologie, kterou bych znal nejak podrobne. Nicmene jsi si jistej, ze "ENGINE = MEMORY" zmeni algoritmicky pristup u dotazu? Nezrychlil jsis to treba tim, ze jsi eliminoval IO operace na disk?
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    _BENNY: Proto ma kazdy spravny muz nosit nuz, aby se mu ubranil!
    _BENNY
    _BENNY --- ---
    rekl bych ze je to tady uz asi 4 roky porad o tomtez - intuitivni reseni zpravidla nebyva to nejlepsi, i kdyz cloveka napadne samo ;)
    ISTEVE
    ISTEVE --- ---
    (Teda, doted jsem si myslel ze jsi ukladani session dat uvadel jako priklad tvyho michani kartama... ale kdyz ctu REDGUY, tak premejslim jestli nejde o nejakou novou unrelated prevratnou ideu ;) )
    REDGUY
    REDGUY --- ---
    XCHAOS: ale já jsem třeba imperativně řekl MySQL ǎt na tabulku použije ENGINE = MEMORY - no tak v prvni rade, MySQL je dost sracka. Za druhe, i u skutecnych databazi je nejake to ladeni potreba, i kdyz obvykle ne v tak brutalni podobe. Pokud cekas ze databaze _vsechno_ vymysli za tebe, jsi dost mimo. No a za treti, dost mozna je to prave ten priklad, ze pouzivas MySQL na neco, na co neni urcena a pak se nediv, ze to musis extra stelovat aby to jakz takz fungovalo. Cili tvoje l33t skillz s ENGINE=MEMORY zas tak nic nedokazujou.
    ISTEVE
    ISTEVE --- ---
    XCHAOS: To je picovina temer ze vsech perspektiv ze kterejch na to dokazu nahlizet, tak si to trochu projdem.

    Zakladni premisa toho co popisujes teda je, ze mas nejakej session key (v cookie/querystring/whatever), a chces vytahnout data co k tomu mas.

    Mas data krasne rozstrukturovany do tabulek, panu Coddovi by plesalo telo.srdce_id nadsenim. Delas join na (budme konzervativni) peti tabulkach. V ten moment je parsovani SQL min nez jen zanedbatelny, ponevadz:
    a) I kdyz mas index nad spravnejma klicema, stale je nutny udelat nekolik pruchodu stromem.
    b) V zavislosti na fyzicky reprezentaci muzes nebo nemusis delat dodatecny I/O na disk (nektery RDBMS vsechno nebo cast dat budou drzet primo v danym strome)
    c) Je nutny tohle udelat pro vsechny relevantni tabulky.
    d) Pokud nemas tohle vsechno v cache, tak te jen I/O zpusobeny cache miss stoji (v zavislosti na rozsahu cache miss) tolik co naparsovat tri tuny SQL (osobne bych hadal, ze parsery v sqlite/mysql/postgres by za tu dobu stihly naparsovat radove megabyty az desitky MB prumerne vzrostlejch SQL dotazu).


    ...samozrejme, pak je tu alternativa ze jsi prasopes a mas tam jen session id a serializovany data, ale pak jsi naprostej idiot ze to vubec do RDBMS cpes. :)

    REDGUY
    REDGUY --- ---
    XCHAOS: Nerozumim. Na co presne reagujes? A co tim chces rict?
    XCHAOS
    XCHAOS --- ---
    REDGUY: jde o to, že většinou ti webová aplikace neběží jen v jedné kopii... takže třeba jen jaký datový model zvolíš pro session data může být zásadní (když chceš ošetřovat třeba tisíce uživatelů přihlášených současně)
    XCHAOS
    XCHAOS --- ---
    TENCOKACISTROMY: dobře... ale já jsem třeba imperativně řekl MySQL ǎt na tabulku použije ENGINE = MEMORY ... a tím jsem výkon výrazně zvýšil. takže tvrdíš, že mám používat jen takovou SQL databázi,která si engine zvolí sama? a jak bude vědět, že zrovna u téhle tabulky mi nevadí ztráta dat při restarty SQL serveru, a u jiných jo?

    trochu imperativního přístupu k programování zkrátka neuškodí u jakéhokoliv paradigmatu
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    XCHAOS: Konkretneji: Jestlize ve svym projektu nevyuzijes schopnost databazoveho stroje patricne si sam zvolit jak se dotycny dotaz ma udelat (SQL je deklarativni, nikoliv imperativni jazyk) a vyhody, ktere ti to prinasi (neresis v ktery z dotycnych tabulek je kolik zaznamu a podle jakych indexu se ma dohledavat. nepotrebujes ani izolacni urovne transakci ci napriklad nepotrebujes ACID), a zaroven se ti vyplati resit takovy veci jako predkopilovany dotazy z SQL do C, tak by jsi mel pouzit nejaky jiny zpusob jak ukladat/nacitat data, a nemel by jsi pouzivat SQL databazi.
    REDGUY
    REDGUY --- ---
    XCHAOS: že se to tady začíná zvrhávat na diskuzi "proč není potřeba C". - wut? Kde prosim nekdo rika neco takoveho? Tj. obecne, bez nejakych kvantifikatoru? Ze by zase tvoje oblibene strawman fallacy? 8))

    do jaké míry je ENGINE = MEMORY v MySQL pomalejší či méně paměťově efektivní, než memcached - sorry, ale jestli tohle srovnani myslis vazne, tak zcela zjevne nevis o cem mluvis. memcached je hashtable na steroidech: strcis do nej klic, vypadne ti hromadka bitu. (My)SQL je relacni databaze: strcis do ni jednoduchy nebo slozity dotaz, vypadne ti strukturovanej vysledek. Jo, jasne, muzes pouzit (My)SQL misto memcached a pro typickej upatlanej blogovej server s dvema uzivatelema za odpoledne to bude fungovat. Ale to nic nemeni na tom ze to jsou dve sakra rozdilne veci. Sice obe ukladaji data, cilene pouziti je u kazde o necem jinem. Pokud je potrebujes porovnavat mezi sebou, znamena to, ze jedno nebo druhe (nebo oboje) pouzivas k necemu, k cemu to neni urcene.

    A porad bych rad slysel nejakej konkretni, real-world priklad kdy tvoje predparsovane sql prikazy budou michat kartama 8))
    XCHAOS
    XCHAOS --- ---
    REDGUY: mno, tedy přesněji, v mém případě bylo potřeba použít max_heap_table_size = 256M v my.cnf (default je asi 16 MB... každopádně se to zaplnilo skoro hned). zvýšení výkonu je dost citelné, na druhou stranu - asi by bylo zajímavé to srovnat s nativní datovou strukturou přímo ve sdílené paměti (což možná časem zkusím).

    no každopádně se mi nelíbí, že se to tady začíná zvrhávat na diskuzi "proč není potřeba C". zatím jsem minimálně dokázal, že není potřeba se srát s memcached :-) (tedy samozřejmě je otázka, do jaké míry je ENGINE = MEMORY v MySQL pomalejší či méně paměťově efektivní, než memcached - ale současně výhoda spočívající v unifikovanosti a možnosti použití složitých SQL konstrukcí je zřejmá (memcached nabízí v podstatě jen něco jako "hodně enviroment proměnných via socket").

    (ale jo... možná skončím u toho, že místo sraní se se složitou shared datovou strukturou použiju pro svojí příští libmysqlclient webovou aplikaci napsanou v céčku prostě jako rychlé úložiště dočasnou SQL tabulku forcnutou do paměti - a bude vymalováno - minimálně ten zdroják bude hodně blbuvzdorný a čitelný, což je ostatně i mým cílem...)

    TENCOKACISTROMY: to je tak obecné tvrzení, že vlastně nevím, co ti na to mám odpovědět, ani jestli odpovídáš na to, o čem mluvím :-)
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    XCHAOS: Jinymy slovy chces pouzit neco, co je mnoho a mnoho let vyvijeno a vypiplavano k nejakemu ucelu, s cilem pouzit to uplne k jinemu ucelu? Pak bych na tvym miste pouzil neco uplne jinyho a nesnazil se hackovat SQL databaze.
    REDGUY
    REDGUY --- ---
    XCHAOS: Ano, mam s tim zkusenosti. Funguje to.


    XCHAOS: vývoj podvratného free software. - coz porad neni ten konkretni real-world example kde tvuj dalsi genialni napad zamicha kartama. Proc konkretne myslis by tvoje myslenka prospela podvratnemu software?
    XCHAOS
    XCHAOS --- ---
    TENCOKACISTROMY: já chci jít přesně druhou cestou :) uznávám užitečnost SQL enginů - které dokážou balancovat, co má cenu cacheovat, i např. napříč více databázemi/uživateli a tedy i více aplikacemi - ale v jiných ohledech chci kompetence SQL serveru naopak omezit a přenést je zpět k programátorovi frontendu.

    prostě uznávám, že tam existuje ta hranice, a že je nesmyslné snažit se databázové servery vymýtit (asi jako je nesmysl se snažit vymýtit filesystém, ve jméne kompetencí aplikačních programátorů). ale současně - můžeš načíst z filesystému adresář tak, že ze zavoláš "ls *" - a nebo může použít opendir() a readdir() - nebo jak se tomu v POSIXu říká.

    (tahle metafora jasně vysvětluje, že si rád zahrávám s posouvíním hranic skriptování vs. interpretovaný procedurální jazyk vs. kompilovaný procedurální jazyk - podle mě to nemusí být až tak pevně dané hranice, jak je zvykem...)
    XCHAOS
    XCHAOS --- ---
    ISTEVE: jo, query plan v SQL a výběr optimální cesty v BGP - to jsou oboje dvoje věci, kvůli kterým připouštím, že by už stálo za to docházet včas na přednášky a cvičení na nějaké škole... :-)

    jinými slovy - jo. tohle je skutečně omezení každé prekompilace SQL dotazu. (leda bys měl tak správně oindexované tabulky, aby to bylo jednoznačné... což je věc, se kterou mi rozhodně baví hrát si... ale jsme tu už offtopic)
    XCHAOS
    XCHAOS --- ---
    REDGUY: vývoj podvratného free software. chápej - rád bych napsal něco aspoň tak podvratného, jako Bittorent :-)
    XCHAOS
    XCHAOS --- ---
    ha..... zajímavé... je to tu sice offtopic, ale když jsem nakousl prekompilaci SQL dotazů... máte někdo zkušenosti s tímto?
    MySQL :: MySQL 5.1 Reference Manual :: 14.9 The MEMORY Storage Engine
    http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html
    (teď mi padala jedna často přistupovaná tabulka, kerou bych po útěku z PHP / MySQL chtěl právě nahradit nějakým tím smget() udělátorem... přešel jsem z MyISAM na InnoDB, ale nevím)
    BLAMI
    BLAMI --- ---
    REDGUY: sorry, ale nemuzu jinak, musim to rict - je to navrh solarnich letadel. Jinde to proste kartama zamichat nemuze.
    ISTEVE
    ISTEVE --- ---
    A kdyz rikas "predkompilovane", co tim vlastne myslis?

    Predparsovany? To ti neprinese temer nic, tech par CPU cyklu je oproti pruchodu velkym datasetem (i kdyz by byl nakrasne v pameti) v podstate zanedbatelnej *). Doporucuju slidy od Jeffa Deana -- konkretne hledej slide s nadpisem "Numbers everyone should know". You should too.

    Predpripraveny i s konstantnim query planem? Query plan se ti typicky bude menit na zaklade dat co v db mas (kolik jich je atd.) a statistik pristup k nemu, ponevadz query plan kterej byl dobrej kdyz jsi mel sto radku bude dementni kdyz jsi mel deset milionu radku, a naopak (a plati to i pro min extremni pripady).

    Neco jinyho? Co?

    *) pokud nedelas while (true) { SELECT 1 FROM DUAL; } ;)
    Kliknutím sem můžete změnit nastavení reklam