Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

JavaOpen и JavaDay в Самаре

Anna | 5.06.2014 | нет комментариев

Незадолго в Самаре прошли два увлекательных мероприятия: JavaOpen и JavaDay.

Первое представляло собой турнир по программированию с денежными призами. Второе — конференцию, на которой были озвучены победители турнира.

Конференция

К сожалению, удалось посетить только конференцию. Зал на 150 человек был заполнен наполовину, это при учете того, что мероприятие вывалилось на рабочий день. Доклады были чудесные. Исключительно порадовала демонстрация Java FX и Java ME Embedded на Raspberry Pi. И, безусловно же, робот с Java ME Embedded на борту.

Материалы конференции доступны по ссылке.

Хочется подметить, что это 1-й JavaDay в Самаре. На здешнем телеканале даже показали соответствующий сюжет. Увлекателен тот факт, что Microsoft TechDays проходят теснее довольно давным-давно, но теснее не с тем размахом. Будем верить, что ИТ-мероприятия такого формата будут регулярным явлением. А Java-движение будет набирать циклы.

Ну и напоследок самое аппетитное — задания турнира, вежливо предоставленные их создателем — Павлом Васиным. Тексты заданий оставил без изменений. Ниже есть результаты.

Турнир

Задача турнира была выявить не легко кандидатов со умениями математики и навыками в спортивном программировании, а людей, которые ближе к производству. Следственно первое задание было академическим: на умение языка Java, умение отличных и исключительно дрянных практик при индустриальной реализации задач, поддержке, объектно-ориентированном программировании и дизайне классов. Второе задание — фактическое, на итог, трудоемкое и без любого академизма. Как сделаешь, так и отлично. Для него была разработана система подсказок. Здесь задача была в том, Дабы люди сами себе поставили задачу и предпочли инструменты ее решения. При этом верно оценили и распределили свое время, если не могут совладать либо не поспевают, то брали бы подсказки.

Задание 1

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

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

Проблемный код

01  public class EmployeeList extends LinkedList implements List {
02    //Часовые ставки зарплат
03    public static final Float _baseHourSalary = new Float("36.60");
04    public static final Float _high_hour_salary = _maxHourSalary / 4;
05    public static final int _maxHourSalary = _high_hour_salary > 50 ? 110 : 55;
06    public Log log = LogFactory.getLog();
07    private float[] koefs;
08  
09    public EmployeeList() {
10      LoadKoefficients();
11    }
12  
13    @Override
14    public boolean add(Object o) {
15      for (Object obj : this) {
16        if (!(obj instanceof Employee)) continue;
17        if (o.equals(obj)) return false; //Тот же работник, невозможно добавить два раза
18        if (((Employee)o).getFio() == "Иванов Афанасий Петрович" 
19                || ((Employee)o).getFio() == "Михайлова Иннеса Петровна") {
20          //Исправление бага 3244, эти люди теснее давным-давно не работают
21          return false;
22        }
23      }
24      return add(o);
25    }
26  
27    public void LoadKoefficients() {
28      float[] arr1 = KoefStorage.getKoefArray("ifns_2003_god");
29      log.debug("Показатели ИФНС загружены "   arr1.toString());
30      float[] arr2 = KoefStorage.getKoefArray("ufns_2003_god");
31      koefs = new Float[2000];
32      for (int i = 0; i < arr1.length; i  ) koefs[i] = arr1[i];
33      for (int i = 0; i < arr2.length; i  ) koefs[i   arr1.length] = arr2[i];
34      recalculateKoeffs(); //Пересчет показателей на нынешний месяц
35    }
36  
37    public void recalculateKoeffs() {
38      for (int i = 0; i < koefs.length; i  ) 
39koefs[i] = koefs[i] < 0.88 ? koefs[i] / 4 : koefs[i] / 6;
40    }
41  
42    public ArrayList getSalaries(LinkedList<Employee> employee) {
43      ArrayList result = new ArrayList(5);
44      for (int i = 0; i < employee.size(); i  ) {
45        Employee e = employee.get(i);
46        if (!this.contains(e)) {
47          //Если правда бы одного человека нет. нам необходимо воротить пустой список
48          return new ArrayList(0);
49        }
50        Employee found = (Employee) this.get(this.indexOf(e));
51        result.add(
52            found.getFio() == "Брутасов Николай Павлович" //Наш директор
53                ? _maxHourSalary : _baseHourSalary);
54      }
55      return result;
56    }
57  
58    public LinkedList getSortedView() {
59      DataCollectionsHelper.sortBubble(this, new Comparator() {
60        public int compare(Object o1, Object o2) {
61          if (o1 instanceof Employee && o2 instanceof Employee) {
62            return ((Employee)o1).getTableNumber() - ((Employee)o2).getTableNumber();
63          } else return -1;
64        }
65      });
66  	  return this;
67    }
68  }
Задание 2

В одном из рассказов Конан-Дойла эпохальный сыщик столкнулся с делом, которое стало настоящей проверкой его дедуктивного способа. Ключом к расследованию оказалась отгадка особого шифрованного языка «танцующих человечков», с поддержкой которого бандиты вели свою переписку. В ходе дела Шерлок Холмс, применяя свой способ, сумел вычислить, сколько танцующих человечков входят в одно слово, а также определил тех из них, которые встречались особенно Зачастую. Разгадав значение первого слова — «С чего начинаются сообщения? Безусловно же с приветствия, драгоценный Ватсон! Это элементарно!» — сыщик без труда вычислил и всех остальных. Позже этого он сумел сам поучаствовать в их переписке и разоблачить шайку.

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

У вас имеется:
1) Компьютер, язык Java, IDE
2) Зашифрованный несложным способом отрывок художественного текста на русском языке
3) Роман «Война и мир» Л.Н. Толстого (если у вас останется много времени позже расшифровки, Дабы вам было чем себя занять — можете немножко почитать)
4) Комплект из 3 подсказок (№1, №2, №3), которые открываются по очереди. Вскрытие всякой подсказки сокращает допустимое число баллов, которое вы можете получить. Каждого 50 баллов, вскрытие всякой подсказки сокращает эту сумму на 10 баллов.

Зашифрованный текст

v l9ooxrl9 3 afzr2v l5wxr12fzfb 3n45wa7l9d 5w3p 3e9p5v 8bv 5w 3qxm6r2qx3p 3xrn4a|ooos 3n45wa7l9d 5w3p 3xrn4a|ooos 3e9p5v 8bv 5w 3qxm6r2qx3p 3xrn4a|ooos 3n45wa7l9d 5w3p 3xrn4a|ooos 3e9p5v 8bv 5w 3qxm6r2qx 3fz 3d mlu|5whc 3fz 3z9xr|c 3e9 3l9fz ahc 3qhv e9e9p5v fhd 35wd fbmlu| 3n4qhxr 3fz5wosa7 3n4v 125wxr12fzfbv hc 3fz5wosa| 3n4v 125wxr12fzfb 3qhxr yfz5we9a| 312 3oo7|e9a|fbv 312xre9u| aose9xroo 312xre9u| aos yu|e9a|oo 3ooqhu|ooosu| a 3|cxr yd 312 3p5xrl9e9oov l9oofzl9xrn4xr5wu|hc 3u|u9u| 3 av 5wu|l9osp5fz a 3 av 5wosfbfzp5xr a 3u||cxr 3n4u|qhu|12u|8b5wfz 312 3n4u|oou|qhz9d qh|c3p 3fz 3ood oo 3xrl9 3xrp5xrl9fbfz5w 3l9u| au|9 p5d a7 3mlp5xr5wd 3l9v 3p5fzqhxrfbl9xr l 3d 5wfz9 u|hc 3n4xrooxr a 3xrl9 3e95wd fhfz5w 312 3p5v p5xr angooxr 3 av |cv 8bfzl9u|3p 3n4xrooxr a 3u|u9u| 3fbu||cxrngooxr 3 yu|5wv 5w3p 3v 312 3l9v fbv 5wu| 3qhu|12xr5wa79 fzfz 3m6 afz|cqhfzqhxr12v 5w 38bv 3|cqhv l9fz9 d hc 3l9d 3fz 3z9xr|c 3e9 3l9fz ahc 3a| 35wd fbmlu| 3qhv e9e9p5v fhd 3n4qhxr 3v l9l9d 3fz|cl9v ooosu|12l9d hc 3l9xr 3n4qhxr 3v l9l9d 3fz|cl9v ooosu|12l9d 3qhv e9e9p5v 8bv ooos 3l9u| 3oov p5ngooxr 3n4qhxre9ooxrhc 312xrngn4u|qh127|r23p 3a| 3xr 3l9u| l 3n4xrfboofz 3l9fzfbu||cxr 3l9u| 38bl9v a73p 3v 312xrng12ooxrqh7|r23p 3a| 3e9u| lfbv e9 3d n4v 5w 3e9xr 3e9ood 5wv 3fz 38bv z97|5w3p 3xr 3fbu| a 3e9xrz9fzqhv 5we9a| 3qhv e9e9p5v 8b7|12v oooshc 3a| 35wd fbmlu| 3qhv e9e9p5v fhd 3xr 3e9u|z9u|hc 3a| 3127|e9xrp5xr|cxr 3qhxre9oov 3p 3l9u||c5wd n47| l3p 3xr yu|12v a7e9os 3fz8ba|u9l9xr 3fz 3e9xr 312p5d e9xr a3p 3l9u| 3n4osa73p 3l9v 3e9p5v fbp5fz 3l9u| 3r2xrfhd 3p 3l9xr 3p5 3 yv av a 3ooa|l9d e9oshc 3fz 3 yv a7| 3l9u| 3fz8bz9u||cv a7oo 3 au|l9a|hc 3 yv fhu| 35wa7z9a|oo3p 3p5xr|c yv 3a| 3e9 3l9fz afz 3|cd 5wa|a7hc 3e9u|qhv c fz av 3fz8b av l5wxr12l9v 3l9u|xr yl9xrp5qhv ool9xr 3n4qhfz|c5wv mlv 5wv 3 au|l9a| 3p5 3e9u|z9u|3p 3fz 38bfzl9v fz yv 3a|p5xr125wu|12l9v 3ooxrfhu| 3|cxr12xrqhfz5wv 3p 3fbooxr 3xrl9v 312e9u||c yv 3qhv yv 3 au|l9a| 312fz yu|oooshc 3l9xr 312xroo 3e9 3 av qhfzl9xr l 3n4u|ooqhxr12l9xr l 3e95wd fbv l 38bv z9v 12l97| l 3127|mlu|5w 3d 3 au|l9a|3p 3xr 3p5xrooxrqhxr a 3a| 3fz 3r2xrfbd 3qhv e9e9p5v 8bv oooshc 3e95wd fbv l 312n4xr5wl9u| 3xrz97|p5l9xr12u|l9l97| l3p 3l9xr 312e9u| 3fhu| 38bv z9v 12l97| l3p 3fzz9xr 3 av qhfzl9v 3n4u|ooqhxr12l9v 3z95wv |cxr yv qha| 3 al9u| 3e9xr12u|qhmlu|l9l9xr 3xrz95w7|e9u|5wv 3p 3p5v p5 35wv yxrl9oshc 3e95wd fbfz5wxre9os 3m6ooxr 3oov p5 w 3n4qhfzmlu|5w 3a| 3xr yl9v fh y7| 3p5 3 av qhfzl9u| 3n4u|ooqhxr12l9u|3p 3v 3xrl9v 3ooqhv r2zj 3ng 3fz 3xrz95w7|e9u|5wv hc 312xroo 3fz 312e9u|hc

Подсказка №1

Зашифрованный текст представляет собой небольшой рассказ на русском языке. В нем нет переносов строк, только буквы русского алфавита (в одном регистре), знаки препинания, пробелы. Текст зашифрован способом шифротаблицы: когда всякий символ начального текста заменяет одним либо группой символов из некоторого словаря, при этом число символов в группе идентично для всякого кодированного символа начального текста. У Конан-Дойла таким словарем были человечки, в нашем случае — это буквы английского алфавита, цифры, пробелы и некоторые особые знаки.
Казалось бы, не зная ключа, по которому проводилась замена, вскрыть данный шифр невозможно… Но задача в том, что в современных языках (в русском втом числе) различные буквы встречаются с различной частотой, какие-то Зачастую, какие-то редко. Следственно такие шифры поддаются т.н. «частотному обзору». При довольно большом объеме текста частота фактически однозначно определит закодированную букву. Но так как у нас зашифрован маленький отрывок, то в нем допустимы некие «перекосы» и для букв с близкими частотами останется неясность. Ну что здесь сделаешь? Вновь припомнил Шерлока — подставлять, пробовать и пытаться разгадать какие-то характерные буквосочетания либо слова, закреплять некоторые «разгаданные» буквы и пробовать вновь. Всякое разгаданное слово будет крепко приближать вас к отгадке каждого текста. И помните, чем комфортнее вы сделаете для себя инструмент для такого обзора, тем стремительней вскроете шифр.

Подсказка №2

У вас под рукой нет таблицы частот русских букв? А на что вам Толстой? Огромный текст даст вам дюже точный подсчет частоты применения букв в русском языке. Только не позабудьте текст заранее обработать, а полученные частоты нормализовать.
Еще дюже поможет, если вы определите самый частый, встречающийся в русском тексте символ — пробел и его частоту.
Мы договорились, что в шифротаблице всякий символ начального текста может быть зашифрован группой символов? Как узнать ее величину? Здесь дозволено порекомендовать несколько методов: проанализировать частоты встречаемости групп символов в зашифрованном тексте простым перебором, начиная с 1. Для положительного числа частоты будут «особенными». Дозволено испробовать обнаружить самую Зачастую-встречающуюся группу символов — это будет пробел и он вам ограничит слова. Ну а по средней длине слова узнать число букв в шифрогруппе не составит труда (вновь спасибо Толстому).

Подсказка №3

Зашифрованный текст начинается со слов «АНТОН МИХАЙЛОВИЧ»
Результаты

Если задания решить не удалось либо легко есть желание сверить итоги, то дозволено воспользоваться результатами:

Результат на задание 1

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

Если лаконично:
За примитивные ошибки, как бы выявления зацикливания, объявления static-переменных, сравнивания строк на ==, безмерных рекурсий и т.д. давался 1 балл.
За скрытие ошибки и эффективность, как бы целочисленного деления там, где должно быть деление плавающих, либо не применение Arrays.copy давалось 2-3 балла
За трудные тайм-бомбы, ошибки в дизайне класса 5 баллов.

Если развернуто (та самая таблица):

Оплошность в коде Область познаний Баллы
Класс теснее extends LinkedList писать implements List необязательно Жанр 1
Константы именуются не по соглашению (HIGH_HOUR_SALARY должно быть приблизительно так все) Жанр 1
Циклическая связанность при объявлении константы Поверхность 1
Константы типа Float ничем необоснованы, должно быть float Поверхность 1
Конструктор new Float(«36.60») жуток Поверхность 1
Вычисление _maxHourSalary / 4 даст не ожидаемый итог (из-за целочисленного деления), нужно очевидное приведение типа _maxHourSalary к float Спрятанная оплошность 3
Наименование способа LoadKoefficients не по соглашению (loadKoefficients должно быть) Жанр 1
Если наследуем список, то обязаны быть generics (генерики), без них пережиток Жанр 2
В конструкторе применяется паблик-способ, это небезопасно в случае наследования Спрятанная оплошность 3
Способы LoadKoefficients и recalculateKoeffs безрезультатно делать пабликами, так как они очевидно необходимы только для внутренней логики работы способа. Их публикация нарушает инкапсуляцию ООП 3
Судя по способу add у нас оплошность в дизайне класса – это вообще не список, а уйма (осуществляется проверка на повторное вступление). Дизайн класса 5
Класс ведет себя непостижимо как при добавлении НЕ Employee Спрятанная оплошность 3
Сопоставление строк на равенство (должно быть equals) Поверхность 1
Проверка o.getFio() == осуществляется внутри цикла (ничто не мешает проверить снаружи) Поверхность 1
Порочна сама практика такого исправления «бага 3244», таким образом исправлять баги невозможно никогда Дизайн класса 3
В список есть много методов добавить элемент, но переопределен только add. Значит приведенная в переопределенном способе логика будет срабатывать не неизменно, что еще дрянней самой ложной логики Спрятанная оплошность 3
Return add(o) вызывает безграничную рекурсию. Должно быть super.add(o) Поверхность 1
«ifns_2003_god» – должно быть вынесено в константу Жанр 2
В лог дебаг хотелось передать всю распечатку массива, а не непотребный указатель. Взамен arr1.toString() нужно было применять Arrays.deepToString Логическая оплошность 2
Распечатка каждого массива – дело длинное, отменнее вначале проверить, включен ли вообще режим дебага Эффективность 3
Массив Float[] не дает нам ничего помимо непрерывных боксингов/анбоксингов. Должно быть float[] Поверхность 1
Копирование массивов необходимо делать с поддержкой Arrays.copy Продуктивность 3
Отчего массив именно из 2000 элементов? А что если загруженных будет огромнее либо поменьше? Логическая оплошность 2
Куча magic numbers в recalculateKoeffs Жанр 2
Слишком жестко зашита логика в классе по обработке данных, эти части логики обыкновенно крепко изменяются, так писать классы невозможно (логика зашита в recalculateKoeffs, .getFio() == ) Дизайн класса 5
Чем обусловлена любовь к LinkedList и наследование именно от него? Какие в данном классе есть к этому предпосылки? Никаких! Дизайн класса 5
Чем вообще обусловлено наследование? Тут оно вовсе не отвечает задаче класса (необходимо было применять композицию, а не наследование) ООП 5
Нет программирование к интерфейсу (дюже много ссылок на определенные реализации ArrayList, LinkedList, которых необходимо было избежать) ООП 2
new ArrayList(5) — а отчего именно 5? magic number Жанр 2
Проход по списку циклом for i=0 и дальнейший get непродуктивный (исключительно для LinkedList). Нужно применять for each Эффективность 3
Возвращение пустого списка ArrayList(0), верно применять константу EMPTY_LIST либо способ emptyList в Collections (по куче причин) Спрятанная оплошность, Эффективность 3
Вообще логика возврата пустого списка, если один из элементов входного списка не обнаружен внутри весьма подозрительная и корявая Дизайн класса 3
Недокументированные public-способы. Как вообще додуматься, что эти способы делают? Жанр 2
Это приобретение элемента из списка жутко this.get(this.indexOf(e)) Поверхность 1
Отчего sortBubble а не Collections.sort? Поверхность 1
Неизвестный компаратор создается всякий раз при вызове способа. Дозволено было бы записать его в поле класса, а еще отменнее в статическое поле Эффективность 3
Если сопоставляемые элементы не Employee, то выдается поменьше. Это пример непостижимо какого поведения класса (не говоря уж о нарушении контракта компаратора) Логическая оплошность 3
Компаратор в виде разности имеет в себе спрятанную ошибку (для слишком крупных либо маленьких чисел) Спрятанная оплошность 3
Возвращение некого внешнего View на ваш список способом сортировки вашего списка весьма корявый дизайн класса (не говоря уж о том, что это нарушает инкапсуляцию) Дизайн класса 4
ИТОГО 95

Результат на задание 2

АНТОН МИХАЙЛОВИЧ ПЛЮНУЛ, СКАЗАЛ «ЭХ», ВНОВЬ ПЛЮНУЛ, ВНОВЬ СКАЗАЛ «ЭХ», ВНОВЬ ПЛЮНУЛ, ВНОВЬ СКАЗАЛ «ЭХ» И УШЕЛ. И ВСЕВЫШНИЙ С НИМ. РАССКАЖУ ОТМЕННЕЕ ПРО ИЛЬЮ ПАВЛОВИЧА. ИЛЬЯ ПАВЛОВИЧ РОДИЛСЯ В ТЫСЯЧА ВОСЕМЬСОТ ВОСЕМЬДЕСЯТ ТРЕТЬЕМ ГОДУ В КОНСТАНТИНОПОЛЕ. ЕЩЕ МАЛЕНЬКИМ МАЛЬчУГАНОМ ЕГО ПЕРЕВЕЗЛИ В ПЕТЕРБУРГ, И ЗДЕСЬ ОН ОКОНЧИЛ НЕМЕЦКУЮ ШКОЛУ НА КИРОЧНОЙ УЛИЦЕ. ПОТОМ ОН СЛУЖИЛ В КАКОМ-ТО МАГАЗИНЕ, ПОТОМ ЕЩЕ ЧЕГО-ТО ДЕЛАЛ, А В НАЧАЛЕ РЕВОЛЮЦИИ ЭМИГРИРОВАЛ ЗА РУБЕЖ. НУ И ВСЕВЫШНИЙ С НИМ. Я ОТМЕННЕЕ РАССКАЖУ ПРО АННУ ИГНАТЬЕВНУ. НО ПРО АННУ ИГНАТЬЕВНУ РАССКАЗАТЬ НЕ ТАК-ТО ЛЕГКО. ВО-ПЕРВЫХ, Я О НЕЙ ПРИМЕРНО НИЧЕГО НЕ ЗНАЮ, А ВО-ВТОРЫХ, Я ТЕПЕРЬ УПАЛ СО СТУЛА И ПОЗАБЫЛ, О ЧЕМ СОБИРАЛСЯ РАССКАЗЫВАТЬ. Я ОТМЕННЕЕ РАССКАЖУ О СЕБЕ. Я ВЫСОКОГО РОСТА, НЕГЛУПЫЙ, ОДЕВАЮСЬ ИЗЫСКАННО И СО ВКУСОМ, НЕ ПЬЮ, НА ПРЫЖКИ НЕ ХОЖУ, НО К ДАМАМ ТЯНУСЬ. И ДАМЫ НЕ чУРАЮТС? МЕНЯ. ДАЖЕ ЛЮБЯТ, КОГДА Я С НИМИ ГУЛЯЮ. СЕРАФИМА ИЗМАЙЛОВНА МНОГОКРАТНО ПРИГЛАШАЛА МЕНЯ К СЕБЕ, И ЗИНАИДА ЯКОВЛЕВНА ТОЖЕ ГОВОРИЛА, ЧТО ОНА НЕИЗМЕННО РАДА МЕНЯ ВИДЕТЬ. НО ВОТ С МАРИНОЙ ПЕТРОВНОЙ СЛУЧАЙ КОМИчНЫЙ ВЫШЕЛ У МЕНЯ, О КОТОРОМ Я И ХОЧУ РАССКАЗАТЬ. СЛУЧАЙ АБСОЛЮТНО ОБЫчНЫЙ, НО ВСЕ ЖЕ КОМИчНЫЙ, ПОТОМУ КАК МАРИНА ПЕТРОВНА ВСЛЕДСТВИЕ МНЕ АБСОЛЮТНО ОБЛЫСЕЛА, КАК ЛАДОНЬ. СЛУЧИЛОСЬ ЭТО ТАК: ПРИШЕЛ Я НЕКОГДА К МАРИНЕ ПЕТРОВНЕ, А ОНА ТРАХ! — И ОБЛЫСЕЛА. ВОТ И ВСЕ.

P.S. Судя по каждому, если в Самаре и был JUG, то давным-давно не работает. Может ли кто-нибудь подсказать так ли это?

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB