• Как лучше хранить денежные суммы в Postgres?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    Но условный биткоин требует значительно большей точности (один сатоши = 0.00000001 btc).

    Я у себя все транзакции с битками храню именно в сатоши в типе integer
    Ответ написан
    Комментировать
  • Как создать нового юзера и новую базу в postgres, на убунту?

    Melkij
    @Melkij
    PostgreSQL DBA
    Парольная аутентификация лишь один из множества доступных вариантов. Хотя наиболее простой и распространённый. Какой способ аутентификации будет требовать СУБД - зависит от списка правил в pg_hba.conf. Очень редко нужно что-то кроме служебного правила peer для postgres (именно из-за него psql после sudo -iu postgres не спрашивает никакие пароли, но только у postgres'а) и md5 для всего остального.

    Базово создание новой базы с отдельным пользователем-владельцем выглядит так (от суперпользователя базы):
    CREATE USER "$NEWOWNER" PASSWORD '$NEWPASS';
    CREATE DATABASE ${NEWDB} OWNER "$NEWOWNER";
    REVOKE ALL ON DATABASE $NEWDB FROM public;


    В соседнем ответе вам неверно подсказывают, что "можно сразу указать какому юзеру разрешен доступ". create database разрешит доступ всем (но именно подключение к базе, а не ко всему внутри базы - что частая проблема непонимания прав). И имеет смысл наоборот отобрать доступ от всех прочих, т.е. от public. Owner, конечно, доступ сохранит.

    Чуть ближе к production имеет смысл использовать такой шаблон:
    CREATE USER "$NEWOWNER" PASSWORD '$NEWPASS';
    CREATE DATABASE ${NEWDB} OWNER "$NEWOWNER";
    CREATE ROLE ${NEWDB}_role;
    CREATE ROLE ${NEWDB}_ro;
    CREATE ROLE ${NEWDB}_rw;
    GRANT ${NEWDB}_role TO ${NEWDB}_ro, ${NEWDB}_rw;
    REVOKE ALL ON DATABASE $NEWDB FROM public;
    GRANT CONNECT ON DATABASE $NEWDB TO ${NEWDB}_role;
    GRANT ${NEWDB}_rw TO "$NEWOWNER";
    \c $NEWDB
    ALTER SCHEMA public OWNER TO "$NEWOWNER";
    REVOKE ALL ON SCHEMA public FROM public;
    GRANT USAGE ON SCHEMA public TO ${NEWDB}_ro, ${NEWDB}_rw;
    ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT SELECT ON SEQUENCES TO ${NEWDB}_ro;
    ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT SELECT,USAGE ON SEQUENCES TO ${NEWDB}_rw;
    ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT SELECT ON TABLES TO ${NEWDB}_ro;
    ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT SELECT,INSERT,DELETE,UPDATE ON TABLES TO ${NEWDB}_rw;
    ALTER DEFAULT PRIVILEGES FOR ROLE "$NEWOWNER" GRANT SELECT ON SEQUENCES TO ${NEWDB}_ro;
    ALTER DEFAULT PRIVILEGES FOR ROLE "$NEWOWNER" GRANT SELECT,USAGE ON SEQUENCES TO ${NEWDB}_rw;
    ALTER DEFAULT PRIVILEGES FOR ROLE "$NEWOWNER" GRANT SELECT ON TABLES TO ${NEWDB}_ro;
    ALTER DEFAULT PRIVILEGES FOR ROLE "$NEWOWNER" GRANT SELECT,INSERT,DELETE,UPDATE ON TABLES TO ${NEWDB}_rw;

    В результате получим:
    - пользователя-владельца базы, который предназначен выполнять всякие миграции схемы данных
    - роль имя_базы_role которую можно давать другим пользователям для возможности подключения к этой базе, но без доступа к таблицам приложения (например, используем для мониторинга)
    - роль имя_базы_ro которая даст select-only права ко всем (в том числе будущим) таблицам, созданным от пользователя-владельца это базы
    - роль имя_базы_rw - соответственно для выполнения select,insert,update,delete
    Ответ написан
    Комментировать
  • Как мне сместить Windows 10 только на 1 из 2 жестких дисков (ssd)?

    @nehrung
    Не забывайте кликать кнопку "Отметить решением"!
    Итак, у вас два диска, активный из них (т.е.загрузочный) - только один, С.
    1. Перезапускаете комп с любого популярного ремонтно-восстановительного LiveDVD/LiveUSB (диски Сергея Стрельца, Мультибут, Реаниматор и т.п., тысячи их), и далее работаете в ОС WinPE с утилитами, которые он предоставляет.
    2. С помощью продвинутого менеджера разделов, например, парагоновского HDM или Partition Assistant, освобождаете свободное место на диске D, потеснив имеющийся раздел вправо (конечно, если там есть свободное место, а если его нет, придётся его устроить, переписав часть инфы на какой-нибудь внешний носитель). Освободить придётся не менее 80 ГБ, а лучше - не менее 100...150. Если всё сделано правильно, инфа с раздела D не будет потеряна, но если вы опасаетесь, можете предварительно сделать её резервную копию на ещё одном внешнем носителе.
    3. На появившемся неразмеченном месте тем же менеджером разделов создаёте новый раздел E.
    4. В том же менеджере разделов включаете режим "Миграция ОС" и задаёте диск С как источник ОС, а новый раздел Е - как целевой. Через некоторое время (5...10 минут) там появится копия вашей Винды с раздела С.
    5. Тем же менеджером разделов проверяете, какие из имеющихся разделов являются активными. Теперь их должно быть два - С и Е. Диск С делаете неактивным.
    6. Перезапускаете комп, и теперь он должен запуститься уже с диска 380 ГБ (с системного раздела Е, но теперь этот раздел будет обозначен как С). Чтобы точно убедиться в этом, можете даже заранее временно отключить диск 80 ГБ.
    7. Гоняете ОС, мигрировавшую на новое место, в хвост и в гриву, чтобы убедиться, что всё ОК. Если и вправду всё ОК, снова подключаете диск 80 ГБ и очищаете его от прежнего содержимого, т.е. подготавливаете его к установке Убунты.
    Всё.
    Кстати, крайне полезно перед всей этой работой прогнать на обоих дисках тест утилитой Виктория, и если она покажет, что хотя бы один из них начинает "сыпаться", то не заморачиваться всей этой вышеописанной вознёй, пока ему не будет найдена исправная замена. Ибо всё равно это будет зазря.
    Ответ написан
    1 комментарий
  • Стоит ли бросать кастомные ошибки, если этити не найдено в API?

    zagayevskiy
    @zagayevskiy Куратор тега Java
    Android developer at Yandex
    беспокоит только конкатенация строк

    ...
    кидает исключение в бизнес-логике

    Л - Логика.

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

    @EraserKhv
    Системный администратор
    Проще объясню.
    Предположим, гипотетическая ситуация, которой обычно объясняют зачем тебе Облако. - Есть у тебя интернет-магазин плюшевых мишек. Развернул ты сайт у себя на компьютере , который стоит в офисе в кладовке, и все хорошо, посещение сайта 1000 пользователей в день, продаешь ты свои 5 мишек в день, никаких проблем.
    Но тут надвигается 8 марта, и посещаемость сайта увеличивается до 5000 в час и твой компьютер не вывозит ни по процессору, ни по диску, ни по оперативной памяти, ни по пропускной способности интернет канала, службы обрабатывающие HTTP запросы все время отваливаются, интернет-канал забит, жесткий диск молотит, но все происходит все очень медленно, а ты на этом компе еще Z отчет кассовый делаешь в конце дня, а в соседнем цехе усиленно пекли печеньки с предсказаниями в глазури, автомат в ВРУ не выдержал, и отключился вместе со всем зданием и твоим компом. ПО итогу ты к 8му марта продаешь всего 3 медведя, да и еще кассовый отчет для налоговой не сгененрировал. После подобного факапа, ты себе говоришь: "ну на следующий праздник я так не облажаюсь". Выделяешь в офисе помещение под серверную, ставишь серверную стойку, покупаешь 4 сервера полноценных и распараллеливаешь инет запросы, новая система хранения данных, источник бесперебойного питания, 2 кондиционера и интернет канал расширяешь. Итогом к 8му марта следующего года, эта конфигурация выдерживает возросшую нагрузку и ты продаешь 45 медведей к 8му марта, профит ? А вот и нет, вся эта конфигурация нужна тебе в преддверии 8го марта, а остальные, предположим 360 дней, тебе бы хватало однго старого компьютера. А серверная потребляет только электричества на 500 руб в день, а интернет канал, и обслуживание серверов итого дороже!

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

    rockon404
    @rockon404
    Frontend Developer
    Пример в контексте JavaScript:

    Процедурный стиль:
    const array = ['first', 'second'];
    
    let output;
    
    function allOdd(words) {
      let result = true;
    
      for (let i = 0; i < words.length; ++i) {
        const len = words[i].length;
    
        if (len % 2 !== 0) {
          result = false;
          break;
        }
      }
    
      return result;
    }
    
    output = allOdd(array);
    
    alert(output);

    Функциональный стиль:
    function length(string) {
      return prop('length', string);
    }
    
    function odd(number) {
      return equals(modulus(number, 2), 0); 
    }
    
    function allOdd(...words) {
      return every(compose(odd, length), words);
    }
    
    alert(allOdd('first', 'second'));

    Реализации prop, modulus, equals, every и compose оставлены за кадром. Думаю, из их названия легко понять какой результат они возвращают.
    Ответ написан
    3 комментария
  • Старый телефон как аналог ардуино или малинки?

    @402d
    начинал с бейсика на УКНЦ в 1988
    О проблемах разрешения отладки по usb в случае когда не видишь куда нажать, чтобы поставить галку.
    Как войти в рековери моде, как писать свои прошивки. Как рутануть.
    В общем куча гимора. Было бы легко и универсально - уже бы все гики делали то, что вы хотите.

    А из реального передалать в http-sms gate.
    Живой тач и экран цепляется на пациента. Все настраивается . В корпус заглушечку заместо экрана.
    Если кто решил быстренько накупить телефонов и спамить, то читайте закон о рекламе и посмотрите
    ссылки ниже
    https://moskva.beeline.ru/customers/pomosh/bezopas...
    https://moscow.megafon.ru/bezopasnoe_obschenie/mob...
    https://moskva.mts.ru/personal/mobilnaya-svyaz/usl...
    и теле2 куда-то запрятали (было в 2014 году) сейчас нагуглил только
    https://msk.tele2.ru/option/antispam
    Ответ написан
  • Паттерн MVP - в чём его суть?

    @red-barbarian
    Cуть в том, что код в активити сложно тестируем. Кроме того, проблема разрастания активити, включение в него разного рода кода который работает с вьюхами, логикой, базой данных, сервисами и проч и проч.
    Поэтому программистами искались выходы и находились. )
    MVP был придуман задолго до андроида. Суть его (как и других аналогичных шаблонов) в разделении модели и ui. Особенность в том, что мы делаем полностью пассивную вьюху, логику вьюхи переносим в presenter.
    схематично это так: есть интерфейс view. активити реализует этот интерфейс. презентер знает об этом интерфейсе.
    Получается презентер не зависит напрямую от активити, только от некого интерфейса. Поэтому его сравнительно легко тестировать (подставляя свою заглушку view)
    Так решается две основных проблемы:
    - код стал более тестируемым
    - код разделен на пассивную активити и ее логику в презентере.
    По вопросам:
    1. активити читает пароль и логи и передает их в презентер (вызывая соотвествующие методы презентера). а он далее из обрабатывает.
    2. отрисовку данных делает активити с интерфейсом (названным например ActivityView). презентер имеет ссылку на этот интерфейс (активити передает свою ссылку ему), а далее вызывает например activityView.setText(text)
    3. есть два подхода
    а) время жизни презентера равен (не больше) времени жизни активити
    б) время жизни презентера больше времени жизни активити
    соотвественно а) данные сохраняются в budle и передаются в презентер
    б) данные хранятся в презентере
    4 - выше
    5. активити - пассивный объект. управление через презентер. любая хоть немного сложная логика в презентер.
    Применение интерфейсов обязательно. иначе потеряем тестируемость и не избавимся от жесткой зависимости презентер-активити.

    это все описано очень неточно. например вместо "активити" можно подставить "фрагмент". но суть надеюсь понятна.
    Ответ написан
    Комментировать
  • Мониторинг посещений сайтов сотрудниками офиса. SQUID или есть альтернативы?

    @SuNbka
    «Прозрачный» Squid с фильтрацией HTTPS ресурсов без подмены сертификатов (х86, х64 — универсальная инструкция)
    Ответ написан
    1 комментарий
  • Как сделать локальный аккаунт в приложении на андроид?

    @kzoper
    Сохранить данные о пользователе локально.
    Ответ написан
    Комментировать
  • Старт в программировании микроконтроллеров. Ардуино?

    32bit_me
    @32bit_me
    Программист, встраиваемые системы
    Не начинайте с arduino, не тратьте время зря. Берите сразу STM32 Nucleo. И на asm не стоит тратить время тоже.
    Начните с простых программ на С, потом подключите ОСРВ, например FreeRTOS.
    Ответ написан
    5 комментариев
  • Используется ли сейчас микропрограммирование/микропрограммы?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    Не путайте микропрограммы (в основном это прошивки разных устройств, которые сложно назвать операционной системой)
    И микрокод процессоров
    https://ru.wikipedia.org/wiki/%D0%9C%D0%B8%D0%BA%D...

    p.s. а .exe файл действительно содержит бинарный код (машинный код), но кроме этого .exe файл, в отличие от .com файла это контейнер со сложной внутренней структурой, которая позволяет хранить и код программ, и данные (текст, диалоги) и графику (иконки и др) и в принципе вообще любой контент.
    Ответ написан
    Комментировать
  • Используется ли сейчас микропрограммирование/микропрограммы?

    @pfg21
    ex-турист
    exe содержит машинный код x86 (или x86-64), который до недавнего времени "аппаратно" исполнялся на x86-процессоре. тут x86-код будет "самым низким уровнем".

    современный проц - сложная хитроумная структура, которая машинный x86 код преобразует в risc-код и исполняет только его. т.е. есть набор аппаратных risc-ядер, которые эмулируют работу x86 ядра.
    тут x86-код не будет "самым низким уровнем", хотя за пределами процессора об этом никто не догадывается :)
    микрокод собственно и описывает систему преобразования x86 в risc-код.
    Ответ написан
    2 комментария
  • Как работать с потоками в Android?

    @red-barbarian
    Простейший случай AsyncTask
    doInBackground - выполняется на одном потоке
    onPostExecute - выполняется на потоке который запускал AsyncTask
    2) Возможно вызвать метод из другого класса после завершения потока

    Возможно, у тебя ошибочное мнение, что разные классы выполняются на разных потоках, или весь класс выполняется только на одном потоке. Это не так. Методы класса могут выполняться на разных потоках.
    Так же и изменение переменных технически не запрещено изменять из разных потоков.
    Единственная особенность Android, что вьюхи можно менять только из UI- потока. Для этого и придуман AsyncTask (в том числе).

    doInBackground - выполняется на новом потоке
    onPostExecute - выполняется на UI
    Также применяют как java - потоки (Thread, Executers, Concurrent ...), так и Handle, AsyncTask, IntentService и проч.
    Но для знакомства лучше начать с AsynkTask. Он нормально подходит для простых задач.
    Ответ написан
  • Нужно ли иметь ип/юридическое лицо, чтобы получать доход с продажи приложений в РФ?

    AlexanderYudakov
    @AlexanderYudakov
    C#, 1С, Android, TypeScript
    Регистрируешь ИП с упрощенной системой налогообложения (6% с оборота).
    https://www.nalog.ru/rn77/ip/ip_pay_taxes/usn/
    Открываешь расчетный счет.
    С полученных денег платишь 6% налогов, остальные деньги выводишь на карту физ. лица с формулировкой "Перевод собственных средств".
    Раз в год сдаешь налоговую декларацию по УСН.
    Живешь спокойно и не паришься.
    Ответ написан
    7 комментариев