Archive for the ‘Java’ Category

Я ламер!

Февраль 4, 2011

На работе появилось несколько свободных минут. Читать ничего что то не хотелось. Решил пройти тест на quizful.net. Под руку попался «Java — Средний уровень».

Результат теста — не пройдет.

Я если честно не люблю тесты. Но проходить на этом сайте мне нравится потому, что они открывают ответы и объсняют, почему так, а не этак. В итоге точно знаешь, какого рода ошибка, или ступил, или невнимательно прочитал, или действительно не понимаешь, что да как.

В итоге:

  • неверно ответил только на 2 вопроса.
  • узнал про java.util.prefs.Preferences (век живи, век учись)
  • подтвердилось, что я не сильно внимательный. Но это не беда. Современные IDE сразу подсветят такого рода косяки, так что я даже не обращу на них внимания а машинально исправлю.

Конечно обидно, но вряд ли кто-то будет писать такие «перлы» как в тестах, потому что такое еще и придумать то надо :)

BigDecimal

Июль 22, 2009

java-personСеголня я немного был шокрирован, когда результат BigDecimal.equals(BigDecimal) давал false, хотя я на 100 процентов был уверен, что числа одинаковые.

Оказывается, что два BigDecimal’а эквивалентны тогда, когда не только их значения равны, но и scale одинаковый.

В если хочется проверить на равенство не взирая на scale, то нужно использовать compareTo.

Вот так вот, так что читаем JavaDoc.

Java and SFTP

Июль 14, 2009

jscapeНедавно встала задача организовать «забирание» файлов по SFTP. Витя организовал тунель на своей машине, так что с помощью MC уже можно было походить по директориям, присмотреться :).

Осталось только выбрать либу для Java. Мною были найдены:

  • SSHTools. Не подошла по лицензионным соображениям. GPL использовать нельзя.
  • jscape. Платная. Хотя по идее деньги на покупку найти можно.

И тут «вылезает из кустов» Витя и предлагает использовать ganymed-ssh2 библиотеку.

С помощью NetBeans Maven Repository Windov я быстро его нашел и добавил к необходимому проекту.

Как легко и непринужденно добавить парваметр в JSF url.

Декабрь 1, 2008

Всё до безобразия просто. Начнем с того, что я опишу задачу, которую мне пришлось решить.

Задача: отобразить список сущьностей с кнопочкой view, при нажатии на которой открывалась бы детальная информация о сущьности.

Зарание извиняюсь за ненормативную лексику, но, как мне кажется, без неё нет возможности показать всю гамму эмоций.

Кажется просто. А хуй там. Ни в одном примере нет нормального описания такого просто Use-Case. Единственно что мне предлагали, так это использовать сессионный бин. Но у этого способа есть свои недостатки. Например нет возможности создать репрезентативный урл, пойдя по которому, ты сразу получишь контент. ПРиходилось сначала идти на страницу с таблицей, а затем, выбрав необходимую сущьность, перходить на интересующую нас «детальку».

Вот тебе бля и «мега Технология» JSF. А хочеться всего ничего, просто написать entity.page?id=1234.

Итак. Задача разбивается на две задачи:

  1. Как обработать параметр на «детальке»
  2. Как установить этот параметр в урле.

Обработать параметр очень просто. Необходимо в faces-config у бина установить managed property примерно вот так (нет особого желания прасписывать что да как).

    <managed-bean>
        <managed-bean-name>customer</managed-bean-name>
        <managed-bean-class>com.ebon.pgw.web.beans.Customer</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
        <managed-property>
            <property-name>customerId</property-name>
            <value>#{param.id}</value>
        </managed-property>
    </managed-bean>

Скажу лишь одно, что param и обозначает параметр передаваемый в запросе.

Вторая задача оказалась по сложнее. Я лишь опишу, как я её решил, сам процесс решения я описывать не буду, дабы не засорять статью табуированной лексикой :).

Помогла мне в решении статья Vladimir Petrukhinа «JSF и ЧПУ (Человеко-понятный урл)«. Именно благодаря ней я узнал, как можно поменять возвращаемый урл. Так как я использовал MyFaces, то мой ViewHandler наследовался от JspViewHandlerImpl. Вот его код.

package test;
import java.util.Map;
import javax.faces.context.FacesContext;
import org.apache.myfaces.application.jsp.JspViewHandlerImpl;
public class GetParamViewHandler extends JspViewHandlerImpl {

    private static final Log log = LogFactory.getLog(GetParamViewHandler.class);

    @Override
    public String getActionURL(FacesContext facesContext, String viewId) {       
        String actionURL = super.getActionURL(facesContext, viewId);
        Map<String, Object> requestParameterMap = FacesContext.getCurrentInstance().getExternalContext().getRequestMap();
        String id = (String) requestParameterMap.get("id");
        if (id!=null) {
            actionURL += "?id=" + id;
            requestParameterMap.remove("id");
        }
        log.info("viewId[%s] actionUrl[%s]", viewId, actionURL);
        return actionURL;
    }
}

Соответсвенно его необходимо прописать в faces-config.xml

<application>
        <view-handler>test.GetParamViewHandler</view-handler>
</application>

Для того, чтобы установить соответсвующий id необходимо использовать f:param примерно так:

<h:commandLink value="view" action="customer" immediate="true">
    <f:setPropertyActionListener value="#{customer.value.merchantId}" target="#{customers.customerId}"/>
    <f:param name="id" value="#{customer.value.merchantId}"/>
</h:commandLink>

Вот наверное и всё. Если у кого есть вопросы и дельные замечания, welcome to comments :)

UPD: Оказалось, что не всё так просто. Во первых, код надо немного переписать (запосчу его позже), во вторых…. А вот про во-вротрых по подробнее.

Описанный выше метод прекрасно работает при простой навигации. А если мне необходимо отредактировать бин. Вот и пришел пиздец. Оказывается, что JSF пытается после нашего клика провести восстановление состояния view (LifeCycle Phase : Restore View), и именно в этот момент у происходит всё заново. А заново не получится, т.к. у нас уже нет в запросе параметра id. Как сделать так, чтобы состояние нормально восстанавливалось я не знаю. Увы :(.

Java. Как измерить время работы метода.

Ноябрь 14, 2007

На днях меня мой teamlead столкнул с этой задачей. Каково самое простое решение? Очень просто…. Берем исходный код и дописываем всё необходимое для измерения. Например, если был такой код


public class C {

public void m() throws Exception {
// do doSomething
}
}

и мы хотим померять производительность метода m(), то можем поменять его например так:


public class C {

public void m() throws Exception {
long timer = -System.currentTimeMillis();
// do doSomething
timer += System.currentTimeMillis();
System.out.println("C.m() " + timer);
}
}

Потом снимаих результаты с консоли и анализируем. Но вот беда, а если мне надо протестировать две версии проекта. Тогда мне придётся компилировать эти две версии с этими изменениями. Не гуд, скажу я вам. Очень муторно и неудобно. Мне то всего надо чуть чуть дописать, а ради этого перекомпиливать кучу всего.

У вот тут нам поможе ASM. Нет, не пугайтесь это не ассемблер, но очень близко. Это framework для анализа и изменения байт кода Java. Так вот с помощью этого «зверька» можно автоматически дописать в байт код всё что вам вздумаеться.

Давайте рассмотрим как с помощью ASM реализовать нашу идею. Всё очень просто.

  1. Качаем сам framework
  2. Качаем мануал по ASM с официального сайта. И, если вы хорошо знаете английский, читаете его и находите в нём ответ на данный вопрос.

Если вы хотите прочитать весь процесс реализации данного подхода к измерению времени работы метода на русском языке, то отпишите мне в коментах. Тогда я не поленюсь и распишу, что да как.

Strix. Нарезание картинок.

Сентябрь 29, 2007

Так как на собрании нашей компашки (состав пока являеться секретом) было решено, что сначало карта появиться в растровом виде, то пришлось поискать карту Гродно. Помог мне в этом блог s13.ru, а именно страница с картами. Была взята карта за 2003 год, так как там были подписаны дома. (more…)