Skip to main content

Posts

Showing posts from 2013

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...