- Sugárhajtómű ihlette a Zalman CPU-hűtőjét, de nem az üzemzaj tekintetében
- Gaming notebook topik
- NTFS, exFAT, FAT32 – Melyiket válaszd és miért?
- Vélemény: nem úgy tűnik, de Lip-Bu Tan most menti meg az Intelt
- Bambu Lab 3D nyomtatók
- Forrmell.enn
- OLED TV topic
- 3D nyomtatás
- Canon EOS DSLR topic
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
-
PROHARDVER!
JavaScript != Java (A JavaScript nem összekeverendő a Javával, két különböző programozási nyelvről van szó!)
Új hozzászólás Aktív témák
-
dqdb
nagyúr
válasz
Archttila #10112 üzenetére
Biztosan
https://www.dereferer.me/?https://example.com/
formátumú az URL és nincsen escape-elvehttps://www.dereferer.me/?https%3A%2F%2Fexample.com%2F
formában a .me végű címek esetében?A két regexet össze lehet vonni egybe:
^https?:\/\/(?:www\.)?dereferer\.(?:me|link)\/\?(.+:\/\/.+)
-
dqdb
nagyúr
válasz
hiperFizikus #9717 üzenetére
function dio(){
w = 42
}; //: func_
function alma(){
alert(w)
}; //: func_
dio() ; alma() ;Ha nem kerül a deklarációnál a neve elé
var
vagylet
, akkor globális lesz a változó. Egyúttal erre építeni egy nagyon rossz gyakorlat, mert a globális névteret úgy szemeteled tele, hogy ennek nem lesz nyoma a legfelső szinten. Szóval tessék csak rendesen globális változót gyártani, ha nem tudod megkerülni, hogy szükség legyen globális változóra. -
dqdb
nagyúr
válasz
hiperFizikus #9623 üzenetére
-
dqdb
nagyúr
válasz
hiperFizikus #9440 üzenetére
Ezek az operátorok léteznek Javascriptben.
-
dqdb
nagyúr
Egy XHR/fetch kérésben a szervernek felküldöd a kliens UTC időt, az válaszban visszaküldi a saját UTC idejét, te pedig a kliensen a két érték különbségét ofszetként figyelembe veszed minden dátummal kapcsolatos megjelenítésben (szerveroldali logikában persze kizárólag a szerver idejét használod).
-
dqdb
nagyúr
Alapvetően hibás, amit csinálni szeretnél. Persze mindenki valami hasonlót szeretne elérni, amikor először kell aszinkron hívást beépíteni az addig szinkron homokozójába, de ettől még nem így kell
1. az adatbázis-lekérdezés előtt letiltasz minden beviteli mezőt
2. a lekérdezés befejezésekor lefutó callbackben engedélyezed a mezőket
A módszer hátránya, hogy a letiltás látható változást hoz, ami gyors lefutás esetében zavaró villogást eredményezhet.1. az adatbázis-lekérdezés előtt az előtérbe hozol egy teljes oldalt lefedő 100%-os átlátszóságú
DIV
-et, ami az egéreseményeket blokkolja az oldalon található elemek elől, a billentyűzetről neked kell gondoskodnod a fókusz valahová áthelyezésével
2. a lekérdezés befejezésekor lefutó callbackben a háttérbe küldöd aDIV
-et
A módszer hátránya, hogy lassú lefutás esetében a felhasználó azt érzékeli, hogy "lefagyott" az oldal, mert akárhová klikkel, nem reagál1. az adatbázis-lekérdezés előtt ugyanazt csinálod, mint az előző megoldásban és
setTimeout
segítségével ~300 ms késleltetéssel (a pontos értéket neked kell kikísérletezni, hogy a felhasználónak ne villogjon feleslegesen a képernyő, de ne érezze azt sem, hogy "lefagyott" az oldal)
2. ha asetTimeout
callback fut le először, akkor előtérbe hozol egy másik teljes képernyősDIV
-et, ami részlegesen átlátszó és rajta szöveggel, hogy várjon a user
2. a lekérdezés befejezésekor lefutó callbackben tolsz egycancelTimeout
-ot, és a háttérbe küldöd mindkétDIV
-et -
dqdb
nagyúr
válasz
Hege1234 #8802 üzenetére
Egyes oldalak a kérésekben a böngésző által küldött
Accept-Language
alapján megpróbálnak okosak lenni. Annyit tudsz tenni, hogy a böngésző beállításainál az angolt állítod át preferált nyelvre, ha főleg angol tartalmakat keresel (persze ilyenkor meg a magyar nyelvű tartalmat próbálják meg az ilyen oldalak angolra fordítani ...).Ez a header arra lenne jó, hogy egy többnyelvű oldal igazodjon a látogató által preferált nyelvhez, de nem arra, hogy mindezt semmire sem jó gépi fordítással érjék el.
-
dqdb
nagyúr
Ajánlott előtte a
textToMark
tartalmának escape-elése, ha véletlenül regex számára speciális karaktert tartalmazna.var textToMark = "a*b*c";
var textContainer = "xxxx A*B*C yyyy a*b*c zzzz";
var escapeRegex = new RegExp(/[.*+?^${}()|[\]\\]/g, "g");
console.log(textToMark);
var textToMark = "(" + textToMark.replaceAll(escapeRegex, "\\$&") + ")";
console.log(textToMark);
var replaceRegex = new RegExp(textToMark, "gi");
console.log(textContainer);
textContainer = textContainer.replaceAll(replaceRegex, "<mark>$1</mark>")
console.log(textContainer); -
dqdb
nagyúr
-
dqdb
nagyúr
Ha az
[A, B]
intervallumot szeretnéd véletlen sorrendben felsorolni (mert amit leírtál, az nem véletlenszám-generálás, hanem véletlensorrend-generálás), akkor készíts egy tömböt[A, A+1, A+2, …, B-1, B]
elemekkel, egyA
-tólB
-ig vagyA
-tól(A+B+1)/2
-ig menő ciklussal cserélj ki két elemet, ahol a két sorrendet véletlenszám-generátorral határozod meg. A generálás pedig mehet a tömbbőlshift()
metódussal, amíg van benne valami.Másik lehetőség, hogy gyűjtöd egy listába az eddig kisorsolt számokat. Ha a lista hossza megegyezik a
B-A+1
értékkel, akkor nem tudsz visszaadni semmit sem, mert elfogytak a lehetőségek. Ha rövidebb a lista, akkor addig generálsz véletlen számot, amíg az nem lesz benne a listában. A visszaadott számot hozzáfűzöd a listához. A módszer hátránya a másikkal szemben, hogy induláskor igaz, hogyO(1)
időt igényelO(n)
helyett, de a generálás már legjobb esetben isO(n×log n)
leszO(1)
helyett. -
dqdb
nagyúr
-
dqdb
nagyúr
válasz
alratar #7904 üzenetére
function calcAmount() {
const hamburgerPrice = 1200;
const extra = parseInt(document.querySelector("input[name='extra']:checked").value);
const souce = parseInt(document.querySelector("select[name='souce']").value);
const quantity = parseInt(document.querySelector("input[name='quantity']").value);
document.querySelector("span[id='amount']").innerHtml = (hamburgerPrice + extra + souce) * quantity;
}Feltéve, ha jók a selectorok. Ilyenkor a legszerencsésebb megoldás legalább
console.log
hívásokkal naplózni minden értéket, ha debugolni nem akarsz. -
dqdb
nagyúr
válasz
Nagyzoli27 #7552 üzenetére
Array.from(
document.querySelectorAll(".adminbox_table_content_col_1"),
x => x.textContent) -
dqdb
nagyúr
A titkosítás teljesítményre gyakorolt hatását ketté kell bontani kapcsolatfelépítésre és a már felépített kapcsolaton keresztüli kommunikációra.
Egy TLS kapcsolatnál a felépítés költsége az igazán jelentős, ez hálózati oldalon egy extra RTT körből jön össze a protokoll miatt (a TLS1.3 és a neked ajánlott HTTP/2 rendelkezik zero-RTT opcióval, szóval ez eliminálható), CPU oldalon egy privát kulcsos műveletből, ami a kriptográfiai műveletek között messze a legdrágább.
Először lefuttattam egy Core i5-4590-en a kéznél levő őskövület, 2012-es OpenSSL 1.0.1c egy szálon futó sebességtesztjét:
sign verify sign/s verify/s
rsa 2048 bits 0.004417s 0.000136s 226.4 7361.3
rsa 4096 bits 0.032730s 0.000511s 30.6 1955.3Aztán beugrott, hogy azóta bekerülhetett AES-NI támogatás az OpenSSL-be és a CNG-be is (saját céges teszt volt RSA aláírás témakörben, azon az OpenSSL-t használó C kód és a CNG-t használó C# kód ugyanazt a teljesítményszintet nyújtotta), ezért fordítottam OpenSSL 1.1.1c-t, és lemértem azzal is:
sign verify sign/s verify/s
rsa 2048 bits 0.000616s 0.000029s 1623.4 33982.7
rsa 3072 bits 0.002859s 0.000060s 349.8 16806.2
rsa 4096 bits 0.006546s 0.000104s 152.8 9661.8Az előrelépés látványos, és a fenti processzor egyetlen szálon 1623 aláírást tud végrehajtani másodpercenként a most elterjedt 2048 bites kulccsal. Mivel ennek a kulcsméretnek várhatóan már csak pár éve van, hogy átcsússzon nem ajánlottba (bár addig még rengeteg, hogy határozottan kerülendő legyen), bekerült a 3072 és 4096 bites kulcsméret is, azokat is érdemes nézegetni, hogy mire lehet majd 8-10 éven belül számítani. Az ECC opciókat kihagytam, azok CPU erőforrásban a 2048 és 3072 bites RSA között vannak valahol korábbi céges tesztjeink alapján.
Ha már felépült a kapcsolat, akkor azon titkosítva mennek át az adatok, ez ma tipikusan AES128/AES256. Lássuk a teszteket (csak frissebb OpenSSL, itt 10% javulás volt csak a korábbihoz képest):
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
aes-128 cbc 138254.38k 146752.33k 153316.83k 148921.83k 151887.48k 151125.24k
aes-192 cbc 107198.00k 121410.13k 124547.81k 122201.29k 128566.72k 129934.99k
aes-256 cbc 97304.25k 107784.19k 107225.75k 105430.48k 106100.13k 104593.96kAzaz a ma elterjedt AES128-cal egyetlen szál 138 MB/s sebességre képes a gépemen, ebbe az általad megadott 15 MB/s sebességigény röhögve belefér, egyetlen átlagosan erősnek nevezhető CPU egyetlen szála 11%-os terheléssel kiszolgálja a létrejött TLS csatornán a titkosítást, ezt én elhanyagolható erőforrástöbbletnek nevezném. Az AES128 várhatóan még sokáig velünk lesz ajánlott formában, itt erőforrás szempontjából a jövőre nézve a legrosszabb eset az AES256-ra áttérés jelenti.
A fentiekből látható, hogy nem kell hatalmas szerverfarm ahhoz, hogy kiszolgálj 10000 kapcsolódást, elég egy szerver megfelelően sok maggal, de az is látható, hogy a HTTP Keep-Alive funkcióra egyszerűen kötelező építeni, mert ezzel a kapcsolatfelépítést tudod megspórolni, minden kéréshez külön TLS csatornát építeni drága hobbi és ahhoz tényleg kell az erőforrás (azonban mivel böngésző a túloldal, ezért ahhoz komolyan meg kell dolgozni, hogy kiiktasd azon az oldalon a keep alive-ot).
10000 tps-hez a szervert megfelelően össze kell rakni. Felejtsd el az async idők előttről itt ragadt HttpListener-t, az ASP.NET Core-ra építs IIS vagy Kestrel alapokon (és azonnal kapsz HTTP/2 támogatást), ahogyan martonx ajánlotta, vagy ha pehelysúlyra vágysz HTTP/2 nélkül, akkor ott a uHttpSharp. A kérések kiszolgálását kizárólag async kód végezze kihasználva az aszinkron futás lehetőségét az összes IO műveletnél, mert ilyen terhelés töredékénél is luxusnak számít az 1 worker thread/kérés működés (az általad írt 1 process/kérés pedig teljes mértékben az).
További olvasnivaló a témában itt.
-
dqdb
nagyúr
Igen, meglehetősen egyszerű volt megtalálni:
1. megnyitottam az oldalt, majd utána a Developer Tools-t a Ctrl+Shift+I megnyomásával, ott Network fül
2. gépeltem a mezőbe, és láthatóan nem volt hálózati forgalom, így egyértelművé vált, hogy a teljes lista lejön, nem a szervert használja a találatok szűkítéséhez
3. mivel az ilyen típusú adatokat általában külön fájlban szokták letölteni, ezért első tippre bekapcsoltam az XHR-re szűrést, és újratöltöttem az oldalt
4. megjelent a listában a productselector/ sor, így itt véget ért a keresgélés, nem kellett a sokkalta hosszabb JS listát végigbogarászni -
dqdb
nagyúr
válasz
Mr Dini #6321 üzenetére
Széllel szemben nehéz lesz
Az egész Node.js éppen az aszinkron működésre épít, így minden esetben, amikor nem aktívan dolgozol, hanem valami erőforrásra vagy eseményre vársz, legyen az hálózatról adat lekérése, fájl írása* vagy adatbázis-művelet, mindig egy callbackben kapod meg a végeredményt. Ennek az az oka, hogy a szinkron várakozás blokkol egy feldolgozószálat, és csökken a szerver feldolgozási képessége, míg aszinkron esetben az adott szál lazsálás helyett értelmes munkára is befogható, vagyis egy másik kérés feldolgozására. Most mondhatod, hogy de te ezt nem kérted, azonban azzal, hogy a Node.js alapon álltál neki, pont egy aszinkron, threadpool alapú hatékonyan skálázódó platformra esett a választásod, így vagy megszoksz, vagy megszöksz ...
Kókányolni
szerencséresajnos minden platformon lehet, így itt is, és valószínűleg ezt keresed (nem használtam soha, keresés dobta ki). De itt sem nem véletlenül kezdődik a leírás a Githubon elérhető legnagyobb betűméretű bekezdéssel, hogy miért ne használd ezt a libraryt.viszont gondolom node js-nél a CORS miatt nem megy
A CORS böngésző szintjén értelmezhető csak. A Node.js azért nem támogatja az XHR-t, mert saját API-ja van, nem a böngésző DOM modelljét másolja.* ebből kivételesen létezik szinkron API is, de ennek ellenére a aszinkron felület felé terelnek a hivatalos dokumentációban:
"In busy processes, the programmer is strongly encouraged to use the asynchronous versions of these calls."
-
dqdb
nagyúr
válasz
PumpkinSeed #5929 üzenetére
Nem a feltétel száll el, hanem az értékadás. Az pedig azért, mert a kétdimenziós tömbként kezelt freehours feltöltése nem történt meg megfelelően. Ezért a freehours[ i ][j]-ből a freehours[ i ] már undefined értékre fut, így az undefined[j] utasítás próbál meg lefutni, nyilván sikertelenül.
-
dqdb
nagyúr
válasz
fordfairlane #5902 üzenetére
Még while sem kell:
var Hatterek = listFiles("Hatterek", false).split("\n");
var number;if(Hatterek.length > 1) {
number = Math.floor(Math.random() * (Hatterek.length - 2) + 1);
if (number >= global('OldScrBcg')) {
number++;
}
} else if(Hatterek.length == 1) {
number = 1;
}if(number) {
setGlobal('OldScrBcg', number);
setWallpaper(Hatterek[number]);
} -
dqdb
nagyúr
válasz
pckownz #5850 üzenetére
HTML-ben és DOM-ban csak zavaró lehet (ugyanis engedi a szabvány), de CSS szintjén nem kezdődhet számmal egy class neve:
In CSS1, a class name could start with a digit (".55ft"), unless it was a dimension (".55in"). In CSS2, such classes are parsed as unknown dimensions (to allow for future additions of new units). To make ".55ft" a valid class, CSS2 requires the first digit to be escaped (".\35 5ft")
De például ékezetes karakterrel igen, így néz ki a nyelvtan és a lexer releváns része:
class
: '.' IDENT
;ident -?{nmstart}{nmchar}*
nmstart [_a-z]|{nonascii}|{escape}
nonascii [\240-\377]
escape {unicode}|\\[^\r\n\f0-9a-f]
unicode \\{h}{1,6}(\r\n|[ \t\r\n\f])?Ha itt a számot csak sorszámként használnád fel, és nem tartozna hozzá konkrét CSS szabály, akkor ennek a tárolására egy data-xxx attribútum szerencsésebb megoldás lenne (és erre még CSS szabályt/szelektort is lehetne írni).
-
dqdb
nagyúr
válasz
pckownz #5842 üzenetére
jQuery('.item.col-md-4.0').hide();
Kísérletezéskor kapcsold be Ctrl+Shift+J-vel a JS konzolt a böngészőben, hogy lásd a hibaüzeneteket. Így azonnal kibukott volna, hogy nem állítottad be JSFiddle-ben, hogy jQuery-t használnál. Ezt a JavaScript panel jobb felső sarkában a fogaskerékre kattintva tudod megtenni.
-
dqdb
nagyúr
válasz
trisztan94 #5812 üzenetére
Az átfogalmazásodból is hiányzik az azonos kiindulási és működési körülmények szöveg.
-
dqdb
nagyúr
válasz
tzimash #5649 üzenetére
var eredmeny=[];
Előre azt mondtad, hogy az eredmény 12 elemű tömb lesz, de nem írtál bele annyi elemet, így a maradék undefined értéket vett fel. A new Array() helyett inkább a sokkal tömörebb [] szintaktikát használd.
for(i=0;i<12;i++)
{
document.getElementById("tomb").innerHTML = tomb;
}Itt a for ciklusnak semmi értelme sincsen.
Szűrésre és egyéb tömbbel kapcsolatos műveletekre érdemes használni a JS filter/reduce/map feature-jeit, ha lehetőséged van rá, mert sokkal tömörebb és átláthatóbb kódot eredményez:
var eredmeny = tomb.filter(function(e) {
return e % 3 === 0;
});Csak akkor használd a == és != operátorokat, ha szükséges a konverzió, minden egyéb esetben a === és !== operátorokat használd.
Legyél konzekvens a központozásban, tedd ki mindig a space-eket az operátorok elé és mögé, valamint a sorok elejére a megfelelő behúzást.
for(n=0;n<12;n++)
if(tomb[n]%3==0)
{
eredmeny[j]=tomb[n];
j++;
}
document.getElementById("three").innerHTML = eredmeny;
}És kerüld az ilyen eseteket, mert első ránézésre azt hinné az ember, hogy az innerHTML módosítása is a for cikluson belül történik, ezért tedd ki a kapcsos zárójeleket:
for (n=0; n < 12; n++)
{
if (tomb[n] % 3 === 0)
{
eredmeny[j] = tomb[n];
j++;
}
}
document.getElementById("three").innerHTML = eredmeny;Vagy a JavaScript szokások szerint írva:
for (n=0; n < 12; n++) {
if (tomb[n] % 3 === 0) {
eredmeny[j] = tomb[n];
j++;
}
}
document.getElementById("three").innerHTML = eredmeny; -
dqdb
nagyúr
válasz
Sk8erPeter #5505 üzenetére
Akkor íme egy Chrome/Opera extension kettőtök kutatása alapján egy kicsit kulturáltabb injektálási módszerrel.
manifest.json
{
"content_scripts":
[
{
"matches": [ "http://mno.hu/*", "https://mno.hu/*" ],
"js": [ "content.js" ],
"run_at": "document_start"
}
],
"web_accessible_resources":
[
"patch.js"
],
"manifest_version": 2,
"name": "setTimeout patch",
"version": "1.0.0"
}patch.js
Window.prototype._setTimeout = Window.prototype.setTimeout;
Window.prototype.setTimeout = function(func, delay) {
if (func.toString().indexOf("reloadBlocker") !== -1)
console.log('blocked setInterval', delay);
else
Window.prototype._setTimeout.apply(this, arguments);
};content.js
try {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.responseText) {
var patch = document.createElement("script");
patch.type = "text/javascript";
patch.innerText = xhr.responseText;
(document.head || document.documentElement).appendChild(patch);
}
};
xhr.open("GET", chrome.extension.getURL("patch.js"), true);
xhr.send(null);
}
catch (ex) {
console.log(ex);
}Vagy Firefox alá Greasemonkey scriptként:
// ==UserScript==
// @name setTimeout patch
// @namespace mno.hu
// @include http://mno.hu/*
// @include https://mno.hu/*
// @version 1
// @run-at document-start
// @grant none
// ==/UserScript==
window._setTimeout = window.setTimeout;
window.setTimeout = function(func, delay) {
if (func.toString().indexOf("reloadBlocker") !== -1)
console.log('blocked setInterval', delay);
else
window._setTimeout.apply(window, arguments);
};Érdekes módon itt csak a window példányt tudtam manipulálni, és abban lecserélni a metódust, magát a Window osztályt nem, hogy a prototípusban cserélgessek.
Természetesen nem vártam ki a 20 percet, a naplóba írt üzenettel teszteltem a kódot.
-
dqdb
nagyúr
A kódot tartalmazó .js fájl blokkolása valószínűleg nem lesz jó, mert más funkciót is kinyírhatsz vele. Neked egy olyan user JS vagy extension kell (böngészőtől függ, melyik), ami document_start vagy DOMContentLoaded eseménykor (böngészőtől függ, melyik) lefut, és lecseréli a window.setTimeout vagy window.setInterval függvényeket (a weboldaltól függ, melyiket használja). De ezt is ésszel kell tenni, hogy tényleg csak azt a kérést blokkold, amelyik az újratöltésért felelős.
Most lusta vagyok összedobni egy pontosan ilyet, de íme egy Chrome/Opera extension, aminek hatására a böngésző letagadja, hogy tud WebM videót lejátszani, kiindulási pontnak tökéletes:
manifest.json
{
"content_scripts":
[
{
"matches": [ "http://*/*", "https://*/*" ],
"js": [ "content.js" ],
"run_at": "document_start"
}
],
"manifest_version": 2,
"name": "Test Script",
"version": "1.0.1"
}content.js
var patch = document.createElement("script");
patch.type = "text/javascript";
patch.innerText =
"HTMLVideoElement.prototype.canPlayType = function(type) { console.log('HTML5 video', type); return type.substr(0, 10) === 'video/webm' ? '' : this._canPlayType(type); };";
(document.head || document.documentElement).appendChild(patch); -
dqdb
nagyúr
válasz
PumpkinSeed #5394 üzenetére
Az obj.value szándékosan van aposztrófok között? Mert ha nem, akkor az sok mindent megmagyarázna, és ekkor már csak egy negálás hiányzik:
valid = !/[\(\)\<\>\,\;\:\\\"\[\]]/.test(obj.value);
-
dqdb
nagyúr
válasz
inf3rno #5373 üzenetére
Virtualizált Androiddal nem foglalkoztam még. Az évek során Windows hostokról (XP, Vista, 7, 8.1) adtam már át Linux (Ubuntu, Xubuntu, CentOS, Manjaro) és Windows (XP, 7, 8.1, 10, 2012 Server) guesteknek USB-s perifériákat (webkamera, fényképezőgép, tuner, kriptotoken).
A periféria sikeres átadásának természetesen feltétele, hogy a guest rendszerben legyen hozzá driver, az Android guest itt nagyon hamar el tud bukni, mert simán elképzelhető, hogy a kernelbe nincsen belefordítva a szükséges driver (ezen csak saját kernel fordításával tudsz továbblépni). Az ellenben nem feltétel, hogy a hoston legyen hozzá a VMware úgy is át tudja adni (például egy őskövület fényképezőgépről, amelyhez nincsen 32 bites XP-nél frissebb driver, virtualizált Linuxon keresztül tudom letölteni a képeket).
De eddig WinJS-ről volt szó, annak mi köze az Androidhoz?
-
dqdb
nagyúr
válasz
inf3rno #5358 üzenetére
Rendelsz Kínából USB-s BT4.0 adaptert (bár itthon sem sokkal drágább), azután VMware Playerben telepítesz Windows 8-at, és ott át tudod adni* neki az USB-s eszközt. Ha van elegendő mennyiségű memóriád és megfelelő processzorod, akkor a legkényelmesebb VM alól végignyomni a teljes fejlesztést.
* elvileg ilyet a VirtualBox is tud, csak kölcsönösen nem kedveljük egymást, így olyan messzire kerülöm, amilyen messze lehet
-
dqdb
nagyúr
válasz
martonx #5344 üzenetére
Az SSD valószínűleg elfedi a memóriahiány miatti vergődést (én 4 GB memória mellett kizárólag HDD-n próbáltam). 4 GB-tal sokkal lassabban indul a VS2013, mint egy VS2010, sokkal lassabban tölt be 30-40 projektes solutionöket, és vannak olyan editorok, amelyek használatához a vergődés miatt ekkor fokozott türelem kell (a XAML például ilyen), szóval a lassúság érzete lehet projekttípustól függő is. Én ezért aztán reflexből 8 GB memóriát adtam legutoljára a VM-nek, amikor ki kellett deríteni egy OS specifikus nyűgöt, és szükség volt adott platformon ehhez fejlesztői környezetre
A TFS-es rész innen vettem, VS2015-ben szigorítottak rajta (bár ez engem az otthoni gépen nem fog érinteni, nem kedvelem a beépülő verziókezelőket, ha SVN és Git repóid vannak, akkor funkcionalitásban és megbízhatóságban a SmartSVN és SmartGit közelében sincsen egyik sem).
-
dqdb
nagyúr
válasz
PumpkinSeed #5342 üzenetére
A VS2010 volt az utolsó Visual Studio, amelyik még beérte 4 GB memóriával. Ezután alaposan hozzányúltak az IDE alapjaihoz, ami azt eredményezte, hogy 8 GB alatt kínszenvedés használni, de ha van ennyi memóriád, akkor a VS2012 és utódai érezhetően sokkal-sokkal gyorsabbak ugyanazon a gépen, mint a VS2010.
A Community Edition pedig lényegében egy Professionalnek felel meg némi tudásbeli (nincsen TFS, CodeLens) és némi licencbeli (egyéni fejlesztők és legfeljebb 5 fős cégek használhatják) korlátozással.
-
dqdb
nagyúr
válasz
Sk8erPeter #5168 üzenetére
adott esetben elég problémás bugról van szó egy éles projektnél, akkor azt nem jó ellökdösni, hogy majd megcsinálom, mert akkor elfelejtődhet
Nem, ilyen nem fordul elő sosem, mert ugyebár mindenre van egyXKCDtestcaseÉs erről jutott eszembe: valaki belemélyedt már jobban a kliensoldali automatizált tesztelésbe? Vajon mekkora beletanulási ideje lehet egy Jasmine+PhantomJS párosnak? A többi rész után szeretném a webes UI tesztelését is automatizálni, a kollégákkal ellentétben a Jenkins mindig ráér foglalkozni vele, és alaposan dolgozik
-
dqdb
nagyúr
Azt azért hozzá kell tenni, hogy natív kódot tartalmazó csomag esetén előfordulhat, hogy Node.js-sel megy, míg io.js alatt fordítási hibát kapsz a telepítésekor (a frissebb V8-ben változott valamelyik API felülete, és még nem frissítették a csomagot).
Ne kérdezd, hogy melyik csomaggal volt problémám, mert arra már sajnos nem emlékszem. Pár hete futottam bele, amikor (nem webfejlesztőként) egy konkrét feladatra eléggé határozott elképzelésekkel kerestem a projekt alapjának összerakásához generátort vagy boilerplate kódot.
-
dqdb
nagyúr
válasz
Sk8erPeter #4845 üzenetére
Igen, pontosan ez volt a javaslatom mögötti ötlet.
-
dqdb
nagyúr
válasz
Sk8erPeter #4837 üzenetére
Szerintem a topik címét kellene módosítani JavaScript/ECMAScript topikra, az ES megnevezés jelenléte eléggé jó szűrő lenne.
-
dqdb
nagyúr
válasz
nova001 #4698 üzenetére
Ha ennyire nem vagy járatos a témában, hogy a jquery-mockjax leírásában is elvesztél, akkor inkább telepítsél egy webszervert, létezik portable megoldás is rá. Vagy használj olyan böngészőt, amelyik file:// protokollnál XHR esetében még nem szigorított a source origin policy-n. A Chromium alapú böngészők kizárólag extensionökben engedélyezik a file:// címekre az XHR hívásokat, de ez se nem hiba, se nem hiányosság, hanem biztonsági-tervezési döntés: itt a 4.6.1.3 pontban kezdődik, és itt a 4.4 pontban folytatódik a kifejtése.
Jim-Y: ráadásul a DevTools tudása bővíthető extensionök segítségével.
-
dqdb
nagyúr
válasz
nova001 #4696 üzenetére
A megoldás egyszerű: felülírod az oldalon a beépített XMLHttpRequest objektumot, legalábbis annak a send() metódusát. Itt van rá egy példa, de léteznek XHR mockup könyvtárak is, ahogyan az általad is említett jasmine-ajax is alkalmas lehet erre.
De ha ennyire offline kell működnie az oldalnak, akkor miért a jquery.com-ról töltöd be a jQuery-t, és nem helyi fájlból?
-
dqdb
nagyúr
Ha nullával kezdesz egy kizárólag számjegyekből álló numeric literalt, akkor az JS-ben (és egyéb C-szerű szintaktikából eredeztetett nyelvekben) azt jelenti, hogy nyolcas számrendszerben adtad meg az értéket. Mivel nyolcas számrendszer, így abban csak a 0-7 számjegyek érvényesek, a 9 nem.
27= 0x1b = 033
Szóval szépérzéktől vezéreltetve ne írd ki a kezdő nullákat sosem, mert csúnya meglepetések érhetnek miatta.
month: Integer value representing the month, beginning with 0 for January to 11 for December. [link]
Kíváncsi lennék, ki volt az az idióta, aki ezt ilyenre kitalálta, és miért tette. De igazából az egész Date objektum egy állatorvosi ló a mit ne típusú JavaScript programozói hibák szemléletes bemutatására. -
dqdb
nagyúr
válasz
Speeedfire #4580 üzenetére
Ha dátumról van szó szövegesen, akkor mindig az ISO 8601 formátummal próbálkozzál, a legkevesebb nyűg valószínűleg azzal lesz. ECMAScript 3-ban nem volt szabványosítva a mező formátuma, ECMAScript 5-ben egyértelműen szerepel az ISO 8601 támogatás szükségessége. A legtöbb böngésző történelmi okok miatt az MDN-en szereplő RFC2822 formátumot is támogatja, de ezenkívül bármi más esetében már érhet meglepetés.
-
dqdb
nagyúr
For ciklusban az általad használt módon nem illik az innerHTML-hez hozzáadni tartalmat, ugyanis ilyenkor minden alkalommal a böngésző változást észlelve újrarendereli az oldalt. Egy változóba gyűjtsd össze a teljes változást, és egyszer nyúlj hozzá az innerHTML-hez. Szintén nem illik for ciklusban a DOM-ból lekérdezni állandóan egy objektumot, amikor azt a ciklus előtt cache-elhetted volna egy változóba.
function f()
{
var min = parseInt(document.getElementById("min").value);
var max = parseInt(document.getElementById("max").value);
var s = "";
var paddingLength = -max.length;
var paddingString = new Array(-paddingLength).join("0");
for (; min <= max; min++)
s += (paddingString + min).slice(paddingLength) + " | ";
document.getElementById("box").innerHTML = s;
} -
dqdb
nagyúr
válasz
honda 1993 #4349 üzenetére
Javascript-el meg lehet irni hozza a tobbit? (tehat hogy ne csak ott legyenn az oldalamon, hanem mukdjon is.)
Vagy ezt csak php val lehet?
Meg lehet JS-ben is írni, ha a szerveren NodeJS fut, és te abban valósítod meg a rendszeredet, de te valószínűleg nem erre gondoltál. A megoldás lehet PHP, Ruby, Python, ASP.NET vagy bármilyen szerveroldali megoldás, az a lényeg, hogy ehhez nem elég a kliensre letöltődő HTML + JS, hanem kell egy kiszolgáló és rajta futó logika.Nem tudom hogy a"kijelentkezest hogy lehet megirni. Vagy ez csak akkor fog latszani ha javascriptel vagy phpval megirom hozza a tobbit?
Session alapú megoldás kell neked, esetleg REST implementációnál ticketek használata. De úgy érzem, mindkettőtől még nagyon messze állsz, előbb a kliensoldali JS-tel kellene képbe kerülnöd, és látni, mi a kliens feladata, mi a szerver feladata, mi fut a kliensen, mi fut a szerveren, a kettő hogyan kommunikál.Sk8erPeter: csak 15 perc, mert egy másik feladványra elkészült előtte egy hasonló stílusú Ascii85 megoldásom, és azt donornak felhasználtam. Jó móka volt az egész, és úgy éreztem, a végeredmény kellően sokkoló lett első pillantásra ahhoz, hogy egy uglifieren ne küldjem még keresztül a kódot
-
dqdb
nagyúr
válasz
Sk8erPeter #4315 üzenetére
Nagyon jó móka, és kiválóan alkalmas a kevés szabadidőd elszúrására
Röviden arról van szó, hogy valaki kitalál egy feladványt, megírja hozzá a unit testeket, és neked olyan kódot kell írni, ami átmegy a teszteken (természetesen a teszteket, valamint mások megoldásait csak azután ismered meg, miután megoldottad a feladatot).
Érdemes megnézni mások megoldásait, lehet belőlük tanulni. És persze hirtelen ötlettől vezérelve, pusztán szórakozásból lehet alkotni tömör, de lassú és erőforrás-pocsékoló, tökéletesen karbantarthatatlan kódot, mint a for ciklustól mentes Base64 megoldásom
-
-
dqdb
nagyúr
Nem asszociatív tömböt hozol létre, hanem egy objektumot propertykkel, és nem a space-szel és ékezetes karakterekkel van a probléma, ugyanis JS-ben egy property neve megkötések nélkül lehet bármilyen szám vagy szöveg, hanem azzal, hogy elfelejted a kategória szintjét inicializálni.
Ha 10-20 elemnél többet küldesz le a szerverről, akkor azt érdemes kategória-alkategória szerint rendezve megtenni, ekkor a legutoljára használt kategória és alkategória cache-elésével sokkal gyorsabban fel tudod építeni a kétszintű fát.
-
dqdb
nagyúr
Opera 12-ben pont az a leggyorsabb
getElementById 2,753,807
querySelector 249,225
getElementsByClassName 1,654,260
querySelectorAll 3,278,591
jQuery - id 849,313
jQuery - class 160,468Opera 25 (más Blink motoros böngészőben hasonlóak lehetnek az értékek):
getElementById 16,966,523
querySelector 6,662,027
getElementsByClassName 15,028,808
querySelectorAll 284,449
jQuery - id 1,267,419
jQuery - class 333,583Szóval bár Cathfaern magyarázata szerintem teljesen logikusnak tűnik, a számok alapján egyszerű optimalizálatlanság lehet a háttérben. Az igazán érdekes számomra az, hogy a többi megoldásnál látható hatalmas különbségek jQuery használatával mennyire eltűnnek.
Új hozzászólás Aktív témák
Hirdetés
- Filmvilág
- Villanyszerelés
- Autós topik
- Sugárhajtómű ihlette a Zalman CPU-hűtőjét, de nem az üzemzaj tekintetében
- Gaming notebook topik
- E-roller topik
- NTFS, exFAT, FAT32 – Melyiket válaszd és miért?
- The Crew sorozat
- RC modell földön, vízen, levegőben
- Motorolaj, hajtóműolaj, hűtőfolyadék, adalékok és szűrők topikja
- További aktív témák...
- Intel Core i7 6700K / GTX 1660TI / 16GB DDR4 RAM / 500 GB SSD konfig eladó
- Samsung Galaxy S23 128GB, Kártyafüggetlen, 1 Év Garanciával
- Samsung Galaxy A53 5G 128GB, Kártyafüggetlen, 1 Év Garanciával
- Megkímélt állapotú Xbox Series X 1TB eladó. Kitisztítva és újrapasztázva!
- Gamer PC - i5 13400F, GTX 1080ti és 16gb DDR5
- Telefon felvásárlás!! Samsung Galaxy A50/Samsung Galaxy A51/Samsung Galaxy A52/Samsung Galaxy A53
- BESZÁMÍTÁS! MSI Z370 i5 9500 16GB DDR4 512GB SSD RX6600 8GB Cooler Master MB510L Chieftec 500W
- 0% THM 3 havi részlet! Beszámítás, 27% áfa, Sapphire Nitro+ RX 9070XT 16GB készletről
- ÁRGARANCIA!Épített KomPhone i9 14900KF 32/64GB RAM RX 9070 XT 16GB GAMER PC termékbeszámítással
- 121 - Lenovo Legion Pro 5 (16ARX8) - AMD Ryzen 7 7745HX, RTX 4070 (48 hónap garancia!)
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest