• Есть ли разница SELECT * FROM `bd` WHERE `id` = '$id' и SELECT * FROM `bd` с поиском через цикл?

    BasiC2k
    @BasiC2k
    .NET developer (open to job offers)
    Брать из таблицы все данные, чтобы найти нужное значение циклом - это плохой подход.
    А если записей будет миллион, представляете, сколько времени займёт передача данных из БД и переборка их в цикле. Я уже не говорю про потребеление памяти.
    Посмотрите примеры подготавливаемых запросов например здесь
    Ответ написан
    Комментировать
  • Написание кода коротко плохо?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Оба варианта хорошие. Но обычно если ты работаешь отладчиком и тебе
    интересно где логика ведет себя не так - то второй вариант удобнее.

    Однострочники хороши только когда ты досконально понимаешь
    что внутри них происходит.
    Ответ написан
    8 комментариев
  • Как преобразовать документ pdf в лист excel?

    @rPman
    Анализ документа это не простой процесс, повезет, если структура у всех документов будет одинаковая, и машиночитаемая, тогда это легко будет автоматизировать, а вот если информация записана 'как получится', где порядок и способ записи отличается (например запись велась много времени и операторы менялись, каждый изобретал свой формат, один по 1 строке на данные название: значение, другой в одну строчку через запятую, трети написал сначала список названий значений, а затем список самих значений и т.п. или писать данные в колонках,.. вроде бы у каждого есть какой то порядок но везде разный). Помимо формата есть еще проблема с разными шрифтами и положениями элементов на странице, лишний текст на сопровождающих картинках и графиках и много нюансов.

    В общем требуется исследование, которое тебе сначала придется провести.

    У тебя 2 варианта решения (как повезет)
    1. если текст в pdf записан как текст
    разбираешь документ на элементы чтобы получить список текстовых строк с координатами (вот тут обсуждалось там же и пример)

    2. если текст не содержится внутри документа и pdf исключительно как картинка (бывают разные случаи, в простом варианте - pdf как векторное изображение, грубо говоря команды принтеру/графопостроителю, бывает прямо изображение помещают, например после сканирования бумажных
    то используй инструменты распознавания текстов на изображении, например открытый tesseract (его можно самому натренировать на шрифты, если будут использоваться необычные, в этом случае конечно вручную придется набирать символы из документа, подготавливать их в обучающую выборку... примеры в интернете есть, но скорее всего так глубоко лезть не придется)
    Чтобы получить текст с координатами так же можно посмотреть пример тут
    Осторожно с мультиязыковыми заморочками, одни и те же буквы в разных языках могут как совпадать по виду так и отличаться (разные шрифты), плюс распознавание может путать букву О и ноль, l и один и т.п.

    Немного поковыряться, чтобы исключить разбиение текстов на буквы а предложения на слова (делать по координатам, если символ или слово находится справа на некотором расстоянии и на той же y координате (+-) то считать что они одно слово-предложение.

    Проанализировав так всю базу документов ты сможешь уже работать с текстовыми данными, сгруппировать по форматам (искать слова на соответствующих позициях и порядке) и по каждой написать приложение парсер.

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

    p.s. вспоминаю историю, где начальство какой то организации потребовало распечатать тонны (буквально машину) бумаги, какие то документы... а в последствии в другой конторе пришла задача отсканировать всю эту кипу бумаг

    желаю что бы у тебя было не так
    Ответ написан
    4 комментария
  • Как защитить приложение на js+php пока не заплатили?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    1. Развернуть приложение полностью на 100% на своем сервере, а код разместить в своем приватном репозитории.
    2. Показать клиенту, что все задачи выполнены по ТЗ.
    3. Получить оплату на 100%.
    4. Разместить приложение на сервере клиента, а код - в его репозитории.


    Просто по договоренности оплата пойдет только после установки программы на компьютер клиента.

    Если в прошлый раз клиент кинул - что помешает ему сейчас кинуть? Просто не передавайте результат до оплаты, аргументируя это предыдущим случаем.
    Ответ написан
  • Приведите пример использования интерфейса, от которого есть польза, как понять что тут нужно использовать интерфейс, а тут не стоит?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Я в своей системе реализую некий UI Builder.
    Есть предопределенные поля Input, Checkbox и т.д.
    Однако, должна быть возможность создавать пользовательские поля.
    При этом такие поля обязаны придерживаться определенных соглашений, чтобы система не сломалась. Например, поля обязаны реализовать метод render. И не как-то, и именно так, как положено.
    Для этого я во всех встроенных полях реализую интерфейс FieldContract

    interface FieldContract {
      public function render(Repository $repository): ViewContract;
    }


    Теперь сторонний разработчик, захотевший написать расширение к системе будет обязан реализовать в своих кастомных полях интерфейс FieldContract.
    А я внутри системы всегда уверен, что у поля есть необходимый метод с необходимой сигнатурой, даже если это поле реализовал сторонний разработчик.
    Ответ написан
    Комментировать
  • Как узнать позицию записи в базе?

    mayton2019
    @mayton2019
    Bigdata Engineer
    База это не Excel лист. И записи в таблице БД хранятся разбросанные в случайном порядке. Порядок появляется когда мы делаем SELECT c order by. В остальных случаях порядок не гарантирован.
    Ответ написан
    1 комментарий
  • Почему процессоры без встроенной карты не быстрее процессоров со встроенной?

    Melkij
    @Melkij
    PostgreSQL DBA
    Потому что это одни и те же кристаллы. Зачем разрабатывать и производить много разных модификаций кристаллов, если можно взять один и тот же, включать/отключать некоторые блоки, заодно тем самым уменьшая общую отбраковку.

    Ведь память это же самое дешевое, что можно сделать на кристалле?

    Это как раз обычно самое дорогое - самый большой по площади регион. Больше площадь = меньше кристаллов с пластины. Больше площадь кристалла = выше риск получения брака у каждого из кристаллов. Меньше исправных кристаллов = выше стоимость каждого.
    Ответ написан
    Комментировать
  • Насколько долгосрочна в обучении мотивация знать чего-то такое, чего не умеют другие?

    paran0id
    @paran0id
    Умный, но ленивый
    Знаете, поначалу многие хотят странного. Освоить FreeBSD, с нуля стать хакером, написать социальную сеть на ассемблере, первым автомобилем взять дедову Победу, научиться играть Цоя на гитаре, но чтоб на десятиструнной и без ладов.

    Это проходит довольно быстро, примерно после освоения азов. Далее, наевшись кактусов, вы либо разочаровываетесь в предмете и бросаете его, либо сворачиваете на общепринятый путь развития.

    Знания "не для всех" придут с опытом. Кстати, совсем не обязательно, что эти знания будут ценными и полезными. Вы вполне можете слить лет пять на доскональное изучение какой-то местечковой фигни, которая нигде и никому больше не нужна.
    Ответ написан
    8 комментариев
  • Какие книги прочитать начинающему по C++?

    GavriKos
    @GavriKos
    Для основ актуальны те же книги, что и 10 лет назад.
    В принципе авторы даже почти не менялись - просто дописывали под новый стандарт.
    Так что идите в гугл
    Ответ написан
    1 комментарий
  • Какие файлы считаются небезопасными для загрузки на сервер?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Все файлы безопасны. Можно загружать и .php и .apk, главное запретить исполнение и разрешать только скачивание.
    Отдельно конечно вопрос по содержимому, так как зальют вам вирус - за это сайт выкинет гугл или яндекс или попадёте в чёрные списки. Зальют картинку или видео с сомнительным содержимым, уже придёт роскомнадзор или хостер выкинет вас или регистратор заблокирует домен.
    Ответ написан
    Комментировать
  • Какие файлы считаются небезопасными для загрузки на сервер?

    @tukreb
    Все файлы небезопасны. Можно загрузить картинку, в которой будет исполеяемый код.
    Вы должны настроить сервер (nginx/apache) так, чтобы в папке где будут загруженны клиентами файлы, в принципе нельзя было исполнять НИКАКИЕ файлы.
    Ответ написан
    Комментировать
  • Какую легковесную IDE выбрать для C++?

    Wohlstand
    @Wohlstand
    Инженер-программист С++
    Я сам для себя использую Qt Creator. По мне очень удобная и шустрая среда. Однако, хочу предупредить: в последних версиях присутствует модуль clangd (модель кода CLang): штука очень полезная, позволяющая находить различные косяки на лету без необходимости собирать проект, однако, она жрёт оперативку очень знатно. Поэтому, если машина слабая, то лучше отключить эту штуку. Мне лично среда ОЧЕНЬ нравится не только за её легковесность, но и за встроенный функционал по рефактрорингу (умному переименованию элементов кода, например, быстрому созданию тел функций и методов из прототипов сразу в нужном месте, и т.п.). Сравнивал я с Clion: последняя удобная по части быстрых подсказок и некоторой автоматизации по исправлению косяков, но по большей части менее удобная и невероятно тяжеловесная (да "здравствует" Java).
    Ответ написан
    Комментировать
  • Почему переопределение метода без virtual -- это не переопределение?

    @res2001
    Developer, ex-admin
    Переопределить можно в любом случае, хоть с virtual, хоть без.
    Но тут важно что вам надо от переопределенного метода. Если вам нужно использовать полиморфизм, то нужно ставить virttual, если нет - то нет.

    Например дополним ваш пример функцией:
    void func(struct A &a)
    {
      a.fn();
    }
    
    int main() {
      B b;
      b.fn();
      func(b);
    }

    И передадим туда ссылку на b. Будет напечатана А, т.к. методы fn не виртуальные.
    Если были бы виртуальные, то напечатается B - полиморфизм в действии.
    Ответ написан
    Комментировать
  • Нужно выгрузить сайт с битрикса, как это провернуть?

    ZERGeich
    @ZERGeich
    Битрикс - это движок.
    Это не просто таблички и набор html файликов.
    Поэтому простым копированием - вы не перенесёте его на другой движок.
    И CRM в данном случае вообще не к месту. Хоть погуглите - что это такое.
    Ответ написан
    Комментировать
  • Что почитать про программирование под Линукс?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    А под линукс как-то особенно программировать не требуется. Наоборот можно уже писать кроссплатформенно.
    У винды много своей специфики, связанной со странными особенностями файловой системы, с выкрутасами в плане использования кодировок в терминале, в файловой системе, в остальных местах... Когда начинаешь кодить на линукс и под линукс, то аж дышится легче.
    Начинаешь думать, что интерфейсы можно делать не нативно, а в виде веб-интерфейсов, которые отлично смогут работать и в облаке, и прямо на роутере, и локально.
    В линуксе гораздо проще и каноничнее всё с доке-контейнерами, стандартной является вся инфраструктура командной строки, свзанная с механизмами автоматизации: стандартные тулзы, make, системы управления пакетами...
    Поднять на линуксе изолированную повторяемую среду получатся гораздо проще, чем в винде.

    Вообще не понятно, конечно, о каком програмировании речь. Тут и системное программирование упоминалось, и GUI...
    По собственному опыту скажу, что сомнения при переходе на разработку под линукс в основном надуманные и ненужные. Переход происходит естественно и непринужденно.
    Особенно подкупает встроенная в систему хорошая документация и огромное количество структурированной информации в сети. Даже книг каких-то специальных читать не пришлось. Просто по обстоятельствам ищем статьи и мануалы по конкретным темам: особенности и устройство файловой системы, пайпы, потоки, процессы, система прав доступа...
    Ответ написан
    1 комментарий
  • Хотелось бы узнать мнение профессионалов по данному курсу?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Курсы приносят пользу только их создателям. Опыт показывает, что любой человек за срок от полугода до года либо способен с одним только учебником с полного нуля выучить программирование на достаточном для трудоустройства уровне, либо не способен стать программистом.
    Ответ написан
    1 комментарий
  • Какой стек технологий выбрать для разработки экосистемы проектов?

    ThunderCat
    @ThunderCat Куратор тега Веб-разработка
    {PHP, MySql, HTML, JS, CSS} developer
    Можно я внесу немного конструктивной критики в ваш вопрос, ну и сделаю некоторые выводы, возможно вам они будут полезны...

    Я занимаюсь разработкой интернет проектов. Сейчас вместе с командой специалистов мы готовимся к разработке большого и высоконагруженного проекта.
    Вы же не рекламное письмо фирме пишете, говорите четко - "у нас есть 6 маркетологов, джун верстальщик и эйчар". Ну или " У нас было два пакетика травы, семьдесят пять ампул мескалина, 2 явиста мидла, 2 пхп сеньера, бухгалтерия, наполовину наполненная старушками с калькуляторами, и целое море различных специалистов по яваскрипту, цсс, хтмл и их комбинациям в ассортименте, а так же...".
    Тогда понятно - что вам искать, какие спецы какого уровня у вас уже есть и стоит ли их менять или строить будущую архитектуру под уже имеющийся состав.

    Общая концепция выглядит приблизительно так:
    Будет много разных баз данных, в которых будет храниться информация разного типа, текстовая, . Каждая база будет содержать информацию по разным темам.
    Информация графическая, видео и аудио типов чаще всего не хранится в бд. Если вы не программист/архитектор IT структур - поручите вопросы архитектуры и структурирования данных кому-либо из команды, кто в этом разбирается (если таковые есть).

    Отдельно будет полнотекстовая поисковая система объединяющая информацию из всех источников.
    В принципе не особо зависит от стека, тут больше архитектурно-проектировочная задача.

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

    Посоветуйте пожалуйста какой стек технологий для разработки выбрать, с учётом некоторых условий:
    - Язык(и) программирования современные и содержащие подробную информационно-документальную базу и популярные сообщества поддержки.
    На сегодняшний день есть 4-5 хорошо распространенных языка, используемых в вебе: пхп, ява, жс, питон, в меньшей степени c#, руби, голанг, остальные больше экзотика, нежели мэйнстрим.
    - Высокая производительность и многопоточность.
    Которая в вебе не особо нужна, хотя практически все вышеперечисленные языки в той или иной мере многопоточность поддерживают. Опять же - сразу "видны уши" вашей недостаточной компетентности в вопросах разработки высоконагруженных проектов. Дело в том что в 99% случаев код именно языка программирования особо не нагружен. Больше всего процессорного времени будет съедаться запросами к бд и внешним сервисам. Код просто прослойка между фронтом и бд, чаще всего просто выполняющая задачи CRUD прослойки.

    - Простая масштабируемость.
    - Актуальность на ближайшие 2-3 года.
    Везде подходит

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

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

    На вашем месте я бы не лез в это вообще, если вы не являетесь специалистом айти профиля, а нанять прожект менеджера с опытом больших проектов, который определит уже что и зачем вам нужно.
    Ответ написан
    1 комментарий
  • Вопрос по развитию IT?

    @tukreb
    1. Прочитайте любую основу.
    2. Начните кодить, что угодно и как угодно (хотя бы тот же блог или туду лист), тут главное начать и без чужой помощи, сами гуглите сами ищите и гавнокодите.
    3. Когда кое как закончите с 2 пунктом, можете приниматься за умные книжки, типо ООП и т.д
    4. Берёте проект из 2 пункта и переделываете с теми знаниями, что получили из 3 пункта.
    5. Читаете следующую умную книжку
    6. Переделываете проект из 4 пункта со знаниями полученными в 5 пункте.
    И так до бесконечности. Да именно так, в IT нет конечной точки, вы должны всегда обучаться и практиковаться.
    Ответ написан
    9 комментариев
  • Тип с точностью до 4 знаков C++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Есть. Называется int. Вам надо хранить количество десятитысячных в числе. Иными словами, вы вместо x храните в int x*10000. При выводе делите на 10000 (и установите выводить 4 знака).

    Такие числа можно просто складывать и вычитать. При умножении надо будет результат поделить нацело на 10000 (или округлить к ближайшему, делящемуся на 10000 и потом отбросить 4 нуля). При делении - наоборот. Надо сначала домножить числитель на 10000, а потом поделить нацело на знаменатель (возможно стоит подумать об округлении к ближайшему целому).

    Upd: И вообще, раз уж разговор о C++, то можно реализовать свой класс. Там можно даже отдельно хранить целую часть и 4 знака после запятой. Если вам встроенной точности int/int64_t не хватает. Все математические операции можно переопределить и работать, как со встроенным типом. Вообще, по-умному, это называется fixed point numbers.
    Ответ написан
    Комментировать
  • Ошибка с перенаправлением: как скачать файл с веб.страницы в формате pdf?

    deepblack
    @deepblack Куратор тега Python
    Дело в том что на этом сайте есть защита от ботов.
    И скачивается не пустой файл как html, а довольно интересный код на JS (внутри этого html файла):

    Посмотреть содержимое

    var utm_set = null;
    
    function setup_utm() {
        if (utm_set == null) return null;
        var i = 0;
        var p = document.createElement("a");
        p.href = document.referrer;
        for (i = 0; i < utm_set.length; i++) {
            if (p.hostname === utm_set[i]["host"] || p.hostname.indexOf(utm_set[i]["host"] + '.') === 0 || p.hostname.indexOf('www.' + utm_set[i]["host"] + '.') === 0) {
                return utm_set[i]["args"];
            }
        }
        return null;
    }
    
    function fixedEncodeURIComponent(str) {
        return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
            return "%" + c.charCodeAt(0).toString(16);
        });
    }
    
    function get_jhash(b) {
        var x = 123456789;
        var i = 0;
        var k = 0;
        for (i = 0; i < 1677696; i++) {
            x = ((x + b) ^ (x + (x % 3) + (x % 17) + b) ^ i) % 16776960;
            if (x % 117 === 0) {
                k = (k + 1) % 1111;
            }
        }
        return k;
    }
    
    
    function get_param(store, type, id) {
        var o = document.cookie.split(';');
        var p = undefined;
        for (var i = 0; i < o.length; i++) {
            if (o[i].indexOf(store) !== -1) {
                var a = o[i].split('=');
                if (a.length > 1) {
                    var q = a[1].split(',');
                    if (q.length > id) {
                        p = q[id];
                    }
                }
            }
        }
        if (p === undefined) {
            if (type === "int") {
                return 0;
            }
            if (type === "str") {
                return "";
            }
        }
        if (type === "int") {
            return parseInt(p);
        }
        return p + "";
    }
    
    function get_utm_medium() {
        var mediums = {
            "organic": ["yandex", "google", "bing", "search.yahoo", "yahoo"],
            "referral": null
        };
    
        var m, a, v, f = 0;
        var p = document.createElement("a");
        p.href = document.referrer;
        for (m in mediums) {
            a = mediums[m];
            if (a == null) {
                break;
            }
            f = 0;
            for (var i = 0; i < a.length; i++) {
                v = a[i];
                if (p.hostname.indexOf(v + '.') === 0 || p.hostname.indexOf('www.' + v + '.') === 0) {
                    f = 1;
                    break;
                }
            }
            if (f === 1) {
                break;
            }
        }
        return m;
    
    }
    
    function mini_hostname(hostname, medium) {
        if (hostname === undefined || hostname === "") {
            return hostname;
        }
        hostname = hostname.replace("www.", "");
        if (medium === "organic") {
            if (get_param("__js_p_", "int", 3) === 1) {
                hostname = hostname.split(".")[0];
            }
        }
        return hostname;
    }
    
    function construct_utm_uri(disable_utm) {
    
        var p = document.createElement("a");
        p.href = document.referrer;
        if (p.href === "") {
            return window.location.href;
        }
    
        var ref = p.hostname.replace("www.", "");
    
        var loc = window.location.hostname.replace("www.", "");
        if (loc === ref) {
            return window.location.href;
        }
        if (disable_utm === 1) {
            return window.location.href;
        }
        if (window.location.href.indexOf("utm_") !== -1 || window.location.href.indexOf("gclid=") !== -1 || window.location.href.indexOf("yclid=") !== -1) {
            return window.location.href;
        }
        var uri = window.location.href;
        if (uri.indexOf("?") !== -1) {
            uri += "&";
        } else {
            uri += "?";
        }
        var medium = get_utm_medium();
        var hostname = mini_hostname(p.hostname, medium);
        var args = setup_utm();
        if (args != null) {
            uri += args;
        } else {
            uri += "utm_source=" + hostname + "&utm_medium=" + medium + "&utm_campaign=" + hostname + "&utm_referrer=" + hostname;
        }
        return uri;
    }
    
    setTimeout(function() {
        var code = get_param("__js_p_", "int", 0);
        var age = get_param("__js_p_", "int", 1);
        var sec = get_param("__js_p_", "int", 2);
        var disable_utm = get_param("__js_p_", "int", 4);
        var jhash = get_jhash(code);
        document.cookie = "__jhash_=" + jhash + ";max-age=" + age + "; " + (sec ? "SameSite=None;Secure;" : "") + " Path=/";
        document.cookie = "__jua_=" + fixedEncodeURIComponent(navigator.userAgent) + ";max-age=" + age + "; " + (sec ? "SameSite=None;Secure;" : "") + " Path=/";
        window.location.href = construct_utm_uri(disable_utm);
        if (window.location.hash) {
            window.location.reload();
        }
    }, 1000);



    Коротко и с некоторыми неточностями:
    1. Браузер делает запрос, получает куку и тот самый html c js кодом внутри
    2. Код производит некоторые вычисления, ставит еще некоторые куки, после этого происходит повторный запрос к серверу
    3. На сервере куки валидируются и отдается либо нормальное содержимое либо тот самый html файл снова


    Скрины со вкладки Cookies консоли разработчика
    636b53c330230551365215.png
    636b53e570e62600722645.png



    Тут несколько вариантов решения:
    1. Сходить на сайт через браузер, скопировать куки, подставить их в запрос requests (естественно куки протухнут и надо будет повторять операцию)
    2. Разобрать как работает скрипт и эмулировать его работу на Python
    3. Взять что-то наподобие Selenium webdriver и решить задачу с помощью него
    Ответ написан
    2 комментария