reklama

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 - Ondřej Novák

Stran: [1] 2 3 ... 38
1
Řekl bych, že zápis jede přes cache, takže mezi procesem a systémem není žádná I/O a zápis vyřídí System z cache na disk. Pod procesem System se skrývá jakákoliv aktivita jádra, která je viditelná v userspace.

2
Vývoj / Re:signalr ručně - jak ho správně spustit?
« kdy: 20. 01. 2020, 17:04:59 »
Problém vyřešen.

Problém se ukázal v tom, že nezpracovávám cookies. A server si při /negotiate ke klientovi nastavoval cookie "AWSALB", která slouží load balanceru najít správnou instanci při /connect a /start. Takže to náhodně padalo, jak to došlo na různé instance.

Člověk si říká, že tohle by měl přece signalr řešit.

3
Vývoj / Re:signalr ručně - jak ho správně spustit?
« kdy: 20. 01. 2020, 13:21:03 »
Leda že bych se podíval, jak to dělají. Já potřebuju 5% funkcionality nejen samotného protokolu, ale podíl na celé aplikaci je zhruba asi tak malý. A nemám zájem slepovat můj projekt s něčím, co je 2x větší a má 95% kódu který řeší to co již mám vyřešeno jinak

4
Vývoj / signalr ručně - jak ho správně spustit?
« kdy: 17. 01. 2020, 12:15:30 »
Zdravím. Má tu někdo zkušenost s provozováním signalr klienta na nejnižší úrovni? Bohužel jsem musel implementovat klienta vlastními silami, protože to píšu v C++ pod linuxem a nějak jsem nesehnal vhodnou knihovnu pro můj případ. Potřebuju jen číst data ze streamu po websocketu, přesněji kótace na burze

Mám k dispozici HTTPs klienta a websocket klienta. Nemohu postovat kód, je hodně custom

Scénář
1. pošlu /negotiate
2. dostanu ConnectionToken {TOKEN}
3. otevřu websocket /connect?transport=webSockets&ConnectionToken={TOKEN}&clientProtocol=1.5
4. počkám na obdržení první frame
5. pošlu /start?transport=webSockets&ConnectionToken={TOKEN}&clientProtocol=1.5

Problém? Náhodně (v blocích) cca v 50% se mi nepodaří navázat spojení a napíše to, že mám neplatný ConnectionToken. Tato situace se třeba opakuje pět minut jak to můj software neustále po půl minutě zkouší. Pak to najednou naběhne a vše jede OK. Vzhledem k tomu, že klient pak drží spojení a je happy, nové navazování úž nepokouší, dokud to zase není třeba (spadne spojení nebo musím restartovat).

Hledám chybu ve svém kódu. Jak správně navazovat spojení a kdy přesně vyslat /start? Byl jsem dokonce tak zoufalý, že při selhání /start jej opakuju třeba 3x za sebou po prodlevě. Někdy se chytne až na potřetí což je po cca 10 sekundách. Možná že druhá strana je pomalá s navazováním, že tedy problém není na mé straně. Možná že mám něco hledat v odpovědi websocketu, že nyní je spojení navázáno a mohu ho spustit?

5
Server / Re:Maximální počet klientů vlastního TCP serveru
« kdy: 20. 12. 2019, 22:53:05 »
Jen dodám, že select() nedoporučuju používat v žádném případě. Ani na čekaní na jeden descriptor. Stačí, když descriptor má číslo větší než FD_SIZE a program jde do háje. Za určitých okolností se to dá zneužít, takže to zároveň představuje bezpečnostní riziko, například pokud je FD_SET realizován v zásobníku, může útočník způsobit buffer overrun a hacknout se do kódu.

 Když už, tak poll, pak samozřejmě epoll. Na příkaz select() zapomeňte a vyhejbejte se mu jak čert kříži.

6
Sítě / Re:Divně nefunkční IPv6
« kdy: 28. 11. 2019, 18:37:42 »
Vyřešeno.

Problém byl v systemd-resolved. Nenapadlo mne nic lepšího, než ho vypnout, a zadat do /etc/NetworkManager/NetworkManager.conf
 do sekce [main] řádek dns=default

https://askubuntu.com/questions/907246/how-to-disable-systemd-resolved-in-ubuntu

7
Sítě / Divně nefunkční IPv6
« kdy: 28. 11. 2019, 15:21:58 »
Zdravím. Snažím se v Ubuntu 18 LTS nakonfigurovat IPv6 přes Cloudflare Warp. V configu jsem si zapnul pouze IPv6  s tím, že IPv4 dál běhám napřímo (protože když v tom skriptu nechám IPv4, tak mi nejde internet vůbec)

Interface sice správně naběhne s IPv6 adresou, ale na chrome/firefox/curl/wget se stejně nepřipojí. Přitom:

Kód: [Vybrat]
$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether 20:1a:06:9b:c5:03 brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 0c:d2:92:b3:bf:0f brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.155/24 brd 192.168.100.255 scope global dynamic noprefixroute wlp3s0
       valid_lft 451sec preferred_lft 451sec
    inet6 fe80::d138:b521:1a04:f2b5/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
11: wgcf: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet6 2001:db8:ab1e:8cb0:d4fc:be3:9b16:bc68/128 scope global
       valid_lft forever preferred_lft forever
    inet6 fd01:5ca1:ab1e:8cb0:d4fc:be3:9b16:bc68/128 scope global
       valid_lft forever preferred_lft forever

$ host www.nebezi.cz
www.nebezi.cz has IPv6 address 2001:1528:132:70::ebe2

$ ping6 www.nebezi.cz
PING www.nebezi.cz(www.nebezi.cz (2001:1528:132:70::ebe2)) 56 data bytes
64 bytes from www.nebezi.cz (2001:1528:132:70::ebe2): icmp_seq=1 ttl=60 time=26.0 ms
^C
--- www.nebezi.cz ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 26.050/26.050/26.050/0.000 ms

$ traceroute6 www.nebezi.cz
traceroute to www.nebezi.cz (2001:1528:132:70::ebe2) from 2001:db8:ab1e:8cb0:d4fc:be3:9b16:bc68, 30 hops max, 24 byte packets
 1  fd01:5ca1:ab1e::1 (fd01:5ca1:ab1e::1)  20,167 ms  9,02 ms  12,569 ms
 2  2400:cb00:31:1000::1 (2400:cb00:31:1000::1)  50,738 ms  22,303 ms  17,724 ms
 3  nix4-ipv6.to.cas.ip-anywhere.net (2001:7f8:14::6:2)  14,405 ms  31,112 ms  20,865 ms
 4  2001:1528:1:10:3ee5:a6ff:fe27:3f00 (2001:1528:1:10:3ee5:a6ff:fe27:3f00)  11,096 ms  42,993 ms  10,048 ms
 5  www.nebezi.cz (2001:1528:132:70::ebe2)  11,936 ms  10,654 ms  25,253 ms

$ wget http://www.nebezi.cz
--2019-11-28 15:19:07--  http://www.nebezi.cz/
Překládám www.nebezi.cz (www.nebezi.cz)… nezdařilo se: Neznámé jméno nebo služba.
wget: adresu počítače „www.nebezi.cz“ nelze přeložit

$ curl http://www.nebezi.cz
curl: (6) Could not resolve host: www.nebezi.cz

Samozřejmě, když si vynutím použití IPv6 přes -6, tak se to připojí. Ale nějak bych radši, aby to fungovalo automaticky.

Kde je problém?

8
Vývoj / Re:JS async / await
« kdy: 10. 11. 2019, 22:50:10 »
Jak to souvisí s async/await? Není to snad záležitost té volané asynchroní funkce, jakou vyhodí výjimku? Může vyhodit cokoliv.

Pokud jde o dotaz "Chci někam vypsat to co mi nějaká API funkce vrátila jako odpověd, kterou, když ji zavolám přímo, vidím na obrazovce v prohlížeči", tak pokud tato odpověď je HTML stránka, pak nezbývá, než nažhavit HTML parser, načíst stránku jako dokument, a vytáhnout z document.body té stránky její innerText.

Mé řešení z jedné starší stránky, která ještě nepoužívá async ani await ani šipkové funkce vypadá takto. V proměnné "e" je chybové responze funkce fetch(). Zprávu hleda v elementu <p>, Pokud tam není, vezme celé <body>

Kód: [Vybrat]
var ct = e.headers.get("Content-Type");
if (ct == "text/html" || ct == "application/xhtml+xml") {
txt = e.text().then(function(text) {
var parser = new DOMParser();
var htmlDocument = parser.parseFromString(text, ct);
var el = htmlDocument.body.querySelector("p");
if (!el) el = htmlDocument.body;
return el.innerText;
});
} else {
txt = e.text();
}

9
Vývoj / Re:Jak vytvořit vlastní debugger?
« kdy: 02. 11. 2019, 16:28:45 »
Teda nevím, ale za dob, kdy jsem programoval v PHP jsem si vystačil s příkazem print_r a die. Bez debuggeru.

Zápis do log souboru je požehnaný debugovací nástroj.

10
Vývoj / Re:Použití příkazu GOTO v jazyku C
« kdy: 21. 08. 2019, 09:49:43 »
Nejznámější variantou goto je switch-case. Jinak v C++ je to složitější když v rámci skoku preskakuju inicializaci objektů - není to fakt dobrý nápad a týká se to i switch case. Naštěstí překladač to oznámí. Takže je fakt dobré sahat na goto až je to opravdu nutné

Pokud při skoku opouštím blok kde končí platnost některých proměnných, zavolají se destruktory - takže obyčejný JMP to není.

(Právě kvůli finalizaci mám rád koncept RAII - pak goto nepotřebuju)

11
Desktop / Tip na primitivní windows manager
« kdy: 05. 07. 2019, 22:31:53 »
Zdravím.

Sháním nějaký dobrý tip na velice jednoduchého window managera který bych nasazoval na vncserver. Kdysi jsem používal metacity, ale jeho integrace do unity je už tak velká, že mi občas nefunguje, nebo se chová divně, vypisuje tuny chybových hlášek o nepřístupnosti DBUS a tak dále, prostě to vypadá, na samostatné použití není. Navíc přepínání oken ALT+TAB moc na VNC nefunguje, protože to viewer neodchytí a přepínám okna na lokálním stroji.

Zkoušel jsem evilwm, ale na některých strojích dostávám hlášku o tom, že mu chybí nějaký font a nespustí se.

Nejspolehlivěji funguje twm, akorát ho považuju za vykopávku z dob, kdy jsem unix poprvé viděl někdy kolem roku 2000 na solarisech. Na twm oceňuji prostřední tlačítko myši, které přesune okno do pozadí (takže žádné ALT+TAB)

Takže něco takového, co ideálně stáhnu přes apt, a pak spustím ve stylu DISPLAY=:1 XXXwm &  a získám prostě nějakou kontrolu nad těmi okny.

Dík

12
Vývoj / Re:C++ konverze na const reference
« kdy: 12. 10. 2018, 17:47:35 »
Nepřijde mi, že dělám něco špatně. Zaprvé řeším nějaký problém. A samozřejmě, že bych to mohl napsat zdlouhavě a řešit to třeba v runtime, ale proč? Třeba jsem řešil to, jak používat lambda funkce a benefitovat z toho, že lambda funkce mají vnitřní stav. Ona s tím totiž standardní knihovna moc nepočítá, třeba při práci se std::function mi každá kopie vytváří i kopii vnitřního stavu. Ale s vnitřním stavem se počítá, protože máme přece klíčové slovo mutable.

 Nebo třeba že lambda funkce je vlastně objekt, ale nemá this.

Protože hodně používám různé callbacky a asynchroní volání, které je realizované lambdo, někdy kvůli vnitřnímu stavu musím místo lambdy napsat třídu, a to je zdlouhavé, kód se stěhuje na jiné místo a nepřehledné, není jasné, kudy kód pokračuje v asynchroním zpracování. Je to víc nepřehledné, než pochopit vnitřní stav. Snažil jsem se nějak řešit tento problém. A to proto, že jakkoliv se zeptam na stack overflow, končím pouze u začátečnických dotazů.


Za druhé, ano, neznám všechny zákoutí práce s param packy, protože třeba vím, že konverze lze napsat do kódu pokud funkci volám, ale nevěděl jsem, že to funguje i pokud definuju parametry funkce. Holt se musím učit.

Takže díky za tu diskuzi.

13
Vývoj / Re:C++ konverze na const reference
« kdy: 12. 10. 2018, 14:12:33 »
No já jsem si uvědomil, že je docela problém provést konverzi parameter packu. On ten parameter pack je docela oříšek. Trochu sem si s tím začal hrát tady

http://cpp.sh/26g5x

Příklad skončí kompilační chybou, to je záměr, protože součástí chyby je výsledek. Výsledkem je vygenerování funkce, kde jsou všechny typy vyžadovány s const T &, ačkoliv původní parameter pack to neměl. Je to primitivnější verze. Problém je totiž vlastní konverze a pak použití konvertovaného param paku na vygenerování prototypu funkce. V příkladu se to řeší tak, že se vygeneruje třída, která obdrží konvertovaný parameter pack a v ní je definovaná ta funkce, která se instanciuje v daném prototypu.

Ale že bych tohle někde viděl ve standardní knihovně? :) Vůbec hledal jsem co všechno se dá dělat s param.pakem a ... nic moc, všichni z toho hned dělají tuple. Jenže nenašel jsem, jak z tuple vyrobit prototyp funkce.

14
Vývoj / Re:C++ konverze na const reference
« kdy: 12. 10. 2018, 11:16:00 »
Šablona s param pakem není řešení. Uvědomuji si že jsem zapomněl zmínit že ta funkce bude nejspíš virtuální (typy argumentů obdrží trida, ve které bude definována)

Ale máš pravdu, mohu se na to vykašlat a nechat to na userovi, když to nedá jako referenci ať se mu to tam kopíruje (ale přijde mi to nefér vůči němu)

15
Vývoj / Re:C++ konverze na const reference
« kdy: 12. 10. 2018, 11:05:04 »
Decay je přesný opak

Dám jiný priklad

Kód: [Vybrat]
template<typename T>
void call(T &&fn)

...
call([=]{...})

Ačkoliv vse je podle učebnic a nejefektivnější perfekt forwarding, přesto dost často vidím funkci call specializovanou tak že se T předává hodnotou, což poznám na dvojnasobnem volání konstruktorů capturovanych hodnot.

Ale možná to je Bug v Gcc. Nemám po ruce reprezentativní priklad momentálně

Stran: [1] 2 3 ... 38

reklama