• Справочник по собеседованиям для тех программистов, которые их не понимают
    +4
    Спасибо, будем стараться :)
  • Hibernate+jsp при поддержке сервлетов
    +2
    Автор статьи познает азы java web, что похвально! Конечно статья очень наивная, но все мы когда-то начинали с этого. Желаю автору удачи в своих исследованиях :)
  • JCoro — асинхронность на сопрограммах в Java
    +3
    Академически — круто:
    показано, что можно прервать программу на середине, а потом восстановить выполнение, подсунув тот же стек.

    Практически — пока не видно удобства:
    вместо обещанного
    data = readSocket();
    

    мы получаем код, который визуально не проще работы с колбеками:
    Coro coro = Coro.initSuspended((@Async({@Await(value = "yield")}) ICoroRunnable) () -> {
    Coro.get().yield();
    });
    


    Спасибо автору за расширение моего кругозора, но видимо следующим шагом надо писать свой новый язык JVM, где можно использовать свои собственные ключевые слова async и await.
  • Open source сервер онлайн-чатов на Java
    0
    Да они тоже используются.
    Но их не всегда хватает.
    Иногда хочется просто сверстать целую страницу на другом языке. Например раздел документации.
  • Open source сервер онлайн-чатов на Java
    –2
    Да, я думаю о переходе на Maven. На первых этапах отказ от него сделал процесс разработки более быстрым и гибким.
    Сейчас, когда код устоялся, можно и зависимости вынести вон из проекта.
  • Open source сервер онлайн-чатов на Java
    0
    На данный момент есть только 2 языка (рус и eng).
    Поэтому удобно делать такую проверку: «Если isThreadLang_EN, то показать view_en иначе view_ru».

    Когда будут другие локали, то сделав поиск по вызову isThreadLang_EN будет легко заменить эту логику на более общий код (а isThreadLang_EN — выбросить). Т.о. код эволюционирует по мере необходимости.
  • Open source сервер онлайн-чатов на Java
    0
    Для себя я получил лаконичность.

    Можно быстро собирать простые и скучные запросы в атомарные классы
    (в тексте это CreateUser, GetAllBlockedUsers, UpdateUserById)
    и потом передавать их в шаблонизатор, скрывая рутину.

    Например в одном вызове скрыта вся рутина создания INSERT запроса:
    universal.update(new CreateUser(user));
    

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

    Тоже самое делает MyBatis (скрывает сложность), но в нем бывает занудно писать в десятый раз очередной селект по id для очередного объекта БД. Поэтому появился этот простой шаблонизатор. :)

  • Чат-помощник на сайт с помощью Telegram за 15 минут
    0
    Да, вы правы. После вашей статьи понимаю, что это очень полезная фича.
  • Чат-помощник на сайт с помощью Telegram за 15 минут
    +1
    В дополнение к статье автора: недавно выложил в opensource похожую систему.
    Только там уже свой сервер для обработки и хранения чатов. Может кому пригодится :)
    github.com/edolganov/live-chat-engine
  • «Убийца Bootstrap» — Material Design Lite. Версия 1.0.0
    –13
    В Опере 12 почти не работает. Так что я не очень одобряю :)
  • Пишем бота для браузерной игры agar.io
    0
    С помощью клавиши W можно кидать массу в зеленое растение — от этого оно распухает и в какой-то момент делится. Таким образом можно делать ловушки для близких к растению соперников, разбивая их на части прилетевшим к ним новым растением.
  • Пишем бота для браузерной игры agar.io
    0
    Спасибо!
  • Пишем бота для браузерной игры agar.io
    0
    Если я не ошибся, то сервер на одном ip содержит много игровых комнат. Потому что я подставляю один и тот же ip для всех ботов. Но ко мне попадает лишь часть. Другие крутятся с другими игроками.
    В итоге в комнате играет 15-20 игроков, на сервер может и 5000.
  • Пишем бота для браузерной игры agar.io
    0
    Круто! Спасибо!
    Уже есть достижения в интеллекте бота?
  • Пишем бота для браузерной игры agar.io
    +10
    Зависит. Можно подкрадываться и съедать конкурентов делением. Можно кидать приманки, можно растить зеленые растения, чтобы они делились и разрывали бОльшего конкурента на части…
    Шахматы прям :)
  • Класс дедлоков про дедлок классов
    +3
    Реально страшно за что?
    Ну да, бывают баги в любом коде, в любых либах. Мы ж на этом не самолеты запускаем с реакторами, а лишь в интернете чатики, да картинки показываем.
  • Google Code закрывается и предлагает всем перейти на GitHub
    +1
    Вы можете экспортнуть их в свой github аккаунт.
    Там даже на странице проекта уже есть кнопка «Export to GitHub»
  • Если нельзя оставить комментарий, но очень хочется, то можно
    +1
    Может.
    Я же больше склоняюсь, что идея сама по себе не нужна публике.
    Мы нынче очень перегружены различными публичными сервисами.
    Поэтому не все новые идеи встречают отклик в избалованных сердцах и перегруженных мозгах людей :)
  • Если нельзя оставить комментарий, но очень хочется, то можно
    +2
    Привет коллегам по идее!
    Год назад сам запустил такую штуку: http://freecom.me/

    У меня не взлетело, но вам искренне желаю удачи!
  • Мысли вслух о разработке javascript-приложений на примере небольшого Line Of Business фреймворка
    0
    Впечатление от кода: его трудно читать и он многословен.
    Примеры:
    listViewModelDef.superclass.constructor.call(this, title);
    
    ko.bindingHandlers.bufferedListPager.init(element, valueAccessor, allBindingsAccessor, viewModel);
    
    testListDef.superclass.constructor.call(this, 'Тестовый список');
    
    


    Убежден, что причина именно такого кода — педантичность автора.
    Не навязываю, но как совет: будет лучше, если всю эту «ненужную» мишуру спрятать как-то в недра. Ведь чем меньше видишь кода, тем проще его понимать. А спрятать всегда можно — было бы желание :)

  • Cohesion in Enterprise Applications
    0
    Попытаюсь сказать по-другому:
    «проблема с cohesion» — это обычно не такая критичная проблема, чтобы решать ее на каждом проекте. Да, вас может раздражать что один класс содержит 2 тысячи строк кода и лучше бы этот код разбить на отдельные классы.

    Но проекты с такими God Сlass-ами вполне нормально живут, для них пишутся такие же юнит-тесты как и для меньших классов.

    Потому что мы все равно разнесли логику на слои. Контроллеры получают запросы, DAO общаются с БД, а God Сlass-ы бизнес-логики содержат все сценарии работы, которые нужны от системы.

    Я не говорю что God Сlass-ы — это хорошо. Я говорю, что они терпимы и с ними можно жить.
  • Cohesion in Enterprise Applications
    0
    Про юнит-тесты не соглашусь. Если мы раскидываем код из God Сlass-а в кучу разных других классов — то мы наводим некий порядок, но не уменьшаем сложность всей системы.

    Юнит тесты для класса с 30 методами — это условно 30 разных тестов для каждого отдельного метода.

    Юниты тест для разделенных 6 разных классов с 5 методами в каждом — это те же 30 тестов.

    Т.о. как у вас было 30 тестов, так и придется поддерживать те же 30 тестов.
  • Cohesion in Enterprise Applications
    0
    Однако, опыт показывает, что в 90% случаев проще использовать простой подход: один-два-много God Сlass-ов с кучей публичных методов в каждом из них.

    Да будет немного муторно, когда методов 20-30.
    Но это нормальная цена за простоту — любой джуниор сразу понимает, как это работает.:)

    Я не призываю использовать только такой подход, нет!
    Мысль моя в том, что обычно этого достаточно. А когда проект станет большим, то тогда отдельные участки проекта можно поменять на что-то другое.
  • Cohesion in Enterprise Applications
    0
    Предложу еще одно решение поставленной в задаче проблемы:
    Итак у нас есть сервис, в котором куча «методов-скриптов».
    Если количество этих методов уже неудобно, то можно выносить их в отдельные классы-команды.

    Пример
    class CreateApplication extends BaseCommand<Application, Result>{
    
        public Application app;
        public InvocationContext context;
    
        public CreateApplication(Application app){
             this.app = app;
        }
    
        public Result invoke(){
              //здесь делаем логику создания в возвращаем результат
              //используем context
        }
    
    }
    


    Тогда у сервиса будет универсальный метод invoke:
       
       public <T> invoke(BaseCommand<?, T> command){
           command.context = ...; //проставляем контекст выполнения
           return command.invoke();
       }
    
    


    Как видите, здесь мы создаем команду где-то извне, передаем ее сервису, сервис проставляет свой контекст исполнения (например контекст может содержать классы DAO) и дальше вызывает команду на исполнение.

    У такого подхода есть свои плюсы, минусы и вариации.
    Но в целом он тоже применим.

    Как пример реализации такого подхода, я даже когда-то написал свою библиотеку для Java.
  • JBOSS 4.2.3 Manual
    0
    JBOSS 4 — эх, молодость! джуниорство босоногое)
  • Как оказалось, знают все, а понимают не все. Транзакции в mysql и SELECT FOR UPDATE
    0
    Я лишь хотел напомнить про подход как таковой.

    Если нужна оптимистическая блокировка в ситуации INSERT-а строки вместо UPDATE существующей, то можно использовать внешнюю таблицу для лока:

    «Добавить новую строку баланса, проставив новую ревизию в глобальную таблицу ревизий, если ожидаемая старая ревизия такая-то»

    Надеюсь идея понятна.
  • Как оказалось, знают все, а понимают не все. Транзакции в mysql и SELECT FOR UPDATE
    +1
    Помимо предложенного метода в статье предложу более общий вариант — оптимистическая блокировка:

    UPDATE users SET balance = ${newValue} WHERE balance=${expectedOldValue};

    Данный запрос вернет 0, если ожидаемый баланс не совпадет с текущим — т.е. кто-то нас опередил и наши данные о балансе больше не актуальны.
  • Простейший Connection pool без DataSource в Java
    0
    Рекомендую всем желающим хороший пример реализации Connection Pool от MyBatis.

    Довольно понятный код и учитываются все аспекты данного вопроса:
    — ограничение сверху на макс.количество соединений
    — обработка ошибок соединения
    — обновление пула соединений новыми, при обрыве старых

    Я даже брал когда-то этот код для реализации пула сокетов.
  • Maxmertkit. Идеальный css-фреймворк
    +3
    Дорогой Автор! Вы — два раза большой молодец!

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

    Будьте уверены — это нужно. Не согласны обычно те, кто сам ничего такого не создает ;)
    Спасибо.
  • Строим веб-приложение на Java без JEE и Spring
    0
    Спасибо вам за внимательность! Поправил.
  • Строим веб-приложение на Java без JEE и Spring
    +3
    Я хотел показать данной статьей, что не нужно ограничивать себя рамками больших типовых решений.
    Для небольших веб-проектов может оказаться приятней и быстрей написать что-то своё.
  • Строим веб-приложение на Java без JEE и Spring
    –1
    Ответ на вопрос «зачем» дан в самом начале статьи — посмотрите внимательнее :)

    Плюс всегда приятно опуститься на уровень «пониже», чтобы самому познать то, что скрыто от вас в Больших Фреймворках.

  • Строим веб-приложение на Java без JEE и Spring
    +2
    Формально вы конечно правы!
    Но на практике это скорее простой и удобный стандарт Java веб-приложений. Например Томкат нельзя считать полноценным JEE-сервером — всё что в нем есть — это как раз-таки одни сервлеты :)
  • Facebook научился распознавать лица в толпе с точностью 97,25 %
    +2
    Ну вот!
    А я с товарищем 5 лет назад делал что-то похожее в университете.
    Приятно, что мы двигались в том же направлении, что и авторы из Фейсбука.
  • CUBA — платформа для быстрой разработки бизнес-приложений на Java
    0
    Посмотрел видео работы с системой: http://vimeo.com/77210510

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

    Но, наверняка, многим заказчикам нравится возможность клепать всё из UI.
  • Знакомство с Green-forest Framework
    0
    Да, паттерн «Command» наиболее близок к «Action-Handler».
    Но, реализуя свои собственные комманды, вы столкнетесь с необходимостью передавать в них контекст, с желанием добавить перехватчики вызовов, фильтры и т.д. Все эти вещи как раз реализованы в представленном фреймворке.
  • Знакомство с Green-forest Framework
    0
    Так же на сайте проекта написано, что этот IoC контейнер можно (и нужно) использовать вместе с JEE и Spring.
    И даже даны примеры этой интеграции тут и тут.
  • Знакомство с Green-forest Framework
    0
    Простите, опечатка: первая строка some/package/user/ — лишняя
  • Знакомство с Green-forest Framework
    0
    Простите, опечатка в коде: готовил пример с живого проекта :)
    Правильный код:
    public class CreateUser extends Action<CreateUser.Input, User>{
    	
    	
    	public static class Input {
    		
    		public Object someData1;
    		public Object someData2;
    
    		public Input(Object someData1, Object someData2) {
    			this.someData1 = someData1;
    			this.someData2 = someData2;
    		}
    		
    	}
    
    	public CreateUser(Input input) {
    		super(input);
    	}
    	
    }
    
  • Знакомство с Green-forest Framework
    0
    Если рассматривать только вопрос навигации, то раньше нужно было сначала искать класс в пакетах, потом метод в классе.
    в новом подходе — нужно искать только класс. Причем пакеты древовидны, в отличие от линейных методов:
    some/package/user/
    some/name/user/basic
    		CreateUser.java
    		UpdateUser.java
    		...
    some/name/user/moderation
    		BlockUser.java
    		UnblockUser.java
    		...