• Модуляризация web-проекта на java

    Если уж речь зашла о модуляризации в Java, то уместно вспомнить об OSGi, поддерживаемой Spring.

    Вот тут описывается поддержка веб-приложений. OSGi позволяет собирать ресурсы (классы, JSP, tld) из разных модулей или фрагментов. Описание, правда, выглядит несколько сложным. В реальности всё как-то проще.
    Ответ написан
  • Булевское свойство или функция

    С точки зрения эволюции кода, безопаснее использовать, например, перечисления (enum). Не «правильнее», а именно «безопаснее», в смысле будущих модификаций.

    Вдруг (наверняка?) у вас возникнет необходимость в дополнительных способах аутентификации (OAuth например)? В случае использования перечислений (или других аналогов шаблона «визитёр» — типа case classes из Scala), среда разработки подскажет вам, где вы забыли учесть новый вариант аутентификации. Не знаю как Visual Studio, а Eclipse или IDEA выдадут предупреждение в следующем коде:
    switch (principal.getAuthMethod()) {
    case LOGIN: /* Login / password auth */
        break;
    case CERTIFICATE: /* Certificate auth */
        break;
    }
    

    как только добавится новый тип аутентификации (OAUTH). Это даст вам знать, что вы забыли учесть новый способ ещё в каком-то месте.

    Так что если IDE помогает в таком деле, то почему бы этим не воспользоваться?
    Ответ написан
  • Когда применять JS фреймворки

    Конкретно AngularJS сильно экономит время разработки. На одном проекте встречал одну и ту же логику, реализованную на JSP+jQuery и на AngularJS, так уж получилось. Так вот, реализация на AngularJS содержала примерно в 10 (!) раз меньше строк кода. Это потому, что AngularJS следует правильной идеологии: декларативному описанию пользовательского интерфейса.

    Конечно, в сравнении с другими технологиями AngularJS может и не выглядеть столь выигрышно. Однако свою работу он делает, и делает хорошо. Учтите, что помимо диинамичности интерфейса, AngularJS, да и прочие JS-фреймворки, экономят ресурсы сервера. Или вовсе могут избавить от необходимости в серверной логике.

    Вот пример написанного на AngularJS (мною) расширения для Firefox, которое таскает данные с oDesk, расширяя возможности поиска, и не требует дополнительной серверной логики.
    Ответ написан
  • Флаг остановки в многопоточном обработчике

    Совершенно неправильное использование атомарных операций. Метод destroyImpl(), например, может быть вызван многократно. Почему бы вам не воспользоваться классическими блокировками и не избавиться от атомарных сущностей? Так проще и намного читабельней. К тому же вам необходимо работать сразу с несколькими полями — а это нетривиально, если использовать лишь атомарные операции.

    Должно получиться что-то вроде этого:
    public class Worker {
    
        private boolean destroy;
        private boolean destroyed;
        private counter;
    
        public void destroy() {
            synchronized (this) {
                if (this.destroyed) {
                    return;
                }
                this.destroy = true;
                if (this.counter != 0) {
                    return;
                }
                this.destroyed = true;
            }
            destroyImpl();
        }
    
        public void service(String arg) {
            synchronized (this) {
                if (this.destroy) {
                    return;
                }
                ++this.counter;
            }
            serviceImpl(arg);
            synchronized (this) {
                if (--this.counter != 0) {
                    return;
                }
                if (!this.destroy) {
                    return;
                }
                this.destroyed = true;
            }
            destroyImpl()
        }
    
    }
    
    Ответ написан
  • Запуск стороннего приложения

    Разбирайтесь со своей программой. Зачем она чего-то ждёт? Она вызывает Process.waitFor()? Потому что иначе вызывающая программа не ожидает завершения вызванной. Вот код для примера:
    import java.io.IOException;
    
    public class Run {
            public static void main(String[] args) {
                    try {
                            new ProcessBuilder("/usr/bin/kwrite").start();
                    } catch (IOException e) {
                            e.printStackTrace();
                    }
            }
    }
    

    Запускает программу и завершает работу (в Linux). Подставьте запуск notepad и проверьте. Неужели Java-программа не завершит работу?
    Ответ написан
  • Как научиться писать юнит-тесты, в которых будет смысл и не ошалеть от скуки?

    Знакомая проблема. Хорошо писать тесты для простой функциональности. Но что делать, когда нужно тестировать не просто отдельные функции, а ещё и их комбинации? Что делать, когда количество комбинаций входных данных — огромно, или вообще бесконечно, и каждая комбинация может привести к ошибке?

    Для себя нашёл частичный выход: пишу высокоуровневые тесты, а низкоуровневые заменяю множеством assert-ов. Assert проще написать, поскольку не надо воспроизводить контекст ни программно, ни мысленно — assert всегда выполняется в нужном контексте. И при запуске высокоуровнего теста фактически выполняется гораздо больше проверок, чем написано в самом тесте. Assert-ты также очень помогают в отладке — с их помощью быстрее локализуются ошибки.

    Кстати, для библиотечных проектов совершенно необходимо писать и проекты, эти библиотеки использующие. Иначе — библиотека получается гарантированно ненужной. Так вот, само такое приложение и тесты к нему являются одновременно и тестами библиотеки.
    Ответ написан
  • Аналог символа @ для тудулиста на русском

    Вообще, семантически подходят скобки. Ужин с женой (дома). Проблема в том, что скобки вообще много для чего подходят. Тут либо распознавать слова, либо использовать комбинации. Ну типа (- дома). Длинно.

    Есть ещё вариант типа //дома. Он также слишком общий, но по крайней мере в обычном тексте не используется.

    Хм, ну и последнее что придумывается — какой-нибудь значок в скобках (8) дома — восьмёрка немного похожа на русскую «в».
    Ответ написан
  • Порекомендуйте стек технологий основанный на Java для вебприложения?

    Spring Framework конечно. Если конечно не хочется ничего особо оригинального (или платного). Для интеграции с социальными сетями можно поискать и отдельные компоненты. Даже если они не интегрированы со Spring изначально — интегрировать в него можно что угодно.

    Но вот веб-стек в Java, как бы это сказать помягче, излишне перегружен. Как насчёт не использовать его совсем? Наймите хорошего front-end — разработчика, пусть напишет вам полностью динамический UI (на jQuery UI например), а ваш back-end в таком случае будет всего лишь RESTful-сервисом. И современно, и модно, и с тяжеловесными технологиями типа JSF с их десятиэтажными абстракциями заморачиваться не придётся…
    Ответ написан
  • Где искать «командного» фрилансера?

    А «командные» фрилансеры без собственной команды разве бывают? Как вы вообще представляете себе работу с малознакомым человеком удалённо, но «в команде»? Фрилансеры-одиночки, как правило, берут чётко поставленную задачу и выполняют её. Качественно и в срок. Этим и обеспечивается репутация. Если же вы не в состоянии чётко сформулировать задачу, то что можно сказать о вашем отношении к архитектуре?

    Так что ответ: нигде.
    Ответ написан
  • Ссылка на файл вне JAR'a?

    Если это отдельное приложение, то почему бы не размещать все настройки приложения (в том числе и log4j.properties) в стандартных (т.е. предопределённых) местах? Типа директории /etc/yourapp и/или /home/.config/yourapp. Посмотрите спецификацию XDG ну или хотя бы системные свойства Java.

    Ну а если приложение запускается внутри сервера приложений, то там есть свои собственные возможности. Про JNDI уже упоминали.
    Ответ написан
  • Как эффективно работать с программистом?

    Программист — это исполнитель прежде всего. В этой роли его и используйте. А нагружая его «дедлайнами» и прочей управленческой чепухой вы заставляете его делать несвойственную ему работу, фактически перекладывая на него свою ответственность.

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

    Если грамотные ТЗ — не ваш профиль, то придётся полагаться на разработчика в ещё большей степени. Но готовьтесь к взаимному недопониманию. Идеальный разработчик в такой ситуации — это ещё и аналитик, и психолог, и управленец. Вам крупно повезёт, если вы такого найдёте.

    А то, какими инструментами будете пользоваться лично вы никоим образом на результатах работы разработчика не отразится.
    Ответ написан
  • Open source (GPL3) — я чего-то не понимаю?

    Кстати, вот ещё один интересный момент. Если вы поступите как они хотят: то есть скачаете исходный GPL код и модифицируете его согласно инструкциям, то результат подпадает по GPL. Это значит, что вы имеете полное право передать исходники не только заказчику, но и кому угодно ещё, то есть выложить в открытый доступ. В определённой ситуации вы даже будете обязаны это сделать. И запретить они вам этого не могут (по условиям GPL). Так что их перестраховка с невыдачей вам исходников бесполезна в любом случае.
    Ответ написан
  • Open source (GPL3) — я чего-то не понимаю?

    GPL позволяет изменять исходные коды для собственных нужд и не распространять изменения. Если же изменённый код распространяется, то он должен распространяться под GPL. Видимо, партнёры не хотят распространять код под GPL и, следовательно, не могут распространять его вообще.
    Ответ написан
  • Kubuntu+GeForсe550+3 монитора, как подружить?

    Чтобы подключить несколько мониторов с разными драйверами можно просто сконфигурировать X сервер с двумя наборами секций Device, Screen и Monitor. Вот очень старая, но до сих пор актуальная тема.
    Ответ написан
  • Kubuntu+GeForсe550+3 монитора, как подружить?

    GeForce 550 поддерживает только два монитора. Доказательство (страница 10). Если нужен третий монитор — нужно ставить в SLI вторую такую же видеокарту.
    Ответ написан
  • Дизайн API для матричной библиотеки?

    Что-то не увидел в API la4j таких очевидных, на мой взгляд, вещей, как итераторы (или функторы). Чтобы обрабатывать элементы матрицы построчно или по столбцам, например. Если это вообще нужно, конечно.

    Вот перебор для разреженных матриц мог бы выглядеть несколько иначе, чем для плотных. Чтобы не перебирать каждый элемент разреженной матрицы можно было бы завести специальный итератор, который бы пропускал нулевые элементы. А для разреженной матрицы можно было бы использовать итератор попроще — не пропускающий элементы, «плотный». С ним и работать было бы легче.

    И тот и другой вид итераторов можно реализовать для обоих видов матриц, но понятно, что «плотный» итератор неэффективен в применении к разреженным матрицам.

    Задача API не только в том, чтобы давать возможности, но и подталкивать к выбору правильных решений. А использование «плотного» итератора для разреженных матриц — неправильное решение, так что его можно было бы в интерфейс разреженных матриц не добавлять совсем.
    Ответ написан