హే హబ్ర్!
నాకు, ఈ పదబంధం హలో వరల్డ్తో సమానంగా ఉంటుంది, ఎందుకంటే నేను చివరకు నా మొదటి ప్రచురణకు వచ్చాను. నేను ఈ అద్భుతమైన క్షణాన్ని చాలా కాలం పాటు నిలిపివేసాను, ఎందుకంటే దాని గురించి వ్రాయడానికి ఏమీ లేదు, మరియు ఇప్పటికే కొన్ని సార్లు పీల్చుకున్న దానిని నేను పీల్చుకోవాలనుకోలేదు. సాధారణంగా, నా మొదటి ప్రచురణ కోసం నేను అసలైన, ఇతరులకు ఉపయోగకరమైన మరియు ఒక రకమైన సవాలు మరియు సమస్య పరిష్కారాన్ని కలిగి ఉండాలని కోరుకున్నాను. మరియు ఇప్పుడు నేను దీన్ని పంచుకోగలను. ఇప్పుడు ప్రతిదీ క్రమంలో మాట్లాడుకుందాం.
ఎంట్రీ
కొంతకాలం క్రితం నేను నా వర్క్ కంప్యూటర్లో Linux Mint డౌన్లోడ్ చేసినప్పుడు ఇదంతా ప్రారంభమైంది. Linux సిస్టమ్ల కోసం మైక్రోసాఫ్ట్ లింక్కు (ఇప్పుడు స్కైప్ అని పిలవబడేది) సైప్ ప్లగ్ఇన్తో పిడ్జిన్ పూర్తిగా సరిఅయిన ప్రత్యామ్నాయం అని చాలా మందికి తెలుసు. నా పని ప్రత్యేకతల కారణంగా, నేను తరచుగా SIP కాన్ఫరెన్స్లలో పాల్గొనవలసి ఉంటుంది మరియు నేను విండోస్ వర్కర్గా ఉన్నప్పుడు, కాన్ఫరెన్స్లలోకి ప్రవేశించడం ప్రాథమికంగా ఉండేది: మేము మెయిల్ ద్వారా ఆహ్వానాన్ని అందుకుంటాము, లాగిన్ లింక్పై క్లిక్ చేయండి మరియు మేము వెళ్లడానికి సిద్ధంగా ఉన్నాము .
Linux యొక్క చీకటి వైపుకు మారినప్పుడు, ప్రతిదీ కొంత క్లిష్టంగా మారింది: వాస్తవానికి, మీరు Pidginలో కాన్ఫరెన్స్లకు కూడా లాగిన్ అవ్వవచ్చు, కానీ దీన్ని చేయడానికి మీరు మీ SIP ఖాతా యొక్క ప్రాపర్టీస్లోని మెనులో జాయిన్ కాన్ఫరెన్స్ ఎంపికను ఎంచుకోవాలి మరియు తెరుచుకునే విండోలో, కాన్ఫరెన్స్కు లింక్ను చొప్పించండి లేదా నిర్వాహకుడు మరియు conf ID పేరును నమోదు చేయండి. మరియు కొంత సమయం తరువాత నేను ఆలోచించడం ప్రారంభించాను: "దీనిని ఎలాగైనా సరళీకృతం చేయడం సాధ్యమేనా?" అవును, మీరు ఇలా అనవచ్చు, మీకు ఇది ఎందుకు అవసరం? నేను విండోస్లో కూర్చుని నా మనస్సును చెదరగొట్టను.
దశ 1: పరిశోధన
"మీరు మీ తలపై కొంత ఇష్టాన్ని కలిగి ఉంటే, మీరు దానిని వాటాతో పడగొట్టలేరు" అని నెక్రాసోవ్ తన రచనలో "హూ లివ్స్ వెల్ ఇన్ రస్" లో చెప్పాడు.
కాబట్టి, ఒకసారి ఆలోచన నా తలలోకి వచ్చింది, కొంతకాలం తర్వాత అమలు కోసం మొదటి ఆలోచన వచ్చింది. ప్రతిదీ సరళంగా అనిపించింది - మీరు లింక్లకు యాక్సెస్ను అడ్డుకోవాలి
అప్పుడు, అనుకోకుండా, నేను గూగుల్ క్రోమ్లో ఆహ్వాన లింక్ని ఎలాగో తెరిచాను (మరియు సాధారణంగా నేను ఎల్లప్పుడూ Mozilla Firefoxని ఉపయోగిస్తాను). మరియు నా ఆశ్చర్యానికి, వెబ్ పేజీ పూర్తిగా భిన్నంగా కనిపించింది - వినియోగదారు డేటాను నమోదు చేయడానికి ఫారమ్ లేదు మరియు పేజీని నమోదు చేసిన వెంటనే ఏదైనా తెరవమని అభ్యర్థన ఉంది. xdg ఓపెన్. వినోదం కోసం, నేను “అవును” క్లిక్ చేసాను మరియు దోష సందేశం కనిపిస్తుంది - లింక్ lync15:confjoin?url=https://meet.company.com/user/confid తెరవబడదు. హ్మ్. ఇది ఎలాంటి xdg-open మరియు అటువంటి లింక్లు తెరవడానికి దీనికి ఏమి అవసరం? డాక్యుమెంటేషన్ యొక్క పోస్ట్-మార్టం రీడింగ్, ఇది uri స్కీమ్ కోసం ప్రోటోకాల్లతో లేదా నిర్దిష్ట ఫైల్ రకాలతో అనుబంధిత అప్లికేషన్లను అమలు చేయడంలో సహాయపడే GUI హ్యాండ్లర్ అని వెల్లడించింది. అనుబంధాలు మైమ్-టైప్ మ్యాపింగ్ ద్వారా కాన్ఫిగర్ చేయబడ్డాయి. కాబట్టి మేము uri స్కీమ్ పేరు కోసం సరిపోలిన అప్లికేషన్ కోసం శోధనను నడుపుతున్నట్లు చూస్తాము లింక్15 మరియు లింక్ xdg-openకి పంపబడుతుంది, ఇది సిద్ధాంతపరంగా, ఈ రకమైన లింక్కు బాధ్యత వహించే ఏదైనా అప్లికేషన్కు పంపాలి. వాస్తవానికి, మన సిస్టమ్లో ఏది లేదు. లేకపోతే, ఓపెన్ సోర్స్ ప్రపంచంలో వారు ఏమి చేస్తారు? అది సరే, మనమే వ్రాస్తాము.
Linux ప్రపంచంలో మరింత ఇమ్మర్షన్ మరియు ముఖ్యంగా గ్రాఫికల్ షెల్ (డెస్క్టాప్ ఎన్విరాన్మెంట్, DE) ఎలా పనిచేస్తుందో అధ్యయనం చేయడం ద్వారా, నేను Linux Mintలో Xfceని కలిగి ఉన్నాను, అప్లికేషన్లు మరియు దానితో అనుబంధించబడిన మైమ్-రకం సాధారణంగా నేరుగా వ్రాయబడిందని చూపించింది. డెస్క్టాప్ పొడిగింపుతో సత్వరమార్గం ఫైల్లు. సరే, ఎందుకు కాదు, నేను ఒక సాధారణ అప్లికేషన్ షార్ట్కట్ని సృష్టించాను, అది కేవలం ఒక బాష్ స్క్రిప్ట్ను ప్రారంభించి, దానికి పంపిన ఆర్గ్యుమెంట్ని కన్సోల్కి అవుట్పుట్ చేయాలి, నేను షార్ట్కట్ ఫైల్ను మాత్రమే అందిస్తాను:
[Desktop Entry]
Name=Lync
Exec=/usr/local/bin/lync.sh %u
Type=Application
Terminal=false
Categories=Network;InstantMessaging;
MimeType=x-scheme-handler/lync15;
నేను కన్సోల్ నుండి xdg-openని ప్రారంభిస్తాను, బ్రౌజర్ నుండి వచ్చే అదే లింక్ను పాస్ చేస్తున్నాను మరియు... బమ్మర్. ఇది లింక్ను ప్రాసెస్ చేయలేమని మళ్లీ చెప్పింది.
ఇది ముగిసినట్లుగా, నేను నా అప్లికేషన్తో అనుబంధిత మైమ్-రకాల డైరెక్టరీని నవీకరించలేదు. ఇది సాధారణ ఆదేశంతో చేయబడుతుంది:
xdg-mime default lync.desktop x-scheme-handler/lync15
ఇది ఫైల్ను సవరిస్తుంది ~/.config/mimeapps.list.
xdg-ఓపెన్ కాల్తో నంబర్ 2 ప్రయత్నం - మళ్లీ విఫలమైంది. ఏమీ లేదు, ఇబ్బందులు మనల్ని భయపెట్టవు, కానీ మన ఆసక్తిని మాత్రమే పెంచుతాయి. మరియు బాష్ యొక్క అన్ని శక్తితో (అంటే ట్రేసింగ్), మేము డీబగ్గింగ్లో తలదూర్చాము. xdg-open అనేది షెల్ స్క్రిప్ట్ మాత్రమే అని ఇక్కడ గమనించడం ముఖ్యం.
bash -x xdg-open $url
ట్రేస్ చేసిన తర్వాత అవుట్పుట్ను విశ్లేషించడం వలన నియంత్రణ బదిలీ చేయబడుతుందని కొద్దిగా స్పష్టమవుతుంది exo-ఓపెన్. మరియు ఇది ఇప్పటికే బైనరీ ఫైల్ మరియు ఆర్గ్యుమెంట్లో దానికి లింక్ను పంపేటప్పుడు విజయవంతం కాని రిటర్న్ కోడ్ను ఎందుకు తిరిగి ఇస్తుందో అర్థం చేసుకోవడం చాలా కష్టం.
xdg-open యొక్క ఇంటర్నల్లను పరిశీలించిన తర్వాత, ఇది వివిధ పర్యావరణ పారామితులను విశ్లేషిస్తుందని మరియు నిర్దిష్ట DEకి నిర్దిష్ట ఫైల్ లింక్లను తెరవడానికి కొన్ని సాధనాలకు నియంత్రణను పంపుతుందని లేదా ఇది ఫాల్బ్యాక్ ఫంక్షన్ను కలిగి ఉందని నేను కనుగొన్నాను. ఓపెన్_జెనెరిక్
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
}
ఆమోదించబడిన ఆర్గ్యుమెంట్ యొక్క విశ్లేషణతో పాటు మా నిర్దిష్ట సబ్స్ట్రింగ్ అక్కడ ఉన్నట్లయితే నేను త్వరగా ఇక్కడ ఒక చిన్న హ్యాక్ను పొందుపరుస్తాను. లింక్15:, అప్పుడు మేము వెంటనే నియంత్రణను ఫంక్షన్కు బదిలీ చేస్తాము ఓపెన్_జెనెరిక్.
ప్రయత్నం సంఖ్య 3 మరియు అది పని చేస్తుందని మీరు అనుకుంటున్నారా? అవును, ఇప్పుడు, వాస్తవానికి. కానీ ఎర్రర్ మెసేజ్ ఇప్పటికే మారిపోయింది, ఇది ఇప్పటికే పురోగతిలో ఉంది - ఇప్పుడు అతను ఫైల్ కనుగొనబడలేదు అని నాకు చెబుతూ, ఫైల్ రూపంలో అదే లింక్ను వాదనగా పంపాడు.
ఈసారి అది ఫంక్షన్గా మారింది is_file_url_or_path, ఇది ఇన్పుట్కి పంపబడిన ఫైల్ లింక్ను విశ్లేషిస్తుంది: file:// లేదా ఫైల్కి మార్గం లేదా మరేదైనా. మరియు మా ఉపసర్గ (url స్కీమ్) సంఖ్యలను కలిగి ఉన్నందున చెక్ సరిగ్గా పని చేయలేదు మరియు సాధారణ వ్యక్తీకరణ :alpha: చుక్కలు మరియు డాష్లతో కూడిన అక్షర సమితిని మాత్రమే తనిఖీ చేస్తుంది. కోసం rfc3986 ప్రమాణాన్ని సంప్రదించిన తర్వాత ఏకరీతి వనరు ఐడెంటిఫైయర్ ఈసారి మైక్రోసాఫ్ట్ దేనినీ ఉల్లంఘించడం లేదని స్పష్టమైంది (నాకు అలాంటి సంస్కరణ ఉన్నప్పటికీ). కేవలం అక్షర తరగతి :alpha: లాటిన్ వర్ణమాల యొక్క అక్షరాలను మాత్రమే కలిగి ఉంటుంది. నేను రెగ్యులర్ చెక్ని త్వరగా ఆల్ఫాన్యూమరిక్కి మారుస్తాను. పూర్తయింది, మీరు అద్భుతంగా ఉన్నారు, చివరగా ప్రతిదీ మొదలవుతుంది, మా స్క్రిప్ట్ అప్లికేషన్కు అన్ని తనిఖీలు అందించిన తర్వాత నియంత్రించండి, మా లింక్ కన్సోల్లో ప్రదర్శించబడుతుంది, ప్రతిదీ అలాగే ఉంటుంది. దీని తరువాత, స్కీమ్లోని సంఖ్యల కారణంగా లింక్ ఫార్మాట్ యొక్క ధృవీకరణ కారణంగా ఎక్సో-ఓపెన్తో అన్ని సమస్యలు కూడా ఉన్నాయని నేను అనుమానించడం ప్రారంభించాను. పరికల్పనను పరీక్షించడానికి, నేను అప్లికేషన్ యొక్క మైమ్-రకం రిజిస్ట్రేషన్ను కేవలం స్కీమ్గా మారుస్తాను లింక్ మరియు voila - అన్నీ open_xfce ఫంక్షన్ను భర్తీ చేయకుండానే పని చేస్తాయి. కానీ ఇది మాకు ఏ విధంగానూ సహాయం చేయదు, ఎందుకంటే సమావేశంలో ప్రవేశించడానికి వెబ్ పేజీ lync15తో లింక్ను సృష్టిస్తుంది.
కాబట్టి, ప్రయాణం యొక్క మొదటి భాగం పూర్తయింది. లింక్ కాల్ని ఎలా అడ్డుకోవాలో మాకు తెలుసు, ఆపై దానిని ఎలాగైనా ప్రాసెస్ చేసి, పిడ్జిన్ లోపల పాస్ చేయాలి. “ఒక కాన్ఫరెన్స్లో చేరండి” మెనులో లింక్ ద్వారా డేటాను నమోదు చేసేటప్పుడు అది అంతర్గతంగా ఎలా పని చేస్తుందో అర్థం చేసుకోవడానికి, నేను సైప్ ప్రాజెక్ట్ యొక్క Git రిపోజిటరీని క్లోన్ చేసాను మరియు మళ్లీ కోడ్లోకి ప్రవేశించడానికి సిద్ధంగా ఉన్నాను. అయితే, అదృష్టవశాత్తూ, నేను కేటలాగ్లోని స్క్రిప్ట్ల ద్వారా ఆకర్షితుడయ్యాను సహకారం/dbus/:
- sipe-join-conference-with-uri.pl
- sipe-join-conference-with-organizer-and-id.pl
- sipe-call-phone-number.pl
- SipeHelper.pm
dbus (డెస్క్టాప్ బస్) ద్వారా పరస్పర చర్య కోసం Sipe ప్లగ్ఇన్ అందుబాటులో ఉందని మరియు స్క్రిప్ట్ల లోపల నిర్వాహకుడి పేరు మరియు conf-id ద్వారా లింక్ ద్వారా కాన్ఫరెన్స్లో చేరిన ఉదాహరణలు లేదా మీరు సిప్ ద్వారా కాల్ని ప్రారంభించవచ్చని తేలింది. . సరిగ్గా ఇదే మేము తప్పిపోయాము.
దశ 2. ఆటోజాయిన్ హ్యాండ్లర్ని అమలు చేయడం
పెర్ల్లో రెడీమేడ్ ఉదాహరణలు ఉన్నందున, నేను ఉపయోగించాలని నిర్ణయించుకున్నాను sipe-join-conference-with-uri.pl మరియు మీకు సరిపోయేలా కొద్దిగా సవరించండి. నేను పెర్ల్లో వ్రాయగలను, కాబట్టి ఇది ఎటువంటి ప్రత్యేక ఇబ్బందులను కలిగించలేదు.
స్క్రిప్ట్ని విడిగా పరీక్షించిన తర్వాత, నేను దాని కాల్ని ఫైల్లోకి వ్రాసాను lync.desktop. మరియు అది ఒక విజయం! కాన్ఫరెన్స్ జాయిన్ పేజీలోకి ప్రవేశించినప్పుడు మరియు xdg-openని అమలు చేయడానికి అనుమతించినప్పుడు, Pidgin నుండి కాన్ఫరెన్స్ పాప్అప్ విండో స్వయంచాలకంగా తెరవబడుతుంది. నేను ఎలా ఆనందించాను.
విజయంతో ప్రోత్సాహంతో, నేను నా ప్రధాన బ్రౌజర్ మొజిల్లా ఫైర్ఫాక్స్ కోసం కూడా అదే చేయాలని నిర్ణయించుకున్నాను. మీరు ఫాక్స్ ద్వారా లాగిన్ అయినప్పుడు, అధికారం కోసం ఒక పేజీ తెరవబడుతుంది మరియు చాలా దిగువన ఒక బటన్ ఉంటుంది ఆఫీస్ కమ్యూనికేటర్ ఉపయోగించి చేరండి. ఆమె నా దృష్టిని ఆకర్షించింది. మీరు బ్రౌజర్లో దానిపై క్లిక్ చేసినప్పుడు, అది చిరునామాకు వెళుతుంది:
conf:sip:{user};gruu;opaque=app:conf:focus:id:{conf-id}%3Frequired-media=audio
దానికి అతను దానిని ఎలా తెరవాలో తనకు తెలియదని మరియు బహుశా, అటువంటి ప్రోటోకాల్ కోసం నా దగ్గర అనుబంధిత అప్లికేషన్ లేదని దయతో నాకు చెప్పాడు. బాగా, మేము ఇప్పటికే దీని ద్వారా వచ్చాము.
నేను నా స్క్రిప్ట్ అప్లికేషన్ని కూడా uri స్కీమ్ కోసం త్వరగా నమోదు చేస్తాను సమా మరియు... ఏమీ జరగదు. నా లింక్లను నిర్వహించే అప్లికేషన్ ఏదీ లేదని బ్రౌజర్ ఫిర్యాదు చేస్తూనే ఉంది. ఈ సందర్భంలో, పారామితులతో కన్సోల్ నుండి xdg-openకి కాల్ చేయడం ఖచ్చితంగా పని చేస్తుంది.
“ఫైర్ఫాక్స్లో అనుకూల ప్రోటోకాల్ హ్యాండ్లర్ని సెట్ చేయండి” - నేను ఈ ప్రశ్నతో ఆన్లైన్కి వెళ్లాను. స్టాక్ఓవర్ఫ్లో (మరియు అది లేకుండా మనం ఎక్కడ ఉంటాము)పై అనేక చర్చల ద్వారా వెళ్ళిన తర్వాత, సమాధానం కనుగొనబడినట్లు అనిపిస్తుంది. మీరు ప్రత్యేక పరామితిని సృష్టించాలి about: config (వాస్తవానికి foo స్థానంలో conf తో):
network.protocol-handler.expose.foo = false
మేము దానిని సృష్టించాము, లింక్ని తెరవండి మరియు... అలాంటి అదృష్టం లేదు. బ్రౌజర్, ఏమీ జరగనట్లు, మా అప్లికేషన్ తెలియదు అని చెప్పింది.
నేను మొజిల్లా నుండి ప్రోటోకాల్ను నమోదు చేయడంపై అధికారిక డాక్యుమెంటేషన్ను చదువుతున్నాను, గ్నోమ్ డెస్క్టాప్లోనే అసోసియేషన్లను నమోదు చేసుకునే ఎంపిక ఉంది (fooని confతో భర్తీ చేయడం, అయితే):
gconftool-2 -s /desktop/gnome/url-handlers/foo/command '/path/to/app %s' --type String
gconftool-2 -s /desktop/gnome/url-handlers/foo/enabled --type Boolean true
నేను నమోదు చేసుకున్నాను, బ్రౌజర్ని తెరవండి... మరియు మళ్లీ గడ్డం.
ఇక్కడ డాక్యుమెంటేషన్ నుండి ఒక లైన్ నా దృష్టిని ఆకర్షించింది:
తదుపరిసారి మీరు ప్రోటోకాల్-రకం foo లింక్ను క్లిక్ చేస్తే, దాన్ని ఏ అప్లికేషన్తో తెరవాలో మిమ్మల్ని అడుగుతారు.
- సెమియోన్ సెమెనిచ్
- ఆహ్
మేము లింక్పై క్లిక్ చేయము, కానీ వెబ్ పేజీ కేవలం జావాస్క్రిప్ట్ ద్వారా window.locationని మారుస్తుంది. నేను conf ప్రోటోకాల్కి లింక్తో ఒక సాధారణ html ఫైల్ను వ్రాస్తాను, దానిని బ్రౌజర్లో తెరవండి, లింక్పై క్లిక్ చేయండి - యోస్! మనం ఏ అప్లికేషన్లో మా లింక్ని తెరవాలి అని అడుగుతున్న విండో తెరుచుకుంటుంది మరియు అక్కడ మన లింక్ అప్లికేషన్ ఇప్పటికే జాబితాలో ఉంది - మేము దీన్ని అన్ని విధాలుగా నిజాయితీగా నమోదు చేసాము. అక్కడ విండోలో “ఎంపికను గుర్తుంచుకోండి మరియు ఎల్లప్పుడూ మా అప్లికేషన్లో లింక్లను తెరవండి” అనే చెక్బాక్స్ ఉంది, దాన్ని గుర్తించండి, సరే క్లిక్ చేయండి. మరియు ఇది రెండవ విజయం - కాన్ఫరెన్స్ విండో తెరుచుకుంటుంది. అదే సమయంలో, సమావేశాలను తెరవడం అనేది మీరు లింక్పై క్లిక్ చేసినప్పుడు మాత్రమే కాకుండా, మేము సమావేశానికి అవసరమైన చేరే పేజీ నుండి మారినప్పుడు కూడా పని చేస్తుంది.
అప్పుడు నేను తనిఖీ చేసాను, పారామితులను తొలగిస్తున్నాను network.protocol-handler.expose.conf ఫాక్స్లోని ప్రోటోకాల్ ఆపరేషన్ను ఏ విధంగానూ ప్రభావితం చేయలేదు. లింక్లు పని చేస్తూనే ఉన్నాయి.
తీర్మానం
నేను నా పని మొత్తాన్ని GitHub రిపోజిటరీకి అప్లోడ్ చేసాను; అన్ని వనరులకు లింక్లు వ్యాసం చివరిలో ఉంటాయి.
నా పనిని ఉపయోగించాలనుకునే వారి నుండి అభిప్రాయాన్ని స్వీకరించడానికి నేను ఆసక్తిని కలిగి ఉంటాను. నేను నా లైనక్స్ మింట్ సిస్టమ్ కోసం మాత్రమే అన్ని డెవలప్మెంట్లను చేశానని నేను వెంటనే గమనించాలి, కాబట్టి కొన్ని ఇతర పంపిణీలు లేదా డెస్క్టాప్లు ఆ వెర్షన్లో పని చేయకపోవచ్చు. లేదా బదులుగా, నేను దీని గురించి దాదాపుగా ఖచ్చితంగా ఉన్నాను, ఎందుకంటే నేను xdg-openలో నా DEకి మాత్రమే సంబంధించిన 1 ఫంక్షన్ను మాత్రమే ప్యాచ్ చేసాను. మీరు ఇతర సిస్టమ్లు లేదా డెస్క్టాప్లకు మద్దతును జోడించాలనుకుంటే, Githubలో నాకు పుల్ అభ్యర్థనలను వ్రాయండి.
మొత్తం ప్రాజెక్ట్ పూర్తి కావడానికి 1 సాయంత్రం పట్టింది.
సూచనలు:
మూలం: www.habr.com