Простые приложения на Julia
Простые приложения на Julia
Julia ориентирована на численные расчёты — быстрые массивы, REPL, пакеты через Pkg. Для "простых приложений" типичны обработка CSV, статистика, визуализация.
Как запускать примеры из главы
- Скрипт:
julia имя.jl - Пакеты: в REPL
] add CSV DataFrames(один раз). - Проверка:
julia --version(1.9+).
Генератор паролей
Как запустить
- Файл:
password.jl - Команда:
julia password.jl
using Random
function generate_password(n::Int=16)
chars = ['a':'z'; 'A':'Z'; '0':'9'; '!', '@', '#', '$', '%']
String(rand(chars) for _ in 1:n)
end
println(generate_password())
Что здесь важно:
Randomберёт источник случайности из стандартной библиотеки.n::Int=16задаёт длину по умолчанию и ожидаемый тип аргумента.- Генератор
for _ in 1:nсоздаёт строку без лишних промежуточных структур.
Как улучшить учебный пример:
function generate_password(n::Int=16; with_symbols::Bool=true)
base = ['a':'z'; 'A':'Z'; '0':'9']
chars = with_symbols ? [base; '!', '@', '#', '$', '%'] : base
return String(rand(chars) for _ in 1:n)
end
Сводка по CSV
using CSV, DataFrames, Statistics
df = CSV.read("data.csv", DataFrame)
println(describe(df))
println("mean price = ", mean(df.price))
Полезные проверки, чтобы пример был ближе к реальной задаче:
@assert :price in names(df) "В CSV нет колонки price"
clean = dropmissing(df, :price)
println("rows = ", nrow(clean))
println("median price = ", median(clean.price))
Частая ошибка новичка: считать среднее по колонке, где есть missing.
Простой HTTP (HTTP.jl)
using HTTP, JSON3
route = function(req)
if req.target == "/"
return HTTP.Response(200, ["Content-Type" => "application/json"],
JSON3.write(Dict("ok" => true)))
end
HTTP.Response(404, "not found")
end
# HTTP.serve(route, "127.0.0.1", 8000)
Чтобы запустить локально:
- Раскомментируйте строку
HTTP.serve(...). - Запустите
julia server.jl. - Откройте
http://127.0.0.1:8000/.
Для первого API этого достаточно. Теорию по протоколу смотрите в HTTP как основа веб-интеграций.
Запись JSON-трекера
using JSON3
mutable struct Task
id::Int
title::String
done::Bool
end
tasks = [Task(1, "Изучить Julia", false)]
open("tasks.json", "w") do io
JSON3.write(io, tasks)
end
Что добавить в практической версии:
- чтение уже существующего файла задач;
- обновление
doneпоid; - валидацию входных данных перед записью. См. Проверка и валидация.
Характерный пример — векторизация
x = 1:1_000_000
y = @. sin(x) + cos(2x) # broadcast без явного цикла
println(sum(y))
Оператор @. применяет функцию поэлементно — основа производительности Julia.
Мини-приложение "анализ продаж"
Ниже пример цельного скрипта, где соединяются CSV, агрегация и запись результата:
using CSV, DataFrames, Statistics, JSON3
df = CSV.read("sales.csv", DataFrame)
@assert all(["region", "amount"] .∈ Ref(names(df)))
clean = dropmissing(df, [:region, :amount])
grouped = combine(groupby(clean, :region), :amount => mean => :avg_amount)
open("report.json", "w") do io
JSON3.write(io, grouped)
end
println(grouped)
Это уже типичный рабочий "малый" pipeline, который часто встречается в аналитике.
Частые ошибки в простых приложениях
| Симптом | Вероятная причина | Что сделать |
|---|---|---|
Package ... not found | Пакет не установлен в текущем окружении | ] add ... и проверить Pkg.status() |
MethodError в арифметике | Смешаны несовместимые типы | Проверить typeof(...) и привести типы |
| Неожиданно медленно | Много глобальных переменных и аллокаций | Унести логику в функции, проверить @time |
| Ошибка чтения CSV | Неверный путь/разделитель/кодировка | Проверить путь и параметры CSV.read |
Как масштабировать эти примеры дальше
От "простых приложений" обычно двигаются по двум траекториям:
- Аналитика и ML —
DataFrames,Plots,Flux,MLJ. - Инженерные расчёты —
DifferentialEquations,Optim, распределённые вычисления.
Связанные статьи этого раздела: Основы, Архитектура, Функции и макросы, Первая программа.
См. также: R — простые приложения
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.