Web appOpen in Telegram
AAn Inspired Engineer

An Inspired Engineer

@knowpow · channel · Tech · indexed since 2026-08-01
1 270subscribers
815average post reach
64.2%ER — reach to subscribers
7posts in 30 days
A
A
Abolfazl
Link
click to show
حین اینکه منتظر ماشین فرودگاه بودم دوست ترکم “باران” برام یه کلیپ از یه پیج فارسی فرستاد که داشت اموزش کلمات فارسی رو میداد و بهم گفت یه سری کلمات مثل: جنگ، صلح و مذاکره توی ترکی هم استفاده میشدن… دلیلی شد براش شاهنامه رو فرستادم و داستان فردوسی رو توضیح دادم، ناخوداگاه خودم رو وسط ویکیپدیا گردی دیدم و به شخص عجیبی رسیدم: ابوالحسن بهمنیار بن مرزبان سالاری ایشون استاد حکیم عمر خیام بوده و خودش از شاگردان برجسته ابن سینا بوده، طوری که ابن سینا فقط برای جواب دادن به پرسش های بهمنیار کتاب نوشته: از برجسته‌ترین شاگردان ابن سینا یا ابوعلی بود و در درس ابن سینا حضور فعال داشته و پرسش‌های پرسون و مهمی را مطرح می‌کرده کتاب المباحثات ابن سینا بیش‌تر در پاسخ به پرسش‌های او است. البته در مورد واقعیت شاگردی خیام هم تو نت تحقیق کردم منابعی مثل نظامی عروضی در چهارمقاله تایید کرده ولی بعضی پژوهشگران معاصر تردید دارن و می‌گن شاید این نسبت بیشتر جنبهٔ روایی و سنتی داشته باشه (چون فاصله زمانی کمی بین درگذشت بهمنیار و دوران جوانی خیام هست). اما در منابع کلاسیک، این شاگردی بارها تکرار شده هر چی که بوده الان کمتر دانشجویی پیدا میشه که استادش رو به چالش بکشه و کمتر استادی پیدا میشه که ابن سینا باشه بیش باد! @knowpow
6 · 1.8K ·
Abolfazl
Replyسورس Seastar رو بریم تو کارش یا چی؟! https://github.com/scylladb/seastar @knowpow
خب رسیدیم به محبوب اینروزای من: Seastar تو این مجموعه پست ها میخوام تلاش کنم یه دید کلی از پروژه seastar بهتون بدم طوری که بدونین چرا با وجود کتابخونه های async نیاز بوده که برن و چیزی مثل seastar رو بنویسن؟! کاراییش کجاست؟ معماری shared nothing چیه و چرا داره استفاده میکنه؟ معماریش چطور میتونه کمکش کنه که high performance باشه و اصلا چرا باید همچین چیزی وجود داشته باشه؟
4 · 1.7K ·
A
پست اول، مقدمه ای بر Seastar استارت فریمورک Seastar توسط Avi Kivity توی سال ۲۰۱۵ زده شد، هدف اصلی نوشتن الهام و کاربرد اولیه Seastar بازنویسی Cassandra بود و دیتابیس ScyllaDB رو توسعه دادن. حتی توی مقاله ‌ای که درباره ی ScyllaDB نوشتن گفتن که ادعای افزایش ده برابری پرفورمنس(نسبت به کدنویسی جاوا و استفاده از قفل‌ ها و روش‌های معمولی که برای ترد ها استفاده میشد) به کل برگرفته از قدرت استفاده از Seastar عه. وقتی یه تیم بخواد یه دیتابیس با پرفورمنس خیلی بالا بسازه اگه بره سراغ فریمورکای عمومی و معمول، بخش زیادی از کارایی رو خرج قفل‌ها، همگام‌سازی بین تردها، تاخیرهای اشتراک حافظه و مدیریت تردها می‌کنه. برای همین ساخت یه فریمورک سطح پایین که بتونه I/O رو مستقیم کنترل کنه و بین هسته‌ ها مرزبندی دقیق داشته باشه، یه تصمیم منطقی و لازم بود. حالا چرا پرفورمنسش بالاست؟! بخش عمده‌ی افت پرفورمنس زمانی اتفاق می‌افته که CPU به‌جای اجرای دستور(حتی شده یه فورلوپ) تو حالت idle منتظر completion یه عملیات I/O یا آزاد شدن یه قفل بمونه. هر نوع synchronization بین هسته‌ها چه از طریق mutex و چه cache line sharing باعث stall شدن pipeline و افت کارایی شدید میشه! درسته توی فریمورکای معمول مثل اسپرینگ بوت و... به چشم نمیاد ولی اگه قراره یه سیستم های پرفورمنس بسازیم اینجا اولین نقطه ایه که باید اصلاح بشه! این تأخیرهای ظاهرا کوچک تو مقیاس بالا به latency بالا و عملکرد پایین ختم میشن. یعنی فرض کنید ما یه برنامه ی مولتی ترد داریم که دارن روی یه پورت گوش میدن و منتظرن کانکشن جدید بیاد تا accept کنن و بعد شروع کنن به خوندن ازش و جواب دادن بهش! تا اینجا همه چی زیباست و خوب کار میکنه ولی مشکل اینجاست که همشون دارن کانکشن های جدید رو توی یه لیست مشترک نگهداری میکنن، ممکنه دوتا کلاینت توی یه لحظه وصل بشن و دوتا ترد همزمان بخوان لیست رو تغییر بدن پس مجبورن از قفل روی لیست استفاده کنن و بوم! اینجا پرفومنسمون ترکید! درسته این روش کار میکنه و خیلی هم زیباست و خیلی از فریمورکا دارن همین الان همینکارو میکنن ولی ما نمیخواییم که یه فریمورک عمومی باشیم! میخواییم یه فریمورک های پروفومنس بسازیم، پس چیکار کنیم؟ راه حل: معماری Shared Nothing معماری Shared Nothing قبلا اینجا صحبت کردم در موردش که چرا نیاز داریم خ
20 · 3.1K ·
A
Abolfazl
Link
click to show
همیشه خطر از درون زبان ساطع نمیشه! در طرز پیاده‌سازی ما و نحوهٔ بیان به وجود میاد: https://www.youtube.com/watch?v=PcerWZRm_eA در ++C خودِ bool خطرناک نیست؛ خطر اصلی اینه که bool خیلی راحت و بی‌صدا وارد جاهایی می‌شه که معنی کد رو مبهم، شکننده و اشتباه‌پذیر می‌کنه. عنوان ویدیو هم همین را می‌گوید: Bool - Implicitly Dangerous؛ یعنی «بولین، به‌خاطر ضمنی بودنش خطرناک است». ویدیو جزو Lightning Talkهای CppCon 2025 است و مدت کوتاهی دارد. به این کد دقت کنید: createUser("Kambiz", true, false, true); این کد از نظر کامپایلر کاملاً درست است، ولی برای انسان فاجعه است. true یعنی چی؟ ادمین است؟ فعال است؟ ایمیل تأیید شده؟ لاگ بگیرد؟ رونویسی کند؟ چه کار کند؟ مشکل وقتی بدتر می‌شود که جای true و false را اشتباه بزنی و کامپایلر هیچ چیزی نگوید: setWindow(true, false); پس یکی از پیام‌های اصلی این است: bool در API عمومی، مخصوصاً به‌عنوان پارامتر تابع، اغلب بوی بد طراحی است. راه بهتر این است که معنی را داخل نوع بیاوریم: enum class Fullscreen : bool { no, yes }; enum class Resizable : bool { no, yes }; void setWindow(Fullscreen fullscreen, Resizable resizable); setWindow(Fullscreen::yes, Resizable::no); اینجا دیگر کد خودش توضیح می‌دهد چه می‌کند و اشتباه جابه‌جا کردن پارامترها هم سخت‌تر می‌شود. یا مثلاً به‌جای این: save(file, true); بهتر است این باشد: enum class Overwrite { no, yes }; save(file, Overwrite::yes); یک خطر دیگر bool در ++C، تبدیل‌های ضمنی است. چیزهای مختلف می‌توانند به bool تبدیل شوند: pointerها، عددها، بعضی objectها با operator bool و غیره. این گاهی مفید است: if (ptr) { // pointer is not null } ولی در طراحی API می‌تواند باعث رفتارهای ناخواسته شود؛ مخصوصاً وقتی overloadها یا constructorها درگیر شوند. جمع‌بندی ساده‌اش: از bool برای state داخلی ساده مشکلی نیست. برای مثال: bool isConnected = false; ولی برای APIهایی که خوانایی و امنیت مهم است، مخصوصاً وقتی تابع چند تا bool می‌گیرد، بهتر است از enum class، type wrapper، یا option struct استفاده کنی. مثلاً این: connect(server, true, false, true); بهتر است اینگونه باشد: struct ConnectionOptions { bool
12 · 2K ·
A
Abolfazl
Video
twitter_2066524248840220944.mp4 · 92.9 MB · click to show
Failure is an option here. If things are not failing, you are not innovating enough. @knowpow
7 · 1.7K ·
Abolfazl
Photo
click to show
🐈‍⬛ Learning Theory Circle — Session 3 We're holding a biweekly reading group on the theory of deep learning. Every other Sunday, one person presents a paper followed by an open discussion. 🗓 Sunday, Aug 30 · 7:00 PM (Tehran, UTC+3:30) 🎤 Shayan Shahrabi-Farahani 📄 "The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks" 🎥 On Google Meet 🔗 Schedule, links & past talks: learning-theory-circle.github.io Want to present a future session? Get in touch or open a PR on the webpage. See you Sunday! @SingularThinker
12 · 1.2K ·
A
Reply🐈‍⬛ Learning Theory Circle — Session 3 We're holding a biweekly reading group on the theory of deep learning. Every other Sunday, one person presents a paper followed by an open discussion. 🗓 Sunday, Aug 30 · 7:00 PM (Tehran, UTC+3:30) 🎤 Shayan Shahrabi-Farahani 📄 "The Lottery Ticket Hypot
Link
click to show
بچه ها واقعا توصیه میکنم که این ارائه ها رو از دست ندید و برای دوستاتون و تو گروه ها هم بفرستید. پیپری که شایان داره ارائه میده ۶ هزار ارجاع داره از سال ۲۰۱۹ که نشونه اهمیت زیاد این موضوع هست. و ارزش افزوده این جلسه صرفا ارائه ما نیستش اون گفتگویی هست که بعدش شکل میگیره و در نهایت داریم سعی میکنی در مسیر community شدن هم پیش بریم. تازه کسایی که جلسات رو فعالانه شرکت میکنن و تا آخر میمونن به After party هم دعوت میشن. فیلم جلسات قبلی رو در یوتیوب میتونید ببینید: https://www.youtube.com/watch?v=8z3oVPGt3eA&t=17s https://www.youtube.com/watch?v=Kp-tXx1AMBE&t=2737s&pp=0gcJCRMMAYcqIYzv
16 · 1.3K ·
A
Abolfazl
Link
click to show
امشب صحبتمون با آرین رو با یه چالش(فردا پستش میکنم سوال چی بود) شروع کردم و مثل همیشه چند تا چیزم ازش یاد گرفتم بعد در مورد ساختار شبکه تو سطح توزیع ترافیک صحبت کردیم و بعد رسیدم به این ویدیو بهتون پیشنهاد میکنم: https://www.youtube.com/watch?v=9GSH8tVnCqs
17 · 1.1K ·
Abolfazl
Replyامشب صحبتمون با آرین رو با یه چالش(فردا پستش میکنم سوال چی بود) شروع کردم و مثل همیشه چند تا چیزم ازش یاد گرفتم بعد در مورد ساختار شبکه تو سطح توزیع ترافیک صحبت کردیم و بعد رسیدم به این ویدیو بهتون پیشنهاد میکنم: https://www.youtube.com/watch?v=9GSH8tVnCqs
خب مسئله چی بود؟ فرض کنین یه HTTP server داریم که فقط یه رکویست می‌گیره و مثلا زمان فعلی رو برمیگردونه. رکویست وارد ماشین میشه و از NIC و TCP stack رد میشه، میرسه به لایه ی اپلیکیشن و در نهایت میوفته توی controller فریمورک ما. حالا دقیقا همون‌جا breakpoint می‌ذاریم و پروسس رو pause می‌کنیم. فرض هم می‌کنیم هیچ timeout، proxy یا مکانیزم دیگه‌ای توی این فاصله کانکشن رو نبنده، پس TCP connection همچنان بازه. حالا سوال اینه: اگه به هر روشی از یه پروسس دیگه به همون سوکت دسترسی پیدا کنیم، میتونیم قبل از اینکه پروسس اصلی ادامه پیدا کنه، یه HTTP response فیک روی همون کانکشن برای کلاینت بفرستیم؟ در حالت عادی نه، چون fdها داخل هر پروسس معنی دارن. یعنی fd شماره‌ی 10 توی پروسس A لزوما هیچ ربطی به fd شماره‌ی 10 توی پروسس B نداره. ولی اگه پروسس دوم واقعا reference همون socket رو داشته باشه، مثلا از طریق fork، پاس دادن fd با SCM_RIGHTS یا مکانیزم‌هایی مثل pidfd_getfd، اون پروسس هم می‌تونه روی همون socket send() یا write() انجام بده. اینجا TCP هیچ مشکلی با قضیه نداره؟ معلومه نه، TCP اصلا نمی‌دونه این write() رو کدوم PID انجام داده و براش مهم هم نیست. هر دو پروسس دارن روی همون سوکت کرنل می‌نویسن و کرنل همون TCP state مشترک رو مدیریت می‌کنه: sequence numberها، ACKها، retransmission، segmentation و بقیه‌ی ماجرا و یعنی اگه پروسس دوم روی همون سوکت واقعی send() بزنه، قرار نیست sequence numberها قاطی بشن و از دید TCP فقط یه byte stream وجود داره. نکته‌ی مهم اینه که این با raw packet injection فرق داره. اگه از همون سوکت معمولی استفاده کنیم، کرنل کاملا در جریان داده‌ایه که ارسال شده و TCP state رو درست جلو میبره. ولی اگه خارج از اون سوکت با packet دست‌ساز با sequence number دستی تزریقی انجام بشه کرنل ممکنه اصلا ندونه این بایت ها ارسال شدن و وضعیت خودش با کلاینت همگام نباشه. حالا سوال اصلی: کلاینت میفهمه اون پروسسی که قرار بوده جواب بده pause بوده و یه پروسس دیگه جواب رو نوشته؟ در سطح TCP و HTTP نه کلاینت به یه PID وصل نیست؛ به یه TCP connection وصله. روی سیم هم در نهایت چیزی به اسم PID یا «این bytes رو فلان پروسس که خسته بود نوشته» نداریم. اگه پروسس دوم واقعا به همون سوکت دسترسی داشت
15 · 1K ·
A
Audio
02-Juniors and AI agents.mp3 · 21.6 MB · click to show
🎙 گزارش کار #۲ — جونیورها و AI Agentها این اپیزود از یه سؤال شروع شد: وقتی AI Agentها دارن بخش بزرگی از کار توسعه نرم‌افزار رو انجام می‌دن، تکلیف جونیورها چی می‌شه؟ بحث فقط این نیست که AI می‌تونه سریع‌تر کد بنویسه. مسئله اینه که بخش زیادی از چیزهایی که یه برنامه‌نویس تازه‌کار قبلاً با انجام‌دادنشون یاد می‌گرفت — سرچ کردن، اشتباه کردن، دیباگ کردن، خوندن کد بقیه و کلنجار رفتن با مسئله — حالا می‌تونه به یک Agent سپرده بشه. از اون طرف، همین ابزارها می‌تونن یه جونیور رو خیلی زودتر وارد مسئله‌های واقعی و کارهای جدی‌تر کنن. توی این قسمت درباره همین تناقض حرف می‌زنم؛ اینکه AI Agentها چه تغییری توی مسیر رشد توسعه‌دهنده‌های تازه‌کار ایجاد می‌کنن و شاید سؤال درست دیگه این نباشه که: «AI جای جونیورها رو می‌گیره؟» بلکه این باشه: «جونیوری که قراره کنار AI کار کنه، باید چه چیزهایی بلد باشه؟» 🎧 حدود ۲۲ دقیقه 🎙 گزارش کار — اپیزود دوم Juniors & AI Agents اگه با جونیورها کار می‌کنید، خودتون اول مسیر توسعه‌اید، یا این روزها Agentها بخش جدی‌ای از کارتون شدن، خیلی دوست دارم بعد از شنیدنش نظرتون رو بدونم. #گزارش_کار #هوش_مصنوعی #AIAgents #برنامه_نویسی #توسعه_نرم_افزار
26 · 789 ·
A
Abolfazl
Link
click to show
توییتر یه سری پروژه پیشنهاد داده بودم که توشون async io هم بود که یکی از بچه ها گفت هرکسی میخواد async رو بزنه tehrun بزاره اسمش رو، دیدم اسم جالبیه و خودمم همچین چیزی برای پروژه ی سیمکارت نیاز داشتم تا از شر boost خلاص بشم، پس دست بکار شدم و این ریپوی async io رو با سی++ نوشتم و امروز هم بهش با کمک کلاد opus ساپورت darwin و android رو ادد کردم، بسیار زیبا شد: https://github.com/tehrun-cpp/tio این یه لایه ی نازک ابسترکشن از پروژه ی ته‌ران هست. ماژول های بعدی هم به حالم بستگی داره که توسعه بدم یا نه به ریپو استار بدین هم خوشحال میشم @knowpow
8 · 947 ·
A
Abolfazl
Photo
click to show
یه نفر عدد RSA-260 رو که ۳۵ سال کسی نتونسته بود بشکنه، فاکتور گرفته. این عدد ۲۶۰ رقمی که حاصل‌ضرب دو عدد اول مخفی بود و اساس چالش معروف رمزنگاری RSA از سال ۱۹۹۱ بود، الان بزرگ‌ترین عدد RSA شکسته شده تا امروز شده. سال ۲۰۲۰ عدد قبلی یعنی RSA-250 رو پیدا کردن ولی کامپیوتینگ عظیمی پشتش بود، به عبارتی برای شکستن عدد قبلی حدود ۲۷۰۰ سال/‌هسته لازم شد. بزارین با عدد حساب کنم تا روشن بشه: اگه بگیم ۱۰۰ تا ماشین ۶۴ هسته ای از امازون بگیریم و اینارو به هم وصل کنیم تا همگی با هم پردازش کنن و هزینه ی network و latency بینشون رو هم نسنجیم میتونیم بگیم برای این کار ۶۴۰۰ هسته داریم، حالا اگه یه هفته (۱۶۸ ساعت) کار کنن همگی با هم حدود ۱۲۳ سال‌/هسته کار میکنن. یعنی اون ۱۰۰ تا ماشین تو یه هفته فقط حدود یک بیست و دوم کار مورد نیاز عدد قبلی رو انجام میدن. این عددی که داداشمون پیدا کرده خیلی سختتره @knowpow
17 · 1K ·
A
Abolfazl
Photo
click to show
بردی که ۱۱ روز طول کشید طراحیش کنم رو مدل Astra توی 2 ساعت زد! شماتیکش رو طراحی کرده بودم گفتم بزار مدل جدید رو تست کنم به فارسی بهش گفتم بیا اینو طراحی کن ولی توی التیومه! رفت خوند و تمام دیتابیس ها و دیتاشیت ها رو دانلود کرد، مدل های سه بعدی رو دانلود کرد و تمام! @knowpow
37 · 1.1K ·
A
Abolfazl
Replyبردی که ۱۱ روز طول کشید طراحیش کنم رو مدل Astra توی 2 ساعت زد! شماتیکش رو طراحی کرده بودم گفتم بزار مدل جدید رو تست کنم به فارسی بهش گفتم بیا اینو طراحی کن ولی توی التیومه! رفت خوند و تمام دیتابیس ها و دیتاشیت ها رو دانلود کرد، مدل های سه بعدی رو دانلود کرد و تمام! @knowpow
برای شروع خوبه، چینش رو خوب انجام داده ولی روتینگ اصلا خوب نیست و باید دستی انجام بشه، ولی توی کتابخونه ساختن با مدل های سه بعدی و footprint ها به شدت خوب عمل کرده، مثلا بهش گفتم میخوام به jlcpcb سفارش بدم کامل با اطلاعات اسمبلی و توضیحات هر قطعه برای کارخونه ساخته، حتی جایگزین هم بهشون داده که اگه موجود نبود اینو استفاده کنین
3 · 922 ·
A
Abolfazl
Photo
click to show
عکس بعدی برای ژانر سیاه سفید بعدی رو اختصاص میدم به علی جوان؛ فیزیکدانی که نقش خیلی مهمی توی شکل‌گیری فیزیک لیزر داشت و با William R. Bennett و Donald Herriott توی دانشگاه MIT اولین لیزر گازی هلیوم–نئون رو ساخت که بر خلاف نمونه های اولیه میتونست به صورت پیوسته کار کنه و همین موضوع راه رو برای کاربردهای گسترده تر لیزر مثل مخابرات و اندازه گیری و مسیریابی فضایی باز کرد @knowpow
1 · 967 ·
A
abolfazl
Photo
click to show
به‌به قراره عشق کنیما 🤘
3 · 986 ·
A
Abolfazl
اخه udp که سقفش ۱۵۰۰ بایت نیست و دیتاگرام udp میتونه تا حدود ۶۵ کیلوبایت باشه ولی مسيله ی واقعی mtu و ip fragmentation و خرابکاری middlebox ها مثل اوپراتور و سیستم های فیلترینگه نه اینکه امضا بزرگ شد پس دیگه udp جا نمیشه. dns هم به‌خاطر شکننده بودن fragmentation ترجیح میده tc=1 بده و روی tcp retry کنه @knowpow
2 · 858 ·
A
Abolfazl
این هارنسی که با ai نزدیک یه ساله دارم باهاش سر و کله میزنم و هی بهتر و بهترش میکنم رو بهش میگن حدودا spec driven development و توی تایملاین خارج منسوخ شده ولی توی تایم لاین داخل تازه داره ترند میشه، این کیتی که من ساختمم نمیشه گفت با spec ها پیش میره ولی حدودا شبیه اونه. یه سریا هم هستن که میگن نیازی نیست این همه داستان دور مدل بچینیم، این حرف هم حدودا درسته ولی نباید بیش از حد روی خود مدلای AI حساب باز کرد، فرقی نمیکنه Fable 5 باشه یا Opus 4.8. نهایتش این مدلا محتمل‌ ترین پیاده سازی آماری رو تولید میکنن که روشن train شدن و اون پیاده سازی بیشتر روی Happy Path متمرکزه نه تمام فضای مسئله ای که شما باهاش مواجه هستین اونچیزی که واقعا اهمیت داره سیستمیه که این مدلا رو توش به کار میگیرید و به هم متصل میکنید نه صرفا اینکه از کدوم مدل استفاده میکنید، اگه اشتباه باشه ممکنه fable 5 کارایی sonnet 3 رو هم نده باید با System Prompt و User Prompt بازی کنین برای هر agent یه Mental Model و Role مشخص تعریف کنین و خروجی های ساختاریافته ازشون بگیرین. از چند agent مستقل برای کد نوشتن و نقد کد و تست استفاده کنین و هر مرحله رو با یه نگاه متفاوت طراحی کنین اینجا بهش میگیم هارنس و به نظرم طراحی این سیستم از انتخاب خود مدل مهمتره. درسته که determenıstıc نییست ولی از اینکه مدل رو ول کنین برای خودش توی کدبیس بگرده مفیدتره و پروژه ای که ۸ ماه پیش ول کردین رو میتونین همین امروز ادامه بدین اینجا مدل‌ها موتور هستند؛ اما کیفیت محصول نهایی رو معماری سیستمی تعیین میکنه که اون موتور رو هدایت کنترل و راستی‌ آزمایی می‌کنه حواستون باشه برای ۵۰۰ خط کد زدن ۲۰۰۰ خط تست و هارنس و صدها ادابازی ارزنده ی دیگر اضافه نکنین 😄 البته این ساختاری نیست که بتونیم بگیم استاندارد داره، هر کسی روش خودشو داره @knowpow
14 · 769 ·
A
Abolfazl
Photo
click to show
ایده ‎typesafeai‎ خیلی جالب بود کنجکاو شدم بفهمم چقدرش از خود مدل میاد و چقدرش از نحوه ی سرو شدنش، یه نسخه لوکال ساختم تا بفهمم چی به چیه! چهار سوال درباره ی یه داکیومنت تو ~۲۰۰ میلی‌ثانیه روی M4 Pro، بدون اینکه چیزی آموزش داده بشه یا فاین تیون بشه.کالیبراسیون میخواد فقط. لوکال بدون API key https://github.com/aabolfazl/typesafe-local @knowpow
24 · 464 ·

An open public feed from the search index ChatCrawler — “Google for public Telegram”; refreshed as the venue is crawled. Times are UTC.

Public content only, official Telegram API. About · FAQ · What we do not do · Remove a page · Catalog · Search · How we count