Ачааллж байна...
Өмнөх хичээлүүдэд бид цомогтоо юу оруулахыг сурсан. Энэ хичээлд эсрэг асуултад хариулна: цомогт юу хэзээ ч орох ёсгүй вэ? Жинхэнэ Python төслийн фолдерт таны бичсэн кодоос гадна олон зүйл бий. Тэдгээрийн зарим нь компьютер автоматаар үүсгэсэн түр файлууд, зарим нь мянга мянган файлтай venv фолдер, харин зарим нь нууц үг, API түлхүүр зэрэг хэзээ ч ил гарч болохгүй мэдээлэл юм. Хэрвээ эдгээр нь цомогт орвол түүх бохирдож, repository томорч, хамгийн аюултай нь нууц мэдээлэл тань задрах эрсдэлтэй болно. Энэ хичээлд бид .gitignore гэдэг энгийн текст файлыг мөр мөрөөр нь бүтээж, Git-д "эдгээрийг огт бүү хар" гэж хэлж сурна.
Өмнөх хичээлд git add .-ийн тухай анхааруулга өгсөн. Тэр нь фолдерт байгаа бүх зүйлийг ялгалгүйгээр нэмдэг гэж. Энэ хичээлийн төгсгөлд тэр асуудал бүрмөсөн шийдэгдэж, git add . аюулгүй хэрэгсэл болно. Бид өмнөх хичээлүүдийн git-dadlaga фолдер дээрээ үргэлжлүүлэн ажиллана.
Гэр бүлийн гэрэл зураг авахуулахаар мэргэжлийн зурагчин урьсан гэж төсөөлөөрэй. Зураг авахын өмнө та түүнд хэдэн зүйл хэлнэ: "Гал тогооны угааж амжаагүй аяга тавгийг зураг дээр бүү оруулаарай. Ширээн дээрх банкны картыг ч бүү оруулаарай. Цонхны гадна талын барилгын ажлыг ч тоохгүй байж болно." Зурагчин энэ жагсаалтыг санаж, зураг бүр дээр тэдгээрийг автоматаар хүрээнээс гаргана. Дараа нь та "бүгдээрээ зогсоцгоо" гэж хэлэхэд ч тэр жагсаалтад байгаа зүйлс зурагт орохгүй.
.gitignore бол яг тэр хар жагсаалт юм. Энэ нь repository-ийн үндсэн фолдерт байрладаг энгийн текст файл бөгөөд мөр бүрт Git-ийн тоохгүй байх ёстой файл эсвэл фолдерын нэр бичигдсэн байдаг. Нэг удаа бичиж хадгалсны дараа Git тэдгээрийг git status-д харуулахаа больж, git add . ч тэднийг нэмэхгүй. Хамгийн гол нь та өдөр бүр санаж байх шаардлагагүй болно, жагсаалт таны өмнөөс санана.
Алхам 1: Цомогт орох ёсгүй гурван зүйлийг үүсгэх
Эхлээд жинхэнэ төсөлд байдаг гурван төрлийн "хог"-ийг дадлагын фолдертоо зориуд үүсгэе. VS Code-д git-dadlaga фолдероо нээгээд terminal-д эхлээд Python-ийнхоо хувилбарыг шалгана уу. Удахгүй энэ нь чухал болно.
Command:
python --versionГаралт:
Python 3.13.7Таны дугаар өөр байж болно, хамгийн гол нь 3.13-аас бага уу, их үү гэдгийг тэмдэглээрэй. Одоо өмнөх сургалтаас мэдэх venv-ээ үүсгэнэ.
Command:
python -m venv venvГаралт:
Хэдэн секунд хүлээсний дараа чимээгүй дуусна, venv фолдер үүслээ. Дараа нь нууц мэдээлэл хадгалдаг файл үүсгэнэ. VS Code-ийн Explorer хэсэгт .env нэртэй шинэ файл үүсгэж (цэгээр эхэлсэн нэртэй), дотор нь дараах мөрийг бичээд хадгална уу.
API_KEY=demo-12345-not-realЭнэ бол зохиомол түлхүүр, гэхдээ жинхэнэ төсөлд яг энэ газар таны жинхэнэ нууц мэдээлэл байрлана. Эцэст нь гурав дахь төрлийн хогийг үүсгэе. Python модулийг import хийхэд хурдан ажиллуулах зорилгоор түр файлуудыг pycache фолдерт автоматаар үүсгэдэг. Үүнийг харахын тулд tsalin.py-г import хийе.
Command:
python -c "import tsalin"Гаралт:
Цалин“-c” нь хашилт доторх Python кодыг шууд ажиллуулах гэсэн утгатай. tsalin.py-г import хийхэд түүний доторх print() ажиллаж "Цалин" гэж хэвлэв. Үүний зэрэгцээ Python чимээгүйхэн pycache фолдер үүсгэж, түүн дотор tsalin.cpython-313.pyc гэх мэт нэртэй файл хадгаллаа. Энэ нь tsalin.py-ийн хөрвүүлсэн хувилбар бөгөөд нэрэн дэх тоо таны Python-ий хувилбараас хамаарна.
Алхам 2: Git юу харж байгааг шалгах
Command:
git statusГаралт (Python 3.13 ба түүнээс шинэ хувилбар):
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env
__pycache__/
nothing added to commit but untracked files present (use "git add" to track)Гаралт (Python 3.12 ба түүнээс хуучин хувилбар):
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env
__pycache__/
venv/
nothing added to commit but untracked files present (use "git add" to track)Гурван асуултаар уншъя. main салаан дээр байна. Шинэ, хянагдаагүй зүйлс: .env файл, pycache фолдер, магадгүй venv фолдер. Git тэдгээрийг add хийхийг зөвлөж байна. Энэ бол яг бидний хийх ёсгүй зүйл. Хэрвээ та одоо git add . бичвэл гурвуулаа ачааны талбай руу орох байсан.
Хоёр гаралтын ялгааг тайлбарлая. Python 3.13-аас эхлэн python -m venv нь venv фолдер дотроо жижиг .gitignore файл автоматаар үүсгэдэг болсон. Тэр файл Git-д "энэ фолдерыг бүхэлд нь тоохгүй бай" гэж хэлдэг тул venv/ жагсаалтад харагдахгүй байна. Энэ бол Python-ий хөгжүүлэгчдийн нэмсэн тус дэм юм. Гэсэн хэдий ч бид venv-ийг өөрийн .gitignore-д заавал бичнэ. Учир нь хуучин Python хувилбарууд үүнийг хийдэггүй, зарим хэрэгсэл venv-ийг өөр аргаар үүсгэдэг, мөн .gitignore-ийг уншсан хүн бүр таны төсөл юуг санаатайгаар нууж байгааг тодорхой харах ёстой.
Эдгээр гурван зүйл яагаад цомогт орох ёсгүйг тус тусад нь бодъё. venv фолдер мянга мянган файлтай, хэдэн арван, заримдаа хэдэн зуун мегабайт эзэлдэг. Түүнээс гадна тэр нь таны компьютер, таны Python хувилбарт тусгайлан бүтээгдсэн тул өөр компьютер дээр ажиллахгүй. Өмнөх сургалтаас санаж байгаачлан venv-ийг requirements.txt файлаас хүссэн үедээ шинээр үүсгэж болно. Тиймээс цомогт requirements.txt орно, venv орохгүй. pycache бол Python-ий түр файлууд бөгөөд код өөрчлөгдөх бүрт Python тэднийг дахин үүсгэдэг тул хадгалах ямар ч утгагүй. Харин .env бол хамгийн аюултай нь, түүний тухай доор тусад нь ярина.
Алхам 3: .gitignore-ийг мөр мөрөөр бүтээх
VS Code-ийн Explorer хэсэгт git-dadlaga фолдерын үндсэнд, өөрөөр хэлбэл zarlaga.py-тэй нэг түвшинд, .gitignore нэртэй шинэ файл үүсгэнэ үү. Нэр нь яг “.gitignore” байх ёстой: цэгээр эхэлсэн, өргөтгөлгүй. Одоо түүнд нэг нэг мөр нэмж, мөр бүрийн дараа хадгалаад git status-ээр үр дүнг нь харцгаая.
Эхлээд хамгийн чухал мөрийг бичнэ.
.envХадгалаад:
Command:
git statusГаралт:
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
__pycache__/
nothing added to commit but untracked files present (use "git add" to track)Хоёр өөрчлөлт харагдаж байна. Нэгдүгээрт, .env жагсаалтаас алга болсон, Git түүнийг тоохоо больжээ. Хоёрдугаарт, шинэ .gitignore файл өөрөө untracked болж гарч ирсэн. Энэ бол санаатай зүйл: .gitignore файлыг цомогт заавал оруулдаг. Учир нь тэр нь таны төслийн нэг хэсэг бөгөөд таны repository-г хуулж авсан хэн ч, мөн ирээдүйн өөр компьютер дээрх та, яг ижил хар жагсаалттай ажиллах ёстой.
Одоо pycache-ийг нэмье. .gitignore-ийн хоёр дахь мөрөнд бичнэ үү.
.env
__pycache__/Хадгалаад git status бичвэл pycache/ мөн алга болж, зөвхөн .gitignore үлдэнэ. Нэрийн ард байгаа “/” тэмдгийг анзаараарай. Энэ нь "зөвхөн ийм нэртэй фолдерыг тоохгүй бай" гэсэн утгатай. Мөн энэ мөр зөвхөн үндсэн фолдер дахь бус, төслийн аль ч гүнд байгаа pycache фолдерт хамаарна. Хожим таны төсөл олон дэд фолдертой болоход Python тус бүрт нь pycache үүсгэх бөгөөд энэ ганц мөр бүгдийг нь хамарна.
Дараа нь venv-ийг нэмье. Нэг мөрийн оронд хоёр мөр бичнэ.
.env
__pycache__/
venv/
.venv/Хоёр мөр бичиж байгаагийн шалтгаан нь зарим хөгжүүлэгч, зарим хэрэгсэл виртуал орчноо цэгтэй .venv нэрээр үүсгэдэг явдал юм. Хэрвээ та хожим өөр хүний заавраар .venv үүсгэвэл энэ мөр түүнийг ч хамгаална. Python 3.12 ба түүнээс хуучныг ашиглаж байгаа бол хадгалаад git status бичихэд venv/ жагсаалтаас алга болно.
Алхам 4: Бүрэн, бодит .gitignore
Одоо файлыг цэгцтэй, мэргэжлийн хэлбэрт оруулъя. .gitignore-д # тэмдгээр эхэлсэн мөрүүд тайлбар бөгөөд Git тэднийг тоохгүй, гэхдээ уншиж буй хүнд маш их тус болдог. Файлын бүх агуулгыг дараахаар солиод хадгална уу.
# Python cache
__pycache__/
*.pyc
# Virtual environments
venv/
.venv/
# Secrets
.env
# Windows
Thumbs.db
desktop.iniШинэ мөрүүдийг тайлбарлая. “*.pyc” мөрөнд од тэмдэг байна. Од тэмдэг нь "ямар ч тэмдэгт, ямар ч урттай" гэсэн утгатай тул энэ мөр “.pyc-ээр төгссөн бүх файл” гэж уншигдана. Ихэнх .pyc файл pycache дотор байдаг тул аль хэдийн хамгаалагдсан, гэхдээ ховор тохиолдолд өөр газар гарч ирдэг тул нэмэлт хамгаалалт болгон бичдэг. “Thumbs.db” ба “desktop.ini” нь Windows-ийн файл хөтөч фолдерт чимээгүйхэн үүсгэдэг жижиг системийн файлууд юм. Тэд таны кодтой огт хамаагүй тул цомогт хэзээ ч орох ёсгүй. Хоосон мөрүүд болон тайлбарууд файлыг бүлгүүдэд хувааж, нэг харцаар ойлгомжтой болгож байна.
Бусад бүх мөрөөс .env мөр хамгийн чухал тул түүнд тусгай анхаарал хандуулъя. “FastAPI — Вэб API бүтээх” сургалтыг үзсэн бол нууц түлхүүрийг кодонд бус, .env файлд хадгалж, тэр файлыг хэзээ ч commit хийхгүй байх дүрмийг санаж байгаа байх. Энэ дүрмийг практикт баталгаажуулдаг газар нь яг .gitignore юм. Хэрвээ тэр сургалтыг үзээгүй бол санаа нь энгийн: API түлхүүр, өгөгдлийн сангийн нууц үг гэх мэт мэдээллийг тусдаа .env файлд хадгалж, программ тэдгээрийг тэндээс уншдаг.
Нууц мэдээлэл яагаад цомогт орох ёсгүйг ойлгох нь чухал. Commit бол бүрмөсөн бүртгэл юм. Хэрвээ .env файлыг нэг удаа commit хийвэл, дараа нь файлыг устгаж, шинэ commit хийсэн ч хуучин зураг цомогт үлдэнэ. Хэн ч git log болон git diff-ээр хуучин зураг руу буцаж нууц түлхүүрийг тань уншиж чадна. Бүлэг 4-т бид цомгоо GitHub-д байршуулахад энэ нь бүр ноцтой болно. Нийтэд нээлттэй repository-оос нууц түлхүүр хайж автоматаар скан хийдэг программууд интернэтэд байнга ажилладаг бөгөөд тэд задарсан түлхүүрийг хэдхэн минутын дотор олдог. Тиймээс .env мөр бол таны .gitignore-ийн хамгаалалтын гол хана юм.
.env.example: юу хэрэгтэйг хэлэх, нууцыг хэлэхгүй
Гэхдээ нэг асуудал үүсэж байна. Хэрвээ .env цомогт орохгүй бол таны repository-г хуулж авсан хүн, эсвэл шинэ компьютер дээрх та, программд ямар нууц мэдээлэл хэрэгтэйг яаж мэдэх вэ? Үүнийг .env.example гэдэг файлаар шийддэг. Энэ файл .env-тэй яг ижил бүтэцтэй боловч жинхэнэ утгын оронд жишээ утга агуулдаг. VS Code-д .env.example нэртэй шинэ файл үүсгээд дараах мөрийг бичиж хадгална уу.
API_KEY=your-api-key-hereЭнэ файл юу хэрэгтэйг хэлж байгаа ч ямар ч нууц агуулахгүй тул цомогт орох ёстой. Анхаарах нарийн зүйл бий: манай .gitignore-д “.env” гэж бичигдсэн нь зөвхөн яг “.env” нэртэй файлтай таардаг. “.env.example” бол өөр нэр тул Git түүнийг тоохгүй байхгүй, хянана. Үүнийг git status-ээр шалгая.
Command:
git statusГаралт:
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env.example
.gitignore
nothing added to commit but untracked files present (use "git add" to track)Яг бидний хүссэн байдал. Цомогт орох ёстой хоёр файл л харагдаж, бусад бүх хог далд оржээ.
Алхам 5: git add .-ийг аюулгүйгээр ашиглах
Одоо 2.2 дугаар хичээлд анхааруулсан git add . бүрэн аюулгүй болсон.
Command:
git add .
git statusГаралт:
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: .env.example
new file: .gitignoreФолдерт venv, .env, pycache байсаар байгаа ч git add . тэдгээрт хүрсэнгүй. Ачааны талбайд яг цомогт орох ёстой хоёр файл л байна. Commit хийе.
Command:
git commit -m "Add .gitignore and example env file"Гаралт:
[main 5d8c3e7] Add .gitignore and example env file
2 files changed, 15 insertions(+)
create mode 100644 .env.example
create mode 100644 .gitignore“15 insertions” нь .gitignore-ийн 14 мөр, .env.example-ийн 1 мөр юм. Хоосон мөрүүд, тайлбарууд ч мөрөнд тоологддог. Ингээд таны хар жагсаалт цомогт бүртгэгдлээ.
Нуугдсан зүйлсийг харах
Git нуусан зүйлсийг харах хэрэгтэй болдог, жишээ нь .gitignore зөв ажиллаж байгааг шалгахад.
Command:
git status --ignoredГаралт:
On branch main
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
.env
__pycache__/
venv/
nothing to commit, working tree clean“Ignored files:” буюу "тоохгүй байгаа файлууд" гэсэн шинэ хэсэг гарч ирлээ. Эндээс .gitignore яг юуг хамгаалж байгааг өөрийн нүдээр харж болно. Хаалтан доторх “git add -f” бол хар жагсаалтыг хүчээр давах арга бөгөөд “-f” нь force буюу хүчээр гэсэн утгатай. Энэ аргыг ашиглах шаардлага бараг гардаггүй бөгөөд .env-ийн хувьд хэзээ ч бүү ашиглаарай. Сүүлийн мөр “working tree clean” гэж байгаа нь хамгийн сайхан мэдээ: хогнууд байсаар байгаа ч Git-ийн нүдээр ажлын фолдер цэвэр байна.
Аль дүрэм нууж байгааг олох
Заримдаа нэг файл яагаад нуугдаж байгааг мэдэх шаардлага гарна, ялангуяа .gitignore урт болоход. Үүнд зориулсан command бий.
Command:
git check-ignore -v __pycache__/tsalin.cpython-313.pycГаралт:
.gitignore:2:__pycache__/ __pycache__/tsalin.cpython-313.pycЭнэ мөр гурван хэсэгтэй. “.gitignore:2:” нь “.gitignore файлын 2 дугаар мөр” гэсэн утгатай. Дараагийн “pycache/” бол тэр мөрийн дүрэм. Сүүлийн хэсэг нь таны асуусан файл. Өөрөөр хэлбэл "энэ файлыг .gitignore-ийн хоёр дахь мөрийн pycache/ дүрэм нууж байна" гэж хэлж байна. Файлын нэрийг өөрийн компьютер дээрх нэрээр солиорой, Python-ий хувилбараас хамаараад тоо нь өөр байна. Хэрвээ тухайн файлыг ямар ч дүрэм нуухгүй байвал command юу ч хэвлэхгүй.
Олон төсөлд ашиглах
Таны бүтээсэн .gitignore бараг ямар ч Python төсөлд тохирно. Шинэ төсөл эхлэх бүрт энэ файлыг хуулж аваад шаардлагатай бол мөр нэмэх нь хамгийн хялбар арга. Бүлэг 4-т GitHub дээр repository үүсгэхэд GitHub бэлэн Python .gitignore загвар санал болгодгийг харна. Тэр загвар хэдэн арван мөртэй, олон хэрэгслийг хамардаг. Гэхдээ одоо та өөрийн бүтээсэн мөр бүрийг ойлгож байгаа нь тэр урт загварыг уншихад ч тус болно.
Хүсвэл фолдертоо temp.log нэртэй файл үүсгээд git status-ээр түүнийг untracked гэж харагдахыг ажиглаарай. Дараа нь .gitignore-д “*.log” гэсэн мөр нэмж хадгалаад дахин шалгаарай: файл алга болох ёстой. Од тэмдэгт дүрэм хэрхэн ажилладгийг ингэж өөрийн нүдээр харж болно. Сонирхвол git check-ignore -v temp.log бичиж аль мөр түүнийг нууж байгааг харж болно. Дараа нь энэ мөрийг үлдээх эсэхээ өөрөө шийдэж, хүсвэл commit хийгээрэй.
Аль хэдийн commit хийсэн файлыг .gitignore тоохгүй байх. Энэ бол хамгийн их гайхшрал төрүүлдэг дүрэм: .gitignore зөвхөн untracked файлуудад хамаардаг. Хэрвээ файл нэг удаа commit хийгдсэн бол Git түүнийг хянасаар байх бөгөөд дараа нь .gitignore-д нэмсэн ч өөрчлөлт бүрийг нь харуулсаар байна. Жишээ нь та .gitignore бичихээсээ өмнө .env-ийг санамсаргүй commit хийсэн гэж бодъё. Тэр тохиолдолд Git-ээс тэр файлыг хянахаа болихыг тусгайлан хэлэх хэрэгтэй.
Command:
git rm --cached .envГаралт:
rm '.env'“rm” нь remove буюу хасах, “--cached” нь "зөвхөн Git-ийн бүртгэлээс хас, компьютер дээрх файлыг бүү устга" гэсэн утгатай. Гаралт “rm ‘.env’” нь Git файлыг хяналтаасаа хассаныг баталж байна, таны .env файл фолдертоо хэвээр байна. Дараа нь .gitignore-д .env байгаа эсэхийг шалгаад commit хийнэ үү. Гэхдээ шударгаар хэлэхэд энэ нь асуудлыг зөвхөн цаашид шийднэ: хуучин commit дотор нууц түлхүүр хэвээрээ үлдсэн. Хэрвээ тэр нь жинхэнэ түлхүүр байсан, ялангуяа GitHub руу аль хэдийн илгээгдсэн бол хамгийн найдвартай шийдэл нь тэр түлхүүрийг үйлчилгээний сайт дээр нь хүчингүй болгож, шинээр үүсгэх явдал юм. Задарсан түлхүүрийг нууж болохгүй, зөвхөн солих боломжтой. Ийм учраас .gitignore-ийг төслийн хамгийн эхэнд, анхны commit-оос өмнө бичих нь хамгийн зөв дадал.
.gitignore ажиллахгүй байх: файлын нэр буруу. Windows дээр Notepad-аар файл үүсгэвэл нэрийн ард нүдэнд харагдахгүй .txt өргөтгөл нэмэгдэж, “.gitignore.txt” болох нь түгээмэл. Git зөвхөн яг “.gitignore” нэртэй файлыг уншдаг тул энэ тохиолдолд дүрмүүд огт ажиллахгүй. Тиймээс энэ файлыг үргэлж VS Code-д үүсгээрэй. VS Code-ийн Explorer дээр файлын нэрийг шалгахад яг “.gitignore” гэж харагдах ёстой. Мөн файл repository-ийн үндсэн фолдерт байгаа эсэхийг шалгаарай, data зэрэг дэд фолдерт андуурч үүсгэвэл зөвхөн тэр фолдерт хамаарна.
.gitignore ажиллахгүй байх: дүрэм буруу бичигдсэн. “pycache” гэж доогуур зураасгүй бичих, “venv” нэрийг “env” гэж андуурах гэх мэт жижиг алдаа дүрмийг ажиллахгүй болгоно. Ийм үед дээр сурсан git check-ignore -v <файл> command хамгийн сайн туслах юм. Хэрвээ тэр command юу ч хэвлэхгүй бол ямар ч дүрэм тухайн файлыг хамарахгүй байна гэсэн үг. Тэгвэл .gitignore-оо нээж нэр нь яг таарч байгаа эсэхийг үсэг бүрээр нь шалгаарай.
git add -f ашиглах. Хэрвээ та .env-ийг git add -f .env-ээр нэмбэл Git хар жагсаалтыг үл тоомсорлоно. Энэ command-ыг .env эсвэл нууц мэдээлэлтэй ямар ч файлд хэзээ ч бүү ашиглаарай. Хэрвээ санамсаргүй ашигласан бол commit хийхээсээ өмнө git restore --staged .env бичиж ачааны талбайгаас буцаана уу.
.gitignore бол repository-ийн үндсэн фолдерт байдаг текст файл бөгөөд Git-ийн тоохгүй байх ёстой зүйлсийн хар жагсаалт юм. Python төсөлд venv/ ба .venv/, pycache/ ба .pyc, .env заавал багтана. Мөрийн ард “/” нь зөвхөн фолдер гэсэн утгатай, “” нь ямар ч тэмдэгт гэсэн утгатай, “#” нь тайлбар. Python 3.13-аас эхлэн venv өөрийгөө нууцалдаг ч өөрийн .gitignore-д venv-ийг бичсээр байна. .env-ийг хэзээ ч commit хийхгүй, харин юу хэрэгтэйг харуулахын тулд .env.example-ийг commit хийнэ. .gitignore өөрөө цомогт ордог. .gitignore зөвхөн хянагдаагүй файлуудад хамаардаг тул аль хэдийн commit хийсэн файлыг git rm --cached-ээр хяналтаас хасах хэрэгтэй, задарсан нууц түлхүүрийг заавал шинээр солино. git status --ignored болон git check-ignore -v нь .gitignore зөв ажиллаж байгааг шалгах хэрэгслүүд.
Дараагийн хичээл Бүлэг 2-ын сүүлийнх нь бөгөөд энэ бүлгийн хамгийн тайвшруулах сэдэвтэй: алдаагаа хэрхэн аюулгүй буцаах вэ. Commit хийгээгүй өөрчлөлтийг git restore-оор цуцалж, сүүлийн commit-ын message-ийг git commit --amend-ээр засаж сурна. Мөн Git-тэй ажиллахдаа яагаад эвдэхээс айх хэрэггүйг ойлгоно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.