<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های علیرضا ابراهیمی</title>
        <link>https://virgool.io/feed/@ali_reza_ebrahimi</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-07 09:21:01</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/6884/avatar/avatar.png?height=120&amp;width=120</url>
            <title>علیرضا ابراهیمی</title>
            <link>https://virgool.io/@ali_reza_ebrahimi</link>
        </image>

                    <item>
                <title>بررسی آماری داده‌های افشا شده از کاربران ایرانی تلگرام</title>
                <link>https://virgool.io/@ali_reza_ebrahimi/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A2%D9%85%D8%A7%D8%B1%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87%D9%87%D8%A7%DB%8C-%D8%A7%D9%81%D8%B4%D8%A7-%D8%B4%D8%AF%D9%87-%D8%A7%D8%B2-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%A7%D9%86-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86%DB%8C-%D8%AA%D9%84%DA%AF%D8%B1%D8%A7%D9%85-bdw1ad33flkk</link>
                <description>روز ۳۰ام مارس سال ۲۰۲۰ گزارشی  در مورد افشای اطلاعات ۴۲ میلیون رکورد از یکی از سامانه‌های حفاظت نشده ایرانی منتشر شد. از همان ساعت‌های ابتدایی انتشار این خبر نظرات مختلفی در مورد مبدا نشت این اطلاعات و خطراتی که متوجه کاربران ایرانی تلگرام خواهد بود ارائه شد. اما عدم امکان دسترسی به این اطلاعات کار بررسی بیشتر برای کارشناسان امنیتی را در این زمینه دشوار کرده بود. البته در همین زمان بعضی کارشناسان امنیتی با دسترسی به این داده‌ها امکان بررسی افشا شدن را به کاربران دادند اما تحلیل بیشتری تا امروز روی این داده‌ها منتشر نشده است.با بررسی این داده‌ها سعی کردیم به چندین سوال در مورد این داده‌ها و البته بررسی برخی شاخص‌های آماری در مورد کاربران ایرانی بپردازیم که در این گزارش آن‌ها را شرح می‌دهیم.حجم داده‌های افشا شده چقدر است؟کل داده‌هایی که در دسترسی ما قرار داشت شامل 42,823,956 رکورد می‌شود که با ادعای گزارش‌های اولیه مطابقت می‌کرد. این تعداد رکورد شامل 35,859,697 شماره تلفن مختلف هستند که نشان دهنده تکرار شدن برخی شماره تلفن‌ها در این لیست است.بررسی ما روی رکوردهای تکراری نشان می‌دهد تفاوت میان این رکوردها در مقدار access_hash (در مورد این مشخصه در ادامه کامل توضیح داده شده است) آن‌هاست. این به این معنی است که این داده‌ها توسط سیم‌کارت‌های مختلفی جمع‌آوری شده‌اند. در داده‌های نشت شده در بدترین حالت یک شماره تلفن 2585 تکرار شده است و این به این معنی است که در فرآیند جمع‌آوری این داده‌ها از اقلا 2585 کاربر مختلف (سیم کارت استفاده شده برای ساخت حساب تلگرام برای خزش) استفاده شده است.یکی دیگر از نکاتی که در مورد شماره‌های تکراری وجود دارد تغییر زمان last seen و تصویر نمایه این شماره‌ها در دیتاست است. دیدن این رفتار در داده‌ها به نظر من ناشی از آپدیت دوره‌ای داده‌ها در طول زمان است.این داده‌ها مربوط به چه زمانی هستند؟در نمونه داده‌هایی که در اختیار ما قرار گرفته بود تنها مشخصه‌ای که مربوط به زمان می‌شد status.was_online و status.expires بود که به نظر ما آخرین زمان آنلاین بودن کاربر را نشان می‌داد. با این فرض و اینکه مقدار عددی این مشخصه احتمالا نشان دهنده زمان در قالب *UNIX epoch خواهد بود، مقدار حداکثر این فیلد را به دست آوردیم:MAX(status.was_online) = 1568761603 -&gt; 2019-09-17T23:06:43+00:00MAX(status.expires) = 1568762833 -&gt; 2019-09-17T23:27:13+00:00این مقدار معادل با سه شنبه ۱۷ سپتامبر ۲۰۱۹ میلادی است. به نظر می‌رسد داده‌های افشا شده در جدیدترین حالت مربوط به این حوالی است. البته ما احتمال می‌دهیم این داده‌ها به صورت دوره‌ای به روز رسانی می‌شدند پس لزوما همه این اطلاعات افشا شده مربوط به این زمان نیستند. پر واضح است که این مقدار فقط برای کاربرانی که مقدار last seen آن‌ها به صورت عمومی قابل مشاهده است مکشوف است و در رکوردهای زیادی این مقدار خالی است.با مقایسه این تاریخ‌ها با زمان از کار افتادن پوسته‌های معروف تلگرام مثل تلگرام طلایی (۱ تیر ۹۸) می‌توان نتیجه گرفت این اطلاعات از منبع دیگری جمع‌آوری شده‌اند.کاربران ایرانی تلگرام چقدر و چطور آنلاین هستند؟داده‌های مربوط به آخرین زمان آنلاین کاربران از نظر آماری جذابیت بیشتری برای ما داشت و به همین خاطر سعی کردیم دنبال جزئیات بیشتری در مورد این مشخصه باشیم. اولین مورد مربوط به مقادیر last seen کاربران می‌شد. در شکل زیر نمودار فراوانی مقادیر این مشخصه را مشاهده می‌کنید.userStatusOffline -&gt; 28,511,135userStatusOnline -&gt; 386,802userStatusRecently -&gt; 9,590,035userStatusLastWeek -&gt; 862,257userStatusLastMonth -&gt; 1,171,393با بررسی این مقادیر مشخص می‌شود تعداد کاربران فعال ایرانی که در کمتر از یک ماه اخیر به تلگرام سر زده‌اند در این مجموعه داده 39,350,229 مورد است.علاوه بر این نمودار میله‌ای از این مشخصه در طول زمان تهیه کردیم، بر خلاف انتظار در این نمودار به صورت متناوب قله دارد، این رفتار می‌تواند به سه صورت توجیه شود در اولین تلاش به نظر می‌رسد این رفتار متفاوت به خاطر آپدیت کردن دوره‌ای اطلاعات کاربران است یعنی در زمان‌هایی که با پیک مواجه شدیم داده‌های بخشی از کاربران آپدیت شده‌اند و تا پیک بعدی این داده‌ها آپدیت نشده‌اند. اما با مطابقت تاریخ‌های قله‌ها با مناسبت‌های تقویم ایران می‌توان تحلیل متفاوتی ارائه داد. اولین پیک که مربوط به آپریل ۲۰۱۹ است دقیقا مطابق با نوروز سال ۹۸ است. بنظر این امر نشان‌دهنده تاثیر تعطیلات نوروز و تبریک کاربران در این زمان از طریق تلگرام است. قله‌های بعدی این نمودار مربوط به انتهای خرداد، اوایل مرداد و اوایل شهریور ماه است مطابقت این تاریخ‌ها با مناسبت‌های مختلف ما را به نتیجه خاصی نرساند و در عوض یکسان بودن دوره‌های پیک، نظریه آپدیت دوره‌ای اطلاعات را تقویت کرد. سناریو دیگری که برای توجیه قله‌های موجود در نمودار به نظر ما رسید با توجه به تکرار شماره تلفن‌ها با access_hashهای متفاوت بوده است. در این صورت این ممکن است قله‌ها به خاطر banشدن یا از دست رفتن اکانت‌های خزنده ایجاد شده باشند، به این معنی که استفاده از سیم‌کارت‌های موقت (احتمالا خارجی) باعث مشکوک شدن تلگرام و حذف اکانت‌ها شده است و مقدار last seen کاربران با از دست رفتن اکانت خزنده دیگر آپدیت نشده است. البته این داده‌ها با اکانت‌های دیگری مجددا آپدیت شده اند.آیا اسامی استفاده شده در این داده‌ها صحیح هستند؟یکی از موارد مشکوکی که از ابتدا در مورد این داده‌ها بیان می‌شد، عدم مطابقت اسامی رکوردها با usernameهای متناظرشان بود. این امر فرضیه ساختگی بودن این اسامی را تقویت می‌کرد. علاوه بر این با مرور روی این داده‌ها اسامی پرکاربرد ایرانی مانند «امیر»، «علی»، «محمد» و ... که ریشه عربی دارند اصلا در داده‌ها مشاهد نمی‌شد. به این ترتیب فرض ساختگی بودن نام و نام خانوادگی استفاده شده در داده‌ها تقویت شد و ما تصمیم گرفتیم شواهد بیشتری در تایید این فرض پیدا کنیم.قدم اول در بررسی اسامی، پیدا کردن فراوانی هر نام در داده‌های فاش شده بود. در جدول زیر فراوانی ۲۰ نام پر استفاده در این داده‌ها را مشاهده می‌کنید: https://gist.github.com/alireza-ebrahimi/00ae7a294844f6a71b3a5daeb4d63e94 به استثنای ۵ نام اول لیست که در حدود ۱۲۰هزار بار تکرار شده‌اند، بقیه اسامی (داده‌های مربوط به ۱۰۰۰ نام پرتکرار بررسی شده است) در حدود ۶۰ هزار بار تکرار شده اند. الگویی که در صورت واقعی بودن نام‌ها اصلا مورد انتظار نبود. این الگو شبیه رفتار برنامه‌هایی است که با توزیع یکنواخت از یک لیست نام انتخاب می‌کنند. اما در این میان ۵ نام پراستفاده نشانه‌ای بر رد این فرضیه بود. از طرفی دو برابر بودن فراوانی این نام‌ها این شک را در ما ایجاد کرد که احتمالا در لیست اسامی اولیه این نام‌ها ۲ بار تکرار شده‌اند. با این فرضیات سعی کردیم این لیست اسامی را در اینترنت پیدا کنیم. با جستجوی عبارت «لیست اسامی ایرانی» در گوگل و بررسی نتایج پیدا شده به این لیست در سایت عصرایران برخوردم. نکته جالب در مورد این اسامی این است که این لیست دقیقا مطابق لیست اسامی استفاده شده در دیتاست افشا شده است و البته ۵ نامی که در داده‌ها تقریبا ۲ برابر دیگر اسامی استفاده شده‌اند در این لیست ۲ بار تکرار شده‌اند. با توجه به شواهد و قرائن ما مطمئنیم که اسامی استفاده شده در داده‌ها به صورت تصادفی از لیست اسامی مذکور ساخته شده‌اند.بررسی آماری نام‌های خانوادگی این دیتاست خیلی زودتر به نتیجه رسید. در جدول زیر ۲۰ نام‌خانوادگی پراستفاده در این داده‌ها را مشاهده می‌کنید: https://gist.github.com/alireza-ebrahimi/68ff06f3fa1f757a38218d9d7bf04947 مجددا همان ۵ نام که البته به همراه پسوند «ی» استفاده شده‌اند. بررسی بیشتر نشان‌داد تمامی نام‌خانوادگی‌هایی که در این داده‌ها استفاده شده‌اند معادل لیست نام‌های استفاده شده به همراه پسوند «ی» هستند. بنابراین علاوه بر نام‌ها، نام‌های خانوادگی نیز به صورت تصادفی از یک لیست از پیش تعیین شده انتخاب شده‌اند و در کل نام و نام خانوادگی که در رکوردها استفاده شده است معتبر نیستند. دلیل استفاده از نام‌های ساختگی در این داده‌ها از نظر من استفاده از این نام‌ها برای ایجاد contactهای ساختگی برای گول زدن تلگرام بوده است. به همین دلیل سعی شده از نام‌هایی با ظاهر معتبر استفاده شود.آیا اطلاعات خصوصی کاربران مثل چت‌ها و کانال‌ها افشا شده است؟در داده‌هایی که به دست ما رسیده است تنها اطلاعات مربوط به contactهای کاربران موجود است. این اطلاعات شامل فیلدهای زیر است:نام کاربری: برای آن دسته از کاربرانی که نام کاربری (همان نامی که با @ شروع می‌شود) برای خود انتخاب کرده‌اند، این مقادیر افشا شده است.کد کاربری: یک کد داخلی است که برای مشخص شدن هر کاربر در تلگرام استفاده می‌شود، این کد برخلاف نام کاربری که به انتخاب کاربر مشخص می‌شود، از زمان تشکیل حساب مشخص می‌شود و قابل عوض کردن نیست مگر با پاک کردن اکانت تلگرام.اطلاعات آخرین بازدید: همانطور که پیشتر هم اشاره کردیم، اطلاعات مربوط به آخرین بازدید کاربران نشت شده است.تصاویر نمایه: اصل تصاویر نمایه کاربران در این داده‌ها نشت پیدا نکرده است اما اطلاعاتی که با استفاده از آن‌ها می‌توان با درخواست به API تلگرام به این فایل‌ها دست پیدا کرد در این داده‌ها موجود است. این تصاویر شامل ۲ تصویر است که یکی مربوط به اندازه کوچک تصویر نمایه است و دیگری همان تصویر با رزولوشن بالاتر است.چکیده دسترسی: یکی از مقادیری که در نمونه داده‌های نشت شده مورد توجه قرار گرفت مشخصه access_hash بود. با بررسی مستندات مربوط به telegram API می‌توان متوجه شد هر کاربر برای ارتباط با موجودیت‌های تلگرام (گروه، کانال، کاربر، و ...) علاوه بر کدکاربری به یک چکیده دسترسی هم نیاز دارد. نکته در مورد این چکیده این است که مقدار چکیده برای هر دو جفت کاربر متفاوت است. یعنی یک مهاجم با استفاده از access_hashهای نشت شده در این دیتاست به بقیه اطلاعات کاربر دست پیدا کند. این چکیده برای تعامل با کاربر مورد استفاده قرار می‌گیرد. به عنوان مثال شما به تنهایی با داشتن کدکاربری نمی‌توانید برای یک کاربر پیام بفرستید و نیاز به access_hash برای این کار دارید. اما در صورتی که نام کاربری یک کاربر در دسترس باشد، به راحتی هر کاربر می‌تواند به access_hash آن کاربر دسترسی پیدا کند و با او تعامل کند. در ادامه در مورد این مشخصه در telegram API بیشتر توضیح می‌دهیم.شماره تلفن: مهم‌ترین بخش از رکوردهای نشت شده مربوط به شماره تلفن همراه هر کاربر است. با استفاده از این مشخصه و موارد بالا، در صورتی که یک مهاجم به این داده‌ها دسترسی پیدا کند می‌تواند از طریق چت کردن با یک کاربر (که اطلاعاتش نشت شده) به شماره تلفن او دسترسی پیدا کند. در واقع در صورتی که یک مهاجم بتواند صفحه پروفایل یک کاربر ببیند (از طریق نام کاربری، عضویت در گروه مشترک و ...) می‌تواند به کدکاربری او دسترسی پیدا کند و نهایتا به شماره تلفن او برسد.علاوه بر این‌ها اطلاعات دیگری مانند چت‌ها، مخاطبین، فایل‌ها و بقیه موارد مشابه از کاربران در این مجموعه داده وجود ندارد. در این بخش قصد داریم تا بیشتر در مورد مفهوم access_hash در telegram API توضیح دهیم. همانطور که پیشتر توضیح دادیم برای بسیاری از API callها در تلگرام علاوه بر userid به یک access_hash نیز نیاز است. این مقادیر در نوع داده‌ای InputPeerUser جا می‌گیرند که در توابع زیادی مورد استفاده هستند. معرفی چنین مشخصه‌ای برای جلوگیری از امکان brute force روی useridهای تلگرام برای بدست آوردن اطلاعات پروفایل آن‌هاست است. در برخی از توابع که نیاز به دانستن access_hash نیست، نوع داده‌ای PeerUser مورد استفاده قرار می‌گیرد که صرفا شامل userid است. داشتن Peer برای شناسایی یک کاربر کفایت می‌کند اما برای ایجاد درخواست با آن‌ها کافی نیست. برای اینکار نیاز به access_hash داریم تا به InputPeerUser برسیم. به صورت کلی مشخصه access_hash از طریق ایجاد کنش با کاربر قابل دسترسی است. این کنش‌ها شامل داشتن شماره تلفن کاربر، وجود کاربر در دیالوگ‌های تلگرام، فوروارد پیام از کاربر یا دیدن لیست کاربران گروه است**.شماره‌های موبایل مربوط به چه اپراتورهایی هستند؟یکی دیگر از مواردی که در راستی‌سنجی داده‌های نشت شده مورد نظر من بود، بررسی توزیع رکوردها براساس اپراتورهاست. همانطور که در شکل زیر مشاهده می‌کنید توزیع فراوانی رکوردهای مربوط به هر اپراتور همراه مشخص شده است.برای مقایسه این آمار با داده‌های واقعی به گزارش رگولاتوری که در دی‌ماه ۹۸ منتشر شده است استناد کردیم. بر اساس این گزارش تعداد مشترکین همراه اول، ایرانسل، و رایتل به ترتیب حدودا ۶۲ میلیون، ۵۰ میلیون و ۴ میلیون گزارش شده است که به ترتیب معادل ۵۳ درصد، ۴۳ درصد، و ۳ درصد کل شماره‌های همراه کشور هستند. شباهت این آمار با داده‌های نشت پیدا کرده سند دیگری بر کامل بودن این داده‌ها و همچنین درست بودن شماره تلفن‌های این مجموعه داده است.علاوه بر این در جدول زیر لیست تعداد رکوردهای هر پیش‌شماره ارائه شده است که می‌تواند برای محققین این حوزه جالب توجه باشد***. https://gist.github.com/alireza-ebrahimi/d43897089460b3ab811c083189adf021 کلام آخراستفاده از تکنیک‌های جمع‌آوری اطلاعات از داده‌های آشکار یکی از پراستفاده‌ترین روش‌های جمع‌آوری گسترده داده‌ها است. اما از طرفی ضعف در نگه‌داری این داده‌ها باعث بروز مشکلاتی در سطح گسترده برای کاربران اینترنتی ایران خواهد شد. از طرفی در این افشای اطلاعات ساده‌ترین موارد امنیتی در مورد داده‌های با اهمیت مانند محافظت با رمز عبور انجام نشده بود و این امر نشان‌دهنده پایین بودن درجه حفاظت از اطلاعاتی به این مهمی است. در این مورد خاص استفاده از موتور جستجوی Elasticsearch که به صورت پیشفرض از سازوکار نام‌کاربری و رمز عبور استفاده نمی‌کند باعث بروز چنین نشت اطلاعاتی بوده است. با توجه به موارد ذکر شده در این گزارش، قوی‌ترین فرضیه در مورد چگونگی جمع‌آوری این داده‌ها، ساخت contact ساختگی با نام فیک و شماره تلفن‌های موبایل و بررسی آن‌ها در تلگرام است. و به‌نظر ما احتمال نشت این اطلاعات از طریق پوسته‌های تلگرامی منتفی است.علاوه بر این، این داده‌ها نشان‌دهنده شدت استفاده از تلگرام به عنوان یک پیام‌رسان فیلتر شده در میان کاربران ایرانی است. بنظر من این شواهد می‌تواند نشان‌دهنده شکست رویکرد فیلترینگ تلگرام در ایران باشد. رویکردی که باعث شده ده‌ها میلیون ایرانی به صورت مستمر از ابزارهای دور زدن فیلترینگ استفاده کنند که در تضاد با هدف اولیه فیلترینگ از نظر دست‌اندرکاران فیترینگ، یعنی حفاظت از افراد در برابر محتوای نامناسب است.* نشان‌دهنده تعداد ثانیه‌هایی است که از مبدا زمان در سیستم‌عامل لینوکس یعنی نیمه شب اول ژانویه 1970 گذشته است، این قالب برای کد کردن زمان در سامانه‌های رایانه‌ای بسیار رایج است. ** برای کسب اطلاعات بیشتر در مورد این خصیصه به مستندات telethon در این مورد مراجعه کنید*** برای مشخص کردن پیش‌شماره‌های هر اپراتور از این مقاله ویکیپدیا کمک گرفتیم</description>
                <category>علیرضا ابراهیمی</category>
                <author>علیرضا ابراهیمی</author>
                <pubDate>Thu, 09 Apr 2020 19:09:17 +0430</pubDate>
            </item>
                    <item>
                <title>از اونجا تا به دماوند چند گراده؟</title>
                <link>https://virgool.io/@ali_reza_ebrahimi/%D8%A7%D8%B2-%D8%A7%D9%88%D9%86%D8%AC%D8%A7-%D8%AA%D8%A7-%D8%A8%D9%87-%D8%AF%D9%85%D8%A7%D9%88%D9%86%D8%AF-%DA%86%D9%86%D8%AF-%DA%AF%D8%AF%D8%A7%D8%B1%D9%87-m4brxjaae0mr</link>
                <description>شاید برای شما هم مثل من تا یک ساعت پیش این سوال پیش نیومده بود که قله دماوند رو حداکثر از چه فاصله ای میشه دید. از بین سوال هایی که یک آدم مثل من براشون جواب نداره ولی میتونه بره دنبال جوابش، انتخاب این سوال برای جواب دادن حتی برای خودم هم تا حد خوبی عجیبی بود ولی خب الان میتونید یکی از سوالات اون لیست رو با مداد خط بزنید.اما چی شد که کنجکاو شدم به این مساله جواب بدم، اصل قضیه از توییت یکی از کاربران توییتر که تصویری از دماوند رو از اطراف قم رو به اشتراک کذاشته بود شروع شد و بحثی که حول محور این عکس و عکسی که قبلا از دماوند از اطراف کوه کرکس در استان اصفهان منتشر شده بود، شکل گرفت. شک و تردیدها شدت گرفت و باید مشخص میشد اصالت اون عکس از نظر علمی درسته یا نه :). اما آیا از فاصله ۲۸۰ کیلومتری میشه دماوند رو دید؟ اگه حال خوندن ریاضیات قضیه رو ندارید جواب مثبته ولی اگه قانع نشدید با ما همراه باشید!بیاید مساله رو مدل کنیم، بیاید فرض کنیم که زمین گرده که البته نیست، ما میخوایم ببینیم حداکثر فاصله بین دو نقطه که در ارتفاع a و b از سطح زمین قرار دارند چقدره که بشه اونها رو با خط مستقیم دید. همونطور که توی تصویر میبینید با به دست آوردن زاویه آلفا میتونیم حداکثر فاصله رو به دست بیاریم. پس قلم ها رو در بیارید که قراره معادله حل کنیم.مساله ما الان پیدا کردن شیب خط مماس به دایره است و از اونجایی که حس پیدا کردن فرمول قضیه رو نداشتم با یه خورده سرچ رسیدم به این لینک و در نتیجه رسیدم به این فرمول:و در کنار این میدونیم خط مماس مورد نظر ما از سر قله کرکس هم میگذره، پس مختصات اون نقطه رو تو معادله خط میگذاریم و معادله رو برای بدست آوردن آلفا حل میکنیمحالا با حل کردن این معادله درجه ۲ مقدار سینوس آلفا بدست میاد. و با یک arcsin میشه آلفا رو بدست آورد.برای این کار اما یک تکه کد کوچک نوشتم که آلفا رو به دست میاره.حالا برای به دست آوردن حداکثر فاصله کافیه زاویه آلفا رو ضرب در شعاع زمین بکنیم. که نتیجه رو برای مقادیر ارتفاع کوه دماوند که ۵.۶۱ کیلومتره و کوه کرکس که ۳.۸۷ کیلومتره و شعاع زمین که ۶۳۷۱ کیلومتره محاسبه میکنیم.بینگو! ۴۸۹ کیلومتر که ۲۰۰ کیلومتر بیشتر از فاصه بین دو نقطه است...سوال دیگه ای که حالا میشه بهش جواب داد اینه که از قله کرکس، چقدر از دماوند رو میشه دید؟ فقط سر قله یا تا کمر کوه یا پایین کوه هم دیده میشه؟ برای همین با مقدار ارتفاع قله دماوند بازی کردم تا حداکثر فاصله بشه ۲۷۹ کیلومتر و جواب شد ۲۶۰ متر. یعنی از سر قله کرکس شما میتونید تقریبا همه دماوند رو ببینید (از ارتفاع ۲۶۰ تا ۵۶۱۰ متری)یک نتیجه جانبی دیگه هم که از این برنامه میشه گرفت اینه که اگه قد آدمیزاد رو ۱۸۰ سانتیمتر در نظر بگیریم، آدم تو ارتفاع سطح دریا فقط ۴.۷۸ کیلومتر اونطرف تر از خودش رو میتونه ببینه (طبیعتا زمین صاف و اینا وگرنه که کوه های خیلی دور رو هم میتونه ببینه)البته کدی که زدم فقط یکی از ریشه های معادله رو به دست میاره که میتونید یکم دستکاری کنید تا هر دو ریشه رو بررسی کنید و برنامه بدون باگ بشه ولی نظر شخصی من اینه که باگ نمک برنامه است.</description>
                <category>علیرضا ابراهیمی</category>
                <author>علیرضا ابراهیمی</author>
                <pubDate>Thu, 13 Dec 2018 02:12:46 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی کد جاوا کلاینت تلگرام طلایی</title>
                <link>https://virgool.io/@ali_reza_ebrahimi/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%DA%A9%D8%AF-%D8%AC%D8%A7%D9%88%D8%A7-%DA%A9%D9%84%D8%A7%DB%8C%D9%86%D8%AA-%D8%AA%D9%84%DA%AF%D8%B1%D8%A7%D9%85-%D8%B7%D9%84%D8%A7%DB%8C%DB%8C-jpvsc7dtthyq</link>
                <description>تلگرام طلاییاین پست حاوی نکات فنی و تحلیل کد تلگرام طلایی است. لطفا پیش از مطالعه این متن، این پست را مطالعه فرمایید.روش دانلود برنامه و دیکامپایل تلگرام طلاییما دو نسخه ۵.۳.۵ و ۵.۴.۲ (آخرین نسخه تا ۵ تیر ۹۷) را مورد بررسی قرار دادیم: 1. org.ir.talaeii.fl-5.3.5.apk  Checksum:490a561a40d7b474c19c8143731bb4cb Download 2. org.ir.talaeii.fl-5.4.2.apk  Checksum:d56d974f6938d156fd764942ea30723c  Downloadاین دو نسخه با ابزار jadx و با سوئیچ deobf دیکامپایل شدند. نسخه ۵.۳.۵ به راحتی به کد نامبهم تبدیل شد درحالی‌که میزان مبهم‌سازی در نسخه ۵.۴.۲ به مراتب بیشتر بود و کدهای تولید شده تا حدی ناخوانا بودند. به همین دلیل تصاویری که از کد وجود دارد مربوط به کدهای دیکامپایل شده نسخه ۵.۳.۵ هستند ولی مشابه همین کد‌ها در نسخه ۵.۴.۲ وجود دارند. کدهای دیکامپایل شده هر دو نسخه را می‌توانید از این لینک مشاهده و دانلود کنید.کانال پنهان تلگرام طلایی برای ارسال دستورات به کلاینتبا بررسی‌های ما مشخص شد که تلگرام طلایی از روش‌های متعددی برای دریافت اطلاعات شخصی کاربر و انجام عملیات غیرمجاز (واضحا بدون اطلاع او) استفاده می‌کند. در این گزارش ما به چند روش اشاره خواهیم کرد. لازم به ذکر است که هر چه ما بیشتر جستجو می‌کردیم روش‌های مختلف بیشتری برای اعمال نفوذ غیرقانونی و ابزارهای سرقت اطلاعات بر می‌خوردیم. نمونه‌های زیر تنها روش‌هایی است که موفق به کشف آن‌ها شدیم و ممکن است روش‌های مختلف دیگری نیز وجود داشته باشد. به نظر می‌رسد تلگرام طلایی مبتنی بر کد هاترگام (hotgram) است. زیرا که حتی نام برخی کلاس‌ها و توابع hotgram بود. برخی از سرورهایی که تلگرام طلایی با آن‌ها در ارتباط بود نیز عبارت hotgram درون نام دامنه آن‌ها وجود داشت. عبارت sls که نماد شرکت سازنده هاتگرام به نام راهکارهای سرزمین هوشمند (sls.ir) است نیز به وفور در کد یافت می‌شود. اکثر کدهای حاوی قابلیت‌های غیرقانونی تلگرام طلایی در پکیج customization قرار دارند به همین دلیل ما روی این پکیج تمرکز کردیم. البته تعدادی کد مخرب به برخی توابع اصلی تلگرام نیز اضافه شده است که آن‌ها را نیز بررسی خواهیم کرد. تلگرام طلایی چگونه فعالیت غیر قانونی از سمت کاربر انجام می‌دهد؟تلگرام طلایی از یک کتاب‌خانه push notification به نام OneSignal استفاده می‌کند و دستورات خود را از طریق آن دریافت می‌کند. کلاس handleRequest و تابع handlePush  مسئول تشخیص و اجرای دستورات سرور هستند: کد تابع handlepush* هر کدام از caseها یک نوع دستور خاص است که از سرور دریافت می‌شود (لینک گیت‌هاب)کلاس HandleRequestاین کلاس وظیفه ارسال و دریافت اطلاعات از سرورهایی غیر از سرورهای اصلی تلگرام (در اینجا از عبارت سرورهای تلگرام طلایی استفاده می‌کنیم) را بر عهده دارد. این کانال ارتباطی بر اساس تکنولوژی Rest کار می‌کند و هم دستوراتی از جنس GET دارد و هم از جنس POST که به ترتیب برای دریافت اطلاعات و ارسال اطلاعات استفاده می‌شوند.قابلیت push notification یک کانال یک طرفه از سمت سرور به سمت کلاینت است و سرور می‌تواند پیغام خاصی را به سمت کلاینت‌ها یا یک کلاینت خاص ارسال کند اما جوابی دریافت نمی‌کند. در تلگرام طلایی کلاس HotgramNotification وظیفه مدیریت نوتیفیکشن‌ها را برعهده دارد و سازنده برنامه می‌تواند با ارسال نوتیفیکشن گروهی یا حتی هدف‌دار برای یک کاربر خاص عملیات خاصی را روی کلاینت آغاز کند. تلگرام طلایی از طریق push notification دستورات خاصی دریافت می‌کند و کلاس HandleRequest و کلاس‌های زیر مجموعه آن وظیفه تشخیص و اجرای این وظایف را برعهده دارد.این کلاس و کلاس‌های مشتق شده از آن در پکیج org.telegram.customization.internet قرار گرفته‌اند. کلاس‌های زیرمجموعه‌ی HandleRequest‌ هرکدام وظیفه مدیریت نوع خاصی از پیام‌ها را بر عهده دارند. در نسخه ۵.۳.۵ تعداد این کلاس‌ها ۵۳ عدد بود ولی در نسخه جدیدتر ۴۹ کلاس وجود داشت. ولی طبق بررسی‌های ما همه وظایف مخاطره آمیز تلگرام طلایی که ما پیدا کردیم هنوز هم در نسخه آخر این برنامه وجود دارد. کد این کلاس که مبهم سازی شده را نیز در این لینک می‌توانید ببینید. چند قابلیت‌های جاسوسی جدید در نسخه ۵.۴.۲ به تلگرام طلایی اضافه شده است که نشان از تمایل برای توسعه و بهبود مداوم قابلیت‌های مخرب این ابزار در ماه‌های اخیر دارد.در تصویر زیر برخی از توابع این کلاس را مشاهده می‌کنید.  وجود چنین توابعی با نام‌های  sendContacts، sendLocation، sendTM، sendSuperGroup و . . . باعث شد توجه ما شدیدا به این کلاس معطوف شود.  برخی از توابع کلاس HandleRequestانواع قابلیت‌های نامتعارف موجود در تلگرام طلاییدر بررسی‌های ما سه نوع قابلیت غیرمتعارف و غیرقانونی در تلگرام طلایی پیدا شد. دسته اول فعالیت‌هایی است که با دریافت نوتیفیکشن‌ها فعال می‌شوند، دسته دوم به صورت سرویس در کلاینت تلگرام طلایی در حال اجرا اند و به صورت دوره‌ای گزارش‌هایی برای سرور تلگرام طلایی می‌فرستند، و در نهایت قابلیت‌هایی که با یک رخداد خاص مثلا دریافت پیام خاصی فعال می‌شوند. همه این قابلیت‌ها در هر دو نسخه که ما بررسی کردیم وجود داشتند. به نسخه جدیدتر تعدادی قابلیت جدید اضافه شده بود.سرویس‌های مبتنی بر نوتیفیکیشنهمانطور که قبلا اشاره کردیم، کلاس HotgramNotification وظیفه مدیریت نوتیفیکشن‌های دریافتی از پلتفرم OneSignal را بر عهده دارد. این کار توسط تابع HandlePush انجام می‌شود. ورودی اصلی این تابع یک رشته است که در آن داده‌های ورودی قالب json دارند. این ورودی و مقدار متغیر pushType، مشخص می‌کنند که چه عملیاتی باید در کلاینت شروع شود. در ادامه به برخی از فعالیت‌های نامتعارف و غیرقانونی تلگرام طلایی که با نوتیفیکیشن فعال می‌شود را بررسی می‌کنیم.۱. با گرفتن نوتیفیکیشن نوع ۲، تلگرام طلایی می‌تواند بدون اطلاع کاربر، او را در یک کانال خاص عضو کند. این کار با استفاده از تابع  addToChannel که در کلاس  SlsMessageHolder قرار دارد انجام می‌شود. (لینک گیت‌هاب)تابع addToChannel در کلاس SlsMessageHolder - لینک گیت‌هاب ۲. با دریافت نوتیفیکیشن از نوع ۹ تلگرام طلایی با اطلاعات دریافتی در نوتیفیکیشن می‌تواند بدون اطلاع کاربر یک رکورد به دفترچه تلفن کاربر اضافه کند. و این کار با استفاده از تابع addContact که در کلاس Utilities قرار دارد انجام می‌شود. این تابع در نسخه 5.4.2 در کلاس C3792d قرار دارد (لینک گیت‌هاب)تابع addContact در کلاس Utilities۳. نوتیفیکیشن نوع ۱۰ رفتاری شبیه به نوع ۹ دارد با این تفاوت که اطلاعات دریافتی مشخص می‌کند چه رکوردی از دفترچه تلفن باید حذف شود. که می‌توانید تابع  deleteContact را در کلاس Utilities یا کلاس متناظرش در نسخه مبهم سازی شده ببینید. (لینک گیت‌هاب)۴. نوتیفیکیشن نوع ۱۵ به سازندگان تلگرام طلایی این امکان را می‌دهد تا یک کاربر را بدون اطلاع و تمایل او از کانال مورد نظرشان خارج کنند و همینطور سابقه کانال را هم پاک کنند. (لینک گیت‌هاب)قابلیت حذف کاربر از یک کانالمواردی که تا اینجا بررسی کردیم در هر ۲ نسخه وجود داشتند ولی مواردی بعدی فقط در نسخه جدیدتر ۵.۴.۲ وجود دارند.۵. با دریافت نوتیفیکیشن از نوع ۱۸ تلگرام طلایی بررسی می‌کند اگر کاربر مدیر کانال باشد او را از کانال اخراج می‌کند. با فرستادن این نوتیفیکیشن برای همه کاربران تلگرام طلایی و مشخص کردن یک کانال خاص می‌توان کاری کرد که همه ادمین‌های یک کانال خاص از کانال خارج شوند و کانال بدون صاحب بماند. (لینک گیت‌هاب)قابلیت حذف مدیر کانال۶. فعالیت جالب بعدی که با دریافت نوتیفیکیشن نوع ۱۹ فعال می‌شود، امکان باز کردن یک آدرس اینترنتی‌ خاص از طرف کاربر است. وظیفه اجرای این درخواست با کتابخانه Volley است. User-Agent‌ کلاینت به صورت تصادفی انتخاب می‌شود. این کار می‌تواند برای افزایش آمار بازدید یک سایت یا حتی اجرای حمله DDoS استفاده داشته باشد. در تصویر تابعی که User-Agent‌ را انتخاب می‌کند و درخواست HTTP‌ را اجرا می‌کند می‌بینید. (لینک گیت‌هاب)امکان باز کردن یک آدرس اینترنتی۷. مورد بعدی و آخر که در این بخش بررسی می‌کنیم پیام‌های نوع ۲۰ هستند. این نوع پیام می‌توانند از طرف کاربر یک کانال خاص را Report کند. با این عملکرد می‌توان به صورت گسترده، یک کانال دلخواه را Report Spam‌ کرد. (لینک گیت‌هاب)قابلیت ریپورت یک کانال توسط همه کاربرانقابلیت‌های مبتنی بر سرویسبخش دیگری از داده‌هایی که به سرورهای تلگرام طلایی ارسال می‌شود از طرف سرویس‌هایی است که در زمان اجرای تلگرام طلایی فعال می‌شوند. این سرویس‌ها خود با استفاده از نوتیفیکیشن‌هایی که در بخش قبل بررسی کردیم فعال می‌شوند تا بتوان از راه دور آنها را فعال کرد. نوتیفیکیشن‌های نوع ۱۲، ۱۶، و ۱۷ می‌توانند سرویس‌های متفاوتی را فعال کنند که از این میان نوع ۱۲ به صورت خاص چندین سرویس را با هم فعال می‌کند.  (لینک گیت‌هاب)قابلیت‌های مبتنی بر سرویسدر این بخش به بررسی بعضی از این سرویس‌ها که به نظر می‌آید ناقض حریم شخصی کاربران هستند می‌پردازیم. کد این سرویس‌ها در پکیج org.telegram.customization.service قرار دارد.سرویس BgtsService: این سرویس لیست تمام کانال‌هایی که کاربر عضو آنهاست را جمع‌آوری می‌کند و توسط کلاس HandleRequest‌ که قبلا مطرح شد برای سرور‌های ‌تلگرام طلایی می‌فرستد. یکی از داده‌های جالبی که جمع‌آوری می‌شود مشخص می‌کند کاربر، ادمین کدام کانال‌ها است. (لینک گیت‌هاب)سرویس bgts که تمام کانال‌هایی که کاربر در آن‌ها عضو هست را جمع‌آوری می‌کندسرویس CtsService: این سرویس وظیفه جمع آوری اطلاعات Contact‌های کاربر را بر عهده دارد. در این اطلاعات نام و شماره تماس تمام مخاطبین جمع‌آوری می‌شود و برای سرورهای تلگرام طلایی ارسال می‌شود. البته با توجه به اینکه تلگرام طلایی سرویسی با عنوان &quot;نمایش کسانی که شماره شما را دارند&quot; ارائه می‌دهد می‌توان توجیه کرد که این اطلاعات برای پیاده سازی آن سرویس مورد استفاده قرار می‌گیرد. (لینک گیت‌هاب)سرویس cts که وظیفه جمع‌آوری لیست مخاطبان کاربر را بر عهده داردسرویس LocationService: این سرویس همان‌طور که از نامش پیدا است به صورت دوره‌ای مشخصات مکانی کاربر (طول و عرض جغرافیایی)را به سرورهای تلگرام طلایی می‌فرستد.  (لینک گیت‌هاب)سرویس location که طول و عرض جغرافیایی مکان کاربر را می‌فرستداین سرویس هم مانند بقیه سرویس‌های این دسته با استفاده از کلاس HandleRequest‌ داده‌ها را برای سرور تلگرام طلایی می‌فرستد.سرویس SgsService: این سرویس ۲ نوع داده را برای سرور تلگرام طلایی می‌فرستد. اول لیست id همه گروه‌هایی که کاربر عضو آن است و دیگری اطلاعات سوپرگروه‌هایی که کاربر در آنها عضو است. به نظر می‌رسد گروه‌های پرتعداد برای سازندگان اهمیت بیشتری نسبت به گروه‌های عادی داشته است. (لینک گیت‌هاب)سرویس sgs که لیست سوپرگروه‌های تلگرام را جمع‌آوری می‌کندسرویس BgsService: این سرویس هم مانند سرویس‌های SgsService و BgtsService عمل می‌کند ولی اطلاعات مربوط به بات‌هایی که کاربر با آنها کار می‌کند را می‌فرستد.  (لینک گیت‌هاب)سرویس bgs که تمام بات‌ها را جمع‌آوری می‌کندسرویس‌هایی که تا اینجا بررسی کردیم در هر ۲ نسخه مدنظر ما وجود دارند ولی سرویس بعدی که با هم می‌بینیم فقط در نسخه جدیدتر ردپای آن را مشاهده کردیم.سرویس UStateService: این سرویس با توجه به نامش وظیفه بروزرسانی state کاربر در سرورهای تلگرام طلایی را برعهده دارد. این سرویس وظیفه ارسال ابرداده‌های پیام‌های کاربر را به سرورهای تلگرام طلایی برعهده دارد. کلاس UserState با توجه به مبهم بودن کد شامل متغیرهای بی معنی مانند gp، gr، mr، ms‌ ،s ، و e است. با توجه به کد تابع  getUserStateWithStartAndEndTime که وظیفه پر کردن این مقادیر را بر عهده دارد متوجه شدیم این متغیرها در یک بازه زمانی مشخص، تعداد پیام‌های دریافتی و ارسالی، تعداد پیام‌های مربوط به گروه‌ها، و زمان شروع و پایان بازه‌ای که پیام‌ها در آن شمارش شده‌اند را مشخص می‌کنند و این اطلاعات را برای سرورهای تلگرام طلایی می‌فرستد. (لینک گیت‌هاب)سرویس جمع‌آوری حالت کاربر و تمام ابرداده‌هاهمانطور که گفتیم، وقتی سرویس‌ها فعال شوند به طور مداوم اطلاعات را برای سرورهای تلگرام طلایی می‌فرستند. این کار در دو زمان انجام می‌شوداگر از آخرین زمان ارسال موفق داده‌ها مدت معینی گذشته باشد،  این زمان معین برای هر ارسال متفاوت است و قابل تغییر برای هر کاربر توسط تلگرام طلایی است. در حالتی که برای کاربر flag خاصی set شده باشد. در واقع این flag مشخص می‌کند همه سرویس‌ها بدون توجه به زمان گذشته از آپدیت قبلی، داده‌های خود را بفرستند.ضمنا کلاس HandleRequest که وظیفه ارسال پیام‌ها را برعهده دارد بعد از اینکه داده‌های هر سرویس را برای سرور فرستاد، زمان آخرین ارسال موفق را ذخیره می‌کند تا بعدا مورد استفاده سرویس قرار بگیرد.قابلیت‌های مبتنی بر رخداداین دسته از قابلیت‌های سرقت اطلاعات در تلگرام طلایی از نظر امکان تشخیص از سخت ترین‌های انواع سرقت اطلاعات هستند. به همین دلیل ما تنها توانستیم یک مورد از این نوع پیدا کنیم، که البته یکی از مهم‌ترین موارد نقض حریم خصوصی کاربران است. در تصاویر زیر قسمتی از کد کلاس MessageStorage در تلگرام طلایی و مقایسه آن با کد تلگرام طلایی را مشاهده می‌کنید. تفاوت اصلی در این قسمت مربوط به کدی است که تلگرام طلایی اظافه کرده است. تابعی که این کد به آن اضافه شده است وظیفه مدیریت پیام‌های دریافتی را برعهده دارد، پس به ازای هر پیام دریافتی این کد روی آن اعمال می‌شود. (لینک ۱ و لینک ۲)کلاس MessageStorage در تلگرام رسمیکلاس MessageStorage در تلگرام طلایی که شامل کد مخرب استاین کد در صورتی که dialog_id با کد 777000 پیامی دریافت شود، متن این پیام از طریق کلاس SendTM برای سرورهای تلگرام طلایی ارسال می‌شود. کد 777000 مربوط به بخش service notification تلگرام است. تلگرام کدهای login را از این طریق ارسال می‌کند. بنابراین یک کپی از همه کدهای login همه کاربران به سرورهای تلگرام طلایی فرستاده می‌شوند بدون هیچ شرطی. این قابلیت این امکان را به دست‌اندرکاران تلگرام طلایی می‌دهد تا با داشتن شماره تلفن یکی از کاربرانشان بتوانند به اکانت تلگرام رسمی کاربر وارد شوند و به تمام پیام‌های او دسترسی داشته باشند. لیست سرورهالیست سرورهایی که تلگرام طلایی با آن‌ها در ارتباط هستند در این لینک گیت‌هاب قابل مشاهده هستندتصویری از لیست سرورهانکته مهمی که باید مورد توجه قرار گیرد این است که تمامی این فعالیت‌ها بدون اطلاع و رضایت کاربر انجام می‌پذیرند. در حقیقت از منابع شبکه، و اکانت تلگرام کاربر برای رسیدن مقاصد دلخواهشان استفاده می‌کنند. توسعه‌دهندگانتوسعه‌دهندگان این ابزار علاقه خاصی به استفاده از اسم‌های  Alireza, LEE, Aminproxy  و Sadegh در لاگ‌ها داشتند. بعید نیست که این‌ها اسم (جعلی) خود توسعه‌دهندگان باشد.کاری از:علیرضا ابراهیمی - Twitterیاشار شاهین‌زاده - Twitterحسن کرامت پور - LinkedIn</description>
                <category>علیرضا ابراهیمی</category>
                <author>علیرضا ابراهیمی</author>
                <pubDate>Thu, 28 Jun 2018 17:46:49 +0430</pubDate>
            </item>
                    <item>
                <title>در منقبت تردید</title>
                <link>https://virgool.io/@ali_reza_ebrahimi/%D8%AF%D8%B1-%D9%85%D9%86%D9%82%D8%A8%D8%AA-%D8%AA%D8%B1%D8%AF%DB%8C%D8%AF-hpbhaezc1puf</link>
                <description>به عنوان کسی که انتقادات زیادی به نظام آموزش عالی ایران دارم باید اعتراف کنم این قانون که هر دانشجوی دکترا در طول دوره تحصیلش باید چند تا مقاله ژورنال داشته باشه خیلی به بالا رفتن کیفیت این دوره کمک کرده (البته خود این هم جای انتقاد زیاد داره ولی خب، بودنش بهتر از نبودنشه بنظرم) و صد البته یکی از چالش‌های دانشجوهایی که مقاله برای مجلات معتبر می‌فرستند سر و کله زدن با داورهاست.نمیدونم شما هم با من هم نظر هستید یا نه ولی به نظر من میشه به علوم جدید به عنوان دین جدیدی که به مردم نازل شده نگاه کرد. با همه اون نظریات موجود در مورد دین مثل «افیون توده‌ها» و ریشه جنگ‌های مذهبی. این وسط به خاطر اینکه بیشتر مطالعاتم در زمینه علوم کامپیوتر بوده، این نگاه رو به علم رایانه بیشتر اعمال کردم و خوب با این دید مثلا به کسانی مثل دیکسترا یا آلن تورینگ به دید پیامبران این دین نگاه کردم (شرمنده که دین فرضیم پیامبر همجنسگرا هم داره). اخیرا یک مقاله داشتم میخوندم در مورد اینکه داوران، یا مبلغان دین مقبول قبلی چه نظراتی در مورد مقالات پیامبران دین جدید داشتند. نظرات جالبی که الان بعد چند دهه مشخص میکنه چرا باید به این افراد گفت پیامبران دین رایانه.شنون (C. E. Shannon)برای دوستانی که این پیامبر رو نمیشناسند باید عرض کنم که ایشون مبدع نظریه ارتباطات هستند و در واقع میشه گفت کلا کلید فن‌آوری اطلاعات رو شنون روشن کرده. کلی کار جالب هم در زمینه رمزنگاری داره که اینجا برای از شنون نوشتن فضا کم است...اما داور محترم در مورد مقاله «A Mathematical Theory of Communication» که مهم ترین مقاله آقای شنون و جایی که نظریه ارتباطات رو معرفی کرده چه چیزی گفته:این مقاله از ضعف در ایجاد انگیزه در خواننده رنج می‌برد و به شدت انتزاعی است. مشخص نیست که این مقاله در عمل چه مساله واقعی را حل می‌کند. نویسنده ادعا کرده است «جنبه‌های معنایی ارتباطات به مسائل مهندسی مربوط نمی‌شود» که نشان دهنده آن است که نظریه او برای انتقال داده‌های بی معنی (منظورش مثلا انکود شده است) مناسب است. مایه افسوس است که مردم برای منتقل کردن داده‌های بی‌معنی پول نخواهند داد. (هرچند سرکزمی که داور استفاده کرده بود رو دوست دارم!)ضمنا من ارتباط گسسته بودن منابع رو متوجه نمیشم: مگر اینطور نیست که مستقل از کاری که می‌کنیم، در نهایت سیگنال از vacuum tube های خودمون عبور میکنه و «کانال» همیشه آنالوگ خواهد بود.و در ادامه یک متن خصوصی هم برای ادیتور مجله ضمیمه شده که جالب‌تره:تنها چیزی که مطلقا در مورد این نوشته غلطه اینه که اصلا به اینکه جامعه تحقیقاتی به چه موضوعاتی علاقه‌منده توجه نکرده. در هر زمانی موضوعات جذاب و غیرجذاب وجود دارند: مثلا الان تلویزیون جذابه و تلویزیون زنگی حتی از اون هم جذاب تره. کانال‌های گسسته با مجموعه متناهی از نمادهای قابل انتقال برای ارتباطات تلگرافی مناسبه، اما تلگراف ۱۰۰ ساله شده و به سختی بهش میشه گفت یه موضوع تحقیقاتی.ضمنا نویسنده از رایانه‌های جدید مثل ENIAC نام برده. خب من فکر می‌کنم میشه این ماشین‌ها رو به هم متصل کرد ولی همونطور که IBM گفته یک دوجین از اونها برای هر محاسبه‌ای که در آینده دور و نزدیک لازم داریم کافیه. پس ما هیچ وقت جلوتر از وصل کردن یه دوجین ENIAC نخواهیم رفت.این کانالهای گسسته که ذکرش شده همون چیزیه که اینترنت رو ساخته و بعدا همه ارتباطات آنالوگ مثل تلفن و تلویزیون رو هم بر بستر کانالهای گسسته بازسازی کردند. و خب همین الان توی خونه ما یه دوجین ماشین محاسباتی قویتر از ENIAC به هم متصل اند و ما هنوز تشنه ایم برای بدست آوردن قدرت محاسبات بالاتر.آلن تورینگ (A. Turing)در مورد آلن تورینگ حرفی نمیزنم جز اینکه اگر کامپیوتری هستید و نمیشناسیدش پس احتمالا کامپیوتری نیستید و اگر هم کامپیوتری نیستید برید و فیلم The imitation game رو ببینید. اما در مورد نقد داور عزیزمون به مقاله معروف آلن تورینگ که محاسبه رو زیر و رو کرده:در مورد مقاله « On Computable Numbers, with an Application to the Entscheidungsproblem» این یک مقاله عجیت و غریبه. این مقاله با توصیف یک ماشین محاسبه که من هیچ جای دیگر ندیدم شروع می‌شود (مردک بی‌سواد ماشین تورینگ رو جایی ندیده بعد اومده داور شده). بعد مولف شروع میکند به اثبات -البته من فرمالیسم الکی پیچیده‌ی ارائه شده در مقاله را پیگیری نکردم- اینکه اعدادی هستند که نمیتوانند محاسبه‌ شوند. خب تا جایی که من می‌فهمم برای هر ماشین که ساخته می‌شود دو حالت می‌توان متصور شد: یا این اعداد انقدر بزرگ هستند که در این ماشین ها جا نمی‌شوند که نتیجه‌گیری واضح است؛ یا این که اینطور نیست پس ماشین ساخته شده خراب است.هر رایانه‌ای که ارزش اجاره شدن را داشته باشد، می‌تواند همه مقادیری که در دامنه‌اش هست را محاسبه کند، و هر عددی با یک تابع قابل محاسبه است -با اعمال چهار عمل اصلی روی آن- و رایانه‌های فعلی -برخلاف ماشین عجیب معرفی شده در این مقاله- هر چهار عمل اصلی را به صورت سیم‌بندی شده در خود جای داده‌اند. بنظر میرسد بهبودی که تورینگ ارائه داده به هیچ وجه بهبودی روی تکنولوژی فعلی نیست و من فکر میکنم این ماشین بسیار ساده است که استفاده‌ای برای آن متصور بوددیکسترا (E. W. Dijkstra)بنظر من بهترین جنبه‌ای که از دیکسترا من رو شیفته خودش کرده شیوه خاصش در تدریسه. امتحان‌های نهایی شفاهی که در خونه‌اش برگزار می‌کرده و برای هر دانشجو متفاوت بوده. اینکه در مقالاتش کمتر میشه ارجاعی پیدا کرد و اینکه شخصیت خاصش برای اکثر افراد، حتی اونهایی که در زمینه کاری خودش بودند قابل درک نبوده. شاید بگم گل سرسبد انبیا حوزه رایانه همین دیکسترا است. اما همونطور که هر پیامبری در ابتدای بعثتش حرف‌هایی میزنه که با انکار عموم مواجه میشه، دیکسترا هم با انکار داوران مواجه شده بود. و جالب اینه که در مقاله «Goto Statement Considered Harmful» با این مقاومت روبه‌رو شده. مقاله‌ای که بیشتر به جای اینکه فرمال و نظریه پردازانه باشه، توصیه‌ای برای استفاده نکردن از یکی از پرکاربردترین ویژگی های زبان های برنامه نویسی در زمان خودشه. توصیه‌ای که نشان دهنده ذات برنامه‌نویسانه دیکستراست و صد البته جلوتر بودن از زمان خودش. و اما نظر داور در مورد این توصیه:این مقاله سعی میکند تا ما را قانع کند که عبارت معروف goto را از زبان‌های برنامه‌سازی حذف کنیم یا اقلا کاری کنیم برنامه‌نویس‌ها از این عبارت استفاده نکنند. مشخص نیست که در صورت حذف این عبارت چه چیزی جای‌گزین آن خواهد شد. این مقاله مشخص نمی‌کند چگونه یک عبارت شرطی بدون goto می‌خواهد مسیر اجرا را تغییر دهد. آیا همه postcondition ها باید یک عبارت باشند یا باید همه از if ریاضی استفاده کنیم؟ چطور وقتی به پایان یک تابع یا بلاک کد رسیدیم ادامه کار را از جای دیگری از سر بگیریم؟نویسنده در این مقاله استایل برنامه نویسی ساخت‌یافته را تشویق می‌کند که اگر درست فهمیده باشم، در آن goto‌ها با indent جای‌گزین شده‌اند. برنامه نویسی ساخت‌یافته برای محافل آکادمیک و مثال‌های کوچک مناسب است، و من شک دارم برنامه واقعی در این استایل نوشته شود. تجربه بیش از ۱۰ سال استفاده از fortran در صنعت برای هرکس که به این موضوع علاقه‌مند بوده این را اثبات می‌کند (یه چیزی تو مایه های این که: بَلْ قَالُوا إِنَّا وَجَدْنَا آبَاءَنَا عَلَى أُمَّةٍ وَإِنَّا عَلَى آثَارِهِمْ مُهْتَدُونَ) که استفاده از goto کاربردی و لازم است. هر چند که وجود این دستور ممکن است دیباگ را سخت‌تر بکند، اما یک استاندارد پذیرفته شده است و باید با آن ساخت و برای حذف آن از زبان‌های برنامه‌سازی به چیزی بیشتر از تلاش‌های یک آرمانگرای آکادمیک نیاز داریم.منتشر کردن این مقاله هدر دادن کاغذ است: من مطمئنم ۳۰ سال دیگر goto همچنان به وسعتی که امروزه در حال استفاده است، مورد استفاده خواهد بود.از توصیفش از دیکسترا واقعا لذت بردم: یک آرمانگرای آکادمیک...کد (E. F. Codd)یک درس ۳ واحدی هست در کارشناسی به نام پایگاه‌داده، من می‌تونم بگم ۹۰ درصد حرفی که تو این درس گفته میشه بلغور حرف‌های جناب کد هست. یعنی اصلا اون پایگاه داده‌ای که قبل از کد بود الان تو موزه‌ها هم به زور پیدا میشه، انقدر که این پیامبر، دین به این خوبی ارائه داده بود. با این حال ولی داورها بعضا روز خوبشون نیست و به تبع اون مجلات هم روز خوبشون نیست و مقاله به این مهمی رو از دست میدن.درباره مقاله «A Relational Model of Data for Large Shared Data Banks» که می‌گوید همه داده‌های یک پایگاه داده باید در قالب روابط -مجموعه‌ای از چندتایی‌های منظم- بیان شوند و همه اَعمال مربوط به دسترسی به داده‌ها روی این مدل اِعمال شوند. بعضی از ایده‌های این مقاله جالب است و ممکن است در آینده مورد استفاده قرار بگیرند اما به صورت عمومی این ایده بسیار اولیه بخاطر نداشتن پیاده‌سازی، کارآیی، و کاربرد عملی در اقناع مخاطب ناکام مانده است. نکته اصلی این نوشته این است که شکل جدولی برای دسترسی به داده‌ها مناسب است ولی من دو مشکل با این نکته دارم: بیان‌پذیری و کارآیی.این مقاله هیچ مثال دنیای واقعی برای قانع کردن ما در اینکه مدل ارائه شده مناسب است نیاورده است. در نگاه اول من حتی شک دارم چیزی که به اندازه کافی پیچیده باشد را بتوان با این روابط مدل کرد. سادگی این مدل به عنوان مثال توصیف سلسله مراتب را غیرممکن می‌کند و مجبور می‌کند از سیستم پیچیده‌ی کلید خارجی استفاده کنیم. در این حالت هر مدل واقع‌گرایانه تبدیل به یک دوجین جدول متصل به هم می‌شود که به سختی یک راه حل عملی است. در حالی که احتمالا چنین چیزی با دو یا سه فایل قالب‌بندی شده مدل می‌شود. (واقعا هاها!!)از این بدتر، این مقاله هیچ ارزیابی کارآیی ارائه نکرده است. هیچ آزمایشی با داده‌های واقعی یا مصنوعی برای مقایسه با سیستم‌های فعلی ارائه نشده است. دلیل اصلی استفاده از فایل‌های قالب بندی شده کارآیی بالای آنهاست. در مدل ارائه شده در این مقاله کاربر برای استخراج جواب سوالات بزرگ باید تعداد زیادی join های ناکارآمد اعمال کند. همینطور این مقاله هیچ آزمایشی برای اینکه این راه‌حل مقیاس‌پذیر است ارائه نکرده است.در مجموع به خاطر نداشتن مثال دنیای واقعی، نداشتن آزمون کارآیی، و نداشتن پیاده‌سازی یا جزئیات کافی ما با یک روش مبهم که از ریاضیات ناآشنا (منظورش جبر رابطه‌ایه خاک بر سر) استفاده کرده است مواجه ایم که در عمل نتیجه‌ای نخواهد داشت. به نظر من به راحتی می‌توان این مقاله را رد کرد.اما چرا؟سوال اصلی که بعد از خوندن این نظرات من رو به خودش مشغول کرد اینه که چه چیزی باعث میشه افراد در چارچوب‌هایی که درش رشد کردند محدود بشن و به صورت تدافعی در برابر چیزی که می‌خواهد اونها رو درهم بشکنه مقاومت می‌کنند؟ نکته ترسناک‌تر در مورد این مثال‌ها اینه که داورهایی که این حرف‌ها رو زدن اقلا استاد دانشگاه بودند که نشان از هوش مناسبشون داره. چیزی که باعث میشه حدس بزنیم پیامبرهای واقعی چه دردسری در قانع کردن مردم عادی داشتند. برای این قضیه راه‌حل خاصی به جز تفکر انتقادی به ذهنم نمی‌رسه، یا با کمی اغماض چیزی تو مایه‌های برخورد اینشتین با مکانیک کوانتوم:مشخصا اینشتین نمی‌خواهد قبول کنه که کار خدا با انداختن تاس داره جلو‌‌ میره و مکانیک کوانتوم رو قبول نداره ولی از اونطرف هم قضیه رو کاملا رد نمی‌کنه. یک تردید همراه با جنگ درونی برای شکستن باورهای قبلی. اسم این نوشته رو گذاشتم در منقبت تردید ولی باید یک جمله هم در منقبت یقین بگم، اینکه اگر دیکسترا و تورینگ و کد و ۱۲۴۰۰۰ پیغمبر دیگه به کار خودشون یقین نداشتند احتمالا ما الان اینجایی که هستیم نبودیم.پی‌نوشت:مقاله اصلی که بدنه اصلی این مقاله ترجمه اونه یکی دو تا نمونه مثال دیگه هم آورده که خوندنش خالی از لطف نیست.ترجمه‌هایی که داشتم دقیق نیست، یکمش بخاطر بی‌سوادی بوده و یه خورده هم بخاطر اینکه خوندن راحت بشه. اگه خیلی به دقیق بودن اطلاعات اهمیت می‌دید برید همون اصلیه رو بخونید.</description>
                <category>علیرضا ابراهیمی</category>
                <author>علیرضا ابراهیمی</author>
                <pubDate>Fri, 25 May 2018 22:51:54 +0430</pubDate>
            </item>
            </channel>
</rss>