Կարգերով պահոցներ՝ Տեք

Ասք թուային ազատութեան բարդութեան մասին

Գնալով աւելի եւ աւելի է բարդանում լինել ազատ թուային աշխարհում։

Հա, իհարկէ, ազատ ԾԱ֊ն ուտում է ամէն ինչ։ Ունե՞ս հեռախօս՝ կամ Լինուքսով է աշխատում կամ էլ BSD֊ով, իհարկէ։ Բայց դրանից այն կողմ այնքան են աւելացնում սահմանափակումները, որ անհնար է լինում ազատ համարել այդ սարքերը։

Սարքը ունես, բայց չես կարող ունենալ նորմալ կապ համացանցի հետ, ու բարդ է լինում ունենալ նորմալ Ջաբեր կլիենտ։

Սարքը ունես, բայց չես կարող նոր ծրագիր քաշել առանց «հաշիւ» բացելու։

Սարքը ունես, բայց չգիտես ինչու գովազդ կայ ՕՀ֊ի մէջ։ Դէ չգիտեմ, ես Վինդոզ չունեմ, չնայած այն շշուկներին, որ խմած ժամանակ եմ օգտագործել, բայց բնաւ ճիշտ չէ դա։

Իսկ ինչո՞ւ, ինչո՞ւ այսպէս պէտք է լինէր։ չգիտեմ, դեռ չեմ հասկանում։ Շատ տխուր եմ։

Տխուր եմ, քանի որ չեմ կարող ընկերներիս ասել «արի ջաբեր, թո՛ղ տելեգրամը»։ Չեմ կարող, քանի որ նորմալ յաւելուածներ չկան, որով կարող ենք չաթուել, քանի որ իրենց ՕՀ֊ն թոյլ չի տալիս։

Չգիտեմ, սա տեխնիկական խնդիր չէ, բնաւ։ Սա քաղաքական խնդիր է։ Ամէն ինչն է քաղաքական խնդիր։

Ես մտածում եմ բնութեան մասին, դա քաղաքական խնդիր է։ Դու մտածում ես երկրի ազատութեան մասին, դա քաղաքական խնդիր է։

Բայց ինչո՞ւ, ինչո՞ւ չես մտածում ազատ ԾԱ, ազատ ՕՀ օգտագործելու մասին։ Դա է՛լ է քաղաքական խնդիր, դա այն տեսակի խնդիր է, որ աւելի է ազդում քո վրայ առօրեայում քան աղբը թափելը։ Քան երկրի ազատութիւնը։

Անկախ մոլորակից եւ անկախ երկրից դու օգտագործելու ես նոյն տեխնոլոգիաները։ Չունենք այլ տարբերակ, նոյն համակարգիչներն են, նոյնն էլ մնալու են։ Կամ մտածում ես այս խնդրի մասին, կամ չես մտածում։

Այո, բարդ է, շա՛տ բարդ է լինել ազատ։ Իսկ ինձ տեւեց երկար տարիներ, որ լինեմ պլատֆորմներից ազատ։

Իսկ դո՞ւ։

Մինչ։

Ասանկ բաներ…

Պատասխանել մեյլով

Ասք Ֆայրֆոքսի բառարանների մասին

Վերջերս սկսել եմ շատ չսիրել ՖայրՖոքսին, բայց ոչ թէ տեխնիկական պատճառներով, այլ քաղաքական։ Այդ ամբողջ DNS-over-HTTPS֊ը իմ վրայ ազդում ա։ Բայց դա թողնենք մի կողմ։

Դեռ փոքր տարիքից շատ էի սիրում Spell checker֊ներ. ինձ միշտ զգուշացնում էր՝ այս բառը սխալ ես գրել, ահա թէ ինչ հնարաւոր տարբերակներ կան ճիշտ գրելու։

Ինձ նաեւ շատ է օգնել Հայերէն սովորելու հարցնում, հիմա գուցէ խնդալու լինի, բայց ես Հայերէն աւելի լաւ սովորել եմ Հայաստանում՝ բլոգելու արդիւնքում քան Սիրիայում։ Ինչ խօսք՝ չէի սիրում դաս անել։

Ինչեւէ։ Ինչպէս բոլորը գիտեն, ես սիրում եմ դասական ուղղագրութեամբ գրել Հայերէնը, որը նշանակում է, որ ինձ պէտք է դասական ուղղագրութեան համար մշակուած Հայերէնի Spell checker։

Նման spell checker տարիներ առաջ հաւաքել եմ շատ տարբեր աղբիւրներից ու մինչեւ այսօր հետս «ման եմ տալիս», քանզի Ֆայրքոքսի Add-on֊ներում կայ միայն արդի ուղղագրութեամբ Հայերէնի spell checker։ (Զելջեն, բարեւներ քեզ)

Այդ spell checker֊ը գրած է Hunspell֊ի միօրինակով, ու սա շատ կարեւոր մօտեցում էր ինձ համար, քանզի ես կարող էի նոյն spell checker֊ը օգտագործել ե՛ւ Pidgin֊ում, ե՛ւ բրաուզերում՝ ֆայրֆոքսում, ե՛ւ Ghostwriter֊ում, որով հիմա գրում եմ սա եւ նոյնիսկ Telegram Desktop֊ում (6 տարի անց կարողացան նման պարզ բան աւելացնել, դէ իրանց ռեսուսրսները ծախսում են անիմաստ marketing֊ի եւ անկայուն անվտանգութեան վրայ, մինչ ամենակարեւոր ֆիչըռը՝ ճիշտ գրելը, տեւեց վեց ֆաքինգ տարի)։

Մօտ վեց ամիս առաջ Ֆայրֆոքսը սկսեց չհասկանալ Հայերէն սփելչեքըրիս, ասում էր ունեմ միայն մէկ լեզու տեղակայած՝ Անգլերէն։

Է ջան, ես էլ սկսեցի ամէն տեղ (հիմնականը սոց֊ցանցերում) գրել շատ սխալ։

Այսօր «ստեղս» հասաւ ու որոշեցի գնալ bug-hunting որսորդութեան։

Որպէս ինքն իրան յարգող ծրագրաւորող, ես չեմ գուգլում նման խնդիրներ, քանզի ով էլ ասի որ նման խնդիր է ունեցել ապա 99% դէպքերում չի գտել պատասխան։

Ես մի անգամից սկսեցի կարդալ Firefox֊ի Source Code֊ը։

Դրա համար կայ շատ լաւ կայք՝ searchfox.org, որը թոյլ է տալիս փնտռել ֆայրֆոքսի կօդերի մէջ։

Գտայ mozHunspell.cpp ֆայլը, որտեղ պէտք է յիշէի, որ էս աշխարհում գոյութիւն ունի C++֊ի նման անկապ լեզու։

Մի քանի րոպէ ինքս ինձ հանգստացնելուց յետոյ սկսեցի կարդալ եւ հասկանալ որ ֆայրֆոքսը այսուհետ չի սպասարկում հին՝ dictionaries պանակից կարդալու հնարաւորութիւնը։ Այսուհետ պէտք է about:config֊ի մէջ նշել թէ որտեղ են քո բառարանները։

Ըհը, գնացի եւ նշեցի՝ /usr/local/share/hunspell, մի հատ restart ենք անում ֆայրֆոքսը ու ես վերջապէս ունեմ հայերէն spell checker, կրկին։

Ընթացքում նաեւ պարզեցի որ Firefox֊ն ունի about:about, որտեղ կան իր about էջերի բոլոր յղումները։

Նաեւ պարզեցի, որ C++֊ը դեռ գէշ լեզու է ու մարդկանց համար ստեղծուած չի։

Այսքանը։

Ասանկ բաներ…

Պատասխանել մեյլով

Ասք յաջողուած օրագրի եւ ձախողուած վեբրուարի մասին

Վեբը ինձ համար շատ կարեւոր է։ ուղղում՝ ազատ համացանցը ինձ համար շատ կարեւոր է։ Ես համացանցից շատ տարօրինակ ձեւ եմ սկսել օգտուել։ Մի քիչ պատմեմ։

Երկուհազարակնների կէսերին մենք տանը հերիք չէ ունեցանք համակարգիչ, այլ նաեւ համացանցի կապ Dial-Up֊ով։ սիրուն ձայներ էր հանում մոդեմը ցանցին միանալուց։

Մեր առաջին օպերատորն էր Սիրիայի երկու օպերատորներից մէկը՝ SCS-Net֊ը, որը փաստօրէն մինչեւ այսօր աշխատում է։ Իրենք ամէն օգտագործողի տալիս էին PPP հաշիւ, որը պէտք է գրէիր քո Dial-up֊ի կարգաւորումների մէջ։

Այդ նոյն հաշուով նաեւ ստանում էիր FTP թղթապանակ, IRC անուն եւ մեյլ հասցէ։ ենթադրում եմ, որ PAM֊անման մի բան էին արել։

Այդպիսով ես մտնում էի IRC, դեռ չիմանալով ինչ է IRC֊ն, եւ չաթւում էի անգլիախօս սենեակներում։ կային նաեւ խաղացողների (գեյմըրների) սենեակներ, որ պայմանաւորում էինք ու յետոյ միասին խաղում էինք առցանց խաղեր։

Շատ ոչ֊տարօրինակաբար կային նաեւ համակարգչային մասնագէտների սենեակներ, հիմնականում համալսարանականներ էին եւ խօսում էին ծրագրաւորման լեզուներից։ ես արդէն պասկալ գիտէի, իրենք համալսարանում Ջաւա էին անում, մի մասն էլ C++, մի մասն էլ այլ բաներ։ Այդ ժամանակ միայն C֊ի եւ Ջաւա անունների հետ էի ծանօթ։

Այսինքն, ի սկզբանէ ես օգտագործում էի ազատ համացանց, քանի որ ուղարկում/ստանում էի մեյլ հայրիկի անունով, խօսում էի սենեակներում եւ ափլոդում էի անկապ նկարներ այդ 100Mb պահոցի մէջ։

Մէկ֊երկու տարի անց, ես եւ իմ դասարանցի Օվսաննան միասին խօսում էինք Jonas Brothers֊ի նոր ալբումի մասին՝ A Little Bit Longer, որը յայտարարել էին MySpace֊ում (իսկ դու յիշո՞ւմ ես ինչ է ՄայՍփեյսը), ու նա ինձ ասած, որ գրանցուել է ՄայՍփեյսում եւ տեսել է եղբայրների մեյլը։

Մեյլը նայեցի, գրած էր forjonasfans@gmail.com (կամ նման մի բան)։ Մտայ gmail.com եւ տեսայ որ ասում ա «դէ բա գրանցուի, ու մեյլ ուղարկի» ես էլ գրանցուեցի, որ իրենց մեյլ ուղարկեմ։

Յաջորդ օրը գնում եմ եւ պատմում Օվսաննային, որ նամակը ուղարկել եմ, ու նա ինձ ասած ո՞նց, ՋիՄեյլում գրանցուեցի՞ր։ ասեցի՝ հա, տարօրինակ ա, դէ ես scs-net.sy֊ի հաշիւ ունէի, բայց երեւի իրենք ուզում էին գրանցուեմ։

եւ ծուղակն ընկայ։ շատ տարօրինակ էր ինձ համար։ ու սկսեցի կարդալ իմեյլի մասին, ու հասկացայ ինչ է SMTP֊ն։ ու հասկացայ որ կարող էի չգրանցուել այլ մի անգամից իմ մեյլից ուղարկել։

Այդ օրուայ միակ լաւ բանն էին էր, որ մինչեւ այսօր ունեմ այ Google֊ի հաշիւը, իմ միակ գուգլի հաշիւն է, որը պատմական մնացել է։ ինչեւէ։

Ժամանակի ընթացքում սկսում ես սովորել ազատ տեխնոլոգիաների եւ ազատ համակարգերի մասին, բայց արի ու տես, որ այդ մեծ կորպորացիաները հերիք չէ փող են աշխատում բաց տեխնոլոգիաներով (ապրէք, լաւ էք անում, բան չունեմ ասելու) մի հատ էլ լաւ մոնոպոլիայ բռնելուց յետոյ ուզում են սպանել տարբեր տեխնոլոգիաներ։ ինչպէս Գուգլն է փորձում սպանել մեյլը, վեբը, RSS֊ը, Էփլն է փորձում սպանել PodCast RSS֊ը եւ մտածում փակելու մասին, եւ այլն։

Հետ գանք մեր բուն թեմային։

Յունուարի վերջերն էր, շատ կարեւոր բան էի որոշել, աւաղ՝ շատ սխալ ժամանակ։ Ցանկանում էի կատարել մի շարժում, որին ուզում էի կոչել #վեբրուար։ նոյն ինքը՝ վեբի փետրուար։ Webruary, Web February։

Այդ ամէնի նպատակն էր մարդկանց տանել աւելի ազատ համակարգ, որ մարդիկ վեբում գրեն։ ոչ թէ Medium֊ում, ոչ թէ Telegram Channel֊ներում, ոչ թէ ֆեյբուքներում։ այլ հենց համացանցում։

Մէկ օր՝ մէկ գրառում։ այդքան բան։

Իհարկէ, ամէն անգամ երբ նման ձայն եմ բարձրացնում, մի խումբ մարդիկ են գալիս եւ ինձ ասում «բա լաւ ալտերնատիւ առաջարկի՝ միանանք»։ Այս անգամ որոշեցի ալտերնատիւ առաջարկեմ։

Ինձ պէտք էր մի համակարգ, որը մարդկանց թոյլ կը տայ գրանցուել, գրել, հրապարակել։ Ու դրա համար ես գտայ մի ծրագրային ապահովում որը կոչւում է WriteFreely։

Շատ արագ վերցուցի Օրագիր.հայ դոմեյնը եւ այդ ծրագրային ապահովում տեղակայեցի իմ Jail֊երից մէկում՝ Պինգուինաշէնի վրայ։

Եւ այսպիսով մենք ունենք Օրագիրը` օրագիր.հայ հասցէում, որի մասին թեթեւ խօսել ենք նաեւ ցանցառների ռադիօ֊ի համար #31 S02E02֊ի ժամանակ։

Կեանքը սակայն այնպէս ստացուեց, որ գործի տեղում ամէն ինչ արագ էր շարժւում իսկ ես չէի հասցնում, այդ պատճառով ես չկարողացայ ամէն օր մէկ գրառում անել։

Բայց ոչինչ, մենք այսօր ունենք Օրագիրը, որտեղ այս պահին կան 27 օգտագործողներ, 28 հատ բլոգ եւ 169 հատ գրառում։

Շատ շնորհակալութիւն գրանցուողներին եւ գրողներին։

Իսկ ինչ վերաբերւում է ազատ տեխնոլոգիաներին՝ Օրագիրը ունի RSS հոսք որը տրամադրում է ամէն բլոգի, ու նաեւ մէկ հատ RSS հոսք ամբողջ սերւէրի բոլոր բլոգների հանրային գրառումները կարդալու համար։

Կարօտել եմ քեզ, խօսք եմ տալիս աւելի շատ եւ աւելի շուտ գրել։

Մինչ նոր բլոգում։

Ասանկ բաներ…

Պատասխանել մեյլով

ասք երգերի հոսքերի մասին

Իրականում կուզէի այս մասին չխօսել, քանի որ էդքան էլ գլուխ չեմ հանում, բայց արի ու տես որ քեզ հետ պէտք է կիսուեմ այդ մասին։ Սիրտս տենց ա վկայում։

Էս վերջին քանի տարին ահագին յայտնի է դարձել երգերի հոսքերը(՞՞՞), նոյն ինքը Music Streaming֊ները։ Արդէն քանի տարի է օգտւում եմ Deezer֊ից։ ինձ դուր է գալիս որ մի քանի պատճառով։ Նախ՝ ի տարբերութիւն Spotify֊ի, իրենք չունենք երկրի սահմանափակում։ Հայաստանում բոլոր Spotify֊ի օգտատերերը ստիպուած են ամիսը մէկ մտնել VPN֊ով, որ կարողանան շարունակել օգտագործել։

Deezer֊ը նաեւ դուրս է գալիս, քանի որ իրենց զննարկիչով ծրագիրը շատ լաւ է աշխատում նաեւ ոչ֊մեյնսթրիմ ՕՀ֊ների վրայ։ Ես հենց հիմա լսում եմ իմ FreeBSD֊ով մեքենայի վրայ։

Բայց էդ չի հարցը։ Ոչ էլ այդ մասին է այս գրառումը։

Այս գրառումը աւելի շատ DRM-ից ազատ երգերի եւ երգերի գրադարանների մասին է։ You know, էն որ ուղղակի մօտդ քաշում ես երգը, ու վերջ։ Երգը քոնն է։

Այս մասին սկսեցի շատ մտածել վերջերս, քանի որ մի օր մտայ Deezer, որ տեսնեմ որ Pink Floyd֊ի երգերից մէկը էլ հասանելի չի, թէ բա This track is not available in your region.

Շատ չպրպտեցի, զուտ սպասարկումից իմացայ, որ Label֊ի հետ իրաւական հարցեր կան, ու դէ շուտով էդ իմ սիրած ալբումը հասանելի կը լինի։

Ահա, իհարկէ վատ է, որ տենց եղաւ։ Ես կարող էի ուղղակի գումար տալ ու էդ ալբումը մօտս քաշել, մանաւանդ որ էս դարում շատ էժան է պահեստը։

Միւս կողմից շատ եմ սիրում երգերի հոսքերը, քանի որ թոյլ են տալիս ծանօթանալ նոր արուեստագէտների եւ իրենց գործերի հետ։

Երեւի իդէալական դէպքը կը լինի այն, որ Դիզըրով գտնեմ հաւէս բաներ, բայց նաեւ իմ մօտ քաշեմ լոկալ, բարձր որակով լսեմ։

Բա դո՞ւ, ի՞նչ ես օգտագործում։ Եթէ այլ առաջարկներ ունես՝ ասա ինձ։

ասանկ բաներ…

Պատասխանել մեյլով

Ի՞նչ եմ օգտագործում

Շատ անգամներ ինձ հարցնում են՝ «բա դու ի՞նչ ես օգտագործում», ու ես պէտք է երկար պատմեմ, թէ ինչ հարդուեր կամ սոֆթուեր եմ օգտագործում, սկսած ՕՀ֊ներից վերջացած ծրագրերով։

Այդ պատճառով որոշեցի գրել What I use էջը, որտեղ հատիկ֊հատիկ նշել եմ, թէ ինչ եմ օգտագործում, նոյնիսկ ժամացոյց, խցիկ, տետր, եւ այլն, իրենց համապատասխան յղումներով։

ասանկ բաներ։

Պատասխանել մեյլով

SSH գործակալ

Իհարկէ, շատ դէպքերում պէտք է լինում SSH-ուել սերւէրների մէջ։ հա լաւ, ամէն րոպէ էլ պէտք է լինում ։ՃՃ

Քանի ես դէմ եմ գաղտնաբառեր օգտագործելու ու սիրում եմ օգտագործել բանալիներ, ապա շատ եմ հաւաքում իմ SSH-ի բանալիների passphrase-ները։

Յիշեցի, որ դրա համար լուծում կայ. օգտագործել ssh-agent(1), որը իր յիշողութեան մէջ պահում ա passphrase-ը։

կարգաւորելու համար պէտք է աւելացնել հետեւեալը .bashrc ֆայլի մէջ.

eval $(ssh-agent -s) > /dev/null
trap "kill $SSH_AGENT_PID" 0

իսկ .ssh/config ֆայլի մէջ պէտք է աւելացնել

AddKeysToAgent yes

վերջ, հիմա մի անգամ բանալու passphrase-ը հաւաքելուց յետոյ այլեւս չի հարցնի։

ասանկ բաներ։

Պատասխանել մեյլով

WireGuard VPN FreeBSD֊ի վրայ

Արդէն քանի շաբաթ է ինչ Յուքոմը խափանում է նորմալ DNS֊ի աշխատանքը տան օգտատէրերի համար՝

antranigv@zvartnots:~ $ host jabber.am 37.252.73.34
;; connection timed out; no servers could be reached

բայց եթէ օգտագործենք յայտնի DNS սերւէրներ ապա խնդիր չի լինում՝

antranigv@zvartnots:~ $ host jabber.am 9.9.9.9
Using domain server:
Name: 9.9.9.9
Address: 9.9.9.9#53
Aliases: 

jabber.am has address 37.252.73.34
jabber.am mail is handled by 1 post.pingvinashen.am.

սա ստիպեց ինձ մտածել, թէ ինչպէս շատ արագ կարգաւորել VPN սերւէր, որը կը լինի պարզ։

Իհարկէ, մի քանի տարբեր կար մտքումս՝

  • OpenVPN
  • IKEv2
  • IPSec

Խնդիրը նրանում էր, որ այս երեքն էլ շատ բարդ են կարգաւորւում։ Հա, OpenVPN֊ը շատ ֆիչրներ ունի, բայց ես շատ բան չեմ ուզում։ IKEv2 կամ IPSec֊ն էլ շատ ձայնաւոր հաղորդակարգեր են։ ինձ աւելի պարզ բան էր պէտք։

Յիշեցի, որ վերջերս OpenBSD֊ի միջուկի մէջ ինտեգրել էին WireGuard֊ը։

Շատ կարճ պատմեմ WireGuard֊ի մասին։

  • շատ փոքր ծրագրային ապահովում. ~4000 տող կոդ, համեմատած ~100հազար տող կոդ OpenVPN֊ի
  • օգտագործում ա SSH֊ի authorized_keys֊ի նման մօտեցում
  • հեչ ձայնաւոր չի. մաքուր UDP֊ով ա աշխատում
  • մաքուր աշխատում ա routing table֊ի հետ։
  • կարծիքաւորուած ա

Հեղինակը շատ լաւ ներկայացնում ա այս հոլովակում։

Հիմա փորձելու եմ կարգաւորման քայլերը ցոյց տալ։ Ես օգտագործում եմ FreeBSD սերւեր բայց նոյնը հնարաւոր է անել լինուքսի վրայ ։)

մի քանի գլխաւոր գաղափարներ.

WireGuard֊ը ունի՝

  • Գաղտնի բանալի
  • UDP պորտ որին լսում է
  • կողմերի ցուցակ

կողմը ունի՝

  • իր համապատասխան հանրային բանալին
  • թունելի միջի IP հասցէն(երը)
  • (ոչ պարտադիր) վերջնակէտի IP հասցէն եւ պորտը

Լաւ, դէ կարգաւորենք։

Նախ երկու կողմերում քաշում ենք wireguard փեքիջը.

pkg install wireguard

սկսում ենք գաղտնի/հանրային բանալիներ ստեղծելով երկու կողմում.

umask 077
wg genkey > priv.key
wg pubkey < priv.key > pub.key

կապը աւելի անվտանգ դարձնելու համար կարող ենք նաեւ օգտագործել Preshared Key.

wg genpsk > one-psk-per-connection.psk

ապա սերւէրում գրում ենք՝ /usr/local/etc/wireguard/wg0.conf ֆայլի մէջ.

[Interface]
Address         = 10.0.0.1/24  # սերւէրի IP֊ն թունելի մէջ
ListenPort      = 1500         # UDP պորտը
PrivateKey      = (սերւէրի priv.key֊ի պարունակութիւն)

[Peer]
PublicKey       = (կլիենտի pub.key֊ի պարունակութիւն)
PresharedKey    = (one-psk-per-connection.psk-ի պարունակութիւն)
AllowedIPs      = 10.0.0.10/32 # կլիենտի IP֊ն թունելի մէջ

Այդքանը!

իսկ հիմա կլիենտում գրում ենք՝ wg0.conf ֆայլի մէջ.

[Interface]
PrivateKey   = (կլիենտի priv.key֊ի պարունակութիւն)
Address      = 10.0.0.10/24

[Peer]
PublicKey    = (սերւէրի pub.key֊ի պարունակութիւն)
PresharedKey = (one-psk-per-connection.psk֊ի պարունակութիւն)
Endpoint     = myserver:1500
AllowedIPs   = 0.0.0.0/0 # կամ 10.0.0.0/24 եթէ ուզում ենք ուղարկել միայն ներքին ցանցը

արդէն կարող ենք աշխատացնել

սերւէրում.

service wireguard enable
sysrc wireguard_interfaces="wg0"
service wireguard start

ու կլիենտում՝

wg-quick up /path/to/wg0.conf

Այսքանը!

եթէ հարցեր լինեն՝ you know where to find me 😉

ասանկ բաներ։

Պատասխանել մեյլով

Ասք DTrace-ով ծրագրերի հոսքը հետեւլու մասին

Մի շաբաթ առաջ գրառեցի թէ ինչպէս DTrace-ով վօկին հետեւել, այսօր ուզում եմ խօսել թէ ինչպէս հետեւլ ծրագրերին առհասարակ։

Վերցնենք էս օրինակը Սի-ով՝

#include <unistd.h>
#include <stdlib.h>

void a();
void b();

void a() {
  sleep(1);
};

void b() {
  sleep(1);
};

int main() {
  while (1) {
    a();
    b();
  };
  exit(0);
}

Հիմա փորձենք հետեւլ DTrace-ով՝

root@illuria-dev:~/voc-dtrace # dtrace -F -n 'pid$target:prog0::entry,pid$target:prog0::return{} tick-5s{exit(0)}' -c ./prog0
dtrace: description 'pid$target:prog0::entry,pid$target:prog0::return' matched 17 probes
CPU FUNCTION
  0  -> _start
  0    -> handle_static_init
  0    <- handle_static_init
  0    -> main
  0      -> a
  0      <- a
  0      -> b
  0      <- b
  0      -> a
  1      <- a
  1      -> b
  1      <- b
  1      -> a
  0       | :tick-5s

Ահա փաստօրէն կարողանում ենք նաեւ տեսնել թէ ֆունկցիան երբ ա մտնում ու երբ ա դուրս գալիս։

Մի փոքր բացատրեմ, ունենք provider, module, function, probe, նշել եմ որ ուզում եմ օգտագործել pid provider-ը, որը հետեւում է userland-ում կատարուող գործերին, մոդուլը դրել եմ ծրագրի անունը՝ prog0, ֆունկցիան էական չի, իսկ probe-ը նշել եմ եւ entry (մուտք) եւ return (էլք)։ Նաեւ նշել եմ, որ 5 վայրկեան յետոյ դուրս գայ։

Օկ հրաշալի, հիմա փորձենք օբերոնով գրած ծրագիր՝

MODULE prog1;

IMPORT Platform;

PROCEDURE A();
BEGIN
  Platform.Delay(1000)
END A;

PROCEDURE B();
BEGIN
  Platform.Delay(1000)
END B;

BEGIN
  WHILE TRUE
  DO
    A();
    B();
  END
END prog1.

Հիմա փորձենք հետեւել DTrace-ով՝

root@illuria-dev:~/voc-dtrace # dtrace -F -n 'pid$target:prog1::entry,pid$target:prog1::return{} tick-5s{exit(0)}' -c ./prog1
dtrace: description 'pid$target:prog1::entry,pid$target:prog1::return' matched 17 probes
CPU FUNCTION
  1  -> _start
  1    -> handle_static_init
  1    <- handle_static_init
  1    -> main
  1      -> prog1_A
  1      <- prog1_A
  1      -> prog1_B
  1      <- prog1_B
  1      -> prog1_A
  1      <- prog1_A
  1      -> prog1_B
  1      <- prog1_B
  1      -> prog1_A
  0       | :tick-5s

Ահ, մի բան էն չի։ հմմ։ երեւի վօկի գեներացրած կոդից ա՝

/* voc 2.1.0 [2020/07/14] for clang LP64 on freebsd xtpam */

#define SHORTINT INT8
#define INTEGER  INT16
#define LONGINT  INT32
#define SET      UINT32

#include "SYSTEM.h"
#include "Platform.h"

static void prog1_A (void);
static void prog1_B (void);

static void prog1_A (void)
{
  Platform_Delay(1000);
}

static void prog1_B (void)
{
  Platform_Delay(1000);
}

export int main(int argc, char **argv)
{
  __INIT(argc, argv);
  __MODULE_IMPORT(Platform);
  __REGMAIN("prog1", 0);
/* BEGIN */
  while (1) {
    prog1_A();
    prog1_B();
  }
  __FINI;
}

Հա, փաստօրէն վօկի գեներացրած կոդից ա։

Լաւ, ենթադրենք սա իրական ծրագիր ա, ու ուզում ենք իմանալ ուր ա bottleneck-ը, պէտք է հասկանալ ամենաերկարը որտեղ ա ծրագրին երկար տեւում։

pid$target:prog1::entry
{
        self->ts = timestamp;
}

pid$target:prog1::return
/self->ts/
{
        @time[probefunc] = sum(timestamp - self->ts);
        self->ts = 0;
}

tick-5s
{
        exit(0)
}

Էս դէպքում ֆունկցիայի մէջ մտնելու ժամանակ ասում եմ որ ts փոփոխականի մէջ նշի timestamp-ը, ու ելքի ժամանակ ստուգել եթէ ts փոփոխականը յայտարարուած ա։

@time[probefunc] = sum(timestamp - self->ts); տողի վրայ ագրիգացիա է կատարւում գումարելով (sum) թէ ինչքան ժամանակ է տեւել մտնելուց մինչեւ դուրս գալը (timestamp - self->ts) ու պահում time փոփոխականի մէջ։

5 վայրկեան յետոյ դուրս է գալիս ։)

ահա՝

root@illuria-dev:~/voc-dtrace # dtrace -s prog1.d -c ./prog1
dtrace: script 'prog1.d' matched 17 probes
CPU     ID                    FUNCTION:NAME
  0  72544                         :tick-5s

  handle_static_init                                             5137
  prog1_A                                                  2057419770
  prog1_B                                                  2063438603

էսօրուայ համար էսքանը։

ասանկ բաներ։

Պատասխանել մեյլով

Ասք DTrace-ով վօկին հետեւելու մասին

Մի քանի օր առաջ իմ անգլերէն մատեանում գրառել էի թէ ինչպէս Erlangի վիրտուալ մեքենան հետեւել, ու «ցանցառներ ռադիօ»-ի ժամանակ նորայրը հարցրեց եթէ նման բան կարող ենք անել կոմպիլացուած լեզուների վրայ։

Իհարկէ հնարաւոր է, բայց դէ մեզ պէտք է ինչ-որ հետեւելու համակարգ, օրինակ DTrace կամ eBPF։

Իհարկէ DTrace ամէն օր օգտագործում եմ, այնպէս որ մտածեցի, ինչ վատ կը լինի, եթէ փորձեմ վօկ-ի հետ աշխատեցնել ։)

MODULE prog0;

IMPORT Out;

BEGIN
  Out.String("Hello, World!"); Out.Ln;
END prog0.

կոմպիլացնենք ու աշխատեցնենք՝

root@illuria-dev:dtrace # voc -m prog0.Mod
prog0.Mod  Compiling prog0.  Main program.  383 chars.
root@illuria-dev:dtrace # ./prog0
Hello, World!

Շատ լաւ, հրաշալի։

Հիմա ինձ պէտք է իմանալ, թէ prog0 պրոցեսը առհասարակ ինչ ֆունկցիաներ է կանչում։

փորձարկում առաջին՝

փորձեմ տեսնել ամէն ինչ որը կանչում է prog0-ն, ապա գրում եմ all.d ֆայլի մէջ՝

pid$target:::
{
        printf("%s:%s:%s:%s\n", probeprov, probemod, probefunc, probename);
}

ու հիմա աշխատեցնեմ՝

root@illuria-dev:dtrace # dtrace -s all.d -c ./prog0
dtrace: failed to compile script all.d: line 1: failed to create offset probes in 'ethZip_ReadBytes': Cannot allocate memory

Հմմ, memory allocation խնդիր է։ լաւ, փորձեմ աւելի քիչ բան կանչել։ տեսնես ի՞նչ գրադարաններ եւ/կամ ռանթայմեր է կանչում prog0-ն։

root@illuria-dev:dtrace # ldd ./prog0
./prog0:
        libvoc-O2.so => /usr/local/share/voc/lib/libvoc-O2.so (0x800249000)
        libc.so.7 => /lib/libc.so.7 (0x80034f000)

Լաւ, լաւ, կարող եմ միայն libvoc-O2-ին կանչել ։)

սարքում եմ libvoc.d ֆայլ, մէջը գրում եմ՝

pid$target:libvoc-O2::entry
{
        printf("%s:%s:%s:%s\n", probeprov, probemod, probefunc, probename);
}

ու կանչում եմ՝

root@illuria-dev:dtrace # dtrace -s libvoc.d -c ./prog0 -o libvoc.out
dtrace: script 'libvoc.d' matched 1651 probes
Hello, World!
dtrace: pid 64686 has exited

ահ, 1651 հատ տուեալների մուտք կայ։ դէ կարդանք մեր output-ը՝

     1	CPU     ID                    FUNCTION:NAME
     2	  0 262042               Modules_Init:entry pid64686:libvoc-O2.so:Modules_Init:entry
     3	  0 261868              Heap_InitHeap:entry pid64686:libvoc-O2.so:Heap_InitHeap:entry
     4	  0 261751        Platform_OSAllocate:entry pid64686:libvoc-O2.so:Platform_OSAllocate:entry
     5	  0 261679                 Heap__init:entry pid64686:libvoc-O2.so:Heap__init:entry
     6	  0 262691                Heap_REGMOD:entry pid64686:libvoc-O2.so:Heap_REGMOD:entry
     7	  0 261956                Heap_NEWREC:entry pid64686:libvoc-O2.so:Heap_NEWREC:entry
     8	  0 262116                Heap_REGCMD:entry pid64686:libvoc-O2.so:Heap_REGCMD:entry
     9	  0 261956                Heap_NEWREC:entry pid64686:libvoc-O2.so:Heap_NEWREC:entry
    10	  0 262116                Heap_REGCMD:entry pid64686:libvoc-O2.so:Heap_REGCMD:entry
    11	  0 261956                Heap_NEWREC:entry pid64686:libvoc-O2.so:Heap_NEWREC:entry
    12	  0 262116                Heap_REGCMD:entry pid64686:libvoc-O2.so:Heap_REGCMD:entry
    13	  0 261956                Heap_NEWREC:entry pid64686:libvoc-O2.so:Heap_NEWREC:entry
    14	  0 262116                Heap_REGCMD:entry pid64686:libvoc-O2.so:Heap_REGCMD:entry
    15	  0 261956                Heap_NEWREC:entry pid64686:libvoc-O2.so:Heap_NEWREC:entry
    16	  0 262180             SYSTEM_INHERIT:entry pid64686:libvoc-O2.so:SYSTEM_INHERIT:entry
    17	  0 262180             SYSTEM_INHERIT:entry pid64686:libvoc-O2.so:SYSTEM_INHERIT:entry
    18	  0 262180             SYSTEM_INHERIT:entry pid64686:libvoc-O2.so:SYSTEM_INHERIT:entry
    19	  0 262180             SYSTEM_INHERIT:entry pid64686:libvoc-O2.so:SYSTEM_INHERIT:entry
    20	  0 262570              Modules__init:entry pid64686:libvoc-O2.so:Modules__init:entry
    21	  0 261679                 Heap__init:entry pid64686:libvoc-O2.so:Heap__init:entry
    22	  0 261970                Heap_INCREF:entry pid64686:libvoc-O2.so:Heap_INCREF:entry
    23	  0 262511             Platform__init:entry pid64686:libvoc-O2.so:Platform__init:entry
    24	  0 262691                Heap_REGMOD:entry pid64686:libvoc-O2.so:Heap_REGMOD:entry
    25	  0 261956                Heap_NEWREC:entry pid64686:libvoc-O2.so:Heap_NEWREC:entry
    26	  0 261924                Heap_REGTYP:entry pid64686:libvoc-O2.so:Heap_REGTYP:entry
    27	  0 262180             SYSTEM_INHERIT:entry pid64686:libvoc-O2.so:SYSTEM_INHERIT:entry
    28	  0 262461                 SYSTEM_DIV:entry pid64686:libvoc-O2.so:SYSTEM_DIV:entry
    29	  0 261970                Heap_INCREF:entry pid64686:libvoc-O2.so:Heap_INCREF:entry
    30	  0 262691                Heap_REGMOD:entry pid64686:libvoc-O2.so:Heap_REGMOD:entry
    31	  0 261956                Heap_NEWREC:entry pid64686:libvoc-O2.so:Heap_NEWREC:entry
    32	  0 262685    Platform_IdentifyByName:entry pid64686:libvoc-O2.so:Platform_IdentifyByName:entry
    33	  0 263025                  Out__init:entry pid64686:libvoc-O2.so:Out__init:entry
    34	  0 261679                 Heap__init:entry pid64686:libvoc-O2.so:Heap__init:entry
    35	  0 261970                Heap_INCREF:entry pid64686:libvoc-O2.so:Heap_INCREF:entry
    36	  0 262511             Platform__init:entry pid64686:libvoc-O2.so:Platform__init:entry
    37	  0 261970                Heap_INCREF:entry pid64686:libvoc-O2.so:Heap_INCREF:entry
    38	  0 262691                Heap_REGMOD:entry pid64686:libvoc-O2.so:Heap_REGMOD:entry
    39	  0 261956                Heap_NEWREC:entry pid64686:libvoc-O2.so:Heap_NEWREC:entry
    40	  0 262116                Heap_REGCMD:entry pid64686:libvoc-O2.so:Heap_REGCMD:entry
    41	  0 261956                Heap_NEWREC:entry pid64686:libvoc-O2.so:Heap_NEWREC:entry
    42	  0 262116                Heap_REGCMD:entry pid64686:libvoc-O2.so:Heap_REGCMD:entry
    43	  0 261956                Heap_NEWREC:entry pid64686:libvoc-O2.so:Heap_NEWREC:entry
    44	  0 262116                Heap_REGCMD:entry pid64686:libvoc-O2.so:Heap_REGCMD:entry
    45	  0 261956                Heap_NEWREC:entry pid64686:libvoc-O2.so:Heap_NEWREC:entry
    46	  0 262886         Platform_IsConsole:entry pid64686:libvoc-O2.so:Platform_IsConsole:entry
    47	  0 261970                Heap_INCREF:entry pid64686:libvoc-O2.so:Heap_INCREF:entry
    48	  0 262691                Heap_REGMOD:entry pid64686:libvoc-O2.so:Heap_REGMOD:entry
    49	  0 261956                Heap_NEWREC:entry pid64686:libvoc-O2.so:Heap_NEWREC:entry
    50	  0 262286                 Out_String:entry pid64686:libvoc-O2.so:Out_String:entry
    51	  0 262704                     Out_Ln:entry pid64686:libvoc-O2.so:Out_Ln:entry
    52	  0 261895             Platform_Write:entry pid64686:libvoc-O2.so:Platform_Write:entry
    53	  0 262517                Heap_FINALL:entry pid64686:libvoc-O2.so:Heap_FINALL:entry

ահ, հրաշալի, տող 50-ում կանչում ա Out.String

հիմա կարող ենք փորձել դինամիք կերպով կանչել իրա առաջին արգումենտը ։)

գրում եմ string_arg.d ֆայլի մէջ՝

pid$target:libvoc-O2:Out_String:entry
{
        printf("Function Out.String has run with arguments: %s", copyinstr(arg0));
}

ու աշխատեցնում եմ՝

root@illuria-dev:dtrace # dtrace -qs string_arg.d -c ./prog0
Hello, World!
Function Out.String has run with arguments: Hello, World!

Ահ, հրաշալի՜

Լաւ, հիմա փորձեմ more dirty stuff 😉

ունենք prog1.Mod

MODULE prog1;

IMPORT Out, In;

VAR s: ARRAY 32 OF CHAR;
BEGIN
  In.Line(s); Out.Ln;
END prog1.

ու նաեւ հետեւլեալ D ծրագիրը՝

pid$target:libvoc-O2:Platform_ReadBuf:entry
{
        printf("Function Platform.Readbuf has run with arguments: %s\n", copyinstr(arg1));
}

ահա!

root@illuria-dev:dtrace # voc -m prog1.Mod
prog1.Mod  Compiling prog1.  Main program.  435 chars.
root@illuria-dev:dtrace # dtrace -qs in.d -c ./prog1
Function Platform.Readbuf has run with arguments:
myinput!

Function Platform.Readbuf has run with arguments: m
Function Platform.Readbuf has run with arguments: y
Function Platform.Readbuf has run with arguments: i
Function Platform.Readbuf has run with arguments: n
Function Platform.Readbuf has run with arguments: p
Function Platform.Readbuf has run with arguments: u
Function Platform.Readbuf has run with arguments: t
Function Platform.Readbuf has run with arguments: !

root@illuria-dev:dtrace #

Այնպէս որ, հա՛։ DTrace-ը փաստացի rootkit է ։)

ասանկ բաներ։

Պատասխանել մեյլով

Ասք թերթերի մասին

Այսօր ահագին բլբլացել եմ թութում եւ թվիթերում ժամանակակից մամուլի բումի եւ թերթերի մասին։ Ուզում եմ նոյնը նաեւ գրել այստեղ, Հայերէնով։

Այս ինֆորմացիայի դարի ժամանակ ահագին բարդ է պահպանել առողջութիւնը լուրերը կարդալու ժամանակ, շատ բարդ է իմանալ թէ ինչ է կատարւում երկրի մը մէջ, երբ ամէն մի յօդուած ներկայացնում է տուեալների բիթեր առանց ոչ մի տեղեկատուութեան։

Հենց այդ պատճառով մի քանի ամիս առաջ որոշեցի կարդալ թերթեր։ այո, թղթով տպած թերթեր։

Երեք գլխաւոր բաներ են կատարւում երբ կարդում ես թերթ։

Առաջին. Տուեալները սկսում են իրար հետ կապ ունենալ։ Այսօր կարդում ես շատ փոքր նորութիւն, մէկ շաբաթ յետոյ կարդում ես այդ լուրի զարգացումները։ TL;DR՝ չես կորում։

Երկրոդ. Մարդկանց տալիս է հարթակ, որտեղ կարող են արտայայտել իրենց մտքերը եւ տեսակէտը ինչ որ հարցի շուրջ, դա լինի քաղաքական, արուեսի, մշակոյթի կամ իրենց յուզող խնդրի մասին։

Երրորդ. Մարդիկ, մանաւանդ ջահելները, սկսում են շատ տարօրինակ նայել։ Երբ նստում եմ սրճարանում եւ պայուսակիցս հանում եմ թերթը, ինձ նայում մտածելով «էս թե՞րթ ա կարդում։ բայց ինքը պապի չի։ ախր Այֆոն ու ՄակԲուք ունի։ ինչի՞»։

TL;DR: Թերթերը շատ լաւն են, առցանց տուեալների բումը չի նշանակում որ թերթերը վերացել են, ոչ էլ պէտք է նշանակի այն։

Գնի՛ր Թերթ մը, Փրկի՛ր Լրագրութիւնը։

Պատասխանել մեյլով