• Должен ли тип данных внешнего ключа совпадать с типом данных первичного ключа?

    Melkij
    @Melkij
    PostgreSQL DBA
    serial - это и есть integer, а типа данных serial вообще не существует. Это просто синтаксический сахар вокруг неявного создания sequence из времён, когда GENERATED ALWAYS AS IDENTITY не было ни в стандарте ни в postgresql.

    Обратно к вопросу: тип данных может не совпадать. Но обычно это ошибка схемы данных, нежели запланированное различие.
    Ответ написан
    Комментировать
  • Как сделать свой телефон?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Так не бывает.
    Нельзя сделать что-то в одном экземпляре бюджетным.
    бОльшая часть стоимости смартфона (а именно о нём, как я понял, речь, раз уж упомянут Андроид), составляет инженерная разработка. Профессиональная деятльность специалистов стоит дорого и окупается только большими партиями конечных устройств.
    Очень наивно полагать, что вы соберёте что-то хотя бы отдалённо похожее на заводской смартфон самостоятельно, и это будет дешевле заводского варианта.
    Поясню на примере. Без всякого андроида если собрать простейшую звонилку на модуле SIM800 и ардуинке, вы вылезете сильно (в разы) за пределы стоимости аналогичного по функциональности бабушкофона. Просто потому что сам модуль стоит как простейшая готовая звонилка с экраном, цветным экранчиком и корпусом в разумном по рамеру форм-факторе без торчащих проводов и не пол кило весом.
    Чтобы сделать смартфон с андроидом их готовых компонентов, вам придётся либо собирать все модули крупноблочно (блютус, вайфай, GSM из дорогих и некомпактных блоков, либо проектировать и разводить плату, что на несколько порядков сложнее и, судя по вашему вопросу, просто невозможно для вашего уровня.

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

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ответ написан
    Комментировать
  • Часто ли телеграм боты подвергаются атакам и как вы этого избегаете?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала что значит "атака"? Какую угрозу ты ожидаешь? Потому что ответы будут ОЧЕНЬ разные в зависимости от этого.

    IP бота можно будет попробовать узнать, если ты знаешь, что бот проходит по ссылкам, которые ты можешь ему отправить. Тогда, скинув боту ссылку на свой сайт, можно будет посмотреть, какие адреса заходили в этот момент.
    Если бот такого не делает, то скорее всего никак.

    Зафлудить бота запросами? С одного аккаунта не получится, а с многих - недёшево. Кому ты нужен за такие деньги?

    Потыкать команды бота на пример SQL-инъекции? Если бот вообще использует БД, достаточно использовать стандартные средства подстановки параметров в запросы, а не колхозить SQL чере зформатирование строк.

    Угнать бота? Не пости его токен никуда. Если хранишь исходный код в какой-то системе хранения версий - храни токен в отдельном файле и добавь его в исключения. Если есть подозрение, что токен уже уплыл - меняй его у BotFather. А угон акка разработчика - это другая песня уже.

    Короче, ответь хотя бы для себя на вопросы:
    1. чего конкретно боишься?
    2. кому конкретно ты нужен?
    Ответ написан
    2 комментария
  • Какую структуру репозиториев выбрать в проекте?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    • Бэк
    • Фронт
    • Мобилка
    • Либа проекта 1
    • Либа проекта ...
    • Либа проекта N

    Фронт так же можно сделать поддеревом/подмодулем бэка. Зачем выносить общий код в отдельные репозитории? Дык декомпозиция же. Удобнее работать с кучкой маленьких, законченных и более-менее автономными модулями/пакетами, чем размазывать одинаковый код по куче разных репозиториев и потом гадать что новее, старее, совместимее, оптимальнее и прочее. Да, можно сделать один общий репозиторий и держать там миллион разных модулей и прочего (ну или один большой и толстый). А потом копать кротовые норы с красными глазами в этой горе непонятно чего в поисках ошибок и нужного кода.
    Ответ написан
    Комментировать
  • Как называется такая практика и является ли она приемлемой?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Ветка отпочковывается от любого коммита. Обычно руками никто не создает ветку из старых коммитов, делают из последнего свежего.
    Просто весь смысл ветки в том, чтобы свою фичу пилить не блокируя мастер или релиз

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

    P.S. в фичаветку можно периодически мержить из мастера, чтобы держать свою ветку "свежей" и в конце, при мерже в мастер, вероятность конфликтов была меньше.

    А так - обычный feature-branch flow
    Ответ написан
    Комментировать
  • Как зарегистрировать дополнительные функции для ExpressionLanguage в Symfony?

    @ZardoZAntony Автор вопроса
    программист, сис. админ
    Сам разобрался.
    Тут надо массив вернуть.
    class ArrayCountExpressionLanguageProvider implements ExpressionFunctionProviderInterface
    {
        public function getFunctions()
        {
            return [
                     ExpressionFunction::fromPhp('count'),
           ];
        }
    }


    А перекрывать получается так:
    services:
        validator.expression_language:
            alias: App\Infrastructure\ExpressionLanguage\ExpressionLanguage
    Ответ написан
    Комментировать
  • Можно ли получить телеграм id по номеру телефона?

    @AzatKhafizof
    from pyrogram import Client
    from pyrogram.types import InputPhoneContact
    import json
    import tempfile
    
    
    api_id = 1234567
    api_hash = "1q2w3e4r5t6yhbv"
    app = Client("number", api_id=api_id, api_hash=api_hash)
    
    
    def get_chat_id(phone_num):
        temp_contact_name = tempfile.NamedTemporaryFile().name.split('\\')[-1]
        good_res = list()
        with app:
            app.import_contacts([InputPhoneContact(phone=phone_num, first_name=temp_contact_name)])
            contacts = app.get_contacts()
            for contact in contacts:
                contact_data = json.loads(str(contact))
                if contact_data['first_name'] == temp_contact_name:
                    good_res.append(contact_data)
                    app.delete_contacts(contact_data['id'])
        try:
            good_res = good_res[0]['id']
        except:
            good_res = None
        return good_res
    
    print(get_chat_id('+79000000000))


    Функция сначала добавляет номер по телефону, смотрит его chat_id потом удаляет контакт
    Ответ написан
    Комментировать
  • Как управлять яндекс-лампочкой в обход апи яндекса?

    @justslipknot Автор вопроса
    Как выяснилось, яндекс лампочки - это ребрендированная Tuya лампочка. У Tuya есть локальный протокол и модуль для Home Assistant. Но я решил вопрос немного иначе:
    1. Устанавливаем приложение Smart Life или Tuya Home (оба совместимы с яндекс лампами)
    2. Сбрасываем настройки лампочек и добавляем их в приложении Smart Life / Tuya Home
    3. Регистрируем приложение на платформе Tuya. Инструкция есть в этом репозитории.
      Пояснение
      Этот шаг нам нужно проделать, чтобы получить Local Key, который требуется для шифрования и расшифровки запросов (Local Key, как я понял, обновляется после сброса настроек). Инструкция, как быстро добавить устройства в приложение платформы Tuya так же представлено в репозитории

    4. Выбираем библиотеку для работы с Tuya local api. Я выбрал вот эту библиотеку для C#. На GitHub странице этой библиотеки есть инструкция по работе с Tuya local api.
    5. Реализуем нужный нам функционал


    Небольшой топорный пример из моего тестового проекта:
    Поиск устройств Tuya в сети

    // Эти данные можно получить на странице вашего приложения на платформе Tuya.
    var accessId = "<access id>";
    var apiSecret = "<api secret>";
    
    // Сканируем сеть на наличие доступных устройств Tuya. 
    // Хранение найденных устройств реализуется как душе угодно
    
    var scanner = new TuyaScanner();
    scanner.OnNewDeviceInfoReceived += (sender, info) =>
    {
       // логика сохранения найденных устройств 
    };


    Получение Local Key


    Самый важный этап.
    Пример взят из репозитория библиотеки
    var api = new TuyaApi(region: TuyaApi.Region.CentralEurope, accessId: ACCESS_ID, apiSecret: API_SECRET);
    var devices = await api.GetAllDevicesInfoAsync(anyDeviceId: DEVICE_ID);
    foreach(var device in devices)
    {
        Console.WriteLine($"Device: {device.Name}, device ID: {device.Id}, local key: {device.LocalKey}");
    }


    Отправка команд устройству

    var device = new TuyaDevice("<IP адрес>", "<local key>", "<device id>");
    
    // Пример команды включения лампочки
    // Метод FillJson автоматически подставляет нужные параметры, поэтому сразу пишем запрос.
    // Про методы DPS можно почитать в официальной документации Tuya
    var onCommand = device.FillJson("{\"dps\":{\"20\":true}}");
    
    var request = device.EncodeRequest(TuyaCommand.CONTROL, onCommand );
    
    // Посылаем сигнал. Если устройство не ответит, то падает исключение 
    var encodedResponse = await device.SendAsync(request);
    var response = device.DecodeResponse(encodedResponse);



    Далее остаётся разобраться с кодами команд и можете контролировать лампы как вам угодно.
    Ответ написан
    3 комментария
  • Почему валидация не работает как нужно Vuetify?

    AntiStream
    @AntiStream
    Потоковый программист
    value это число, а у числа нет длины, надо в начале конвертировать value в строку, чтобы сделать проверку на длину:
    https://codepen.io/artyomsilantiev/pen/jOZGOEL
    Ответ написан
    Комментировать
  • Как обстоят дела с работой в Украине?

    opium
    @opium
    Просто люблю качественно работать
    Плохо война, все кто работал на зарубеж и смог уехать уже уехали
    Ответ написан
    9 комментариев
  • Почему при обращении к private свойству родителя не происходит ошибки?

    Pro_Hacker
    @Pro_Hacker
    PHP Web-Developer
    Потому что обращения к приватному свойству нет, то есть просто не видно дочернему классу, потому что оно приватное, а приватное не видно никому. Поэтому на то и приватность
    и просто создается свойство c таким названием
    Ответ написан
    Комментировать
  • В чем преимущества процессов над потоками?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Главное приемущество: независимость процессов. Потоки делят между собой одну память и ресурсы системы (всякие хандлеры в винде, например).

    Если один из процессов завершится или, что чаще происходит, упадет - остальные не будут затронуты. Плюс эта независимость позволяет делать песочницы для безопасности. Так, все современные браузеры запускают js и вообще каждую вкладку в отдельном процессе. Даже если куллхацкер полностью взломает браузер через специальный сайт, он окажется в процессе, который особо прав никаких не имеет, библиотеки особо интересные туда не загружены, а все общение с внешним миром - через жестко прописанные протоколы ipc (inter-process communication). Так что злодею придется взламывать еще и их.

    Эта же независимость позволяет выполнять работу даже после завершения основного процесса. Так, если вы хотите сделать автообновятор программы, то после скачки/установки нового приложения, надо будет перезапустить основное приложение, чтобы перезаписать исполняемый файл (по крайней мере в винде). Но поток завершится вместе с программой и кто же тогда потом будет ее запускать? А вот процесс останется работать.

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

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сообщение об ошибке, согласно документации yup, может быть указано в двух видах - строка или функция. Вычисляемое свойство является объектом, так что чего там с ним будет происходить - непонятно. Поэтому заменим вычисляемое свойство на функцию, которая будет извлекать его значение:

    .min(6, passwordMessage) ---> .min(6, () => passwordMessage.value)
    Ответ написан
    5 комментариев
  • Проблема с ноутбуком?

    @Mikeoldfield
    Сетевой инженер / системный администратор
    "При разборке посыпались мелкие детальки." - мне кажется, в самом вопросе кроется ответ )))))
    Ответ написан
    Комментировать
  • Загружается файл index.php вместо входа на сайт. Почему так?

    karabanov
    @karabanov
    Системный администратор
    Некому передать скрипт на обработку и http сервер его просто отдаёт, как файл. Надо настроить PHP-FPM или, если используется Apache, включить соответствующий модуль.
    Ответ написан
    9 комментариев
  • Майнинг криптовалюты?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    Ноутбук, 2Гб ОЗУ, майнинг, 2022 год...
    Найдите лишнее слово
    Ответ написан
    1 комментарий
  • Выбор из нескольких компонентов?

    0xD34F
    @0xD34F Куратор тега Vue.js
    computed: {
      component() {
        /*
         * здесь возвращаете имя компонента, в зависимости от... это вам виднее;
         * если действительно будет так, как показано в вопросе - натуральные числа
         * соответствуют компонентам, то можно сложить имена компонентов в массив:
         * return [ 'component-1', 'component-2', 'component-3' ][this.x - 1];
         */
      },
    },

    <component :is="component" />
    Ответ написан
    1 комментарий
  • Выбор из нескольких компонентов?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    <component :is="x === 1 ? A : B" />

    Также работает со строками, если компоненты зарегистрированы локально/глобально/вообще из HTML:

    <component :is="x === 1 ? 'div' : 'my-component'"></component>
    Ответ написан
    1 комментарий