Рубрика «jruby»

На очередной встрече московского сообщества Java-разработчиков jug.msk.ru, прошедшей 4 октября 2018 года, Чарльз Наттер рассказал о технологиях, используемых JRuby и другими динамическими языками для JVM.

Чарльз Наттер о динамических языках в JVM на jug.msk.ru - 1
Читать полностью »

Через пару дней в Москве пройдет конференция RubyRussia. Наш гость Чарльз Наттер (работает над JRuby и JVM поддержкой в Red Hat) ответил на пару вопросов.

Чарльз Наттер. Как перенести древний монолитный проект на JRuby и стоит ли это делать? - 1Как вы попали в мир программирования и Ruby?

В 2004 году я работал по контракту в правительственной фирме в качестве Java Enterprise архитектора. Я работал над проектом для Министерства сельского хозяйства США, и проводил пару недель в месяц в Вашингтоне. Одна из таких поездок совпала с RubyConf 2004, и поскольку один из моих друзей давно рекомендовал мне обратить внимание на Ruby, я решил сходить на конференцию. Так я оказался на мероприятии, посвященном Ruby, не имея никакого представления об этом языке… но я понял каждый кусочек кода, каждый приведенный пример. Я был поражен и пообещал себе найти способ принести Ruby в мой Java-мир.

Над какими проектами вы работаете сейчас?
Читать полностью »

Вы видели результаты бенчмарков MJIT? Они удивительные, правда? MJIT буквально выносит все остальные реализации без вариантов. Где он был все эти годы? Всё, теперь с гонкой закончено?

Однако вы можете понять из заголовка, что не всё так просто. Но прежде чем разобрать проблемы этих конкретных бенчмарков (конечно, вы можете пролистать вниз к симпатичным диаграммам), нужно рассмотреть важные базовые основы сравнительного анализа.

MJIT? TruffleRuby? Что это всё такое?

MJIT — это ответвление Ruby на Github от Владимира Макарова, разработчика GCC, где реализована динамическая JIT-компиляция (Just In Time Compilation) на самом популярном интерпретаторе Ruby — CRuby. Это отнюдь не окончательная версия, наоборот, проект на ранней стадии разработки. Многообещающие результаты бенчмарков были опубликованы 15 июня 2017 года, и это основной предмет обсуждения в данной статье.
Читать полностью »

JRuby + Ratpack = Love

Многие разработчики на Ruby знают как обстоят дела с асинхронным выполнением кода на имеющихся серверах.
Либо вы используете что-то на EventMachine, либо колдуете с Ruby::Concurrent, Celluloid.
В любом случае, это работает не сильно эффективно из-за GIL (ждем, надеемся и верим в Ruby 3).
Но есть реализации свободные от этой проблемы, одна из них поверх JVM — JRuby, где теже самые библиотеки будут чувствовать себя гораздо комфортней.
Много расписывать не буду, думаю все как минимум слышали про него.
Главной особенностью данной реализации является легкая интеграция с любой библиотекой на JVM.
Это открывает большой простор в выборе библиотек и готовых инструментов.

Читать полностью »

Всем привет! Уже как пару месяцев наша компания успешно использует в продакшене связку logstash-elasticsearch-kibana для сбора и обработки достаточно большого объема логов. Заглянув в kibana после перевода часов обнаружилось, что все логи идут с отставанием по времени в 1 час. Под катом хочу поделиться решением проблемы с timezones в связке logstash-elasticsearch-kibana и готовой сборкой logstash с обновленными timezones.
Читать полностью »

В прошлый раз я предложил заглянуть в код MRI, чтобы разобраться с реализацией GIL и ответить на оставшиеся вопросы. Что мы сегодня и сделаем.

Как работает GIL в Ruby. Часть 2Черновая версия этой статьи изобиловала кусками кода на C, однако, из-за этого суть терялась в деталях. В финальной версии почти нет кода, а для любителей поковыряться в исходниках я оставил ссылки на функции, которые упоминал.

В предыдущей серии

После первой части остались два вопроса:

  1. Делает ли GIL array << nil атомарной операцией?
  2. Делает ли GIL код на Ruby потокобезопасным?

На первый вопрос можно ответив, взглянув на реализацию, поэтому начнем с него.
Читать полностью »

Пять из четырех разработчиков признают, что многопоточное программирование понять непросто.

Как работает GIL в Ruby. Часть 1Большую часть времени, что я провел в Ruby-сообществе, печально известная GIL оставалась для меня темной лошадкой. В этой статье я расскажу о том, как наконец познакомился с GIL поближе.

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

Я хотел знать, как работает GIL с технической точки зрения. На GIL нет ни спецификации, ни документации. По сути, это особенность MRI (Matz's Ruby Implementation). Команда разработчиков MRI ничего не говорит по поводу того, как GIL работает и что гарантирует.

Впрочем, я забегаю вперед.
Читать полностью »

Многие Руби-разработчики игнорируют потоки (threads), хотя это очень полезный инструмент. В данной статье мы рассмотрим создание IO потоков в Руби и покажем как Руби справляется с потоками в которых происходит много вычислительных операций. Попробуем применить альтернативные имплементации Руби, а так же узнаем, каких результатов можно добиться при помощи модуля DRb. В конце статьи посмотрим, как эти принципы используются в различных серверах для аппликаций на Ruby on Rails.

IO потоки в Руби

Рассмотрим небольшой пример:

def call_remote(host)
  sleep 3 # симулируем долгий запрос к серверу
end

Если нам надо обратитьcя к двум серверам, например, чтобы очистить кэш, и мы дважды последовательно вызовем эту функцию:

call_remote 'host1/clear_caches'
call_remote 'host2/clear_caches'

то наша программа будет работать 6 секунд.

Мы можем ускорить исполнение программы, если будем использовать потоки, например, так:

threads = []

['host1', 'host2'].each do |host|
  threads << Thread.new do
    call_remote "#{host}/clear_caches"
  end
end

threads.each(&:join)

Мы создали два потока, в каждом потоке обратились к своему серверу и командами #join сказали, что главной программе (главному потоку) надо подождать их завершения. Теперь наша программа успешно выполняется в два раза быстрее, за 3 секунды.
Читать полностью »

Мы рады сообщить, что вчера вышла новая версия интегрированной среды разработки для Ruby и Rails — RubyMine 5, которую можно загрузить с нашего сайта.
Состоялся релиз RubyMine 5
В новой версии мы постарались добавить новые возможности, которые позволят получить удовольствие от разработки на Ruby во всем ее многообразии. Уже хорошо зарекомендовавшие себя инструменты разработки теперь доступны для еще большего числа Ruby-приложений, в том числе и для iOS-приложений на базе технологии RubyMotion, быстро набирающей популярность. Для приложений RubyMotion стали доступны интеллектуальное автодополнение кода, тестирование и отладка с использованием графического интерфейса.

Более подробно о RubyMine 5 можно узнать на странице What’s new. Также мы рады представить демо-видео от технического евангелиста Джона Линдквиста (John Lindquist).
Читать полностью »

Нил Форд, Архитектор ПО, ThoughWorks Inc.
25 сентября 2012
перевод статьи Functional thinking: Tons of transformations

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

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

Основная цель этой части поспособствовать пониманию этой трансляции. Я возьму простые проблемы, которые требуют определиния и итерации, реализую решение на 5 различных языках (Java, Groovy, Clojure, JRuby и Scala) и двух функциональных фреймворках (Functional Java и Totally Lazy) для Java. Эти реализации одинаковы, однако детали отличаются от языка к языку.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js