Получасовая презентация по Java 9. Конечно, рассказать можно много больше, да и часть выводов прозизносил вслух, но в любом случае, если интересна Java 9, то изучение можно начать со ссылок в конце презентации.
Критика, предложения приветствуются.
Получасовая презентация по Java 9. Конечно, рассказать можно много больше, да и часть выводов прозизносил вслух, но в любом случае, если интересна Java 9, то изучение можно начать со ссылок в конце презентации.
Критика, предложения приветствуются.
Вступительная лекция по Java. История появления, идеи, сферы применения, место среди других языков, экосистема. Структурированная информация о Java, как о языке программирования.
Под эту лекцию имеется более развёрнутый материал. Кому интересно - пишите.
Конструктивная критика приветствуется.
Документация на тему архитектуры языка PHP скудна и разрозненна, несмотря на то что тема интересна многим. В моем докладе я постараюсь заполнить этот пробел и рассказать о модулях PHP: как они работают, зачем и как их пишут. В процессе мы рассмотрим опыт Badoo в этой сфере на примерах двух модулей. И еще напишем очень небольшой собственный модуль.
— Что такое модули PHP, как они работают
— Как начать писать свой модуль PHP
— Скелет модуля — Функции, классы, методы
— Разбор параметров функции
— Сборка модуля
— Подгрузка модуля
— Простой пример модуля из Badoo
— Сложный пример модуля из Badoo
Вступительная лекция по Java. История появления, идеи, сферы применения, место среди других языков, экосистема. Структурированная информация о Java, как о языке программирования.
Под эту лекцию имеется более развёрнутый материал. Кому интересно - пишите.
Конструктивная критика приветствуется.
Документация на тему архитектуры языка PHP скудна и разрозненна, несмотря на то что тема интересна многим. В моем докладе я постараюсь заполнить этот пробел и рассказать о модулях PHP: как они работают, зачем и как их пишут. В процессе мы рассмотрим опыт Badoo в этой сфере на примерах двух модулей. И еще напишем очень небольшой собственный модуль.
— Что такое модули PHP, как они работают
— Как начать писать свой модуль PHP
— Скелет модуля — Функции, классы, методы
— Разбор параметров функции
— Сборка модуля
— Подгрузка модуля
— Простой пример модуля из Badoo
— Сложный пример модуля из Badoo
Основные новшества Java 9, которые, на мой взгляд, наиболее актуальны.
Здоровая критика и дополнения приветствуются. Есть текстовый документ, где всё это расписано немного подробнее.
Отладка и оптимизация многопоточных OpenMP-программTatyanazaxarova
Задача знакомства программистов с областью разработки параллельных приложений становится все актуальней. Данная статья является кратким введением в создание многопоточных приложений, основанных на технологии OpenMP. Описаны подходы к отладке и оптимизации параллельных приложений.
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
Теория языков программирования (немного об интерпретаторах, триадах, оптимизации, парсерах и прочее)
Compilers construction some lectures of whole course, it covers some methods on interpreters, optimisations, antlr, dsl (introduction)
«Scrapy internals» Александр Сибиряков, Scrapinghubit-people
- Scrapy is a framework for web scraping that allows for extraction of structured data from HTML/XML through selectors like CSS and XPath. It provides features like an interactive shell, feed exports, encoding support, and more.
- Scrapy is built on top of the Twisted asynchronous networking framework, which provides an event loop and deferreds. It handles protocols and transports like TCP, HTTP, and more across platforms.
- Scrapy architecture includes components like the downloader, scraper, and item pipelines that communicate internally. Flow control is needed between these to limit memory usage and scheduling through techniques like concurrent item limits, memory limits, and delays between calls.
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrainsit-people
The document discusses debugging in Python 3.6. It describes tracing and frame evaluation debuggers. Tracing debuggers slow code execution significantly by calling the tracing function on every line. Python 3.6 introduced a new frame evaluation API that allows evaluating frames directly, avoiding the performance issues of tracing. The document demonstrates how to build a debugger using this approach, including setting breakpoints and stepping through code by inserting temporary breakpoints on each line. Frame evaluation allows building a debugger that is faster than tracing debuggers without significant performance penalties.
«Gevent — быть или не быть?» Александр Мокров, Positive Technologiesit-people
Gevent is a concurrency library for Python that uses greenlets, or lightweight coroutines, to provide asynchronous operations and non-blocking I/O. It allows developing highly concurrent applications using a simple and familiar synchronous style. The document compares gevent to other concurrency options like asyncio and discusses how it provides features like asynchronous task execution, event loops, and inter-greenlet communication using queues and callbacks.
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...it-people
The document discusses what serverless computing is and how it can be used for building applications. Serverless applications rely on third party services to manage server infrastructure and are event-triggered. Popular serverless frameworks like AWS Lambda, Google Cloud Functions, Microsoft Azure Functions, and Zappa allow developers to write code that runs in a serverless environment and handle events and triggers without having to manage servers.
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologiesit-people
The document describes a talk on optimizing Python performance through just-in-time compilation. It discusses how the CPython interpreter works by evaluating bytecode through an evaluation loop. It then talks about how PyPy achieves faster performance through jit compilation of hot loops detected via tracing. The talk dives into the RPython language used to implement PyPy and shows an example of compiling a small Python program to C with RPython. It also discusses using partial evaluation to specialize an interpreter for constant inputs.
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn Systemit-people
The document appears to be a transcript of Python code being executed in an interactive Python shell. It contains examples testing the behavior of built-in functions and operators like sorted(), reversed(), isinstance(), sum(), float("nan"), is, min(), and comparisons like ==, <, on various data types including lists, tuples, and dictionaries.
«(Без)опасный Python», Иван Цыганов, Positive Technologiesit-people
The document discusses various security vulnerabilities in Python web applications. It begins with an overview of the OWASP Top 10 security risks, with sections focusing on risks related to using components with known vulnerabilities (A9) and insufficient attack protection (A7). For A9, it provides examples of vulnerabilities in popular Python packages and recommends checking changelogs and vulnerability databases. For A7, it recommends implementing attack protections like login attempts logging, rate limiting, and use of a web application firewall. The document also covers security misconfiguration (A5), giving examples like using default settings in production and exposing tracebacks.
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...it-people
The document discusses best practices for writing tests in Swift, including recommendations to:
- Write clean, readable tests that focus on asserting a single truth
- Use a domain-specific language in tests for clarity
- Structure tests with "given-when-then"
- Mock dependencies through protocols to enable test isolation
- Favor partial mocks over fully mocking to limit complexity
2. Зачем понадобилось расширение?
Имеется собственный движок для разработки сайтов
и систем автоматизации бизнеса (PHP+MySQL+JS).
Движок используется с 2006 года.
Используется собственный шаблонизатор,
к которому мы очень привыкли.
Вопрос «Почему не использовали [SMARTY|XSLT|…]» оставим за рамками доклада
3. Как выглядит шаблонизатор?
Пример шаблона: Результат:
<ul> <ul>
{:list} <li> первый пункт </li>
<li> {!item} </li> <li> второй пункт </li>
{:/list} </ul>
</ul>
Подача данных в шаблон:
Array( “list” => Array (
Array ( “item” => ”первый пункт” ),
Array ( “item” => ”второй пункт” )));
Вопрос о достоинствах и недостатках шаблонизатора оставим за рамками
доклада
4. Как это обрабатывалось в PHP?
Примерно такой конструкцией:
$result = preg_replace(”/
{([?~:])([a-zA-Z0-9_]*)(([<>!=]{1,2})
([a-zA-Z0-9_]*)){0,1}}(.*){1/2}
/iseU”,
”ProcessBlock(‘$0′, ‘$1′, ‘$2′, ‘$4′, ‘$5′, ‘$6′, $vars_arr) ”,
$result);
Регулярное выражение с eval’ом
5. И что, это работало?
Да!
За пять лет на этом движке было создано
порядка двухсот проектов.
И все было бы хорошо, если бы на некоторых проектах
нас не стала подводить производительность парсера.
В определенных условиях он потребляет серьезное
количество ресурсов – памяти и процессора.
Что же нам делать???
6. Что же нам делать?
Первой идеей было создание компилирующего
шаблонизатора. Шаблон должен трансформироваться
в HTML, перемешанный с простыми управляющими
конструкциями PHP (циклы, условия, вывод).
На вход такому скрипту-шаблону подаются данные,
скрипт выполняется, получаем HTML-страницу.
Не получилось – шаблонизатор является управляющим
(возможен вызов программных модулей и их методов
из шаблона), шаблоны могут каскадироваться.
Скорее всего, задача решаема – но из наших программистов не решил ее никто.
7. Какие проблемы были
с компилирующим шаблонизатором?
Схема парсинга:
Шаблон
Шаблон Шаблон
программного
страницы интерфейса
модуля
Тело Класс в PHP Метод в классе в PHP
страницы
Скорее всего, задача решаема – но из наших программистов не решил ее никто.
8. А напишем расширение!
Вторая идея – написать на C++ расширение, которое будет
сливать шаблон с данными.
И это сработало!
На пути нам встретились три основные проблемы.
На самом деле, их было значительно больше.
9. Первая проблема: как в недрах PHP представлены
ассоциативные массивы…
Данные, хранящиеся в ассоциативных массивах в PHP,
становятся в C++ объектами HashTable.
Работать с ними можно при помощи набора функций –
довольно неудобных (начать с названий – как вам нравится
zend_hash_internal_pointer_reset_ex?).
Работа с многоэтажными массивами превращается
в сложное занятие.
А у нас в движке данные как раз хранятся в многоэтажных
массивах. Каждый уровень вложенности (метод, цикл) –
это новый уровень вложенности массива.
В принципе, можно нас обвинить в том, что мы сами себе придумали проблему.
10. Как решили?
За один проход разворачиваем всю иерархию
ассоциативных массивов в два обычных массива –
один с ключами, второй со значениями.
Ключи при этом собираем в одну строку.
$arr = Array ( “first” => 1,
“second” => Array (
Array ( “number” => 2 )));
Keys = [ "first ", "second0number" ];
Values = [ "1", "2" ];
Заодно преобразуем и ключи, и значения в строки.
Поиск значения с любого «этажа» - чистое удовольствие!
11. Вторая проблема: как вызвать функцию,
содержащуюся в PHP-скрипте, из расширения?
zval *function, *itemname, *retval;
zval **params[1]; пусть itemname – параметр функции function
MAKE_STD_ZVAL ( function );
MAKE_STD_ZVAL ( itemname );
ZVAL_STRING ( function, “MyPHPFunction“, 1);
ZVAL_STRING ( itemname, “значение“, 1);
нигде не определенный параметр
params[0] = &itemname;
if ( call_user_function_ex ( CG (function_table), NULL, function, &retval, 1, params, 0,
NULL TSRMLS_CC ) == FAILURE ) непонятный макрос
zend_error (E_ERROR, “Function call failed“);
else {
if ( Z_TYPE_P (retval) == IS_STRING ) {
… тут мы можем обработать возвращенное значение, используя
макросы
Z_STRLEN_P ( retval ) и Z_STRVAL_P ( retval )
Этот код работает только внутри функции, вызываемой из PHP:
ZEND_FUNCTION(Func)
12. Как решили?
Документация тут не поможет… лезем в исходники PHP.
Оказывается, function_table – это параметр, передаваемый
в ZEND_FUNCTION.
За макросом TSRMLS_CC скрывается переменная tsrm_ls,
тоже являющаяся одним из стандартных параметров для
функций, объявленных при помощи ZEND_FUNCTION.
Остается передать эти параметры в нашу innerCPPFunction:
char *result = innerCPPFunction ( CG ( function_table ), tsrm_ls );
char *innerCPPFunction ( HashTable *function_table, void ***tsrm_ls )
{…}
innerCPPFunction – это функция, куда мы захотели вынести вызов функции PHP
13. Передача выполнения между PHP и расширением
Схема парсинга:
Шаблон
Шаблон Шаблон
программного
страницы интерфейса
модуля
Тело Класс в PHP Метод в классе в PHP
страницы
PHP => extension => PHP => extenstion => PHP => extension
Скорее всего, задача решаема – но из наших программистов не решил ее никто.
14. Третья проблема: глобальные переменные
Глобальные переменные (например, общие массивы ключей
и значений), объявленные в расширении, сохраняют свои
значения между вызовами различных функций из PHP.
Приходится о них заботиться. Учитывая, что схема парсинга
выглядит так: сначала из PHP вызывается функция
расширения, которая сливает данные с шаблоном верхнего
уровня, а затем она вызывает функции из PHP, которые
инициализируют содержащиеся в странице программные
модули (и цикл повторяется). То есть, выполнение переходит
из PHP в расширение, затем обратно в PHP, затем снова
в расширение. При втором вызове как раз важно не забыть
о том, что глобальные переменные первым вызовом
уже проинициализированы.
Ура, расширение работает!
15. Что выиграли в плане производительности?
Парсинг при помощи регулярных 100%
выражений
Парсинг при помощи расширения PHP 53%
XMLXSLT 36%
«чистый» PHP (компилирующий 3%
шаблонизатор)
парсинг при помощи регулярных выражений принят за 100%
16. Выводы?
Конечно, «чистый» PHP побеждает с чудовищным отрывом.
Но проблема создания компилирующего шаблонизатора
для движка с управляющим синтаксисом шаблона все еще
ждет своего героя…
Поэтому в итоге было принято решение использовать
в новой версии нашего продукта шаблонизацию XSLT:
дополнительный плюс состоит в том, что этот язык является
стандартом, с которым некоторые разработчики уже
знакомы, а не собственным «эксклюзивным» решением.
А расширение PHP, реализующее парсер «старого»
синтаксиса, помогло нам улучшить производительность
ранее написанных программных систем, уже работающих
у наших клиентов.
А еще теперь мы знаем, как сделать <?php asm mov ax,bx; ?>
17. Спасибо за внимание!
Вопросы?
Также можно обсудить в ЖЖ:
http://serge-index.livejournal.com