Përshëndetje, Habr!
Për mua, kjo frazë është si hello world, sepse më në fund arrita në publikimin tim të parë. Kam vonuar gjatë për këtë moment të mrekullueshëm, sepse nuk kisha asgjë për të shkruar, dhe nuk doja të risjellja ato që ishin diskutuar tashmë një numër të madh herësh. Në të vërtetë, për publikimin tim të parë doja diçka origjinale, të dobishme për të tjerët dhe që përmbante një sfidë dhe zgjidhje problemesh. Dhe tani, mund të ndaj këtë me të tjerët. Tani le të flasim për të gjitha në radhë.
Hyrje
Të gjitha filloi kur para disa kohësh instalova Linux Mint në kompjuterin tim të punës. Shumë ndoshta e dinë që Pidgin me plugin-in Sipe është një zëvendësim mjaft i mirë për Microsoft Lync (i quajtur tani Skype for Business) për sistemet Linux. Për shkak të natyrës së punës sime, shpesh duhet të marr pjesë në konferenca sip, dhe në kohën kur isha përdorues i Windows, hyrja në konferenca ishte shumë e lehtë: merrja ftesën në email, klikoja në lidhjen e hyrjes, dhe isha brenda.
Kur kaloni nĂ« anĂ«n e errĂ«t tĂ« Linux, gjĂ«rat u bĂ«n pak mĂ« tĂ« komplikuara: hyrja nĂ« konferenca nĂ« Pidgin natyrisht qĂ« ekziston, por atje duhet tĂ« zgjidhni nĂ« pronat e llogarisĂ« suaj sip-opsionin pĂ«r tâu bashkuar me konferencĂ«n nĂ« meny dhe nĂ« dritaren qĂ« hapet tĂ« vendosni lidhjen pĂ«r konferencĂ«n ose tĂ« shkruani emrin e organizatorit dhe conf id. Dhe pas njĂ« kohe, fillova tĂ« mendoj: «a ka ndonjĂ« mundĂ«si ta thjeshtoj kĂ«të». Po, do tĂ« thoni ju, pĂ«rse tĂ« tĂ« nevojitet kjo, do tĂ« ishe rehat nĂ« Windows dhe nuk do tĂ« shqetĂ«soheshe.
Hapi 1. Kërkimi
«Kur njĂ« caprice i hyn nĂ« mendje â me njĂ« shuplakĂ« nuk e largon» â kĂ«shtu shkruante Nekrasov nĂ« veprĂ«n e tij «Kush jeton mirĂ« nĂ« Rusë».
Pra, pasi mendimi mu fut nĂ« kokĂ«, pas pak kohĂ«sh erdhi edhe ideja e parĂ« pĂ«r realizim. Dukej e thjeshtĂ« â duhet tĂ« kapnim kĂ«rkesat ndaj lidhjeve. â tĂ« vendosni njĂ« proces lokal tĂ« aplikacionit web nĂ« 127.0.0.1 dhe tĂ« shtoni njĂ« regjistĂ«r statik pĂ«r domenin e kompanisĂ« nĂ« /etc/hosts, pĂ«rmes tĂ« cilit bĂ«het hyrja nĂ« konferenca, duke treguar pĂ«r localhost. MĂ« pas, ky server web duhet tĂ« procesojĂ« lidhjen qĂ« ka marrĂ« dhe ndonjĂ« mĂ«nyrĂ« ta transferojĂ« brenda Pidgin (tĂ« them tĂ« drejtĂ«n, nĂ« kĂ«tĂ« fazĂ« nuk kisha ende njĂ« kuptim se si ta dorĂ«zoja atĂ«). Zgjidhja, sigurisht, ka aromĂ«n e nyjave, por ne jemi programues, nyjat nuk na trembin (shaka).
MĂ« pas, aksidentalisht hape njĂ« lidhje pĂ«r ftesĂ« nĂ« Google Chrome (dhe zakonisht pĂ«rdor gjithmonĂ« Mozilla Firefox). Dhe pĂ«r habinĂ« time, faqja e internetit dukeshin krejt ndryshe â nuk kishte formĂ« pĂ«r tĂ« futur tĂ« dhĂ«nat e pĂ«rdoruesit dhe menjĂ«herĂ« pas hyrjes nĂ« faqe shfaqej njĂ« kĂ«rkesĂ« pĂ«r tĂ« hapur diçka pĂ«rmes xdg-open. PĂ«r tĂ« lĂ«nĂ« njĂ« shenjĂ«, e shtyp "po" dhe del njĂ« mesazh gabimi â lidhja lync15:confjoin?url=https://meet.company.com/user/confid nuk mund tĂ« hapet. Hmm. ĂfarĂ« Ă«shtĂ« ky xdg-open dhe çfarĂ« i nevojitet pĂ«r tĂ« hapur lidhje tĂ« tilla? NjĂ« shqyrtim i dokumentacionit tregoi se Ă«shtĂ« njĂ« menaxher grafiku qĂ« ndihmon nĂ« lançimin e aplikacioneve tĂ« lidhura, qoftĂ« me protokollet pĂ«r uri scheme, ose me lloje tĂ« caktuara skedarĂ«sh. Asosit qĂ« krijohen pĂ«rmes pĂ«rputhjes mime-type. Pra, shohim se po krijohet njĂ« kĂ«rkim pĂ«r aplikacionin e lidhur pĂ«r uri scheme me emrin lync15 dhe lidhja dĂ«rgohet nĂ« xdg-open, i cili, nĂ« teori, duhet ta kalojĂ« atĂ« nĂ« ndonjĂ« aplikacion qĂ« pĂ«rgjigjet pĂ«r kĂ«tĂ« lloj lidhjesh. PatjetĂ«r qĂ« nuk e kemi kĂ«tĂ« nĂ« sistemin tonĂ«. E duke pasur parasysh kĂ«tĂ«, si veprojnĂ« nĂ« botĂ«n e open-source? E saktĂ«, ne do ta shkruajmĂ« vetĂ« atĂ«.
Një depërtim më i thellë në botën e Linux-it, veçanërisht në studimin e funksionimit të mjedisit desktop (desktop environment, DE), për shembull unë e përdor Xfce në Linux Mint, tregoi se aplikacionet dhe mime-type i lidhur me to zakonisht shkruhen drejtpërdrejt në skedarët e shkurtoreve me zgjerimin .desktop. Pra, pse jo, krijoj një shkurtore të thjeshtë aplikacioni që duhet thjesht të nisë një skript shell dhe të shfaqë argumentin e tij në konsolë, jap vetëm skedarin e shkurtoreve:
[Desktop Entry]
Name=Lync
Exec=/usr/local/bin/lync.sh %u
Type=Application
Terminal=false
Categories=Network;InstantMessaging;
MimeType=x-scheme-handler/lync15;
në nis xdg-open nga konsola me kalimin e të njëjtës lidhje që vjen nga shfletuesi dhe⊠një dështim. Përsëri thotë se nuk mund të përpunojë lidhjen.
Siç rezultoi, unë nuk e përmirësova katalogun e mime-type të lidhur me aplikacionin tim. Kjo bëhet me një komandë të thjeshtë:
xdg-mime default lync.desktop x-scheme-handler/lync15
e cila thjesht redakton skedarin ~/.config/mimeapps.list.
PĂ«rpjekja numĂ«r 2 me thirrjen xdg-open â dhe sĂ«rish dĂ«shtim. AsgjĂ«, vĂ«shtirĂ«sitĂ« nuk na frikĂ«sojnĂ«, pĂ«rkundrazi na nxisin tĂ« interesoheni mĂ« shumĂ«. Duke u armatosur me gjithĂ« fuqinĂ« e bash-it (dmth. gjurmimi), ne bĂ«mĂ« njĂ« zhytje tĂ« thellĂ« nĂ« debugging. ĂshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se xdg-open Ă«shtĂ« thjesht njĂ« skript shell.
bash -x xdg-open $url
Duke analizuar daljet pas gjurmimit, bëhet pak më e qartë se kontrolli vazhdon në exo-open. Ky është një skedar bllok dhe është më e ndërlikuar të kuptojmë pse ai kthehet një kod të pasuksesshëm kur i kalojmë një lidhje si argument.
Duke kaluar nëpër detajet e xdg-open, zbuloj se ai analizon parametra të ndryshëm të mjedisit dhe kalon kontrollin më tej ose në ndihmës për hapjen e skedarëve/lidhjeve të veçanta për çdo DE, ose ka një opsion rezervë në formën e funksionit open_generic
open_xfce()
{
if exo-open --help 2>/dev/null 1>&2; then
exo-open "$1"
elif gio help open 2>/dev/null 1>&2; then
gio open "$1"
elif gvfs-open --help 2>/dev/null 1>&2; then
gvfs-open "$1"
else
open_generic "$1"
fi
if [ $? -eq 0 ]; then
exit_success
else
exit_failure_operation_failed
fi
}
Shpejt po vendos një hile këtu me analizimin e argumentit të kaluar dhe nëse ka ndonjë nënstrinë specifike lync15:, atëherë kalojmë menjëherë kontrollin në funksionin open_generic.
Përpjekja numër 3 dhe mendoj se ka funksionuar? Aha, tani, si mundet. Por mesazhi i gabimit tashmë u ndryshua, tani më tha se nuk u gjet skedari dhe në formën e një skedari më shkruajti atë lidhjen që u kalua si argument.
KĂ«tĂ« herĂ« problemi ishte nĂ« funksionin is_file_url_or_path, i cili analizoi lidhjen e dhĂ«nĂ« pĂ«r skedarin file:// ose njĂ« rrugĂ« pĂ«r skedarin ose diçka tjetĂ«r. Kontrolli nuk funksionoi siç duhet pĂ«r shkak se prefiksi ynĂ« (skema e URL) ka numra, ndĂ«rsa shprehja e rregullt kontrollohet vetĂ«m nga njĂ« grup karakteresh pĂ«rbĂ«rĂ« prej :alpha:, pikĂ«s dhe presjes. Pas njĂ« konsultimi me standardin rfc3986 pĂ«r identifikuesin e burimeve tĂ« njĂ«trajtshme , u kuptua qĂ« kĂ«tĂ« herĂ« Microsoft nuk po shkel asgjĂ« (pavarĂ«sisht se kisha njĂ« version tĂ« tillĂ«). Thjesht klasa e karaktereve :alpha: pĂ«rmban vetĂ«m shkronjat e alfabetit latin. Po e ndryshoj shprehjen e rregullt nĂ« alphanumeric. E zotĂ«ruar, jeni tĂ« mrekullueshĂ«m, gjithçka pĂ«rfundimisht fillon, kontrolli pas tĂ« gjitha kontrollimeve kalohet nĂ« aplikacionin tonĂ« skript, lidhja jonĂ« shfaqet nĂ« konsolĂ«, gjithçka siç duhet. Pas kĂ«saj filloj tĂ« dyshoj se tĂ« gjitha problemet me exo-open gjithashtu lidhen me validimin e formatit tĂ« lidhjes pĂ«r shkak tĂ« numrave nĂ« skemĂ«. PĂ«r tĂ« verifikuar hipotezĂ«n, ndryshoj regjistrimin e mime-type pĂ«r aplikacionin nĂ« thjesht skemĂ«n lync dhe voilĂ â gjithçka funksionon pa ri-definimin e funksionit open_xfce. Por kjo nuk na ndihmon aspak, sepse faqja e internetit pĂ«r hyrje nĂ« konferencĂ« krijon pikĂ«risht lidhjen me lync15.
Pra, pjesa e parë e rrugës është përfunduar. Ne dimë të kapim thirrjen e lidhjes dhe pastaj duhet ta përpunojmë dhe ta dërgojmë brenda Pidgin. Për të kuptuar se si funksionon brenda kur futen të dhënat për lidhjen në menunë "bashko në konferencë", kam klonuar depozitën git të projektit Sipe dhe jam përgatitur të zhytëm sërish në kod. Por këtu, për fatin tim, më tërhoqën skriptet në katalog. contrib/dbus/:
- sipe-join-conference-with-uri.pl
- sipe-join-conference-with-organizer-and-id.pl
- sipe-call-phone-number.pl
- SipeHelper.pm
Doli se plugini Sipe është i disponueshëm për të ndërvepruar përmes dbus (desktop bus) dhe brenda skripteve ka shembuj të drejtpërdrejtë për bashkimin në konferencë përmes lidhjes, ose përmes emrit të organizatorit dhe conf-id, ose mund të iniciosh një thirrje përmes sip. Kjo pikërisht është ajo që na mungonte.
Hapi 2. Zbatimi i përpunuesit për autodhimbjen
Duke pasur parasysh shembujt e gatshëm në Perl, vendosa thjesht të përdor sipe-join-conference-with-uri.pl dhe të bëj disa ndryshime për veten time. Di të shkruaj në Perl, prandaj nuk pati asnjë vështirësi të veçantë.
Pas testimit të skriptit veçmas, e kam përfshirë thirrjen e tij në skedarin lync.desktop. Dhe ishte një fitore! Ndërsa hyja në faqen e bashkimit në konferencë dhe lejoja nisjen e xdg-open, dritarja e konferencës nga Pidgin hapej automatikisht. Sa e lumtur isha.
I frymëzuar nga suksesi, vendosa të bëj njësoj edhe për shfletuesin tim kryesor Mozilla Firefox. Ndërsa hyja nëpër lisi, hapet faqja për autorizim dhe në fund të saj ka një buton bashkohu duke përdorur office communicator. Ai e tërhoqi vëmendjen time. Kur klikova në të, shfletuesi kalon në adresën:
conf:sip:{user};gruu;opaque=app:conf:focus:id:{conf-id}required-media=audio
, për çfarë ai më thotë me mirësjellje se nuk di si ta hap këtë dhe ndoshta nuk kam një aplikacion të lidhur për protokollin e tillë. E kemi kaluar tashmë këtë.
Përshpejtoj të regjistroj aplikacionin tim-skript edhe për URI-skema conf dhe⊠nuk ndodh asgjë. Shfletuesi vazhdon të ankohet se nuk ka një aplikacion që të trajtojë lidhjet e mia. Megjithatë, thirrja nga konsola xdg-open me parametrat funksionon shumë mirë.
âCakto handler-in e protokollit tĂ« personalizuar nĂ« firefoxâ â pĂ«r kĂ«tĂ« pyetje kam dalĂ« nĂ« Internet. Pas kalimit tĂ« disa diskutimeve nĂ« stackoverflow (pĂ«rndryshe, ku do tĂ« shkoja), duket se kam gjetur njĂ« pĂ«rgjigje. Duhet tĂ« krijoj njĂ« parametĂ«r tĂ« veçantĂ« nĂ« about:config (sigurisht zĂ«vendĂ«simin e foo me conf):
network.protocol-handler.expose.conf = false
Krijojmë, hapim lidhjen dhe⊠nuk ishim vendosmërisht. Shfletuesi sikur asgjë nuk ka ndodhur tha se nuk e njeh aplikacionin tonë.
Lexoj dokumentacionin zyrtar për regjistrimin e protokollit nga Mozilla, ka një mundësi për të shkruar asocimet në desktop-in e gnome (sigurisht duke zëvendësuar foo me conf):
gconftool-2 -s /desktop/gnome/url-handlers/conf/command '/path/to/app %s' --type String
gconftool-2 -s /desktop/gnome/url-handlers/conf/enabled --type Boolean true
Regjistroj, hap shfletuesin⊠dhe sërish problemi.
Këtu më duket një rresht nga dokumentacioni:
Herën tjetër që klikoni një lidhje të llojit protokoll foo do t'ju kërkohet se cili aplikacion të hapet me të.
â Semyon Semyonovich
â Aaa
Ne klikojmĂ« nĂ« lidhje, por thjesht faqja e internetit bĂ«ni ndryshimin e window.location pĂ«rmes javascript. Po shkruaj njĂ« skedar html tĂ« thjeshtĂ« me njĂ« lidhje nĂ« protokollin conf, e hap nĂ« shfletues, klikoj nĂ« lidhje - Yos! Hapet njĂ« dritare me pyetje se nĂ« cilin aplikacion duhet tĂ« hapim lidhjen tonĂ« dhe atje nĂ« listĂ« e kemi aplikacionin tonĂ« Lync - ne e kemi regjistruar atĂ« me tĂ« gjitha mĂ«nyrat e mundshme. Atje nĂ« dritare ka njĂ« shenjĂ« âmbaj mend zgjedhjen dhe hapi gjithmonĂ« lidhjet nĂ« aplikacionin tonĂ«,â e shĂ«nojmĂ«, prekim ok. Dhe kjo Ă«shtĂ« fitorja e dytĂ« - dritarja e konferencĂ«s hapet. Kjo ndodh qĂ« edhe hapja e konferencave funksionon, jo vetĂ«m kur klikohet nĂ« lidhje, por edhe kur kalojmĂ« nga faqja qĂ« na nevojitet pĂ«r t'u bashkuar nĂ« konferencĂ«.
Më pas kontrollova, fshirja e parametrave network.protocol-handler.expose.conf nuk kishte asnjë ndikim në funksionimin e protokollit në lisë. Lidhjet vazhduan të funksiononin.
Përfundimi
Unë ngarkova të gjitha krijimet e mia në një depo në github, lidhjet për të gjitha burimet do të jenë në fund të artikullit.
Do të doja të merrja feedback nga ata që do të donin të shfrytëzonin punimet e mia. Të theksoj se i kam zhvilluar vetëm për sistemin tim Linux Mint, kështu që distribucione të tjera ose desktopët mund të mos funksionojnë në atë variant. Në fakt, jam pothuajse i sigurt për këtë, sepse kam patch-e në xdg-open vetëm 1 funksion, i cili i përket vetëm DE-së sime. Nëse dëshironi të shtoni mbështetje për sisteme ose desktopë të tjerë, më shkruani në GitHub me pull-request-a.
Realizimi i projektit të tërë zgjati 1 mbrëmje.
Linket:
Burimi: habr.com
