• Каким образом формируются имена файлов из набора букв и цифр?

    md5 или подобный хеш
    из плюсов, он позволит не хранить копии, если кто-то зальет картинку еще раз
    Ответ написан
    Комментировать
  • Нужен ли первичный ключ в таблицах PostgreSQL?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Почему работает в Access - потому что это другая БД. Поведение может различаться.

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

    Предполагаю, что эта таблица ссылается через references на столбец другой таблицы. В таком случае, на последнее должно стоять ограничение уникальности - иначе как понять на какую строку ссылаться.
    Ответ написан
  • Запросы soap в инфоклинику на php?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    У меня в одном из проектов есть десяток живых интеграций с инфоклиникой :)

    1. Они отлично отвечают на вопросы.

    2. У вас странный url. У инфоклиники есть центральный шлюз https://api.infoclinica.ru/api/xml
    Там все те же самые xml, но без soap.

    3. XML запрос мы собираем руками и просто отправляем post в body.
    TS.1 - это `date('YmdHis')`
    MSH.10 - рекомендуется уникальный для каждого запроса

    4. Там есть определенная пляска с подписью запроса сертификатом, на centos так и не заработало, пришлось виртуализироваться
    Ответ написан
    Комментировать
  • Каково критическое количество HTTP (ajax) запросов на сервер, как его расчитать?

    @Everything_is_bad
    Нет никаких расчетов, только нагрузочное тестирование, потому что можно написать сервис который без проблем держит 30rps на одном ядре, а можно написать 0.01 rps на 4х ядрах.
    Ответ написан
    Комментировать
  • Почему не работает проверка NAN?

    В Javascript NaN != NaN . Довольно логичный выбор: если undefined - это состояние, то NaN - признак отсутствия характеристики. Я - NaN , Вы - NaN , но Вы - не я.
    Ответ написан
    Комментировать
  • Подойдет ли базовый MacBook Air M1 8/256 для web разработки?

    @Zloycate
    661b9f2922634254730016.png
    Открыт средний проект в phpshorm
    Ответ написан
    Комментировать
  • Подойдет ли базовый MacBook Air M1 8/256 для web разработки?

    @Tur8008
    У меня Mac book air 8 256 m1. Занимаюсь веб разработкой. Полностью согласен с автором. 8 Гб некомфортно мало. Память закончится на открытии 2х браузеров, vscode и docker. Повёлся на хайп и советы друга. При этом говорил ему что 8 Гб мне мало, но почему то повёлся на восторженные хвалебные m1. Буду менять. Запомните 8 Гб озу для разработки в 2024 г это несерьёзно!
    Ответ написан
    Комментировать
  • Как сделать ссылку для перехода на определенное имя в html-таблице?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Использовать стандартные якоря.
    Ответ написан
    Комментировать
  • Как лучше сделать обновление данных строго по времени?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Веб-разработка
    Относительно простое решение такое:
    • У вас есть какой-то сервер сокетов, который постоянно запущен и поддерживает соединения с клиентами.
    • У вас есть какой-то сервер очередей.
    • Сервер сокетов слушает сервер очередей и, при получении нужных данных, рассылает их клиентам.
    • По крону срабатывает скрипт, который кладёт данные в очередь.
    Ответ написан
    Комментировать
  • Как на мобильных устройствах добиться height 100vh на первом экране?

    @Froggyweb
    Ответ написан
    Комментировать
  • Непонятное поведение своей интерпретации функции Promise.race, почему так происходит?

    Alexandroppolus
    @Alexandroppolus
    кодир
    строка
    promise.then(onFullfiled).catch(onRejected);
    на самом деле работает как
    promise.then(onFullfiled, err => {throw err;}).then(v => v, onRejected);

    Если имеем дело с зарезолвленным/зареджекченным промисом, то здесь первый then ставит микротаск в очередь сразу, а второй - только по выполнении микротаска от первого.

    соответственно, для примера
    const promises = [
      Promise.reject('rejected1'),
      Promise.reject('rejected2'),
      Promise.resolve('resolved'),
    ];


    микротаски составили такую очередь:
    1) err => {throw err;}
    2) err => {throw err;}
    3) onFullfiled
    4) onRejected,
    5) onRejected
    6) v => v,


    Где пункты 1-3 добавились на цикле, а 4-6 по мере выполнения первых трёх.

    вот так и вышло, что onFullfiled вылез вперед.
    Ответ написан
    1 комментарий
  • С какого количества записей индексация имеет смысл?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    С какого количества записей индексация имеет смысл?

    С того момента, когда планировщик начал показывать приличную разницу, как только получаете прирост - используйте индексацию, не получаете - не используйте.
    Сделал выборку по определенному имени, вышло 75-90 мсек.
    SELECT name FROM users WHERE name='Mike';
    Добавил индекс CREATE INDEX name_idx ON users (name);
    Выборка так и осталась в пределах 75-85 мсек.

    Вы сами задали вопрос и сразу же ответили на него...
    Ответ написан
    Комментировать
  • Как реализовать домашний ПК для веб сервера и pet проектов?

    @dronmaxman
    VoIP Administrator

    1) Подскажите какую лучше поставить операционную систему? Если Linux, то в сторону каких дистрибутивов смотреть. Хотелось бы удалённо подключаться к этому ПК для мониторинга или обновления файлов с github.

    Proxmox или другой гипервизор
    2) Актуален ли для подобного Docker или слишком много ресурсов будет отнимать?

    Актуален.
    3) Правильно ли запускать различные сайты просто на разных портах роутера?

    Лучше использовать прокси (я бы использовал traefik или nginx).
    5) Раз выполняется проброс порта, то как это обезопасить?

    Как раз стоит изучить решения по защите (nginx Bunker, geoip, crowdsec)
    Ответ написан
    Комментировать
  • Почему я получаю ошибку invalid operation: err (variable of type Error) is not an interface при проверке типа переменной?

    https://go.dev/play/p/eDi3J3Zzcdg

    package main
    
    import "fmt"
    
    type MyError struct {
    	Message string
    }
    
    func (e MyError) Error() string {
    	return e.Message
    }
    
    func (e MyError) Smth() {
    }
    
    type SomeInterface interface {
    	Smth()
    }
    
    func main() {
    	var err SomeInterface
    	err = MyError{"Something went wrong"}
    
    	// Проверяем, реализует ли err интерфейс error
    	if _, ok := err.(error); ok {
    		fmt.Println("err реализует интерфейс error")
    	} else {
    		fmt.Println("err НЕ реализует интерфейс error")
    	}
    }


    У вас получилось, что тип переменной err это структура, но нужно чтобы тип был каким-нибудь интерфейсом.

    В моем примере я создал интерфейс SomeInterface и добавил вашему типу метод, чтобы он этому интерфейсу удовлетворял. Теперь данный ассершн имеет смысл.

    P.S. С пустым интерфейсом тоже работать будет https://go.dev/play/p/Yz0M1Wzopua
    Ответ написан
    Комментировать
  • Нужно ли стремиться обнулять переменные и по возможности не создавать их копий в проектах php?

    Melkij
    @Melkij
    PostgreSQL DBA
    Ведь когда мы создаем переменную, то в нее копируется значение другой переменной и мы работаем с копией

    Неа. См. zval

    Начав работать с языком Go начал придавать значение экономии памяти - не создавать лишних переменных.

    Разве компилятор go недостаточно умён для элементарных оптимизаций кода?
    Вы проверяли байткод, ваша оптимизация действительно имеет место или это самообман?
    Ответ написан
    5 комментариев
  • Как на один элемент повесить два события, клик и двойной клик?

    @alexalexes
    this.content.querySelectorAll('.cell').forEach((cell) => {
      let timer = null; // дескриптор отложенного обработчика одного клика
      cell.addEventListener('click',  (e) => {
         if(timer)
           clearTimeout(timer); // при каждом клике сбрасываем отложенный обработчик обработки одного клика
         if(e.detail == 1) // на первом клике устанавливаем отложенный обработчик
           timer = setTimeout(handleClickCell, 250); // Выполнение функции по одинарному клику после ожидания второго клика 250мс
         if(e.detail == 2) // на втором - выполнение обработчика двойного клика
         {
            // благодаря счетчику detail в ивенте можем посчитать длину очереди непрерывных кликов, и в нужный момент выполнить функцию на втором клике
            console.log('111');
         }
        } );
    });
    Ответ написан
    1 комментарий
  • Как вставлять записи в базу данных со значением null, если переменная пустая?

    (NULL, '$val1', '$val2')
    1. Не стоит оборачивать в кавычки значение, пока не убедились что в нём не null.
      'null' для MySQL это уже строка
    2. PHP-шный null при приведении к строке преобразуется в пустую строку. Так что либо заменяйте его на строку NULl сами, либо перестаньте работать с запросами как со строками, и воспользуйтесь методами для построения запросов
    Ответ написан
    2 комментария
  • Как можно решить проблему с доступам к методам PHP классов унаследованным от одного класса?

    alestro
    @alestro
    Как вариант можно сбрасывать скоп внутри метода $api->dependency

    class Node
    {
        protected function func1() {
        }
    }
    class NodeA extends Node
    {
        public function FUNC2() {}
    }
    class NodeB extends Node
    {
        // Функция инициализации
        public function __construct()
        {
            (new Api())->dependency(
                function (?NodeA $a) {
                    $a->FUNC2(); // Метод успешно вызывется так как он public
                    $a->func1();  // Call to protected method Node::func1() from global scope
                }
            );
        }
    }
    
    class Api {
        function dependency(callable $dependency) {
            if ($dependency instanceof Closure) {
                $dependency = Closure::bind($dependency, null, null);
                $dependency(new NodeA());
            }
        }
    }


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

    class Node
    {
        private array $whiteList = [
            NodeA::class
        ];
    
        protected function func1() {
            $scope = debug_backtrace(2, limit: 2)[1]['class'];
            if (!in_array($scope, $this->whiteList)) {
                throw new Exception('Нельзя вызвать метод для данного класса '. $scope);
            }
        }
    }
    class NodeA extends Node
    {
        public function FUNC2() {}
    }
    class NodeB extends Node
    {
        // Функция инициализации
        public function __construct()
        {
            (function (?NodeA $a) {
                $a->FUNC2(); // Метод успешно вызывется так как он public
                $a->func1();  // Нельзя вызвать метод для данного класса NodeB
            })(new NodeA());
        }
    }
    Ответ написан
    1 комментарий
  • Как сделать такой input type range?

    Get-Web
    @Get-Web Куратор тега CSS
    Front-End Developer
    Ответ написан
    Комментировать
  • Насколько актуальна книга Марка Саммерфильда?

    @calculator212
    в 2013 на английском и только в 2016 году на русском, а это почти 10 лет назад,
    Глобальных измений за 10 лет было не так много, упражнения в этой книге в целом довольно интересные (если затык с ними то можно на гите поискать решения), поэтому в целом книга достаточно актуальная.
    Ответ написан
    Комментировать