Задать вопрос
  • Активно ли разработчики пользуются встроенными в Postgres функциями?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Кину 5 копеек по поводу работы с датами. Да это зло. Работа с датами в современном API это
    самый большой технический долг начиная с Unix, когда дата представлялась секундами с 1970 года
    в виде DWORD. Я не встречал ни одного языка программирования и ни одной DBMS где изначально
    была-бы какая-то очень строгая и математичная концепция работы с временем. Везде были ограничители
    в основном завязанные на примитивные типы либо на строки вариативной длины. В Java например
    долгое время экплуатировался тип java.util.Date который сегодня считается дыркой (мутабельность)
    и неточным и его заменяют на java.time.* семейство типов. Параллельно с ним где-то в космосе
    висит java.sql.Date который декларирован в интерфейсах JDBC как основа для БД. С ним-же и работают
    все драйвера реляционных бд.

    По поводу вычислений на application tier. В последнее время DBMS девальвировали. И в основном
    используются в микросервисах как хранилище таблиц без особой логики. В этом есть свои смыслы.
    Например удобнее тестировать и хранить 100% кода в языках Java/Node/C#. Это создает гомогенность
    языка в проекте. В противном случае логику пришлось бы неизбежно резать на 2 слоя и хранить
    половину в application и другую половину деплоить через flyway/liquibase в БД при этом еще и
    не забыть тестировать 100% совместимость тех-же функций для работы дат-времени (никто
    кстати невкурсе что в Oracle год может быть 9999 а java.util.Date мне удалось сгенерировать
    такую Aug 17 09:12:55 EET 292 278 994. .. оптимистичненько доживем до 290 миллионов
    лет хотя проблема comparison этих типов остается) Стандарты ISO помогают но они скорее
    декларируют намерения сохранить нужное значение. Вот и если вы новичек - то я гарантирую
    что вы словите кайф в попытке в Java разобраться в проекте какой тип дат вам брать. И еще
    помножите это все на типы данных БД (их там будет 4 штуки обычно. Парочка для зональных
    и парочка для локальных).

    Использовать или нет функции PG? Ответ - it depends. В некоторых случаях оптимизатор не видит
    индекса если ты делаешь неявный кастинг из строки в дату например. Я тут не уверен надо проверять.
    Но есть старая админская поговорка. Плохой execution plan - проверь типы данных в предикатах.
    Беда реально существует для Spark/Databricks и даже включена в учебный план. По крайней мере int/Long
    различается на уровне Catalyst-optimizer. Вобщем если вы - лентяй то можете лупить строки вместо дат
    и надеятся что SQL машина правильно интерпретирует. Если вы хотите быть точным то делайте CAST или
    to_date с явным описаловом YYYY-MM и т.д.

    Еще один поинт в части где хранить логику. Это я пишу просто для кругозора. Чтобы топик
    не циклился вокруг Постгреса а люди видели пошире. В классических БД данные качаются
    к клиенту.
    Тоесть делаете SELECT * из миллирад строк - и этот миллиард будет прокачан до конца
    когда вы читаете резалт-сет по сети. Такова парадигма. Или курсор. Но суть таже. А в BigData данные
    лежат на месте но к ним "ходит" код
    . Вот такой метафизический парадокс. Сами понимаете что
    тут получается что встроенных функций даже как бы ... и нет. Подчеркиваю разницу.
    Ответ написан
    3 комментария
  • Что такое выражение в SQL?

    @alexalexes
    Выражение, это значит, что в месте между, например, select и запятой может не только выбираться значение столбца (выполняться тривиальное действие):
    select col1, -- извлекли содержимое колонки - вполне тривиальное действие
               col2 from table1

    Но выполнятся более функциональное действие, требующее от планировщика запросов разобрать что-то, что находится до селекта и запятой (почему что-то? - это и есть выражение))) ):
    select (col1 + col2) * 10 as result, -- а тут уже применили ариф. операции - написали выражение
               col2 from table1

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

    bugo_aneo
    @bugo_aneo
    Верстальщик по жизни, буддист, кофеман
    Один из вариантов задать этой обертке отрицательный маргин влево (в данном случае), на нужную вам ширину. Рассчитать по числу левых маргинов у оберток, которые надо перекрыть.
    643519363f05b827119515.jpeg
    Ответ написан
    6 комментариев
  • Где в Ubuntu найти размещение папки с обоями?

    Стандартные обои находятся в:
    /usr/share/backgrounds
    Загруженные изображения (те которые вы стрелкой показываете) размещаются в:
    ~/.local/share/backgrounds
    Ответ написан
    1 комментарий
  • Как на сайте лучше разместить раздел вопросов?

    DanArst
    @DanArst
    Гриффиндор в моде при любой погоде!
    Я бы определенно выбрал первый вариант.
    1) Можно грамотно организовать внутреннюю перелинковку, помогая распределению веса страниц, если важно SEO.
    2) Информация должна находится там, где ей положено быть. Соответственно вопрос-ответ должен быть на отдельной странице FAQ, а не на странице самой категории - там должна лишь присутствовать ссылка на нужную страницу раздела FAQ (имхо). На странице категории должен быть только тот контент, который за наименьшее количество действий позволит получить лид, а раздел FAQ на нем, опять же имхо, будет лишь лишней возможностью отвлечь внимание юзера.
    3) Полноценный и хорошо организованный FAQ на сайте, как ни крути, это все таки + к доверию.
    4) Пользовательский опыт и длительность/глубина просмотра - лично у меня, как у юзера, могут возникать сопутствующие вопросы. Условно я из поисковика попал на страницу ЧаВо вашего интертне-магазина по вопросу оплаты заказа, отсюда вытек вопрос по поводу доставки, далее возможности возврата, а потом вообще захотелось узнать о возможности партнерства. Поэтому, если бы FAQ был организован по 2-му способу, я бы скорее запарился искать эту инфу, и возможно покинул бы сайт. Другое дело, когда все ответы находятся в одном разделе и разбиты по категориям - вот это уже удобная навигация, без лишних квестов.
    Ответ написан
    1 комментарий
  • Как семантически верно оформить список статей в категории блога?

    MrDecoy
    @MrDecoy Куратор тега HTML
    Верставший фронтендер
    section должен содержать в себе заголовок 1-2 уровня.
    section представляет собой какой-то блок, объдиняющий по смыслу какую-то информацию.

    Соответственно, я бы отклонил оба варианта.
    Делать внутри article section имеем смысл если их там больше 1.
    Не делать section вообще - значит не дать контекста что это за набор article.

    Я бы предложил вариант:
    main
      section
        заголовок
        article
          заголовок
          описание
          ссылка
        article
          заголовок
          описание
          ссылка
    Ответ написан
    1 комментарий
  • Как спозиционировать изображение внутри блока?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Вам нужно что-то вроде этого
    Ответ написан
    Комментировать
  • Почему Ajax запрос не возвращает данные?

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

    А два - return твой возвращает управление в момент вызова onload, а по тому просто некому будет на той стороне прочитать полученные данные.

    Решения два:
    1. Использовать промисы. Например так:
    function getName(user_id) {
        return new Promise(function(resolve) {
            // data
            var data = {}
            data.user_id = user_id
            data = JSON.stringify(data)
    
            // send
            const request = new XMLHttpRequest();
            request.open("POST", "/test-ajax/");
            request.send(data);
            request.onload = function() {
                var name = JSON.parse(this.response)
                resolve(name);
            }
        });
    }
    
    // Дальше работаем через then
    getName(user_id).then(data=>console.log(data));
    
    // Или async/await
    const name = await getName(user_id);

    В этом примере мы сразу возвращаем объект-промис, который будет завершён внутри onload. А дальше можно с ним работать через async-await или then с коллбэком.

    2. Использовать коллбэки (по старинке):
    function getName(user_id, callback) {
    
        // data
        var data = {}
        data.user_id = user_id
        data = JSON.stringify(data)
    
        // send
        const request = new XMLHttpRequest();
        request.open("POST", "/test-ajax/");
        request.send(data);
    
        // get
        request.onload = function() {
            var name = JSON.parse(this.response)
            callback(name)
        }
    }
    
    var onNameLoaded = function(name) {
        console.log(name)
    };
    getName(user_id, onNameLoaded);

    В этом примере мы передаём в функцию getName другую функцию, которая должна быть вызвана после загрузки данных.

    3. Использовать fetch и async/await - мы же в 2022 году живём. (@Mi11er)
    async function getName(userId) {
        const response = await fetch("/test-ajax/", {
            method: "POST",
            body: JSON.stringify({"user_id": userId})
        })
        return await response.json();
    }
    
    const name = await getName(userId);
    Ответ написан
    8 комментариев
  • «Семантические» HTML5 элементы — это аттавизм?

    MrDecoy
    @MrDecoy Куратор тега HTML
    Верставший фронтендер
    Не всё так радужно, как задумывалось, но смысл в их использовании есть.
    От каких то тэгов больше - от каких то меньше.
    Но если что-то можно сделать не прилагая почти никаких усилий и получить от этого пользу, то почему этого делать не стоит?

    https://habr.com/ru/company/htmlacademy/blog/546500/

    Основных поинтов использования семантики 3.
    1) Использование подходящих элементов делает их использование удобнее. Несколько раз встречал когда ссылки делали дивами с js поверх. Нет возможности нажать на них колёсиком чтобы открылаьс в новой вкладке или правой кнопкой с соответствующем ссылке контекстным меню. Это отвратительно неудобно.
    2) это помощь людям с ограниченными возможностями для понимания контекста происходящего на экране. Наглядный пример это ссылки внутри тэга nav. Можно побаловаться со скрин ридером и будет понятно о чём речь.
    Если коротко: ссылки в div будут озвучены как: *ссылка*.
    Ссылки в nav: "ссылка, навигация"
    https://vc.ru/promo/132280-kak-zvuchat-sayty-nezry...
    https://www.youtube.com/watch?v=RQiN1Hhrxu0
    3) Помощь поисковым ботам понимать контекст и формировать снипеты в поисковой выдаче. Пример есть в статье выше.
    https://siteclinic.ru/blog/technical-aspects/html5...

    с какой-либо из «сторон дела»: пользователя, верстки, программирования, поисковых систем?

    1) Про пользователей выше
    2) Про вёрстку - удобнее читать
    3) Про программирование - использование верных тэгов соответствующим образом влияет на работу с этими элементами в JS либо избавляет от необходимости в JS в принципе.
    4) Про поисковые системы выше.
    Ответ написан
    11 комментариев
  • Какие материалы посоветуете для изучения PostgreSQL?

    iMedved2009
    @iMedved2009
    Не люблю людей
    У PostgresPro вагон видео на ютубе
    Ответ написан
    Комментировать
  • Можно ли в фотошопе быстро сгенерировать сразу несколько рамеров одного изображения?

    melpnz
    @melpnz Куратор тега Adobe Photoshop
    UX/UI дизайнер
    Маловато вводных. Но могу предложить 2 решения, которые возможно вам подойдут.

    1. Action
    Через меню Window можете его включить и создать новый, первый раз проделать всё вручную и в конце нажать стоп.
    6308e141b4345781657634.jpeg

    2. Smart Object (скорее подойдёт если у вас все изображения одинаковых размеров и на выходе нужны одинаковые пропорции)
    Закидываем фотку, жмём правкой кнопкой по слою и там "Convert to Smart Object". Далее создаём несколько копий и меняем им размер. Если в одном из смарт объектов заменить фото, то оно заменится во всех.
    Если потребуется их массово выгрузить - выделите нужные слои, нажмите правой кнопкой и выберете пункт "Quick Export as PNG"
    6308e2b162e2a677942723.jpeg

    PS: можно поклеить оба метода, всё зависит от входных данных и результата, который вы хотите получить
    Ответ написан
    Комментировать
  • Чем визуализировать и документировать структуру базы данных?

    @sammolove
    Я нашёл пока только одно решение для построения диаграммы по DDL - это DbSchema - www.dbschema.com/index.html
    Правда по запросу он у меня почему-то не протянул все связи, но там был ещё один вариант - с подключением к БД. Я выполнил этот запрос, по созданию схемы, подключился, и готово! Дальше остаётся только расположить прямоугольники с таблицами так, как вас больше устроит. Есть экспорт в картинки и даже в векторный svg больше подходящий для печати. А чтобы SVG добавить в Word, его нужно открыть Incsckape и сохранить emf или сколь угодно большой с прозрачностью PNG.
    Ответ написан
    3 комментария
  • Как научиться пользоваться электронными валютами?

    @rPman
    К сожалению не существует места, где красиво 'без лишнего мусора и скама' все объяснят.
    Продвинутый пользователь становится таковым не потому что прочитал продвинутые книги, а потому что имеет опыт и понимание (наверное и способность понимать).

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

    Короткий список рекомендаций и замечаний:
    * 99% всего что происходит в криптоэкономике - это скам разной степени наглости, буквально, пускают пыль в глаза, намеренно усложняют конструкции чтобы разобраться было сложно и огромное количество новостного шлака, описывающего весь мусор как нечто заоблочно полезное.
    Отличным примером является - NFT
    это проект децентрализованной торговли иконка+текстовое описание, со встроенной комиссией и инструментарием, участники там даже уже сами не понимают что несут, а крупнейшие централизованные площадки полностью перекрывают те крохи разума и фразы о децентрализации.


    * не путай криптовалюту (например bitcoin, ethereum, tron,...) и проекты, использующие криптовалютные технологии для своей работы (децентрализованная торговля и пулы ликвидности, миллион централизованно управляемых токенов типа USDT/USDC/..., тот же NFT и т.п.)
    Огромное количество проектов утверждают что они децентрализованы, 'потому что на блокчейне', но когда начинаешь копаться, оказывается там столько слабых точек, что за голову хватаешься.

    * В криптоэкономике есть проекты первопроходцы, дающие терминологию, общие принципы, возможности, и подражатели, запущенные на 'других' блокчейнах но с немного не таким функционалом, но при этом продолжающие называться как оригиналы и создающие впечатление что они такие же. Отличный пример - алгомитрические стейблкоины (например SAI бывший DAI, кстати это не первое исполнение,используют ethereum в качестве залога для выдачи монет), благодаря возможности выпускать токены с залогом в основе и получать нужную стоимость назад, у монеты есть механизмы стабилизации курса через трейдерский арбитраж, но очередная монета типа tron usdd называется алгомитрическим токеном но внезапно не имеет механизмов сжигания с получением trx нужной стоимости, предпологая что рыночек порешает... и получается типичная скам пирамида.

    * централизованные биржи это не про криптовалюту, а про регуляцию. Она сейчас дикая, с одной стороны регуятор который умудряется не выдать нормальные адекватные законы по работе в криптоэкономике но что то требующий а с другой биржи, которые ничего не обещают и не гарантируют (не регулируемые) и имеют право в любой момент сделать со своими клиентами все что угодно (например закрыть сделки по невыгодной цене и выкинуть из биржи без объяснения причин, отправив деньги на банковский счет)
    Но биржи - главные маркетмейкеры, они делают ликвидность на пустом спекулятивном рынке (у криптоэкономики почти нет никакого использования кроме спекулятивное, а значит без маркетмейкера на рынке сделок будет ноль и нулевая ликвидность), и являясь главными держателями денег в системе, могут манипулировать рынком как угодно и соответственно 'обкрадывать' клиентов. Банальное знание о том какие клиенты что делают и возможность придержать депозиты (на сутки другие отложить ввод вывод легко) позволяет им с гарантией торговать в плюс.

    * не думай что на этом рынке легко зарабатывать, с другой стороны дикие времена дают дикие возможности, отличный пример - запуск форков биткоин (например bitcoin cash так появился) позволил держателям биткоин на пустом месте заработать порядка 20%+- от монет на своем кошельке, просто продав вышедший форк в тот же день, как он начинал торговаться
    Или к примеру криптопроекты, первым своим клиентам, бывает платят своими цифровыми акциями (т.е. токенами), которые в свою очередь могут торговаться на рынке и иметь стоимость Помню кажется uniswap давал токен который буквально за месяц давал большую стоимость в тысчи баксов просто тем кто торговал на их dex, но про это нужно было вовремя узнать!
    Ответ написан
    Комментировать
  • Какую программу или сервис для проверки индексации страниц сайта посоветуете?

    opium
    @opium
    Просто люблю качественно работать
    А не проще выгрузить список с вебмастера и сравнить со списком страниц, делается в целом в Экселе быстренько
    Ответ написан
    1 комментарий
  • Где правильнее в БД разместить статусы заказа?

    lenk0belk0
    @lenk0belk0
    программироваю
    В этой ситуации видимо лучше хранить статусы заказов в отдельной таблице.

    Есть таблица заказов order(id).
    Есть таблица пользователей user(id)
    Есть таблица статусов status(id)
    Есть таблица статусов order_status(id(?), order_id(order.id), status_id(status.id), assignee_id(user.id), created_at)
    Таким образом будет известно: какой текущий статус у заказа, кто в данный момент занимается заказом, можно будет проследить историю изменений.
    Ответ написан
    2 комментария
  • Как объединить данные из разных таблиц в одну таблицу?

    @SilentBird
    Привет. Решал такие задачи по работе, используя Excel 2007. Файл с образцом решения - по ссылке ниже. Для наглядности сделал все на одном листе. Если таблицы на разных листах, принцип такой же. Вкратце:
    1. Все таблицы нужно преобразовать в "умные таблицы" Excel. Так не придется следить за размерами этих таблиц.
    2. Учитывая, что таблицы на разных листах, возникнет вопрос, все ли строки вошли в объединяющую таблицу. Чтобы знать это наверняка, я себе делаю "индикатор" возле объединяющей таблицы.
    3. Заполнение данными происходит через контроль количества строк в исходных таблицах и номера строки в объединенной таблице. То есть "если номер текущей строки в объединенной таблице меньше или равен числу строк в первой таблице, то берем из первой таблицы, а иначе берем из второй таблицы".
    4. Номер текущей строки - это формула СТРОКА() минус число строк до этой строки от верха листа. В образце это "СТРОКА()-1", потому что содержимое таблицы начинается со второй строки. За этим нужно следить и корректировать формулы в зависимости от положения таблицы на листе.

    Собственно, файл-образец.
    На всякий случай, то же самое в zip-архиве.
    Надеюсь, помог. Удачи!
    Ответ написан
    2 комментария
  • Лучшее время дня для усвоения / запоминания новой информации — какое оно?

    Griboks
    @Griboks
    Первые 2 утренних часа с перерывом 15 минут.

    Есть целое направление изучения эффективности и продуктивности человека, советую почитать какие-нибудь книги на эту тему.

    Если кратко, то во время сна ваш мозг отдыхает, запасается энергией. Во время бодрствования мозг тратит энергию. Не трудно показать, что запас энергии максимален после утренней зарядки и завтрака в то время, как усталость почти отсутствует. Более двух часов заниматься смысла не имеет, потому что мозг не способен так долго усваивать новую информацию. Точнее, мозг не способен концентрироваться более 15 минут, поэтому во всех учебниках после теории дают задачки для практики. Затем добавляет сюда ещё 15 минут физической активности во время перерыва, и вот вы снова можете учиться в течение второго часа, но уже менее эффективно. Аналогичным образом можно учиться и третий час и четвёртый, но это уже совершенно неэффективно - лучше заняться другими делами.
    Ответ написан
  • Как определить язык пользователя в Python?

    Vindicar
    @Vindicar
    RTFM!
    Браузер присылает заголовки Accept-Language, также можно полагаться на геолокацию.
    Но это всё должно использоваться только как способ определить язык по умолчанию. Предоставляй пользователю способ сменить язык явно.
    Ответ написан
    Комментировать
  • Как правильно распределить данные по таблицам?

    rozhnev
    @rozhnev
    Fullstack programmer, DBA, медленно, дорого
    Вот рекомендуемая структура базы данных в таком случае:
    CREATE TABLE statuses (
    	id int primary key auto_increment,
      	title varchar(64)
    );
    
    CREATE TABLE orders (
    	id int primary key auto_increment,
      	created_at datetime default now(),
      	status_id int references statuses(id)
    );

    MySQL fiddle online
    Ответ написан
    Комментировать