ఎంపిక చేసిన పని

Insomniac: Mac ను లిడ్ మూసి మెలకువగా ఉంచండి, వేడెక్కించకుండా

పాత్ర
నుండి 0→1 నిర్మించబడింది
స్టాక్
Swift · SwiftUI · macOS · IOKit
లింకులు

సమస్య

నా Mac లిడ్ మూసి ఉన్నా నడుస్తూ ఉండాలని నేను కోరుకున్నాను. మసకగా కాదు: నిజంగా పని చేస్తూ, రాత్రంతా ఒక AI ఏజెంట్, ఒక Xcode ఆర్కైవ్, ఒక పొడవైన సింక్, లిడ్ మూసి, ఏ ఎక్స్‌టర్నల్ మానిటర్ లేకుండా. macOS దీన్ని క్లామ్‌షెల్ స్లీప్ అంటుంది, మరియు మీ పని మధ్యలో ఉందని అది పట్టించుకోదు.

చిక్కు మెకానిజంలో ఉంది. పాపులర్ కీప్-అవేక్ టూల్స్ IOKit పవర్ అసెర్షన్‌లను వాడతాయి, మరియు అవి క్లామ్‌షెల్ స్లీప్‌ను మీ దగ్గర ఒక ఎక్స్‌టర్నల్ డిస్‌ప్లే, పవర్, మరియు ఒక కీబోర్డ్ జతచేసి ఉంటే తప్ప ఆపవు, సరిగ్గా నేను తప్పించుకోవాలనుకున్న ఆ సెటప్. ఏదీ జతచేయకుండా పని చేసే ఏకైక లివర్ ఒక ప్రివిలేజ్డ్ కమాండ్: pmset disablesleep. కాబట్టి మొత్తం ప్రొడక్ట్ నిజంగా ఒకే విషయం, ఒక ప్రమాదకరమైన సిస్టమ్ సెట్టింగ్ చుట్టూ ఒక సేఫ్ ర్యాపర్, మరియు మిగతాదంతా ఆ ఒక్క లివర్‌ను సురక్షితంగా మరియు హాయిగా లాగేలా చేయడానికి ఉంది.

నిర్ణయాలు

సేఫ్టీ ఫీచర్, మెలకువగా ఉండటం కాదు. ఒక జెనరిక్ పెయిడ్ కీప్-అవేక్ యాప్ మొదట్లోనే చచ్చింది: Amphetamine మరియు caffeinate దీన్ని ఇప్పటికే ఉచితంగా చేస్తాయి. సర్వ్ చేయని కోణం వేడి. మూసిన లిడ్ గాలి ప్రవాహాన్ని అడ్డుకుంటుంది, మరియు ఏ ప్రస్తుత టూల్ దీని గురించి ఒక్క మాట చెప్పదు. కాబట్టి Insomniac “మెలకువగా ఉండు” కాదు, అది “యంత్రాన్ని వేడెక్కించకుండా మెలకువగా ఉండు”.

macOS నిజాయితీగా ఎక్స్‌పోజ్ చేసేదాన్ని కొలవండి, నకిలీ డిగ్రీలు కాదు. ఆకర్షణీయమైన వెర్షన్ ఒక CPU ఉష్ణోగ్రతను చదివి డిగ్రీలలో ఒక కౌంట్‌డౌన్ చూపిస్తుంది. కానీ Apple Silicon డై ఉష్ణోగ్రత చదవడానికి ఏ సపోర్టెడ్ మార్గం ఎక్స్‌పోజ్ చేయదు; అలా చెప్పే ఏదైనా మోడల్‌ల మధ్య విరిగే ప్రైవేట్ కీలను చదువుతోంది. కాబట్టి నేను ProcessInfo.thermalState (nominal, fair, serious, critical) పై నిర్మించాను, దానికి ఏ అడ్మిన్ అవసరం లేదు మరియు అది ఎప్పటికీ సపోర్టెడ్. మరియు నిజమైన రక్షణ ఒక అప్‌ఫ్రంట్ ప్రిడిక్షన్ అస్సలు కాదు: అది ఒక లైవ్ థర్మల్ కటాఫ్ అది లిడ్ మూసి ఉన్నప్పుడు స్టేట్‌ను గమనిస్తుంది మరియు అది పెరిగితే సెషన్‌ను ఆటో-స్టాప్ చేస్తుంది. ఒక ప్రిడిక్షన్ తప్పు కావచ్చు; ఒక లైవ్ కటాఫ్ గ్రౌండ్ ట్రూత్.

ప్రమాదకరమైన భాగం స్వాపబుల్‌గా ఉండే ఒక ఆర్కిటెక్చర్. pmset ను రూట్‌గా నడపడానికి రెండు మార్గాలు: ప్రతి టోగుల్‌కు పాస్‌వర్డ్ అడిగే ఒక AppleScript ప్రాంప్ట్ (సాధారణం, మొదటి రోజు పని చేస్తుంది) మరియు XPC పై నిశ్శబ్దంగా టోగుల్ చేసే ఒక ప్రివిలేజ్డ్ హెల్పర్ (ప్రొడక్షన్-గ్రేడ్, సైనింగ్ మరియు ఒక పిన్ చేసిన కాంట్రాక్ట్ అవసరం). యాప్‌ను ఏదో ఒకదానికి జత చేయడం బదులు, నేను రెండింటినీ ఒక PowerControlling ప్రోటోకాల్ వెనుక దాచాను. నేను మొదటి రోజు పాస్‌వర్డ్-ప్రాంప్ట్ వెర్షన్ షిప్ చేసి తర్వాత సైలెంట్ హెల్పర్‌ను ఏ కాలర్ మార్పు లేకుండా జోడించాను. హెల్పర్ లాక్డ్ డౌన్: ఒక రూట్ డీమన్‌గా అది ఈ యాప్ ఐడెంటిఫయర్ మరియు Team ID కు పిన్ చేసిన XPC కనెక్షన్‌లను మాత్రమే అంగీకరిస్తుంది.

సేఫ్టీ ఇన్‌వేరియంట్‌లను కోడ్ అమలు చేస్తుంది. ఒక కీప్-అవేక్ యాప్‌లో ఒక వినాశకరమైన వైఫల్యం: పని ముగిశాక స్లీప్‌ను డిసేబుల్‌గా వదిలేయడం. “స్లీప్‌ను ఎప్పుడూ డిసేబుల్‌గా వదలొద్దు” అనేదాన్ని నేను ఒక ఇన్‌వేరియంట్‌గా భావించి ప్రతి ఎగ్జిట్‌ను మూసాను. టోగుల్ ఆఫ్, ఆటో-ఆఫ్, థర్మల్ కటాఫ్, మరియు బ్యాటరీ కటాఫ్ అన్నీ స్లీప్ రిస్టోర్ చేస్తాయి. క్విట్ మరియు లాగౌట్ రిస్టోర్ పూర్తయ్యే వరకు టర్మినేషన్‌ను వాయిదా వేస్తాయి; యాప్ స్లీప్ డిసేబుల్‌గా ఉండగా చావడానికి నిరాకరిస్తుంది. ఒక హార్డ్ క్రాష్‌ను ఇంటర్‌సెప్ట్ చేయలేం, కాబట్టి తర్వాతి లాంచ్‌లో యాప్ ఏ యాక్టివ్ సెషన్ లేకుండా స్లీప్ డిసేబుల్‌గా ఉందని గుర్తించి దాన్ని రీసెట్ చేయడానికి ముందుకొస్తుంది. ఒక “అనిర్దిష్టం” కూడా లేదు: అతి పొడవైన సెషన్ ఒక కఠిన 8-గంటల పరిమితి, ఎందుకంటే “శాశ్వతం” సరిగ్గా ఆ సెట్టింగ్ అది ఒక చచ్చిన, వేడి ల్యాప్‌టాప్‌ను బ్యాగ్‌లో వదిలేస్తుంది.

నిజాయితీ UI, నిజాయితీ ప్రైవసీ. యాప్ కేవలం మెనూ-బార్. అడ్వైజరీ ఒక రిస్క్ లెవెల్ (low, moderate, high) మరియు ఒక సాదా మెసేజ్ చూపిస్తుంది, నేను నిజాయితీగా చదవలేని డిగ్రీలు ఎప్పుడూ కాదు, మరియు వెదర్ నడ్జ్ ఉద్దేశపూర్వకంగా అతి బలహీన ఇన్‌పుట్: ఒక వేడి గది రిస్క్ పెంచవచ్చు, కానీ ఒక చల్లని గది ఒక వేడెక్కుతున్న CPU ను ఎప్పుడూ సేఫ్ చేయలేదు. వెదర్ లొకేషన్ IP జియోలొకేషన్ నుండి వస్తుంది, సిటీ-లెవెల్, కాబట్టి ఏ GPS పర్మిషన్ ప్రాంప్ట్ లేదు; వెదర్ ఆఫ్ చేయండి మరియు యాప్ ఏదీ పంపదు. ఏ టెలిమెట్రీ లేదు, ఏ అనలిటిక్స్ లేదు.

దీంతో జీవించి మాత్రమే నాకు దొరికిన బగ్. V1 Mac ను మెలకువగా ఉంచింది, కానీ స్క్రీన్ లిడ్ మూసి ఉన్నప్పుడు వెలుగుతూనే ఉంది, ఎందుకంటే స్లీప్ డిసేబుల్ చేయడం macOS ను ఇంటర్నల్ డిస్‌ప్లే ఆఫ్ చేయకుండా కూడా ఆపుతుంది. కీబోర్డ్‌కు ఎదురుగా వెలిగే ఒక బ్యాక్‌లైట్ వృథా బ్యాటరీ మరియు వేడి, సరిగ్గా యాప్ రక్షించే ఆ విషయం. నేను ఒక లిడ్ మానిటర్ జోడించాను అది ఓపెన్-టు-క్లోజ్డ్ ఎడ్జ్‌పై ఫైర్ అవుతుంది మరియు డిస్‌ప్లేను ఒక హానికరం కాని యూజర్-లెవెల్ కమాండ్‌తో స్లీప్ చేయిస్తుంది, ప్రివిలేజ్డ్ హెల్పర్ నుండి ఉద్దేశపూర్వకంగా వేరు చేయబడింది. దీని అవసరం లేని విషయానికి లీస్ట్ ప్రివిలేజ్.

ఇప్పుడే షిప్ చేయి, రఫ్ ఎడ్జ్‌ను స్వీకరించు. కోర్ ఫీచర్‌కు App Sandbox ఆఫ్ అవసరం, అది Mac App Store ను బయటపెడుతుంది, కాబట్టి నేను ఒక డైరెక్ట్ డౌన్‌లోడ్ షిప్ చేశాను. మొదట Apple పేపర్‌వర్క్‌పై రోజులు గడపడం బదులు, నేను ఇప్పుడు ఒక అన్-నోటరైజ్డ్ బిల్డ్ షిప్ చేసి ఫలితంగా వచ్చే Gatekeeper హెచ్చరికను ఒక గైడెడ్, ఒక-నిమిషం స్టెప్ చేశాను: ఇన్‌స్టాలర్ ఒక చేతితో గీసిన సెటప్ గైడ్, క్వారంటైన్-క్లియరింగ్ కమాండ్ యాప్ పక్కనే ఒక కాపీ చేయదగిన ఫైల్‌గా ఉంది, మరియు యాప్ ప్రతి లాంచ్‌లో తన క్వారంటైన్ ఫ్లాగ్‌ను తీసేస్తుంది తద్వారా హెచ్చరిక ఎప్పుడూ తిరిగి రాదు. ప్యాకేజింగ్ స్క్రిప్ట్ ఒక సర్టిఫికేట్ ఉన్న వెంటనే ఒక కమాండ్‌తో రీ-సైన్ మరియు నోటరైజ్ చేస్తుంది.

ఫలితం

Insomniac లైవ్ లో ఉంది: ఒక మెనూ-బార్ యాప్ అది Mac ను లిడ్-మూసి మెలకువగా ఉంచుతుంది, ఒక లైవ్ థర్మల్ కటాఫ్, ఒక బ్యాటరీ కటాఫ్, క్రాష్ రికవరీ, మరియు ఒక సైన్ చేసిన హెల్పర్ ద్వారా సైలెంట్ టోగ్లింగ్‌తో. మొత్తం విషయం రెండు నియమాలపై నిలుస్తుంది: నిజాయితీగా ఉండు (నిజమైన మెకానిజం, నకిలీ డిగ్రీల బదులు రిస్క్ లెవెల్‌లు, ఒక బలహీన సిగ్నల్‌ను బలహీనంగా ఉంచు) మరియు రఫ్ ఎడ్జ్‌లను దాచడం బదులు స్వీకరిస్తూ వేగంగా షిప్ చేయి. ఒక కీప్-అవేక్ యాప్ ఒక చిన్న విషయం, కానీ అది హార్డ్‌వేర్‌ను దెబ్బతీయగల ఒక సెట్టింగ్‌ను తాకుతుంది, కాబట్టి డెమోను మరింత మెరిసేలా చేసే ప్రతి షార్ట్‌కట్ ప్రొడక్ట్‌ను తక్కువ నమ్మదగినదిగా చేసేది.