суббота, 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(){...}
}

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

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

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

понедельник, 15 февраля 2010 г.

HelpMe

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

воскресенье, 14 февраля 2010 г.

Comparable & Comparator

Сегодня мы поговорим о сравнениях. Они нужны в первую очередь, для сортировки.
Например в доменной модели есть User (POJO))

public class User {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}

И мы на сайте выводим их в алфавитном порядке.
Как же их отсортировать-то?
Можно создать массив, поместить туда пользователей и написав сортировку пузырьком отсортировать их.
Что же делать, если писать сортировку нет охоты? Можно воспользоваться стандартными средствами.
class UserService{
static List users;
static List getUsers(){
return users;
}
}

class SomeController{
void foo(){
Collections.sort(UserService.getUsers());
}
}

Но как же компьютер отсортирует пользователей, как он узнает критерии сравнения? Надо ему о них рассказать.
Для этого изменим класс User
public class User implements Comparable<User>{
private String name;
private int age;
//...
@Override
public int compareTo(User o) {
return name.compareTo(o.name);
}
}

compareTo() возвращает отрицательное число если текущий объект должен идти раньше, чем тот с чем сравнивают.

Все хорошо проект сделан. Но вот не задача, пришел заказчик и хочет, дабы мы еще сделали сортировку по возрасту. А не послать ли нам его? – хорошая идея, но, скорее всего, придется таки делать.
Для этого есть механизм “сравнителей”.
Например,
class CompareByAge implements Comparator<User>{
@Override
public int compare(User u1, User u2) {
return u1.getAge() - u2.getAge();
}
}

Сортировка с его использованием будет выглядеть как
 void bar(){
Collections.sort(UserService.getUsers(), new CompareByAge());
}

Преимущество такого подхода в том, что может существовать сколь угодно компараторов.
Отметим, даты, строки и многих другие класс реализуют интерфейс Comparable, поэтому мы можем сортировать их без дополнительных сложностей.

Пробуйте!

(Статья подготовлена совместно compiler & Link)

TreeSet

На лекции у меня не получилось продемонстрировать возможности TreeSet и я сказал что он особо не используется, по вчера у меня возникла ситуация когда логично объекты нужно хранить в отсортированном порядке, первой мыслю было использовать List и сортировать его, но на каком этапе это делать? На помощь мне пришел TreeSet.

Итак, как же им пользоваться?
Напишем элементарный пример

public class MyClass implements Comparable {
    String str;
    public MyClass(String str) {
        this.str = str;
    }
    @Override
    public int compareTo(MyClass o) {
        return str.compareTo(o.str);
    }
    public static void main(String[] args) {
        Set ss = new TreeSet();
        ss.add(new MyClass("a"));
        ss.add(new MyClass("e"));
        ss.add(new MyClass("g"));
        ss.add(new MyClass("b"));
        ss.add(new MyClass("c"));
        for(MyClass s : ss){
            System.out.println(s.str);
        }
    }
}

Теперь объясню все это.

TreeSet работает вполне логично, туда добавляются классы и она их хранит в отсортированном порядке, нюанс тут в том, что для нужного нам порядка сортировки нежно реализовать интерфейс Comparable, или передать в конструктор класс, реализующий интерфейс Comparator, о них я напишу сегодня позже.

RegExp

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

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

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

Рассмотрим базовый синтаксис
x — символ x
\0n — символ с восьмеричным кодом n
\xh — символ с шестнадцатеричным кодом n
. — любая буква
[abc] — любая из букв abc
[a-z] — любая из букв от a до z (все маленькие буквы латиницы)
[^abc] — все символы кроме abc
^ — начало текста
$ — конец текста
\ — экранирующий символ (например знак точки будет "\.")
() — группировка символов (в дальнейшем рассмотрим еще одно очень хорошее их свойство)

\t — табуляция
\n — знак переноса строки
\r — знак возврата
\b — граница слова
\d — цифры
\D — не цифры
\s — пустое пространство (пробел, табуляция, etc)
\S — не пустое пространство
\w — символ слова ([a—zA—Z_0—9])
\W — не символ слова

Квантификаторы:
X? — X, 0 или 1
X* — X, 0 и больше раз
X+ — X, 1 и больше раз
X{n} — X, n раз
X{n,} — X, n и больше раз
X{n,m} — X, от n до m раз

| — логическое или

Я привел не все, и так я думаю у вас возникла мысль "куда я попал".

Рассмотрим элементарный пример: нам нужно проверить правильность введенного e—mail адреса, какие у нас требования:
— начинается с буквы
— может содержать цифры, буквы, знаки —_. в любом количестве
— дальше должна идти @
— домен может содержать буквы и цифры
— потом . и 2 или 3 буквы домена 1—го уровня

распишем выражение по частям
[a-z] — начинается с буквы
[a-z0-9\-_.]* — может содержать цифры, буквы, знаки —_.
@ — дальше должна идти @
[a-z0-9] — домен может содержать буквы и цифры
\.[a-z]{2,3} — потом . и 2 или 3 буквы домена 1—го уровня

Что в итоге получилось:
[a-z][a-z0-9\-_.]*@[a-z0-9]\.[a-z]{2,3}
Вот такая страшная штука, но не бойтесь, при реальном использовании все намного страшнее.

Нужно заметить что перед проверкой нужно привести строку к нижнему регистру.

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

Короткие слова и комбинации клавиш в eclipse

Полезные из коротких слов: syso, main.
А комбинации можно посмотреть ctrl+shift+l или в настройках.
Самые полезные из них:
с+s+o(организовать импорт)
с+space(дополнить слово, очень мощная штука, пользуюсь почти в каждой строчке)
s+a+s(создать метод, лучше самому посмотреть)
с+s+t(перейти к классу)
Ну и стандортные(сtrl+s итд).

Еще вспомню - допишу.

Да, точно, вот мне напомнили:
полезная комбинация с+/ комментит строки(java), в IDEA можно было комментировать так любой код, но в eclipse такого увы нет.

Еще полезно: ctrl+d удаляет строку.

POJO aka Bean

Товарищ Фаулер (очень крутой дядька, который пишет очень дорогие книги по проектированию) придумал интересное слово, которое мы с вами сегодня выучим - POJO.
Это своего рода стереотип для классов (привет Мещерякову!) который говорит нам, что этот класс ничего не делает, и имеет только состояние.
Например,
class Foo {
Bar bar;
Bar getBar(){return bar;}
void setBar(Bar bar){this.bar = bar;}
}
это POJO, а
class Bar {
int calculateUniverse(return 42;)
}
- нет.
еще некоторые дяденьки называют поджи бинами (bean).

Итак, теперь все знают слово POJO - Plain Old Java Object («старый добрый простой Java-объект»)

Оформление кода. Порядок описания

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

А теперь о баранах. Возник вопрос по структурированию кода в классе: что сначала писать методы или поля?
Поясню вопрос на примере:
class A {
Foo foo;
void bar(){}
}

vs.
class A {
void bar(){}
Foo foo;
}

Мы в примерах использовали первый вариант, а вот Хорстман, которого мы рекомендовали, делает все другим способом – как же быть?
Рассмотрим аргументы враждующих лилипутов.
Когда пишется код, сначала, как правило, объявляются поля дабы, потом можно было с ними работать – не возвращаться же потом дописывать?
С другой стороны, поля, как правило, не должны интересовать пользователя, который заглянул в Ваш исходный код, его должны интересовать варианты использования (public methods), а он видит вовсе другое.
В стандартной библиотеки Java используется первый подход, Хорстман, видимо, насмотрелся кода на С++ и теперь толкает некоторые “странные” подходы (справедливости ради замечу, что некоторые вещи по структурированию в С++ сделаны добротней).
В любом случае, важно, чтобы проект/модуль/библиотека были написаны в одном стиле и как начальник скажет, так и будет)

UPD
А еще не понятно, что Хорстман будет делать с POJO.

Форматирование чисел

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

Пример:

double pi = Math.PI;
NumberFormat format = NumberFormat.getNumberInstance();
format.setMaximumFractionDigits(4);
NumberFormatter formatter = new NumberFormatter(format);
try {
 System.out.println(formatter.valueToString(pi));
} catch (ParseException e) {
 e.printStackTrace();
}

Данная программа выведет 3,1416, то есть округлит число.

NumberFormat.getNumberInstance() - форматирование чисел
NumberFormat.getCurrencyInstance() - форматирование денег
NumberFormat.getPercentInstance() - форматирование как проценты(1 = 100%)

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

Активность

На сайт повешен счетчик. Теперь я смогу наблюдать читателей и узнаю насколько полезен это ресурс. Но, поговорить я хотел не об этом (дальше возможен мат).

Коллеги, где активность? Нет, где активность? Где вопросы? Где готовые программки? Неинтересно - так и скажите: "Стас, спасибо что уделил внимание, но у меня нет времени сейчас учится" или "я тебе раньше не хотел говорить, но ты мудак" или "C#/PHP/1C - наше все".
Поймите, это не обычная дисциплина. От одного посещения лекций результата не будет. Никакого. Зачем тратить время?
Это не веб-дизайн - где можно класть, и не Моделирование систем - где могут отчислить. Тут самомотивация нужна. Без нее - клиника. *тут могли быть нравопоученья о жизни*

Радует что есть, по крайней мере, один человек который учится. И ему - отдельное спасибо, значит это все не зря.

А так, думайте сами, решайте сами.

P.S.
Хм. И почти без мата.

UPD
Тут говорят, что вопросов может не быть потому-что "все понятно". Посмотрим.

Абстрактная фабрика

Если я подойду к стойке бара и попрошу мне налить, то, в зависимости от заведения, мне могут налить совсем разные вещи хотя запрос был-то одинаков и я был тот-же.
К чему это я? Продолжаем нашу сагу о том, как не изобретать велосипед.
Бары это все хорошо, но далеко. Пусть есть классы кнопочек для графического интерфейса. Для каждой ОС они свои но я хочу получать кнопочку под текущую ОС и не напрягать себя лишними проверками. Что я делаю - создаю отдельный класс, который будет мне выдавать нужную мне кнопочку. Так.. пожалуй достаточно, надо ближе к коду.

Абстрактная кухня
public interface AbstractCook {
Dish getDish();
Drink getDrink();
}


Мексиканская кухня
public class MexicoCook imlements AbstractCook {
@Override
public Dish getDish(){
return new Burrito();
}
@Override
public Drink getDrink(){{
return new Tequila();
}
}


А вот немецкая
public class GermanCook imlements AbstractCook {
@Override
public Dish getDish(){
return new Meat();
}
@Override
public Drink getDrink(){{
return new Bear();
}
}


разница, думаю, заметна)

а теперь об использовании счастья

class User {
eatSomething(AbstractCook cook){
cook.getDish();
}
}



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

Переходим на новый уровень абстракции вместе!

Одиночка или синглетон

Как я и обещал, мы будем публиковать повести о разных шаблонных решениях.
Во многих языках программирования существует механизм глобальных переменных, помимо области размещения в памяти, они обладают свойством всеобщей доступности – в Java таких переменных нет. Зачем это может понадобиться нам, крутым проектировщикам, ведь глобальные переменные – зло? – А я хочу параметры настройки один раз читать из файла и потом их отовсюду использовать.

Следующая ситуация – иногда хочется иметь гарантию того, что будет создан только один экземпляр класса. Например, я кеширую данные или управляю соединением с БД.
Как решить эти проблемы – на помощь приходит шаблонное решение, который мы и обсудим.

Singleton – класс не имеющий доступного конструктора и создающийся путем вызова статического метода.
Реализация приписываемая Майерсу:

class God {
private static God ourInstance;
private God(){}
public static God getInstance(){
if(ourInstance == null){
ourInstance = new God();
}
return ourInstance;
}
}

Для сокращения количества строк (на 3 штуки – 30%!) и просветления можно использовать строку

return ourInstance == null ? ourInstance = new God() : ourInstance;

"Создавать" объект теперь надо так:
God foo = God.getInstance();

Стоит отметить что злоупотреблять таким решением не стоит, но учить надо.

Совсем забыл - существует альтернативное, простое, но менее гибкое решение. Жду предложения)

Design patterns

При создании ПО часто возникают аналогичные задачи. Это происходит на всех уровнях - от организации сортировки, работе с БД и т.д. . Для упрощения жизни создаются библиотеки утилиты и другие вкусности. На уровне проектирования для этого существуют - шаблонные решения (design patterns). Их довольно много и структурируются они относительно решаемых задач (создание объектов, поведение, работа с потоками и другие). Для того, что бы не изобретать постоянно велосипед, мы будем рассматривать основные из них - те, без знания которых страшно ложится спать.

Первые на очереди синглетон и фабрика.

Поехали.

Разделяй и властвуй

Полезные функции:
У String есть метод split(), который принимает разделитель(регулярное выражение, которым я планирую посветить целую лекцию). Эта функция делит строку по этому разделителю и возвращает массив строк, может не очень понятно, объясню на примере

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

Пример:
"суп каша, борщ,макароны картошка".split("[ ,]+")
вернет массив названий всех блюд, удобно, не правда ли?

P.S. Возможно я кого-то напугал регулярными выражениями, разделять можно по обычной строке, например "суп каша борщ макароны картошка".split(" ");

Создание меню

Продолжаем проталкивать решение ДЗ. Вот набросок для меню. В нем мы обернули стандартную коллекцию своим решением, теперь мы можем оборачивать ее в Синглетон или Фабрику.

package com.blogspot.jcourses;

import java.util.*;

public class Menu {
private Map dishes;
public Menu(){
dishes = new HashMap();
init();
}

public Dish getDish(String name){
return dishes.get(name);
}

private void init(){
dishes.put("potato", new Dish());
dishes.put("meat", new Dish());
}
}

Развиваем набросок. Активней!

Cook as thread

Продолжают поступать вопросы и это приятно)

Как и ожидалось, у коллег возникли проблемы с потоками. В качестве помощи опубликую набросок одной из возможных реализаций повара.


package com.blogspot.jcourses;

import java.util.*;

public class Cook implements Runnable {
private boolean isWork;
private LinkedList dishes;
public Cook(){
dishes = (LinkedList) Collections.synchronizedCollection(
new LinkedList()
);
}
@Override
public void run() {
isWork = true;
while(isWork){
//TODO а есть ли блюда?)
prepareDish(dishes.getFirst());
}
}

public void addDish(String dishName){
Dish dish = new Dish(); // TODO here must be something another)
dishes.addLast(dish);
}
public void stopWork(){
isWork = false;
}
private void prepareDish(Dish first) {
//TODO write here something
}
}


Несколько слов о реализации. Есть один повар, который содержит блюда и статус характерезующий, а не халявит ли повар.
В конструкторе присутствует очень хитромудрая конструкция. Она нужна для того, что бы гарантировать что одновременно никто не получит доступ к коллекции иначе могут возникнуть осложнения. Повар готовить блюда из этого списка по очереди до тех пор, пока не вызовут метод stopWork().
Официант может вызывать метод addDish() и добавлять блюда в очередь.
Обратите внимания на комментарии - ими помечены участки кода, куда явно надо чего-нибудь дописать + надо добавить шаблоны для коллекции, так-что я не коим образом не отнимаю дз)

Готов быть разорванным вопросами.

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

Eclipse, как завоевать его доверие

Eclipse хотя штука мощная и бесплатная, но столь же капризная, вопросы связанные с созданием проектов, их запускам, подключением библиотек и исходников, можно задавать сюда, по возможности буду отвечать.

Чтение c консоли

В связи с многочисленными вопросами решил написать сей пост дабы отбросить последние(надеюсь мне это удастся).

Для чтения с консоли существует стандартный класс java.util.Scanner, который принимает в качестве параметра поток ввода (потоки отдельная тема, которая пока не предусмотрена в нашем курсе, по желанию любой может изучить ее самостоятельно, тема не сложная и на практике почти не применяется). Поток ввода с консоли можно получить с помощью процедуры System.in.

У класса Scanner есть много методов для чтения данных с консоли, они начинаются с слова "next". пример: nextString(), nextInt(), nextDouble(), которые возвращают соответствующие типы.

Рассморим пример программы, которая считает целые числа, введенные с консоли, пока не будет набрано "calc":
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); 
/* Создаем объект Scanner */
Integer sum = 0; 
System.out.println("Input integer");
while(true) {
String str = scanner.nextLine(); 
/* Считываем стороку */
if(str.equals("calc")) { 
/* Проверяем на совпадение со строкой "calc" */
System.out.println("Sum = " + sum);
System.exit(0); 
/* Завершаем программу с кодом 0 (успешно) */
}
try {
sum += Integer.parseInt(str); 
/* Преобразовываем строку в число и суммируем */
} catch (NumberFormatException e) {
System.out.println("Wrong format");
}
}
}

Если что не понятно, пишите вопросы.

UPD: В комментариях есть еще один вариант решения (compiler)

Первые сутки

Слайд 5
Итак, прошел первый день после лекции. Что мы имеем. Слушатели разделились на три группы. Кто ничего не сделал, кто установил eclipse, а кто уже вовсю пробует что-то писать и задает вопросы. Третья группа существует и это очень приятно. Очень бы хотелось, дабы и другие группы подтягивались, вы сможете, - надо лишь начать писать программы)

public class Runner {
public static void main(String[] args) {
System.out.println("Hello world");
}
}

Начни с простого – достигни вершин.

Литература по первой лекции

Возможно не все запомнили литературу по первой лекции, потому позволю себе повториться:
Кей С. Хорстманн, Г. Корнелл - Java2.Том I.Основы(~75м)
Кей С. Хорстманн, Г. Корнелл - Java2.Том II.Тонкости программирования(~25м)
Это издание 2002-го года, у кого есть новее или лучшего качества - делитесь.

Первое дз

Важно не только слушать материал, но и пробовать писать. Именно это главная задача ДЗ. Во время написания возникают вопросы - их можно задавать и в комментариях к этому топику.

Первая лекция

Прошла первая лекция. Хм.. Мы смогли выступить и нас не закидали помидорами. 3,5 часа это вам не...(надо меньше читать Тему). Больше о впечатлениях можно будет прочитать позже, а написать отзыв можно уже сейчас).
А еще можно скачать замечательные презентации.
Первая (ООП)

О нас

Хм.. Забыл сказать кто такие "мы с Сашей". (Может это первые симптомы звездной болезни? - надо что-то делать).
Я - Станислав Курилин, студент ХНУРЭ
Саша - Александр Ленькевич, оттуда-же.

И, немного, о глобальных целях. Сейчас они выглядят так:
1) Do something
2) Do something else
3) Do something once more
4) Do something so much you need
5) ???????
6) PROFIT

Завтра будет лучше.

Java overview

Мы с Сашей решили провести курс лекций по Java. Что подтолкнуло нас к этому - много факторов)
После длительных мучений появился план
1) Java Core
–Base
–OOP
–Collections
–Threads
–JUnit
2) Java Advance
–Reflection
–XML
–Web
–DB
3) Hibernate
–ORM–
4) Spring
–IOC
–MVC
–Security

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

Слайд 3
1.

Первосообщение

System.out.println("Hi!");