• Как выбрать архитектуру автономного веб-приложения?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Архитектура приложения разве может быть универсальной? Она зависит от самого приложения. Автономность - это скорее отдельное свойство архитектуры, чем ее стержень, но опять же зависит от конкретной задачи.

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

    С базой данной сложнее, конечно же. В идеале стоит дать пользователю контролировать, что именно он хочет хранить локально. Но если данных не так уж и много (больше 5 Мб, но не гигабайты), то можно и всю базу скопировать, а потом обновлять ее. Возможно, стоит сделать упор на то, как обновлять базу мелкими патчами, если это делается часто, либо тупо перезагружать всю базу заново, если это делается редко. В общем, повторюсь, архитектура и ее детали зависят от задачи, и автономность это, скорее всего, всего лишь одна фича из многих.
    Ответ написан
    6 комментариев
  • Можно ревью супергрязного(наверное) кода на с#?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я тоже добрый сегодня.

    Общее впечатление что код - пенопласт. В нем очень много строк но очень мало бизнес логики.

    1) Во первых непонятно где фокусироваться. Смотреть формочки - не интересно они состоят в
    основном из шумящих событий которые радуют глаз но делают очень мало действий. Это как смотреть
    байткод LLVM или Java.

    2) Вот такой комментарий я-бы не писал. Он звучит как капитан-очевидность. И ежу понятно что это Main.

    /// <summary>
            /// Главная точка входа для приложения.
            /// </summary>
            [STAThread]
            static void Main()


    Если твой преподаватель требует - то пускай будет. Но я-бы убрал.

    3) Вот такие название как Classes, надо убрать. Они считаются дурным тоном. У тебя-же есть понимание
    что внутри? Вот прояви фантазию и дай какое-то бизнесовое название. У тебя в названии вообще висит
    газо-анализатор. Используй это.

    4) Вот здесь имеет смысл вводить поясняющую переменную. Это основы рефакторинга
    о которых писал Кериевски.

    Mixtures[mixture].measurementResults[cycle] = gasType == "mixture" ? concentration : Mixtures[mixture].measurementResults[cycle] - concentration;
            }//сохранение текущего результата в конкретный цикл конкретной смеси


    И комментарий должен стоять над кодом а не внизу.

    5) Я не знаю зачем в 21 веке так сложно конкатенировать строку. Это не Си и не Java1.1.

    table.GetControlFromPosition(i, table.RowCount - 1).Text = String.Concat("СКО", ":", Mixtures[i].sko.ToString());


    Вот я специально посмотрел в learn портал https://learn.microsoft.com/en-us/dotnet/csharp/ho... и там пишут что вполне можно брать операцию плюс или стринговую интерполяцию.

    Вобщем старайтесь писать меньше слов. Это - хорошая точка приложения сил для развития как разработчика.
    Ответ написан
  • Как правильно решить конфликт?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    предлагает использовать либо одно, либо другое

    Кто такое предлагает? Наоборот, в большинстве случаев хочется оставить и то и другое.

    Как правильно решить этот конфликт?

    Как обычно, у себя на компьютере подгружаете в свою ветку новые коммиты из целевой ветки common, которые там появились после того, как вы свою ветку feature создали. И в этот момент разрешаете конфликт локально, а вовсе не на гитлабе.
    Ответ написан
    Комментировать
  • Можно ли сделать git merge двух веток из третьей, не переключаясь на ветки мерджа?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Обновляйте ветку используя дополнительный рабочий каталог, либо другую копию репозитория, чтобы не влиять на работу в основном рабочем каталоге.
    Ответ написан
    9 комментариев
  • Чем заменить сводки в виде xls файла?

    @Iv_and_S
    описана только часть БП (бизнесс процесса).
    также следует значительно расширить и проработать требования к будущему решению.
    плюс решение о выборе стека/архитектруры , во многом зависит от имеющейся на предприятии (может и никакой) архитектуре уровня Enterprise. также большое значение имеют: бюджет, сроки , степени "зрелости" проблемы и ее масштаба.

    в итоге по описанию можно только сказать " что то сделать вероятно можно".
    Ответ написан
    Комментировать
  • Какое место БД в Чистой Архитектуре?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Первая схема в вопросе - это так называемая гексагональная архитектура. Многослойную архитектуру в виде круга не рисуют как раз потому, что центра у неё нет, скорее концы или верх и низ.
    Ответ написан
    Комментировать
  • Где искать svg всех городов, районов, областей, стран?

    hint000
    @hint000
    у админа три руки
    CityCat4, почти согласен
    Я бы начал с 2gis или Яндекс-Карт.
    Только не 2gis или Яндекс, а OSM (OpenStreetMap), ибо Open - ничего не спрятано, вот они все исходные данные, вот оно описание формата, легче уж некуда.
    https://www.openstreetmap.org/#map=12/42.8768/74.6013
    https://wiki.openstreetmap.org/wiki/RU:Tag:boundar...
    Ответ написан
    2 комментария
  • Почему ссылка AJAX запроса ссылается не на php файл?

    @psiklop
    Веб-сервера уже по умолчанию настроены автоматически искать index.php в папке
    Я сам так часто делаю без всяких танцев с бубном положить в любую папку и заработает, например: ajax/index.php
    Ответ написан
    Комментировать
  • Javarush.Стоит ли там учиться, или же лучше по книжкам?

    general
    @general
    25 star General
    В любой профессии есть знания и навыки.
    Могу посоветовать книги: Head First Java (легко гуглится) и Thinking in Java (но она не для новичков).

    Thinking in Java очень полезно прочитать перед походами на собеседование - помогает структурировать имещниеся знания. Ну, а в плане практики, замене javarush пока нет.
    Ответ написан
    Комментировать
  • Javarush.Стоит ли там учиться, или же лучше по книжкам?

    @Rustam_Aliev
    Ну, как ни крути, в рунете пока нет ничего лучшего в плане изучения Java на практике. Я брал годовую подписку, но мне хватило где-то 6 месяцев ударного обучения (решал задачи на Javarush`е, читал книги, смотрел видео), чтобы начать рассылать резюме. Тут есть свой минус - канеш, никто заставлять учиться не будет: выезжаешь только на само мотивации (и самобичевании в дни когда все тупо влом))))
    Ответ написан
    Комментировать
  • Javarush.Стоит ли там учиться, или же лучше по книжкам?

    @deeze-deeze
    Прошел курсы на Джавараш по совету знакомого джависта-сениора. Что сказать? Самая сильная сторона курса - практические задачи, они реально неплохи, и их дофига. Нужно быть правда готовым к тому, что курс покроет только джава кор. Маловато теории но вроде такая позиция создателей курса: что нужно учиться гуглить. Я бы советовал учить теорию по книгам и проходить задачки на Джавараш. Валидатор иногда тупит - так что приготовьтесь. Но мгновенный результат по решению задач - радует.
    Ответ написан
    Комментировать
  • Чем array_walk лучше foreach?

    @novrm
    Работая по ссылке с foreach можете налететь на очень неприятны грабли, которые незаметны и сильно попортят вам нервы.
    Особенно когда разработчики неопытные.
    И именно - ссылку после foreach нужно удалять.
    array_walk для работы по ссылке - само-то, лишь тем и лучше.
    В других случаях — будь попроще — используй foreach.

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

    Пример:
    array_walk($guide['postInGuides'], function (&$postInGuide, $key) use ($guide, $viewRenderer) {
        $postInGuide['post']['url'] = [
            'read' => $viewRenderer->url('guide/guide/post', [
                'slugGuide' => $guide['name'],
                'slugPost'  => $postInGuide['post']['slug'],
            ]),
            'update' => $viewRenderer->url('post/post/action', [
                'slugPost'  => $postInGuide['post']['slug'],
                'action' => 'update',
            ]),
            'delete' => $viewRenderer->url('post/post/action', [
                'slugPost'  => $postInGuide['post']['slug'],
                'action' => 'delete',
            ]),
        ];
    });
    Ответ написан
    Комментировать
  • Чем array_walk лучше foreach?

    webinar
    @webinar Куратор тега PHP
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Сделайте тоже самое, только запихните не $item = 'hello!'; а что-то посложнее и разница будет меньше.
    Ну и банально избежать дублирование кода.
    function test_print($item2, $key) 
    {
        echo "$key. $item2<br />\n";
    }
    array_walk($array1, 'test_print');
    array_walk($array2, 'test_print');
    array_walk($array3, 'test_print');
    array_walk($array4, 'test_print');
    array_walk($array5, 'test_print');
    //вот тебе новая выгода:
    $func_name = 'test_print';
    array_walk($array5, $func_name);

    Прикиньте это c foreach

    В целом foreach и if else творят чудеса и позволяют сделать что угодно. А порой это даже быстрее работает. Но выглядит не читабельно, по сути не гибко и т.д.
    Ответ написан
    Комментировать
  • Как сделать проверку статуса платежа и дальнейшее выполнение функций?

    YooMoneyHelp
    @YooMoneyHelp
    Здравствуйте. Рекомендуем ориентироваться на уведомление об успехе платежа payment.succeeded: https://yookassa.ru/developers/using-api/webhooks#...
    Также, можете использовать запрос get_payment: https://yookassa.ru/developers/api#get_payment
    Периодичность запросов определяется вами самостоятельно.
    Если варианты выше по каким-то причинам вам не подходят, напишите на почту технических специалистов ЮKassa: b2b_support@yoomoney.ru Коллеги разберут ваш сценарий более детально и все расскажут.
    Ответ написан
    Комментировать
  • Как сделать проверку статуса платежа и дальнейшее выполнение функций?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Страница result не имеет вообще никакого отношения к успешности платежа. На неё любой придурок и так может перейти, руками, без всякой оплаты.
    Успешность оплаты подтверждается либо колбеком банка, либо отдельным запросом в банк. После которых полученная информация записывается в базу данных, а затем "выполнение кода продолжается" и код начинает отправлять всякие СМС и емейлы. После получения подтверждения, а не на странице result.

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

    @tmpolina
    1) На телефоне запускаете VPN, выбираете страну UK (возможно и с другими тоже работает)
    2) С браузера в телефоне заходите на linkedin, выбираете англ.язык
    3) Регистрируетесь. Телефон не просит.

    Не благодарите :)
    Ответ написан
    10 комментариев
  • Актуально ли изучать java 8?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Джава полностью обратно совместимая.
    Так что изучайте спокойно 8ю, потом подтяните фишки, которые появились позже.
    Ответ написан
    24 комментария
  • Какой лучше взять ORM?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это хороший вопрос, но ответ на него зависит от вашего уровня. Очень сильно зависит.
    Специалисты вам наверняка посоветуют Doctrine или Cycle. Но вы их явно не потянете.
    Для знакомства с ORM я бы порекомендовал Eloquent, при всех минусах этого выбора.

    Но если честно, то учитывая, что вы ищете замену RB, я бы порекомендовал начать с самого простого.
    spoiler
    Написать ORM руками. Причем даже не классический, поддерживающий связи и квери билдер, а совсем простой Table Gateway, типа такого:
    abstract class BasicTableGateway
    {
        protected $db;
        protected $table;
        protected $fields;
        protected $primary = 'id';
    
        public function __construct(\PDO $db)
        {
            $this->db = $db;
        }
        public function read($id): ?array
        {
            $stmt =$this->db->prepare("SELECT * FROM `$this->table` WHERE `$this->primary`=?");
            $stmt->execute([$id]);
            return $stmt->fetch();
        }
        public function insert($data): int
        {
            $this->validate($data);
    
            $fields = '`'.implode("`,`", array_keys($data)).'`';
            $placeholders = str_repeat('?,', count($data) - 1) . '?';
            $sql = "INSERT INTO `$this->table` ($fields) VALUES ($placeholders)";
            $this->db->prepare($sql)->execute(array_values($data));
            return $this->db->lastInsertId();
        }
        protected function validate($data)
        {
            $diff = array_diff(array_keys($data), $this->fields);
            if ($diff) {
                throw new \InvalidArgumentException("Unknown field(s): ". implode($diff));
            }
        }
    }

    И дальше применять его примерно так
    class UserGateway extends BasicTableGateway {
        protected $table = 'gw_users';
        protected $fields = ['email', 'password', 'name', 'birthday'];
    }
    $userGateway = new UserGateway($pdo);
    $data = [
        'email' => 'foo@bar.com',
        'password' => 123,
        'name' => 'Fooster',
    ];
    $id = $userGateway->insert($data);
    $user = $userGateway->read($id);
    echo json_encode($user),PHP_EOL;

    И никаких тебе "бинов" - обычный ПДО, обычные массивы, все просто и наглядно.


    Хотя пожалуй Dr. Bacon прав, вам и это будет сложновато. Возьмите лучше просто функцию:
    function pdo($pdo, $sql, $args = NULL)
    {
        if (!$args)
        {
             return $pdo->query($sql);
        }
        $stmt = $pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }

    и дальше просто запросами

    // Create
    pdo($pdo, "INSERT INTO users VALUES (null, ?,?,?)", [$name, $email, $password]);
    // Read
    $user = pdo($pdo, "SELECT * FROM users WHERE email=?", [$email])->fetch();
    // Update
    pdo($pdo, "UPDATE users SET name=:name WHERE id=:id", ['id'=>$id, 'name'=>$name]);
    // Delete
    $deleted = pdo($pdo, "DELETE FROM users WHERE id=?", [$id])->rowCount();


    После того, как SQL будет отскакивать от зубов - можно будет посмотреть в сторону какого-нибудь ORM
    Ответ написан
    1 комментарий
  • В каком случае целесообразно изучать Java если ты php разработчик микросервисов?

    xez
    @xez Куратор тега Java
    TL Junior Roo
    Целесообразно изучать во всех случаях.
    Выбор позиции у вас от новых знаний расширится, а не сузится.
    Ответ написан
    Комментировать
  • Что подразумевает полный рабочий день?

    @hatman
    1) Если у тебя работа 8 часов, и начало работы в 10 утра, то работодатель и твои коллеги ожидают от тебя, что в любой момент с 10 до 19 (час на обед + 8) - они могут тебе написать, позвонить и ты оперативно выйдешь с ними на связь. И скажем, они буду ожидать, что если есть вопросы по какому-то коду, то IDEA/GIT и прочее у тебя будут открыты (т.е. ты в рабочей обстановке) - на какой-то доп вкладке смотреть сериальчик никто не мешает (лучше использовать другой браузер).

    2) Если тебе надо куда-то отвалиться на час-два, то работодатель ожидает, что ты согласуешь это со своей командой, уведомишь всех в общий слак, скайп итд и доработаешь потом время простое в "свободное" время.

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

    Что касается часов - просто списывай время на все, чем ты занимаешься (кодинг, митинги, созвоны с ребятами, консультация QA по своим таскам и так далее). Тогда получится, что ты кодил условно 5 часов, а времени списано в общем 7-8 часов.
    Ответ написан
    1 комментарий