SQLᣠáá ááá ááá áá˝áá? áĽáŤááłááłá˝á ááá áĽáŤáá ááťá áĽáá˝ááá - áĽáá˝ááá ááá¨áĄ, á¨áááááľá áááśá˝ áááááŠ, á¨á፠á¨, á°áá á¨áĽ áľá, á ááłááľ áááłáá˝ ááľáĽ á¨áľ áĽá ፠áĽáť áá - á áá áá¨á á áŞáłá˝á ááľáĽ á á ᣠáĽá (á¨áá áá°á) ááá ááá áá DBMS á á፠áá (ááá ááááŁáľ)
áĽá áá˛áŤáá áĽáááá
á¨ááá-áááááľ áŤááł
ᨠORM á°áááá˝ á¨ááĽááľ áĽá á¨ááľááľ áááááľáŁ á¨á˛á˘á¤áá¤áľ áá áááŁáľ áĽá áášá áŽáľá á á°áááś áá áá°áŁáᢠááĽáááťá˝á á¨áá¨á ááą (áĽá áĽá áá á¨áá¨á ááą áŤáą) áá áááľáŤáľ á¨ááŤáľá˝á áŽáľ
áĽááá áá áĽáá°áá áŤá ááá áááľááâŚ
@Entity
@Table(name = "stock", catalog = "maindb", uniqueConstraints = {
@UniqueConstraint(columnNames = "STOCK_NAME"),
@UniqueConstraint(columnNames = "STOCK_CODE") })
public class Stock implements java.io.Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "STOCK_ID", unique = true, nullable = false)
public Integer getStockId() {
return this.stockId;
}
...
áá´á á áĽáááľ ááĽáŤáŞáŤáá˝ á°á°á
ááᣠáĽá á¨áá áŚáł á¨áľááááą á áľá°ááᣠá ááľ áááááľ ORM á ááłááľ á¨SQL áŽáľ áŤáááŤá áĽá áŤáľáá˝ááᢠá áááŤá˝á áá ááá˘áá˝ á¨áá¨á ááłá¸á ááľáĽ á áŞáááľáŽá˝ á¨áá
á
ááá˝ áĽáŤáłá¸áá ááááá á¨á°áťáá¸áá áĽá¨áŁáŠ áá áŁáá
á á¨á°áá°ááľá áŤáłáŤáá˘
á áááá á¨ááááł áááᣠá¨ááá "á áĽá á¨á°á°áŤ" SQL á°á¨áłáŽá˝ áááá ááá á¨á˛á˘á¤áá¤áľ ááľáĽ áŤá á°á¨á᪠á˝ááá˝ áĽá áá áááŤáá˝ á¨áááá á˝ááłá áŤáľá°áááᢠá áá¤áąá, "áá¨áá áŤáá¨á" ááŽáááśá˝ ááłáŤá, á áአáááł á¨á°áá á á°áá˝ á áá¨á ááą ááľáĽ á¨ááłá°áá áľ (áĽááąá "áá°á¨áłá" áá¸á, "áá á¨áłá" áá¸á, áĽááą á°áá "áŁáľá°ááľ", ááá°) áĽá ááá˘áá˝ áá¸á. áá° ááááŽá˝ áłááᥠááá á¨áááľá áĽááłáá˝ áĽá á¨á°á¨ááš áá°áśá˝á "ááłáĽ" áĽáť áŤáľáááááłáá˘
á¨áááąá ááááľ áááŚá˝ áĽááááľ? áá
ááááľá á¨ááŤá¨ááἠáľá áŁáá á áľá°áá ááŁáŞáŤ ááľáĽ áĽáá´áľ áĽáá°áá°á¨á
áááá DSLs áááá á á áŞá ááá ááᣠáá SQL áŤáą á áŞá DSL ááᣠáĽá áá á áŤáľáááááᢠá¤áľ-á áááážá˝ á áŁá áĽáŠ áá¸áᣠáá áĽáá ááá á á˛áľ ááá á áá¨ááŠáᢠá áá¤áąá, áá ááĽáŽá˝ á˛áŁá á ááá˝á áĽááááá. á ááľááá? á¨á፠á áá¨á ááą áá áŤáá á¨áá ááá°áľ á˛ááá áĽá á¨á°ááŁáŠ áá ááááľ áĽáľá¨ááááŠá áľ áá áľá¨áľ áá áĽá (áĽáŹ-áľáŠáá)
áłá˛áŤ áá ááľá¨á á ááĽá? SQLá áĽáá° áá°á á SQL áĽáá°áá - á áĽáŤá á ááľ ááááĄ-
-- name: users-by-country
select *
from users
where country_code = :country_code
... áĽá áá á ááá á ááĽáĽáŁ áá° áá°á áá á¨áááá á°ááŁá á ááá¨ááŚ
(defqueries "some/where/users_by_country.sql"
{:connection db-spec})
;;; A function with the name `users-by-country` has been created.
;;; Let's use it:
(users-by-country {:country_code "GB"})
;=> ({:name "Kris" :country_code "GB" ...} ...)
á¨"SQL á áŤáąáŁ áááá á áŤáą" á¨áááá ááá á ááá á á¨áá¨á°ááá áŤááááĄ-
- ááá á¨á ááŁáĽ á áľááŤá áááŽá˝ á¨ááᢠá¨ááἠááłá (áĽáá° ááááá áá) á¨SQL ááľáááľ áá 100% á áŤá¨áĽáá - áá áá Yesql ááá á áá°ááᢠá SQL á áť á ááŁáĽ áá á°á áá á áłáŁáááᢠáá° á°ááŁá á ááŤá˝ ááááľ á¨ááĽááľá (raw-sql "á ááłááľ ('funky':: SYNTAX)"))).
- ááἠá¨á ááłá áľááᢠá¨áĽááľá á ááłá á áľááľá á áŁá áĽáŠ á¨SQL áľáá á ááᢠSQL áĽáá° SQL á ááľááἠá ááá áá ááá áľ áá˝ááá˘
- á¨áĄáľá á°áłááááľ. á¨áĽááľá á˛á˘á¤áá˝ á Clojure ááŽáááľá ááľáĽ á¨áá ááá áľá SQL ááá ἠáĽá ááá áá˝ááá˘
- ááá á¨á ááťá¸á ááľá°áŤá¨áŤ. á˝áá ááá áľ áĽáŤá áĽá áľ ááááŁáľ ááááá? áĽáŤáá áá°á á SQL á˛áá áá á˝áá á áá°ááá˘
- áá ááá˝á áĽáá°áá áá ááᢠáĽáááŤá á°ááłáłá SQL áááá˝ áá° ááá˝ ááŽáááśá˝ áááľáˇá¸á ááááŤáąá áá áŤá¨á SQL - á á áŤááŠáľá˘
á áĽá á áľá°áŤá¨áľ ááłáĄ á áŁá á áŞá áĽá á á°ááłáłá áá á áŁá ááá áá, ááá
á ááľáá áááŁáá ááŽáááą áĽááá˝á á áááˇá
á áá˛á˘ áĽá á˛á˘ á áľá°áłáłáŞáá˝
á ááá á¨áááľ á°áááľ á°ááŁá áĽááááᢠáĽááá áá á áá¨á ááą ááľáĽ á ááłááľ áááá˝á áááá á ááĽá ᣠáááłá ᣠá ááŽááŤá ááľáĽ á°áá á¨áĽ áááá áĽá á ááááŠá (áá ááááľ áááśá˝ ᣠáááὠᣠá˘áá´ááśá˝ ᣠáá°áŚá˝ ᣠááá° áĽá á áá áááá)ᢠáĽá á¨ááááá ááŤáá á áá˛á˘ ááá áľáá˝ á˛á˘-á áľá°áłáłáŞáŁ á ááááŞáŤáŁ á áľááá áĽááá á á˝ááłáá˝ áĽáá áĽáááᢠáľááá ááŁá áĽáá˛áá áĽá á áľááááá áá¨á á¨áŤá ááľáŽáľ áĽáľáŞáᣠáľá¨áľ (á á°áá á¨áááľ áłáłá¤á áá á áááł áááááľ) áĽá á á°ááłáłá áá á¨á°áá ááľ áá¨ááá˝ áľáŠáľ áĽá á áá áá¸á ᢠáĽá á¨á°á¸áá ááťáť á áá°áá. á¨áá á á áá, á¨á áá ááľáĽáľáĽ áĽá áľáá á¨ááἠááł áĽá ááĽáŤá¸á áĽá¨á¨áᨠá áá° áá á áá á áááľá¨á á¨á áá á áľá¸á᪠áá.
áá áĽááá áá á áá¤á áĽáĽááá áĽá áŽáľá áĽáť ââáĽá˝áááᢠá "HR" áĽá áľ ááľáĽ á¨áľááš á°áá á¨áŚá˝ (áĽá á¨á¨áľááš ááĽá¨áśá˝ áá) áĽáá°ááá ááá áŤáľáááááłá áĽáá á. á á áĽááááš á˛á˘á¤áá¤áľáá˝áŁ á¨áááááá áá¤áľ á áá ááá á¨áá¨á_schema ááááľ ááťáááĄ-
select table_name
, ...
from information_schema.tables
where schema = 'HR'
á¨áá¨á ááľ áá° áłáłá¤áᣠá¨áĽáá°áá á áááľ á¨ááŁááť á áá á¨áŚá˝ áááśá˝ áĽáá° áĽáŤááłááą á˛á˘á¤áá¤áľ á á á áááŤáŤáᢠáĽá áááłáᣠá MySQLᣠá¨á°ááłáłáŠ á¨áááłá¨áŞáŤ áá˝áá ááá á˛á˘á¤áá¤áľ á¨á°áᨠá¨á°áá á¨áĽ áááŞáŤáá˝á ááááľ áá˝ááá˘
select table_name
, storage_engine -- ĐŃпОНŃСŃоПŃĐš "двиМОк" ("MyISAM", "InnoDB" etc)
, row_format -- ФОŃĐźĐ°Ń ŃŃŃОки ("Fixed", "Dynamic" etc)
, ...
from information_schema.tables
where schema = 'HR'
Oracle á¨áá¨á_schema á áŤáá
áᣠáá á ááá˘
select table_name
, pct_free -- ĐиниПŃĐź ŃвОйОднОгО ПоŃŃĐ° в йНОко даннŃŃ
(%)
, pct_used -- ĐиниПŃĐź иŃпОНŃСŃоПОгО ПоŃŃĐ° в йНОко даннŃŃ
(%)
, last_analyzed -- ĐĐ°ŃĐ° пОŃНодногО ŃйОŃĐ° ŃŃĐ°ŃиŃŃики
, ...
from all_tables
where owner = 'HR'
ClickHouse á¨áá á¨á°áᨠá áá°áááĄ-
select name
, engine -- ĐŃпОНŃСŃоПŃĐš "двиМОк" ("MergeTree", "Dictionary" etc)
, ...
from system.tables
where database = 'HR'
á°ááłáłá á¨áá ááá á áŤáłááľáŤ ááľáĽ áá°á¨á áá˝áá (á áááááĽá áááł á¨á á¨á´ááá˝ áĽá á¨ááá áŚáłáá˝ ááá á¨á ááľ á¤á°á°áŚá˝ á ááľ)á˘
select columnfamily_name
, compaction_strategy_class -- ĐĄŃŃĐ°ŃĐľĐłĐ¸Ń ŃйОŃки ĐźŃŃĐžŃĐ°
, gc_grace_seconds -- ĐŃĐľĐźŃ ĐśĐ¸ĐˇĐ˝Đ¸ ĐźŃŃĐžŃĐ°
, ...
from system.schema_columnfamilies
where keyspace_name = 'HR'
áá áĽááááš ááá˝ á¨ááἠááłáá˝áŁ á°ááłáłá áá ááá˝á ááá áááŁáľ áá˝áá (ááá áĽááłá á ááľá˘
áĽááἠáá, á áá
ááááľ áľá á á¨á´ááá˝ áĽáť áłááá á á á ááá áľáááááá ááá áá¨á ááááľ áá˝áá. á¨áá áá° áá á°á á°áá˝ áĽáá˛á
ááááąá áŽáľ áá°ááŤáŠ á¨ááἠááłáá˝ áŤááŤá ᣠáááłá ᣠá á°á¨áłáłá á¨ááĽáŤ ááŁáĽáá˝ ááľáĽ âPostgreSQL á¨ááἠááłáá˝á áááááἠá°ááŁáŤáľâ (
á áá¤áąá, áá
ááłááśá˝á á¨áá°áľ áĽá á¨áááá áá´ á¨á áá á°áááá áá, áĽá áá áááĽáŁá, áĽá áá¨ááá á áá á áľááá á ááá áľ ááá á áľááá áĽáá˛áŤáá áŤáľá˝áááłá (áááłá, á ááľáł ááľáĽ áĽáá°á°ááá¸á).
á¨áááá˝ áá ááááá˝
á áľááááášá áááŽá˝ áŤááá áĽá áŤá áá á áá, á¨áĽááą áá á ááľ á áá ááá áááľá¨á ááá á áá áá. á á°ááĽáŽ ᣠáĽáá˛áá áŁáśá˝áá á¨ááá á°ááłá áá áłáŤááąá˘
á ááá á áá á¨áĽá áá°á¨á á ááá á¨áá¨á ááśá˝ ááľáĽ á ááľ á áááľ áĽáá°ááá ááľá˘á á áá°áááĄ
drop table hr.persons
ááá áá á¨á á¨á´áá ááá á á¨á áá á áľá°áłá˝ áááá. ááááá á˛á˘á¤áá¤áľ (áĽá áá¤áľáŞá¤áá á¨ááŽ) á á ááľ ááá á áá ááአâá áá á¨áĽ ááá áâ áá˝ááᣠáĽá á¨áĽáą áá ááá áľáá˝ áĽááłá áááŤá áá˝áá (áľá ᣠá¨á ááśá˝ áááá ᣠá¨ááἠááááśá˝) ᣠáá ááá˝ ááááŽá˝ á á¨áá°á áááł áááŤáŠ áĽá á á¨ááľáĽ ááŁáŞáŤ áĽá á¨á ááľ á¨á°áá°á á˛á˘á¤áá¤áľ á˝ááłáá˝á˘ á áŁá á¨ááá°á ááłá á Oracle á°ááľ ááľáĽ á"á á¨á´á áá á" á ááŁáĽ "áŤááľ" BNFs áĽáť áá áŤááá˘
áĽáá˛ááᣠáĽá á˛á˘á¤áá¤áľáá˝ á ááá˝ á˛á˘á¤áá¤áľ ááľáĽ á¨áááá á¨áŤáłá¸á áአááááľ áááŽá˝ á áá¸áᢠá¨áá á á áá á áłáłá¤á áááá˝ áá áĽáť áłááá á á˛á˘á¤áá¤áľ á áŤáą ááá áááááá˝á áá¨ááá áĽáá˝ááá áááłá á ááľá áá°áľ âááá°áâᣠá ááłááľ á¨ááľáłááť áŚáłáá˝á áá ááľá¨áᣠáááá ááááľáŁ áá° âááá ἠáĽáťâ áááł ááá¨á áĽá ááá˝áá ááľá¨á áĽáá˝áááá˘
á áá áľáá˝ áĽááłá
á¨á°áááąáľ á°ááŁáŤáľ á ááą á¨áłáłá¤á áááá˝ áá ááľá ááááŁáľ áĽá á ááŤá¨áá¸á áŤááľá áááŽá˝ áĽá áááááśá˝ á ááŤáá ááľá áá¨áľ áá ᢠááááá áááľ ááťáá ááŤáá á áá˛á˘áŁ á¨á°áᨠâá¨áľáĽáá ááľááâ áááááŤáá˝áŁ áአá¨ááŤáá ááłáŞáŤáá˝ áĽá áá´ááŽá˝ áá áá ááľá¨á áá˝ááᢠá ááľ ááá "á á°áťá áá á" ááłááááłá, áĽá á áá áá°áľ áá áľáá˝ á°á˝áĽá ááŤá°áááľ á¨áá˝ááľ á ááááŞáŤá ááá ááá á á ááááš ááľáĽ áŁá á áááŤá˝ áłáĽáá˝ ááľáĽ áŁááľ áĽááľ áááŞáŤáá˝ áĽáá áĽáť áá.
áá áá á˝áá á áŁá ááá ᣠá¨á áá á°áááá áĽá á¨ááŤáá ᣠáĽá á áĽááἠá áŽáľ áĽáá áááł áá˝ááᢠá¨ááááá ááľáĽáľáĽááľ áĽááá ááááŤáá˝á áááá á áĽá áአá¨ááá á áááŹá˝á ááááá˝ (DOT ᣠGraphML ááá°) á áá áĽá ááĽááą áĽáá°áá áŤááľá áááŞáŤáá˝ ááá ἠáĽá á á°ááŤáŠ á áááśá˝ ááłáŠ á¨áá˝á á á ááá á áááŹá˝áá˝ (ááŤááŞá ᣠááááľáŠá¤áá¤á ᣠáááááľ) á áá ᢠ. á°á á, áľá áĽááá˝ áĽá á ááŤá¨áá¸á áŤááá áááááľ áĽáá´áľ áá¨á ááááľ áĽáá°ááťá á áľááľáá á áááá.
PlantUML áĽá á áá áá áá
áá áááľá áĽáá°áá˝á á¨ááŤáłá áľáá˝ ááłá áĽáá
á áá˘
select '@startuml'||chr(10)||'hide methods'||chr(10)||'hide stereotypes' union all
select distinct ccu.table_name || ' --|> ' ||
tc.table_name as val
from table_constraints as tc
join key_column_usage as kcu
on tc.constraint_name = kcu.constraint_name
join constraint_column_usage as ccu
on ccu.constraint_name = tc.constraint_name
where tc.constraint_type = 'FOREIGN KEY'
and tc.table_name ~ '.*' union all
select '@enduml'
áĽá áľáá˝ á¨áá¨áŠ, á¨á፠áá á°ááľáá°á
á¨SQL áá áá áľáá˝ á¨á°ááłá°á ááá˘
-- Шапка
select '@startuml
!define Table(name,desc) class name as "desc" << (T,#FFAAAA) >>
!define primary_key(x) <b>x</b>
!define unique(x) <color:green>x</color>
!define not_null(x) <u>x</u>
hide methods
hide stereotypes'
union all
-- ТайНиŃŃ
select format('Table(%s, "%s n information about %s") {'||chr(10), table_name, table_name, table_name) ||
(select string_agg(column_name || ' ' || upper(udt_name), chr(10))
from information_schema.columns
where table_schema = 'public'
and table_name = t.table_name) || chr(10) || '}'
from information_schema.tables t
where table_schema = 'public'
union all
-- ХвŃСи ĐźĐľĐśĐ´Ń ŃайНиŃаПи
select distinct ccu.table_name || ' "1" --> "0..N" ' || tc.table_name || format(' : "A %s may haven many %s"', ccu.table_name, tc.table_name)
from information_schema.table_constraints as tc
join information_schema.key_column_usage as kcu on tc.constraint_name = kcu.constraint_name
join information_schema.constraint_column_usage as ccu on ccu.constraint_name = tc.constraint_name
where tc.constraint_type = 'FOREIGN KEY'
and ccu.constraint_schema = 'public'
and tc.table_name ~ '.*'
union all
-- ĐОдваН
select '@enduml'
á á
áá áľ á¨ááľááá¨áą á¨ááᣠáĽá á¨áĽááł ááłáŞáŤáá˝ áĽáá˛á á°ááłáłá áá ááá˝á áá áááᢠáĽáááľ ááᣠáĽááá
áĽáŤááá˝ á áĽáááá áá áĽáá
áá¸áá˘
áááŞáŤáá˝ áĽá ááľáľá
áá° áŁá áá ááľáĽáľáĽ áááľ áĽáááľ - á¨ááἠááł á áááá ááľáľáᢠâá¨áá°ááź á ááąâ á¨ááá¨á áľáá˝ áĽááá°á áłáŞá á áľáłááłááᢠá áá ááŽáááľ áá á ááľ áááá á˛á˘á¤ ááá áá á ᣠáĽá áĽááľ ááá˘áá˝ áĽáąá á áá áŤáááłá ᣠááá á á áŤá á áá°ááľ á¨ááŤáá (ááá áĽááłá á ááŹá áá á¨áľ ᣠá áááĽáá ááá ááľáĽ á ááľ áŚáł á ááˇá) . á á°ááľ âXâ ᣠá¨á ááľ áľáá á¸ááťáŞ á¨ááááľ áľáááľ áĽáá°áá âááĽá áľááľâ áá°ááľ á˛ááá ᣠá¨áŚáŤáá á˘áá°áááŤáá áĽáŤ á áľáŞáŤá á¨ááŤá ááľáá˝á á ááĽáł áᨠᣠá áá áá âááá¨áłáľâ á áá ááááľ ááľá¨á፠ááłá áŚáłáá˝á á áĽááá áááżá ( áá , á áľááš áááľáááĽ, áĽá á áá¨áłá). áĽá á áá "á¨ááś áŤááľ" áá á áááľá¨áľ áá¨á áá á¨áĽá. á á°ááłáłá áá ááá á°á ááľ á¨áááá (á áááąá á¨áá áľááá) á¨á˘áá°áááŤáá áĽáŤ á áľáŞáŤá á ááááľ á ááťáá, ááááŤáąá áľáááą ááľáĽáľáĽ áĽá ááľ áá, á áľáááľ "ááá˘ááš á á ááľ ááá áá°áá¨áá áĽá áááá ááá áá°áĽáŤá." áľááá , ááá˘ááš "á á°á¨áŁá" á¨ááŹá áŚáłá áĽá áááľá¤á á ááá°á á ááľ ááŁá ááá. á¨á˛á˘á¤ á áľá á°áĽáłá¤ á á áἠáá ááľáĽ áĽáá°áá áŤáá°á¨á°áŁ ááá á°á áĽáááł á°ááá° áĽá áá° á áá á°ááŁáŤá¸á ááááą áá á (áĽáľá¨ á á˛áą á°áĽáłá¤)á˘
ááá áá á¨ááľáľá áá°áą á¨á áá á áľá°áłá˝ áĽá á°ááŁá˘ áááľá áá˝áá, áĽá á¨ááá á áá, áááá á°á á°á°áŤá˝ áĽá ááá˝ááľ áŤáá. á˘áŤááľ áá á¨áłáá ááá, á¨ááá á¨ááľáľá áľáááśá˝ á á°á¨á᪠(á áĽááἠá áá áĽá á áĽá áááłáá˝ á¨ááá°áŠ). ááááá DBMS á áá áľááá áááł áĽá á áááá áá¨áá ááááŤáľ á ááť áĽá á áášá á¨áá፠ááť ááᢠá á°ááłáłáŠ âá°á á ááłá˝â Oracle DB ááľáĽ ᣠáľá á áááá ááááá áá¨á á¨áľáááľ áĽááłáá˝ ááá áá˝áá ᣠá¨áá°áśá˝ áĽá ááá-áááá˝ áĽáľá¨ á¨ááľ áá¸á፠áááł (áááłá áŁ
áľááá
ᣠáĽá sql áá ááá˝á ááá˝á á¨áá˝á ááľáŞá á°áĽáłá˘ (TelegrafᣠMetricbeatᣠá¨á°á°á á°á )ᣠá¨áĽááá
á áááŞáŤáá˝ áá¨ááť (InfluxDBᣠElasticsearchᣠTimescaledb) áĽá áŞáááá (ááŤááᣠáŞáŁá)ᣠá ááá ááááľ áá˝ááᢠáĽá á°áááá á¨ááľáľá áľáááľ á¨ááá˝ á¨áľááá°-á°á ááŹáśá˝ (áááłá á¨áá°áá áŞáŤá á áááá ᣠá¨áľááá° áááá ᣠááá°. á¨á°áá) áá á á
áá áľ ááŁááŤáᢠáááłáᣠáá
á¨áá°á¨áá á pgwatch2 ááľáĽ ááᣠáĽáąá ᨠInfluxDB + Grafana áĽááá áĽá á¨áľáááľ áĽááłáá˝á á¨áá ááᣠáĽáá˛áá áá°á¨áľá áľ áá˝áá
Ô¸ŐÔ´ŐÔąŐŐŐŐ ÔłÔťŐ
áĽá áá á áá°á á ᨠSQL áŽáľ á áá áá á áĽá á¨ááἠááł áá áá°á¨á á¨áá˝á áááłá áááá áĽáť ááᢠáĽá á°á¨á᪠á á áááá˝á ááááľ áĽáá°áá˝á áĽááá á áá, á á áľá°áŤá¨áśáš ááľáĽ ááá. áĽá áĽáá´áľ (áĽá á¨ááá á áá ááá) áá áá áá á áŤáľ-á°á áĽáá°ááľáŹáľ áĽá á áááĽáá áá á CI/CD á§áá§á ááľáĽ áĽáá°ááŤáŤáľá°á áĽáááááŤáá.
ááá: hab.com