• Вышел FindBugs 3.0.1


      Новая версия FindBugs доступна для скачивания на официальном сайте. Несмотря на то что поменялась только третья цифра в номере версии, вас ждёт множество новых интересных детекторов, а также улучшение старых. Если основная фича 3.0.0 заключалась в поддержке Java 8 и новых детекторов практически не было, то в 3.0.1 упор был сделан на функционал. Здесь я хочу вкратце осветить некоторые новые детекторы, разработанные лично мной.

      В этой статье ограничимся детекторами бесполезного кода. Мне нравится разрабатывать такие детекторы: они не просто ищут конкретный шаблон (например, вызов метода с заведомо некорректным параметром), а доказывают бесполезность определённых фрагментов кода. Порой таким образом можно найти весьма неожиданные ошибки.
      Читать дальше →
    • Инстанцировать не инстанциируемое

        Идея этого топика родилась из этого комментария.

        Итак имеем: класс без конструкторов, необходимо создать экземпляр этого класса. На Java такого сделать нельзя, так что придется напрямую манипулировать байткодом. Идея состоит в том, чтобы вызвать NEW, но при этом не вызывать <init>. Но тут есть трудность, спецификация JVM говорит что так делать нельзя,
        но очень хочется
      • Работа с Java в командной строке

        Сейчас уже никто не создает программы в консоли. Используя любимую IDE, разработчик чувствует себя неуютно за чужим компьютером, где её нет.
        Решив разобраться в работе Ant и Maven, я поймал себя на том, что не смогу собрать приложение без них в консоли.
        В данной статье я постарался уместить все этапы проектирования демонстрационного приложения, чтобы не искать справку по каждой команде на просторах Интернета.
        Читать дальше →
      • Классификация знаний в области программирования

          2 года назад я написал статью о классификации знаний в области программирования. Это было на волне интереса и моей активной деятельности по самообразованию в компьютерных науках. Написал статью и забыл о ней. Публиковать на Хабре не собирался. В конце концов, она базируется на моем личном опыте и знаних, которые могут оказаться весьма субъективны.

          Недавно, на фоне постоянно поступающих вопросов «как научиться программированию?», я вспомнил про этот материал и перечитал его. Прошло уже 2 года, пополнился опыт, добавились знания, изменились взгляды. Но эта статья для меня не утратила актуальности, и я не нашел почти ничего, что хотел бы в ней изменить. Мне показалось, что она все же достойна публикации. И, возможно, кому-то она поможет в собственном профессиональном развитии.

          Но прежде, чем «запустить» материал, еще небольшое отступление. О том, почему вообще я все это писал. Дело в том, что у нас в странах бывшего СССР с образованием в области IT очень туго. С одной стороны нет программ обучения, которые подготовят специалистов на должном уровне (наверное, за очень редкими исключениями, которые можно отнести к погрешности). С другой стороны, из-за широких возможностей самообразования, программисты и не спешат учиться в ВУЗах — все стремятся начать практиковать как можно раньше. Часто изучается только одно направление (например PHP+Mysql — самое популярное) и в бой. Причем, на этом все заканчивается. В итоге у нас огромное количество программистов, которые и базовых вещей не знают. Отсюда вытекают проблемы с качеством кода, и с эффекивностью алгоритмов, с велосипедированием.

          Но программирование — это полноценная область знаний, которая требует в том числе и инженерной подготовки. Точно так же, как строительство или телекоммуникации. Да, построить дом (особняк) можно своими руками и без образования. А поднять большинство сайтов можно прочитав пару книг по PHP и HTML. Но многоэтажку без специальной подготовки не построишь, как и Гугл не напишешь, не зная основ.

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

          Поехали.
          Читать дальше →
        • Малоизвестные особенности Java

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

          Вот уже подоспела и вторая часть статьи.


          1. Нестатические блоки инициализации.

          Всем, я думаю, известно, что в Java существуют статические блоки инициализации (class initializers), код которых выполняется при первой загрузке класса.

          class Foo {
          	static List<Character> abc;
          	static {
          		abc = new LinkedList<Character>();
          		for (char c = 'A'; c <= 'Z'; ++c) {
          			abc.add( c );
          		}
          	}
          }


          Но существуют также и нестатические блоки инициализации (instance initializers). Они позволяют проводить инициализацию объектов вне зависимости от того, какой конструктор был вызван или, например, вести журналирование:

          class Bar {
          	{
          		System.out.println("Bar: новый экземпляр");
          	}
          }


          Такой метод инициализации весьма полезен для анонимных внутренних классов, которые конструкторов иметь не могут. Кроме того, вопреки ограничению синтаксиса Java, используя их, мы можем элегантно инициализировать коллекцию:

          Map<String, String> map = new HashMap<String, String>() {{
          	put("паук",  "арахнид");
          	put("птица", "архозавр");
          	put("кит",   "зверь");
          }};


          Очень даже мощное средство, не находите?

          JFrame frame = new JFrame() {{
          	add(new JPanel() {{
          		add(new JLabel("Хабрахабр?") {{
          			setBackground(Color.BLACK);
          			setForeground(Color.WHITE);
          		}});
          
          		add(new JButton("Торт!") {{
          			addActionListener(new ActionListener() {
          				public void actionPerformed(ActionEvent event) {
          					System.out.println("Хабрахабр - торт!");
          				}
          			});
          		}});
          	}});
          }};


          Остальные четыре пункта под катом.
          Читать дальше →
        • Малоизвестные особенности Java. Вторая часть

            Как и обещал, предлагаю вашему вниманию следующие пять пунктов.

            Малоизвестные особенности Java. Первая часть

            6. Конфликт имён.

            Если импортированы несколько классов с одним и тем же именем из разных пакетов, возникает конфликт имён. В таком случае при обращении к классу следует указывать его квалифицированное имя, то есть полное имя, включая и имя пакета, например java.lang.String.

            Неужели ничего нельзя с этим поделать? Оказывается можно. Следующий код скомпилируется без проблем, несмотря на то, что класс List присутствует и в пакете java.awt, и в пакете java.util:

            import java.awt.*;
            import java.util.*;
            import java.util.List;
            
            public class Класс {
            	public static void main(String... аргументы) {
            		List простоСписок = Collections.emptyList();
            		System.out.println(простоСписок);
            	}
            }


            Достаточно дополнительно импортировать необходимый класс, java.util.List в данном примере.

            Тут, как вы заметили, используются кириллические идентификаторы. Да! Для кого-то это станет откровением, но Java… такая Java. Идентификатор может состоять из совершенно любых букв, помимо цифр, знаков подчёркивания и валюты США (однако последний знак ($) использовать не рекомендуется, он предназначен для системных нужд). Но оно нам надо? Разве только в целях обфускации. Только представьте себе, сколько разных идентификаторов можно сгенерировать всего-то из символов «А» английского, русского и греческого алфавитов…

            Читать дальше →
          • Нейронная сеть на спичечных коробках

              Я не помню где брал эту информацию, но она отражает суть нейросетей лучше всего. На пальцах.

              Правила игры. НС обучается играть в игру «11 палочек». Можно брать либо 1 палочку, либо 2. Нужно вытянуть последним все палочки.

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

              Например, НС начинает ход.

              1. Закрываем глаза и вытаскиваем наугад пуговку из коробки под номером 11. Если черная, то берем одну палочку, если белая — две. (Пусть будет белая — 2 палочки).
              2. Ход человека. Например, он взял 2 палочки.
              3. Далее, берем коробок под номером 11-2-2 = 7 и вытаскиваем наугад из него пуговку.

              Так до тех пор пока игра не закончится.

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

              Вот и вся нейросеть из 10 узлов которая, изначально, не зная даже правил, учится играть и начинает обыгрывать человека. Если изменить правила и, например, тот кто последний забирает палочки проигрывает, то НС переучится и опять начнет побеждать.

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

                image
                Это статья уровня 2 (см. ниже).
                Статья является логическим продолжением моего рассказа про сверточные нейронные сети и их применения для распознавания изображений.
                Прежде чем продолжить хочу дать понимание чем же все таки занимаются люди из области Машинного обучения и какова их глобальная цель. Глобальная цель — это порабощение всех людей машинами создание методов и алгоритмов, способных путем обучения выстраивать сложные и нелинейные модели внешнего мира. В качестве пояснения предлагаю взглянуть на картинку, благодарно позаимствованную из [1]. Сейчас человечество уже умеет создавать алгоритмы, способные учится простым операциям, но что насчет такого вот преобразования — у нас есть изображение сидящего человека которое по сути является сырым вектором значений яркости картинки в каждой точке. И нам необходимо постепенно повышая абстрактность этих сырых данных сделать вывод «человек сидит». Отсюда собственно главный вопрос: Как создать систему способную не только понять простые (пусть и нелинейные) зависимости, но также обучиться сложным, многомерным и многоуровневым иерархиям представлений реального мира?
                Читать дальше →
              • Unsupervised learning или «пойди туда, не знаю куда, найди то, не знаю что»

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

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

                  Неуправляемое обучение, обучение без учителя
                  Однако есть ситуации, и их довольно много, когда правильного ответа никто не знает. И даже непонятно что является ответом. И даже задача не вполне ясна. Есть только данные. Надо что-то полезное из них извлечь.
                  Согласитесь, задача гораздо более интересная и дающая простор для фантазии?
                  Читать дальше →
                • Алгоритм Self-Organizing Incremental Neural Network (SOINN)

                    Введение


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

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

                    В данной статье рассматривается алгоритм SOINN, который частично решает озвученные выше проблемы.
                    Читать дальше →
                    • +30
                    • 21k
                    • 7
                  • Алгоритм Улучшенной Самоорганизующейся Растущей Нейронной Сети (ESOINN)


                      Введение


                      В моей предыдущей статье о методах машинного обучения без учителя был рассмотрен базовый алгоритм SOINN — алгоритм построения самоорганизующихся растущих нейронных сетей. Как было отмечено, базовая модель сети SOINN имеет ряд недостатков, не позволяющих использовать её для обучения в режиме lifetime (т.е. для обучения в процессе всего срока эксплуатации сети). К таким недостаткам относилась двухслойная структура сети, требующая при незначительных изменениях в первом слое сети переобучать второй слой полностью. Также алгоритм имел много настраиваемых параметров, что затрудняло его применение при работе с реальными данными.

                      В этой статье будет рассмотрен алгоритм An Enhanced Self-Organizing Incremental Neural Network, являющийся расширением базовой модели SOINN и частично решающий озвученные проблемы.
                      Читать дальше →
                    • Здравствуйте, я ошибка 217 и я вам ничего не скажу

                        Вероятно многие встречались с таким вот «партизаном» при старте или завершении приложения:



                        Очень информативное сообщение, сразу понятна причина ошибки, место и способ ее решения.
                        Впрочем, если без шуток, что это вообще такое?
                        Конечно-же это исключение, но ни тип исключения, ни его описание нам не доступны — просто «Runtime error 217» и адрес, а дальше сами…

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

                        И тратил бы его в дальнейшем, если бы на днях со мной не связался Виктор Федоренков и не рассказал о своих мыслях по поводу ошибки за номером 217.
                        Читать дальше →
                      • 200 миллисекунд свободы

                        В 1979 году американский психолог Бенджамин Либет провел свой знаменитый эксперимент, который взбудоражил научное сообщество, но как-то прошел мимо широкой массы. А очень зря, ведь он показывает всю чудовищную правду о нашей «свободной воле».
                        Читать дальше →
                      • Как быть программистом в этом жестоком мире

                        Здравствуйте, дорогие хабропользователи и хабропосетители. Хочу поделиться своими взглядами на status-quo в сфере программирования сегодня.
                        Замечено over 9000 постов по кошерному развитию своей драгоценной личности в области всем на любимого программирования. Интернет — это большая куча, из которой каждый извлекает информацию абсолютно рандомно (те собирает по крупицам) и его мозг делает компиляцию всего ранее изученного, и именно поэтому людям трудно взять и понять чужие взгляды (т.е. не насрать в коментах) и именно поэтому я прошу либо согласиться либо несогласиться с моим мнением но не обсуждать его. Далее предлагаю СВОЕ видение мира программирования и его классификацию, а так же пару предположений как преуспеть. Поехали:
                        Читать дальше →
                        • –30
                        • 20,8k
                        • 18
                      • Eclipse. Улучшенный поиск и подсветка блоков кода


                          Устав искать, как улучшить навигацию по коду в эклипсе, и в первую очередь поиск, я почти решился писать свой собственный велосипед, но, к счастью, нашел решение в виде связки двух must-have плагинов — Glance и EditBox.
                          Читать дальше →
                        • Eclipse for Java Developers. Навигация и редактирование


                          Наблюдая за со своими знакомыми, которые недавно начали изучать программирование или перешли на Eclipse c другой IDE, я часто замечаю что они почти не используют вспомогательные инструменты среды разработки. Они либо не знают о них вообще, либо не понимают какую практическую пользу они могут принести.
                          Данная статья предназначена в основном для начинающих в работе с Eclipse. Но в процессе подготовки статьи я сам узнал о нескольких простых и удобных инструментах, которые за два года активной разработки ни разу не использовал.
                          В данной статье речь пойдет о навигации и редактировании.
                          Внутри скриншоты.
                          Читать дальше →
                        • Java по-русски. Часть вторая: интернет-ресурсы

                            В продолжение первой части. Сегодня будем рассматривать ресурсы о Java в интернете, которые подразделим на 4 части: вендоры, JUG, форумы, новости. А заодно подведём итоги.

                            Вендоры


                            Sun Microsystems

                            image
                            Основной сайт компании Sun содержит чисто рекламную информацию, поэтому рассматривать мы будем Сеть Разработчиков. Итак, что же здесь есть:
                            • JavaFX — хит сезона. В рамках продвижения Sun проводит конкурсы по этой технологии, ещё вы можете найти документацию на русском языке и даже Wiki.
                            • Академические программы — информация об образовательных программах. В основном это курсы для преподавателей и учебные материалы — лекции, написанные в рамках грантов.
                            • Java SE, Java EE, Java ME, JavaCard за 2009 год не содержат практически никаких обновлений, а за предыдущие года есть разве что переводы некоторых статей.
                            • Форум довольно мёртвый, за исключением раздела о JavaFX.
                            • Ещё есть переводы англоязычных блогов The Aquarium и The Planetarium, посвящённых новостям о Java EE и Java для всех других платформ(SE, ME, FX, etc...) соответственно.

                            Читать дальше →
                          • Начинающим Java программистам

                              Программирую на Java вот уже 7 лет. Но на работе часто приходится обучать новое поколение. В связи с этим и решил сделать некоторую шпаргалку, которая, надеюсь, пригодится и для хабрчан. Если кто-то может помочь дополнить чем-то информацию из этой статьи, то пишите! Итак:

                              Основные ресурсы для начального обучения


                              • www.javable.com — сайт со статьями и tutorial'ом по Java. Все в основном на русском.
                              • www.exampledepot.com — очень полезный ресурс, где собраны краткие примеры использования классов для тех или иных пакетов
                              • java.sun.com — без первоисточника не обойтись. Для любого Java программиста JavaDoc должен быть истиной в последней инстанции. Так же здесь можно найти серию tutorial'ов на все возможные темы.

                              Читать дальше →
                              • +106
                              • 1129k
                              • 58
                            • Восстановление логической функции

                              image


                              В данной статье Вы сможете найти готовую реализацию и описание алгоритма предназначенного для реконструкции логических функций методом чёрного ящика. Под логической функцией я подразумеваю такую функцию, которая принимает в качестве аргументов множество булевых значений и соответственно возвращает одно. Пример:
                              def customlogic(params):
                                  return params[0] and params[1] and not params[5] and params[11] or params[2] and not params[3] or params[0] and params[5] and not params[6] or params[7] and not params[8]
                              

                              В конце статьи алгоритм проверяется на данных полученных из реального мира.
                              Читать дальше →
                              • +14
                              • 11,4k
                              • 8
                            • Динамическое программирование в шаблонах

                                Есть такой чудный сайт выходного дня, как codeeval.com. На котором неплохая коллекция небольших алгоритмических задачек и удобная система проверки, позволяющая занимательно провести вечер скучающим программистам. Как правило в качестве входных данных используется файл с тестовыми данными. Однако мне попалась одна задача, в которой тестовые данные известны заранее. Загружать программу, которая будет просто выводить правильный ответ не спортивно, а вот вычислять его на этапе компиляции — самое то.

                                Что из этого получилось можно посмотреть внутри.
                                Читать дальше →