OTUS IT News – Telegram
OTUS IT News
7.2K subscribers
4.32K photos
301 videos
5 files
4.29K links
Экспертный контент по востребованным технологиям 2025 года: от разработки и аналитики до искусственного интеллекта и облачных решений.

Более 170 курсов+

🗓 Расписание бесплатных ОУ: https://otus.pw/24Da/
🦉 Голосуй за канал: https://news.1rj.ru/str/boost/Otusjava
Download Telegram
В последнее время идет настоящая охота на Java-разработчиков по всему миру. Спрос на разработчиков каждый год растёт примерно на 10-15 процентов, а база для образования не справляется. И потребности растут, и текучка большая: ведь в какой-то момент выяснилось, что Java позволяет наиболее индустриально разрабатывать код. Как профессионально расти и стать желанной целью? Студент, который пройдет обучение Java в OTUS, может получить в Москве больше, чем действующий разработчик. Сегодня, в рамках Дня Открытых Дверей Виталий Чибриков преподаватель курса «Разработчик Java» расскажет, какие есть варианты карьеры в России у вас, если вы уже знаете Java и у вас есть несколько месяцев, чтобы перейти на новый язык и новую среду разработки.
Прямая трансляция начнется в 20:00 по московскому времени. Подключиться https://goo.gl/eRCqsi
И на десерт список компаний, в каждой из которых, работают свыше 200 Java разработчиков: Amazon, Oracle, Azul, Одноклассники, Deutsche Bank, Одноклассники, Luxoft , Twitter, Facebook, LinkedIn, JetBrains и другие.
Но, не спешите подавать свои резюме в эти компании, вначале мы приглашаем вас пройти тестирование https://goo.gl/MFqmQN
Несмотря на выходной день сегодня, совсем скоро мы начнем День открытых дверей на курсе "DevOps: практики и инструменты".
Ответим на все вопросы, расскажем про программу курса и, конечно, проведем розыгрыш бесплатных мест на курсе среди тех, кто прошел вступительное тестирование.
Начинаем через считанные минуты: https://www.youtube.com/channel/UCetgtvy93o3i3CvyGXKFU3g/live
Пять библиотек для Python, которые делают визуализацию данных простой. № 1 Bokeh.

Учитывая необычайный рост объемов и видов данных, которыми оперируют приложения, визуализация данных становится тем заданием, столкновение с которым неизбежно. И, очевидно, что навык презентовать данные в форме легкой для понимания становится все более ценным. OTUS представляет перевод серии заметок, в которой дается обзор пяти библиотек для визуализации данных в Python.

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

Каждая из этих библиотек обладает своими особенностями. В зависимости от контекста, определенные библиотеки могут быть более предпочтительными. Более того, некоторые из этих библиотек являются надстройками других модулей. Так например, Seaborn — библиотека для визуализации статистических данных, которая для построения графиков обращается к Matplotlib, модулю, который, пожалуй, является одним из самых популярных среди разработчиков на Python во всех областях. В этой серии заметок мы представим пять библиотек для визуализации данных, а именно: Bokeh, Seaborn, Altair, ggpot и Pygal.

Bokeh.
Библиотека визуализации данных Bokeh в первую предназначена для построения интерактивных графиков, которые рендерятся в веб-браузере. Визуализация, построенная с помощью Bokeh, в плане стиля близка к D3.js. Высокая производительность и интерактивность, даже в случае больших датасетов — одни из отличительных черт этого модуля.
Официальный мануал рекомендует использовать сборку Anaconda Python для легкой установки модуля. Естественно, библиотека может быть установлена и через pip, если требования удовлетворены.

Как уже говорилось, делать графики в Bokeh очень легко. Следующий пример кода позволяет построить простой линейный график и экспортировать его в html:

from bokeh.plotting import figure, output_file, show

# 1. Load some data in X,Y variables
x = [1, 2, 3, 4, 5]
y = [23, 15, 7, 12, 21]

# 2. Specify the name of the output HTML file
output_file(«lines.html»)

#3. create a new plot with a noscript and axis labels
p = figure(noscript=”Bokeh Demo for OSFY», x_axis_label=’x’, y_axis_label=’y’)

#4. add a line renderer with legend and line thickness
p.line(x, y, legend=”Age», line_width=3)

#5. show the results
show(p)

Главные шаги, задействованные в построении визуализации в Bokeh:

Загрузить данные.
Задать имя html файла, в который будет сохранен результат.
Использовать функцию figure(), что построить график с заданными условиями.
Задать параметры определенных видов графиков можно с помощью рендерера. В предыдущем примере был использован рендерер Figure.line.
Финальный шаг — вызвать функцию show() или save().
Bokeh также позволяет связывать различные факторы отдельных графиков, что осуществляется с помощью так называемого процесса linking panning. В примере ниже, некоторые из компонентов являются общими для нескольких графиков. Изменяя область значений одного из графиков, мы меняем ее и для других.

Пример кода:

import numpy as np
from bokeh.layouts import gridplot
from bokeh.plotting import figure, output_file, show

# prepare some data
N = 100
x = np.linspace(0, 4*np.pi, N)
y0 = np.sin(x)
y1 = np.cos(x)
y2 = np.sin(x) + np.cos(x)

# output to static HTML file
output_file(«linked_panning.html»)

# create a new plot
s1 = figure(width=250, plot_height=250, noscript=None)
http://amp.gs/B4b8(x, y0, size=10, color=”blue», alpha=0.5)
# NEW: create a new plot and share both ranges
s2 = figure(width=250, height=250, x_range=s1.x_range, y_range=s1.y_range, noscript=None)
s2.triangle(x, y1, size=10, color=”firebrick», alpha=0.5)
# NEW: create a new plot and share only one range
s3 = figure(width=250, height=250, x_range=s1.x_range, noscript=None)
s3.square(x, y2, size=10, color=”green», alpha=0.5)

# NEW: put the subplots in a gridplot
p = gridplot([­[s1, s2, s3]], toolbar_location=None)

# show the results
show(p)
Нововведения в Terraform.
Terraform — это продукт компании HashiCorp для декларативного описания инфраструктуры в виде кода.  В последние два месяца произошло два значимых для сообщества Terraform события: релиз версии 0.10 и конференция HashiConf. В рамках нового релиза код ядра Terraform был отделен от кода провайдеров и они были вынесены в отдельную организацию на GitHub. Это позволяет теперь вести их разработку отдельно от релизного цикла основного продукта. Таким образом, релизы провайдеров стали выходить чаще, исправления ошибок и новые функции появляются быстрее, увеличилась вовлеченность сообщества в разработку. И стало возможным фиксировать в конфигурации не только версию самого Terraform, но и используемых провайдеров. 

Также в версии 0.10 добавили флаг -auto-approve для команды terraform apply, и теперь можно проконтролировать изменения и подтвердить их одной командой «terraform apply -auto-approve=false» вместо привычной последовательности команд «terraform plan && terraform apply», которая в некоторых случаях могла приводить к непредсказуемому результату. 
На конференции HashiConf 2017 был представлен портал Terraform Module Registry. У Terraform появилось центральное хранилище для модулей, в котором можно найти необходимый модуль, примеры его использования, какие параметры он принимает и, что предоставляет. В нем находятся, как проверенные (verified), так и community модули. А в Enterprise версии Terraform доступен Private Module Registry для собственных закрытых разработок.

Научиться использовать Terraform и практике Infrastructure as Code вам помогут эксперты из Экспресс 42 в курсе "DevOps практики и инструменты" в OTUS.
Как поднять свой уровень профессионализма в искусстве программирования? С этим вопросом сталкивается каждый специалист сферы IT технологий в определенный момент карьерного роста. Мы все хотим достичь высот в карьере, стать востребованными профессионалами и обеспечить себе стабильное будущее. Изучить тонкости разработки серверных приложений на Java и получить качественное образование в России — это возможно. Приходите к нам на День Открытых Дверей, который состоится завтра, 9 ноября, в формате онлайн. На повестке дня встреча с преподавателем курса Виталием Чибриковым. Вы сможете узнать о курсе «Разработчик Java», что входит в программу, как строится формат обучения, какие знания и навыки вы получите после обучения и, как их можно применить на практике.
По традиции, для самых светлых умов программирования, будут разыграны бесплатные места в группе. Проверить свои знания и принять участие в конкурсе можно пройдя тестирование на официальном сайте образовательного проекта OTUS https://goo.gl/SB6atk
Начало Дня Открытых Дверей по курсу «Разработчик Java» начнется в 20:00 по московскому времени.
До встречи!
Оптимизация сборки Docker образов.

Контейнеры привнесли новый формат поставки ПО. Для запуска приложения в контейнере мы предварительно собираем образ с кодом приложения и необходимыми зависимостями, который становится артефактом для деплоя.  

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

Существует множество способов для достижения данных целей. Подробнее об этом вы можете узнать на курсе «DevOps практики и инструменты» в OTUS. Здесь же мы рассмотрим один из способов, как можно сократить размер образа на примере Go приложения. 

Мы будем говорить с вами про Docker контейнеры, т.к. на сегодняшний момент они являются наиболее популярными. Поскольку наше приложение написано на компилируемом языке, то перед его запуском нам нужно скомпилировать код.  
Мы можем это сделать внутри контейнера следующим образом (пример Dockerfile):

«FROM golang:1.9.1»
«WORKDIR /go-builder/»
«COPY hello-world.go .»
«RUN go build -o hello-world .»
«CMD [»./hello-world"]»

Образ контейнера получаемого на выходе равен 740 MB.
Заметим, что для запуска скомпилированного приложения не требуется установки самого языка Go и всей среды сборки кода. Поэтому мы можем разнести компиляцию кода и запуск полученного на выходе бинарного файла по двум разным контейнерам. Docker недавно упростил данную процедуру, дав возможность описывать данный процесс в одном Dockerfile при помощи multi-stage сборок:

«FROM golang:1.9.1 as builder»
«WORKDIR /go-builder/»
«COPY hello-world.go .»
«RUN CGO_ENABLED=0 GOOS=linux go build -o hello-world .»

«FROM alpine:latest»
«COPY —from=builder /go-builder/hello-world .»
«CMD [»./hello-world"]»

В данном Dockerfile мы описываем один контейнер для компиляции кода (builder) и второй контейнер для запуска скомпилированного приложения. Команда «COPY —from=builder» позволяет скопировать полученный бинарный файл из builder контейнера в контейнер для запуска. Образ полученного образа равен 10 MB, что в десятки раз меньше, чем в предыдущем случае.
Теперь OTUS в Instagram! Подписывайтесь на наш канал, а мы обещаем информировать о свежих новостях, итогах и полезных лайфхаках! Kik @otus.ru!
Сегодня День Открытых Дверей Курса Java! Начало в 20:00 по московскому времени. Присоединяйтесь к трансляции, узнайте все тонкости программы обучения, задавайте волнующие вас вопросы. Олег Климаков, преподаватель курса, в прямом эфире готов рассказать о всех нюансах обучения, какой опыт и знания вы приобретете и, как вы сможете с пользой применять их на практике.
Присоединится к трансляции https://goo.gl/SVWvwM
Еще можно пройти тестирование и побороться за возможность получит бесплатное обучение на курсе «Разработчик Java»!
ООП в Python — это вам не Java. Никаких вам фабрик абстрактных классов, интерфейсов и вот этого всего. Есть, конечно, ABC и очумелые ручки, но это совсем другая история. Но классы и наследование есть, конечно. Не смотря на это, в нет строгого разделения на «public/private/protected». На фоне этой правды жизни возникло соглашение о том, что одно нижнее подчеркивание (_) перед именем означает пометку «только для внутреннего пользования» и даже в случае from M import * такие имена не будут импортироваться. Но это все же лишь соглашение, и если очень хочется, то ничто особо не мешает получить, например, доступ к полю, начинающемуся с нижнего подчеркивания.
Самое близкое, в некотором смысле, к private полю в Python можно получить, написав не одно, а два нижних подчеркивания перед именем. При попытке прямого доступа в таком случается получается ошибка, например:

Traceback (most recent call last):
  «File „<stdin>“, line 1, in <module>»
«AttributeError: CachedResponse instance has no attribute ‘__intermediate_result’»

Но даже такой механизм обеспечения приватности не особо сильнее предыдущего, так как на самом деле, значение поля из примера выше можно получить, обратившись к атрибуту «_CachedResponse__intermediate_result». Это так называемый name mangling. Но, в основном, он все же предназначен для избежания инцидентов с одинаковыми именами полей в дочерних классах и тому подобным.
Подводя итоги Дня Отрытых Дверей курса «DevOps практики и инструменты» мы понимаем, что интерес к этой программе увеличивается с каждым днем. Благодарим всех, кто присоединился к трансляции в пятницу. Несмотря на то, что у нас имелись ограниченные рамками во времени встречи, мы старались дать, как можно более развернутые ответы на волнующие вас вопросы. Друзья, спешим сообщить, что впереди у нас состоится еще одна встреча в раках Дня Открытых Дверей курса «DevOps практики и инструменты» 22 ноября! И это будет финальная встреча перед стартом обучения.
Главная миссия OTUS — это дать каждому специалисту сферы IT необходимые знания для повышения уровня вашей профессиональной подготовки, но не менее важным аспектом для нас является ваш комфорт обучения и если у вас есть пожелания/предложения — выносите их на обсуждение в комментариях.
HTTP-сессия в мире Java.
В любом веб-приложении одним из краеугольных вопросов является поддержка клиентских сессий. Платформа JavaEE не исключение и для этих целей в ней существует специализированный HttpSession API, доступ к которому есть у любого веб-приложения, развернутого в некотором сервлет-контейнере. Что же из себя представляют эти самые сессии? Возможно, Вам известно, что протокол HTTP и веб-серверы по природе своей являются stateless, и каждый новый запрос от клиента расценивается сервером, как абсолютно новый, ничего не знающий об истории предшествующих обращений. Вы скажете, а, как же тогда реализуются интернет-магазины, знающие о списке добавленных в корзину товаров своих покупателей?
Сессия — это диалоговое состояние между клиентом и сервером, включающее информацию о предыдущих запросах клиента и ответах сервера. В силу того, что протокол и сами веб-сервера не обеспечивают сохранение состояние, то единственной возможностью для этого является передача всей необходимой информации о запросе в нем самом. Чтобы этого не делать, каждый запрос от данного клиента сервер ассоциирует с некоторой уникальной информацией об установленной сессии (идентификатор сессии), пробрасывая ее в каждом запросе и ответе. Для передачи данного UID наиболее популярными являются, такие способы, как использование пользовательских cookies, скрытые поля формы и передача непосредственно в адресе запроса. При разработке веб-приложения, конечно, функцию генерации UID и последующей его передачи от клиента к серверу может взять на себя само приложение, но тогда разработчик будет ответственен за все возможные обращения, каждый раз проверяя, а не забыл ли он передать это значение, при этом генерируя огромное количество boilerplate-кода. К великому счастью, разработчики JavaEE освобождены от такой рутины и выполнение данной задачи взвалено на плечи контейнера, в пределах которого развернуто Ваше приложение. Осталось понять — каким же образом он это делает. Работа с пользовательскими сессиями веб-приложений в JavaEE вынесена в раздел Servlet API и осуществляется средствами интерфейса javax.servlet.http.HttpSession, который предоставляет высокоуровневые методы работы с ними. Непосредственная реализация уже располагается в библиотеке servlet-api.jar используемого контейнера сервлетов и напрямую зависит от него. Существует два способа получения ссылки на объект пользовательского сеанса из объекта клиентского запроса, используя методы Servlet API:
1. HttpSession getSession(boolean flag) — для ложного значения параметра flag, данный метод возвращает объект сессии, если он был создан у данного запроса, и null в противном случае; в случае истинного значения flag, данный метод равносилен другому методу 2. HttpSession getSession() — если сеанс не установлен, то контейнер его создает, иначе возвращает уже созданный объект сессии. В момент, когда сеанс установлен, сервлет-контейнер создает пользовательский cookie с именем JSESSIONID, значение которого содержит уникальный идентификатор сессии (это же значение можно получить методом String getId() объекта HttpSession). Наряду с этим, в рамках контейнера определяется дефолтное значение таймаута сессии — время неактивного состояния пользователя, приводящее к устареванию его сеанса связи с сервером. Данное значение конфигурируется на уровне контейнера сервлетов, либо непосредственно в веб-приложении на уровне дескриптора развертывания web.xml или непосредственным вызовом метода void setMaxInactiveInterval(int interval) у объекта сессии. Начиная с версии Servlet API 3.0, также можно задать и время жизни куки JSESSIONID в конфиге web.xml, уничтожение которой также приведет к запросу на повторное установление сеанса между клиентом и сервером. Кусок дескриптора развертывания web.xml:

«<session-config>»
«<!— Timeout in minutes —>»
«<session-timeout>15</session-timeout>»
«<cookie-config>»
«<http-only>true</http-only>»
«<path>/</path>»
«<!— Cookie lifetime in seconds —>»
«<max-age>900</max-age>»
»</cookie-config>»
«</session-config>»

А что же будет, если пользовательские «печенки» запрещены на клиентской маш
ине? Данный факт будет выявлен сервером автоматически и для поддержания сеанса будет использован механизм URL Rewriting, который позволяет передавать UID сессии непосредственно в адресной строке, например, так:
http://amp.gs/BDav;jsessionid=1E6FEC0D14D044541DD84D2..

А зачем они вообще нужны эти http-сессии и, какие в принципе возможности предоставляют? Это уже тема следующей заметки. До новых встреч!
Мы знали, что курс «DevOps: практики и инструменты» востребован компаниями для повышения квалификации своих сотрудников. В первой группе много счастливчиков, которые учатся за счет работодателей. Но в этом наборе тех, кто получит новые знания и умения за счет работодателей, оказалось больше, чем мы ожидали!
Обучение за счет работодателя — радость для студента и, к сожалению, нагрузка на администрацию компаний. Чтобы успеть принять на курс всех, кто хочет стать серьезным DevOps специалистом, мы приняли решение о переносе начала обучения второй группы. Торжественно клянемся, что 28 ноября вторая группа DevOps начнет свое обучение!
Хотите попасть во второй набор нашего звездного курса? Самое время сделать это! Для физических лиц еще есть места. А вот если вы хотите обучаться за счет работодателя — стоит поторопиться с заявкой на help@otus.ru
Пожалуй, самое большое количество вопросов возникает при кластеризации запросов. Точность ручной кластеризации опытного оптимизатора не превышает 40%. Это значит, что если вы не эксперт в нише для которой собираете ядро — лучше прокачать свои знания в ней или воспользоваться автоматом. Вся сложность в том, что каждый запрос имеет интент (задача, которую подразумевает пользователь при поиске). Поисковая система интент прекрасно определяет и знает. А вот человек — отнюдь не всегда. Кроме того, одни интенты могут продвигаться на одной странице, другие — нет. Поэтому, выполняя ручную кластеризацию следует смотреть на выдачу — как разделено именно там. Если в выдаче по одинаковым запросам присутствуют одинаковые страницы в ТОП — значит их можно продвигать на одной странице.

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

Поэтому, кластеризуя семантические ядра для начала проходимся автоматом. Например, можно встроенным в Key Collector кластеризатором по ТОП. Полученное ядро обрабатывайте руками, исправляя огрехи алгоритмов поисковых систем. Только таким способом на выходе можно получить полное и качественное семантическое ядро.
Когда в кино показывают компьютерных злодеев — это часто выглядит печально. Взлом системы, к примеру, обычно изображают, как быстро бегущие строки, которые сменяет большая зеленая надпись «Доступ получен». Режиссеров очень редко волнуют всякие мелочи, которые на их взгляд понятны только специалистам. А мы подходим в вопросу образования крайне серьезно. Программы обучения в образовательном проекте OTUS —
это всегда белые методы, с современным и легким подходом, порой, увлекает, так, что теряешься во времени. Чтобы не пропустить следующий День Открытых Дверей курса «Python», который состоится 17 ноября, поставьте себе напоминалку на 20:00 и подключайтесь к трансляции из любого города, страны, континента. И наконец, чтобы завладеть желанной целью получить бесплатное образование в OTUS нужно пройти тестирование https://goo.gl/jiaW8e