Архив рубрики ‘Technology’

Uninstalling DB2

Ноябрь 25, 2009
по мотивам «Installing IBM DB2 for Linux, UNIX, and Windows transparently with your application«.

Uninstalling DB2 on Linux and UNIX

On Linux and UNIX, you need to perform the following steps, in this order:

  1. Drop all databases by entering the following command:
    DROP DATABASE database_alias.
  2. Stop the DB2 Administration Server by logging in as the DB2 administration server owner and issuing the db2admin stop command.
  3. Stop all DB2 instances by repeating the following steps for each instance you created:
    1. Log in as the instance owner.
    2. Severe all database connections by entering the FORCE APPLICATION ALL command.
    3. Stop the DB2 database manager by entering the db2stop command.
  4. Remove the Administration Server:
    1. Log in as root.
    2. Issue the command:
      /opt/ibm/db2/V9.5/instance/dasdrop.
  5. Remove DB2 instances by repeating the following steps for each instance you created:
    1. Log in as root.
    2. Issue the /opt/ibm/db2/V9.5/instance/db2idrop InstanceName command.
    3. Remove the instance owner’s user ID and group if you created them during installation and if they are used only by your program.
  6. Remove DB2. You must have root authority for uninstalling.
    • Use the db2_deinstall command in the root directory of the DB2 DVD or image.

Что я могу сказать. Столько дейтсвий я еще никогда не делал, чтобы сненсти что-нибудь в Linux :).

Кстати, это я уже второй раз сношу :) В первый раз я сделал всё по простому — просто снёс директорию с DB2 к чёртовой матери и всё. Но после этого при следующей установке DB2 немного корёжило. Он всё думал, что у меня есть еще одна версия :). Теперь же всё было сделано по феншую.

Microsoft Access Database using Linux and PHP

Ноябрь 24, 2009
По мотивам «Microsoft Access Database using Linux and PHP«

Я веду в ХТТ практические занятия по курсу «Базы данных и СУБД».  Название курса само по себе довольно странное, но речь сегодня не об этом. Так как я «второй» преподаватель и отвечаю только за практические занятия со вторыми группами, то мне нет необхожимости парится про содержание практических работ, это забота «первого» преподавателя. Но проверять их то мне, а это ой как неприятно. Надо:

  • носится от одного ко второму
  • быстро соображать, что же за задание и как его быстро проверить
  • указывать на ошибки в случае их обнаружения
  • проверять тщательно, чтобы не сдавали хартуру
  • слушать нытьё «А вот вчера у меня работало, а тут чего не хочет».

Короче, проблем хватает.

И тут я вспомнил про практику использования автоматических систем. Серега Курило в своё время написал систему для тестирования решений задач, написанных на Pascal, С, С++ и т.д. Признаюсь честно, я так и не смог её развернуть.

Но тут то у меня задача другая, мне надо проверить, как умеют детишки писать SQL запросы на выборку данных (пусть хотя бы это умеют, оставим DDL в покое). Так как это техникум и дети не особо сильны, то единственной понятной для них средой можно считать Acess. Переносимость файлов acess, обусловленная установленным практическ на всех компьютерах пакетом Microsoft Office, позволяет закрыть на все остальные недостатки.

Решил я сделать систему, которая ставит тебе вопрос и предлагает написать SQL запрос, который отобразит нужные данные. Алгоритм проверки простой, если выбока, получившаяся в результате выполнения ученического SQL запроса, совпадают с выборкой от эталонного запроса совпадают, то можно считать запрос верным. Пока хватит и такой проверки. Если же не совпала, то отображаются результаты как первого, так и эталонного запросов, чтобы ученик смог понять, что от него хотят и что он в итоге то сделал.

Где разместить такую систему. Крнечно же на своём ноуте. Пришёл, врубил в сеть, дал детям линк… пусть «играются». Но у меня на ноуте не Windows :). Поэтому пришлось немного повозится, чтобы появилась возможность работать с Access файлами.

Я действовал практически так же, как и описано в статье. Но есть некоторые различия:

  1. Я устанавливал с репозитария Debian (а не скачиавал с сайтов) следующие пакеты
    • unixodbc
    • unixodbc-bin
    • libmdbodbc
    • php5-odbc
  2. Не использовал odbcinst -i -d -f. Вместо этого собственоручно модифицировал файлы. Сначала я попытался ODBCConfig. Но при первой же попытке создания он отругал меня, что я не root, и что он не может модифицировать файлы. Запустив его с правами root, наблюдал, как он падал при попытке создания записи ODBC драйвера или записи DNS.
  3. Создавал для файла System DNS, т.к. apache запускается из под root (не уверен точно).

Осталось только написать саму систему :) А что, конннектиться к MS Access базе уже умею.

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 я быстро его нашел и добавил к необходимому проекту.

Перетаскиваемое расписание

Апрель 15, 2009

Так как у детей в ХТТ достаточно мало времени на самостоятельное освоение и написание диплома, то придётся им помогать.

Марина делает систему для поддержки деятельности учебной части. Проще говоря, удобный интерфейс для работы с расписанием. Делаться всё это будет на PHP и MySQL. Это мой тактических ход. Тема сама по себе очень хороша. Ведь доступ к расписанию можно дать многим и у каждого будут свои привилегии. Для того, чтобы потом в будущем можно было развивать  систему в этом направлении я решил, что лучше использовать легкий клиент в виде браузера, а PHP обладает очень низким порогом вхождения. На сервере пусть крутиться MySQL. Не понравиться — тогда поставлю «слоника» (PostgreSQL).

Как всегда, расписание отображается в виде сетки. Вверху будет время, а слева любое другое измерение (преподаватели, аудитории, гпуппа).

Схема расписания занятий

Схема расписания занятий

Для того, чтобы это всё было «юзабельным» лучше всего реализовать возможность перетаскивания занятий по сетке. Причём сетка должна быть «заморожена», т.е. при прокручивании расписания верх и левая сторона не изчезают из поля зрения.

Для реализации перетаскиявания подойдет jQuery, а именно draggable и droppable. Лучше конечно про все эти «плюшки» почитать на официальном сайте. Но, как показала практика быстрое вливание на русском будет в моём случае более продуктивнее. В итоге у меня просто таскаемый прямоугольник :)

Для начала то что надо.

Google AJAX api. Коротко.

Апрель 15, 2009

Google предоставляет довольно обширный список API. Из всего этого многообразия я сегодня решил посмотреть Google AJAX API. Очень сильно порадовало Interactive Code Playground.

jQuery magic

Февраль 19, 2009

logo_jquery_215x53Что такое jQuery скорее всего уже все знают (а если не знают, то бегом читать…). Но некоторые методы данного JS фреймворка для меня казались бесполезными (какой я был наивный :))

Рассмотрим мой конкретный пример. У меня в ячейке таблицы находится линк. При нажатии на этот линк мне необходимо получить ссылку на строку, в которой находиться данный линк.

Я поначалу воспользовался методом

.parents("tr")

Но меня ждал сюрприз. (Дети, внимательно читайте документацию !!!). Оказывается данный метод вернет всех родителей в дереве, которые являются строками таблицы. Т.е. если наша таблица вложена в еще одну таблицу (а такой вариант на 100% вам попадётся) то вы получите и родительскую строку, и прородительскую. А мне такого не надо.

На помощь приходит базовый фильтр eq. Написав

.parents("tr:eq(0)")

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

И напоследок, есть возможность устновить себе на комптютер offline версию хелпа по jQuery, которая выполнена в виде AIR приложения.

Как легко и непринужденно добавить парваметр в 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. Как сделать так, чтобы состояние нормально восстанавливалось я не знаю. Увы :(.

Flash. Как сделать сложный Tween?

Декабрь 10, 2007

Как создавать простой Tween я узнал из livedocs

В этой документации имеется пример, который изменяет только одно свойство.


import fl.transitions.Tween;
import fl.transitions.easing.*;
var myTween:Tween = new Tween(myObject, "x", Elastic.easeOut, 0, 300, 3, true);

А как можно одновременно изменять два свойства?

С этим вопрос я обратился на форум flasher.ru. И как оказываеться, есть специальный класс TweenLite. Про него можно почитать на http://blog.greensock.com/

Всё очень грамотно офрмлено, а в комлекте есть генериловка кода под этого класса. Честное слово, очень порадовало.

За подсказку спасибо fljot.

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 с официального сайта. И, если вы хорошо знаете английский, читаете его и находите в нём ответ на данный вопрос.

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