• Стоит ли json'ить все и всегда при получении/отправки запроса?

    @Kirill-Gorelov
    С ума с IT
    Нет, не обязательно.
    Зависит от контекста задачи. Я думаю, что и тебе в этом скрытого смысла нету. Делай как удобно.
    Ответ написан
    Комментировать
  • В чем сложность поддержки проектов на Go?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Более четырёх лет пишу на Go, лично для меня поддерживать проекты на других языках сложнее ))
    До Go много лет писал на Perl/PHP/Python/Java/C/Ruby on rails/JavaScript и "крутил" еще не мало чего.
    Сейчас пишу только на Go и Python.

    Основная сложность в Go - это то, что если вы начинаете писать "криво" - то писать так очень трудно :))
    Подход к реализации в Go достаточно непривычный для тех, кто приходит из скриптовых языков.
    Например запрет циклических импортов - это самое первое, что "взрывает" мозг :)
    Нужно время чтобы адаптироваться после скриптовых языков.

    Про обработку ошибок - это да, это, пожалуй, единственное что мне не нравится в Go.
    Для себя я решил эту проблему за 1-2 часа :) и больше меня это не беспокоит.

    По ООП - в Go оно есть, лично мне оно нравится намного больше, чем ООП в других языках ))
    Всё, что реально нужно - всё есть, но при этом ничего лишнего нет.
    Интерфейсы - просто прекрасны :)) Каналы, горутины - это просто "счастье" :))

    А если объективно - то я бы не стал говорить о сложности поддержки проекта применимо к какому то конкретному языку.

    Как правило сложность поддержки возникает там, где нормальная архитектура не заложена в проект.
    Т.е. проект как могла так и писала куча людей плюс, как обычно, сделать нужно было побыстрее )), от этого никто вообще не думал об архитектуре и получилось то, что получилось :))
    Про покрытие тестами и документацию мы вообще не говорим )))

    А когда в таком проекте нужно что-то доработать или исправить ошибку, то почти всегда очень не просто найти то место, где нужно править, и после правок в одном месте, как правило, что-то ломается в другом :)

    Как минимум, нужно соблюдать принципы SOLID, иначе код получается, мягко говоря, не поддерживаемым.
    Но понимание этих принципов так же приходит с опытом, их нельзя научиться соблюдать просто прочитавши книгу или статью. Нужно сделать несколько проектов используя эти принципы, написать криво, понять как было бы правильно, всё переделать и так несколько раз.
    Тогда, со временем, начнёт получаться понятный и легко поддерживаемый код.

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

    Хочется добавить, что как бы не писали про Go, что он простой и т.д. - он явно сложнее Python/PHP и т.д.
    Это еще один повод сказать, что поддерживать код на Go сложно ))

    Также стоит учитывать, что проекты которые пишут на Go зачастую сложнее, чем проекты для которых выберут скриптовый язык. Go выбирают когда планируются большие нагрузки, параллельная обработка чего-либо и т.д., а это, в свою очередь, дополнительно усложняет проект.
    Ответ написан
    7 комментариев
  • Закончить ВУЗ по направлению "Разработка программного обеспечения" в 27 лет - это поздно?

    Zoominger
    @Zoominger Куратор тега IT-образование
    System Integrator
    Нет, не стоит.
    Получил первую "вышку" в том же возрасте, всем как было плевать, так и осталось.
    Ответ написан
    Комментировать
  • Какой объём трафика у websocket если ничего не передавать и просто держать соединение?

    @deliro
    PING/PONG кидается раз в 20 секунд https://websockets.readthedocs.io/en/latest/topics...
    PING/PONG фреймы — по одному байту. Плюс, если считаем, объём TCP и IP фреймов.

    Итого за час 180 пингов и 180 понгов или 360 байт не считая оверхэда на нижележащие фреймы.
    Если считать оверхэд, то примерно 65 байт x (180 пингов + 180 понгов) ~ 23кб/час

    Плюс, какой-то оверхэд даст TLS и его хэндшейки, плюс, незначительный оверхэд дадут хэндшейки TCP. Но это явно не близко к 70мб
    Ответ написан
    2 комментария
  • Как сделать запрос через тройную связь, при это получая все связанные значения 3 таблицы в массив к 1 записи?

    rozhnev
    @rozhnev Куратор тега MySQL
    Fullstack programmer, DBA, медленно, дорого
    Mysql:
    select json_object(
    	'id', user_id,
    	'username', username,
    	'project_id', project_id,
    	'roles', json_arrayagg(role)
    ) roles
    from user_projects
    join users on users.id = user_id
    group by user_id, project_id;


    MySQL json_arrayagg, json_object
    Ответ написан
    3 комментария
  • Какой вид инсерта быстрее?

    delphinpro
    @delphinpro
    frontend developer
    Мульти инсерт быстрее.
    insert into t values (), (), ()
    Ответ написан
    Комментировать
  • На сколько хорошо нужно знать разговорный английский для работы на удаленную компанию?

    alexgp13
    @alexgp13
    Руководитель ИТ-проектов
    Именно разговорный английский нужен не так часто, сейчас большая часть общения в мессенджерах, плюс в реальной жизни в английской речи очень лояльно относятся к ошибкам, главное, чтобы понять друг друга могли.
    Из личного опыта - тяжело общаться с англичанами и очень тяжело общаться с индусами, европейцы обычно говорят очень понятно. С индусами, к слову, за три разные попытки общения так и не смог поговорить, у нас совсем разный английский)
    Ответ написан
    Комментировать
  • Как использовать \n в exec()?

    @sadsdasdasdsadsadsadsadsa
    WEB developer
    Попробуйте два слеша
    Ответ написан
    1 комментарий
  • Как убрать открытие файла в сайдбаре со всеми подпапками при закрытии файла?

    MrDecoy
    @MrDecoy
    Верставший фронтендер
    видимо, при закрытии файла у Вас открывается другой файл из этой же папки, а в настройках по умолчанию файл показывается в сайдбаре при открытии.
    Соответственно, идём в настройки и там ставим false
    615af351eb386058442022.png
    Ответ написан
    Комментировать
  • Как сделать подключение сразу к нескольким базам данных?

    @FernandoErrNando
    В конфиге пропишите:

    <?php
    return [
        'components' => [
           'db' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=name',
                'username' => 'login',
                'password' => 'password',
                'charset' => 'utf8',
            ],
            'db2' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'pgsql:host=localhost;dbname=db2',
                'username' => 'user',
                'password' => 'pass',
                'charset' => 'utf8',
            ],
           
    ];

    Затем в моделях, которые используют 2-ю бд, просто укажите её:
    public static function getDb()
        {
            return Yii::$app->db2;
        }
    Ответ написан
    3 комментария
  • Walkor/Workerman как реализовать чат с комнатами и несколькими вокерами?

    @kak2z Автор вопроса
    В общем сам себе отвечаю... вот это расширение подходит для рассылки по вокерам.. https://github.com/walkor/Channel
    Ответ написан
    Комментировать
  • Можно ли использовать функции node.js в проекте vue и как?

    Нет, нельзя.
    В браузерном js не доступны функции, которые есть только в Node. Например работа с файлами и сетью (кроме fetch).

    Если вам нужно работать с файлами на сервере, то делайте http-api для этого.
    Если вам нужно работать с файлами на клиенте, то берите FileSystem
    Ответ написан
    Комментировать
  • Как в php сделать запрос на удаленный сервер используя параметры FormData()?

    alexeyvolodin
    @alexeyvolodin
    истина где-то рядом
    Ответ написан
    Комментировать
  • Есть ли на Yii2 нормальные websocket'ы?

    cr1gger
    @cr1gger
    Все дороги ведут в Рим — встретимся в Риме!
    Зачем именно под yii ищешь. Бери шире)
    https://github.com/walkor/Workerman

    Сам пользуюсь ею на Yii2 и нормально все

    Можешь на мой ГК посмотреть :D
    Но лучше его конечно переписать на адекватный код, потому что это я писал чтобы написать, работает и ладно
    chat на вебсокетах

    <?php
    
    use Workerman\Worker;
    require_once __DIR__ . '/vendor/autoload.php';
    
    $unique_users = [];
    $context = array(
        'ssl' => array(
            'local_cert'  => __DIR__ . '/privatessl/cert.pem',
            'local_pk'    => __DIR__ . '/privatessl/key.key',
            'verify_peer' => false,
        )
    );
    
    // Create a Websocket server with ssl context.
    $ws_worker = new Worker('websocket://website.ru:6374', $context);
    
    $ws_worker->transport = 'ssl';
    
    $ws_worker->onMessage = function ($connection, $data) use ($ws_worker, &$unique_users) {
        $response = json_decode($data);
        ## Команды ##
        if (isset($response->command)) {
    
            ## Получение пользователей онлайн ##
            if ($response->command == 'getOnline') {
    
                $connection->send(getOnline($unique_users));
            }
            ## Отправка нового сообщения ##
            if ($response->command == 'sendMessage' && isset($response->message) && !empty($response->message)) {
                sendMessage(
                    $response->message,
                    $response->login,
                    $response->avatar,
                    $ws_worker,
                    $connection
            );
            }
        }
    };
    $ws_worker->onConnect = function($connection) use (&$unique_users)
    {
        $ip = $connection->getRemoteIp();
        if (!in_array($ip, $unique_users))
        {
            $unique_users[] = $ip;
        }
    };
    $ws_worker->onClose = function($connection) use (&$unique_users)
    {
        $ip = $connection->getRemoteIp();
        $index = array_search($ip, $unique_users);
        unset($unique_users[$index]);
    };
    function getOnline($unique_users)
    {
        $online = [
            'action' => 'online',
            'body' => count($unique_users),
        ];
        return json_encode($online);
    }
    function sendMessage($message,$login, $avatar, $worker, $connection)
    {
        $body = [
            'action' => 'newMessage',
            'body' => $message,
            'login' => $login,
            'avatar' => $avatar,
            'time' => date('d.m.Y в H:i', (time() + 10800))
        ];
        foreach ($worker->connections as $client) {
            $client->send(json_encode($body));
        }
        addMessageDB($message, $login, $avatar);
    }
    function prepareText($text)
    {
        return htmlspecialchars($text);
    }
    function addMessageDB($message, $login, $avatar){
        $db_config = require(__DIR__ . '/config/db.php');
        $db = new PDO($db_config['dsn'] . ';charset=' . $db_config['charset'], $db_config['username'], $db_config['password']);
        $sth = $db->prepare('INSERT INTO chat_message (message, created_at, login, avatar) VALUES (:mess, :create_time, :login, :avatar)');
        $sth->execute([
            ':mess' => prepareText($message),
            ':create_time' => time(),
            ':login' => prepareText($login),
            ':avatar' => prepareText($avatar),
        ]);
        return $sth->fetchAll(PDO::FETCH_ASSOC);
    }
    Worker::runAll();

    Ответ написан
    Комментировать
  • Как мне сместить Windows 10 только на 1 из 2 жестких дисков (ssd)?

    KraGenDeveloper
    @KraGenDeveloper
    Unity Developer
    C/D это логические разделы а не жёсткие диски.
    Ответ написан
    Комментировать
  • Как мне сместить 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 комментарий
  • Как мне сместить Windows 10 только на 1 из 2 жестких дисков (ssd)?

    AlexNest
    @AlexNest
    Работаю с Python/Django
    Судя по всему, диск разбит на два логических раздела.
    Если это так, то достаточно просто перераспределить размер этих разделов.
    Сделать это можно с помощью утилит по типу Acronis Disc Director.
    Ответ написан
    Комментировать
  • Как подключиться к WebSocket'у, который находится на удаленном сервере?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    Если вы подключаетесь находясь на домене с ssl, то и на сервере с websockets должен быть сертификат (обычный let's encrypt хватит) и обращаться нужно через wss://domain/...

    Если вы обращаетесь с домена без ssl или простого IP - то ws://IP/.. будет достаточно.

    UPD.
    В комментах не всем понятно что я имел ввиду, поэтому для большей точности распишу подробнее:

    1. если вы с локалки подключаетесь к сокет-серверу который лежит "где-то", то к нему можно обращатся по ip или домену. через ws или wss (на сокет-серве должны быть правильно настроены CORS-заголовки, чтобы вам было разрешено подключаться).

    2. если вы обращаетесь с домена на сокет-сервер который лежит на другом домене:
    2.1 если у вас нет ssl - вы можете обращаться к ws или wss.
    2.2 если у вас есть ssl - вы можете обращаться только к wss.

    для всех пунктов выше действует правило: если вы обращаетесь к wss то в любом случае это будет обращение по домену а не по ip, т.к. сертификаты не выдаются на ip.
    Ответ написан
    6 комментариев