Задать вопрос
  • Как после изменения дизайна вернуть старый?

    @bossigorxxx
    Если у вас ярлык установлен на таскбаре снизу, нажмите на него правой кнопкой мыши и нажмите еще раз правой по "Google Chrome" и левой кнопкой "Свойства". В форме объект, После " " вставьте пробел и это --disable-features=CustomizeChromeSidePanel.
    Ответ написан
    1 комментарий
  • Как после изменения дизайна вернуть старый?

    Deita
    @Deita
    Теперь это называется Customize Chrome Side Panel
    Ответ написан
    3 комментария
  • Есть ли браузер без панелей навигации НЕ в полноэкранном режиме?

    @dzvladik
    У Arc browser скрывается панель навигации и все элементы управления: например
    Ответ написан
    4 комментария
  • Есть ли браузер без панелей навигации НЕ в полноэкранном режиме?

    @Refguser
    Решения для бизнеса: от создания ИМ до...
    Почти уверен, что можно это сделать поколдовав с FF.
    Ответ написан
    2 комментария
  • Как после изменения дизайна вернуть старый?

    @aleto
    Я поменяла здесь: chrome://flags/#enable-download-notification две строчки на "disabled" , вроде бы нормально получилось

    Chrome Refresh 2023. Enables the new desktop design.
    #chrome-refresh-2023

    Chrome WebUI Refresh 2023. Enables Chrome Refresh 2023 styles for various WebUI surfaces.
    #chrome-webui-refresh-2023
    Ответ написан
    3 комментария
  • Обновление reCaptcha без перезагрузки страницы, как?

    @burov0798 Автор вопроса
    Пытаюсь изучать php\js
    Решил проблему: grecaptcha.reset();
    Ответ написан
    Комментировать
  • Как запомнить авторизацию сайта на nodejs?

    @nicolaa Автор вопроса
    К сожалению решить данную задачу через nightmare не получилось
    Решил с помощью puppeteer

    Пример - сохранение кук в фаил

    const puppeteer = require('puppeteer')
    const fs = require('fs');
    
    (async () => {
      const browser = await puppeteer.launch()
      const page = await browser.newPage()
    
      await page.goto('https://github.com/login')
    
      await page.type('#login_field', process.env.GITHUB_USER)
      await page.type('#password', process.env.GITHUB_PWD)
    
      await page.waitForSelector('.js-cookie-consent-reject')
      await page.click('.js-cookie-consent-reject')
      await page.$eval('[name="commit"]', (elem) => elem.click())
      await page.waitForNavigation()
    
      const cookies = await page.cookies()
      const cookieJson = JSON.stringify(cookies)
    
      fs.writeFileSync('cookies.json', cookieJson)
    
      await browser.close()
    })()


    Чтение кук из файла
    const puppeteer = require('puppeteer')
    const fs = require('fs');
    
    (async () => {
      const browser = await puppeteer.launch()
      const page = await browser.newPage()
    
      const cookies = fs.readFileSync('cookies.json', 'utf8')
    
      const deserializedCookies = JSON.parse(cookies)
      await page.setCookie(...deserializedCookies)
    
      await page.goto(`https://github.com/${process.env.GITHUB_USER}`)
    
      await browser.close()
    })()

    Статья
    Ответ написан
    Комментировать
  • Как задать следующий вопрос chatGPT по API?

    neuotq
    @neuotq
    Прокрастинация
    Контекст вы должны сохранять, а передавать в следующем запросе через роли.
    Простое объяснение тут, пример оттуда:

    completion = openai.ChatCompletion.create(
      model="gpt-3.5-turbo", 
      messages = [
    # system - системная базовая роль, грубо говоря это сама база "Я" gpt
    {"role": "system", "content" : "You are ChatGPT, a large language model trained by OpenAI. Answer as concisely as possible.\nKnowledge cutoff: 2021-09-01\nCurrent date: 2023-03-02"},
    # user - роль юзера кто задаёт вопросы
    {"role": "user", "content" : "How are you?"},
    # Асистент одна из ролей, можно задать ранее в запросе, типа Act as bla blah
    # либо он поймёт что должен быть именно ассистентом смотрите оп ответу в API
    {"role": "assistant", "content" : "I am doing well"},
    # Снова юзер
    {"role": "user", "content" : "How long does light take to travel from the sun to the eart?"}]
    )


    Ну и примерно так строишь цепочку. Ну и да, ресурсо(читай денежно) пожирающе, а что делать. Значит приносить $$ должно больше чем тратится.
    Ответ написан
    Комментировать
  • Монетизация Android-приложений

    @papajohns
    всем привет, вижу, что ветка довольно старая, но все таки свои 5копеек вставлю.
    Я считаю, что два самых прибыльных метода монетизации- это продажа внутриигровой валюты и реклама. По своему опыту скажу, что монетизировать аппы через рекламу не есть самый простой вариант, но зато самый быстрый и прибыльный. Не самый простой в плане того, что надо очень грамотно подойти к вопросу выбора, как типа рекламы (баннер, интерстишл, видео), так и места в своем приложении в котором эту рекламу, собственно, показывать собираетесь. Это по сути самое важное, потому что если этого грамотно не сделать - можно нахватать кучу отказов в стате.
    Из рекламных сетей сразу же хотелось попробовать медиацию. Свою игру я запустил в январе и ориентируясь на отзывы подключил к ней Admob. Поначалу использовал только баннеры и рез-ты были не очень: в сред. 500К показов и всего $1K в месяц. Потом помимо баннеров стал использовать интерстишл и результаты заметно улучшились: в месяц уже выходило порядка $3,5-4000. По отзывам Admob вроде как считался крутой медиацией, но в июне я наткнулся на другой сервис -Appodeal. Захотелось их попробовать -потому что у них есть возможность использовать кучу сетей, да еще и подключить свой адмобский аккаунт- получается что-то вроде "медиации в медиации", так что при любом раскладе ты ничего не теряешь... отдельно хочется отметить их суппорт, который помог реализовать еще и показы видеорекламы в моей игре (rewarded video). Теперь по одним интерстишлам в месяц получается около 900К показов в месяц. В целом доход с моей игры за сентябрь составил $10.1K, так что выгода на мой взгляд очевидна:) Возможно в след году опробую еще какой-нибудь сервис, но пока достойной замены я не вижу.

    П.с если будут вопросы -не стесняйтесь, пишите в личку
    Всем удачной и прибыльной монетизации;)
    Ответ написан
    3 комментария
  • Что значат квадратные скобки без имени переменной?

    Это деструктуризация массива.
    Эквивалентно такому коду:
    $tmp = $options['ssl_key'];
    $ssl_key = $tmp[0];
    Ответ написан
    2 комментария
  • Что означает обратный слеш перед вызовом функции?

    syamskoy
    @syamskoy
    <?php
    
    namespace myNameSpace;
    
    function in_array($value, $arr)
    {
        return 'Local function';
    }
    $arr = [1, 2, 3];
    $value = 1;
    
    var_dump(in_array($value, $arr));
    var_dump(\in_array($value, $arr));

    Результат:
    string(14) "Local function"
    bool(true)


    Зачем это нужно? Только если в текущем пространстве имен объявленна одноименная функция как и в глобальном. И что бы обратиться к глобальной, используется слеш - глобальное пространство имен.
    Ответ написан
    Комментировать
  • Что за папка /root/mdb103/?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Сделай из под root

    lsof -n | grep root/mdb103

    при запущенной mariadb. Если найдёт запущенные процессы mariadb, использующие файлы в этом каталоге, значит да, файлы там нужны.

    В каталоге лежат deb-пакеты, они после установки не нужны. В подкаталоге лежат исходники сервера скомпилированные. В зависимости от того, как они установлены, они могут быть также не нужны. Если их ставили через make install без префикса в /root, то сервер должен, скорее всего, стоять в /usr/local. Если через сборку пакетов с помощью debian/rules (при этом готовые пакеты кладутся в вышестоящий каталог, что весьма логично), то тоже не нужны - они должны быть затем установлены в систему.

    В конце концов, необязательно файлы сразу удалять. Можно попробовать переименовать этот каталог, перезагрузить базу или даже весь сервер и убедиться, что всё работает.
    Ответ написан
    1 комментарий
  • Как раздавать уникальные записи таблицы во многопоточном парсере?

    @Akina
    Сетевой и системный админ, SQL-программист.
    parsed - 0 - страница еще не спаршена, 1 - страница спаршена.

    Не так.

    NULL - не парсилась.
    0 - парсинг выполнен.
    >0 - взято на парсинг соединением (функция CONNECTION_ID()) номер N.

    Соответственно попробовать зарезервировать запись на парсинг:
    UPDATE urls 
    SET parsed = CONNECTION_ID()
    WHERE parsed IS NULL
    ORDER BY datetime_added LIMIT 1;

    Получить зарезервированную запись и начать её парсинг:
    SELECT *
    FROM urls
    WHERE parsed = CONNECTION_ID();

    Если вернётся более одной записи - в системе большие проблемы, надо звать администратора задачи. Если пустой набор - значит, запись перехватили, пробуем резервировать заново (тоже, кстати, повод позвать админа задачи - так не должно быть). Иначе - парсим полученную запись.

    По окончании парсинга соответственно
    UPDATE urls 
    SET parsed = 0
    WHERE parsed = CONNECTION_ID();

    Ну и периодически выполняется event procedure, который находит записи, формально помеченные как обрабатываемые, но, судя по времени, обработчик подвис. Такие записи возвращаются на обработку
    CREATE EVENT clear_parsing_flag
    ON SCHEDULE EVERY 1 MINUTE
    DO
    UPDATE urls
    SET parsed = NULL
    WHERE parsed > 0
        -- считаем, что 5 минут более чем достаточно
      AND datetime_start_parsed < CURRENT_TIMESTAMP - INTERVAL 5 MINUTE;


    Само собой никаких пулов соединений, никаких открыть-закрыть - все операции выполняются в рамках одного persistent connection. Автовосстановление соединения при обрыве также запрещено.

    Если соединение развалилось, неважно по какой причине, бросаем обрабатываемую запись (шедулер вернёт её в необработанные), соединяемся заново и начинаем с самого начала, с резервирования.

    Ну и предусмотреть случай, когда записей на парсинг просто нет. Например, если 5 резервирований подряд не смогли получить запись на обработку, то, чтобы не ставить сервер раком, вводим между попытками резервирования задержку, например, на 5 секунд... ну и вываливаем баннер, что, походу, парсить нечего.
    Ответ написан
    Комментировать
  • Как раздавать уникальные записи таблицы во многопоточном парсере?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Никакие транзакции тут не нужны. транзакции вообще не про это. Почему-то новички упорно путают транзакции с блокировками. Транзакция - это про целостность данных. А чтобы два процесса не считали одну строку - это блокировка.
    Но явные блокировки тут тоже не нужны.

    Сначала забираем запись на себя
    update urls set proxy=proxy_id where done=null and proxy=null limit 1
    потом уже её селектим, работаем, и в конце отпускаем
    select * from urls where proxy=proxy_id
    ...
    Update urls set proxy=null, done=1 where proxy=proxy_id
    Ответ написан
    9 комментариев
  • Можете посоветовать текстовый редактор для сайта?

    inkShio
    @inkShio
    gist.github.com выбирай
    Ответ написан
    Комментировать
  • Как исправить ошибку при composer install ( SLL/TLS)?

    @andrewua85
    попробуйте следующее:

    composer config -g -- disable-tls true
    и повторно запустите свой композитор. Он работает со мной!

    Но это небезопасно и не рекомендуется для вашего сервера. Официальный сайт говорит:

    Если установлено значение true, все URL-адреса HTTPS будут проверяться с использованием HTTP вместо этого, и не будет выполнено шифрование на уровне сети. Включение этого является угрозой безопасности и НЕ рекомендуется. Лучше всего включить расширение php_openssl в php.ini.

    Если вы не хотите включать незащищенный слой на свой компьютер/сервер, тогда настройте свой php, чтобы включить openssl, и он также работает. Убедитесь, что расширение PHP Openssl установлено и включите его в файле php.ini.

    Чтобы включить OpenSSL, добавьте или найдите и раскомментируйте эту строку в файле php.ini:

    Linux/OSx:

    extension=php_openssl.so
    Окна:

    extension=php_openssl.dll
    При необходимости перезагрузите php-fpm/web-сервер!
    Ответ написан
    Комментировать
  • Из-за чего появляются Aborted connection 711903 to db: **** user: *** host: (Got an error reading communication packets) ???

    Smithson
    @Smithson
    20+ лет админю
    Начиная с MySQL 3.23.40 ошибка Aborted connection выдается только в случае, если mysqld запущен с --warnings.

    Такие ошибки сигнализируют об одной из следующих ситуаций:

    • Клиентская программа не выполнила mysql_close() перед выходом.
    • Клиент бездействовал на протяжении более чем wait_timeout или interactive_timeout (see section 4.5.6.4 SHOW VARIABLES).
    • Клиентская программа внезапно завершилась посреди передачи.


    www.mysql.ru/docs/man/Communication_errors.html
    Ответ написан
    Комментировать
  • Как посмотреть запросы на другие домены при открытии сайта в хроме?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    галка 3rd-party-requests

    еще лучше filter
    Ответ написан
    Комментировать
  • Как передать в nginx урл с символами &? из php используя X-Accel-Redirect?

    @dodo512
    Сначала просто добавляем префикс /internal_redirect/
    $url = '/internal_redirect/http://domain.com/?test=123&test2=234';
    
    header("X-Accel-Redirect: " . $url);


    Потом убираем этот префикс и добавляем всё что есть в $args.
    location ~ ^/internal_redirect/(?<url>.+) {
        internal;
        
        proxy_pass $url$is_args$args;
    }
    Ответ написан
    5 комментариев