суббота, 20 февраля 2010 г.

false vs complexity

Продолжая смотреть стенфордские лекции заметил еще одну особенность. Хотелось бы ее обсудить. Касается она вопросов от студентов. Обратная связь это хорошо, она позволяет контролировать темп занятия, корректировать материал и т.д.. Но, что делать с неудобными вопросами? Что делать если студент спрашивает о том, что вы собирались рассказать через пять занятий и сейчас они этот материал явно не поймут? Можно начать говорить что-то не внятное(А) или соврать студенту(Б). Альтернатива - не отвечать на вопросы(М).
Препод из стенфорда выбрал стратегию Б, так как его рейтинг в глазах студента прежде всего.
Но где же больше пользы - вот в чем вопрос.

Можно говорить о не правильно построенной программе, но, как мне кажется, проблемы не избежать.

А как бы ты хотел что-бы поступали с тобой?

пятница, 19 февраля 2010 г.

Web deployment

Сегодня мы поговорим о создании web проекта по шагам:

0) Настраиваем среду сервера для этого идем windows->properties->server->runtime environment, удаляем все и создаем новый конфиг.
cервера – томкат 6
путь – ..\apache-tomcat-6.0.20 (для моей сборки)
jre – встроенная java машина (нижний выриант)

1) Создадим новый динамический web проект (ctrl+N->Web->Dynamic web Project). Пропишем ему имя и выберем наш конфиг сервера, наживаем финиш.

2) Создался новый проект с кучей папок, но из них важны только 2 –src и WebContent
src - здесь хранятся java классы (domain, dao, utils, сервлеты, etc)
WebContent - здесь хранятся jsp, конфиги, библиотеки

3) Создадим auth.jsp в папке WebContent/jsp (обычно так не делают, но я это сделаю в целях обучения)

Содержимое auth.jsp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><title>JSP Example</title></head><body><div>
<%
if("POST".equals(request.getMethod())){
<%-- проверяем тип запроса --%>
if("root".equals(request.getParameter("name")) &
"god".equals(request.getParameter("password"))){
<%-- проверяем данные формы, присланные в запросе --%>

%>
<h3>Access granted</h3>
<%
} else {
%>
<h3>Access denied</h3>
<%
}
} else if("GET".equals(request.getMethod())){
<%-- если запрос GET - отправляем форму--%>

%>

<h3>Login page</h3>
<form method="post">
<%-- !установка типа поста формы --%>
<div>
<input type="text" name="name" value="Input name"
onfocus="this.value='';"/><br/>
<input type="password" name="password"/><br/>
<input type="submit"/>
</div>
</form>
<%
}
%>
</div></body></html>

Эта jsp осуществляем самую примитивную аутентификацию пользователя.

4) теперь нажимаем запустить сервер (зеленая стрелочка)

5) Страница доступна по адресу http://localhost:8080/[project_name]/jsp/auth.jsp

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

Кстати интересный вопрос, почему я пишу "root".equals(request.getParameter("name")) вместо request.getParameter("name").equals("root") ???

четверг, 18 февраля 2010 г.

DAO

Итак, работа с БД.
Попробую на примере одного из сервисов взятого с одного так и не дописанного проекта.
Работа с БД была организована через класс возвращающего ДАО, для конкретного типа - DataAccessManager (мультитон). В метод передается SELECT - запрос. На выходе объект класса Статья. В таблице со статьей лежит айДи автора, поэтому он достается отдельно и добавляется в объект. После всех манипуляций ресурсы высвобождаются.

private List
getArticlesFromDB (String artQuery) {
List
res = new LinkedList
();

Connection cn = null;
Statement st = null;
ResultSet rs = null;
try {
cn = DBUtils.getConnection ();
st = cn.createStatement ();
rs = st.executeQuery (artQuery);
while (rs.next ()) {
User author = DataAccessManager.getUserMapper ()
.getUser (rs.getInt ("author_id"));
Article article = new Article (
rs.getString ("title"),
rs.getString ("nested_text"),
author);
article.setId (rs.getInt ("id"));
}
return res;
} catch (SQLException e) {
e.printStackTrace ();
return null;
} finally {
DBUtils.cleanResources (rs, st, cn);
}
}


Страшно? Ты же еще не пробовал!

Педагогическая заметка

Сегодня сходил послушать препода с соседней кафедры, которого его студенты очень хвалили. Сравнил его лекцию со своей (старался объективно). +Разумеется, учитывал других лекторов. Пришел к некоторым выводам.

Утрируя, я разделил всех лекторов на три группы.
Первая(А) начитывает мало материала так что-бы по материалу не возникало никаких вопросов - всем студентам после лекции материал должен быть понятен. Например, сегодняшний лектор посвятил почти все лекцию getXXX и setXXX методам.
Вторая(Б) - рассматривает тему поверхностно и быстро. В конце лекции - никто тему полностью не знает. Например, наша последняя лекция по Java, где было затронуто громадное количество материала.
Третья - мудаки, мы их обсуждать в статье не будем.

О чем думают люди уходящие с лекции типа А.
Мы узнали что-то новое. Это круто.


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

У нас в вузе доминирует "третья группа". Смотря западные лекции, я вижу, что там доминируют А-лекции. Оно и не мудрено, студенты выставляют оценки лекторам, и преподам очень важно понравится своим студентам (больше, чем научить их чему-нибудь).


Но где же больше пользы - вот в чем вопрос.

Вторая лекция 2

Вторая лекция прошла.
Да, на ней было много материала. Да, много материала было рассмотрено вскользь. Но что поделаешь - это не полноценный курс современного состояния информационных технологий читаемый слушателям с одинаковым уровнем подготовки.
Хотя бы по временным рамкам. Да и уровень разный - кто-то уже пробует потоки, кто-то пишет сайтики, а другой не слышал о css.
Несмотря не на что, считаю что удалось достигнуть многого.
Слушатели получили представления о том, куда можно двигаться в плане саморазвития - кому надо, тот выучит дальше, а кому нет - пополнил словарный запас новыми терминами.

Начни - и полдела сделано. (Авсоний)

Вторая лекция

Вот и прошла вторая лекция. Надо что-то написать по этому поводу.

Что-то.

Multiton

Хотел написать о БД, но перед обсуждением некоторых решений полезно знать что-такое мультитон. Это не столь распространенный шаблон, но я его буду использовать - поэтому, коротко о нем.

Синглетон - это хорошо. Нет, правда, иногда, это очень хорошо. Пойдем дальше.
Иногда, хочется их упорядочить. Одним из вариантов, это создание класса, который будет уметь раздавать синглетоны (причем, ответственность за то, что они будут существовать в единственном экземпляре, мы тоже возложем на него).


class A {
A()
}
class MyMultitone {
//probably, it's can be singletone
//...
A a;
static A getA(){
if(a == null){
a = new A();
}
return a;
}
static B getB(){...}
}

где такое может понадобится? - уже скоро, будьте с нами, не переключайтесь!

Справедливости ради стоит заметить, что так-как мультитон не устоявшийся шаблон взгляды на него несколько разнятся: (еще одна статья о нем)

Помните, что злоупотребление синглтонами опасно для архитектуры приложения.