Задать вопрос
  • Как правильно перебрать вложенный массив и вывести результат?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    <?php
    $goods = [
        'ASUS TUF' => ['Игровые ноутбуки', 'Ноутбуки для работы'],
        'ARDOR GAMING NEO' => ['Игровые ноутбуки', 'Ноутбуки для работы'],
        'MSI Katana' => ['Игровые ноутбуки', 'Ноутбуки для работы'],
        'HUAWEI MateBook D 16 2024 MCLF-X' => ['Ноутбуки для работы', 'Ультрабуки'],
        'Samsung Book3 Pro 360 NP960' => ['Ноутбуки для работы', 'Ультрабуки', 'Ноутбуки-трансформеры']
    ];
    
    echo "<ul>";
    foreach ($goods as $name => $categories) {
        echo "<li>$name: " . implode(", ", $categories) . "</li>";
    }
    echo "</ul>";
    ?>
    Ответ написан
    Комментировать
  • Почему на сайтах в js коде используются непонятные однобуквенные переменные и что они значат?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что для рабочей версии сайта чаще всего используют минифицированные версии файлов.
    Ответ написан
    1 комментарий
  • В чём ошибка js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ни в чём. Ошибка у тебя скорее всего в html, который ты не привёл.
    // разве что чтоб шаблоны в строках работали надо использовать ` а не ".
    Ответ написан
    4 комментария
  • Как применить js код к своему блоку?

    @historydev Куратор тега JavaScript
    Редактирую файлы с непонятными расширениями
    Рефакторинг на тебе.
    Ответ написан
    Комментировать
  • Как удалить из массива?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Так вы только копируете значение (строку  "1") из подмассива в переменную:
    $del = $arr[1]['one'];
    В переменную $del записался байт ASCII-сивола "1", условно говоря.

    unset здорового человека именно такой: unset($arr[1]['one'])

    unset курильщика можно организовать записью ссылки на массив в переменную. Но конкретный ключ всё равно придётся указывать внутри unset:
    $arr = [ 1 => [
        'one' => '111',
        'two' => '222',
    ],  ];
    
    $del = & $arr[1]; // ссылка на массив
    unset($del['one']); // удаление ключа из массива по ссылке
    
    print_r($arr); // результат Array ( [1] => Array ( [two] => 222 ) )


    Попытка удалить полную ссылку на элемент не сработает, т.к. она просто удалит "связь" этой переменной $del с элементом исходного массива. А массив останется без изменений.
    $del = & $arr[1]['one']; // ссылка на элемент, который хочется удалить
    unset($del); // не сработает. Просто разорвёт ссылку $del на элемент
    Ответ написан
    2 комментария
  • Как удалить Dr.Web Cureit?

    Ms config автозагрузку, смотрите может процесс фоном висит. Cureit вроде идёт без установки, а просто разово запускался - давно не пользовал.
    Ответ написан
    Комментировать
  • Как составить наиболее эффективный алгоритм групповой рассылки сообщений по каналам WebSocket?

    @calculator212
    Ведь соединений может быть как 2 так и 1_000_000+, что уже будет плохо и перебор всех элементов такой Map на каждом создание сообщения будет не очень хорошо сказываться, а так же, в примере это групповой канал, который может содержать так же от до 2 до бесконечного числа пользователей.

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

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

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

    @ImMrDimm
    Что если попробовать что-то такое

    Объявляем переменные, которые принимают значения в зависимости от языка на уровне root
    :root {
        --main-color: blue;
    }


    На уровне html переопределяем их как нам нравится в связке с языком

    html[lang="en"]
    {
        --main-color: red;
    }
    html[lang="ru"]
    {
        --main-color: green;
    }


    А затем в нужных местах используем эту переменную

    h1 {
    color:  var(--main-color);
    }


    Проверил, без всяких scss/less работает
    Ответ написан
    Комментировать
  • Как сделать чтобы sphinx выдавал сперва точные совпадения а потом остальные?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Используйте оператор WEIGHT() для приоритизации точных совпадений:
    SELECT *, WEIGHT() as relevance 
    FROM my_index 
    WHERE MATCH('^"точный запрос"$ | запрос')
    ORDER BY relevance DESC;


    Можно также использовать операторы ORDER BY для сортировки по релевантности и FIELD() для повышения релевантности точных совпадений
    SELECT * 
    FROM my_index 
    WHERE MATCH('запрос') 
    ORDER BY FIELD(my_column, 'точный запрос') DESC, relevance DESC;
    Ответ написан
    6 комментариев
  • Почему в функции MYSQL при присвоении в переменную значения из таблицы не учитывается условие WHERE?

    @Uncleruc1
    Проблема заключается в том, что в вашей функции условие WHERE \orderid` = 871жестко зафиксировано, и оно всегда будет брать строку с этимorderid, игнорируя переданное значение orderid` в параметр функции.

    Чтобы учитывать переданное значение в параметр функции, необходимо использовать сам параметр orderid вместо фиксированного значения. Вот исправленный код функции:
    DROP FUNCTION IF EXISTS YourFunction;
    DELIMITER $$
    CREATE FUNCTION YourFunction (qty INT, orderid INT) RETURNS TEXT
    
    BEGIN
    DECLARE text_t TEXT;
    SELECT `sum` INTO text_t FROM t_order_price_type WHERE `orderid` = orderid LIMIT 1;
    RETURN text_t;
    END$$
    
    DELIMITER ;


    Однако, в данном виде WHERE \orderid` = orderid` не сработает так, как вы ожидаете, потому что MySQL может спутать поле таблицы с параметром функции. Чтобы избежать этой путаницы, лучше использовать псевдонимы или уникальные имена для параметров. Например:
    DROP FUNCTION IF EXISTS YourFunction;
    DELIMITER $$
    CREATE FUNCTION YourFunction (p_qty INT, p_orderid INT) RETURNS TEXT
    
    BEGIN
    DECLARE text_t TEXT;
    SELECT `sum` INTO text_t FROM t_order_price_type WHERE `orderid` = p_orderid LIMIT 1;
    RETURN text_t;
    END$$
    
    DELIMITER ;

    Здесь параметр функции называется p_orderid, что предотвращает конфликт имен между полем таблицы и параметром функции.
    Ответ написан
    2 комментария
  • Анимация градиента рамки input, почему не работает?

    @shsv382
    Замените animation: rotate 8s easy-in infinite;
    на правильное animation: rotate 8s ease-in infinite;
    Ответ написан
    2 комментария
  • Какой фреймворк для Go изучать в 2024 году?

    @dcaraxes
    meme engineer
    По большей части фреймворки не нужны, для удобства можно использовать сторонние роутеры, которые работают поверх net/http. Например, go-chi, gorilla/mux (его снова начали поддерживать). Можете попробовать Go 1.22 - там как раз нововведения касательно роутера в стандартном пакете, и не придется тянуть сторонние зависимости.
    Ответ написан
    Комментировать
  • Как в goшном SOA сервисе работать с базой данных?

    Не знаю, какая у вас архитектура, но когда какая-то библиотека обрастает огромным количеством методов, то Go - это один из редких языков программирования, который, благодаря своей утиной типизации позволяет использовать шаблон проектирования "consumer interfaces", т.е. объявлять интерфейсы в месте, где они используются и включать в эти интерфейсы только те методы из огромной структуры базы данных, которые именно тут, на месте, и используются. Таким образом ваши интерфейсы будут минимальными, понятными, и искать их не придётся. Ну, и в добавок, старый добрый Dependency Injection решит массу наших проблем

    База данных:
    package db
    
    import "fmt"
    
    // Стуктура базы данных. Здесь нам даже и не нужно объявлять никаких интерфейсов
    type Service struct {
    	// ...
    }
    
    func NewDbService() (*Service, error) {
    	return &Service{}, nil
    }
    
    func (d *Service) CreateUser(username string, email string) {
    	fmt.Println(fmt.Sprintf("user %s with email %s is created", username, email))
    }
    
    func (d *Service) CreateProduct(name string) {
    	fmt.Println(fmt.Sprintf("product  %s is created", name))
    }


    Пользователь:
    package user
    
    // Тот самый интерфейс, который нам позволяет выбрать из структуры базы данных
    // только нужные нам здесь методы
    type dbUser interface {
    	CreateUser(username string, email string)
    }
    
    type Service struct {
    	db dbUser
    	// ...
    }
    
    func NewService(db dbUser) (*Service, error) {
    	return &Service{db}, nil
    }
    
    func (c *Service) New(username string, email string) {
    	c.db.CreateUser(username, email)
    }


    Товар:
    package product
    
    // Тот самый интерфейс, который нам позволяет выбрать из структуры базы данных
    // только нужные нам здесь методы
    type dbProduct interface {
    	CreateProduct(name string)
    }
    
    type Service struct {
    	db dbProduct
    	// ...
    }
    
    func NewService(db dbProduct) (*Service, error) {
    	return &Service{db}, nil
    }
    
    func (p *Service) New(name string) {
    	p.db.CreateProduct(name)
    }


    main.go
    package main
    
    import (
    	"test2/db"
    	"test2/product"
    	"test2/user"
    )
    
    func main() {
            // Инициализируем базу данных
    	dbService, _ := db.NewDbService()
            // Структура базы данных реализует интерфейс dbProduct, инжектим её
    	productService, _ := product.NewService(dbService)
            // Структура базы данных реализует интерфейс dbUser, инжектим её
    	userService, _ := user.NewService(dbService)
    
            // Пользуемся на здоровье...
    	userService.New("user1", "uswr1@example.com")
    	productService.New("product1")
    }
    Ответ написан
    Комментировать
  • Если в glang перемнная передана в func, то она там живёт сомостоятельно или в пямяти 1 адрес?

    В Го по-умолчанию переменные передаются по значению (то есть, копируются на стеке), но есть нюансы.

    1. Мапы и каналы всегда передаются по указателю.
    2. У слайса на стеке только дескриптор, так что он копируется, но данные, на которые слайс указывал, остаются там же в памяти, где и были.
    3. Если вы явно передаете указатель, то тут все очевидно.
    4. У интерфейсов копируется дескриптор, но т.к. в дескрипторе указатель, то тут все как со слайсами.
    Ответ написан
    Комментировать
  • Где писать логику работы с БД?

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

    Однако, лично я считаю этот паттерн вредным, потому что он намешивает всё в одну кучу. Это моё субъективное мнение, и я вам его не навязываю. Я бы отделил мух от котлет, и оставил бы структуру чистой, т.е. только данные и какие-то методы, которые работают конкретно с этими данными из структуры, а взаимодействие с базой данных организовал бы через паттерн проектирования Repository. Т.е. мы делаем уже отдельную структуру ProductRepository, которая содержит в себе методы, принимающие и отдающие структуру Product, и уже в этих методах реализуем вызов базы данных.

    Я набросаю вам простенький интерфейс для использования этого паттерна, а конкретную структуру, реализующую этот интерфейс вы уже напишете сами. Интерфейсы использовать в таких случаях считаю вообще обязательным условием. Например, так нам будет гораздо проще тестировать код, всё становится гораздо гибче. Ведь структурку Product вы сможете без проблем использовать не только при работе с базой, но и при передаче данных в другие системы, не волнуясь о лишних методах, висящих на ней. Так же вы сможете легко менять реализации репозитория, не меняя бизнес-логику проекта. (Это позволит, например, легко заменить базу данных)

    package models
    
    type Product struct {
    	ID    int    `json:"id"`
    	Title string `json:"title"` //Название
    	Price int    `json:"price"` //Цена
    }
    
    type ProductGetter interface {
        GetAll() ([]Product, error)
        GetByID(id int) (Product, error)
    }
    
    type ProductCreator interface {
        Create(product Product) (Product, error)   
    }
    
    type ProductUpdater interface {
        Update(product Product) (Product, error)
    }
    
    type ProductDeleter interface {
        Delete(id int) error
    }
    
    type ProductRepository interface {
        ProductGetter
        ProductCreator
        ProductUpdater
    }
    Ответ написан
    4 комментария
  • Как реализуется более одного подключения на порт(сокет)?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    По мнению некоторых участников дискуссии подключений не может быть более 65536
    Насколько я помню - всего TCP-портов 65536 (порт 0 зарезервирован), а максимальное количество соединений на один порт, не припоминаю, что бы чем-то ограничивалось (ну кроме ресурсов машины). Вы же понимаете, как в общей сложности всё это работает? Сервер хранит где-то в недрах памяти информацию по каждому соединению, при этом Вы можете подключаться многократно на один и тот же порт, с одного и того же IP к тому же самому серверу...

    Не знаю, с какой именно стороны Вас данный вопрос интересует больше, с теоретической или практической... когда-то давно, возникла проблема "мирового масштаба", под названием C10k, которая впоследствии была успешно решена в ряде программ, в т.ч. Nginx (который создавался в т.ч. с прямым расчётом решения этой проблемы). Если Вы перейдете по последней ссылке, там Вы можете встретить следующую фразу:
    По состоянию на середину 2010-х годов серверный аппаратный узел среднего уровня способен обрабатывать до 10 млн соединений
    , т.е. 2010-й год, 10млн. соединений, одновременно. Думаю, этой цифры более чем достаточно практически для любого современного и даже очень нагруженного проекта, к тому же, как Вы могли заметить, про ограничения протокола TCP/IP, даже гипотетические - ничего не сказано.
    Ответ написан
    Комментировать
  • Как набрать нужную сумму из определенного количества монет?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Можно целочисленным линейным программированием решать. Бинплиском перебтрайте ответ (k), потом составляйте задачу, где у вас переменные: сколько монет каждого типа берём в каждый из k разменов. И еще будут неравенства, что каждый тип монет используется суммарно не больше, чем есть монет. Целевая функция - любая.

    Еще можно чуть по-другому: находите переблром все варианты одного размена. Потом у вас переменные будут, сколько раз каждый из вариантов берете. Ограничения на общий расход каждой монеты, а целевая функция - сумма переменных. Тут нет бинплиска, но тоже ЦЛП.
    Ответ написан
    Комментировать
  • Почему нету возможности отключить комментарии к вопросу?

    TosterModerator
    @TosterModerator Куратор тега Тостер
    Модератор Хабр Q&A
    Комментарии необходимы для того, чтобы пользователи могли уточнять недостающую информацию и выражать свое мнение о вопросах. Нередко комментарии оказываются гораздо полезнее ответов. Было бы предельно странно, если бы разработчики Q&A-сервиса дали авторам вопросов возможность блокировать комментарии.
    Ответ написан
    1 комментарий
  • Как привязать значение переменной к строчке/столбцу в эксель чтобы получить значение ячейки?

    @imba
    """
    0) проблема твоей таблицы, в том что есть ячейки содержащие несколько значении и наити нужную можно только пройдя по ним и сравнивая целевое значение с теми что есть в ячейке , это долго тем более если несколько запросов от пользователя будет

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

    2) НО если по какой-то не озвученной причине, важно читать напрямую, то либо брать значение ввода а потом искать в какой ячейке оно есть и запоминать индекс а дальше по наиденным индексам читать значение ячейки с коэффициентом

    result = ws.cell(row=row_id, column=column_id).value

    или можно так

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

    """

    factory = {
    "возраст":{18:3, 19:3, лет:номер_строки}
    "стаж":{0:2, 1:3, 3:4, 4:4 , лет:номер_ряда }
    }

    command_row = input('введите команду и значение: ')
    # например пользователь вводит
    # возраст = 18

    command = command_row.split('=')
    # содержимое command = ['возраст ', ' 18']

    #дальше обращаемся к нашим словарям по ключам и лучше через метод get наслучай если ввели что-то не то

    row_id = factory.get(command_row[0].strip(),{}).get(int(command_row[1].strip()))

    #равноценно factory["возраст"][18]
    #даст тебе номер строки или столбца в зависимости от команды
    #row_id , column_id значения которые вернет тебе этот словарь factory для команды возраст и стаж - неперепутаи)))

    #получить само значение будет просто
    #как тебе гпт написало, открываем фаил и таблицу а дальше берем наши индексы и читаем содержимое ячейки
    result = ws.cell(row=row_id, column=column_id).value
    Ответ написан
    2 комментария