Into

Считается, что Julia – это нишевый язык созданный для лабораторий, научных симуляций и HPC.
Хотя на самом деле благодаря свой экспрессивности и динамизму Julia можно и нужно использовать для автоматизации и скриптинга.
Давайте на паре простых примеров посмотрим как Julia можно использовать для решения рутинных задач.

Ad-hoc analytics

С помощью Julia можно работать с данными используя привычные для Питонистов концепции и инструменты.
Вместо kaggle, попробуем подготовить свой собственный дата-сет.
Для этого нам понадобится несколько сторонних утилит: git и jq.

Centos:

yum install epel-release -y
yum install jq

Давайте клонируем какой-нибудь популярный репозиторий:

julia> run(`git clone https://github.com/freebsd/freebsd-src.git`)

julia> cd("freebsd-src/")

У FreeBSD долгая история и десятки тысяч коммитеров. Анализировать не структурированный лог-файл (примерно 170Мб) с помощью grep и AWK достаточно сложно,
поэтому давайте напишем небольшой скрипт, который конвертирует историю коммитов в JSON.

cmd = `git log --all --pretty=format:"%h%x09%an%x09%ad%x09%s" --date=short --no-merges`
cmd1 = `jq -R '[ inputs | split("\t") | { hash: .[0], author: .[1], date: .[2], message: .[3] }]'`

try
    redirect_stdio(stdout="repo.json") do
      run(pipeline(cmd, cmd1))
    end
catch err
    Pkg.Types.pkgerror("The command $(cmd) '|' $(cmd1) failed, error: $err")
end

Теперь необходимо скопировать содержимое файла repo.json в DataFrames – привычную для аналитиков структуру данных.
Для этого нужно будет установить пакеты DataFrames и JSON3.

julia> using DataFrames, JSON3

Создаем функцию-помощник для чтения JSON:

function read_json(file)
           open(file,"r") do f
               return JSON.parse(f)
           end
       end

Копируем содержимое файла в Data Frame:

julia> df = DataFrame(read_json("repo.json"))

Можно кстати использовать один из встроенных макросов – интересно будет сравнить насколько эта операция быстрее чем в Python:

julia> @time df = DataFrame(read_json("repo.json"))

 29.901792 seconds (49.18 M allocations: 2.809 GiB, 14.31% gc time)

Отсортируем DataFrame по дате:

julia> sort!(df, [order(:date, rev=true)])
sort.png
sort.png

Как группировать по определенному значению в датасете? Например имя автора коммита:

julia> gdf = groupby(df, :author)
julia> gdf[("Jessica Clarke",)]
groupby
groupby

Scripting

Если нужно быстро написать небольшой скрипт для git-hooks, CI/CD, резервного копирования, то Julia прекрасно справляется с этой задачей.
Компактный синтаксис и REPL позволяют парсить и склеивать вывод системных утилит не хуже чем на Bash:

#!/usr/bin/env julia

if isdir(".git") println
  @info("== Remote Branches: ")
  run(`git branch -r`)
  
  @info("== Local Branches:  ")
  run(`git branch`)
  
  @info("== Configuration (.git/config)")
  run(`cat .git/config`)
  
  @info("== Most Recent Commit:  ")
  run(` git --no-pager log --max-count=1`)
  
  @info("== Most Recent Commit:  ")
  run(`git log --pretty=format:"-> %s" --before=today -10`)
else
  println("Not a git repository.")
end

Давайте выполним скрипт:

chmod +x git-info.jl
./git-info.jl

Этот скрипт только выводит информацию о текущем репозитории Git, но если нам нужно будет сделать что-то посложнее, то в отличие от Bash,
на Julia есть готовая библиотека для парсинга аргументов – ArgParse.jl.

git-info
git-info

Pluto & CSV

Pluto.jl – это Jupyter notebook, для Julia. Пока он уступает по возможностям и в "отполированности" Jupyter, но проект постоянно развивается.
Для того, чтобы запустить Pluto в удаленном режиме:

julia> using Pluto

Нужно будет запустить web Ui Pluto:

julia> Pluto.run(host="0.0.0.0", port=11234)

[ Info: Loading...
┌ Info:
└ Go to http://0.0.0.0:11234/?secret=coDN9HGC in your browser to start writing ~ have fun!
┌ Info:
│ Press Ctrl+C in this terminal to stop Pluto

Скопируйте адрес (http://IP_ADDR:11234/?secret=coDN9HGC) в браузер и поменяйте IP адрес.

В ноутбуке в первой ячейке нужно будет загрузить пакеты DataFrames, CSV:

julia> using CSV, DataFrames

Sadf и sar – это две утилиты, которые входят в пакет Sysstat – демон мониторинга,
который используется мониторинга и сбора системных метрик. Мы будем использовать его в качестве примера дата-сета:

julia> df = DataFrame(CSV.File(`sadf -d /var/log/sa/sa16 -- -dp`))
sar
sar

Можно вывести более подробную информацию о созданном дата-сете:

julia> DataFrames.describe(df)
describe
describe

Отсортировать сетевые устройства по утилизации:

julia> sort!(df, [order("%util", rev=true), :"DEV"])
sort
sort

Для парсинга вывода sar отлично подходит grep, sed и AWK, а для мониторинга распределенных систем Prometheus и Grafana. Но если вам нужно «склеить» с помощью join несколько разных дата-сетов (табулярные данные и не структурированные логи) и построить графики на основе этих данных, то для решения этих задач отлично подойдет Julia:

julia> j =  JSON3.read(`journalctl -k -b -o json-pretty`, jsonlines=true)

julia> df = DataFrame(j)

julia> select(df5, Not([:__CURSOR, :__REALTIME_TIMESTAMP, :__MONOTONIC_TIMESTAMP, :_BOOT_ID, :_MACHINE_ID, :_SOURCE_MONOTONIC_TIMESTAMP]))
log
log

End

Авторы Julia в своем манифесте Why We Created Julia ставили перед собой определенные цели:

"We want something as usable for general programming as Python, as easy for statistics as R, as natural for string processing as Perl, as powerful for linear algebra as Matlab, as good at gluing programs together as the shell. Something that is dirt simple to learn, yet keeps the most serious hackers happy. We want it interactive and we want it compiled."

Не все из того, что они планировали удалось воплотить в жизнь, Julia не идеальна. Получился Lisp, который взял все лучшее у Python (julia --lisp).
Язык на котором хочется написать библиотеку, даже если вы никогда до этого на нем ничего не писали.

PS. Может быть это станет началом «Automate the boring stuff with Julia» :)

Комментарии (20)


  1. forthuse
    18.12.2023 15:20

    Язык Julia на третьем месте по популярности представлнных решений
    с площадки rosettacode.org Rosetta Code/Rank languages by popularity/Full list
    но, возможно, за счёт каких то его фанов или усилиями разработчиков включённых в его развитие? (т.к., вроде, по нему нет достаточного количества издаваемых книг, если они вообще есть)


    1. Rikimaru22 Автор
      18.12.2023 15:20

      А на первых местах в этом списке Phix, Wren – не сказать, что очень популярные языки. Я думаю, что рейтинг Stack Overflow будет немого более репрезентативным. А там насколько я знаю Julia далеко не в лидирующих позициях по запросам.


      1. forthuse
        18.12.2023 15:20

        Да, это не учитываемый, вероятно, рейтинг в подсчёте презентабельных статистик,
        но какие то выводы и по нему можно сделать.
        FreeBasic, к примеру, в нём сейчас на 14-ом месте и в целом разных упоминаний Бейсиков в нём много, но Вас же в Julia что то привело к действию обратить внимание на этот язык и сподвигло написать статью о нём.


    1. ParaMara
      18.12.2023 15:20

      по нему нет достаточного количества издаваемых книг

      Если никто список не шлёт… Относительно свежие, доступные для тех кто склонен поступать дурно, и вроде как выходят всё чаще.

      Hands-On Julia Programming

      Interactive Visualization and Plotting with Julia

      Julia as a Second Language - вводный курс

      Julia for Data Analysis

      Practical Julia - соответствует названию

      Web Development with Julia and Genie


  1. ParaMara
    18.12.2023 15:20

    Развлекаемся с Джулией

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

    Развлекаться с Джулией - это скорее делать из неё stand alone application, это будет как футбол где для перемещения мяча используются наименее подходящие части тела, хотя для Мака проблема вроде уже решена. Или пользовать в Джулии модули Python. Или связывать её с С++, что вроде как предусмотрено изначально, осталось придумать зачем.

    Pluto.jl – это Jupyter notebook, для Julia. Пока он уступает по возможностям и в "отполированности" Jupyter, но проект постоянно развивается.

    Можно встретить и прямо противоположное мнение - Jupyter неспособен полностью раскрыть преимущества Джулии. Кроме того, у Pluto идеология спредшита, ячейки связаны по смыслу, а у Jupyter - текстового документа, ячейки связаны положением.

    Julia не идеальна

    Более того, недавно совсем произошёл обмен статьями известных кавалеров Джулии где один утверждал, что и пакеты и сама Джулия забагованы beyond repair, а другой отвечал в том смысле, что у Джулии есть масса уникальных достоинств, то есть не по делу. Это тревожит.


    1. Rikimaru22 Автор
      18.12.2023 15:20

      Это правда, когда пишут о Julia, то обычно показывают красивые графики – было написано много хороших библиотек именно для этих целей. Но я думаю, что Ansible и yum сыграли не меньшую роль для популярности Python, чем такие проекты как Pytorch. Python начинался с маленьких скриптов для автоматизации, а Perl как замена для AWK и sed. Julia, как мне кажется для этого подходит не хуже, чем для математического программирования.


      1. deadmoroz14
        18.12.2023 15:20

        Насколько бы мне ни нравилась Julia, для скриптинга она подходит очень так себе.
        С точки зрения производительности надо избегать глобальных переменных, лучше всё оборачивать в функции. А это немного не кейс скриптов, как мне кажется.
        Ну и первый запуск кода обычно не слишком быстрый, т.к. сперва происходит компиляция кода в IR. Поэтому будет чувствоваться медленным

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


        1. Rikimaru22 Автор
          18.12.2023 15:20

          Вы правы, конечно, что у Python лучше startup time, но для скритового языка, как показывает пример ruby – это не критично. Bash и Perl еще быстрее, но за это приходится платить недостающей функциональностью или «читабельностью» кода, как в случае с Perl и AWK.

          У Julia есть AOT компиляция с помощью PackageCompiler.jl, PCRE, макросы и многое другое. На мой взгляд – это хороший размен, но у каждого может быть свое мнение.


    1. deadmoroz14
      18.12.2023 15:20

      Можно встретить и прямо противоположное мнение

      И я с ним согласен. Ноутбуки Pluto очень классные. У юпитера всё хуже с повторяемостью, и нет такой интерактивности (ну или я не знаю о таких фишках там)

      Развлекаться с Джулией - это скорее делать из неё stand alone application

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


      1. ParaMara
        18.12.2023 15:20

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

        Lua. Потому что встраивается в С, а совместимость с C везде относительно хороша. Python. Потому что Kivy - проблемы порешали добрые люди.

        Вообще-то Джулия не интерпретируемый язык, поэтому на мобилках и Lua и Python представлены, а Джулия - нет. Разве что может быть через Termux со товарищи, не знаю, но и это в любом случае ненадолго.


        1. deadmoroz14
          18.12.2023 15:20

          Вообще-то Джулия не интерпретируемый язык,

          Не согласен. Интерпретируемый по умолчанию, с возможностью сборки в бинарник. Или что тут имелось в виду?

          ...поэтому на мобилках и Lua и Python представлены, а Джулия - нет.

          И поэтому не очень понимаю вот эту часть.

          Тот же Kivy тащит за собой рантайм (хоть и в сокращённом виде), без этого никак. На Джулии тоже такое возможно, есть даже StaticCompiler.jl

          Я скорей поверю, что Джулия на мобилках пока просто не требуется, поэтому её и нет)


          1. ParaMara
            18.12.2023 15:20

            Джулия jit- компилируется. Поэтому у неё скорость выполнения близка к С или Rust. На мобилках же W^X политика, проталкиваемая под видом заботы о безопасности - то, что может быть записано, не может быть выполнено. Поэтому чисто интерпретируемые языки работают пока не понадобились бинарные модули помимо предустановленных, то есть проверенных магазином, а jit-compiled языки не работают вообще.

            На Андроид от этой политики, на самом деле введённой чтобы исключить на народных устройствах обработку информации произвольным образом, можно уйти затребовав совместимость со старой версией Андроид на которой её ещё не было. Приложениям Play Store такое уже нельзя, устанавливаемым APK пока можно. Как пример - Termux.

            На iPadOS для приложения Playgrounds сделано исключение. На десктопных ОС исключений больше, но недавно с интересом узнал, что один популярный диалект LISP не может работать на Маках с М процессорами ибо Эппл продвинула на них W^X политику дальше.

            На счёт смартфонов не уверен, на них всё неудобно. Но на планшете Джулия очень даже нужна, это точно. Если конечно не удерживать себя на уровне YouTube да мессенджер.


            1. deadmoroz14
              18.12.2023 15:20

              Понял, спасибо за ответ.
              Не знал про политику W^X, спасибо что просветили. В последний раз когда я делал что-то под Android, там ещё был Dalvik, который JiT, а не AoT.

              Получается, что на мобилках мы вообще никогда не увидим гомоиконичных языков, если так всё будет продолжаться?


              1. ParaMara
                18.12.2023 15:20

                так всё будет продолжаться

                Это невозможный вариант, острая фаза чего бы то ни было продолжаться долго не может. Моё личное мнение - либо увидим, был же Linux on DeX продвигавшийся Самсунгом при очевидном полном одобрении Гугла, либо не увидим ибо на терминале получения приказов без надобности, либо вопрос потеряет актуальность за отсутствием гаджетов.


      1. tzlom
        18.12.2023 15:20

        вообще никаких проблем делать из джулии приложение или встраиваемую библиотеку (если закрыть глаза на размер, но в 24м и это собираются поправить)


  1. economist75
    18.12.2023 15:20

    Питонисты DS-толка с уважением смотрят на медленное "восхождение" Julia, но использовать пока не спешат. Уговоры о близости синтаксиса не срабатывают, обилие скобочек и всевозможной пунктуации (расплата за отказ от отступов) - напрочь лишают блокнотный код привычной DS-читаемости, уже достигнутой в Python. Так что, объективно, с этой стороны поддержки не будет.


    1. deadmoroz14
      18.12.2023 15:20

      Обилие скобочек? Это же не лисп, их тут немного. Вы точно видели код на Julia?
      Если приведёте пример кода с обилием скобочек, будет очень интересно посмотреть)

      Уговоры о близости синтаксиса не срабатывают

      Это к Mojo, Julia не пытается быть Python

      Так что, объективно, с этой стороны поддержки не будет

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


      1. economist75
        18.12.2023 15:20

        Можно посчитать, но не выдергивая из контекста, т.е. не только "обилие скобочек" но и "всевозможную пунктуацию" в примерах кода об одном и том же на Python/Julia. Но полезность этой затеи низкая - каждый останется при своем мнении, и лишь время будет потрачено много и вдвойне.


        1. deadmoroz14
          18.12.2023 15:20

          Ну, то есть изначально было ясно, что мнение не изменится)

          Спасибо за честность


    1. Rikimaru22 Автор
      18.12.2023 15:20

      Мне кажется большинство питонистов DS-толка не занимается решением задач где нужен C/C++ (то есть там где важен перфоманс), потому что тогда они бы по другому посмотрели на Julia.

      Не хочу утрировать, но у нас DS развивается в основном в корпорациях, – а там Hive/Hadoop, Spark, Airflow и Jupyter Notebook. Бери то что дают. Это хороший стек, есть кадры которые с ним знакомы, но на типовых решениях никогда не будет инноваций.