Habr سے مضامین کے ذاتی انتخاب کے لیے ٹیلیگرام بوٹ

"کیوں؟" جیسے سوالات کے لیے ایک پرانا مضمون ہے - قدرتی گیک ٹائمز - جگہ کو صاف ستھرا بنانا.

بہت سارے مضامین ہیں، موضوعی وجوہات کی بنا پر ان میں سے کچھ مجھے پسند نہیں ہیں، اور کچھ، اس کے برعکس، چھوڑنا افسوسناک ہے۔ میں اس عمل کو بہتر بنانا اور وقت بچانا چاہوں گا۔

مندرجہ بالا مضمون نے براؤزر میں اسکرپٹنگ اپروچ کا مشورہ دیا، لیکن مجھے یہ واقعی پسند نہیں آیا (حالانکہ میں اسے پہلے استعمال کر چکا ہوں) مندرجہ ذیل وجوہات کی بنا پر:

  • آپ کے کمپیوٹر/فون پر مختلف براؤزرز کے لیے، اگر ممکن ہو تو آپ کو اسے دوبارہ ترتیب دینا ہوگا۔
  • مصنفین کی طرف سے سخت فلٹرنگ ہمیشہ آسان نہیں ہوتی۔
  • ان مصنفین کا مسئلہ جن کے مضامین کو آپ یاد نہیں کرنا چاہتے، چاہے وہ سال میں ایک بار شائع ہو جائیں، حل نہیں ہوا ہے۔

مضمون کی درجہ بندی کی بنیاد پر سائٹ میں فلٹر کرنا ہمیشہ آسان نہیں ہوتا ہے، کیونکہ انتہائی مہارت والے مضامین، اپنی قدر کے باوجود، ایک معمولی درجہ بندی حاصل کر سکتے ہیں۔

شروع میں، میں صرف دلچسپ چیزیں چھوڑ کر آر ایس ایس فیڈ (یا اس سے بھی کئی) بنانا چاہتا تھا۔ لیکن آخر میں، یہ پتہ چلا کہ آر ایس ایس کو پڑھنا بہت آسان نہیں لگتا تھا: کسی بھی صورت میں، کسی مضمون پر تبصرہ/ووٹ دینے/اسے اپنے پسندیدہ میں شامل کرنے کے لیے، آپ کو براؤزر سے گزرنا پڑتا ہے۔ اسی لیے میں نے ٹیلی گرام بوٹ لکھا جو مجھے ذاتی پیغام میں دلچسپ مضامین بھیجتا ہے۔ ٹیلیگرام خود ان میں سے خوبصورت پیش نظارہ کرتا ہے، جو مصنف/درجہ بندی/نظریات کے بارے میں معلومات کے ساتھ مل کر کافی معلوماتی لگتا ہے۔

Habr سے مضامین کے ذاتی انتخاب کے لیے ٹیلیگرام بوٹ

کٹ کے نیچے تفصیلات ہیں جیسے کام کی خصوصیات، تحریری عمل اور تکنیکی حل۔

بوٹ کے بارے میں مختصراً

ذخیرہ: https://github.com/Kright/habrahabr_reader

ٹیلیگرام میں بوٹ: https://t.me/HabraFilterBot

صارف ٹیگز اور مصنفین کے لیے ایک اضافی درجہ بندی کرتا ہے۔ اس کے بعد، مضامین پر ایک فلٹر لگایا جاتا ہے - Habré پر مضمون کی درجہ بندی، مصنف کی صارف کی درجہ بندی اور ٹیگ کے لحاظ سے صارف کی درجہ بندی کی اوسط شامل کی جاتی ہے۔ اگر رقم صارف کی مخصوص حد سے زیادہ ہے، تو مضمون فلٹر سے گزر جاتا ہے۔

بوٹ لکھنے کا ایک ضمنی مقصد تفریح ​​​​اور تجربہ حاصل کرنا تھا۔ اس کے علاوہ، میں باقاعدگی سے اپنے آپ کو یاد دلایا میں گوگل نہیں ہوں۔اور اس لیے بہت سی چیزیں آسان اور حتیٰ کہ ابتدائی طور پر بھی کی جاتی ہیں۔ تاہم، اس نے بوٹ کو لکھنے کے عمل کو تین مہینے لگنے سے نہیں روکا۔

باہر گرمی کا موسم تھا۔

جولائی ختم ہو رہا تھا، اور میں نے ایک بوٹ لکھنے کا فیصلہ کیا۔ اور اکیلے نہیں بلکہ ایک دوست کے ساتھ جو اسکیل میں مہارت حاصل کر رہا تھا اور اس پر کچھ لکھنا چاہتا تھا۔ شروعات امید افزا لگ رہی تھی - کوڈ ایک ٹیم کی طرف سے کاٹ دیا جائے گا، کام آسان لگ رہا تھا اور میں نے سوچا کہ ایک دو ہفتوں یا ایک مہینے میں بوٹ تیار ہو جائے گا.

اس حقیقت کے باوجود کہ میں خود پچھلے کچھ سالوں سے وقتاً فوقتاً چٹان پر کوڈ لکھتا رہا ہوں، عام طور پر کوئی بھی اس کوڈ کو نہیں دیکھتا اور نہ ہی دیکھتا ہے: پالتو پراجیکٹس، کچھ آئیڈیاز کی جانچ کرنا، ڈیٹا کو پری پروسیس کرنا، FP سے کچھ تصورات پر عبور حاصل کرنا۔ مجھے واقعی اس بات میں دلچسپی تھی کہ ٹیم میں تحریری کوڈ کیسا لگتا ہے، کیونکہ کوڈ آن راک بہت مختلف طریقوں سے لکھا جا سکتا ہے۔

کیا جا سکتا تھا تو? تاہم، آئیے چیزوں میں جلدی نہ کریں۔
جو کچھ بھی ہوتا ہے اسے کمٹ ہسٹری کا استعمال کرکے ٹریک کیا جاسکتا ہے۔

ایک جاننے والے نے 27 جولائی کو ایک ذخیرہ بنایا، لیکن اور کچھ نہیں کیا، اس لیے میں نے کوڈ لکھنا شروع کیا۔

30 جولائی

مختصراً: میں نے حبر کی آر ایس ایس فیڈ کا تجزیہ لکھا۔

  • com.github.pureconfig ٹائپ سیف کنفیگرز کو براہ راست کیس کلاسز میں پڑھنے کے لیے (یہ بہت آسان نکلا)
  • scala-xml ایکس ایم ایل پڑھنے کے لیے: چونکہ ابتدا میں میں آر ایس ایس فیڈ کے لیے اپنا نفاذ لکھنا چاہتا تھا، اور آر ایس ایس فیڈ ایکس ایم ایل فارمیٹ میں ہے، اس لیے میں نے اس لائبریری کو پارس کرنے کے لیے استعمال کیا۔ دراصل، آر ایس ایس کی تجزیہ بھی ظاہر ہوئی.
  • scalatest ٹیسٹ کے لیے چھوٹے پروجیکٹس کے لیے بھی، ٹیسٹ لکھنے سے وقت کی بچت ہوتی ہے - مثال کے طور پر، xml پارسنگ کو ڈیبگ کرتے وقت، اسے فائل میں ڈاؤن لوڈ کرنا، ٹیسٹ لکھنا اور غلطیوں کو درست کرنا بہت آسان ہے۔ جب بعد میں کچھ عجیب HTML کو غلط utf-8 حروف کے ساتھ پارس کرتے ہوئے ایک بگ نمودار ہوا، تو اسے فائل میں ڈالنا اور ٹیسٹ شامل کرنا زیادہ آسان ثابت ہوا۔
  • اکا سے اداکار معروضی طور پر، ان کی بالکل ضرورت نہیں تھی، لیکن یہ منصوبہ تفریح ​​کے لیے لکھا گیا تھا، میں انہیں آزمانا چاہتا تھا۔ نتیجے کے طور پر، میں یہ کہنے کے لیے تیار ہوں کہ مجھے یہ پسند آیا۔ OOP کے خیال کو دوسری طرف سے دیکھا جا سکتا ہے - ایسے اداکار ہیں جو پیغامات کا تبادلہ کرتے ہیں۔ مزید دلچسپ بات یہ ہے کہ آپ کوڈ کو اس طرح لکھ سکتے ہیں (اور ہونا چاہئے) کہ پیغام نہ پہنچے یا اس پر کارروائی نہ ہو (عام طور پر، جب اکاؤنٹ ایک ہی کمپیوٹر پر چل رہا ہو، پیغامات ضائع نہیں ہونے چاہئیں)۔ پہلے میں اپنا سر کھجا رہا تھا اور اداکاروں کے ایک دوسرے کو سبسکرائب کرنے کے ساتھ کوڈ میں ردی کی ٹوکری تھی، لیکن آخر میں میں ایک سادہ اور خوبصورت فن تعمیر کے ساتھ آنے میں کامیاب ہوگیا۔ ہر ایکٹر کے اندر موجود کوڈ کو سنگل تھریڈڈ سمجھا جا سکتا ہے؛ جب ایک اداکار کریش ہوتا ہے، تو acca اسے دوبارہ شروع کر دیتا ہے - نتیجہ کافی حد تک خرابی برداشت کرنے والا نظام ہے۔

9 اگست

میں نے پروجیکٹ میں اضافہ کیا۔ scala-scrapper حبر سے HTML صفحات کو پارس کرنے کے لیے (معلومات نکالنے کے لیے جیسے مضمون کی درجہ بندی، بک مارکس کی تعداد وغیرہ)۔

اور کیٹس۔ جو پتھر میں ہیں۔

Habr سے مضامین کے ذاتی انتخاب کے لیے ٹیلیگرام بوٹ

پھر میں نے تقسیم شدہ ڈیٹا بیس کے بارے میں ایک کتاب پڑھی، مجھے CRDT کا خیال پسند آیا (تصادم سے پاک نقل شدہ ڈیٹا کی قسم، https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type, habr)، تو میں نے Habré پر مضمون کے بارے میں معلومات کے لیے ایک متغیر نیم گروپ کی ایک قسم کی کلاس پوسٹ کی۔

درحقیقت، خیال بہت آسان ہے - ہمارے پاس کاؤنٹر ہیں جو یکسر بدلتے ہیں۔ ترقیوں کی تعداد بتدریج بڑھ رہی ہے، جیسا کہ پلسز کی تعداد (نیز مائنس کی تعداد)۔ اگر میرے پاس کسی مضمون کے بارے میں معلومات کے دو ورژن ہیں، تو میں "انہیں ایک میں ضم کر سکتا ہوں" - کاؤنٹر کی حالت جو بڑی ہے اسے زیادہ متعلقہ سمجھا جاتا ہے۔

ایک سیمی گروپ کا مطلب ہے کہ ایک مضمون کے بارے میں معلومات والی دو اشیاء کو ایک میں ضم کیا جا سکتا ہے۔ تبدیلی کا مطلب یہ ہے کہ آپ A + B اور B + A دونوں کو ملا سکتے ہیں، نتیجہ ترتیب پر منحصر نہیں ہے، اور آخر میں تازہ ترین ورژن ہی رہے گا۔ ویسے یہاں بھی رفاقت ہے۔

مثال کے طور پر، جیسا کہ منصوبہ بنایا گیا ہے، تجزیہ کرنے کے بعد rss نے مضمون کے بارے میں قدرے کمزور معلومات فراہم کی ہیں - بغیر میٹرکس جیسے کہ ملاحظات کی تعداد۔ اس کے بعد ایک خاص اداکار نے مضامین کے بارے میں معلومات لی اور اسے اپ ڈیٹ کرنے اور اسے پرانے ورژن کے ساتھ ضم کرنے کے لیے HTML صفحات پر بھاگا۔

عام طور پر، جیسا کہ اکا میں، اس کی کوئی ضرورت نہیں تھی، آپ آرٹیکل کے لیے اپڈیٹ ڈیٹ کو آسانی سے اسٹور کر سکتے ہیں اور بغیر کسی انضمام کے ایک نیا لے سکتے ہیں، لیکن ایڈونچر کی سڑک نے میری رہنمائی کی۔

12 اگست

میں خود کو آزاد محسوس کرنے لگا اور، صرف تفریح ​​کے لیے، میں نے ہر چیٹ کو ایک الگ اداکار بنا دیا۔ نظریاتی طور پر، خود ایک اداکار کا وزن تقریباً 300 بائٹس ہوتا ہے اور وہ لاکھوں میں بن سکتے ہیں، اس لیے یہ بالکل عام طریقہ ہے۔ مجھے لگتا ہے کہ حل کافی دلچسپ نکلا:

ایک اداکار ٹیلی گرام سرور اور اکا میں میسج سسٹم کے درمیان ایک پل تھا۔ اس نے بس پیغامات وصول کیے اور مطلوبہ چیٹ اداکار کو بھیجے۔ چیٹ اداکار جواب میں کچھ واپس بھیج سکتا ہے - اور اسے ٹیلیگرام پر واپس بھیجا جائے گا۔ جو بات بہت آسان تھی وہ یہ ہے کہ یہ اداکار ہر ممکن حد تک سادہ نکلا اور اس میں پیغامات کا جواب دینے کی صرف منطق تھی۔ ویسے تو ہر چیٹ پر نئے آرٹیکلز کے بارے میں معلومات آتی تھیں، لیکن پھر بھی مجھے اس میں کوئی پریشانی نظر نہیں آتی۔

عام طور پر، بوٹ پہلے سے ہی کام کر رہا تھا، پیغامات کا جواب دے رہا تھا، صارف کو بھیجے گئے مضامین کی فہرست محفوظ کر رہا تھا، اور میں پہلے ہی سوچ رہا تھا کہ بوٹ تقریباً تیار ہے۔ میں نے آہستہ آہستہ مصنف کے ناموں اور ٹیگز کو معمول پر لانے جیسی چھوٹی خصوصیات شامل کیں ("sd_f" کو "s_d_f" سے تبدیل کرنا)۔

صرف ایک چیز رہ گئی تھی۔ چھوٹا لیکن - ریاست کہیں بھی محفوظ نہیں تھی۔

سب کچھ غلط ہو گیا۔

آپ نے محسوس کیا ہوگا کہ میں نے بوٹ زیادہ تر اکیلے ہی لکھا ہے۔ لہذا، دوسرا شریک ترقی میں شامل ہوا، اور کوڈ میں درج ذیل تبدیلیاں ظاہر ہوئیں:

  • MongoDB ریاست کو ذخیرہ کرنے کے لئے ظاہر ہوا. اسی وقت، پراجیکٹ میں لاگز ٹوٹ گئے، کیونکہ کسی وجہ سے مونگا نے انہیں سپیم کرنا شروع کر دیا اور کچھ لوگوں نے انہیں عالمی سطح پر بند کر دیا۔
  • ٹیلیگرام میں پل اداکار پہچان سے باہر ہو گیا اور پیغامات کو خود پارس کرنا شروع کر دیا۔
  • چیٹس کے لیے اداکاروں کو بے رحمی سے کاٹ دیا گیا، اور اس کے بجائے ان کی جگہ ایک اداکار لے لیا گیا جس نے ایک ساتھ تمام چیٹس کے بارے میں تمام معلومات چھپا دیں۔ ہر چھینک پر یہ اداکار مشکل میں پڑ گیا۔ ٹھیک ہے، ہاں، جیسے کہ کسی مضمون کے بارے میں معلومات کو اپ ڈیٹ کرتے وقت، اسے تمام چیٹ اداکاروں کو بھیجنا مشکل ہوتا ہے (ہم گوگل کی طرح ہیں، لاکھوں صارفین ہر ایک کے لیے چیٹ میں دس لاکھ مضامین کا انتظار کر رہے ہیں)، لیکن جب بھی چیٹ اپ ڈیٹ ہوتی ہے، مونگا میں جانا معمول ہے۔ جیسا کہ میں نے بہت بعد میں محسوس کیا، چیٹس کی ورکنگ لاجک بھی مکمل طور پر ختم ہو گئی تھی اور اس کی جگہ کچھ ایسا نظر آیا جو کام نہیں کرتا تھا۔
  • قسم کی کلاسوں کا کوئی نشان باقی نہیں ہے۔
  • اداکاروں میں ایک دوسرے کے ساتھ سبسکرپشنز کے ساتھ کچھ غیر صحت بخش منطق نمودار ہوئی ہے، جس کی وجہ سے ریس کی صورتحال پیدا ہو گئی ہے۔
  • قسم کے شعبوں کے ساتھ ڈیٹا ڈھانچہ Option[Int] جادوئی ڈیفالٹ اقدار جیسے -1 کے ساتھ Int میں تبدیل ہوا۔ بعد میں میں نے محسوس کیا کہ mongoDB json کو اسٹور کرتا ہے اور اسے وہاں اسٹور کرنے میں کوئی حرج نہیں ہے۔ Option ٹھیک ہے، یا کم از کم پارس -1 کو None کے طور پر، لیکن اس وقت میں یہ نہیں جانتا تھا اور اس کے لیے اپنا لفظ لیا کہ "ایسا ہی ہونا چاہیے۔" میں نے وہ کوڈ نہیں لکھا، اور میں نے اس وقت اسے تبدیل کرنے کی زحمت نہیں کی۔
  • مجھے پتہ چلا کہ میرا عوامی IP ایڈریس تبدیل ہوتا رہتا ہے، اور ہر بار مجھے اسے Mongo کی وائٹ لسٹ میں شامل کرنا پڑتا ہے۔ میں نے بوٹ کو مقامی طور پر لانچ کیا، مونگا ایک کمپنی کے طور پر مونگا کے سرورز پر کہیں موجود تھا۔
  • اچانک، ٹیلی گرام کے لیے ٹیگز اور میسج فارمیٹنگ کو معمول پر لانا غائب ہوگیا۔ (ہمم، ایسا کیوں ہوگا؟)
  • میں نے پسند کیا کہ بوٹ کی حالت ایک بیرونی ڈیٹا بیس میں محفوظ ہے، اور جب دوبارہ شروع کیا جاتا ہے تو یہ اس طرح کام کرتا رہتا ہے جیسے کچھ ہوا ہی نہ ہو۔ تاہم، یہ واحد پلس تھا.

دوسرا شخص کسی خاص جلدی میں نہیں تھا، اور یہ تمام تبدیلیاں ستمبر کے شروع میں ہی ایک بڑے ڈھیر میں نمودار ہوئیں۔ میں نے فوری طور پر نتیجے میں ہونے والی تباہی کے پیمانے کی تعریف نہیں کی اور ڈیٹا بیس کے کام کو سمجھنا شروع کر دیا، کیونکہ... میں نے ان سے پہلے کبھی ڈیل نہیں کی۔ صرف بعد میں مجھے احساس ہوا کہ کتنا ورکنگ کوڈ کاٹا گیا تھا اور اس کی جگہ کتنے کیڑے شامل کیے گئے تھے۔

ستمبر

پہلے میں نے سوچا کہ مونگا میں مہارت حاصل کرنا اور اسے اچھی طرح سے کرنا مفید ہوگا۔ پھر میں نے آہستہ آہستہ سمجھنا شروع کیا کہ ڈیٹا بیس کے ساتھ رابطے کو منظم کرنا بھی ایک فن ہے جس میں آپ بہت زیادہ دوڑیں لگا سکتے ہیں اور صرف غلطیاں کر سکتے ہیں۔ مثال کے طور پر، اگر صارف کو دو پیغامات موصول ہوتے ہیں۔ /subscribe - اور ہر ایک کے جواب میں ہم ٹیبل میں ایک اندراج بنائیں گے، کیونکہ ان پیغامات پر کارروائی کے وقت صارف سبسکرائب نہیں ہوتا ہے۔ مجھے ایک شبہ ہے کہ مونگا کے ساتھ اس کی موجودہ شکل میں بات چیت بہترین انداز میں نہیں لکھی گئی ہے۔ مثال کے طور پر، صارف کی سیٹنگ اس وقت بنائی گئی تھی جب اس نے سائن اپ کیا تھا۔ اگر اس نے سبسکرپشن کی حقیقت سے پہلے انہیں تبدیل کرنے کی کوشش کی... بوٹ نے کچھ جواب نہیں دیا، کیونکہ اداکار میں موجود کوڈ سیٹنگز کے لیے ڈیٹا بیس میں چلا گیا، اسے نہیں ملا اور کریش ہو گیا۔ جب پوچھا گیا کہ ضرورت کے مطابق ترتیبات کیوں نہیں بنائیں، میں نے سیکھا کہ اگر صارف نے سبسکرائب نہیں کیا ہے تو انہیں تبدیل کرنے کی کوئی ضرورت نہیں ہے... میسج فلٹرنگ سسٹم کسی نہ کسی طرح غیر واضح طور پر بنایا گیا تھا، اور کوڈ کو قریب سے دیکھنے کے بعد بھی میں سمجھ میں نہیں آرہا کہ اس کا مقصد ابتدا میں اس طرح تھا یا اس میں کوئی خامی ہے۔

چیٹ میں جمع کردہ مضامین کی کوئی فہرست نہیں تھی؛ اس کے بجائے، یہ تجویز کیا گیا تھا کہ میں انہیں خود لکھوں۔ اس نے مجھے حیران کر دیا - عام طور پر، میں ہر طرح کی چیزوں کو پروجیکٹ میں گھسیٹنے کے خلاف نہیں تھا، لیکن یہ اس کے لیے منطقی ہو گا جو ان چیزوں کو لایا اور ان کو خراب کیا۔ لیکن نہیں۔ پھر، اگر صارف نے نئے مضامین بھیجنے کی درخواست کی، تو ڈیٹا بیس کو درخواست بھیجنا ضروری تھا، جو واقعات میں سے صارف سے متعلق واقعات کو منتخب کرے گا، نئے مضامین کی فہرست بھی حاصل کرے گا، انہیں فلٹر کرے گا، صارف کو بھیجے گا۔ اور اس کے بارے میں واقعات کو واپس ڈیٹا بیس میں پھینک دیں۔

دوسرے شریک کو کہیں تجرید کی طرف لے جایا گیا، جب بوٹ نہ صرف حبر سے مضامین وصول کرے گا اور نہ صرف ٹیلیگرام پر بھیجا جائے گا۔

میں نے کسی نہ کسی طرح ستمبر کے دوسرے نصف کے لیے ایک الگ نشانی کی شکل میں واقعات کو نافذ کیا۔ یہ بہترین نہیں ہے، لیکن کم از کم بوٹ نے کام کرنا شروع کر دیا اور مجھے دوبارہ مضامین بھیجنا شروع کر دیے، اور میں نے آہستہ آہستہ اندازہ لگایا کہ کوڈ میں کیا ہو رہا ہے۔

اب آپ شروع میں واپس جا سکتے ہیں اور یاد رکھیں کہ ذخیرہ اصل میں میرے ذریعہ نہیں بنایا گیا تھا۔ اس طرح کیا جا سکتا تھا؟ میری پل کی درخواست مسترد کر دی گئی۔ یہ پتہ چلا کہ میرے پاس ریڈ نیک کوڈ تھا، کہ میں نہیں جانتا تھا کہ ٹیم میں کیسے کام کرنا ہے، اور مجھے موجودہ نفاذ کے منحنی خطوط میں کیڑے ٹھیک کرنے تھے، اور اسے قابل استعمال حالت میں بہتر نہیں کرنا تھا۔

میں پریشان ہو گیا اور کمٹ کی تاریخ اور لکھے گئے کوڈ کی مقدار کو دیکھا۔ میں نے ان لمحات کو دیکھا جو اصل میں اچھی طرح سے لکھے گئے تھے، اور پھر واپس ٹوٹ گئے...

F*rk اسے

مجھے مضمون یاد آگیا آپ گوگل نہیں ہیں۔.

میں نے سوچا کہ عمل درآمد کے بغیر کسی کو حقیقت میں آئیڈیا کی ضرورت نہیں ہے۔ میں نے سوچا کہ میں ایک ورکنگ بوٹ رکھنا چاہتا ہوں، جو ایک ہی کمپیوٹر پر ایک ہی کاپی میں ایک سادہ جاوا پروگرام کے طور پر کام کرے گا۔ میں جانتا ہوں کہ میرا بوٹ مہینوں تک دوبارہ شروع کیے بغیر کام کرے گا، کیونکہ میں ماضی میں بھی ایسے بوٹس لکھ چکا ہوں۔ اگر یہ اچانک گرتا ہے اور صارف کو دوسرا مضمون نہیں بھیجتا ہے، تو آسمان زمین پر نہیں گرے گا اور کچھ بھی تباہ کن نہیں ہوگا۔

مجھے Docker، mongoDB اور "سنجیدہ" سافٹ ویئر کے دوسرے کارگو کلٹ کی ضرورت کیوں ہے اگر کوڈ صرف کام نہیں کرتا ہے یا ٹیڑھی سے کام کرتا ہے؟

میں نے اس منصوبے کو آگے بڑھایا اور جیسا میں چاہتا تھا سب کچھ کیا۔

Habr سے مضامین کے ذاتی انتخاب کے لیے ٹیلیگرام بوٹ

اسی وقت میں، میں نے نوکریاں بدل دیں اور فارغ وقت کی شدید کمی ہو گئی۔ صبح میں ٹرین میں سیدھا بیدار ہوا، شام کو میں دیر سے واپس آیا اور اب کچھ نہیں کرنا چاہتا تھا۔ میں نے تھوڑی دیر تک کچھ نہیں کیا، پھر بوٹ کو ختم کرنے کی خواہش مجھ پر غالب آگئی، اور میں نے صبح کام پر گاڑی چلاتے ہوئے آہستہ آہستہ کوڈ کو دوبارہ لکھنا شروع کیا۔ میں یہ نہیں کہوں گا کہ یہ نتیجہ خیز تھا: اپنی گود میں لیپ ٹاپ کے ساتھ ہلتی ہوئی ٹرین پر بیٹھنا اور اپنے فون سے اسٹیک اوور فلو کو دیکھنا زیادہ آسان نہیں ہے۔ تاہم، کوڈ لکھنے میں صرف کیا گیا وقت مکمل طور پر کسی کا دھیان نہیں گیا، اور پروجیکٹ آہستہ آہستہ کام کرنے والی حالت کی طرف بڑھنے لگا۔

میرے ذہن کے پیچھے کہیں شک کا ایک کیڑا تھا جو mongoDB استعمال کرنا چاہتا تھا، لیکن میں نے سوچا کہ "قابل اعتماد" اسٹیٹ اسٹوریج کے فوائد کے علاوہ، نمایاں نقصانات بھی تھے:

  • ڈیٹا بیس ناکامی کا ایک اور نقطہ بن جاتا ہے۔
  • کوڈ زیادہ پیچیدہ ہوتا جا رہا ہے، اور مجھے اسے لکھنے میں زیادہ وقت لگے گا۔
  • کوڈ سست اور غیر موثر ہو جاتا ہے؛ میموری میں کسی چیز کو تبدیل کرنے کے بجائے، تبدیلیاں ڈیٹا بیس کو بھیجی جاتی ہیں اور اگر ضروری ہو تو، واپس کھینچ لی جاتی ہیں۔
  • ایک علیحدہ جدول میں واقعات کے ذخیرہ کرنے کی قسم پر پابندیاں ہیں، جو ڈیٹا بیس کی خصوصیات سے وابستہ ہیں۔
  • مونگا کے آزمائشی ورژن میں کچھ حدود ہیں، اور اگر آپ ان میں داخل ہوتے ہیں، تو آپ کو مونگا کو کسی چیز پر لانچ اور کنفیگر کرنا پڑے گا۔

میں نے مونگا کو کاٹ دیا، اب بوٹ کی حالت صرف پروگرام کی میموری میں محفوظ ہوتی ہے اور وقتاً فوقتاً json کی شکل میں فائل میں محفوظ ہوتی رہتی ہے۔ شاید کمنٹس میں وہ لکھیں گے کہ میں غلط ہوں، یہ وہ جگہ ہے جہاں ڈیٹا بیس استعمال کیا جانا چاہیے، وغیرہ۔ لیکن یہ میرا پروجیکٹ ہے، فائل کے ساتھ نقطہ نظر ممکن حد تک آسان ہے اور یہ شفاف طریقے سے کام کرتا ہے۔

-1 جیسی جادوئی اقدار کو باہر پھینک دیا اور معمول کی واپسی کی۔ Option، چیٹ کی معلومات کے ساتھ آبجیکٹ پر بھیجے گئے مضامین کے ساتھ ہیش ٹیبل کا ذخیرہ شامل کیا گیا۔ پانچ دن سے پرانے مضامین کے بارے میں معلومات کو حذف کرنا شامل کیا گیا، تاکہ ہر چیز کو ذخیرہ نہ کیا جا سکے۔ میں لاگنگ کو کام کرنے والی حالت میں لایا ہوں - لاگز فائل اور کنسول دونوں پر مناسب مقدار میں لکھے جاتے ہیں۔ کئی ایڈمن کمانڈز شامل کیے گئے جیسے کہ ریاست کو محفوظ کرنا یا اعدادوشمار حاصل کرنا جیسے کہ صارفین اور مضامین کی تعداد۔

چھوٹی چھوٹی چیزوں کا ایک گروپ طے کیا: مثال کے طور پر، مضامین کے لیے صارف کے فلٹر کو پاس کرنے کے وقت ملاحظات، پسندیدگی، ناپسندیدگی اور تبصروں کی تعداد اب بتائی گئی ہے۔ عام طور پر، یہ حیرت کی بات ہے کہ کتنی چھوٹی چیزوں کو درست کرنا پڑا۔ میں نے ایک فہرست رکھی، وہاں موجود تمام "بے قاعدگیوں" کو نوٹ کیا اور جہاں تک ممکن ہوا ان کو درست کیا۔

مثال کے طور پر، میں نے تمام ترتیبات کو براہ راست ایک پیغام میں سیٹ کرنے کی صلاحیت شامل کی:

/subscribe
/rating +20
/author a -30
/author s -20
/author p +9000
/tag scala 20
/tag akka 50

اور ایک اور ٹیم /settings انہیں بالکل اسی شکل میں دکھاتا ہے، آپ اس سے متن لے سکتے ہیں اور تمام ترتیبات کسی دوست کو بھیج سکتے ہیں۔
یہ ایک چھوٹی سی چیز کی طرح لگتا ہے، لیکن اسی طرح کی درجنوں باریکیاں ہیں.

ایک سادہ لکیری ماڈل کی شکل میں آرٹیکل فلٹرنگ کو لاگو کیا گیا ہے - صارف مصنفین اور ٹیگز کے لیے ایک اضافی درجہ بندی کے ساتھ ساتھ حد کی قدر بھی مقرر کر سکتا ہے۔ اگر مصنف کی درجہ بندی کا مجموعہ، ٹیگز کی اوسط درجہ بندی اور مضمون کی اصل درجہ بندی حد کی قیمت سے زیادہ ہے، تو مضمون صارف کو دکھایا جاتا ہے۔ آپ یا تو بوٹ سے /نئے کمانڈ کے ساتھ مضامین کے لیے پوچھ سکتے ہیں، یا بوٹ کو سبسکرائب کر سکتے ہیں اور یہ دن کے کسی بھی وقت ذاتی پیغام میں مضامین بھیجے گا۔

عام طور پر، میرے پاس ہر مضمون کے لیے مزید خصوصیات (حبس، تبصروں کی تعداد، بُک مارکس، درجہ بندی میں تبدیلی کی حرکیات، متن کی مقدار، مضمون میں تصاویر اور کوڈ، مطلوبہ الفاظ) نکالنے اور صارف کو ٹھیک ظاہر کرنے کا خیال تھا۔ ٹھیک نہیں ہر مضمون کے تحت ووٹ دیں اور ہر صارف کے لیے ایک ماڈل کی تربیت دیں، لیکن میں بہت سست تھا۔

اس کے علاوہ، کام کی منطق اتنی واضح نہیں ہوگی. اب میں مریض زیرو کے لیے دستی طور پر +9000 کی ریٹنگ سیٹ کر سکتا ہوں اور +20 کی حد درجہ بندی کے ساتھ مجھے اس کے تمام مضامین موصول ہونے کی ضمانت دی جائے گی (جب تک کہ میں نے کچھ ٹیگز کے لیے -100500 سیٹ نہیں کیا ہے)۔

حتمی فن تعمیر بہت آسان نکلا:

  1. ایک اداکار جو تمام چیٹس اور مضامین کی حالت کو محفوظ کرتا ہے۔ یہ اپنی حالت کو ڈسک پر موجود فائل سے لوڈ کرتا ہے اور اسے وقتاً فوقتاً، ہر بار نئی فائل میں محفوظ کرتا ہے۔
  2. ایک اداکار جو وقتاً فوقتاً آر ایس ایس فیڈ کا دورہ کرتا ہے، نئے مضامین کے بارے میں سیکھتا ہے، لنکس کو دیکھتا ہے، تجزیہ کرتا ہے اور ان مضامین کو پہلے اداکار کو بھیجتا ہے۔ اس کے علاوہ، یہ کبھی کبھی پہلے اداکار سے مضامین کی فہرست کی درخواست کرتا ہے، ان کو منتخب کرتا ہے جو تین دن سے زیادہ پرانے نہیں ہیں، لیکن طویل عرصے سے اپ ڈیٹ نہیں ہوئے ہیں، اور انہیں اپ ڈیٹ کرتا ہے۔
  3. ایک اداکار جو ٹیلیگرام کے ساتھ بات چیت کرتا ہے۔ میں ابھی بھی پیغام کو مکمل طور پر یہاں لایا ہوں۔ دوستانہ انداز میں، میں اسے دو حصوں میں تقسیم کرنا چاہوں گا - تاکہ ایک آنے والے پیغامات کو پارس کرے، اور دوسرا نقل و حمل کے مسائل جیسے کہ غیر بھیجے ہوئے پیغامات کو دوبارہ بھیجنا۔ اب کوئی دوبارہ بھیجنا نہیں ہے، اور ایک پیغام جو غلطی کی وجہ سے نہیں پہنچا ہے وہ صرف ضائع ہو جائے گا (جب تک کہ اسے نوشتہ جات میں نوٹ نہ کیا گیا ہو)، لیکن اب تک اس سے کوئی مسئلہ نہیں ہوا ہے۔ شاید مسائل پیدا ہوں گے اگر لوگوں کا ایک گروپ بوٹ کو سبسکرائب کرے اور میں پیغامات بھیجنے کی حد تک پہنچ جاؤں)۔

مجھے جو پسند آیا وہ یہ ہے کہ اکا کی بدولت، اداکار 2 اور 3 کے فالس عام طور پر بوٹ کی کارکردگی کو متاثر نہیں کرتے ہیں۔ شاید کچھ مضامین وقت پر اپ ڈیٹ نہیں ہوتے یا کچھ پیغامات ٹیلی گرام تک نہیں پہنچ پاتے، لیکن اکاؤنٹ اداکار کو دوبارہ شروع کر دیتا ہے اور سب کچھ چلتا رہتا ہے۔ میں اس معلومات کو محفوظ کرتا ہوں کہ مضمون صارف کو صرف اس وقت دکھایا جاتا ہے جب ٹیلی گرام اداکار جواب دیتا ہے کہ اس نے کامیابی سے پیغام پہنچا دیا ہے۔ سب سے بری چیز جو مجھے دھمکی دیتی ہے وہ ہے کئی بار میسج بھیجنا (اگر یہ ڈیلیور ہو جائے، لیکن تصدیق کسی طرح ضائع ہو جائے)۔ اصولی طور پر، اگر پہلا اداکار ریاست کو اپنے اندر ذخیرہ نہیں کرتا تھا، لیکن کچھ ڈیٹا بیس کے ساتھ بات چیت کرتا ہے، تو وہ ناقابل یقین طور پر گر سکتا ہے اور زندگی میں واپس آسکتا ہے. میں اداکاروں کی حالت کو بحال کرنے کے لیے بھی استقامت کی کوشش کر سکتا ہوں، لیکن موجودہ عمل درآمد اس کی سادگی کے ساتھ میرے مطابق ہے۔ ایسا نہیں ہے کہ میرا کوڈ اکثر کریش ہو جاتا ہے - اس کے برعکس، میں نے اسے ناممکن بنانے کے لیے کافی کوشش کی۔ لیکن گندگی ہوتی ہے، اور پروگرام کو الگ تھلگ ٹکڑوں میں توڑنے کی صلاحیت-اداکاروں کو واقعی آسان اور عملی لگتا تھا۔

میں نے دائرہ-ci شامل کیا تاکہ اگر کوڈ ٹوٹ جائے تو آپ کو فوری طور پر اس کے بارے میں پتہ چل جائے گا۔ کم از کم، اس کا مطلب ہے کہ کوڈ نے مرتب ہونا بند کر دیا ہے۔ ابتدائی طور پر میں ٹریوس کو شامل کرنا چاہتا تھا، لیکن اس نے صرف میرے پروجیکٹس کو بغیر کانٹے کے دکھایا۔ عام طور پر، یہ دونوں چیزیں کھلے ذخیرہ میں آزادانہ طور پر استعمال کی جا سکتی ہیں۔

کے نتائج

یہ پہلے ہی نومبر ہے. بوٹ پر لکھا ہے، میں اسے پچھلے دو ہفتوں سے استعمال کر رہا ہوں اور مجھے یہ پسند آیا۔ اگر آپ کے پاس بہتری کے خیالات ہیں تو لکھیں۔ مجھے اس سے رقم کمانے کا کوئی فائدہ نظر نہیں آتا - اسے صرف کام کرنے دیں اور دلچسپ مضامین بھیجیں۔

بوٹ لنک: https://t.me/HabraFilterBot
گیتوب: https://github.com/Kright/habrahabr_reader

چھوٹے نتائج:

  • یہاں تک کہ ایک چھوٹا سا منصوبہ بھی کافی وقت لے سکتا ہے۔
  • آپ گوگل نہیں ہیں۔ چڑیوں کو توپ سے مارنے کا کوئی فائدہ نہیں۔ ایک آسان حل بھی کام کر سکتا ہے۔
  • پالتو جانوروں کے منصوبے نئی ٹیکنالوجیز کے ساتھ تجربہ کرنے کے لیے بہت اچھے ہیں۔
  • ٹیلیگرام بوٹس کافی آسان لکھے گئے ہیں۔ اگر یہ "ٹیم ورک" اور ٹکنالوجی کے تجربات کے لئے نہ ہوتا تو بوٹ ایک یا دو ہفتوں میں لکھا جاتا۔
  • اداکار ماڈل ایک دلچسپ چیز ہے جو ملٹی تھریڈنگ اور فالٹ ٹولرنٹ کوڈ کے ساتھ اچھی طرح چلتی ہے۔
  • مجھے لگتا ہے کہ مجھے اس بات کا ذائقہ ملا ہے کہ اوپن سورس کمیونٹی فورکس کیوں پسند کرتی ہے۔
  • ڈیٹا بیس اچھے ہیں کیونکہ ایپلیکیشن کی حالت اب ایپلیکیشن کے کریش/دوبارہ شروع ہونے پر منحصر نہیں ہے، لیکن ڈیٹا بیس کے ساتھ کام کرنے سے کوڈ پیچیدہ ہو جاتا ہے اور ڈیٹا کے ڈھانچے پر پابندیاں لگ جاتی ہیں۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں