вторник, 10 мая 2016 г.

Gson: Deserialization of Generic Types

Let's imagine that we are developing a wrapper library for an API, which returns JSON documents as a response. And there are many endpoints that have similar structures, except some fragment and may have a different structure.

Continue reading...

суббота, 25 октября 2014 г.

Кашин в голове: Беда русской либеральной интеллигенции

В конце сентября 2014 года в одной из библиотек Санкт-Петербурга произошла дискуссия между корифеем русской журналистики, маэстро едкого и бессовестного троллинга Александром Невзоровым и политическим журналистом, интеллигентом и большим любителем русской литературы Олегом Кашиным.
Темой для дискуссии послужил вброс А. Невзорова на тему того, что, дескать, срок действия русской литературы давно истек, и вообще, чтобы интеллектуально развиваться, нужно читать только научную или, как снисходительно разрешил Александр Глебович, научно-популярную литературу. Кашин, как человек возвышенный и утонченный, очевидно, не смог с этим согласиться и решил Невзорову публично возразить.
Continue reading...

понедельник, 20 октября 2014 г.

Conway’s Game of Life and Tegmark’s Mathematical Universe Hypothesis

New Era of Philosophy

The Game of Life, devised by British mathematician J. H. Conway, is familiar to many people. It represents some sort of universe governed by very simple rules. First of all, it is a grid with cells each of which could be either live or dead. And there are four rules to manage states of the cells:
  1. Under-population: if the live cell have fewer than two living neighbors, it becomes dead
  2. Stability: any live cell with 2 or 3 living neighbors, remains live.
  3. Overcrowding: live cell with more than 3 neighbors dies
  4. Reproduction: any dead cell which has exactly 3 living neighbors, become alive.
And that’s it. Amazingly, this decent set of trivial rules can lead to much more complicated patterns, like glider guns, which can be seen here, for example:
Continue reading...

среда, 20 ноября 2013 г.

Folding@home

"Help Stanford University scientists studying Alzheimer's, Huntington's, Parkinson's, and many cancers by simply running a piece of software on your computer.

The problems we are trying to solve require so many calculations, we ask people to donate their unused computer power to crunch some of the numbers."

http://folding.stanford.edu

понедельник, 21 января 2013 г.

Аббревиатура на все случаи жизни

В одной из последних лекций на образовательном ресурсе Coursera проф. Тим Рафгарден поведал о любопытном факте. Когда математики и программисты второй половины XX века думали о том, как назвать те задачи, которые мы привыкли именовать NP-полными, среди прочих был предложен следующий вариант - английская аббревиатура PET. Вариант, как видим, не прижился, однако достоин упоминания вследствие лингвистической находчивости авторов.

В чем же эта находчивость проявляется?
Как известно, доказательство неравенства классов P и NP еще не получено, и поэтому нельзя аргументированно заявлять о том, что эти задачи можно решить только экспоненциально. Поэтому PET можно расшифровать как "probably exponential time".

Но прогресс не стоит на месте и когда-нибудь это доказательство может быть получено. Тогда аббревиатура останется прежней, поменяется лишь расшифровка - "provably exponential time". Теперь давайте представим что дед мороз существует и P = NP. И даже в этом случае аббревиатуру не пришлось бы менять - задачи стали бы называть "previously exponential time".

Привычный  нам термин NP-сomplete, впрочем, тоже не является уязвимым к разным разгадкам этой мировой загадки.

понедельник, 19 ноября 2012 г.

Декларативное и императивное программирование


Вступление
Допустим, наше приложение тем или иным образом хранит информацию о странах и городах мира. Предположим, что нам нужно вывести все города, начинающиеся на букву "V", расположенные в странах, которые начинаются на "R". Представим, что программа написана на Java без использования СУБД, и данные хранятся в обыкновенных коллекциях. Тогда код получения требуемых городов может иметь вид:

for(Country country : countryList){
            if(country.getName().startsWith("R"))
                for(City city:country.getCityList())
                    if(city.getName().startsWith("V")){
                        //что-то делаем с городом
                    }
        }

Теперь пусть приложение использует СУБД, к примеру, Oracle. Теперь данные можно извлечь посредством простого запроса:

select ctr.name country_name, c.name city_name, c.city_id
            from countries ctr, cities c
        where 1=1
              and c.country_id = ctr.country_id
              and ctr.name like 'R%'
              and c.name like 'V%'

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

четверг, 15 ноября 2012 г.

Немного о временных таблицах

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

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

Привыкнув к такому положению вещей, очень легко упустить одну важную деталь.