Обновить
256K+

Java *

Объектно-ориентированный язык программирования

235,27
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Dagaz: На полпути

Время на прочтение18 мин
Охват и читатели5.3K
imageЧуть правее наклон — упадет, пропадет!
Чуть левее наклон — все равно не спасти!
Но спокойно, ему остается пройти
Всего две четверти пути!

        Владимир Высоцкий "Натянутый канат"
 
 
Когда фронт работ выглядит совершенно необозримым, его волей-неволей, приходится делить на мелкие куски. Кусочек, для первой итерации, я выбрал совсем небольшой:

Очень простые шашки
(board
   (name chess-board-10x10)
   (dim "a-j")
   (dim "10-1")
   (dir (name nw) -1 -1)
   (dir (name ne)  1 -1)
   (dir (name se)  1  1)
   (dir (name sw) -1  1)
)

(piece
   (name Man)
   (pre
      (check is-friend?)
      (take)
      (log position)
      (let captured 0)
   )
   (post
      (check (<= max-captured captured))
      (set! max-captured captured)
      (log " - " position)
      (drop)
   )
   (move
      (check (any nw ne))
      (check is-empty?)
   )
   (move
      (while true
         (let dir (any nw ne sw se))
         (check dir)
         (check is-enemy?)
         (capture)
         (inc! captured)
         (check dir)
         (check is-empty?)
         (end-move)
      )
   )
)

(game
   (name "Simple Checkers")
   (board chess-board-10x10)
   (players 
      (White (Man a1 c1 e1 g1 i1 b2 d2 f2 h2 j2 a3 c3 e3 g3 i3)) 
      (Black (Man b8 d8 f8 h8 j8 a7 c7 e7 g7 i7 b6 d6 f6 h6 j6))
   )
)


Даже без дамок! Фигуры двигаются вперёд и могут «бить» противника, по привычным нам правилам "Шашек" (перепрыгивая через фигуру). Дойдя до последней линии доски, они ни во что не превращаются, но могут брать фигуры противника, поскольку взятия «назад» разрешены. В этом отношении, разрабатываемая игра похожа на «Осетинские шашки», описанные в одной из предыдущих статей. Взятие обязательно и, из всех возможных ходов, игрок должен выбрать ход, берущий максимальное количество фигур. Игра завершается, когда один из игроков не может выполнить очередной ход (заперт или потерял все фигуры).

Разумеется, речь идёт не о том, чтобы «закодить очередные шашки» (это можно было бы сделать и с меньшими усилиями). Я хочу разработать «метаигровую» систему, позволяющую описывать достаточно сложные логические игры, используя простой DSL и, в идеале, не обладая продвинутыми навыками программирования (то есть, ровно то, что делает Zillions of Games, но в полностью открытом и кроссплатформенном проекте).
Читать дальше →

Анализ AST c помощью паттернов

Время на прочтение12 мин
Охват и читатели12K

Сейчас я работаю над senjin/gglsl — библиотекой для программирования шейдеров с помощью Groovy, о которой недавно писал.

Здесь я опишу три подхода к анализу AST (abstract syntax tree), все на примерах под-задач, вытекающих одна из другой и связанных общим контекстом: рекурсивные функции, паттерн Visitor, и паттерн-матчинг.
Паттерн-матчинг реализован на Java и доступен на GitHub.
Читать дальше →

Защита in-App Purchase iOS от ломалок с помощю сервера

Время на прочтение2 мин
Охват и читатели9.2K
Сегодня расскажу о том, как защитить in-app purchases в играх на мобильной платформе iOS с помощью собственного сервера. Практически все компании, которые выпускают свой продукт, заботятся о защищенности своих приложений и как можно больше пытаются защитить их от взлома. Одной из таких компаний является и та, в которой я работаю.
Читать дальше →

Сортировка массива без использования условных операторов

Время на прочтение2 мин
Охват и читатели9.1K
Сразу предупреждаю, что данная статья будет альтернативной версией вот этой. Да, я уж прям чую как все сразу ринуться меня критиковать, но, ребята, алгоритм представлений в решении не оптимален. В комментариях предлагали еще более простые алгоритмы, на питоне. На питоне достаточно написать:

array.sort()

И все. Кому нужен вообще какой-то алгоритм. В задании было установлено ограничение от 0 до 100, мы же не лентяи, сделаем в общем виде, для любых значений и с повторениями чисел. Немного подумав, пришел вот к такому решению:
Читать дальше →

Введение в RxJava: Ключевые типы

Время на прочтение7 мин
Охват и читатели143K
rxjava
В вводной статье мы рассмотрели преимущества реактивного подхода в программировании на Java, а также ситуации в которых библиотека Rx бывает более или менее полезной. В этой части мы рассмотрим основные типы, на которых базируется концепция реактивного программирования и несколько дополнительных классов, которые помогут нам в понимании принципов работы библиотеки.
Читать дальше →

Вышел JetBrains Toolbox со всеми обновленными десктопными продуктами

Время на прочтение2 мин
Охват и читатели33K
Хотя сегодня понедельник, у нас важный день — мы запустили JetBrains Toolbox, обновили все входящие в него десктопные продукты и начали продажи по новой лицензионной схеме.

Вкратце о каждом из продуктовых обновлений:

  • ReSharper Ultimate 10 — ReSharper Build для повышения эффективности сборки, непрерывное тестирование, профилирование со шкалой времени внутри Visual Studio, больше средств контроля за стилем кода, поддержка NUnit 3.0, полная поддержка C99, новые проверки, исправления и рефакторинги для C++, улучшенная поддержка JavaScript и TypeScript (в том числе регулярные выражения и синтаксис JSX/TSX), декомпиляция в IL-код.
  • IntelliJ IDEA 15 — новые возможности в отладчике, улучшенный пользовательский интерфейс, новые встроенные инструменты и интеграции, дополнительно улучшенная помощь при написании кода, поддержка Kotlin «из коробки».
  • PhpStorm 10 — улучшенная поддержка языка PHP, повышенное удобство редактирования, отладки, анализа кода и многие другие мощные возможности.
  • WebStorm 11 — поддержка
Читать дальше →

Дюк, вынеси мусор! — 3. CMS и G1

Время на прочтение10 мин
Охват и читатели189K
Часть 3 - CMS GC и G1 GC

Сегодня мы продолжаем цикл статей о сборщиках мусора, поставляемых с виртуальной машиной Oracle Java HotSpot VM. Мы уже изучили немного теории и рассмотрели, каким образом с кучей расправляются два базовых сборщика — Serial GC и Parallel GC. А в этой статье речь пойдет о сборщиках CMS GC и G1 GC, первостепенной задачей которых является минимизация пауз при наведении порядка в памяти приложений, оперирующих средними и большими объемами данных, то есть по большей части в памяти серверных приложений.

Два этих сборщика объединяют общим названием «mostly concurrent collectors», то есть «по большей части конкурентные сборщики». Это связано с тем, что часть своей работы они выполняют параллельно с основными потоками приложения, то есть в какие-то моменты конкурируют с ними за ресурсы процессора. Конечно, это не проходит бесследно, и в итоге они разменивают улучшение в части пауз на ухудшение в части пропускной способности. Хотя делают это по-разному. Давайте посмотрим, как.
Посмотреть, как

Параллельная обработка большого селекта в нескольких сессиях

Время на прочтение10 мин
Охват и читатели23K
Представьте: есть селект, который возвращает записи, каждую из которых нужно обработать, и то ли много записей, то ли обработка каждой записи занимает много времени, а процесс обработки одной записи не зависит от процессов других записей.
Классический пример для того, чтобы задействовать многопоточность или в случае баз данных выполнять обработку в нескольких сессиях. В Оракле для этого используется hint /*+ parallel() */ и pipelined functions. Это здорово, но если у вас Oracle standard edition(где parallel не работает) или вы хотите обработать не каждую запись по отдельности(из соображений, что лучше накопить работу, а потом в bulk, одним ударом, выполнить), а поделить весь вывод селекта на куски и каждый обработать отдельно?
Читать дальше →

Руководство по поиску работы для MDA-специалиста (и немного про метод анализа иерархий, Xcore и Sirius)

Время на прочтение11 мин
Охват и читатели27K


Это 4-я статья цикла по разработке, управляемой моделями. В предыдущих статьях мы познакомились с OCL и метамоделями, Eclipse Modeling Framework и Sirius. Сегодня научимся описывать метамодели в текстовой нотации (а не в виде диаграмм как раньше) и познакомимся с табличным представлением моделей в Sirius. Сделаем это на примере кризиса среднего возраста и метода анализа иерархий. Возможно, это пригодится вам при разработке ИИ в играх, при принятии решений или в работе.
Читать дальше →

Дюк, вынеси мусор! — 2. Serial GC и Parallel GC

Время на прочтение11 мин
Охват и читатели153K
Heap


В предыдущей статье мы познакомились с терминологией и основными идеями, лежащими в основе сборщиков мусора Java HotSpot VM и многих других виртуальных машин. Теперь мы, наконец, можем взять в руки лопату и приступить к разгребанию нашей кучи. Сегодня у нас на обзоре две лопаты два сборщика мусора, используемые огромным количеством Java-программ, зачастую даже не подозревающих об этом. Это Serial GC и Parallel GC. Их популярность объясняется просто — данные сборщики выбираются виртуальной машиной по умолчанию для большинства аппаратных конфигураций.

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

Мониторинг под рукой на IxoraRMS. Быстро и со вкусом

Время на прочтение16 мин
Охват и читатели8.7K
image
Иногда проблема с приложением выливается в небольшой кошмар, ребус. Назовите, как хотите. Хочу поделиться об опыте использования средств мониторинга разработчиками на одном из проектов. Хабр многолик и уже существуют десятки статей о продуктах, которые облегчают понимание происходящего: cacti — habrahabr.ru/post/179391; zabbix — habrahabr.ru/post/137641; collectd — habrahabr.ru/post/93205; штатные средства JVM — habrahabr.ru/post/147008 (дополняйте).

Попробую рассказать о еще одном небольшом универсальном и легковесном продукте в этой категории — IxoraRMS.
Всем интересующимся, добро пожаловать под кат.
Читать дальше →

Совместное использование checkstyle и gerrit

Время на прочтение3 мин
Охват и читатели8.9K

Преамбула


Какое-то время назад, решив навести порядок в нашем коде, выбрали в качестве системы контроля стиля кода Checkstyle. Думаю, проект знакомый, в представлении не нуждается. До этого в команде мы использовали общий репозиторий, где хранились настройки code styles, intentions для идеи.

Добавляя в проект checkstyle, мы в первую очередь преследовали цель — возможность превратить ошибки в оформлении стиля кода в ошибки сборки. Лёгким движением руки checkstyle был подключен в корневой pom проекта, разработчики были ознакомлены с нововведением, сборки на Teamcity научились проверять checkstyle перед коммитом.

Да вот незадача: в наших рядах появился вредитель. Как мы с ним боролись — под катом.
Читать дальше →

Из Java в Scala: 7 причин для изучения нового языка

Время на прочтение4 мин
Охват и читатели51K
Много свободного времени только у студентов. Если вы не студент, то должны появиться очень веские причины для того, чтобы начать изучать новый язык программирования. Особенно это касается Java-программистов, потому что этот язык является лидером в своём сегменте. Тем не менее причины для изучения нового языка есть.
Читать дальше →

Ближайшие события

Разбор Java программы с помощью java программы

Время на прочтение14 мин
Охват и читатели22K
Разобрались с теорией в публикации «Модификация программы и что лучше менять: исполняемый код или AST программы?». Перейдем к практике, используя Eclipse java compiler API.



Java программа, которая переваривает java программу, начинается с работы над абстрактным синтаксическим деревом (AST)…
Читать дальше →

Эволюция Java на примере чтения строк из файла

Время на прочтение2 мин
Охват и читатели128K
Приведу небольшой и интересный, на мой взгляд, пример, как изменилась жизнь простого крестьянина Java разработчика, на примере задачи чтения и печати строк из файла.



Многие из нас помнят

'до Java 7' мучения:


        BufferedReader reader = null;
        try {
            reader = new BufferedReader(
                        new InputStreamReader(
                            new FileInputStream(FILE_NAME), Charset.forName("UTF-8")));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            // log error
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    // log warning
                }
            }
        }

Читать дальше →

Дюк, вынеси мусор! — 1. Введение

Время на прочтение13 мин
Охват и читатели274K


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

Попробуем в нескольких статьях пройти путь от описания базовых идей, лежащих в основе всех сборщиков мусора, до разбора алгоритмов работы и возможностей тонкой настройки различных сборщиков Java HotSpot VM (вы ведь знаете, что таких сборщиков четыре?). И самое главное, рассмотрим, каким образом эти знания можно использовать на практике.
Узнать

Отладка шейдеров на Java + Groovy

Время на прочтение5 мин
Охват и читатели11K


Подсветка синтаксиса шейдеров. Связь между шейдерами и внешними структурами данных. Юнит-тесты для шейдеров, дебаг, рефакторинг, статический анализ кода, и вообще полная поддержка IDE. О том, как всё это получить, в чём подвох, и что прописать в мавене…
Читать дальше →

Отчёт о Java-конференции Joker 2015

Время на прочтение8 мин
Охват и читатели17K
16-17 октября 2015 года в Санкт-Петербурге состоялась конференция Joker 2015. В течение 2 дней было прочитано более 30 докладов, связанных с разработкой на языке программирования Java. Кто был среди докладчиков, какие доклады удалось посмотреть, что показалось интересным, об этом рассказывается далее.


Читать дальше →

Участие в конкурсе LudumDare #33

Время на прочтение4 мин
Охват и читатели10K
Несмотря на то, что за все два дня конкурса фантастическая идея игры ко мне так и не пришла, хочу поделиться небольшими наработками, которые были сделаны за пару дней. Возможно, статья найдет своего читателя, и кому-то до сих пор нравится pure-java вместо модных движков.

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

image

Если не вдаваться в подробности, игра довольно примитивная. Пока идет день, вы управляете медлительным монстром, на которого со всех сторон нападают рыцари. Но как только приходит ночь, ситуация резко меняется, теперь вы очень шустрый одноглазый монстр, который способен истреблять рыцарей. Но все не так радужно, так как я привнес в агрессивное поведение (ночью) автоконтроль, который практически все делал за вас: и убивал, и искал новых жертв-рыцарей.
Читать дальше →

Быстрая разработка отчетов на Java: дауншифтинг с «1С: Предприятие»

Время на прочтение4 мин
Охват и читатели18K
Приветствую уважаемых читателей.

Как и обещал в первой статье Быстрая разработка CRUD на Java: дауншифтинг с «1С: Предприятие», продолжаю описание своих OpenSource проектов, реализующих аналогичную 1С: Предприятию функциональность.

На сей раз, это СКД — система компоновки данных, и моя разработка FlexReporting (ссылка на GitHub).
В чем суть этого механизма? Это некий realtime — ROLAP инструмент, который на лету трансформирует «плоские» данные в иерархические отчеты.

На самом деле, есть много любителей поспорить, что СКД это не «тру» OLAP, но я бы напомнил, что такая вещь как агрегаты, заранее рассчитывающие и хранящие многомерные данные по всем (или по заданным) сочетаниям измерений оборотных регистров накопления — а это весомый аргумент для использования этой аббревиатуры. Впрочем, от споров по терминологии очень хотелось бы уклониться.

Вот так это выглядит в 1С ERP 2.0:



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

1. Задает, в какой последовательности будут выводиться данные, какие группировки будут по вертикали, какие по горизонтали.
Например: склад, товар, менеджер и т.д.
2. Задает набор показателей, и агрегатные функции (сумма, среднее, количество, минимум, максимум и проч.), которые будут к ним применяться.
Например: сумма(стоимость), среднее(количество_товара), максимум(дата_отгрузки).

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