Oracle Cloud Day 2017 Moscow

В Москве 26 октября прошла конференция Oracle Cloud Day 2017.

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

Наиболее интересными мне показались примеры внедрения, осуществленных компаниями Ашан и Мегафон. Кирилл Бойко, представитель Ашана, рассказал об использовании on-premis решения exadata, и отметил чрезвычайно высокую скорость работы этого решения. Мария Трофимова из Мегафона поделилась опытом интеграции ЦОД из восьми филиалов в одном месте. Также она отметила потенциал использования технологии Oracle Big Data SQL, когда к традиционной реляционной БД добавляется Hadoop кластер, к которому также идет обращение при отправке SQL-запросов на сервер.

Программа конференции была в некоторой степени скорректирована, с учетом прошедшей три недели назад Oracle Open World. В частности сделали презентацию новых фич готовящейся к релизу версии базы данных 18с. Из интересных нововведений хотел бы обозначить две. Первое – полиморфные табличные функции. Теперь для возврата данных в табличном виде их не обязательно строго определять в самой функции. Количество колонок, тип данных – все это можно динамически менять путем, например, передачи параметров при вызове функции. Соответственно, в новой версии можно будет избежать дублирования кода в случаях, когда необходимо получать различные таблицы при исполнении функции.

Второе – Stored Procedure Multilingual Engine. Новый движок для разных языков программирования, на основе GraalVM. Поддерживается JavaScript, ожидается поддержка Python, Ruby, R. На слайдах показали пример компиляции процедуры на JS, которая печатает ‘Hello’ и Trace. Впоследствии эту процедуру можно вызывать уже непосредственно из SQL-Plus. Так что, принимая во внимание стабильно растущую популярность JavaScript, этой технологии определенно стоит уделить внимание. Хотя хоронить PL-SQL, конечно, не стоит.

И еще один очень хороший анонс был сделан в конце конференции. Бесплатная версия базы данных Oracle XE также получит обновление, но не до предыдущей версии 12c, как оно обычно происходило, а сразу до актуальной версии 18с. Релиз обещают чуть позже в течение 2018 года, и в дистрибутив будет включено множество раньше недоступного для бесплатной версии функционала. В частности упомянули о партиционировании (хотя при ограничении размера табличного пространства в 12 Gb говорить о значительной пользе партиционирования не приходится).

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

Stanford Algorithms

Блуждая по просторам сети наткнулся на замечательный блог http://larrr.com/

Автор написала множество статей о том, как проходить собеседования в топ IT компании. Больше всего мне понравился собранный в одном файле InterviewPreparationGuide http://larrr.com/hochu-rabotat-v-google-manual-gotov/
Это действительно тот роудмап для программиста мечтающего устроится на работу в топ компанию. Взял его на вооружение и буду применять в своем обучении.

Поэтому, будем основательно осваивать новую профессию (насколько это вообще с программированием возможно). Начал я с алгоритмов, конкретно со стэнфордских курсов на coursera.org. С тех пор как я тут был последний раз, этот крупнейший MOOC портал значительно преобразился. Большинство курсов теперь платные (раньше учеба была бесплатной, купить можно было только подтверждающий сертификат), отдельных курсов практически не осталось – теперь все входит в состав специализаций. Еще одно значительное изменение – изменилась периодичность. Если 4-5 лет назад каждый курс был как праздник, сессии стартовали 1-2 раза в год, то сейчас все на рельсах, присоединиться можно в любой момент, форум де-факто мертвый. Представьте, если бы в ВУЗ можно было бы поступить в любой момент года? Скучно же было бы. Ну и тут что-то похожее.

Итак, специализация Algorithms, состоит из 4-х курсов по 4 недели. Уже прошел два курса из четырех за 5 недель. Изучил асимптотическую сложность, мастер метод, разобрал основные алгоритмы: Merge sort, Quick sort, BFS, DFS. Познакомился со структурами данных Heap, Tree, HashTable, Bloom Filter. Материал достаточно сложный, приходится много читать дополнительно. Не всегда до конца понятны доказательства теорем, по математике я проседаю прилично. Задания в конце каждой недели тоже не простые, но со второй попытки проходятся на 100%. Финальные экзамены оказались совсем простыми, потому что вопросы только по материалам из видео лекций.

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

Поделиться своим решением задач в репозитории – отличный повод завести аккаунт на github, не так ли? Поэтому, если кто-то также проходит курс и столкнулся с проблемой в решении задачек на алгоритмы https://github.com/DKARAGODIN/StanfordAlgorithms

Ну и как не выложить сертификаты? Попотеть ради них таки пришлось.

Установка Oracle XE 11g на Ubuntu 16.04LTS

По работе столкнулся с необходимостью ознакомится с основными командами на Linux. В процессе изучения bash решил на домашней машине переехать с базой данных и с IDE на Ubuntu. С установкой самой операционной системы никаких проблем не возникает, вопросы начали появляться, когда настала очередь базы данных.

На домашних стендах я использую Oracle XE 11g . Установка базы данных на Linux не настолько простой и приятный процесс, как на Windows. Подробную инструкцию для версии Ubuntu 12.04LTS я нашел здесь и выполнил все операции пошагово. Не смотря на то что некоторые параметры не отображались как задумано в инструкции (например fs.file-max), БД установилась. Также у меня не возникло необходимости увеличивать размер swap.

Решил сохранить инструкцию у себя:

Скачать Oracle XE 11g можно по ссылке (требует бесплатного аккаунта)
http://www.oracle.com/technetwork/products/express-edition/downloads/index.html

Распаковываем скачанный файл:

unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip

Производим дополнительную установку:

sudo apt-get install alien libaio1 unixodbc vim

Установщик Oracle XE 11g от Red Hat зависит от файла /sbin/chkconfig, который не используется в Ubuntu. Пакет chkconfig доступный для текущей версии Ubuntu вызывает ошибки и может быть небезопасно использовать. Поэтому нужно будет создать специальный chkconfig скрипт, который поможет обойти эту проблему и позволит установить Oracle XE.

sudo vi /sbin/chkconfig

Вставляем следующий текст в файл:

#!/bin/bash
# Oracle 11gR2 XE installer chkconfig hack for Ubuntu
file=/etc/init.d/oracle-xe
if [[ ! `tail -n1 $file | grep INIT` ]]; then
echo >> $file
echo '### BEGIN INIT INFO' >> $file
echo '# Provides: OracleXE' >> $file
echo '# Required-Start: $remote_fs $syslog' >> $file
echo '# Required-Stop: $remote_fs $syslog' >> $file
echo '# Default-Start: 2 3 4 5' >> $file
echo '# Default-Stop: 0 1 6' >> $file
echo '# Short-Description: Oracle 11g Express Edition' >> $file
echo '### END INIT INFO' >> $file
fi
update-rc.d oracle-xe defaults 80 01
#EOF

Чтобы выйти с сохранением из редактора VI нужно набрать :wq

Добавляем необходимые привилегии на запуск:

chmod 755 /sbin/chkconfig

(у меня сработало только sudo chmod 755 /sbin/chkconfig)

Для установки Oracle XE необходимы следующие параметры ядра:

sudo vi /etc/sysctl.d/60-oracle.conf 

Вставляем следующий текст в файл:

# Oracle 11g XE kernel parameters
fs.file-max=6815744
net.ipv4.ip_local_port_range=9000 65000
kernel.sem=250 32000 100 128
kernel.shmmax=536870912 

Сохраняем.
Загружаем новые параметры ядра:

sudo service procps start 

Проверяем (у меня правильно начало отображаться только после перезагрузки, тем не установка завершилась нормально)

sudo sysctl -q fs.file-max
 -> fs.file-max = 6815744

Некоторые необходимые изменения:

sudo ln -s /usr/bin/awk /bin/awk
sudo mkdir -p /var/lock/subsys
sudo touch /var/lock/subsys/listener 

Конвертируем red-hat ( rpm ) пакет в Ubuntu-пакет (может занять некоторое время) :

sudo alien --scripts -d oracle-xe-11.2.0-1.0.x86_64.rpm

Дальше распаковываем Ubuntu-пакет:

sudo dpkg --install oracle-xe_11.2.0-2_amd64.deb 

Выполняем следующие команды, чтобы избежать MEMORY TARGET ошибки (ORA-00845: MEMORY_TARGET) :

sudo rm -rf /dev/shm
sudo mkdir /dev/shm
sudo mount -t tmpfs shmfs -o size=2048m /dev/shm

(я оставил 2048, хотя размер оперативной памяти для виртуалки у меня 3GB)

Далее создаем файл с именем S01shm_load в папке /etc/rc2.d :

sudo vi /etc/rc2.d/S01shm_load

Сохраняем в файл следующий текст:

#!/bin/sh
case "$1" in
start) mkdir /var/lock/subsys 2>/dev/null
touch /var/lock/subsys/listener
rm /dev/shm 2>/dev/null
mkdir /dev/shm 2>/dev/null
mount -t tmpfs shmfs -o size=2048m /dev/shm ;;
*) echo error
exit 1 ;;
esac 

Сохраняем файл и даем привилегии

chmod 755 /etc/rc2.d/S01shm_load

Так вы обеспечите себе работающую БД при каждом запуске операционной системы.
Инициализируем Oracle и следуем подсказкам:

 sudo /etc/init.d/oracle-xe configure

Также полезно добавить следующие строки в конец файла /etc/bash.bashrc :

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
export ORACLE_SID=XE
export NLS_LANG=`$ORACLE_HOME/bin/nls_lang.sh`
export ORACLE_BASE=/u01/app/oracle
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH

Выполняем чтобы применить эти настройки:

source /etc/bash.bashrc

Запускаем БД:

sudo service oracle-xe start

Все, можно работать.

Idea 2017.2. Дебаггинг: фильтрация коллекций.

Последнее обновление IDE IntelliJ IDEA 2017.2 содержит отличный инструмент, который поможет избавится от багов в ваших приложениях, содержащих коллекции. Сейчас многие программы обрабатывают значительные объемы информации и в текущим релизе сотрудниками JetBrains в их продукт добавлена возможность фильтрации массивов и коллекций.

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

Работает эта штука следующим образом. В программе я создал 2 ArrayList со значениями Integer и String. Запустил программу в режиме дебага. Находим нашу коллекцию, жмем правой кнопкой и в меню выбираем «Filter…». В появившемся поле набираем ключевое слово this. и один из доступных методов. Вот, например, я выбрал все элементы ArrayList содержащего “ww”.

Пример сравнения числовых значений. Выборка элементов больше 50 и меньше 100.

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

Сколько ты стоишь?

Перевод с сайта yegor256.com. Оригинал статьи на английском.

________________________

Я получаю несколько писем каждый день от программистов заинтересованных работать с teamed.io удаленно. Первый вопрос, который я обычно задаю это «Какая твоя почасовая ставка?» (мы платим по часам). Меня удивляет как часто люди некорректно оценивают себя как в большую так и в меньшую сторону.

Мне называют различные цифры, от 5 до 500$ в час. Я никогда не говорю нет, но обычно прихожу к своей оценке часовой ставки. Эта статья объясняет какие факторы я рассматриваю а какие нет. Это мои персональные критерии, не принимайте их как профессиональный стандарт. Мне они кажутся объективными и логичными.

Вклад в проекты с открытым исходным кодом.

badge

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

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

Вторая возможная причина, это ты работаешь с девяти до пяти за еду, без страсти. На самом деле в этом никто не сознается. Я часто слышу что-то вроде «моя компания не платит мне за вклад в open source проекты, а дома я хочу проводить время со своей семьей». В современной разработке ПО, большинство кода, с которым мы работаем, является открытым – библиотеки, фрэймворки, инструменты и прочее. Почти все что ты используешь в твоем коммерческом проекте — это open source. Платя тебе зарплату твой работодатель уже осуществил вклад в продукты с открытым кодом, потому что ты активно их используешь. Проблема в том, что ты при этом не заинтересован быть более активным и делать свой вклад в open source проекты. Я вижу это как недостаток страсти и мотивации. Будешь ли ты эффективным разработчиком в наших проектах? Вряд ли, потому что наша система менеджмента опирается на само-мотивацию.

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

Поэтому, если твой GitHub аккант пуст и твое CV не содержит строчки «активно участвую в развитии ядра Linux» (а почему бы и нет?), я моментально теряю интерес. С другой стороны, когда я вижу 100+ звездочный проект на твоем GitHub, я воодушевляюсь и готов предложить большую оплату.

Месторасположение

Распространенная практика платить больше тем, кто живет в более дорогих странах. Когда я получаю резюме из Сан-Франциско, запрашиваемые ставки составляют $70+ в час. Те же самые навыки и опыт стоит $15-20 для Карачи. Причина – стоимость жизни в США значительно выше, чем в Пакистане.

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

Хочешь платить $30 за ланч? Стань лучше как разработчик. До тех пор, покупай хот дог за пару баксов. Просто фраза «Я уже здесь и мой ланч стоит $30» — не аргумент.

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

Репутация на StackOverflow.com

Мы все знаем, что на StackOverflow очень мало людей, даже удивительно мало людей, которые активно вносят в него свой вклад. Если твой профиль пустой (или если у тебя его нет), тогда понятно, что у тебя 1) нет вопросов чтобы задавать, 2) тебе нечего отвечать.

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

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

Я часто слышу, что люди решают большинство их проблем, задавая вопросы коллегам, сидящим рядом с ними в офисе. Они говорят, StackOverflow им просто не нужен (или другие похожие ресурсы, если они существуют), потому что их команда так хороша, что всегда можно получить ответ на любой вопрос. Это хорошо для команды, но плохо для тебя. Почему? У тебя нет важного навыка – нахождение ответа в публичном Интернете. В наших проектах мы не поощряем любые горизонтальные коммуникации между программистами, и ты не сможешь получить помощь ни от кого. Ты будешь сам по себе и ты провалишься, потому что ты привык получать помощь от старших в своем офисе.

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

Стаж работы

badge

«Я писал на Java 10 лет!» — и что? Это число значит только одну вещь для меня – ты сумел выжить в каком-то офисе в течение 10-ти лет. Или может быть в нескольких офисах. Ты убедил кого-то, что он должен платить тебе за твои 10 лет проведенных в его здании. Значит ли это, что ты писал что-то полезное? Значит ли это, что твой код был идеальным? Ни первое, ни второе.

Стаж работы это ложный индикатор. Это даже может сыграть против тебя, в комбинации с другими индикаторами, обозначенными выше. Если твое CV говорит, что ты только начал программировать 2 года назад и твой GitHub и StackOverflow аккаунты пустые – есть возможность что ты исправишься. Ты просто в начале своей карьеры. Однако, если твое CV говорит что ты «10-ти летний системный архитектор» с нулевым вкладом в открытые проекты — это значит что ты или лжёшь о 10-ти годах или ты абсолютно бесполезен как архитектор.

Моя точка зрения такова, что «опыт работы», как аргумент, должен быть использован очень аккуратно. Разыгрывай эту карту, только если у тебя есть другие достоинства. В противном
случае, держи это при себе.

Сертификаты.

Oracle, Zend, Amazon, IBM, MySQL и прочие – вот о каких сертификатах я говорю. Чтобы получить их ты должен пройти экзамен. Не легкий, и не онлайн. Это реальный экзамен, который сдается в сертификационных центрах, где ты будешь сидеть за компьютером, в условиях ограниченного времени, без книг или доступа к Интернету и будешь отвечать на вопросы. Достаточно унизительно для такого уважаемого разработчика? Ага. И также очень высока вероятность провалится, что тоже достаточно неловко.

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

Первая, ты боишься провала. Серьезная сертификация может стоить несколько сотен долларов (я платил более $700 за SCEA) и ты не получишь их назад если провалишься. Если ты боишься проиграть, ты боишься сражаться. Это значит, что ты струсишь в реальных ситуациях, когда надо решать реальные проблемы.

Второе, ты не инвестируешь в себя. Это скорее всего значит что ты не хочешь менять компании и предпочитаешь найти уютный офис, где ты бы мог сидеть вечно. Я помню однажды сказал своему другу – «Ты значительно улучшишь свое CV, если получишь этот сертификат». Он ответил с улыбкой – «Я надеюсь, что мне не понадобится CV. Мне нравится эта компания». Этот подход хорош для компании, на которую ты работаешь, но это точно работает против тебя.

Исходя из моего опыта, лучшие командные игроки это те, кто работают на себя. Здоровый индивидуализм это ключевой фактор. Если твоя главная цель это получать что-то для себя (деньги, репутацию, навыки, знания) – ты будешь очень эффективен в наших проектах. Наличие сертификатов в твоем профиле это индикатор того самого здорового индивидуализма, который мы ищем.

Разнообразие навыков.

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

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

Таким образом, когда я слышу, что ты имеешь опыт в MySQL, PostgreSQL, Oracle и SQLite, я понимаю, что ты знаешь о базах данных очень мало.

Выступления и Публикации

badge

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

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

Кроме того, если ты пишешь и выкладываешь результаты труда регулярно, у тебя уже есть важный навык/талант – ты можешь представлять свои идеи в «удобоваримом» формате. В наших проектах мы не поощряем неформальные связи и используем систему тикетов. В этих тикетах ты будешь объяснять свои идеи, вопросы и соображения так, чтобы остальные смогли бы тебя понять. Без навыков представления идей, ты не сможешь выжить в проекте.

Кстати, некоторые разработчики даже патенты подают на свои имена – почему ты этого не сделал? Или может быть опубликовать книгу? Почему нет?

Предыдущее место работы

Я обычно не обращаю большое внимание на этот раздел твоего CV. Наша модель управления настолько отличается от всего, что ты мог где-либо видеть, что это не имеет никакого значения сколько раз тебя увольняли или как высок был твой пост в твоей компании. Даже если твоя должность «Технический директор Twitter» — это ничего не значит для меня.

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

Я более заинтересован в том «Что ты делал» в последние годы, чем «Где ты делал» это или «Как тебя называли» пока ты этим занимался.

Образование

BSc, MSc, PhD.. важно ли это? Не думаю. Образование очень схоже с «Предыдущим местом работы», обозначенным выше. Не так уж и важно где ты провел пять лет после школы. Важно что ты делал в это время. Если тебе нечего сказать о своей активности в студенческие годы, тогда что мне скажет название твоего ВУЗа?

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

Оплата

$100+ в час мы с радостью платим эксперту который владеет несколькими продуктами с открытым исходным кодом, имеет рейтинг на StackOverflow более 20к, имеет сертификаты, статьи, презентации или даже патенты.

$50+ мы платим профессиональному программисту, владеющему проектом с открытым исходным кодом или является активным участником такого проекта, имеющему рейтинг на StackOverflow больше 5к, пишущему о разработке ПО, владеющему сертификатами.

$30+ мы платим программисту регулярно вносящему вклад в проекты с открытым исходным кодом, имеющему активность на StackOverflow, с несколькими сертификатами.

$15+ мы платим всем остальным.

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

Я пишу эту статью, главным образом, чтобы замотивировать тебя на рост.

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

Кстати, иллюстрации к посту созданы Andreea Mironiuc.

https://www.youtube.com/watch?v=GS45LzE3LPQ

Парсинг XML по атрибутам

В примере про количество рабочих дней с учетом праздников мы парсили HTML код по атрибутам. Для получения содержимого необходимых тэгов использовали методы getElementsByAttributeValue и getElementsByClass сторонней библиотеки JSOUP.

Для парсинга XML текста , в отличие от HTML, традиционно применяют библиотеки, которые входят в стандартные поставки JDK. Для чтения, как правило, применяют DOM. Но столкнувшись с необходимостью чтения XML документа по значению атрибутов не обнаружил в этом пакете аналогов таких удобных методов, которыми я пользовался при парсинге HTML. Если с getElementsByClass еще это объяснимо, все таки class очень распространенный атрибут в HTML который не часто встретишь в XML, то getElementsByAttributeValue действительно не хватает.

Итак задачка. У нас есть великолепный XML файл, в котором все записано только с помощью одного тэга – parameter. Отличить что есть что можно только по значению атрибута «name» которое бывает или «variable» или «calculator».

<parameter type="Map">
<parameter name="variable">var1</parameter>
<parameter name="calculator">calc1</parameter>
<parameter name="variable">var2</parameter>
<parameter name="calculator">calc2</parameter>
</parameter>

Для начала стандартное создание объекта тип Document из XML файла. Считываем все тэги parameter и помещаем их в NodeLest. Получается несколько избыточно, поскольку видим, что первый тэг с type=”Map” структурно включает 4 других тэга parameter, но ничего лучше не придумал.

DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = f.newDocumentBuilder();
Document doc = builder.parse(new File("src/file.xml"));
doc.normalizeDocument();
NodeList nNodes = doc.getElementsByTagName("parameter");

Теперь нужно пробежаться по ним. Запускаем цикл в котором вытаскиваем одну ноду, считываем все аттрибуты в переменную NameNodeMap attributes. Вытаскиваем значением атрибута “name” и кладем в ноду attr. Далее идет блок оператора if, которым мы проверяем значение атрибута и если оно нас устривает, то вытаскиваем текст тэга из ноды методом getTextContent.

for (int j = 0; j < nNodes.getLength(); j++){
Node nNode = nNodes.item(j);
NamedNodeMap attributes = nNode.getAttributes();
Node attr = attributes.getNamedItem("name");
if (attr != null) {
if (attr.getTextContent().equals("variable")) {
String s = nNode.getTextContent();
System.out.println(j + ", " + s);
} else if (attr.getTextContent().equals("calculator")) {
String s = nNode.getTextContent();
System.out.println(j + ", " + s);
}
}
}

Output:
1, var1
2, calc1
3, var2
4, calc2

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

<parameter type="Map">
<parameter type="Maps">
<parameter type="MoreMaps">
<parameter name="variable">var1</parameter>
<parameter name="calculator">calc1</parameter>
</parameter>
</parameter>
</parameter>

Ouput:
3, var1
4, calc1

Особенности обновления 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.

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

Рассмотрим следующую задачку: «Написать 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 ни у кого не видел.

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