All streams
Search
Write a publication
Pull to refresh
41
0

Пользователь

Send message
Интересно, а как в Go будет написан код, когда подряд идут несколько операций, которые могу вернуть ошибку?
Например:
file1, err := os.Open("test1.txt")
file2, err := os.Open("test2.txt")


Нужно каждый раз проверять что err не null?
С try/catch будет всего один catch блок.
Понятно. А Вы в support IDEA писали? А то странно — в IDEA есть поддержка Vaadin, но при этом с ним не работает GWT плагин.
На счёт своей сборки GWT не понял. А что будет, если в IDEA указать GWT SDK из Vaadin?
Был на прошлой Java конференции на выступлении Вашей компании — интересно рассказывали о единой платформе — и Web (с GWT и Vaadin) и Desktop (с Swing). :)

А теперь по статье — а Вы GWT какой версии используете? До 2.7 SuperDevMode не удобный — нужно перекомпиливать весь проект при малейшем изменении, а это долго. В 2.7 появилась инкрементальные компиляция, которая кардинально меняет дело. Но до 2.7, на мой взгляд удобнее пользоваться DevMode. Или Вам не часто нужно менять GWT Client код с перекомпиляцией всего?

И IDEA у Вас какой версии? В IDEA 14 (реклама!) отличная поддержка GWT — в GWT плагине используется github.com/branflake2267/superdevmode-launcher-legacy (насколько я понял) который позволяет запускать code server вместе с web сервером (как обычный DevMode) плюс не нужно явно перекомпилировать код с помощью закладок в браузере. Далее, IDEA поддерживает source map и, если запустить, браузер с IDEA плагином (я работал в Chrome) то можно отлаживать Java код в IDE (как в DevMode). Свои ограничения там конечно же есть (по сравнению в DevMode и Java), но, на мой взгляд, работает лучше чем в браузере.

Собственно, напишу, что узнал:
Альтернативный запуск SuperDevMode
По мимо использования стандартного DevMode можно использовать реализацию DevMode с поддержкой SuperDevMode без запуска отдельно code server и servlet container’а. Скачать её можно здесь:
github.com/branflake2267/superdevmode-launcher-legacy
Благодаря этой реализации так же ненужно явно вызывать компиляцию GWT через закладки в браузере – компиляция будет происходить автоматически (вроде как, перепроверить – проверено в IDEA, но возможно это преимущество GWT плагина IDEA).

Ремарка по поводу GWT 2.7
В GWT 2.7 добавили инкрементальную компиляцию, которая включена по умолчанию и позволяет не перекомпилировать весь проект. Т.ч. в идеале «горячий» старт в SuperDevMode будет таким-же или даже меньше чем в DevMode. Нужно только прописать –noprecompile и указать –workDir и –launcherDir (чтобы использовались конкретные папки, которые не сотрутся после перезапуска сервера) чтобы повторно не компилировать код при перезапуске сервера.
«Холодный» старт остаётся таким же долгим – происходит полная GWT компиляция.

Замечания о IDEA 14
В IDEA 14 доработали поддержку SuperDevMode – запуск SuperDevMode происходит также, как и просто DevMode, без необходимости запускать отдельно code server и servlet container и не нужно использовать закладки браузера для явного запуска компиляции – компиляция будет происходить при обновлении страницы.
Для того что бы компиляция не происходила каждый раз при перезапуске приложения, нужно в настройках запускаемой конфигурации явно указать папки workDir и war в поле Dev Mode parameters. Папка workDir – любая существующая папка, папка war – папка с web приложением, в которую будут компилироваться модули GWT. Пример:
-workDir D:\project\osbb_gradle\osbb_web\code_server_work_dir -war D:\project\osbb_gradle\osbb_web\src\main\webapp
Также нужно добавить памяти VM (VM options):
-Xmx1024m

Явно указывать папки workDir и war нужно потому что по умолчанию IDEA при каждом запуске копирует содержимое webapp папки в новую временную папку и запускает приложение уже там. Из-за чего скомпилированные в прошлый раз модули не используются и компиляция происходит заново. Но если указать явно папки, то при каждом запуске будут использоваться те же самые папки с уже скомпилированными модулями.

Что бы не компилировать модули в существующую папку приложения, можно при запуске приложения копировать её в другое место и использовать уже там, но при повторном запуске не очищать её. Т.о. существующая папка с приложением останется нетронута.
Интересный способ, должен работать из-за read barrier для volatile. Но судя по stackoverflow.com/questions/10620680/why-volatile-in-java-5-doesnt-synchronize-cached-copies-of-variables-with-main не всегда работает корректно :)
А что бы не было каждый раз обращения к volatile полю в цикле, можно его присвоить не volatile полю и обращаться.
Интересные примеры, спасибо! А то много раз слышал, как правильно делать, но практические примеры не правильного использования (и нюансы) не видел :)
Использовали MyBatis на несколько больших проектов. Только хорошие впечатления.

Из того что не указал автор — возможность создание TypeHandler'ов. Простой пример — в Java есть Enum со списком значений и нужно его замапить на значения из колонки. Создаётся TypeHandler — класс, который отвечает за преобразования этого объекта из Java в СУБД и наоборот, прописывается в маппинге запроса и всё. Дальше при выполнении запроса получает типизированные объекты. Мы использовали TypeHandler'ы для структур, списка структур, Enum'ов (шаблонный TypeHandler).

Также маппинги можно прописывать в интерфейсе (не скажу что это всегда удобно, но по крайней мере есть возможность не использовать xml).

Так же для IDEA есть отличный плагин по работе с MyBatis — plugins.jetbrains.com/plugin/7293. Я пробовал разные плагины для MyBatis, но этот оказался самый лучший. Из плюсов — подсветка синтаксиса в xml, autocomlite в xml, автопроверка соответствия интерфейса xml маппингу и наоборот, связывание методов интерфейса с маппингом (можно просто перейти в реализацию метода из интерфейса в xml — как к реализации метода интерфейса в классе). Также если настроить подключение к СУБД в IDEA, работает autocomplite по SQL запросам в xml (Например, если у нас в СУБД есть таблица students то если пишем в xml маппинге SELECT * FROM st и нажимаем Ctrl+Space IDEA подскажет, что можно выбрать таблицу students)

P.S. Работали с СУБД Oracle. В основном был вызов хранимых процедур и функций. Но были и select, и update.
Ну для Arduino проблема с дебагером — не проблема — там всё равно дебажить ни как нельзя :-D
Ребята из VisualMicro сделали свой костыль для дебага, но там у них не тру дебаг.
Да, Вы знаете, Open project тоже работает :) Import делал по аналогии с IDEA — если проект не IDEA проект (т.е. не содержит в себе папку .idea) то его нужно импортировать. Тут так же поступил — это CMake проект без папки .idea и по этому его импортировал.
Уточню — я говорю про методы в CMakeLists.txt файле. Честно говоря не знаю, как они правильно называются, т.к. я больше по Java :)
Я имею ввиду, когда в CMakeLists.txt есть строчка
print_board_list()

И в другом файле есть декларация этого метода:
function(PRINT_BOARD_LIST)
    foreach(PLATFORM ${ARDUINO_PLATFORMS})
        if(${PLATFORM}_BOARDS)
            message(STATUS "${PLATFORM} Boards:")
            print_list(${PLATFORM}_BOARDS)
            message(STATUS "")
        endif()
    endforeach()
endfunction()

То нельзя по Ctrl+click или Ctrl+B перейти на декларацию метода, пишет — «Cannot find declaration to go to».
Файлы входят в проект с точки зрения CLion, они не серые, в отличие от некоторых других файлов (т.е. есть с чем сравнить).
Если этого примера не достаточно, то можно скачать проект github.com/TimReset/arduino-cmake и посмотреть самим.
Ну по Ctrl+/ строка не комментируется. Хотя если просматривать diff файла CMakeLists.txt перед коммитом, строку можно закомментировать. :)
Не работает переход на декларацию метода (по Ctrl+click или Ctrl+B). У меня работал только autocomplite по путям (т.е. когда нужно указать имя папки или файла в проекте). Но вообще CMake нормально работает — по крайней мере у меня все target'ы корректно сгенерировал и корректно запускает.
Вообще пока всем доволен.
P.S. А куда делись настройки проекта? В IDEA они по Ctrl+Shift+Alt+S открываются. Какой теперь use case по работы с проектом?
Отвечу сам себе, чтобы в дальнейшем было людям проще найти — habrahabr.ru/post/247017/ Разобрался как в CLion для Arduino писать.
>Почему я не видел Ваш стенд на бесплатном фестивале науки в Москве?
Справедливости ради стоит заметить, что они были на «гик пикник» в ВДНХ в этом году (насколько я помню). У них там и ручка была и лампа и ещё что-то. Правда меня цены неприятно удивили, но за то всё было сделано качественно — и сами «гаджеты» и плакаты, их рекламирующие.
На счёт всей наценки не скажу, но вот на madrobots картонка с линзами для создания крепления для телефона стоит 2т.р. madrobots.ru/catalog/raznoe/kartonnye-ochki-dopolnitelnoy-realnosti-google-cardboard/ на сайте рядом (на который есть ссылка с madrobots) эти очки уже стоят 700р. boxglass.ru/ И это только русскоязычные сайты. Насколько я знаю, у китайцев эти очки можно купить от 2$ до 10$ (за 10$ уже хорошего качества). Так что у madrobots тоже есть пример хорошей накрутки. Надеюсь, единственный пример. :)
Посмотрел поподробнее — штука интересная. Но у нас в текущем проекте используется SmartGwt, а его не сэмулируешь — там только JS с тонкой Java-обёрткой. А так, для классического GWT или GXT gwt-test-utils получается хорош :) Кстати, не хотите написать статью об этом тестировании?
Интересная вещь. Я её встречал, когда искал информацию по тестированию в GWT. Но меня смутило несколько моментов:
1) Давно не поддерживается — последний релиз в сентября 2013 года для версии GWT 2.5.0.
2) Используется reflection для получения элементов, что не отлавливается при компиляции.
3) Далеко не все UI элементы можно корректно создать в JVM (например, все элемент SmartGWT). Так что лучше полностью отказаться от работы с UI и разделять логику и UI (не зря же придумали паттерны MV* ?!) и тестировать всё кроме UI.
4) Там нет тестирования GWT RPC (только с mock'ами). Хотя теоретически можно прикрутить SyncProxy.

А Вы использовали эту либу в реальных проектах? На какой версии GWT работаете? Вообще спасибо за инфу, ещё посмотрю поподробнее.
Сравнивают константу со значением, а не наоборот, чтобы в случае если значение null, не было NullPointerException. В Java начиная с 7 можно сделать так — Objects.equals(«javax/swing/JPasswordField»,className); Это будет работать при null значениях параметров (метод внутри проверяет на null).
P.S. Не успел чуть чуть с ответом :-) Но оставлю, т.к. есть ещё инфа.
В Java тоже есть такая проблема — до Java 8 был только один тип для даты — дата со временем и часовым поясом. Из за этого были большие путаницы когда нужно было хранить только время или только дату (без часового пояса). С такими проблемами встречался в разное время на абсолютно разных проектах! И только недавно ей решили — в Java 8 разделили тип для хранения даты на несколько — дата без часового пояса, дата с часовым поясом, время с/без часового пояса, дата со временем с/без часового пояса. В общем сделали всё по уму :)
И каково же было моё удивление что в Oracle уже давно используют разные типы для даты и времени с/без часового пояса!
Порой даже удивительно — такая типичная проблема и решается на первый взгляд легко, а начали исправлять только сейчас!
P.S. В Java есть JotaTime но это доп. либа поддерживаемая не всеми framework'ами.

Information

Rating
Does not participate
Date of birth
Registered
Activity