Q&A

Сүүлийн хичээлээр бид оюутнуудаас ирүүлсэн асуултуудад хариулсан юм:

Үйлдлийн системтэй холбоотой сэдвүүд болох процесс, виртуал санах ой, тасалдал, санах ойн менежмент гэх мэтийг сурахад ямар зөвлөмж өгөх вэ?

Нэгдүгээрт, эдгээр нь маш доод түвшний сэдвүүд тул та үнэхээр эдгээрийг гүнзгий мэдэх шаардлагатай эсэх нь тодорхойгүй байна. Та өөрөө үйлдлийн системийн цөмийг хэрэгжүүлэх эсвэл өөрчлөх зэрэг доод түвшний код бичихгүй л бол, өмнөх хичээлүүдээр цухас дурдсан процессууд болон дохионоос бусад сэдвүүд нь өдөр тутамд төдийлөн хэрэглэгдэхгүй болов уу.

Гэхдээ энэ сэдвийг сурахад хэрэгтэй зарим сайн нөөцүүд:

Хамгийн түрүүнд ямар хэрэгслүүдийг сурахыг эрхэмлэх вэ?

Хамгийн түрүүнд цаг гаргаж сурах зарим сэдвүүд:

Хэзээ Python, хэзээ Bash скрипт, эсвэл өөр програмчлалын хэл ашиглах вэ?

Ерөнхийдөө, bash скриптүүд нь тодорхой хэдэн командыг дараалуулан ажиллуулах шаардлагатай энгийн бөгөөд нэг удаагийн жижиг үйлдлүүдэд маш тохиромжтой байдаг. Гэвч bash-д илүү том програм бичихэд хүндрэлтэй болгодог хэд хэдэн өвөрмөц шинж чанарууд байдаг:

Тиймээс илүү том, нарийн төвөгтэй скриптүүдийн хувьд бид Python эсвэл Ruby зэрэг илүү хөгжсөн хэлүүдийг ашиглахыг зөвлөдөг. Эдгээр хэл дээр хүмүүсийн өмнө нь бичсэн олон мянган сангуудыг интернэтээс бэлэн олж ашиглах боломжто. Хэрэв таны шийдэх гээд байгаа асуудлыг аль нэг програмчлалын хэл дээр бэлэн хэрэгжүүлсэн сан байвал тухайн хэлийг шууд ашиглах нь хамгийн зөв сонголт юм.

source script.sh болон ./script.sh хоёрын ялгаа юу вэ?

Хоёр тохиолдолд хоёуланд нь script.sh файлыг bash сешшн дотор уншиж ажиллуулах боловч ялгаа нь аль сешшн дээр тушаалууд ажиллаж байгаад оршино. source командыг ашиглах үед командууд таны одоо ажиллаж байгаа bash сешшн дотор шууд ажиллах тул хавтас өөрчлөх, эсвэл функц зарлах зэрэг хүрээлэн буй орчинд хийсэн бүх өөрчлөлтүүд source команд ажиллаж дууссаны дараа ч хэвээрээ үлдэнэ.

Харин ./script.sh гэж дангаар нь ажиллуулах үед одоо ажиллаж буй сешшн маань шинээр тусдаа bash процесс үүсгэж, тэр дотор script.sh-ийг ажиллуулдаг. Тиймээс хэрэв script.sh дотор хавтас өөрчилбөл шинээр үүссэн bash процесс дотор л хавтас өөрчлөгдөхөөс биш, уг процесс ажиллаж дуусаад эцэг сешшн рүү буцахад одоогийн хавтас хэвээрээ үлдэнэ. Үүнтэй адилаар, хэрэв script.sh дотор таны терминал дээрээ ашиглахыг хүссэн функц тодорхойлогдсон бол түүнийг одоогийн сешшнд оруулахын тулд заавал source хийх шаардлагатай. Эсрэг тохиолдолд шинэ процесс үүсэж функц тодорхойлогдоод, процесс хаагдахад устах болно.

Багц болон хэрэгслүүд хаана хадгалагддаг вэ, тэднийг хэрхэн дууддаг вэ? /bin эсвэл /lib гэж юу вэ?

Таны терминал дээр ажиллуулдаг програмууд нь бүгд PATH орчны хувьсагчид заасан хавтаснууд дотор байдаг бөгөөд та which (эсвэл type) командыг ашиглан системийн хаанаас уг програмыг дуудаж байгааг шалгах боломжтой. Ерөнхийдөө файлын системд ямар төрлийн файлууд хаана хадгалагдах талаар тодорхой хэвшсэн дүрмүүд байдаг. Тэдгээрийн заримыг доор дурдав, илүү дэлгэрэнгүйг Filesystem Hierarchy Standard хуудаснаас үзнэ үү:

Би python-ийн багцыг apt-get install ашиглаж суулгах уу, эсвэл pip install ашиглах уу?

Үүнд шууд нэг хариулт байхгүй. Энэ нь програм суулгахдаа үйлдлийн системийнхээ багц менежерийг ашиглах уу, эсвэл тухайн програмчлалын хэлний багц менежерийг ашиглах уу гэдэг ерөнхий асуулттай холбоотой юм. Анхаарах зарим зүйлс:

Та хоёуланг нь хольж ашиглахгүй байхыг хичээгээрэй, учир нь энэ нь шийдвэрлэхэд хэцүү алдаануудад хүргэж болно. Бидний зөвлөмж бол боломжтой бол хэлний багц менежерийг ашиглаж, системийн глобал орчныг бохирдуулахгүйн тулд тусгаарлагдсан орчныг (жишээ нь Python-ийн virtualenv) ашиглах явдал юм.

Кодынхоо гүйцэтгэлийг сайжруулахад ашиглах хамгийн хялбар бөгөөд шилдэг профилинг хэрэгсэл юу вэ?

Хамгийн энгийн бөгөөд маш хэрэгцээтэй хэрэгсэл бол хугацааг хэвлэх юм. Та кодынхоо өөр өөр хэсгүүдийн хооронд зарцуулсан хугацааг гараар тооцож хэвлэнэ. Үүнийг давтан хийснээр кодоо хоёртын хайлтаар шалгаж, хамгийн их цаг авч байгаа хэсгийг олж чадна.

Илүү ахисан түвшний хэрэгсэл болох Valgrind-ийн Callgrind нь програмаа ажиллуулж, бүх зүйл хэр хугацаа зарцуулж байгааг, аль функц алийгаа дуудсан болохыг хэмжих боломжийг олгодог. Дараа нь мөр бүрт зарцуулсан хугацаатай кодын гаралтыг харуулдаг. Гэхдээ энэ нь програмыг асар ихээр удаашруулдаг ба олон урсгалтай програмыг дэмждэггүй. Бусад тохиолдолд, perf болон бусад хэлэнд зориулсан түүвэрлэгч шинжүүд нь хурдан бөгөөд хэрэгцээтэй мэдээллийг өгч чадна. Флеймграф нь эдгээр шинжүүрийн гаралтыг дүрслэн харуулах маш сайн хэрэгсэл юм. Мөн та өөрийн ажиллаж буй програмчлалын хэлний зориулалтын хэрэгслийг ашиглаж үзээрэй. Жишээлбэл, вэб хөгжүүлэлтийн хувьд Chrome болон Firefox хөтчийн inspect хэрэгсэлд гайхалтай профилинг хийх функцүүд суурилсан байдаг.

Заримдаа таны код удаан ажиллаж байгаа шалтгаан нь дискнээс унших эсвэл сүлжээнээс пакет хүлээх зэрэг систем гаднаас үйл явдал хүлээж байгаатай холбоотой байдаг. Энэ тохиолдолд техник хангамжийн боломжийн онолын хурд болон бодит хурд хоёрын зөрүүг тооцож үзэх хэрэгтэй. Мөн системийн дуудлагуудын хүлээлтийн хугацааг шинжлэх тусгай хэрэгслүүд байдаг. Үүнд хэрэглэгчийн програмыг цөм түвшинд хянах eBPF орно. Ялангуяа ийм төрлийн доод түвшний профилинг хийхэд bpftrace-ийг судалж үзэхийг зөвлөж байна.

Та ямар вэб хөтчийн өргөтгөлүүдийг ашигладаг вэ?

Бидний хамгийн дуртай, ихэвчлэн аюулгүй байдал, хэрэглээнд зориулсан зарим өргөтгөлүүд:

Өгөгдөл цэгцлэх өөр ямар ашигтай хэрэгслүүд байдаг вэ?

Бидний хичээлээр ярьж амжаагүй өгөгдөл цэгцлэх зарим хэрэгслүүдэд JSON өгөгдөл задлан шинжлэхэд зориулсан jq, HTML өгөгдөлд зориулсан pup зэрэг орно. Perl програмчлалын хэл нь илүү ахисан түвшний өгөгдөл цэгцлэх шугамд ашиглахад маш сайн хэрэгсэл юм. Өөр нэгэн хэрэгтэй тушаал бол сул зайгаар тусгаарлагдсан (гэхдээ тэгш бус) текстийг баганаар тэгшлэн харуулдаг column -t команд юм.

Мөн уламжлалт бус өгөгдөл цэгцлэх хэрэгслүүд бол vim болон Python юм. Олон мөр дамнасан нарийн төвөгтэй өөрчлөлтүүдийн хувьд vim-ийн макро нь маш хэрэгтэй хэрэгсэл юм. Та тодорхой үйлдлийг бичиж аваад, түүнийгээ хэдэн ч удаа давтан ажиллуулж болно. Жишээлбэл, код засварлагчийн хичээлийн тэмдэглэл дээрх (солон өнгөрсөн жилийн бичлэг дээрх) макро ашиглан XML файлыг JSON файл руу хэрхэн хөрвүүлж байгааг харж болно.

CSVs гэх мэт хүснэгтэн өгөгдлүүдэд зориулсан Python-ийн pandas сан нь маш сайн хэрэгсэл юм. Энэ нь group by, join, filter зэрэг нарийн үйлдлүүдийг хялбар болгоод зогсохгүй өгөгдлийн өөр өөр шинж чанарыг график болгон зурахад маш хялбар болгодог. Мөн өгөгдлийг XLS, HTML, эсвэл LaTeX хүснэгт хэлбэрээр экспортлохыг дэмждэг. Үүний зэрэгцээ өгөгдлийн статистик тооцоолол хийхэд R програмчлалын хэл (асуудалтай муу хэл гэгддэг ч) маш их хэрэглэгддэг бөгөөд таны боловсруулах ажлын сүүлчийн алхамд маш хэрэгтэй байж болно. R хэлний ggplot2 бол маш сайн график зурах сан юм.

Docker болон виртуал машины ялгаа юу вэ?

Docker нь контейнер гэх ерөнхий ойлголт дээр суурилдаг. Контейнер болон виртуал машины үндсэн ялгаа нь виртуал машин нь эзэн машинтай ижил цөмтэй байсан ч үйлдлийн системийн бүхэл бүтэн багцыг, түүний дотор цөмийг тусад нь ажиллуулдагт оршино. Харин контейнер нь өөр цөм ажиллуулахаас зайлсхийж, эзэн машины цөмийг хуваалцаж ашигладаг. Linux-д үүнийг LXC механизм болон тусгаарлах аргуудын тусламжтайгаар хийдэг бөгөөд ингэснээр тухайн програм өөрийгөө тусдаа техник хангамж дээр ажиллаж байна гэж үзэх боловч бодит байдал дээр эзэн машины техник хангамж болон цөмийг хуваалцаж байдаг. Тиймээс контейнер нь бүтэн виртуал машинаас хамаагүй бага нөөц шаарддаг.

Эсрэгээрээ, контейнерийн тусгаарлалт нь арай сул бөгөөд зөвхөн эзэн машинтайгаа ижил төрлийн цөм ажиллуулж байгаа тохиолдолд л ажилладаг. Жишээлбэл, хэрэв та macOS дээр Docker ажиллуулбал, Docker нь эхлээд Linux-ийн виртуал машин ажиллуулж байж Linux цөмийг олж авах тул нөөц зарцуулалт нь өндөр хэвээр байх болно. Түүнчлэн, Docker бол контейнерийн тусгай нэг хэрэгжүүлэлт бөгөөд програм хангамжийг бэлтгэж хүргэхэд зориулагдсан байдаг. Үүнээс шалтгаалж зарим онцлогтой: жишээлбэл, Docker контейнерууд нь анхдагч тохиргоогоороо компьютер унтраад асахад ямар ч өгөгдлийг хадгалж үлддэггүй.

Үйлдлийн систем бүрийн давуу болон сул талууд юу вэ, тэдгээрийг хэрхэн сонгох вэ (жишээ нь өөрийн зорилгод нийцсэн хамгийн сайн Linux тархацыг сонгох)?

Зөндөө олон Linux тархацууд байдаг ч тэдгээрийн ихэнх нь бараг ижилхэн ажилладаг. Linux болон UNIX-ийн үндсэн үйлдлүүд, дотоод бүтцийг аль ч тархац дээр сурч болно. Тархацуудын үндсэн ялгаа нь тэд багцын шинэчлэлтийг хэрхэн шийддэгт оршдог. Arch Linux зэрэг зарим тархацууд “rolling update” горимыг ашигладаг бөгөөд багцууд нь хамгийн сүүлийн үеийнх байх боловч хааяа систем эвдрэх эрсдэлтэй байдаг. Нөгөөтэйгүүр, Debian, CentOS эсвэл Ubuntu LTS зэрэг тархацууд шинэчлэлт хийхдээ маш консерватив ханддаг тул шинэ боломжуудыг золиослох замаар илүү тогтвортой ажиллагааг хангадаг. Хэрэглэгчийн компьютер болон сервер дээр ашиглахад хялбар бөгөөд тогтвортой байх үүднээс бид Debian эсвэл Ubuntu-г ашиглахыг зөвлөдөг.

Mac OS бол Windows болон Linux-ийн дундах сайн хувилбар бөгөөд маш цэвэрхэн, үзэмжтэй интерфэйстэй. Гэхдээ Mac OS нь Linux биш харин BSD дээр суурилсан байдаг тул системийн зарим хэсэг болон командууд өөр байдаг.

Өөр нэг судалж үзэх хувилбар бол FreeBSD юм. FreeBSD дээр зарим програмууд ажиллахгүй байж болох ч BSD экосистем нь Linux-ийг бодвол фрагментаци багатай, илүү сайн баримтжуулалттай байдаг.

Бид Windows-ийн програм хөгжүүлэх эсвэл тоглоом тоглох зэрэг техник хангамжийн драйверын дэмжлэг зайлшгүй хэрэгтэйгээс бусад тохиолдолд Windows-ийг хэрэглэхгүй байхыг зөвлөж байна.

Хос үйлдлийн систем ажиллуулахын тулд macOS-ийн bootcamp хамгийн сайн ажилладаг бөгөөд бусад хослолууд нь урт хугацаандаа (ялангуяа дискийг шифрлэх үед) асуудал дагуулдаг гэж бид үздэг.

Vim үү, Emacs уу?

Бид гурвуулаа өөрсдийн үндсэн засварлагчаар vim-ийг ашигладаг боловч Emacs нь маш сайн сонголт бөгөөд аль нь танд илүү тохирохыг мэдэхийн тулд хоёуланг нь туршиж үзэх нь зүйтэй. Emacs нь vim шиг модаль засварлах горимыг ашигладаггүй боловч үүнийг Evil эсвэл Doom Emacs зэрэг Emacs-ийн өргөтгөлүүдийг суулган идэвхжүүлж болно. Emacs-ийн нэг давуу тал нь өргөтгөлүүдийг Lisp хэлээр бичиж болдог бөгөөд энэ нь Vim-ийн анхдагч vimscript-ээс хамаагүй илүү сайн скрипт хэл юм.

Машин сургалтын аппликейшнүүдэд зориулсан ямар нэгэн зөвлөмж байна уу?

Энэ хичээлээр үзсэн зарим зүйлсийг машин сургалтын ажилд шууд ашиглаж болно. Бусад шинжлэх ухааны салбаруудын адилаар машин сургалтад олон тооны туршилт хийж, юу ажиллаж, юу ажиллаагүйг шалгах шаардлага гардаг. Та командын мөрийн хэрэгслүүдийг ашиглан эдгээр туршилтуудын үр дүнг хурдан хайж, нэгтгэх боломжтой. Жишээлбэл, тодорхой цаг хугацааны эсвэл тодорхой өгөгдлийн багц ашигласан туршилтуудыг шүүж болно. Туршилтын бүх параметрүүдийг энгийн JSON файл ашиглан логлосноор энэ хичээлээр үзсэн хэрэгслүүдийн тусламжтайгаар үүнийг хийхэд маш хялбар болно.

Эцэст нь, хэрэв та GPU-ийн ажлуудаа кластер луу илгээдэг систем ашигладаггүй бол энэ процессыг автоматжуулах аргыг судалж үзээрэй, учир нь энэ нь маш их цаг болон оюуны энерги шаарддаг ажил байдаг.

Vim-ийн өөр зөвлөмжүүд бий юу?

Цөөн хэдэн зөвлөмжүүд:

2FA гэж юу вэ, яагаад би үүнийг ашиглах ёстой вэ?

Хоёр шатлалт баталгаажуулалт (2FA) нь таны хаягт нууц үгнээс гадна нэмэлт хамгаалалтын давхаргыг үүсгэдэг. Нэвтрэхийн тулд зөвхөн нууц үг мэдэхээс гадна тухайн техник хангамжийн төхөөрөмжийг эзэмшиж байгаагаа батлах шаардлагатай болдог. Хамгийн энгийн тохиолдолд утсандаа SMS хүлээн авах байдлаар хийгддэг боловч SMS 2FA нь аюулгүй байдлын асуудлуудтай байдаг. Бидний зөвлөх илүү сайн хувилбар бол YubiKey зэрэг U2F шийдлийг ашиглах явдал юм.

Вэб хөтчүүдийн ялгаатай байдлын талаар ямар нэгэн санал байна уу?

2020 оны байдлаар вэб хөтчүүдийн төлөв байдал нь ихэнх нь Chrome-той ижилхэн хөдөлгүүр ашиглаж байна. Энэ нь Blink хөдөлгүүртэй Microsoft Edge, мөн WebKit хөдөлгүүртэй Safari (Blink-тэй төстэй) зэрэг нь Chrome-ийн өөр хувилбарууд л гэсэн үг юм. Chrome бол гүйцэтгэл болон ашиглахад маш сайн хөтөч юм. Хэрэв та өөр сонголт хайж байгаа бол бид Firefox-ийг зөвлөж байна. Энэ нь бүх талаараа Chrome-той дүйцэхүйц бөгөөд хувийн нууцлалыг хамгаалахад илүү сайн байдаг.

Өөр нэгэн Flow нэртэй хөтөч одоогоор бэлэн болоогүй байгаа ч одоо байгаа хөтчүүдээс илүү хурдан ажиллах шинэ хөдөлгүүрийг хөгжүүлж байна.


Энэ хуудсыг засварлах.

Лиценз: CC BY-NC-SA.