суббота, 18 июля 2015 г.

Шашлыки


Пока Юля с Лёшкой малину собирали, Мишка готовил угли для шашлыка. Я его учил топором работать - сначала щепки тесать, потом брёвна рубить.

Беговая

На этот раз электричка шла только до Одинцово, поэтому я решил пересесть на Беговой, где садился, когда в Москве работал. Платформу уменьшили и убрали ларьки. Вокруг понастроили домов, хотя рядом и железка, и третье кольцо - шумно.

Каланчёвская


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

Питер - Москва


По приколу поехал в Москву на двухэтажном поезде. Вагоны делались в Твери, выглядят вполне современно. Все туалеты в одном углу, что удобно. Купе, правда, низкие и места для багажа маловато - только под сиденьями. У каждого места - розетки для телефонов, но они не работали. Проводница сказала, что в Питер ехала толпа китайцев, которые грели воду кипятильниками, хотя на розетке написано "до 100 ватт", и что-то спалили в системе.

пятница, 17 июля 2015 г.

Погода

На улице громыхает изрядно и льёт как из ведра. Кстати, можно посмотреть где ещё гром гремит в реальном времени.

четверг, 16 июля 2015 г.

Uncharted 4


Прикольная приставочная игра, похожая на фильм.

Ложка дёгтя

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

Реверси

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

После небольшой реструктуризации кода всё вылечилось само, а я так и не понял, что всё-таки произошло. Зато понял, что разучился играть в Реверси. Мне так и не получилось обыграть компьютер.

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

вторник, 14 июля 2015 г.

Кевин Смит на линии


Смешно чувак байки рассказывает...

Второй монитор для игр

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

По факту оказалось, что на wiki сплошной обман. Ни одна из игр приведённого списка, что я мог попробовать, не поддерживает несколько мониторов. Немного погуглив, я понял, что вообще не делают таких игр. Что весьма печально.

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

Я же думал несколько о другом...

Когда я работаю в IDEA, то могу вспомогательные окна перетаскивать на второй монитор, чтобы они там болтались и в глаза не лезли. Хотелось бы аналогичной функциональности в играх. Допустим, играете вы в Deus Ex на большом мониторе, а на соседний выводится карта, инвентарь и всякое разное.

Это было бы реально круто!

Sic transit gloria mundi

При покупке телефона рекламировалось, что в режиме ожидания он работает 35 дней. Ну а у меня в режиме три звонка в день он прожил чуть более недели. Чуда не произошло.

А ещё обнаружилось, что у него очень тихий динамик и плохо слышно собеседника, если вокруг шумят. Может поменять?

Unleash the Archers

Какие-то канадцы пиарятся на популярности Безумного Макса:

понедельник, 13 июля 2015 г.

Пятилетие

Вот и ещё один же ребёнок подрос.

На следующий год

Kotlin существует только в трёх видах: для JVM, JavaScript и Android; а переносимое приложение написать можно только текстовое через вывод println.

И в этом вопросе язык сильно проигрывает почившему в бозе JavaFX script, в котором существовала Scene с набором 2D-примитивов, анимацией и связыванием переменных. Это позволяло создать переносимое приложение под телефон.

Посему у меня возникла идея для следующего Hackathon: разработать (для начала) библиотеку работы с графикой и реализовать единый интерфейс для всех трёх платформ.

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

Неожиданно

В процессе изучения Kotlin я нашёл следующую проблему:
  open class Super(val value: Int) {
      constructor(value: Super) : this(value.value)
  }
  class Sub(value: Int) : Super(value) {
      constructor(value: Sub) : super(value)
  }
Наследник не компилируется, сообщая, что нельзя использовать super в данном контексте, а надо использовать this. Покурив документацию, я всё-таки написал требуемую мне иерархию:
  class SubOK : Super {
      constructor(value: Int) : super(value)
      constructor(value: SubOK) : super(value)
  }
Это не лишено некоторой логики: если определяется конструктор по-умолчанию, то остальные конструкторы должны использовать только его. Во втором случае у класса SubOK нет конструктора по-умолчанию, а оба конструктора равноправны. Но на мой взгляд, логика достаточно спорная, да и добавляет лишнюю строку кода.

PS. Коллеги подсказывают, что похожее поведение у Scala.

суббота, 11 июля 2015 г.

Герой или нет

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

Сказка — ложь, да в ней намек, Добрым молодцам урок!

Nightwish


Оказывается, что у Nightwish уже третья вокалистка. Мне стало не интересно следить за ними после ухода Тарьи. Хотя, нынешняя поёт, вроде, нормально - мне нравится больше, чем предыдущая. Правда, обоим им до Тарьи, как до Луны...

Kotlin @ Hackathon

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

Первые часов 20 прошли очень результативно, после чего пришлось пойти поспать в комнату отдыха. После обеда работа шла медленно и печально, поэтому я решил поехать домой и выспаться. Сегодня с утра полировал код и пытался найти ошибку в алгоритме подсчёта очков, из-за которой он долго думает, но плохо играет. Ещё не успел портировать Пашкин код.

Язык Kotlin мне понравился. Подобно JavaFX он сильно уменьшает количество boilerplate кода. С другой стороны, код становится плотным и насыщенным, поэтому лучше добавлять комментарии.
  data class Player(val id: Int,
                        name: String?,
                    val solver: Solver? = null) {
      val name = solver?.name ?: name ?: "Player ${id + 1}"
  }
Например, код выше является описанием класса с тремя readonly свойствами id, name и solver, для поддержки которых генерятся методы equals и hashCode.

Конструктор по-умолчанию имеет два обязательных и один опциональный параметр со значением null по умолчанию. String? означает, что параметр типа String может принимать значение null.

Свойство name задаётся не напрямую через конструктор, а на основе выражения, в котором присутствует куча проверок на null. Сначала мы спрашиваем имя solver?.name, которое вернёт null, если сам solver тоже null.

Потом идёт так называемый elvis-оператор, который возвращает левую часть, если она не null, иначе возвращает правую.

Тип свойства name напрямую не задан, а определяется из выражения. С учётом всех проверок на null, типом оказывается String, а не String?, как у соответствующего параметра.

Методы так и подмывает писать однострочными:
  fun count(id: Int) = cells.values().filter { it == id }.size()
Да, λямбды поддерживаются. Кстати, тип объекта внутри if определяется автоматически, если в if этот тип проверялся.

Поддержка range сделана простой и оптимальной в коде:
  x in 1..width && y in 1..height
Кроме того, мне очень понравились функции расширения. Обычно в Java заводят вспомогательный класс с набором статических методов, а тут можно написать следующим образом:
  fun JComponent.getInnerBounds(): Rectangle {
      val bounds = Rectangle(getWidth(), getHeight())
      val insets = getInsets()
      if (insets != null) {
          bounds.x += insets.left
          bounds.y += insets.top
          bounds.width -= insets.left + insets.right
          bounds.height -= insets.top + insets.bottom
      }
      return bounds
  }
После чего можно использовать этот метод, будто он объявлен в классе JComponent. В целом, поддержка Java отличная.

В общем, интересный опыт. Теперь надо готовить презентацию.

Вписался

И зачем я только домой ездил на ночёвку?

Утром пошёл на работу - в Рыбацком отличная погода, а на Невском дождь. Почему на Невском, вы спросите? А потому, что Василеостровскую на год сегодня закрыли.

Бесплатных автобусов на время ремонта не будет, придётся пользоваться общественным транспортом.

вторник, 7 июля 2015 г.

Helloween

Нашёл тут что-то новенькое от давно забытой группы: