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)])
Как группировать по определенному значению в датасете? Например имя автора коммита:
julia> gdf = groupby(df, :author)
julia> gdf[("Jessica Clarke",)]
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.
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`))
Можно вывести более подробную информацию о созданном дата-сете:
julia> DataFrames.describe(df)
Отсортировать сетевые устройства по утилизации:
julia> sort!(df, [order("%util", rev=true), :"DEV"])
Для парсинга вывода 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]))
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)
ParaMara
18.12.2023 15:20Развлекаемся с Джулией
Ну, не так уж и совсем с Джулией, или не со всей Джулией, скорее с REPL Джулии и то больше в пределах терминала. Написать статью про Джулию без единого красивого графика - это оригинально.
Развлекаться с Джулией - это скорее делать из неё stand alone application, это будет как футбол где для перемещения мяча используются наименее подходящие части тела, хотя для Мака проблема вроде уже решена. Или пользовать в Джулии модули Python. Или связывать её с С++, что вроде как предусмотрено изначально, осталось придумать зачем.
Pluto.jl – это Jupyter notebook, для Julia. Пока он уступает по возможностям и в "отполированности" Jupyter, но проект постоянно развивается.
Можно встретить и прямо противоположное мнение - Jupyter неспособен полностью раскрыть преимущества Джулии. Кроме того, у Pluto идеология спредшита, ячейки связаны по смыслу, а у Jupyter - текстового документа, ячейки связаны положением.
Julia не идеальна
Более того, недавно совсем произошёл обмен статьями известных кавалеров Джулии где один утверждал, что и пакеты и сама Джулия забагованы beyond repair, а другой отвечал в том смысле, что у Джулии есть масса уникальных достоинств, то есть не по делу. Это тревожит.
Rikimaru22 Автор
18.12.2023 15:20Это правда, когда пишут о Julia, то обычно показывают красивые графики – было написано много хороших библиотек именно для этих целей. Но я думаю, что Ansible и yum сыграли не меньшую роль для популярности Python, чем такие проекты как Pytorch. Python начинался с маленьких скриптов для автоматизации, а Perl как замена для AWK и sed. Julia, как мне кажется для этого подходит не хуже, чем для математического программирования.
deadmoroz14
18.12.2023 15:20Насколько бы мне ни нравилась Julia, для скриптинга она подходит очень так себе.
С точки зрения производительности надо избегать глобальных переменных, лучше всё оборачивать в функции. А это немного не кейс скриптов, как мне кажется.
Ну и первый запуск кода обычно не слишком быстрый, т.к. сперва происходит компиляция кода в IR. Поэтому будет чувствоваться медленнымВот то, что надо постоянно гонять - на джулии самое то писать. Всякие расчёты и т.д.
За счёт выразительности языка проще будет писаться. Это язык для научных вычислений и он таким сделан неспроста)Rikimaru22 Автор
18.12.2023 15:20Вы правы, конечно, что у Python лучше startup time, но для скритового языка, как показывает пример ruby – это не критично. Bash и Perl еще быстрее, но за это приходится платить недостающей функциональностью или «читабельностью» кода, как в случае с Perl и AWK.
У Julia есть AOT компиляция с помощью PackageCompiler.jl, PCRE, макросы и многое другое. На мой взгляд – это хороший размен, но у каждого может быть свое мнение.
deadmoroz14
18.12.2023 15:20Можно встретить и прямо противоположное мнение
И я с ним согласен. Ноутбуки Pluto очень классные. У юпитера всё хуже с повторяемостью, и нет такой интерактивности (ну или я не знаю о таких фишках там)
Развлекаться с Джулией - это скорее делать из неё stand alone application
Ну это уж точно то ещё развлечение. А вообще, покажите хоть один интерпретируемый язык, где с этим не будет проблем.
ParaMara
18.12.2023 15:20А вообще, покажите хоть один интерпретируемый язык, где с этим не будет проблем.
Lua. Потому что встраивается в С, а совместимость с C везде относительно хороша. Python. Потому что Kivy - проблемы порешали добрые люди.
Вообще-то Джулия не интерпретируемый язык, поэтому на мобилках и Lua и Python представлены, а Джулия - нет. Разве что может быть через Termux со товарищи, не знаю, но и это в любом случае ненадолго.
deadmoroz14
18.12.2023 15:20Вообще-то Джулия не интерпретируемый язык,
Не согласен. Интерпретируемый по умолчанию, с возможностью сборки в бинарник. Или что тут имелось в виду?
...поэтому на мобилках и Lua и Python представлены, а Джулия - нет.
И поэтому не очень понимаю вот эту часть.
Тот же Kivy тащит за собой рантайм (хоть и в сокращённом виде), без этого никак. На Джулии тоже такое возможно, есть даже StaticCompiler.jl
Я скорей поверю, что Джулия на мобилках пока просто не требуется, поэтому её и нет)
ParaMara
18.12.2023 15:20Джулия jit- компилируется. Поэтому у неё скорость выполнения близка к С или Rust. На мобилках же W^X политика, проталкиваемая под видом заботы о безопасности - то, что может быть записано, не может быть выполнено. Поэтому чисто интерпретируемые языки работают пока не понадобились бинарные модули помимо предустановленных, то есть проверенных магазином, а jit-compiled языки не работают вообще.
На Андроид от этой политики, на самом деле введённой чтобы исключить на народных устройствах обработку информации произвольным образом, можно уйти затребовав совместимость со старой версией Андроид на которой её ещё не было. Приложениям Play Store такое уже нельзя, устанавливаемым APK пока можно. Как пример - Termux.
На iPadOS для приложения Playgrounds сделано исключение. На десктопных ОС исключений больше, но недавно с интересом узнал, что один популярный диалект LISP не может работать на Маках с М процессорами ибо Эппл продвинула на них W^X политику дальше.
На счёт смартфонов не уверен, на них всё неудобно. Но на планшете Джулия очень даже нужна, это точно. Если конечно не удерживать себя на уровне YouTube да мессенджер.
deadmoroz14
18.12.2023 15:20Понял, спасибо за ответ.
Не знал про политику W^X, спасибо что просветили. В последний раз когда я делал что-то под Android, там ещё был Dalvik, который JiT, а не AoT.Получается, что на мобилках мы вообще никогда не увидим гомоиконичных языков, если так всё будет продолжаться?
ParaMara
18.12.2023 15:20так всё будет продолжаться
Это невозможный вариант, острая фаза чего бы то ни было продолжаться долго не может. Моё личное мнение - либо увидим, был же Linux on DeX продвигавшийся Самсунгом при очевидном полном одобрении Гугла, либо не увидим ибо на терминале получения приказов без надобности, либо вопрос потеряет актуальность за отсутствием гаджетов.
tzlom
18.12.2023 15:20вообще никаких проблем делать из джулии приложение или встраиваемую библиотеку (если закрыть глаза на размер, но в 24м и это собираются поправить)
economist75
18.12.2023 15:20Питонисты DS-толка с уважением смотрят на медленное "восхождение" Julia, но использовать пока не спешат. Уговоры о близости синтаксиса не срабатывают, обилие скобочек и всевозможной пунктуации (расплата за отказ от отступов) - напрочь лишают блокнотный код привычной DS-читаемости, уже достигнутой в Python. Так что, объективно, с этой стороны поддержки не будет.
deadmoroz14
18.12.2023 15:20Обилие скобочек? Это же не лисп, их тут немного. Вы точно видели код на Julia?
Если приведёте пример кода с обилием скобочек, будет очень интересно посмотреть)Уговоры о близости синтаксиса не срабатывают
Это к Mojo, Julia не пытается быть Python
Так что, объективно, с этой стороны поддержки не будет
Очень сомнительно, учитывая отличную поддержку в Julia автоматического дифференцирования за счёт метапрограммирования. Фреймворки автоматического дифференцирования на Python в принципе могут справиться далеко не со всем
economist75
18.12.2023 15:20Можно посчитать, но не выдергивая из контекста, т.е. не только "обилие скобочек" но и "всевозможную пунктуацию" в примерах кода об одном и том же на Python/Julia. Но полезность этой затеи низкая - каждый останется при своем мнении, и лишь время будет потрачено много и вдвойне.
deadmoroz14
18.12.2023 15:20Ну, то есть изначально было ясно, что мнение не изменится)
Спасибо за честность
Rikimaru22 Автор
18.12.2023 15:20Мне кажется большинство питонистов DS-толка не занимается решением задач где нужен C/C++ (то есть там где важен перфоманс), потому что тогда они бы по другому посмотрели на Julia.
Не хочу утрировать, но у нас DS развивается в основном в корпорациях, – а там Hive/Hadoop, Spark, Airflow и Jupyter Notebook. Бери то что дают. Это хороший стек, есть кадры которые с ним знакомы, но на типовых решениях никогда не будет инноваций.
forthuse
Язык Julia на третьем месте по популярности представлнных решений
с площадки rosettacode.org Rosetta Code/Rank languages by popularity/Full list
но, возможно, за счёт каких то его фанов или усилиями разработчиков включённых в его развитие? (т.к., вроде, по нему нет достаточного количества издаваемых книг, если они вообще есть)
Rikimaru22 Автор
А на первых местах в этом списке Phix, Wren – не сказать, что очень популярные языки. Я думаю, что рейтинг Stack Overflow будет немого более репрезентативным. А там насколько я знаю Julia далеко не в лидирующих позициях по запросам.
forthuse
Да, это не учитываемый, вероятно, рейтинг в подсчёте презентабельных статистик,
но какие то выводы и по нему можно сделать.
FreeBasic, к примеру, в нём сейчас на 14-ом месте и в целом разных упоминаний Бейсиков в нём много, но Вас же в Julia что то привело к действию обратить внимание на этот язык и сподвигло написать статью о нём.
ParaMara
Если никто список не шлёт… Относительно свежие, доступные для тех кто склонен поступать дурно, и вроде как выходят всё чаще.
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