Monsieur & Madame Adelman

Victor et moi c’est tout une histoire.

Пожалуй, каждому из нас приходилось хотя бы однажды, глубоко внутри, пугаясь собственных мыслей, сомневаться в сделанном когда-то выборе. С тем ли человеком связали мы свою жизнь? На того ли тратим лучшие годы? Могли ли мы быть счастливее в одиночестве или с иным избранником? Это нормально, разумному человеку свойственна рефлексия, к ней даже стоит прислушиваться, если только она не переливается через край и не приводит к навязчивым состояниям. Но при этом не стоит забывать, что любовь, как и история, сослагательного наклонения не приемлет, а лучшее всегда враг хорошего, что, собственно, в очередной раз изящно и по-французски элегантно демонстрирует дебютная режиссерская работа Николя Бедоса «Он и Она» – вот где любовь во всех ее проявлениях.
https://www.film.ru/articles/sluzhitel-muzy

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

Этот фильм гениальный. Сложные диалоги, ирония, динамизм, повороты. Картина захватывает с первых кадров и не отпускает уже до конца. Но что же такого особенного, в этой любовной истории? Режиссер мастерски показывает все стадии жизни пары. Виктор и Сара проходят вместе все – интерес, страсть, известность, измены, неуверенность, падение. Но не смотря ни на какие жизненные обстоятельства, сильная взаимная любовь, граничащая иногда с безумием, побеждает.

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

Фильм оставляет очень приятное ощущение. Все будет хорошо, несмотря ни на что. Посмотрите, не пожалеете.

On y va?

Особенности обновления MATERIALIZED VIEW

Рассматривая вопрос обновления материальных представлений обнаружил некоторые особенности. Первое это то, что запрос который мы передаем на создание матвью может быть изменен системой. В частности оператор ORDER BY для главного селекта пропадает, а для вложенных запросов нет. Приведу пример, чтобы было лучше понятно.

Создаем достаточно большую таблицу и создаем матвью.

drop table test_table purge;
CREATE TABLE TEST_TABLE
  (
    id NUMBER(10),
    X  VARCHAR2(255),
    Y  VARCHAR2(255)
  );

BEGIN
 FOR I IN 1 .. 1
 LOOP
 INSERT INTO TEST_TABLE SELECT rownum, a.object_name, a.status FROM all_objects a, holidays h;
 END LOOP;
 COMMIT;
 END;

create MATERIALIZED view MV2_test_table
 as
 select *
 from test_table
 order by 1 desc

Матвью создалась, но если посмотреть DDL запрос создания этой матвью, то мы увидим там следующее:

CREATE MATERIALIZED VIEW "DKSD"."MV2_TEST_TABLE" ("ID", "X", "Y")
  USING ENFORCED CONSTRAINTS DISABLE QUERY REWRITE
  AS
select *
from test_table

Order by исчез. Соответственно, после обновления матвью у нас данные будут в другом порядке. Слева столбец до обновления, справа — после.

Но если создать матвью со следующим запросом, то тогда ORDER BY не пропадает.

create MATERIALIZED view MV2_test_table
as
select * from (
select *
from test_table
order by 1 desc
)

Здесь необходимо сказать, что применять оператор ORDER BY для создания представления не очень хорошая идея. Лучше полагаться на индексы и грамотно построенные запросы, чем на то как данные физически лежат.

Второе, хотел бы обратить внимание на параметр ATOMIC_REFRESH, который содержит функция обновления материализованных представлений DBMS_MVIEW.REFRESH. Дело в том, что скорость обновления таблицы сильно зависит от того стоит этот параметр в значении TRUE или FALSE. По-умолчанию в последних версиях Oracle эта функция выполняется с параметром TRUE и это, как правило, занимает больше времени.

Объяснение такому поведению нашел на сайте http://kubilaykara.blogspot.ru/2010/04/materialized-view-refresh-and.html Оказывается, параметр TRUE вызывает оператор DELETE для удаления данных старой матвью, в то время как FALSE вызывает более экономный для процессора оператор TRUNCATE.

Я повторил эксперимент, который описан по ссылке выше, и вот что у меня получилось. Итак, в созданной таблице test_table более миллиона строк. Создаем новое представление.

CREATE materialized VIEW mv_TEST_TABLE
AS
SELECT * FROM TEST_TABLE;

Теперь произведем некоторые изменения с основной таблицей.

UPDATE TEST_TABLE SET Y='1';
COMMIT;

Запускаем обновление

BEGIN
  DBMS_MVIEW.REFRESH('mv_TEST_TABLE','C',ATOMIC_REFRESH => TRUE);
END;

Запрос выполнен за 54,270 сек.

Снова обновляем данные и запускаем обновление с параметром ATOMIC_REFRESH => FALSE

UPDATE TEST_TABLE SET Y=2';
COMMIT; 

BEGIN
 DBMS_MVIEW.REFRESH('mv_TEST_TABLE','C',ATOMIC_REFRESH => FALSE);
END;

Обновление заняло 2,782 сек.

Конечно, прирост производительности в 20 раз это особенности моего тестового стенда. На реальных серверах и очень больших матвью вряд ли это возможно, но следует держать в уме возможность повышения скорости обновления установлением параметра ATOMIC_REFRESH в значение FALSE.

Спряжение глаголов

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

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

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

В других языках времен плюс-минус столько же, сколько в английском, но к этому добавляются 6 форм для лиц-чисел, изменение форм по наклонениям и согласование с существительным по роду. С наклонениями бывает вообще интересная ситуация. Например, в турецком есть повелительное наклонение для третьего лица, как единственного так и множественного числа. Попробуйте прикажите кому-нибудь в третьем лице. Во французском есть Subjuncitve, который также не имеет аналогов в русском языке. Запомнить все формы глаголов очень трудно и доставляет множество проблем начинающим. А если форм спряжения бывает несколько? А если еще имеются сотни исключений?

Здесь поможет сервис Verbix, где можно посмотреть все спряжения глаголов. Поддерживается множество языков, можно узнать является ли форма исключением. Дополнительно на сайте есть возможность потренировать свои навыки спряжения, изучить лингвистические карты. Забавно, что на русском языке согласно сайту http://www.verbix.com/maps/language/Russian.html говорят в Китае, и не говорят в Белоруссии.

Но свое дело сервис делает на отлично. Незаменимая вещь для всех, кто увлекается иностранными языками.

Ori and the Will of the Wisps. Trailer

В 2016 году вышла потрясающая игра Ori and blind forest, которая вывела жанр платформеров на новый графический уровень. Но не только графика была в игре хороша. Сам игровой процесс очень приятный и постоянно удивляет. А эмоциональная история жизни Ори вряд ли кого-то могла оставить равнодушным. Как же приятно узнать, что готовится продолжение этой замечательной игры.

Трейлер, представленный на Е3, за две минуты вызывает эмоций больше чем иной фильм. Перед просмотром ролика предупреждаю, самый популярный коммент у видео — «Ori and the Instant Tears».

Количество рабочих дней с учетом праздников

Рассмотрим следующую задачку: «Написать SQL-запрос подсчитывающий количество рабочих дней между двумя датами учитывая все праздничные, выходные дни и их переносы”.

Без учета праздников эта задачка не представляет никаких трудностей. Просто подсчитываем количество дней, где день недели не равен СБ или ВС:

select count(*)
from (select to_date('01.01.2017','dd.mm.yyyy')+rownum dat,
to_char(to_date('01.01.2017','dd.mm.yyyy')+rownum,'DY') dy
from sys.all_objects)
where dat<=to_date('31.12.2017','dd.mm.yyyy') and dy not in('СБ','ВС')

Получаем 260 дней.

В стандартном пакете Oracle, да и наверное во всех других базах данных, отсутствуют сведения о праздничных днях в России. Значит их нужно откуда-нибудь взять. Будем вытаскивать выходные из производственного календаря системы Консультант плюс. Актуальный календарь на текущий год располагается по адресу http://www.consultant.ru/law/ref/calendar/proizvodstvennye/

Рассмотрим только текущий 2017 год. Парсить html страницу будем в java с помощью библиотеки jsoup (https://jsoup.org/). Для начала проинспектируем наш календарь.

Видим, что месяц заключен в таблицу, которой проставлен класс “month-block”. Именно по этому признаку и будем выделять необходимые тэги. Далее нужно определить какие дни у нас праздничные, а какие рабочие.

Инспектор html кода показал, что дни бывают трех классов: inactively, holiday weekend, work. Мы будем брать только те значения тэгов, у которых выставлен класс которому соответствуют праздничные дни.

Здесь я должен сделать небольшой дисклэймер. Мое творение не является образцом хорошего кодинга на java. В нем совсем не используются возможности объектно-ориентированного программирования, вся программа написана в одном методе main. Это очень плохо. Пока я не особо умею писать по-другому, но все впереди, я только учусь.

Также пока не подобрал хороший плагин для wordpress для отображения кода. Если стандартные тэги Code для SQL еще более-менее смотрятся, то вот java код практически не читабелен. Постараюсь со временем переделать соответствующие блоки.

Итак, можно приступить к программированию. Вот что у меня получилось.

public class ParseConsultant{
public static void main(String args[]) throws IOException, SQLException {
List monthsList = new ArrayList<>(); //сюда поместим все блоки всех месяцев
List daysList = new ArrayList<>(); //сюда поместим блоки с днями
Document doc = Jsoup.connect("http://www.consultant.ru/law/ref/calendar/proizvodstvennye/").get(); //коннекстимся к источнику
Elements monthsElements = doc.getElementsByAttributeValue("class", "month-block"); //добавляем элементы-месяцы
monthsElements.forEach(monthsElement -> {
String aElement = monthsElement.child(0).toString(); //выбираем все содержимаое месяца
monthsList.add(aElement);
});
Locale.setDefault(Locale.ENGLISH); //подключаемся к базе данных
String dbURL = "jdbc:oracle:thin:dksd/1@localhost:1521:XE"; //подключаемся к базе данных
Connection conn = DriverManager.getConnection(dbURL);
if (conn != null) {
System.out.println("Connected");
}
Statement statement = conn.createStatement(); //открываем statement для последующего insert
for (int x = 0; x < 12; x = x + 1) { //открываем цикл для пробега по всем 12-ти месяцам Document mon = Jsoup.parse(monthsList.get(x)); //парсим содержимое массива месяцев для выбора дней. System.out.println(mon.toString()); //смотрим что у нас в месяце Elements mElements = mon.getElementsByClass("holiday weekend"); //выбираем нужные тэги по классу mElements.forEach(mElement -> {
String dElem = mElement.text(); //получаем значение тэга, то есть праздничный день
daysList.add(dElem); //добавляем значение тэга в массив
});
int z = daysList.size(); //считаем сколько добавилось выходных дней в текущем месяце
for (int i = 0; i < z; i = i + 1) { //для каждого дня формируем insert строку
System.out.println(i + "-" + daysList.get(i)); //смотрим какие у нас выходные дни в текущем месяце
int m = x + 1; //для правильного insert месяца, который не может быть равен нулю
String insertSQL = "insert into holidays (HOLIDAY) VALUES (to_date('" + daysList.get(i) + "." + m + ".2017','dd.mm.yyyy'))";
statement.executeUpdate(insertSQL); //добавлем строки в таблицу holidays
}
daysList.clear(); //очищаем массив в конце цикла
}
}
}

Программа с помощью библиотеки jsoup коннектится к запрашиваемой странице, выбирает все блоки где имелся класс «month-block». Потом каждый блок еще раз парсится на предмет текста тэга, содержащего класс «holiday weekend». Сохраняет все в ArrayList и подставляет в строку для инсерта в базу данных.

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

Теперь модифицируем SQL запрос.

select count(*)
from (select to_date('01.01.2017','dd.mm.yyyy')+rownum dat
from sys.all_objects)
where dat<=to_date('31.12.2017','dd.mm.yyyy') and dat not in (select holiday from holidays)

Получаем 247 дней. На целых 13 дней меньше))

Путь в тысячу миль начинается с одного шага

Волею судьбы я с недавних пор являюсь программистом. У меня нет профильного образования, и в свои 27 лет написал не больше 10 программ, включая «Hello World» на VBA, HTML, Delphi, Java и PL/SQL. О чем же будет тогда этот блог?
Он будет о пути становления программиста. Такая онлайн трансляция одной моей стороны жизни в текстовом формате. Процесс обучения, интересные статьи, необычные примеры реализации, мысли о профессии. Первое время будет много моих переводов иностранных блогов, статей, выдержек из книг, которые я читаю. С опытом, надеюсь, смогу делиться уже собственными идеями.

На текущий момент в своей работе я использую PL/SQL и SQL. Очевидно, что с таким набором технологий в активе далеко не уйти. Некоторые вообще посмеются и скажут, что я позорю профессию называя себя программистом. Понятно что надо учиться.

Учиться чему? Выбор настолько широк, что не подготовленному человеку будет плохо просто от одного взгляда на список технологий из статей «Какой наилучший язык программирования для изучения в 2017 году». Вот, например, неплохая из этой серии https://www.sitepoint.com/whats-the-best-programming-language-to-learn-in-2017/. На некоторых сайтах не пугают всем многообразием мира IT: http://www.bestprogramminglanguagefor.me. Я долго не раздумывал. Мой выбор на ближайшее время – Java.

Почему Java? Для начала определил, что не хочу заниматься веб разработкой. Пока. Поэтому JavaScript отпадает. Но держим в уме знаменитое высказывание Джефа Этвуда, сооснователя Stack Overflow: «Любое приложение, которое можно написать на JavaScript, будет в итоге написано на JavaScript».

Если отбросить всякую экзотику типа Scala, Haskell, эпэловские objective C и Swift, то по сути остается выбор между Java, C++, C#. Последний – очень заманчиво. Но, все-таки, Java. Немного знаком с этим языком, будет проще на первом этапе. Также немало важно отличное взаимодействие с БД Oracle, единственной базой данных о которой я имею представление. Ну и, поговаривают, на Java можно для Android писать.

В работе буду пользоваться IDE IntelliJ IDEA. Во-первых, поддержим отечественного производителя (пусть и пользуюсь бесплатной версией). Во-вторых, беглый взгляд на мониторы моих более опытных коллег не оставляет другим IDE никакого шанса: никаких Eclipse, или тем более NetBeans и JDevelopper ни у кого не видел.

Первый шаг сделан. В добрый путь.

Something new

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

Смена работы

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

Теперь я программист в крупной российской IT компании. Я не знаю много людей, которые настолько сильно меняли профессию. Для большинства смена работы, это только смена декораций, когда они занимаются тем же самым что и раньше, но в другом месте. Изменить род деятельности это совершенно иное. You start with a clean slate. Приходится начинать все сначала, каждый день изучать новое, знакомится с новыми людьми, совершать кучу ошибок, привыкать к новой обстановке и новым правилам.

Но для меня на текущем этапе самое сложное – расстаться с мыслями о прошлой жизни. Это совсем не легко. По ощущениям похоже на то что надо оторвать что-то от себя. Болезненно и очень трудно. Теперь я понимаю приколы про новую жизнь с понедельника или нового года. Наверное, это невозможно сделать без сильного внешнего воздействия.
 
Опыт преподавания

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

За три недели эксперимента серьезный прогресс у обоих моих учеников стал очевиден. Пропал страх, появилось ощущение языка и осознание, что английский таки можно выучить. Знаете, существует распространенное заблуждение, что одни обладают способностью к языкам, а другие нет. Это полная ерунда. Просто кто-то его учит, а кто-то нет. На одном-то языке научились говорить, просто вы его учили каждый день, когда росли.

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

В тоже время сам я провалился на экзамене по французскому.

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

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

На экзамене я зашел в огромный кабинет одним из последних и сел на галерку. Пока нам раздавали материалы и черновики разговорились с соседями по парте. У всех были определенные цели, связанные с экзаменом: переезд во Францию, по работе необходимость, преподавательский интерес. А я ответил, что мне просто нечего делать дома. Не думаю что мне поверили, но как же это близко к правде. Настроя нет совершенно никакого, также как и нет желания находится в этом древнем здании, сидеть на разваливающемся стуле из 70-х годов за шатающейся партой в кабинете с сотней подростков 19-20 лет, жаждущих получить заветный сертификат.

Я ушел, не сдал последнюю часть. Сейчас я понимаю, что мне было по силам сдать эту разговорную часть и, скорее всего, я бы получил заслуженный В2. Но он мне объективно не нужен. Это была хорошая цель, чтобы развиваться в языке. Сейчас в подобной цели нет никакого смысла.
 
Best version of yourself.

Продолжаю осмысливать что означает это выражение для меня. Что делает меня лучше и сильнее? Как это происходит? Что тебя задалбывает и расстраивает? На сегодняшний день один из выводов следующий. Самое главное – не терять самоуважения. Самоуверенность — не то слово, в русском языке у него отрицательной оттенок, но именно самоуважение. Если ты сам себя не будешь ценить, уважать и принимать, как ты можешь ждать такого отношения от других?
 
На сегодня все у меня.
Я рад, что вернулся.
Скоро будут изменения в блоге.