• Поясните код Java?

    @bromzh
    Drugs-driven development
    Сперва вычисляется выражение справа от присваивания, потом оно записывается в переменную, указанную слева. При этом, так как эти переменные - числа, то они неизменяемы. Т.е. сами значения таких переменных изменить нельзя, можно лишь присвоить им новые. Вычисление выражений использует старое значение идентификатора. Новое значение присвоится только после всех вычислений.
    Тут сначала вычислится выражение b (оно будет равно первоначальному значению b, т.е. 2) и его значение сохранится в переменной a (которая вторая по-счёту). Но так как это тоже часть выражения, то в первой a будет ещё старое значение. Оно складывается с результатом выражения 0*(a=b), получается снова старое значение a, которое и присвоится идентификатору b.
    Ответ написан
    Комментировать
  • Лучший ресурс/книга/видеоуроки для изучения AngularJS?

    @bromzh
    Drugs-driven development
    Читаешь и запоминаешь это
    Гуглишь про каждый пункт отсюда
    Попутно пишешь как можно больше приложений.
    Если думаешь, что начать писать можно только после кучи теории - так и останешься в теоретиках.
    Ответ написан
    Комментировать
  • Как модернизировать MVC при работе с AJAX?

    @bromzh
    Drugs-driven development
    Лучше разделить бэкенд и фронтенд. На бэке оставить только API, на фронте реализовать всю логику отображения данных, полученых с сервера.
    Смешивать разные языки и технологии (js + php) в 1 монолитное решение, чтобы построить что-то динамическое и MVC-подобное плохо, ибо спустя некоторое время поддерживать такого монстра может стать трудно.

    В итоге, получится своя архитектура на бэке и независимая от него архитектура на фронте. При желании, можно будет прозрачно заменить одну из частей на что-то другое (при условии, что публичное АПИ останется тем же).
    Например, к готовому АПИ написать мобильное приложение.
    Или заменить серверную реализацию, реализовав её на более шустром языке/фреймворке.
    Ответ написан
    Комментировать
  • В чем разница написания myApp.controller('ctrl', ['$scope', function ($scope) {}]) и myApp.controller('ctrl', function ($scope) {})?

    @bromzh
    Drugs-driven development
    Потому что ангуляр внедряет зависимости по именам аргументов. А некоторые минификаторы и компиляторы изменяют имена аргументов. В итоге всё ломается. Первый вариант используется, чтобы явно задать список имён зависимостей для внедрения.

    А вообще, по-нормальному используют либо такой вариант:
    angular.module('app').controller('FooController', FooController);
    
    FooController.$inject = ['$service1', '$service2'];
    function FooController($service1, $service2) {}


    Либо берут это, настраивают свой сборщик (плагинов там куча) и вставляют определённый коммент где нужно:
    angular.module('app').controller('FooController', FooController);
    
    /*@ngInject*/
    function FooController($service1, $service2) {}
    Ответ написан
    Комментировать
  • Как обновить данные в таблице после запроса $http.post в AngularJS?

    @bromzh
    Drugs-driven development
    0) Сперва почитай это
    1) Зачем 2 контроллера? Достаточно 1 контроллера с 2-мя методами в нём.
    2) $scope - зло. Используй синтаксис controllerAs
    3) После добавления элемента нужно либо возвращать с бэкенда новый список (что не по REST), либо делай запрос (естественно в цепочке промисов). Ведь если данные обновятся с 2-х источников, будет рассинхрон.
    4) Не используй $http().success, всегда используй then.
    5) <a href="{{x.url}}"> не сработает. Нужна директива ng-href.

    Ну а код будет примерно такой:
    function myService($http, $log) {
        return {
            addLink: addLink,
            getLinks: getLinks
        };
        
        function addLink(data) {
            $http.post('/api/links', data)
            .then(function (response) {
                $log.log('Success', response);
            });
        }
    
        function getLinks() {
            $http.get('/api/links')
            .then(function (response) {
                return response.data.records;
            });
        }
    }
    
    function MainController(myService) {
        var vm = this;
    
        vm.addLink = addLink;
    
        function fetch() {
            return myService.getLinks()
            .then(function (links) {
                vm.links = links;
            });
        }
    
        function addLink() {
            return myService.addLink({
                'linkname': vm.linkname, 
                'url': vm.url
            })
            .then(function () {
                vm.linkname = '';
                vm.url = '';
                return fetch();
            });
        }
    }
    
    angular.module('app', [])
        .factory('myService', myService)
        .controller('MainController, MainController');

    <div ng-controller="MainController as main">
        <form ng-submit="main.addLink()">
            Name: <input type="text" ng-model="main.linkname"><br>
            URL: <input type="text" ng-model="main.url">
        </form>
        <hr>
        <ul>
            <li ng-repeat="item in main.links">
                <a ng-href="{{ item.url }}">{{ item.linkname }}</a>
            </li>
        </ul>
    </div>
    Ответ написан
    1 комментарий
  • Как дождаться выполнения http запроса с angularjs?

    @bromzh
    Drugs-driven development
    $http.post('/api/item', item) // делаем запрос к API
      .then(function (response) { // чейним промис от $http
        // этот код начнёт выполняться только после успешного ответа от сервера
        // в параметре response будут данные ответа: HTTP-код ответа, данные из тела ответа и т.д.
        console.log(response); // обрабатываем ответ от сервера, если надо
        return $state.go('item.list'); // переход на страницу
      });
    Ответ написан
  • Как учитывать часовой пояс при работе с Moment.js?

    @bromzh
    Drugs-driven development
    Момент берёт инфу о времени и временной зоне из ОС. Если он показывает что-то неправильно, то значит у тебя неверно настроена временная зона в ОС.
    Пример: я изменил tz на парижскую (+01:00), но время выставил московское. Если запросить момента время, то он выдаст то, что установлено в системе: 2016-02-03T04:08:24+01:00. Время совпадает с московским, но неверная tz. Если же насильно установить временную зону в самом моменте, то он возьмёт системное время и tz и попытается перевести в локальное время для указанной tz. Таким образом, если установить московскую tz и снова запросить текущее время, момент выдаст 2016-02-03T06:13:17+03:00. Время сдвинулось, но tz верная.
    Так что у тебя скорее всего в системе стоит tz +04:00, вот час и теряется.

    Ну и да, время нужно хранить в UTC, а выводить на страницу в соответствии с часовым поясом пользователя. Часовой пояс можно уточнять у самого клиента.
    Узнавать сдвиг в минутах относительно UTC можно так: moment().utcOffset()
    Ответ написан
    2 комментария
  • Есть ли плагин для grunt \ gulp для замены путей к svg-файлу на его содержимое?

    @bromzh
    Drugs-driven development
    Ответ написан
    Комментировать
  • Как узнать n-ную цифру десятичного числа?

    @bromzh
    Drugs-driven development
    #include <stdio.h>
    
    int digit(int number, int n) {
    	if (n <= 1) {
    		return number % 10;
    	}
    	return digit(number / 10, n - 1);
    }
    
    int main(void) {
    	printf("%i\n", digit(12345, 1));
    	printf("%i\n", digit(12345, 2));
    	printf("%i\n", digit(12345, 3));
    	printf("%i\n", digit(12345, 4));
    	return 0;
    }

    https://ideone.com/ZSHndh
    Ответ написан
    3 комментария
  • Геймдев после python?

    @bromzh
    Drugs-driven development
    Инди на unreal? Как-то сурово. Возьми лучше https://love2d.org/ В качестве языка там lua, он очень лёгок для изучения.
    Ответ написан
  • Как указать путь до JSP?

    @bromzh
    Drugs-driven development
    Что за помойка в проекте? Изучи мавен, посмотри какая структура у стандартного мавеновского проекта.
    Если используешь Jetty, то можно так (при условии, что структура проекта у тебя нормальная, а не как щас):
    1) Создай в папке src/main/resources папку, с именем webapp, например
    2)
    // Application.java
    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.servlet.ServletContextHandler;
    import org.eclipse.jetty.servlet.ServletHolder;
    
    import javax.servlet.Servlet;
    
    class Application implements Runnable {
        Server server;
        ServletContextHandler handler;
    
        public Application() {
            server = new Server(8080);
            handler = new ServletContextHandler(ServletContextHandler.SESSIONS);
            server.setHandler(handler);
        }
    
        @Override
        void run() {
            try {
                server.start();
                server.join();
            } finally {
                server.destroy();
            }
        }
    
        void addServlet(String path, Servlet servlet) {
            handler.addServlet(new ServletHolder(servlet), path);
        }
    
        void addServlet(String path, Class<? extends Servlet> servletClass) {
            handler.addServlet(new ServletHolder(servletClass), path);
        }
    }
    
    // Main.java
    import org.eclipse.jetty.servlet.DefaultServlet;
    
    public class Main {
        public static void main(String args[]) {
            Application app = new Application();
    
            app.handler.setContextPath("/");
            app.handler.setResourceBase(Main.class.classLoader.getResource("webapp").toExternalForm());
    
            app.handler.addServlet("/*", DefaultServlet.class);
            app.handler.addServlet("/api/v1/*", JerseyServlet.class);
            app.handler.addServlet("/ws/*", WSServlet.class);
    
            app.run();
        }
    }

    3) Собирай всё в jar-ник, в манифесте пропиши главный файл. Вообще, я собирал всё это градлом с плагином application:
    apply plugin:'application'
    ...
    mainClassName = "your.package.app.Main"

    PS код был на Groovy, я переписал, но мб где-то мог накосячить.
    Ответ написан
    Комментировать
  • Как переключаться между буферами в Emacs?

    @bromzh
    Drugs-driven development
    C-x b
    Ответ написан
    Комментировать
  • Нужно ли в Hibernate для транзакций выделять отдельный поток?

    @bromzh
    Drugs-driven development
    Если ты используешь EJB, то все запросы от ORM к БД оборачиваются в транзакцию, если тип в persistence-unit добавить аттрибут transaction-type="JTA. Иначе транзакциями вручную будешь рулить. Достаточно лишь получить транзакцию, ну и начать/закоммитить/сделать роллбек. Менеджер транзакций уже настроен. Если не используешь EJB, а обходишься спрингом, то в нём есть свой менеджер трнзакций, хз, надо ли его отдельно конфигурить.
    Вот эти самые менеджеры транзакций и менеджеры ресурсов и рулят потоками, пулами соединений и т.д. Он сам отслеживает любые попытки обращения к БД и оборачивает в транзакцию (если есть запущенная транзакция, при чём неважно, запустил ты её сам, или сервер приложений это сделал за тебя). Эти менеджеры поддерживают как локальные, так и распределённые транзакции, и, при этом, всё потокобезопасно.

    Если не используешь JPA и EntityManager, только Hibernate, то можно взять реализацию менеджера транзакций, например Atomikos, сконфигурить и создать его ручную, а потом так же вручную запускать транзакции.

    Использовать 1 транзакцию на всё приложение глупо. Пропадёт многопоточность (ведь 1 транзакцию нельзя к нескольким потокам привязать), да и много действий внутри 1 транзакции делать плохо.

    В общем, нужно использовать всё с умом. Если нужны транзакции - используй. Только правильно: в 1 транзакции должно быть 1 логическая операция.

    PS Ах да, если я не ошибаюсь, то количество потоков зависит больше от менеджера ресурсов, а не от менеджера транзакций. Ресурсами же могут быть, например, БД, а могут и сообщения JMS. Как настроишь DataSource, так и будет.
    Ответ написан
    Комментировать
  • Как пишутся Single page application из модулей?

    @bromzh
    Drugs-driven development
    Почему именно requirejs? Его использование сейчас оправдано разве что в старых проектах, для поддержки.
    Переходи на webpack, например. Он умеет в es6-модули. Пишешь весь код, используя последние фишки es2015, а в вебпаке просто добавляешь babel-загрузчик. На выходе получается es5.
    Вот пример.
    Вот ещё
    Ответ написан
    3 комментария
  • Почему angularjs уделяют так много внимания?

    @bromzh
    Drugs-driven development
    На момент его выхода он обладал рядом уникальных вещей и был (если я не ошибаюсь) почти самым первым полноценным фреймворком для создания сложных фронтенд-приложений. Это не просто набор библиотек, а логически связанная система, которая может решать свои задачи очень хорошо.
    Некоторые идеи были очень удачны (внедрение зависимостей, система модулей и их асинхронная загрузка, отказ от своего синтаксиса шаблонов в пользу обычного HTML со своими тегами и атрибутами, двунаправленная связь данных) некоторые оказались не такими хорошими (двунаправленная связь данных, магия $scope в контроллерах, отсутствие документации и др.). Но фреймворк развивается и с каждой версией становится всё удобнее.
    Но JS (вернее, ECMAScript) тоже развивается, и некоторые вещи из первого ангуляра стали дублироваться в es6. Поэтому теперь авторы взяли и сделали заново вторую версию, в которой учли все ошибки.
    Но даже в сейчас первая версия очень популярна, хотя бы по причине уже сложившейся огромной инфраструктуры.
    Ещё одной из причин популярности является тот факт, что реальных аналогов у него очень мало, практически нет. У других фреймворков/библиотек есть свои минусы, причём, на мой взгляд, они перекрывают их плюсы.
    Ответ написан
    3 комментария
  • Почему не работают pull и push bootstrap3?

    @bromzh
    Drugs-driven development
    Потому что ты их используешь вместе с row.
    Да и вообще, зачем ты используешь пуши/пулы, если нужно просто прописать класс col-sm-6:
    <div class="b-rewiews__rewiew-name b-rewiews__rewiew-name--form row">
        <div class="col-sm-6">
            <div class="row">
                <div class="b-rewiews__group col-md-2 col-sm-6 col-xs-12"></div>
                <div class="b-rewiews__group col-md-2 col-sm-6 col-xs-12"></div>
            </div>
        </div>
        <div class="col-sm-6">
            <div class="row">
                <div class="b-rewiews__social-login col-md-2 col-sm-6 col-xs-12"></div>
                <div class="b-rewiews__rating-input b-rewiews__rating-input--no-autorized col-md-1 col-sm-6 col-xs-12"></div>
            </div>
        </div>
    </div>
    Ответ написан
  • Почему итератор цикле нужно передавать в замыкание?

    @bromzh
    Drugs-driven development
    for-, if-, switch-блоки не создают контекста.
    arr.push(() => {
            return Promise.resolve(item); // Все промисы вернут C
        });

    В функции переменная item меняется и после цикла становится равна своему конечному значению. Вот замыкание и ссылается на это значение. 775f8192fca64f7dba3d26d66086402c.png

    А если обернуть это в iife, то на каждой итерации создаётся локальный контекст, в котором создаётся замыкание, которое, в свою очередь, будет ссылаться на локальную переменную item.

    PS да, во втором примере не совсем логично сделано, лучше делать не так:
    let item;
    for (let i = 0, len = 3; i < len; i++) {
        ((item) => {
            item = arrOfItems[i];
    
            arr.push(() => {
                return Promise.resolve(item);
            });
        })(item);
    }

    а
    for (let i = 0, len = 3; i < len; i++) {
        ((idx) => { // это для наглядности, её тоже можно назвать i и тогда она "затенит" внешнюю i
            let item = arrOfItems[idx];
            arr.push(() => {
                return Promise.resolve(item);
            });
        })(i);
    }

    451fd34a43824ccb8a3c9d79f9b7e481.png

    Ну а в третьем примере используется const, а в es2015 она живёт внутри блока, так что там всё ок.

    1) Это все синхронные операции, т.е. Эвент машина JavaScript'а должна выполнить их в одной итерации, но при этом for ведет себя как асинхронная операция, т.е. сначала перебирает все варианты, а потом уже пушит их.

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

    2) Какие из операций JS являются асинхронными?

    Все I/O-функции, ну и что-то ещё, типа таймаутов и др. for, if, etc - операторы, они не асинхронные по своей сути.

    3) В каких случаях нужно использовать замыкания помимо циклов?

    Для инкапсуляции, например. Вообще, замыкания так или иначе используются почти всегда.

    4) Почему если объявить переменную в цикле, она ведет себя как будто она в замыкании, ведь на самом деле итерируется не она сама, а i?

    Смотря как объявить. Если по-старинке, то область видимости у неё будет равна области видимости внешней функции. Если же let/const, то у них область видимости ограничена блоком, т.е. замыкания в цикле будут ссылаться на разные переменные.
    Ответ написан
    Комментировать