Skip to main content

Posts

Tomcat in debug, JPDA in Java 11 and Windows

In the latter versions  of Java you need to specify host. Otherwise it'll be "loopback": only connection from the same host would be possible. If Tomcat is started as Windows service, then change Java options: -Xdebug -Xrunjdwp:transport=dt_socket,address=*:9043,server=y,suspend=n What will happen if to use address=9043 with port only? Open Windows Resource Monitor -> Network tab -> Listening Ports: But when we change it to address=*:9043, Address becomes IPv4 unspecified. How to check from the machine with IDE. You can use the following PowerShell command: Test-NetConnection host.address -Port 9043 The output in case of address=9043 is the following: PS C:\Users\username> Test-NetConnection host.address -Port 9043 WARNING: TCP connect to (host.ip : 9043) failed ComputerName           : host.address RemoteAddress          : host.ip RemotePort            ...

End of line in Git

Initially we had SVN, but then migrated to Git. Actually we had no idea about end of line issue, because we always worked on Windows. After some time we've noticed that specific commits changed the whole file, though some diff tools insisted that there are no differences. First of all, it occurred that the order of revisions in git diff is important. It misled us, we started to think that those commits changed LF -> CRLF. Finally, git diff <parent_commit> <child_commit> --ws-error-highlight=new,old -- FileName.java revealed the truth: Now we are thinking should we stay with "Windows-style everywhere" or migrate to "commit Unix-style". Points to consider: There are tons of holly wars, but I couldn't find recommendation from Git. But it provides a way to change behavior. There is recommendation from GitHub to use LF in repository. Windows for git has three options, but neither one of them enforces CRL...

Hibernate

1. Hibernate Session . Javadoc называет её главным интерфейсом между java-приложением и Hibernate. Иногда её называют единицей работы или логической транзакцией. Основная функция сессии - обеспечить операции создания, чтения, удаления объектов. Объекты могут находиться в одном из 3 состояний (см. 2) Сессия создается с помощью SessionFactory. SessionFactory знает конфигурацию ORM, её внутреннее состояния immutable. При вызове Configuration().configure() загружается файл hibernate.cfg.xml. После того, как конфигурация загружена, можно изменить настройки программно. Данные корректировки возможны только до создания экземпляра фабрики сессий. // Initialize the Hibernate environment Configuration cfg = new Configuration().configure(); // Create the session factory ServiceRegistryBuilder srb = new ServiceRegistryBuilder(); ServiceRegistry sr = srb.applySettings(cfg.getProperties()).buildServiceRegistry(); SessionFactory factory = cfg.buildSessionFactory(sr); // Obtain the new session obj...

Spring Security и PreAuth

Windows hints

1. Хотим остановить зависшую  службу, но через Administration -> Services показывает статус Stropping бесконечно. Хорошая статья: http://www.examiner.com/list/how-to-kill-a-windows-service-that-s-stuck-on-stopping-or-starting Общий смысл: sc queryex servicename     где servicename из свойств службы, покажет PID taskkill /f /pid [PID]

Using filesort; Using temporary

При выполнении explain в колонке Extra иногда значатся Using filesort; Using temporary. Что бы это значило? Хороший ответ на английском  What does Using filesort mean in MySQL? Его перевод на русский с дополнениями: Если в памяти создается временная таблица, хранящая результаты запроса, то это Using temporary. Временная таблица может быть сохранена на диск, если она слишком велика, чтобы поместиться в память. // TODO: слишком велика - это сколько? по какой еще причине она может быть записана на диск? Каждый раз, когда сортировка не может быть выполнена по индексу, это using filesort. Плохое имя заставляет нас думать о файлах, но они тут не при чем. Filesort могла бы называться просто sort. На самом деле это quicksort. Если сортировка больше, чем "sort buffer" (?), то она выполняется по частям. Объем памяти, выделяемый для filesort(), хранится в переменной @@sort_buffer_size .  Если сортируемые данные не помещаются в эту память, filesort будет использовать временные ...

Spring

Wikipedia: The Spring Framework is an open source application framework and inversion of control container for the Java platform. Это Container, так как Spring управляет жизненным циклом всех объектов контейнера: создает их и связывает (wiring) их друг с другом. Это Framework, Spring позволяет создавать и конфигурировать сложные приложения из простых компонент, предоставляя гибкие и эффективные реализации многих необходимых сервисов. 1. DI и IoC Фаулер считает одним и тем же, просто DI - более подходящий термин. Паттерн DI предоставляет компоненту внешнюю зависимость (вместо того, чтобы захардкодить её). То есть мы сообщаем объекту о его зависимостях вместо того, чтобы он сам о них знал. Предыстория: Мы стараемся использовать интерфейсы, например tree.getFruits(), но где мы создаем объект tree? Если в классе, который его использует, то получается, что класс зависит не только от интерфейса ITree, но и от конкретной реализации, скажем AppleTree. А если кто-то захочет использоват...

Liferay

1. При использовании ServiceBuilder build.number из файла service.properties сохраняется в таблице servicecomponent. Если при каждом старте Liferay пытается сделать апгрейд до новой версии, backup таблиц и виснет, то имеет смысл выкинуть все строки из servicecomponent, касающиеся создаваемой нами базы, поменять необходимые колонки или таблицы вручную, запустить. 2. Где в базе данных найти содержимое страницы пользователя? Из таблицы user_ : userId= 2 Из таблицы group_ : userId =2 => groupId= 88 Из таблицы layout: groupId=88, private, /home => typesettings = "layout-template-id=2_columns_ii column-2=33, column-1=82,3," В таблице layout, колонка typesettings содержит layout и id портлетов. 3. При старте liferay не деплоит war-файлы из папки deploy? Нет ли в логах строки вида 10:08:35,909 INFO Auto deploy scanner started for C:\Selenium\liferay-portal-6.1.1-ce-ga2\deploy и путь совсем не тот что у вашего liferay? Смотреть portal-setup-wizard.properties 4. How to get ...

Classloader, Tomcat, PermGen, ...

Classloader подгружает классы по мере необходимости. Когда в контейнере происходит undeploy, classloader и подгруженные классы должны быть собраны GC. Память JVM состоит из Heap и Permanent Generation. Heap делится на Young Generation (Eden + Survivor) и Old Generation. PermGen - Permanent Generation -  область памяти под управлением VM, которая хранит объекты классов (Class) и interned sttrings (уникальные строки, скажем так). OutOfMemory: PermGenSpace может возникать, если что-то держит Classloader. Когда стартует Tomcat, он создает иерархию classloader'ов: Bootstrap | System | Common / \ Webapp1 Webapp2 ... 1) Каждый объект держит линк на его Class 2) Каждый объект типа Class держит линк на ClassLoader и наоборот (за исключением загруженных Bootstrap loader'ом) holds -------> Servlet1 / | / v / Servlet1.clas...

Android: pull-to-refresh с двух концов списка

Когда пользователь дойдет до верхнего или нижнего края списка ListView, надо подгрузить следующие записи. Как-то обозначить прогресс выполнения. Если бы подгружать надо было только в конце списка, то можно использовать  Endless scrolling ListView . Если только в начале, то компонент  ActionBar-PullToRefresh, написанный Chris Banes  - впрочем внешний вид компонента красив, поэтому... Мы хотим что-то в духе ActionBar-PullToRefresh, но с обоих концов списка. Как отследить событие "оттягивания" края списка? Начиная с 2.3 (api level 9) в android у AbsListView появляется Overscroll: возможность отследить оттягивание края списка. И это прекрасно работает на эмуляторах 2.3 и 4.3, но на телефоне samsung c 2.3 не работает, де самсунг решил не поддерживать эти методы. Поэтому будем использовать события touch . Возьмём решение  Fiddler'a со Stackoverflow . updatesList.setOnTouchListener(new View.OnTouchListener() { private static final float OVERSCROLL_THRESHOLD_IN_P...

Собеседования: БД и работа с ними

1. Реляционная БД Построена на реляционной модели данных, на отношениях. Отношение - математический термин, согласно wiki это подмножество декартова произведения множеств, называемых доменами. Например, отношение Человек может быть подмножеством произведения домена Имя (Андрей, Сергей) и Фамилия (Иванов, Смирнов). Таблица (множество кортежей) - это представление отношения. 2. Нормализация Процесс приведения к нормальной форме. Есть несколько нормальных форм. 1НФ - все атрибуты атомарны. "ФИО, Телефоны". Телефонов может быть несколько, этот атрибут не атомарен - должен быть разделен. 2НФ - все столбцы, не входящие в полный первичный ключ, должны зависеть от полного первичного ключа. Если ключ составной (Покупатель, Товар), то поля должны зависеть от всего ключа: Количество - хорошо, ФИО Покупателя - плохо - зависит только от Покупателя. 3НФ - все столбцы, не входящие в полный первичный ключ, должны зависеть от него и не должны зависеть друг от друга. Машина, Производ...

Android Support Library + Maven + Eclipse

Допустим, мы хотим ActionBar в нашем android приложении. Но минимальная версия, которую мы хотим поддерживать, 2.3, и никакого ActionBar там ещё нет. Android Support Library позволяет использовать некоторые новые компоненты в старых версиях. В данном случае нам нужна Android Support Library  v7 appcompat. 1. Такой dependency в репозитории нет.  Maven Android SDK Deployer  позволяет помещать в локальный репозиторий dependency из локальной Android SDK. Если мы разрабатываем для android-4.3, то можем сгенерировать артефакты только для этой версии: mvn install -P 4.3 Кажется, для этого потребуется установить и версию sdk - 17. Если maven install упадет с ошибкой, то там будет написана причина. Если зайти в локальный репозиторий, то там появятся артефакты в папке: .m2\repository\android\support\compatibility-v7-appcompat\18 2. Подключим зависимости в pom.xml нашего app: <dependency> <groupId>android.support</groupId> <artifactId>compati...

Android для клуба склеротиков

1. Для начала работы надо установить Android SDK. Это только базовые инструменты. Для полноценной разработки используем входящую в SDK утилиту SDK Manager. Там можно установить все остальное, включая SDK Tools. Компонент SDK Tools включает полный набор инструментов для разработки и отладки под android. Для Eclipse понадобится ADT плагин. 2. Создание Android проекта с Maven: Установить "Android Configurator for M2E" (Help->Eclipse Marketplace, искать по "android m2e"). Добавляет поддержку Maven в ADT. Создать в Eclipse обычный Maven Project. На странице с archetypes добавить новый: android-quickstart ( Описание с akquinet STAND ). Чтобы сгенерировать классы и apk выполним Run As -> Maven Install. Чтобы запустить приложение есть 2 пути: 1) Здесь  создают три конфигурации, выполняя Run As -> Maven Build... последовательно для трёх goals: android:emulator-start android:deploy android:run 2) По старинке можно пользоваться Run As -> An...

Adapter / decorator / proxy / wrapper

Очень похожи. Все создают "промежуточный" объект, который "более удобен" для клиента. Но еще интереснее то, что банда четырех и про Adapter и про Decorator говорит: "известен также под именем Wrapper". Так в чем же разница? 1. Adapter (Адаптер). Нужно использовать компоненты, интерфейс которых не совпадает с "нашими" интерфейсами. Нужен "переходник", который интерфейс компонента приведет к тому виду, с которым нам удобно работать. Например, есть сторонняя библиотека и есть наша система, работающая с иными интерфейсами. Изменить библиотеку мы не можем, менять свою реализацию не хотим (а вдруг потом будет другая библиотека, что тогда?). 2. Wrapper (Обёртка). Есть функциональность, которая не является объектом, например, библиотека. Хотим сделать из нее что-то объектное. 3. Decorator (Декоратор). Хотим добавить функциональность к объекту, но не наследовать. Похоже на servlet filter. Цель: добавить в класс новое поведение. 4...

Upload файла и заголовки запроса в IE8

Пытаемся отправить форму с файлом на сервер. То, что сработает в Chrome, в IE выдаст предупреждение: "Verifying application requirements. This may take a few moments." Но почему? В IE8 невозможно без дополнительных программ посмотреть, какие заголовки содержит request/response. Поэтому установим  Fiddler2 . Fiddler is a Web Debugging Proxy which logs all  HTTP(S)  traffic between your computer and the Internet. Fiddler allows you to inspect traffic, set breakpoints, and "fiddle" with incoming or outgoing data.  Как отследить запросы к локальному web серверу? Надо добавить в адрес символ ".": http://localhost:8080/ -> http://localhost . :8080/ Оказалось, что IE8 устанавливает заголовок запроса Content-Type в application/x-ms-application. Этот же заголовок возвращается в response. Необходимо установить заголовок ответа в text/html. Но, о ужас. @RequestMapping(value="/image", method=RequestMethod.POST) @ResponseBody public String upl...

Первые шаги в Selenium

Цель расплывчата: понять и сделать хоть что-нибудь =) Selenium Selenium - группа продуктов. Отличное описание в статье Что такое Selenium? Selenium IDE - плагин для Firefox, позволяет записать тест, выполняя действия в браузере. Казалось бы, Selenium WebDriver должен дать больше возможностей: всё таки не из графического интерфейса тесты пишем, а с помощью языка программирования, но интересная мысль в другой статье того же автора  Что такое Selenium WebDriver? : "... WebDriver не имеет прямого отношения к тестированию. Он всего лишь предоставляет автотестам доступ к браузеру. На этом его функции заканчиваются.Структурирование, группировку и запуск тестов, а также генерацию отчётов о тестировании, обеспечивает фреймворк тестирования, такой как JUnit или TestNG для Java, .."  Локаторы Выбрать элемент на странице можно используя локаторы. Локаторы (в Selenium IDE в поле target) используют DOM, XPath или CSS (или просто ищут по id/name). Полезное: XPath: XML Path La...

JSP & EL: доступ к данным

EL (expression language) - язык, упрощающий доступ к данным на странице.  Общее Выражения EL могут быть выполнены при первом отображении страницы (immediate evaluation). Тогда они имеют следующий (более привычный) вид: ${person.name} Или технология, которая использует EL, может вычислять их в какой-то другой момент жизненного цикла страницы (deferred evaluation). Тогда используется синтаксис   #{} .  Этот синтаксис более привычен тем, кто использует JSF. Первая переменная (если она переменная, а не, скажем, ${42}) всегда является либо атрибутом, либо неявным объектом: Доступ к полям Можно использовать квадратные скобки [] или точку . . используется как имя поля в бине или имя ключа в Map: [] кроме вышеперечисленного могут обращаться по индексу к элементу массива или списка: Да, индекс будет в кавычках. Картинки позаимствованы из O'Reilly. Head First. Servlets and JSP. Что почитать: 1) Коротко от Oracle:  http://docs.oracle.com...

Шпаргалка по MySQL

1. Создание базы и пользователя CREATE DATABASE testdb character set utf8; CREATE USER 'testdbuser'@'localhost' IDENTIFIED BY 'testpwd'; GRANT ALL PRIVILEGES ON testdb.* TO 'testdbuser'@'localhost' WITH GRANT OPTION; 2.  Какие пользователи существуют? Если у пользователя есть права на эту таблицу: SELECT * FROM mysql.user; 3. Использовать ключевое слово в качестве имени столбца можно, взяв его в одинарные обратные кавычки (над «ё», иногда называют «гравис»). 4. Визуально про JOIN:  Визуальное объяснение SQL Joins . В том числе ответ на вопрос, как найти строки левой таблицы, которых нет в правой таблице. 5. TODO

JavaScript

Многие могут что-то набросать на js, но, как мне кажется, уровень понимания языка у некоторых близок к моему :( В общем, сборник вопросов и ответов, которые иногда возникают: Определение функций Кто-то пишет так: var functionOne = function() { // Some code }; А кто-то так: function functionTwo() { // Some code } В чем разница? В том, что определением функции является только второе. Первое - объявление переменной, значением которой является анонимная функция. Соответственно, функция будет известна уже в parse-time, а вот переменная появится только при run-time: <script> // Error functionOne(); var functionOne = function() { } </script> <script> // No error functionTwo(); function functionTwo() { } </script> JSON и массивы Задача: сериализовать данные в json так, чтобы ключом был индекс. Должна получиться строка вида "{"0":{"name":"Имя1"},"1":{"name":"Имя2"}...

Попурри о Generics

Кто не встречал в коде и не использовал generics сам? Общая идея в том, что типы (классы или интерфейсы) могут выступать в роли параметров при определении классов, интерфейсов или методов. Generics - своего рода формальный параметр, при котором фактическим параметром будет не значение, а тип. Преимущества очевидны: Проверка типов времени компиляции Меньше приведений типов Можно реализовать более общий алгоритм для коллекций объектов разных типов, который будет легким для чтения и, в то же время, type safe. Generic ("Обобщенные" в русской традиции) типы и методы Хотим создать generic type - обобщенный класс или интерфейс. Чтобы использовать generic, мы создаем generic type declaration: эту самую <T>. После того как мы ввели type variable, можно использовать её в классе. /** * Generic version of the Box class. * @param <T> the type of the value being boxed */ public class Box<T> { // T stands for "Type" private T t; public...