Math.floorOrig = Math.floor;
Math.floor = (n) => {
window.num = Math.floorOrig(n)
return window.num;
}
function getNum() {
const num = Math.floor(Math.random() * 10);
}
getNum();
console.log(window.num);
function getNum() {
const num = Math.floor(Math.random() * 10);
}
function getNum() {
return Math.floor(Math.random() * 10);
}
console.log(getNum());
Какие существуют общепринятые приемы для переключения языка на сайте?
Является ли нормой создание нескольких виртуальных хостов под каждый язык?
хотелось бы услышать мнение разработчиков с опытом что он думают на этот счетОк. Слушай сюда. Эта сфера - полное гавно. Как по деньгам, так и по перспективам.
зачем идти сейчас на 30 тыс если можно пойти в тот же макдак или полицию без особых знаний и ежесекундного обучения.Наконец-то до вас доходит, что вы не элита, а просто наемные батраки на средней зп с чудовищными требованиями отрасли к соискателю.
когда паралельно, в других сферах строительства , полиции , армии, и тд, зарплата без опыта ближе, а то и выше этих значенийтоже верно. Но знаешь, в чем прикол? Любой айтишник, поработавший в айти и успевший "повзрослеть" в рамках этой работы, уже НИКОГДА не попадет ни в полицию, ни в строительство. Допустим я - мне 38 долбанных лет и я в айти всю жизнь. Мне деваться некуда. Меня никто не возьмет, возраст под сорок, перспективы все закрыты. В полицаи или в стройку надо идти в 20+ лет. Так что и тут кроется западня - человек без должного ментовского или строительного образования, в возрасте и без соответствующего бэкграунда даже там никому нах не нужен будет.
условно говоря юниор средняя около 30-40к
Важно ли высшее образование в Data science и Machine learning?
в первом же случаи к этому времени у меня было бы около 6 лет опыта , но без диплома
const setup = {port:8000}
const express = require ('express');
const puppeteer = require('puppeteer');
const app = express ();
app.get('/', (req, res) => {
const url = req.query.url;
// вот тут Вы на каждый запрос создаете весьма тяжелую функцию
// в ней 203 AST ноды
// и она жрет в среднем 220КБ оперативы
// (node: 14.4.0; v8: 8.1.307.31-node.33, мерил через process.memoryUsage().heapUsed)
let scrape = async () => {
// а еще на каждый запрос запускам новый браузер
// у ноды это особо памяти не отнимет, а вот у системы - прилично
const browser = await puppeteer.launch({args: ['--no-sandbox']});
const page = await browser.newPage();
// еще и разрешаем запросу из браузера жить вечно
// если конечно сервак не оборвет коннект
await page.setDefaultNavigationTimeout(0);
await page.setUserAgent('Mozilla/5.0 (Linux; Android 7.0; NEM-L51) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.81 Mobile Safari/537.36');
await page.setViewport({width: 375, height: 812});
// куда мы отправляем браузер?
// переменная url у нас из req.query.url - а следовательно начинается с /
// то есть без хоста и протокола...
await page.goto(url);
// что-то мне подсказывает, что это работает не совсем так
// как Вы ожидаете
// https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageevaluatepagefunction-args
// читаем: If the function passed to the page.evaluate returns a non-Serializable value, then page.evaluate resolves to undefined
const bottomSheet = await page.evaluate(() => {
return document.querySelector('div[data-marker="bottom-sheet"]');
});
// так как undefined !== null данное условие всегда истинно
if (bottomSheet !== null) {
// здесь по идее придет Promise.reject который мы не ловим (об этом ниже)
await page.click('div[data-marker="bottom-sheet"] button');
}
// и еще раз... ловите доку на нужный метод:
// https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageselector
const phoneButton = await page.evaluate(() => {
return document.querySelector('a[data-marker="item-contact-bar/call"]');
});
// всегда ложное условие...
if (phoneButton === null) {
await browser.close();
return false; // ...с return внутри...
}
// еще 1 способ зависнуть (дефолтный таймаут 30 сек)
await page.waitForSelector('a[data-marker="item-contact-bar/call"]');
await page.click('a[data-marker="item-contact-bar/call"]');
try {
await page.waitForSelector('span[data-marker="phone-popup/phone-number"]');
} catch (e) {
await browser.close();
return false;
}
const result = await page.evaluate(() => {
console.log('phone', document.querySelector('span[data-marker="phone-popup/phone-number"]'));
return document.querySelector('span[data-marker="phone-popup/phone-number"]').innerHTML;
});
await browser.close();
return result;
};
// не ловим reject промиса
// и в случае reject не завершаем запрос
// и он тоже висит в памяти
scrape().then((value) => {
console.log(value);
if (value === false)
res.send(500);
// при value === false будет запись в закрытый поток... (или у express есть защита от дурака?)
res.send(value);
// абсолютно бесполезное действие...
scrape = null;
});
});
app.get('/test', (req, res) => {
res.send('Тест');
});
app.listen(setup.port, () => {
console.log('Сервер: порт %s - старт!', setup.port);
});