ప్రధాన అంశాలు లేదా ఈ కథనం దేనికి సంబంధించినది
కథనం యొక్క అంశం దృశ్య PLC ప్రోగ్రామింగ్ షియోటినీ ఇక్కడ వివరించిన స్మార్ట్ హోమ్ కోసం:
చాలా క్లుప్తంగా వంటి భావనలు నాట్లు, связи, ఈవెంట్స్, అలాగే విజువల్ ప్రోగ్రామ్ను లోడ్ చేయడం మరియు అమలు చేయడం యొక్క లక్షణాలు ESP8266, ఇది PLC యొక్క ఆధారం షియోటినీ.
పరిచయం లేదా కొన్ని సంస్థాగత ప్రశ్నలు
నా అభివృద్ధి గురించి మునుపటి కథనంలో, నేను కంట్రోలర్ సామర్థ్యాల గురించి క్లుప్త వివరణ ఇచ్చాను షియోటినీ.
విచిత్రమేమిటంటే, ప్రజలు చాలా బలమైన ఆసక్తిని కనబరిచారు మరియు నన్ను చాలా ప్రశ్నలు అడిగారు. కొంతమంది స్నేహితులు వెంటనే నా నుండి కంట్రోలర్ను కొనుగోలు చేయడానికి కూడా ముందుకొచ్చారు. లేదు, నేను కొంచెం డబ్బు సంపాదించడానికి వ్యతిరేకం కాదు, కానీ సాఫ్ట్వేర్ పరంగా ఇప్పటికీ చాలా క్రూరంగా ఉన్న దానిని విక్రయించడానికి నా మనస్సాక్షి నన్ను అనుమతించదు.
అందువల్ల, నేను GitHubలో ఫర్మ్వేర్ బైనరీలు మరియు పరికర రేఖాచిత్రాన్ని పోస్ట్ చేసాను:
ఇప్పుడు ప్రతి ఒక్కరూ ESP-07ని ఫ్లాష్ చేయవచ్చు మరియు ఫర్మ్వేర్తో ప్లే చేసుకోవచ్చు. ఎవరైనా నిజంగా ఫోటోలో ఉన్న అదే బోర్డ్ను కోరుకుంటే, నా దగ్గర వాటిలో చాలా ఉన్నాయి. ఇమెయిల్ ద్వారా వ్రాయండి [ఇమెయిల్ రక్షించబడింది]. కానీ, మరచిపోలేని ఓగుర్ట్సోవ్ ఇలా అంటాడు: "నేను దేనికీ బాధ్యత వహించను!"
కాబట్టి, పాయింట్కి వెళ్దాం: ఏమిటి "నోడ్"(నోడ్) మరియు "событие"? కార్యక్రమం ఎలా అమలు చేయబడుతుంది?
ఎప్పటిలాగే, క్రమంలో ప్రారంభిద్దాం: ప్రోగ్రామ్ను డౌన్లోడ్ చేయడం ద్వారా.
ప్రోగ్రామ్ ఎలా లోడ్ చేయబడింది
మనం బటన్ను నొక్కితే ఏమి జరుగుతుందో దానితో ప్రారంభిద్దాం <span style="font-family: Mandali; "> అప్లోడ్ </span> ఎడిటర్లో ఎల్డ్రా మరియు మా సర్క్యూట్-ప్రోగ్రామ్, అందమైన చతురస్రాలను కలిగి ఉంటుంది, పరికరంలోకి ఎగురుతుంది.
ముందుగా, మనం గీసిన రేఖాచిత్రం ఆధారంగా, టెక్స్ట్ రూపంలో దాని వివరణ నిర్మించబడింది.
రెండవది, ఇది అన్ని నోడ్ ఇన్పుట్లు అవుట్పుట్లకు కనెక్ట్ చేయబడిందో లేదో తనిఖీ చేస్తుంది. "ఉరి" ప్రవేశాలు ఉండకూడదు. అటువంటి ఇన్పుట్ కనుగొనబడితే, సర్క్యూట్ ShIoTinyలోకి లోడ్ చేయబడదు మరియు ఎడిటర్ సంబంధిత హెచ్చరికను ప్రదర్శిస్తుంది.
ప్రతిదీ సరిగ్గా జరిగితే, ఎడిటర్ ఒక సమయంలో సర్క్యూట్ ఒక నోడ్ యొక్క టెక్స్ట్ వివరణను ShIoTinyకి పంపుతుంది. వాస్తవానికి, ShIoTiny నుండి ఇప్పటికే ఉన్న సర్క్యూట్ మొదట తీసివేయబడుతుంది. ఫలితంగా వచన వివరణ FLASH మెమరీలో నిల్వ చేయబడుతుంది.
మార్గం ద్వారా, మీరు పరికరం నుండి ఒక సర్క్యూట్ను తీసివేయాలనుకుంటే, దానిలో ఖాళీ సర్క్యూట్ను లోడ్ చేయండి (ఒకే నోడ్ మూలకాన్ని కలిగి ఉండదు).
ShIoTiny PLCలో మొత్తం సర్క్యూట్ ప్రోగ్రామ్ లోడ్ అయిన తర్వాత, అది "ఎగ్జిక్యూట్" చేయడం ప్రారంభమవుతుంది. దాని అర్థం ఏమిటి?
పవర్ ఆన్ చేయబడినప్పుడు మరియు ఎడిటర్ నుండి సర్క్యూట్ను స్వీకరించినప్పుడు ఫ్లాష్ మెమరీ నుండి సర్క్యూట్ను లోడ్ చేసే ప్రక్రియలు ఒకేలా ఉంటాయని గమనించండి.
మొదట, నోడ్ వస్తువులు వాటి వివరణ ఆధారంగా సృష్టించబడతాయి.
అప్పుడు నోడ్స్ మధ్య కనెక్షన్లు చేయబడతాయి. అంటే, ఇన్పుట్లకు అవుట్పుట్ల లింక్లు మరియు అవుట్పుట్లకు ఇన్పుట్లు ఉత్పత్తి చేయబడతాయి.
మరియు ఈ అన్ని తరువాత మాత్రమే ప్రధాన ప్రోగ్రామ్ అమలు చక్రం మొదలవుతుంది.
నేను చాలా కాలం పాటు వ్రాసాను, కానీ మొత్తం ప్రక్రియ - ఫ్లాష్ మెమరీ నుండి సర్క్యూట్ను “లోడ్ చేయడం” నుండి ప్రధాన చక్రం ప్రారంభించడం వరకు - 60-80 నోడ్ల సర్క్యూట్కు సెకనులో కొంత భాగాన్ని తీసుకుంటుంది.
ప్రధాన లూప్ ఎలా పని చేస్తుంది? చాలా సింపుల్. మొదట అతను ఆవిర్భావం కోసం వేచి ఉంటాడు ఈవెంట్స్ కొన్ని నోడ్ వద్ద, ఆ ఈవెంట్ను ప్రాసెస్ చేస్తుంది. అందువలన అనంతంగా. సరే, లేదా వారు ShioTinyకి కొత్త పథకాన్ని అప్లోడ్ చేసే వరకు.
వంటి విషయాలను ఇప్పటికే చాలాసార్లు ప్రస్తావించాను ఈవెంట్స్, నాట్లు и связи. అయితే సాఫ్ట్వేర్ కోణం నుండి ఇది ఏమిటి? మేము ఈ రోజు దీని గురించి మాట్లాడుతాము.
నోడ్లు, కనెక్షన్లు మరియు ఈవెంట్లు
కోసం సర్క్యూట్ ప్రోగ్రామ్ల ఉదాహరణలను చూడండి షియోటినీరేఖాచిత్రం కేవలం రెండు ఎంటిటీలను కలిగి ఉందని అర్థం చేసుకోవడానికి - నోడ్స్ (లేదా మూలకాలు) మరియు వాటి మధ్య కనెక్షన్లు.
నోడ్, కానీ అవును లేదా సర్క్యూట్ మూలకం కొందరికి వర్చువల్ ప్రాతినిధ్యం చర్యలు డేటా మీద. ఇది అంకగణిత ఆపరేషన్ కావచ్చు, లాజికల్ ఆపరేషన్ కావచ్చు లేదా మన ఆలోచనకు వచ్చే ఏదైనా ఆపరేషన్ కావచ్చు. ప్రధాన విషయం ఏమిటంటే నోడ్లో ప్రవేశం మరియు నిష్క్రమణ ఉంది.
ఎంట్రీ - ఇది నోడ్ డేటాను స్వీకరించే ప్రదేశం. ఇన్పుట్ ఇమేజ్లు ఎల్లప్పుడూ నోడ్కు ఎడమవైపు ఉండే పాయింట్లు.
నిష్క్రమణ - ఇది నోడ్ యొక్క ఆపరేషన్ ఫలితాన్ని తిరిగి పొందే ప్రదేశం. అవుట్పుట్ ఇమేజ్లు ఎల్లప్పుడూ నోడ్కు కుడి వైపున ఉండే పాయింట్లు.
కొన్ని నోడ్లకు ఇన్పుట్లు లేవు. ఇటువంటి నోడ్లు అంతర్గతంగా ఫలితాన్ని ఉత్పత్తి చేస్తాయి. ఉదాహరణకు, స్థిరమైన నోడ్ లేదా సెన్సార్ నోడ్: ఫలితాన్ని నివేదించడానికి వాటికి ఇతర నోడ్ల నుండి డేటా అవసరం లేదు.
ఇతర నోడ్లు, దీనికి విరుద్ధంగా, అవుట్పుట్లు లేవు. ఇవి ప్రదర్శించే నోడ్లు, ఉదాహరణకు, యాక్యుయేటర్లు (రిలేలు లేదా ఇలాంటివి). వారు డేటాను అంగీకరిస్తారు కానీ ఇతర నోడ్లకు అందుబాటులో ఉండే గణన ఫలితాన్ని రూపొందించరు.
అదనంగా, ఒక ప్రత్యేకమైన వ్యాఖ్య నోడ్ కూడా ఉంది. ఇది ఏమీ చేయదు, ఇన్పుట్లు లేదా అవుట్పుట్లు లేవు. దీని ఉద్దేశ్యం రేఖాచిత్రంపై వివరణ.
ఏం జరిగింది "событие"? ఈవెంట్ ఏదైనా నోడ్లో కొత్త డేటా ఆవిర్భావం. ఉదాహరణకు, ఈవెంట్లు: ఇన్పుట్ స్థితిలో మార్పు (నోడ్ ఇన్పుట్), మరొక పరికరం నుండి డేటాను స్వీకరించడం (నోడ్స్ MQTT и UDP), నిర్దేశిత వ్యవధి గడువు (నోడ్స్ టైమర్ и ఆలస్యం) మరియు అందువలన న.
ఈవెంట్లు దేనికి? అవును, ఏ నోడ్లో కొత్త డేటా ఉద్భవించిందో మరియు కొత్త డేటా రసీదుకి సంబంధించి ఏ నోడ్ల స్థితులను మార్చాల్సిన అవసరం ఉందో గుర్తించడానికి. ఈవెంట్, దాని స్థితిని తనిఖీ చేసి మార్చాల్సిన అన్ని నోడ్లను దాటవేసే వరకు నోడ్ల గొలుసుతో పాటు “పాస్” అవుతుంది.
అన్ని నోడ్లను రెండు వర్గాలుగా విభజించవచ్చు.
ఈవెంట్లను రూపొందించగల నోడ్లను పిలుద్దాం "క్రియాశీల నోడ్స్".
మేము ఈవెంట్లను రూపొందించలేని నోడ్లను పిలుస్తాము "నిష్క్రియ నోడ్స్".
ఒక నోడ్ ఒక ఈవెంట్ను రూపొందించినప్పుడు (అంటే, దాని అవుట్పుట్ వద్ద కొత్త డేటా కనిపిస్తుంది), అప్పుడు సాధారణ సందర్భంలో ఈవెంట్ జనరేటర్ నోడ్ అవుట్పుట్కి కనెక్ట్ చేయబడిన మొత్తం గొలుసు నోడ్ల స్థితి మారుతుంది.
దీన్ని స్పష్టం చేయడానికి, చిత్రంలో ఉదాహరణను పరిగణించండి.
ఇక్కడ క్రియాశీల నోడ్లు ఇన్పుట్1, ఇన్పుట్2 మరియు ఇన్పుట్3. మిగిలిన నోడ్లు నిష్క్రియంగా ఉంటాయి. ఒకటి లేదా మరొక ఇన్పుట్ మూసివేయబడినప్పుడు ఏమి జరుగుతుందో పరిశీలిద్దాం. సౌలభ్యం కోసం, ఫలితాలు పట్టికలో సంగ్రహించబడ్డాయి.
మీరు చూడగలిగినట్లుగా, ఈవెంట్ సంభవించినప్పుడు, ఈవెంట్ యొక్క మూల నోడ్ నుండి ముగింపు నోడ్ వరకు ఒక గొలుసు నిర్మించబడుతుంది. గొలుసులోకి రాని ఆ నోడ్ల స్థితి మారదు.
ఒక చట్టబద్ధమైన ప్రశ్న తలెత్తుతుంది: రెండు లేదా అనేక సంఘటనలు ఏకకాలంలో సంభవించినట్లయితే ఏమి జరుగుతుంది?
గ్లెబ్ అన్ఫిలోవ్ యొక్క పనిని ఇష్టపడే వ్యక్తిగా, నేను అతని "ఎస్కేప్ ఫ్రమ్ సర్ప్రైజ్" పుస్తకానికి ఆసక్తిగా ప్రశ్నించేవారిని పంపడానికి శోదించబడ్డాను. ఇది "చిన్న పిల్లల కోసం సాపేక్షత సిద్ధాంతం", ఇది "ఏకకాలంలో" అంటే ఏమిటో మరియు దానితో ఎలా జీవించాలో బాగా వివరిస్తుంది.
కానీ ఆచరణాత్మకంగా ప్రతిదీ చాలా సులభం: రెండు లేదా అనేక సంఘటనలు సంభవించినప్పుడు, ప్రతి ఈవెంట్ మూలం నుండి అన్ని గొలుసులు వరుసగా నిర్మించబడతాయి మరియు క్రమంగా ప్రాసెస్ చేయబడతాయి మరియు అద్భుతాలు జరగవు.
ఆసక్తిగల పాఠకుడి నుండి తదుపరి పూర్తిగా చట్టబద్ధమైన ప్రశ్న ఏమిటంటే, నోడ్లను రింగ్లోకి కనెక్ట్ చేస్తే ఏమి జరుగుతుంది? లేదా, మీ యొక్క ఈ తెలివైన వ్యక్తులలో వారు చెప్పినట్లు, అభిప్రాయాన్ని పరిచయం చేయండి. అంటే, నోడ్లలో ఒకదాని యొక్క అవుట్పుట్ను మునుపటి నోడ్ యొక్క ఇన్పుట్కి కనెక్ట్ చేయండి, తద్వారా ఈ నోడ్ యొక్క అవుట్పుట్ స్థితి దాని ఇన్పుట్ స్థితిని ప్రభావితం చేస్తుంది. నోడ్ యొక్క అవుట్పుట్ను దాని ఇన్పుట్కు నేరుగా కనెక్ట్ చేయడానికి ఎడిటర్ మిమ్మల్ని అనుమతించదు. ఎల్డ్రా. కానీ పరోక్షంగా, క్రింద ఉన్న చిత్రంలో వలె, ఇది చేయవచ్చు.
కాబట్టి ఈ సందర్భంలో ఏమి జరుగుతుంది? సమాధానం చాలా "ఖచ్చితంగా" ఉంటుంది: ఏ నోడ్లను బట్టి. చిత్రంలో ఉదాహరణ చూద్దాం.
ఇన్పుట్1 యొక్క ఇన్పుట్ పరిచయాలు తెరిచినప్పుడు, నోడ్ A యొక్క ఎగువ ఇన్పుట్ 0. నోడ్ A యొక్క అవుట్పుట్ కూడా 0. నోడ్ B యొక్క అవుట్పుట్ 1. మరియు, చివరకు, నోడ్ A యొక్క దిగువ ఇన్పుట్ 1. ప్రతిదీ స్పష్టమైన. మరియు స్పష్టంగా లేని వారి కోసం, "AND" మరియు "NOT" నోడ్లు ఎలా పని చేస్తాయో వివరణ కోసం క్రింద చూడండి.
ఇప్పుడు మేము ఇన్పుట్ 1 ఇన్పుట్ యొక్క పరిచయాలను మూసివేస్తాము, అనగా, మేము నోడ్ A యొక్క ఎగువ ఇన్పుట్కు ఒకదాన్ని వర్తింపజేస్తాము. ఎలక్ట్రానిక్స్ గురించి తెలిసిన వారికి తెలుసు, వాస్తవానికి మేము లాజిక్ ఎలిమెంట్లను ఉపయోగించి క్లాసిక్ జనరేటర్ సర్క్యూట్ను పొందుతాము. మరియు సిద్ధాంతంలో, అటువంటి సర్క్యూట్ A మరియు B మూలకాల అవుట్పుట్ వద్ద 1-0-1-0-1-0… క్రమాన్ని అనంతంగా ఉత్పత్తి చేయాలి. మరియు 0-1-0-1-0-1-…. అన్నింటికంటే, ఈవెంట్ నిరంతరం A మరియు B నోడ్ల స్థితిని మార్చాలి, సర్కిల్ 2-3-2-3-...!
కానీ వాస్తవంలో అలా జరగడం లేదు. సర్క్యూట్ యాదృచ్ఛిక స్థితిలోకి పడిపోతుంది - లేదా రిలే ఆన్ లేదా ఆఫ్లో ఉంటుంది, లేదా వరుసగా అనేకసార్లు కొద్దిగా buzz ఆన్ మరియు ఆఫ్ కావచ్చు. ఇదంతా అంగారక గ్రహం యొక్క దక్షిణ ధ్రువం వద్ద వాతావరణంపై ఆధారపడి ఉంటుంది. మరియు ఇది ఎందుకు జరుగుతుంది.
నోడ్ ఇన్పుట్1 నుండి ఒక ఈవెంట్ నోడ్ A యొక్క స్థితిని, తర్వాత నోడ్ Bని మరియు ఒక సర్కిల్లో అనేకసార్లు మారుస్తుంది. కార్యక్రమం ఈవెంట్ యొక్క "లూపింగ్" ను గుర్తించి, ఈ కార్నివాల్ను బలవంతంగా నిలిపివేస్తుంది. దీని తరువాత, కొత్త ఈవెంట్ సంభవించే వరకు A మరియు B నోడ్ల స్థితిలో మార్పులు నిరోధించబడతాయి. ప్రోగ్రామ్ "సర్కిల్లలో తిరగడం ఆపు!" అని నిర్ణయించే క్షణం. - సాధారణంగా, ఇది అనేక అంశాలపై ఆధారపడి ఉంటుంది మరియు యాదృచ్ఛికంగా పరిగణించబడుతుంది.
నాట్లను రింగ్లోకి కనెక్ట్ చేసేటప్పుడు జాగ్రత్తగా ఉండండి - ప్రభావాలు ఎల్లప్పుడూ స్పష్టంగా ఉండవు! మీరు ఏమి మరియు ఎందుకు చేస్తున్నారో మంచి ఆలోచన కలిగి ఉండండి!
మనకు అందుబాటులో ఉన్న నోడ్స్లో జనరేటర్ను నిర్మించడం ఇప్పటికీ సాధ్యమేనా? మీరు చెయ్యవచ్చు అవును! కానీ దీనికి ఈవెంట్లను స్వయంగా రూపొందించగల నోడ్ అవసరం. మరియు అటువంటి నోడ్ ఉంది - ఇది “ఆలస్యం లైన్”. దిగువ చిత్రంలో 6 సెకన్ల వ్యవధి కలిగిన జనరేటర్ ఎలా పనిచేస్తుందో చూద్దాం.
జనరేటర్ యొక్క ముఖ్య అంశం నోడ్ A - ఆలస్యం లైన్. మీరు ఆలస్యం లైన్ యొక్క ఇన్పుట్ స్థితిని 0 నుండి 1కి మార్చినట్లయితే, 1 వెంటనే అవుట్పుట్ వద్ద కనిపించదు, కానీ నిర్దిష్ట సమయం తర్వాత మాత్రమే. మా విషయంలో ఇది 3 సెకన్లు. అదే విధంగా, మీరు ఆలస్యం లైన్ యొక్క ఇన్పుట్ స్థితిని 1 నుండి 0కి మార్చినట్లయితే, అవుట్పుట్ వద్ద 0 అదే 3 సెకన్ల తర్వాత కనిపిస్తుంది. ఆలస్యం సమయం సెకనులో పదవ వంతులో సెట్ చేయబడింది. అంటే, విలువ 30 అంటే 3 సెకన్లు.
ఆలస్య రేఖ యొక్క ప్రత్యేక లక్షణం ఏమిటంటే, ఆలస్యం సమయం ముగిసిన తర్వాత ఇది ఈవెంట్ను రూపొందిస్తుంది.
ప్రారంభంలో ఆలస్య రేఖ యొక్క అవుట్పుట్ 0 అని అనుకుందాం. నోడ్ B - ఇన్వర్టర్ను దాటిన తర్వాత ఈ 0 1గా మారుతుంది మరియు ఆలస్యం లైన్ యొక్క ఇన్పుట్కి వెళుతుంది. వెంటనే ఏమీ జరగదు. ఆలస్యం లైన్ అవుట్పుట్ వద్ద, అది 0గా ఉంటుంది, అయితే ఆలస్యం సమయం యొక్క కౌంట్డౌన్ ప్రారంభమవుతుంది. 3 సెకన్లు పాస్. ఆపై ఆలస్యం లైన్ ఒక ఈవెంట్ను సృష్టిస్తుంది. దాని అవుట్పుట్ వద్ద ఇది కనిపిస్తుంది 1. ఈ యూనిట్, నోడ్ B గుండా వెళ్ళిన తర్వాత - ఇన్వర్టర్ - 0 లోకి మారుతుంది మరియు ఆలస్యం లైన్ యొక్క ఇన్పుట్కు వెళుతుంది. మరో 3 సెకన్లు గడిచిపోతాయి... మరియు ప్రక్రియ పునరావృతమవుతుంది. అంటే, ప్రతి 3 సెకన్లకు ఆలస్యం లైన్ అవుట్పుట్ స్థితి 0 నుండి 1కి ఆపై 1 నుండి 0కి మారుతుంది. రిలే క్లిక్లు. జనరేటర్ పని చేస్తోంది. పల్స్ వ్యవధి 6 సెకన్లు (అవుట్పుట్ సున్నా వద్ద 3 సెకన్లు మరియు అవుట్పుట్ వద్ద 3 సెకన్లు).
కానీ, నిజమైన సర్క్యూట్లలో, సాధారణంగా ఈ ఉదాహరణను ఉపయోగించాల్సిన అవసరం లేదు. ప్రత్యేక టైమర్ నోడ్లు ఉన్నాయి, ఇవి సంపూర్ణంగా మరియు బయటి సహాయం లేకుండా నిర్దిష్ట వ్యవధిలో పప్పుల క్రమాన్ని ఉత్పత్తి చేస్తాయి. ఈ పప్పులలో "సున్నా" మరియు "ఒకటి" వ్యవధి సగం కాలానికి సమానం.
ఆవర్తన చర్యలను సెట్ చేయడానికి, టైమర్ నోడ్లను ఉపయోగించండి.
"సున్నా" మరియు "ఒకటి" యొక్క వ్యవధి సమానంగా ఉన్న అటువంటి డిజిటల్ సిగ్నల్లను "మీండర్" అని పిలుస్తారని నేను గమనించాను.
నోడ్ల మధ్య ఈవెంట్లు ఎలా ప్రచారం చేయబడతాయి మరియు ఏమి చేయకూడదు అనే దాని గురించి నేను ప్రశ్నను కొంచెం స్పష్టం చేశానని ఆశిస్తున్నాను.
ముగింపు మరియు సూచనలు
వ్యాసం చిన్నదిగా మారింది, కానీ ఈ కథనం నోడ్లు మరియు ఈవెంట్లకు సంబంధించి తలెత్తిన ప్రశ్నలకు సమాధానం.
ఫర్మ్వేర్ అభివృద్ధి చెందుతున్నప్పుడు మరియు కొత్త ఉదాహరణలు కనిపించినప్పుడు, నేను ఎలా ప్రోగ్రామ్ చేయాలనే దాని గురించి వ్రాస్తాను షియోటినీ చిన్న కథనాలు ఉన్నంత వరకు ప్రజలకు ఆసక్తికరంగా ఉంటాయి.
మునుపటిలాగా, రేఖాచిత్రం, ఫర్మ్వేర్, ఉదాహరణలు, భాగాల వివరణ మరియు ప్రతిదీ
ప్రశ్నలు, సూచనలు, విమర్శలు - ఇక్కడకు వెళ్లండి: [ఇమెయిల్ రక్షించబడింది]
మూలం: www.habr.com