PySkyWiFi: लंबी दूरी की उड़ान में मुफ्त धीमा Wi-Fi बनाना
(robertheaton.com)- PySkyWiFi एक प्रयोग है जिसमें भुगतान से पहले भी उपलब्ध airline mileage account के profile fields को अस्थायी storage की तरह इस्तेमाल कर, लंबी दूरी की उड़ान के दौरान HTTP requests और responses को बेहद धीमी गति से इधर-उधर भेजा गया
- शुरुआती prototype ने account के name field को update और poll करके chat बनाई, फिर इसे इस तरह बढ़ाया गया कि ground daemon
STOCKPRICE: APPLजैसे requests पढ़कर result वापस भेजे - अंतिम architecture विमान के अंदर चलने वाले sky proxy और Internet से जुड़े ground daemon में बंटा है, और local
curlrequest केX-PySkyWiFiheader से target URL भेजता है - transmission में HTTP request को छोटे chunks में तोड़कर
DATA,ACK,ENDsegments और 6 अंकों के sequence number से क्रम मिलाया जाता है - असली airline account पर लगातार automated requests भेजने का तरीका टाला गया, और final test GitHub Gist के जरिए blog homepage को
curlसे call करके कुछ मिनट बाद HTML response पाने तक सीमित रहा
भुगतान से पहले Wi-Fi portal में मिला bypass channel
- विमान का Wi-Fi login page भुगतान मांगता था, लेकिन भुगतान से पहले भी airline mileage account login मुफ्त में allow था
- Profile edit screen के name field को देखकर लगा कि इस value को बाहरी दुनिया से data भेजने-लाने वाले छोटे communication channel की तरह इस्तेमाल किया जा सकता है
- Implementation language के लिए पहले Go सोचा गया था, लेकिन Python इस्तेमाल करने पर tool का नाम PySkyWiFi रखा जा सकता था, इसलिए Python चुना गया
- Source code PySkyWiFi पर public है
Prototype 1: name field से बनी instant messaging
- दो clients ने उसी airline mileage account में login करने के बाद, name field को बारी-बारी update और read करके messages exchange किए
- एक side name को
Hello how are youमें बदलती है, तो दूसरी side उसे read करती है - फिर
Im fine how are youमें बदलने पर पहली side reply देखती है
- एक side name को
- UI में सीधे name बदलना झंझटभरा था, इसलिए इसे command-line tool से automate किया गया
- Tool website में login करके test account के name field को message से update करता है
- हर कुछ seconds में name field को poll करता है, और value बदलने पर उसे दूसरे व्यक्ति के reply के रूप में print करता है
- असली airline mileage account पर आगे automated data न भेजने का फैसला किया गया, और केवल name को करीब 10 बार तेजी से update करके देखा गया कि सब सफल होते हैं या नहीं
- इस result से संकेत मिला कि उस account ने request rate या count पर शायद limit नहीं लगाई थी
- आगे की development GitHub Gists और local files में उसी सिद्धांत को दोहराकर की गई
- क्योंकि airline mileage account की तुलना में repeated development तेज और आसान थी
Prototype 2: ground daemon से बाहरी जानकारी लाना
- अगले चरण में जमीन पर या cloud में Internet-connected computer पर daemon चलाया गया
- Daemon airline mileage account के name field को लगातार poll करता है और विमान से भेजे गए structured requests खोजता है
- उदाहरण:
STOCKPRICE: APPL - उदाहरण:
SCORE: MANUNITED
- उदाहरण:
- नया request मिलने पर daemon उसे parse करता है, संबंधित API से जानकारी लाता है, और airline mileage account के जरिए विमान की तरफ वापस भेजता है
- इस चरण से simple chat से आगे बढ़कर stock prices या sports scores जैसी real-time information lookup संभव हो गई
sky proxy और ground daemon से बना पूरा architecture
- PySkyWiFi एक TCP/IP-जैसा protocol है, जो पूरे HTTP request को airline mileage account में डालता है, और ground computer असली HTTP request चलाकर response को उसी तरह वापस upload करता है
- Components दो हैं
- sky proxy: विमान के अंदर laptop पर चलने वाला proxy
- ground daemon: घर या cloud में Internet-connected computer पर चलने वाला daemon
- इस्तेमाल से पहले ground daemon को पहले चलाया जाता है, फिर विमान में Wi-Fi से connect करके laptop पर sky proxy चलाया जाता है
- User
curlजैसे tool से local proxy को HTTP request भेजता है- उदाहरण:
curl localhost:1234 -H "X-PySkyWiFi: example.com" - असली target URL
X-PySkyWiFicustom header में रखा जाता है
- उदाहरण:
- Ground daemon
X-PySkyWiFiheader को हटाता है और इसे target website तक routing के लिए इस्तेमाल करता है- Request body और अन्य headers वैसे ही forward किए जाते हैं
- पूरी प्रक्रिया के अंत में सामान्य Internet request की तरह HTTP response मिलता है, लेकिन aircraft network की स्थिति के हिसाब से request कई मिनट तक रुकी रह सकती है और speed भी प्रति second कुछ bytes के स्तर की हो सकती है
chunks, ACK, और दूसरे account से HTTP round trip
- sky proxy
curlrequest लेकर पूरे HTTP request को chunks में बांटता है- क्योंकि airline mileage account के name field में एक बार में बहुत कम data आ सकता है
- हर chunk पहले airline mileage account के name field में क्रम से लिखा जाता है
- ground daemon account को poll करते हुए नया chunk मिलने पर उसे read करता है, और अगला chunk भेजा जा सकता है यह बताने वाला acknowledgement छोड़ता है
- पूरा HTTP request reassemble होने पर ground daemon Internet पर असली request भेजता है
- HTTP response उल्टी दिशा में उसी प्रक्रिया से गुजरता है
- ground daemon response को chunks में बांटकर भेजता है
- Implementation को simple रखने के लिए response chunks दूसरे airline mileage account का इस्तेमाल करते हैं
- sky proxy chunks read करके HTTP response को reassemble करता है और original
curlcall को return करता है
transport layer और network layer की जिम्मेदारियां अलग करना
- PySkyWiFi की communication logic transport layer और network layer में बंटी है
- Transport layer तय करती है कि कौन-सा data किस order में भेजना है
- लंबे message को छोटे chunks में बांटने का तरीका
- receiver को यह बताने का तरीका कि वह अगला chunk लेने के लिए ready है
- TCP से बहुत loosely मिलती-जुलती भूमिका
- Network layer transport layer द्वारा तय data को असली storage में write और read करती है
- यह airline mileage account, local file, Discord profile जैसे storage हो सकते हैं
- यह separation नए airline mileage platform जोड़ना आसान बनाता है
- केवल नई network layer implement करनी होती है, transport layer जैसी है वैसी बनी रहती है
- Test के लिए network layer airline mileage account की जगह local files read/write कर सकती है
DATA, ACK, END से क्रम मिलाने के transmission rules
- PySkyWiFi transport connection दो pipes से बना है
- हर client के पास लिखने के लिए SEND pipe और पढ़ने के लिए RECV pipe होता है
- Airline mileage accounts को pipe की तरह इस्तेमाल किया जा सकता है
- PSWF client किसी एक समय में केवल send या receive में से एक ही कर सकता है
- Send mode में वह दूसरे पक्ष द्वारा भेजा गया data नहीं देख पाता
- Receive mode में data भेजने पर भी दूसरा पक्ष उसे नहीं देख पाता
- यह TCP की तरह कभी भी दोनों दिशाओं में send/receive करने वाला तरीका नहीं है
- लंबे messages
DATA,ACK,ENDsegments से transmit होते हैंDATA: characterD, 6 अंकों में padded sequence number, और असली chunk data से बना होता है- उदाहरण:
D000451adline": "Mudslide in Wigan causes m ACK: characterAऔर confirm किए जाने वाले 6 अंकों के sequence number से बना होता है- उदाहरण:
A000451 END: केवल characterEसे message समाप्ति दिखाता है
- Sender
DATAभेजने के बाद उसी sequence number काACKमिलने तक इंतजार करता हैA000451मिलने पर माना जाता है कि000451chunk process हो गया है और000452chunk भेजा जाता है
- Receiver
ENDदेखता है तो message को समाप्त मानता है, और sender व receiver roles बदल लेते हैं
network layer implementation interface
- Network layer storage में data write और read करने वाला simple interface देती है
- जरूरी operations दो हैं
send(msg: str):msgको storage में record करता हैrecv() -> str: storage से message read करता है
- Airline mileage-based implementation में ये दोनों operations account के name field को write और read करने की actions बन जाते हैं
- जरूरी attributes भी दो हैं
sleep_for: RECV pipe को poll करने के बीच transport layer कितने seconds wait करेगीsegment_data_size: एक segment में आने वाले characters की संख्या
sleep_forको file जैसे test implementations में कम रखा जा सकता है, लेकिन airline mileage account implementation में remote server पर बहुत ज्यादा requests न भेजे जाएं, इसलिए इसे कम-से-कम कुछ seconds रखना चाहिएsegment_data_sizeइस्तेमाल किए जा रहे airline mileage account field की maximum size के बराबर होना चाहिए, और उदाहरण करीब 20 characters का है- Optional hooks दो हैं
connect_send(): SEND pipe initialization पर call होता है, और airline mileage implementation में username और password से login करके cookies पाने के लिए इस्तेमाल हो सकता हैconnect_recv(): RECV pipe initialization पर call होता है
base26 encoding और bandwidth सुधार के ideas
- Airline mileage HTML form name में non-alphabet characters allow न कर सकता है
Stephenallow हो सकता हैGET /data?id=5reject हो सकता है
- इससे बचने के लिए network layer को segments airline mileage account में लिखने से पहले base26 में encode करना चाहिए
- base26 string को केवल
AसेZतक के characters इस्तेमाल करके represent करता है - Byte string को बड़े number में बदलकर, उसे base-26 number की तरह
A~Zcharacters से represent करता है - उदाहरण:
b26_encode("Hello world")CZEZINADXFFTZEIDPKMreturn करता है
- base26 string को केवल
- Transport layer को इस encoding की जानकारी जरूरी नहीं है
- Network layer bytes को base26 में बदलकर record करती है, और read करते समय फिर bytes में restore करती है
- base26 string को काफी लंबा बना देता है और bandwidth घटाता है
- Uppercase और lowercase दोनों इस्तेमाल करने वाले base52 से यह छोटा हो सकता है, लेकिन इसे version 2 improvement के रूप में छोड़ा गया
- Segment size बढ़ाकर bandwidth बढ़ाई जा सकती है
- अगर एक field केवल 20 characters store कर सकता है, तब भी 20-character वाले 5 fields को एक साथ write करने पर एक request में 100-character segment भेजा जा सकता है
- Receiver 5 fields को एक request में read करके फिर जोड़ सकता है
HTTP CONNECT से बची improvement की गुंजाइश और final test
- PySkyWiFi में manually HTTP requests भेजने-लाने के बजाय HTTP CONNECT requests इस्तेमाल करने पर बेहतर tunnel बनाया जा सकता है
CONNECTवह तरीका है जिसे अधिकतर HTTP proxies इस्तेमाल करते हैं, और इसे इस्तेमाल करने पर PySkyWiFi system-level proxy की तरह काम करके browser requests भी handle कर सकता हैCONNECTइस्तेमाल करने पर PySkyWiFi target website के साथ सीधे TLS connection negotiate करता है, इसलिए airline mileage account से गुजरने वाला traffic encrypted रहता है- नुकसान यह है कि implementation work बहुत बढ़ जाता है
- Final test में GitHub Gist के जरिए data tunnel करके
curlसे blog homepage load किया गया, और कुछ मिनट बाद HTML response मिला
1 टिप्पणियां
Hacker News की राय
कई दशक पहले मेरे जीवनसाथी Google Voice SMS को सीधे Gmail इनबॉक्स में पढ़कर जवाब देते थे, और चूँकि उन्हें मोबाइल फोन पसंद नहीं थे, वे unlimited 3G वाला पुराना Kindle Keyboard साथ रखते थे
Kindle के साधारण browser से low-spec Gmail स्क्रीन खुल जाती थी, इसलिए उसे बिना मासिक शुल्क वाले SMS device की तरह इस्तेमाल किया जा सकता था; बस नई SMS notification की समस्या थी
इसलिए jailbreak करने के बाद home screen पर counter लगाने की कोशिश करते हुए विचार आया कि Kindle device name के पास counter रखा जा सकता है, जिसे Amazon account में बदला जा सकता था
Home server पर browser automation से Amazon में login कराकर device name को
My Kindle (x)में बदलवाया, जहाँ x unread Google Voice SMS की संख्या थी, और Kindle एक मिनट के भीतर home screen name update कर देता था; यह कई वर्षों तक अच्छे से चलायाद है कि कुछ bytes भी कम करने से लगभग एक million dollars की बचत हो सकती थी
उस समय वह शायद सबसे पुराने working Kindle में से एक रहा होगा, इसलिए चोर ने बस bag में पड़ी चीज उठा ली होगी
बाद में flea market में 20 dollars का एक और Kindle Keyboard मिला, लेकिन 6 महीने बाद battery खत्म हो गई; device अभी भी मेरे पास है, इसलिए replacement battery की लागत जानने की उत्सुकता है
Browser में Gmail किसी तरह चल जाता था, और मैंने Kindle-friendly Zork website भी बनाई थी जहाँ कई zmachine ROM में से चुनकर text game खेला जा सकता था
कुछ news sites में featured होने पर उसे कुछ हद तक प्रतिक्रिया भी मिली
Kindle का नाम बदलने वाला clever integration तो नहीं था, लेकिन unlimited 3G वाले Keyboard Kindle से कुछ समय तक SMS भेजे थे
Google Maps website किसी तरह चल जाती थी
पहले कभी Italy से Greece जाने वाली लगभग 20 घंटे की ferry ली थी; वहाँ satellite internet आधारित paid Wi-Fi था, लेकिन मैं भुगतान नहीं करना चाहता था
Payment के लिए Stripe access खुला था, और पता चला कि stripe.com के developer docs समेत सभी pages access किए जा सकते हैं, इसलिए मैंने images बार-बार download करके bandwidth बर्बाद करना शुरू कर दिया
फिर याद आया कि Stripe के काम करने के लिए Fastly CDN access चाहिए और Reddit भी Fastly इस्तेमाल करता है; Stripe से connect करने के बाद HTTP
Hostheader कोreddit.comमें बदल दिया तो Reddit देखा जा सकता थाImages नहीं चलीं क्योंकि
i.redd.itFastly पर नहीं था, लेकिन/etc/hostsमेंold.reddit.comको Stripe के Fastly IP से जोड़कर और डरावनी TLS error ignore करके login भी हो गयाधीमे connection की वजह से अगर वे दोबारा न खरीदें तो provider company को भी नुकसान होता है, और Stripe की upload bandwidth cost भी बढ़ सकती है
मैं तो आसपास के लोगों पर बुरा असर न पड़े, इस वजह से cellular पर भी downloads से बचता हूँ
Blocked connection पर कहाँ तक access मिल सकता है, यह explore करने वाला intellectual experiment समझ आता है, लेकिन जानबूझकर bandwidth बर्बाद करना public restroom का नल खुला छोड़कर पानी बहाने या toilet जाम करके overflow कराने जैसा है
https://en.wikipedia.org/wiki/Domain_fronting
कुछ हफ्ते पहले mall में बच्चों की class के लिए छोड़ने गया और free Wi-Fi इस्तेमाल करने की कोशिश की; laptop login तो successful था, लेकिन बताया कि internet नहीं चल रहा
Default gateway check किया तो Cisco modem से connected था, diagnostic tools और connected devices की list दिखी, लेकिन internet connection बंद था
Phone से model search किया तो पता चला admin account serial number होता है और password blank छोड़ा जाता है; example pattern भी था, और connected devices में से एक का नाम बिल्कुल उसी pattern जैसा दिख रहा था
उसी से login करके internet button on किया, 15 seconds बाद वह green हो गया, और device password भी नया set कर दिया
VPN connect नहीं हो रहा था, और router में आसानी से जा सकता था, इसलिए MTU settings बदल दीं; उसके बाद तुरंत सही से काम करने लगा
ऐसी hacking मुझे अपने असली अर्थ में शानदार लगती है और पसंद है
हालांकि हाल में check करने पर लगा कि skywifi में global DNS payment के बिना भी सही resolve हो जाता है, और जिस flight में मैं था उसमें शायद साधारण iodine tunnel भी चल जाता
https://github.com/yarrick/iodine
Abuse reports से बचने के लिए server का external traffic Tor से route किया, कौन-से train, hotel और airport networks पर यह काम करता है उसके logs भी collect किए, और दूसरे tunneling protocols भी provide किए
कुछ समय तक यह मजेदार project था; काश इसे चलते रहने दिया होता
आजकल कुछ DNS servers, खासकर Google, DNS requests के uppercase/lowercase को randomize करते हैं, जिससे कुछ encodings बुरी तरह टूट जाती हैं, इसलिए DNS tunneling थोड़ी और मुश्किल हो गई है
Idea और principle मजेदार हैं, लेकिन speed के कारण practical use में लगभग बेकार है; UDP के ऊपर messenger जैसा कुछ चलाएँ तो अलग बात है ;-)
“मैं हेडफोन चार्ज करना भूल गया था, इसलिए Limp Bizkit लैपटॉप स्पीकर से बजने लगा। शुक्र है, विमान में बाकी लोगों को फर्क पड़ता नहीं दिखा, तो हम सबने मिलकर मज़े किए।”
ऐसे लोगों में बुनियादी सार्वजनिक शिष्टाचार की कमी होती है
आसपास के बहुत से लोगों को यकीनन परेशानी हुई होगी, लेकिन शायद वे इतने सभ्य थे कि यह कह नहीं पाए कि बेकार का शोर उन पर मत थोपिए
ऐसे बुनियादी शिष्टाचार से खाली लोग इतने ज़्यादा हैं कि मुझे यह मज़ेदार मज़ाक लगा, और कम-से-कम लेखक सच में ऐसा व्यक्ति नहीं लगता
यह एक ऐसे hacker की छवि दिखाता है जो मुफ्त internet की संभावना को अमल में लाने योग्य मौका मानता है, और बाद में इस तरह दूरी बना लेता है कि वह असल में airline system का दुरुपयोग करने वाला व्यक्ति नहीं है, इसलिए शुरुआती tone एक शैलीगत उपकरण लगती है
वरना यह बेहद असभ्य और बेरुखा व्यवहार है
सोचता हूं क्या मैं ही ऐसा हूं जो विमान में बैठते ही हमेशा इतना थक जाता हूं कि आंखें बंद करके अंत तक इंतज़ार करने के अलावा कुछ नहीं कर पाता
laptop या किताब निकालने का विचार ही थका देता है, शोर भी बहुत होता है और noise-cancelling headphones भी नहीं हैं, इसलिए ध्यान लगाना मुश्किल है
घर से निकलकर ट्रेन, ट्राम और security check से गुजरते हुए कम-से-कम 2 घंटे बीत चुके होते हैं, और airport का अस्वस्थ खाना भी मदद नहीं करता
मौसम भी आधे साल या तो बहुत गर्म या बहुत ठंडा होता है, और 10kg backpack की वजह से लगातार पसीना आता रहता है, इसलिए अंत में विमान के अंदर कुछ करने का मन ही नहीं बचता
यह intuition के उलट है, लेकिन सुना है कि कई ADHD brains ऐसे ही काम करते हैं, और विमान में बिताया समय मेरे लिए सबसे productive होता है
उसे घुटनों पर टिकाना पड़ता है, या आगे वाला यात्री सीट पीछे कर दे तो screen टूटने का खतरा रहता है; कुछ साल पहले मेरे एक colleague के साथ सच में ऐसा हुआ था
आजकल बस iPad और noise-cancelling headphones निकालकर फिल्में या TV shows देखता हूं
मेरा शरीर भी बिल्कुल यही प्रतिक्रिया देता है, और मुझे लगता है इसका संबंध हवा में oxygen level कम होने से है
समस्या शोर की नहीं, हवा की है; noise-cancelling headphones वाकई बहुत असरदार हैं
लेकिन कुछ लोग ऐसे भी हैं जिन पर इसका बिल्कुल असर नहीं होता और वे विमान में उपयोगी काम कर लेते हैं
चाहे जितना थका होऊं या नींद की कमी हो, विमान में न सो पाता हूं न थकान महसूस होती है, इसलिए transatlantic flight और भी तकलीफदेह हो जाती है; साथ चलने वाला अगर 8 घंटे सो जाए तो लगता है जैसे मेरा मज़ाक उड़ रहा हो
flight के दौरान मेरा दिमाग बहुत सुन्न हो जाता है, इसलिए landing तक आंखें बंद रखता हूं; किताब पढ़ने या काम करने की कोशिश भी करूं तो 5–10 मिनट बाद दिमाग बंद हो जाता है
अजीब बात है कि in-flight meal हर बार पेट फूलने की समस्या कर देता है, इसलिए landing के तुरंत बाद दवा चाहिए होती है
दिलचस्प है कि दो बार business class में उड़ने पर दिमाग बंद होने से पहले कुछ हद तक पढ़ सका
लंबी दूरी की train में, अगर travel direction की ओर मुंह करके बैठा हूं, तो सच में काम करना आसान होता है, लेकिन train काफी भीड़भाड़ वाली हो तो दिमाग फिर बंद हो जाता है
stock prices, match scores, weather जैसी चीज़ें भेजने की बात देखकर याद आया कि पहले Google text message service के रूप में ऐसी सुविधाएं देता था
अपना पहला smartphone खरीदने से पहले मैंने इसे बहुत इस्तेमाल किया था;
W[ZIP code]को 46645(GOOGL) पर भेजते तो weather SMS में जवाब आता थाstock:[symbol]भी काम करता था, और कई और features थे जिन्हें अब भूल चुका हूंबेशक Google ने इसे बंद कर दिया, लेकिन जब तक चला, काफी शानदार था
उस समय Twitter द्वारा support किए जाने वाले SMS DM से कुछ lines भेजते, फिर Google पर
" lyrics"search होता, results parse करके artist और title SMS में वापस भेजे जातेयह बहुत अच्छे से काम नहीं करता था, लेकिन मुझे इस पर काफी गर्व था
इसके कारण portable satellite communicator inReach Mini 2 से दुनिया में कहीं से भी ChatGPT से सवाल पूछ सकता हूं, और Death Valley के बीचोंबीच भी पूछ पाना काफी अच्छा लगता है
Google search query type करने में समय लगता था और results आने में 1–2 मिनट लग सकते थे, लेकिन न होने से बेहतर था
इसका उपयोग मुख्यतः उन जगहों का पता खोजने के लिए करता था जहां जाना चाहता था, फिर उसे TomTom में डालता था; समय बहुत बदल गया है
1995 के आसपास, जब मैं Ericsson की subsidiary, एक telecom research company में काम करता था, तब मेरे मन में ऐसा idea आया था, और मुख्य example flight status updates था
कोई कल्पना भी नहीं कर सकता था कि numeric keypad पर एक अक्षर डालने के लिए कई बार दबाना पड़ने वाली P2P messaging इतनी popular होगी, इसलिए early web पर data बढ़ने की स्थिति में information services सबसे अच्छा use case लगती थीं
Teletext भी तब मौजूद था, और उसे scrape करने का एक अलग project भी था
लेकिन यह सोचना दिलचस्प है कि SMS तक access रखने वाले हमने और आम जनता ने आखिर इसका इस्तेमाल किस लिए किया
यह दिलचस्प है कि लेखक abstract shared edit field के ऊपर TCP के काफी करीब पहुंच गया
यह अपने आप में भी बहुत शानदार tool हो सकता है
अगर दोनों तरफ shared resource में read और write करने का तरीका high-level पर design कर दिया जाए, तो ऐसा proxy कल्पना कर सकते हैं जो बाकी सब संभालकर उसे SOCKS proxy के रूप में उपलब्ध कराए
आखिरकार free Wi‑Fi standard बन गया और यह कोई बड़ी बात नहीं रही; अब मामला in-flight free Wi‑Fi की लड़ाई तक आ गया है
अंततः in-flight Wi‑Fi भी हर जगह free हो जाएगा, और कई airlines में यह पहले से ऐसा है
सिर्फ text चलेगा, images या videos नहीं, लेकिन सामान्य web browsing के लिए काफी होता
कुछ साल पहले हमारे विश्वविद्यालय के डीन ने यह कहते हुए कि “games की वजह से attendance पर असर पड़ रहा है”, रात 10 बजे के बाद LAN network बंद करने का फैसला किया था
implementation का तरीका IP addresses से आने-जाने वाले सारे traffic को block करना था, लेकिन TCP खुद block नहीं किया गया था, और उस समय बहुत नया न रह चुका IPv6 भी वे पूरी तरह भूल गए थे
इसलिए मैंने IPv6 पर चलने वाला एक सरल P2P chat app बनाया, और अकेली समस्या यह थी कि दोस्तों के साथ IPv6 address share करके उसे contacts में बनाए रखना पड़ता था
यह अच्छी तरह काम करता था, लेकिन बाद में पता चला कि network के बाहर किसी computer तक tunneling करना कहीं ज्यादा आसान है
यह बेकार software और ज्यादा लिखें वाली post और उसके बाद हुई HN चर्चा की याद दिलाने वाला लगभग perfect example लगता है
क्या यह जिंदगी बदल देता है? शायद नहीं
क्या इसे बनाने और explore करने की प्रक्रिया मजेदार थी? लगभग निश्चित रूप से
हमें ऐसी चीजें और ज्यादा बनानी चाहिए
https://ntietz.com/blog/write-more-useless-software/
https://news.ycombinator.com/item?id=37911900