• Как правильно использовать immutable-объекты для многопоточных приложений?

    @bromzh
    Drugs-driven development
    В первую очередь надо понимать и уметь работать с коллекциями в многопоточной среде. Модификатор final ещё не означает, что поле нельзя изменить. Он лишь указывает, что такому полю нельзя дважды присвоить значение через оператор =.
    На тему коллекций в многопоточности есть вот это: www.youtube.com/watch?v=-yQeYo32Lt4

    Ну а в целом, всё в принципе просто. В многопоточной среде появляется необходимость использовать некие общие данные. Первый вариант - это использовать синхронизации (семафоры, мьютексы и т.д.). Другой вариант - объявить, что все данные неизменяемые. Данные полям можно присвоить только 1 раз, все коллекции тоже неизменяемые. Тогда можно считывать их значения без использования синхронизаций (которые порой бывают сложными, да и лишняя память тратится) и прозрачно обрабатывать их в несколько потоков.
    Ответ написан
    Комментировать
  • Какие технологии выбрать для CRM оптовой компании?

    @bromzh
    Drugs-driven development
    Как раз пишу подобное. На сервере Java (JavaEE, MongoDB), на клиенте AngularJS.
    Ответ написан
    Комментировать
  • Какие технологии использовать для создания Landing Page на Java?

    @bromzh
    Drugs-driven development
    Так что сделать надо, лендинг или веб-сервис + фронтенд (в форм-факторе того же лендинга)?
    Если первое, то при чём тут java? Бери любую удобную js-библиотеку (или вообще чистый js), ищи в гуглах обработку xsd на js и верстай.
    Если второе, то вывод самой html-страницы зависит от того, насколько велика потребность что-то шаблонизировать. Если от сервера использзуется только АПИ, то см. п. 1. Если много данных, то бери любой шаблонизатор, можешь и на JSP сделать, тут как тебе удобнее.
    Ответ написан
    2 комментария
  • Как возвратить список игроков из hashMap?

    @bromzh
    Drugs-driven development
    Дженерики для кого придумали?
    Map<String, Player> players = new HashMap<>();
    ...
    public List<Player> getAllPlayers() {
    return players.values();
    }


    Пиши нормальный код. Изучи коллекции и дженерики в яве, это же основа.
    Ответ написан
    Комментировать
  • Можно ли "нормально" заработать на разработке парсеров?

    @bromzh
    Drugs-driven development
    сам парсер будет десктопным и будет даваться в аренду на определенный срок.

    Это до первой декомпиляции. Плюс ты сам же писал, что умеешь в Spring.
    Логичный вывод - сделать это как онлайн-сервис. Чуваки оставляют заявку, ты пишешь парсер. Когда написал, в личном кабинете у заказчика появится интерфейс для его использования. Так ты и сможешь ограничить доступ по времени, и защитишься от декомпиляции.

    Спрос наверняка будет, но, как уже писали, он довольно специфичный. Зачастую под каждый сайт надо писать свой парсер. Унифицировать сложно, однако можно написать DSL для таких вещей, чтобы ускорить процесс.
    Находить же заказчиков можно на всяких фриланс-биржах. Потом можно и публичный сайт сделать, рекламировать его, как SaaS, и т.д.
    Ответ написан
    Комментировать
  • Есть ли хорошие статьи об подключение Access к Java?

    @bromzh
    Drugs-driven development
    Из 8-й явы выпили ODBC-мост, советуют использовать это: ucanaccess.sourceforge.net/site.html
    И вот ещё: stackoverflow.com/questions/21955256/manipulating-...
    Ответ написан
    Комментировать
  • Передача списка в объект класса по ссылке, как сделать?

    @bromzh
    Drugs-driven development
    Автор, ты несёшь бред. Ты прочитал статью, но ничего из неё не понял. Вот тебе доки, просвящайся.
    Давай ещё на русском продублирую, раз с английским туго
    1) Когда ты присваиваешь одну переменную другой, на самом деле происходит лишь копирование ссылок на объект. В итоге, 2 переменные ссылаются на 1 объект. Вот тебе простейшее доказательство, если ты мне не веришь. Пожалуйста, вбей этот текст в интерпретатор питона и убедись сам:
    class A(object):
        def __init__(self, item):
            self.field = item
    
    c = [1, 2]
    a = A(c)
    id(a.field) == id(c) # => True. Где тут разные id, покажи? 
    c[0] = 100
    a.field # => [100, 2] Копия создаётся, говоришь? Как ты тогда объяснишь, что изменяли мы c, а a.field вдруг тоже изменилось?
    a.field[1] = 200
    c #=> [100, 200] Ты всё ещё уверен, что это копия?


    Автор в статье как раз и пытается донести мысль, что переменная - это не сам объект (объект хранится в памяти), а только лишь его адрес. И когда ты пишешь знак равенства, на деле переменной слева всего лишь присваивается тот адрес, на который указывает переменная справа. После присваивания 2 переменные стали ссылаться на 1 объект в памяти.
    Если этот объект неизменяемый (строка, кортеж, число, и т.д.), то ты никак его изменить не сможешь. И когда ты переменной, указывающей на этот объект присваиваешь новое значение, на деле, переменная просто начинает указывать на другой объект, а тот который был до этого не меняется. Даже когда пишешь i += 1, i будет указывать уже на другой объект
    Если же переменная указывает на мутабельный объект (экземпляр класса, список, словарь и т.д.), то над ней можно совершить некие действия, который изменят состояние объекта. И это изменённое состояние и будут отображать другие переменные, которые ссылаются на этот объект. Таким образом, можно изменить 1 переменную, а изменения прочитать из другой.

    2) В питоне нет понятия "объявить переменную". Сам факт присваивания переменной чего-нибудь либо затирает старую ссылку (но не объект!) на объект, либо создаёт новую связь.
    Так вот, есть такое понятие, как область видимости. Если ты создашь новую переменную внутри функции, извне она будет не видна. А вот если ты возьмёшь в качестве имени внутренней переменной уже использовавшееся ранее, то эта внутренняя переменная затенит внешнюю. Внутри функции не будет доступа к внешней переменной с тем же именем, вместо неё будет внутренняя.

    Так вот автор (и доки) так и говорят: если ты внутри функции попытаешься присвоить переменной с именем одного из аргумента какое-то новое значение, то это значение будет локальным внутри данной функции, а извне её значение переменной, которую передали в качестве аргумента будет старым. Более того, даже если ты сперва присвоил внутренней переменной внешнюю, но потом ещё раз присвоишь что-то другой, то во внутренней будет другая ссылка. Поясняю:
    def foo(a):
        print(id(a))
        a = [1] # Теперь a затеняет внешнюю переменную, т.е. указывает на другой объект
        print(id(a))
    
    b = [0, 1]
    foo(b) # Id будут разные, хотя имя одно, но после присвоения переменная потеряла связь с внешней


    И вот пока ты внутренней переменной не присвоил что-то новое, изменяя её ты изменишь и внешнюю переменную.
    И после "смерти" объекта ничего не изменится, как ты писал. Объект удаляется из памяти не сразу, это делает сборщик мусора, и только в том случае, если ссылок на объект в программе нет. Но тогда ты и не сможешь своё значение получить.

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

    @bromzh
    Drugs-driven development
    Конкретно скобки скорее всего парсятся регуляркой. Всё, что между них разбивается на токены (там ведь может быть не только простой вывод переменной. а целые выражения) и обрабатывается по сложной логике, учитывая всякие окружающие scope`ы, data binding-и, внедрённые зависимости в контроллер и т.д.
    Ответ написан
    6 комментариев
  • Куда двигаться дальше с Java?

    @bromzh
    Drugs-driven development
    До андроида на яве делали всё тоже самое - писали игры для мобильников на JavaME. И в вебе использовали. Только не для небольших проектов, а для крупных порталов. А из-за позиции разработчиков языка об сохранении обратной совместимости её любили и любят крупные корпорации, где на яве пишут те же веб-приложения, только для внутренних сетей.
    Плюс, в стандартной поставке самого языка есть кроссплатформенный GUI. Сам язык поддерживает нормальную многопоточность, имеется огромная куча библиотек на все случаи жизни.
    В итоге, ява и раньше и сейчас используется в самых разных областях, в отличие от узкоспециализированных языков. А сами вакансии обычно оплачиваются больше, нежели аналогичные для других языков.
    Ответ написан
    Комментировать
  • Что означает фраза " учите не язык, учите технологию "?

    @bromzh
    Drugs-driven development
    Просто язык без экосистемы ничего не стоит. Поэтому несмотря на то. что Lisp, OCaml, Haskell, например, имеют кучу крутых фич, все пишут на "примитивной" яве, потому что количество библиотек, фреймворков и технологий для неё огромно. Не было бы JavaEE со Spring, то её популярность была бы в разы меньше. Ruby стал популярным из-за RoR (на тот момент это было действительно что-то новое).
    Технологии более универсальны, языки вторичны, это всего лишь инструмент.
    Ответ написан
    1 комментарий
  • В чем разница между methods=('GET', 'POST') и methods=['GET', 'POST']?

    @bromzh
    Drugs-driven development
    Не важно, всё равно внутри всё в set перегоняется:
    methods = set(item.upper() for item in methods)
    В доках используют список. Если сомневаешься, делай как в доках.
    Ответ написан
    Комментировать
  • Реально ли связка jython + flask + hibernate?

    @bromzh
    Drugs-driven development
    Вроде да www.jython.org/jythonbook/en/1.0/DatabasesAndJytho...
    Но зачем? Если хочется лучшей явы - то есть груви со скалой.
    Если хочется БДнезависимые запросы и/или ORM в питоне, то SQLAlchemy имхо лучшее решение.
    Ответ написан
  • Как сделать десктопное приложение из JVM-cервлета?

    @bromzh
    Drugs-driven development
    Jetty отлично встраивается: https://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty
    Ответ написан
    Комментировать
  • Какие цвета выбрать для сайта?

    @bromzh
    Drugs-driven development
    Ответ написан
    Комментировать
  • Как создавать GUI в intellij idea?

    @bromzh
    Drugs-driven development
    Посмотри в сторону JavaFX. Графического редактора для него нет (он есть только для эклипса вроде как), но и без него нормально.
    PS Есть такая классная штука, как ScalaFX. Если ограничений на технологии нет, то советую её использовать. Если со скалой не дружишь, то её можно хотя бы для графической части использовать, а для логики взять старую добрую java.
    Ответ написан
    2 комментария
  • Графика в Java?

    @bromzh
    Drugs-driven development
    Не от нетбинс (его пилят сами ораклы), а от эклипс наверное - это SWT.
    Но лучше JavaFX.
    Ответ написан
    Комментировать
  • Какой фреймворк использовать для создания UI?

    @bromzh
    Drugs-driven development
    Бери JavaFX.
    Спринг можно использовать, но не для самого UI, а для всяких штук, типа связи с БД, DI (если это всё реально надо) и других, спринг же очень большой, охватывает многие области.
    Ответ написан
    Комментировать
  • Как реализовать следующее приложение Java EE?

    @bromzh
    Drugs-driven development
    Мой пример. Чистый JavaEE, без спринга: https://github.com/bromzh/geck
    Ответ написан
    Комментировать
  • Как вам такой способ?

    @bromzh
    Drugs-driven development
    Велосипед, и довольно ненадёжный. Есть же куча шаблонизаторов (или библиотек тэгов для JSP) с поддержкой наследования и создания reusable-компонентов: JSF, Struts, Tiles, Rapid-Framework, и т.д.
    Ответ написан
    Комментировать
  • Как дружат UI на JS и Java EE server-side?

    @bromzh
    Drugs-driven development
    3) GWT, например. Ты пишешь код на java, а он компилируется в JS. Таким образом, можно использовать многие java-классы (DTO тем более). Однако технология довольно своеобразна, подойдёт не всегда. И GWT компилятор поддерживает не всё из JavaCore и не дружит (пока) с Java8.
    PS из похожего ещё есть Vaadin
    Ответ написан
    2 комментария