
ΠΠ½ΠΈΠΌΠΈΡΠ°Π½ΠΈ Ρ
ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΡΠ°ΠΉΡ, ΡΡΠ°Π²Π°Ρ Π²ΡΠ΅ ΠΏΠΎ-ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈ. Π’Π΅ ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π½Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΏΠ΅ΡΠΈΠΎΠ΄ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅ ΠΈ Π³ΠΎ ΠΏΡΠ°Π²ΡΡ Π²ΠΈΠ·ΡΠ°Π»Π½ΠΎ. ΠΠ΅ΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΈ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° R ΠΈ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ.
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°: ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ .
ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌΠ΅: Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ Π½Π° Β«Π₯Π°Π±ΡΠ°Β» β ΠΎΡΡΡΡΠΏΠΊΠ° ΠΎΡ 10 000 ΡΡΠ±Π»ΠΈ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΊΡΡΡ Skillbox Ρ ΠΏΡΠΎΠΌΠΎΠΊΠΎΠ΄ Β«Π₯Π°Π±ΡΒ».
ΠΠ°ΠΊΠ΅ΡΠΈΡΠ΅
ΠΡΠΆΠ΄Π°Π΅ΠΌ ΡΠ΅ ΠΎΡ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π² R:
- ggplot2
Π’Π΅Π·ΠΈ Π΄Π²Π° ΡΠ° Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΠ΅ Π½ΠΈ ΡΡΡΠ±Π²Π°Ρ tidyverse, janitor ΠΈ scales Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅, ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠ°ΡΠΈΠ²Π° ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°Π½Π΅ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ.
ΠΠ°Π½Π½ΠΈ
ΠΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡΡ Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π² ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»Ρ ΠΎΡ ΡΠ°ΠΉΡΠ° Π½Π° Π‘Π²Π΅ΡΠΎΠ²Π½Π°ΡΠ° Π±Π°Π½ΠΊΠ°. ΠΡΠΎ Π³ΠΈ β . Π‘ΡΡΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, Π°ΠΊΠΎ Π²ΠΈ ΡΡΡΠ±Π²Π°Ρ Π² Π³ΠΎΡΠΎΠ² Π²ΠΈΠ΄, ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»ΡΡ ΠΎΡ .
ΠΠ°ΠΊΠ²Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π΅ ΡΠΎΠ²Π°? ΠΠ·Π²Π°Π΄ΠΊΠ°ΡΠ° ΡΡΠ΄ΡΡΠΆΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΠΠ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΡΡΠ°Π½ΠΈ Π·Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ (ΠΎΡ 2000 Π΄ΠΎ 2017 Π³ΠΎΠ΄ΠΈΠ½Π°).
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅
Π©Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΊΠΎΠ΄Π°, ΠΏΠΎΡΠΎΡΠ΅Π½ ΠΏΠΎ-Π΄ΠΎΠ»Ρ, Π·Π° ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΡΠΎΡΠΌΠ°Ρ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅. ΠΠΎΡΠΈΡΡΠ²Π°ΠΌΠ΅ ΠΈΠΌΠ΅Π½Π°ΡΠ° Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈΡΠ΅, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°ΠΌΠ΅ ΡΠΈΡΠ»Π°ΡΠ° Π² ΡΠΈΡΠ»ΠΎΠ² ΡΠΎΡΠΌΠ°Ρ ΠΈ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° gather(). ΠΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠΌ, ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π² gdp_tidy.csv Π·Π° ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°.
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°(tidyverse)
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°(janitor)
gdp <- read_csv("./data/GDP_Data.csv")
#select required columns
gdp % select(3:15)
#filter only country rows
gdp <- gdp[1:217,]
gdp_tidy %
mutate_at(vars(contains("YR")), as.numeric) %>%
gather(year, value, 3:13) %>%
janitor::clean_names() %>%
mutate(year = as.numeric(stringr::str_sub(year, 1, 4)))
write_csv(gdp_tidy, "./data/gdp_tidy.csv")
ΠΠ½ΠΈΠΌΠΈΡΠ°Π½ΠΈ Ρ ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΈ
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ ΠΈΠΌ ΠΈΠ·ΠΈΡΠΊΠ²Π° Π΄Π²Π° Π΅ΡΠ°ΠΏΠ°:
- ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠ»Π΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ Π°ΠΊΡΡΠ°Π»Π½ΠΈ Ρ ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΈ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ggplot2.
- ΠΠ½ΠΈΠΌΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈ Ρ ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΈ Ρ ΠΆΠ΅Π»Π°Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° gganimate.
ΠΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΡΡΠΏΠΊΠ° Π΅ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π°Π½ΠΈΠΌΠ°ΡΠΈΡΡΠ° Π² ΠΆΠ΅Π»Π°Π½ΠΈΡ ΡΠΎΡΠΌΠ°Ρ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ GIF ΠΈΠ»ΠΈ MP4.
ΠΠ°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅
- Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°(tidyverse)
- library(gganimate)
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅
ΠΠ° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅, Π·Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠΎΠΏ-10 ΡΡΡΠ°Π½ΠΈ Π·Π° Π²ΡΡΠΊΠ° Π³ΠΎΠ΄ΠΈΠ½Π°. ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π΄Π° ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π° Π»Π΅Π³Π΅Π½Π΄Π° Π·Π° Ρ ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ°.
gdp_tidy <- read_csv("./data/gdp_tidy.csv")
gdp_formatted %
group_by(year) %>%
# The * 1 makes it possible to have non-integer ranks while sliding
mutate(rank = rank(-value),
Value_rel = value/value[rank==1],
Value_lbl = paste0(" ", round(value/1e9))) %>%
group_by(country_name) %>%
filter(rank %
ungroup()
ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈ Ρ ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΈ
Π‘Π΅Π³Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΠ°ΠΊΠ΅Ρ Π΄Π°Π½Π½ΠΈ Π² Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΡΠΎΡΠΌΠ°Ρ, Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅ Ρ ΡΠΈΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈ Ρ ΠΈΡΡΠΎΠ³ΡΠ°ΠΌΠΈ. ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ β ΡΠΎΠΏ-10 ΡΡΡΠ°Π½ΠΈ Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π΅Π½ ΠΠΠ Π·Π° ΠΈΠ·Π±ΡΠ°Π½ΠΈΡΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅. ΠΡΠ°ΡΠΈΠΊΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Ρ Π·Π° Π²ΡΡΠΊΠ° Π³ΠΎΠ΄ΠΈΠ½Π°.
staticplot = ggplot(gdp_formatted, aes(rank, group = country_name,
fill = as.factor(country_name), color = as.factor(country_name))) +
geom_tile(aes(y = value/2,
height = value,
width = 0.9), alpha = 0.8, color = NA) +
geom_text(aes(y = 0, label = paste(country_name, " ")), vjust = 0.2, hjust = 1) +
geom_text(aes(y=value,label = Value_lbl, hjust=0)) +
coord_flip(clip = "off", expand = FALSE) +
scale_y_continuous(labels = scales::comma) +
scale_x_reverse() +
guides(color = FALSE, fill = FALSE) +
theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line( size=.1, color="grey" ),
panel.grid.minor.x = element_line( size=.1, color="grey" ),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="grey", vjust=-1),
plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="grey"),
plot.caption =element_text(size=8, hjust=0.5, face="italic", color="grey"),
plot.background=element_blank(),
plot.margin = margin(2,2, 2, 4, "cm"))
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π³ΡΠ°ΡΠΈΠΊΠΈ Ρ ggplot2 Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π»Π΅ΡΠ½ΠΎ. ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π² ΠΊΠΎΠ΄Π° ΠΏΠΎ-Π³ΠΎΡΠ΅, ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠ»ΡΡΠΎΠ²ΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Ρ ΡΡΠ½ΠΊΡΠΈΡΡΠ° theme (). Π’Π΅ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ, Π·Π° Π΄Π° ΡΠ΅ Π°Π½ΠΈΠΌΠΈΡΠ°Ρ Π²ΡΠΈΡΠΊΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. ΠΡΠΊΠΎΠΈ ΠΎΡ ΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ. ΠΡΠΈΠΌΠ΅Ρ: Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ ΡΠ΅ ΡΠ°ΠΌΠΎ Π²Π΅ΡΡΠΈΠΊΠ°Π»Π½ΠΈΡΠ΅ Π»ΠΈΠ½ΠΈΠΈ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΈ Π»Π΅Π³Π΅Π½Π΄ΠΈΡΠ΅, Π΄ΠΎΠΊΠ°ΡΠΎ Π·Π°Π³Π»Π°Π²ΠΈΡΡΠ° Π½Π° ΠΎΡΠΈΡΠ΅ ΠΈ ΠΎΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΠ΅ ΠΈΠ·ΡΡΠΈΠ²Π°Ρ ΠΎΡ ΡΡΠ°ΡΡΡΠΊΠ°.
ΠΠ½ΠΈΠΌΠ°ΡΠΈΡ
ΠΠ»ΡΡΠΎΠ²Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠΊ Π΅ transition_states(), ΠΊΠΎΡΡΠΎ ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π° ΠΎΡΠ΄Π΅Π»Π½ΠΈΡΠ΅ ΡΡΠ°ΡΠΈΡΠ½ΠΈ Π³ΡΠ°ΡΠΈΠΊΠΈ. view_follow () ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π»ΠΈΠ½ΠΈΠΈΡΠ΅ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ°.
anim = staticplot + transition_states(year, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(title = 'ΠΠΠ Π½Π° Π³ΠΎΠ΄ΠΈΠ½Π° : {closest_state}',
subtitle = "Π’ΠΎΠΏ 10 Π΄ΡΡΠΆΠ°Π²ΠΈ",
caption = "ΠΠΠ Π² ΠΌΠΈΠ»ΠΈΠ°ΡΠ΄ΠΈ USD | ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ: Π‘Π²Π΅ΡΠΎΠ²Π½Π° Π±Π°Π½ΠΊΠ°")
Π Π΅Π½Π΄Π΅ΡΠΈΠ½Π³
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π°Π½ΠΈΠΌΠ°ΡΠΈΡΡΠ° Π±ΡΠ΄Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° ΠΈ Π·Π°ΠΏΠ°Π·Π΅Π½Π° Π² ΠΎΠ±Π΅ΠΊΡΠ° anim, ΠΈΠ΄Π²Π° Π²ΡΠ΅ΠΌΠ΅ Π΄Π° Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° animate (). Π Π΅Π½Π΄Π΅ΡΠ΅ΡΡΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π² animate (), ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΡΠΈΠΏΠ° Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΠΈΠ·Ρ ΠΎΠ΄Π΅Π½ ΡΠ°ΠΉΠ».
GIF
# For GIF
animate(anim, 200, fps = 20, width = 1200, height = 1000,
renderer = gifski_renderer("gganim.gif"))
MP4
# For MP4
animate(anim, 200, fps = 20, width = 1200, height = 1000,
renderer = ffmpeg_renderer()) -> for_mp4
anim_save("animation.mp4", animation = for_mp4 )
Π Π΅Π·ΡΠ»ΡΠ°Ρ

ΠΠ°ΠΊΡΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Π½ΡΠΌΠ° Π½ΠΈΡΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ. Π¦Π΅Π»ΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² , ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ°ΠΊΠ°, ΠΊΠ°ΠΊΡΠΎ ΡΡΠΈΡΠ°ΡΠ΅ Π·Π° Π½ΡΠΆΠ½ΠΎ.
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°:
- ΠΠ²ΡΠ³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ .
- ΠΠ½Π»Π°ΠΉΠ½ ΠΊΡΡΡ .
- ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΊΡΡΡ .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
