۰۷
آجر انداختن به طبقهي آخر از روي شانههاي بزرگان
دسته بندي (كامپيوتر) نويسنده imei در ۰۷-۱۱-۱۳۸۶
در برچسب : تجاري
يعني يه كامپيوتري بايد تر و فرز و با حوصله و با پشتكار باشه؟ اونم وقتي با اين صفات ميخوان تحريكت كنن يه كار غول آسا رو انجام بدي اونم چه كاري؛ يه كاري كه نه اختراع هست و نه نوآوري! يه كامپيوتري ياد ميگيره كه *”روي شونههاي بزرگان بايسته” و كاري انجام بده، نه اينكه كار اونا رو تكرار كنه.
شايد توي جريان باشين كه يه جا براي يه پروژه، ازم پيادهسازي چند تا پروتكل رو ميخواستن. زيرلايهايترينشون، پروتكل PPP بود كه قرار بود از روي RS۲۳۲ به مودم GSM وصل بشيم تا با يه ماجولي كه من نميدونم چيش به چيه و چهجوري، كار يه موبايل رو ميكرد بعلاوهي يه سيمكارت ايرانسل به اكسسپوينت GPRS وصل بشيم. حالا بايد دستگاهي كه به اين مودم وصل ميشه رو طوري برنامهريزي كرد كه بتونه از روي ناقل GPRS يه سري كارها تو اينترنت بكنه كه اصليترين كارش ارسال گزارش عملكرد اون دستگاه به سرور اينترنتيه. بههرروي، مسئله اين بود كه ما بايد به اين دستگاه خنگ PPP و IP و UDP رو ياد ميداديم. باز خدا رو شكر تونستم اثبات كنم كه از خيرTCP بگذرن كه حجم پياده سازيش خلقالله رو معطل خودش كرده.
صاحب كار، آقاي فتحي، يه مرد سخت افزاره. سخت كوش و خوش قلب. بندهي خدا مرتب ميگفت يه فريمي ميخوام كه اطلاعات رو بذارم روش تا برسه به سرور. اين در حاليه كه اين كار با فريم قابل پياده سازي نيست. حتي اگر از UDP كه ميتونه Connectionless باشه و Session Management نداره هم استفاده كنيم، بايد يه Session manager مختصر در نظر بگيريم كه لااقل بدونيم كدوم گزارشها رسيده و كدومها Retry نياز داره. در كل Agent ما بايد Delivery Report داشته باشه. از اين هم كه بگذريم سختي كار توي لايهي IP و PPP كم نيست. ما تقريباً به هيچ عنوان نميتونيم يه IP هندلر كامل بنويسيم. نميخوايم كل پروژه رو بذاريم رو اين بخش كه!! فقط يه *”خرك رو بديم لنگان برسونه به منزل” كافيه…. ولي براي PPP واقعا نميشد Session Manager ننوشت. PPP از يه پروتكل كمكي به اسم LCP استفاده ميكنه تا به گزينههاي ماشين حالت خودش مقداردهي بكنه. فكرش رو بكنيد وقتي به اينترنت كانكت ميشيد باز كردن پورت مودم، دايالينگ، دريافت Carrier و بعد Negotiate اوليه، توافق سر عدد جادويي، توافق سر گزينهي Compression (دو جور توافق هم هست خير سرش) ، توافق سر شكل انتقال رمز (چاپ و پاپ و شيوا پاپ) كه با اينكه بدرد ما نميخورد ولي بايد اجباراً توافق ميكرديم سرش و هزار جور رقص و Hand Shaking ديگه بايد انجام بشه تا ماشين PPP به State آماده به انتقال (Network State) برسه. در غير اينصورت، لينك مرده بود و بايد به لايهي بالا گزارش ايست داد تا دادهها رو كش كنه. يعني كار از فريم كاري و به سر و ته اطلاعات گل و سنبل چسبوندن گذشته بود و بايد واسه هر بيل بيلكي كه ميخواستي بفرستي يه پرونده تشكيل ميدادي!!
آقا دردسرتون ندم اين وسط كار ما شده بود كه اين پروتكل رو پياده سازي كنيم. يعني آقاي فتحي فقط ميخواست الگو رو بگيره و رو سخت افزار پياده سازي كنه ولي خوب من كه ميدونستم كار از اين قضيهها گذشته بايد بشينه برنامهي نوشته شده رو Cross Compile كنه وگرنه هيچ شانسي نيست كه كدي كه با سي بزور نوشته شده رو ببره به اسمبلي ۸ بيتي يه دستگاه زبون نفهم! من بيچاره نشستم روزهاي متمادي كار كردم… اول با اسنيف كردن RS۲۳۲ شروع شد. مودم رو وصل كرديم به ويندوز و با شمارهگيري GPRS به اينترنت وصل شديم (ميدونستيد شمارهش چيه؟ اينه *۹۹***۱# كه اگر موبايلتون قابليت مودم شدن داره بايد باهاش شمارهگيري كنين البته فعلاً فقط با سيم كارت ايرانسل) اين وسط براي يه اتصال و يه پينگ فسقلي كلي شر و ور اسنيف شد. فريم PPP دو كاراكتر خاص داره ۰×۷F و ۰×۷e كه يكي دليميتر هست و يكي ديگه اسكيپر. اين اسكيپر هست كه كمك ميكنه اطلاعات شما به شكل دستورات مودم در نيان وگرنه ممكن بود متنتون حاوي دستورات مودم بود (ميدونستين مودم هم دستور داره واسه خودش؟) و وسط ارسال اطلاعات يه دفعه دستور ديسكانكت (ATH) رو ميفرستادين و…
خوب ديگه زيادي آب و تاب ندم، كلي زور زديم تا تونستيم اطلاعات اسنيف شده رو پارز كنيم و حاليمون بشه كه كي چي گفته و يعني چي؟! بعد ديديم بابا اينا از يه جا به بعد دارن كمپرس حرف ميزنن هر چي هم بهشون گفتيم كه بي خيال كمپرس شدن شين حساب نبردن ازمون! گفتيم بالاخره كه چي؟ ما بايد خودمون وارد عمل بشيم و بسته بسازيم و در قبال توافقات كمپرشن، بگيم “نه كمپرس كردن بلد نيستيم عين آدم حرف بزن”، تا طرف مقابل هم بي خيال كمپرشن بشه و از اون به بعدش رو ادامه بديم. ولي گير بزرگ بعدي خودش رو نشون داد. هر فريم PPP يه Checksum داره كه با CRC حساب ميشه. ما فقط ميدونستيم كه CRC يه چيزي هست! ولي نميدونستيم چطوري حساب ميشه. اطلاعات بيشتر رو از اينور و اونور در آورديم و فهميديم كه CRC۱۶ CCITT اسم شيوهي CRC گرفتنش هست و با چند جملهاي x۱۶+x۱۲+x۵+۱ تقسيمها انجام ميشه و آخرش هم Not ميشه و اگر لازم بود Scape ميشه با اسكيپر، و تازه ممكنه از طريق يكي از اين آپشنهاي توافقي، CRC۳۲ گرفته بشه. من حداقل چهار تا سورس CRC Calculator گير آوردم. رشتههاي اسنيف شده و خام رو، وقتي ميذاشتم توش بايد بهم كد چكسام انتهايي اسنبف شده رو ميداد ولي نميداد. با Online Calculatorها محاسبه كردم نشد پارامترها رو چپ و راست كردم نشد به نذر و نياز متوسل شدم نشد و در نهايت الطاف الهي دستشون رو از آستين كفار بيرون آورد و سوالي كه توي يكي از فرومهاي عالي مربوط به يكي از همين Online Calculatorها پرسيده بودم كمي بعد پاسخ داده شد.
ولي من حتي وقت نكردم كه صحت اون پاسخ رو كه به نظر ميرسيد كاملا درست و اثبات شده باشه بررسي كنم و حتي نشد كه شعورم رو نشون بدم و تشكري هرچند خشك و خالي در قبال خوش آمد و پاسخ سوالم به طرف كه اسم جالبي هم داشت و منو ياد رگولار اكسپرشن مينداخت تحويل بدم. واقعاً متاسفم كه اينقدر بي فرهنگ شدهبودم ولي خوشحالي چيز بهتري كه پيدا كرده بودم اجازه نداد متين بازي در بيارم!
قضيه از اين قرار بود كه يه بسته پيدا كردم كه پروتكل PPP رو به زبان اسمبلي و براي داس پياده سازي كرده بود. پرتاب آجر به طبقه آخر آسمانخراش از اين كار راحت تر بود ولي واقعيت داشت و كار ميكرد… يعني گذاشتيمش توي WOW (توضيح اينكه اين ويندوز در ويندوز يه امكان بالاي هسته هست كه توي ويندوزهاي سري NT قادره تا حد زيادي محيط سازگار براي برنامههاي DOS فراهم كنه) و ديديم كه يه TSR هست ( توي داس برنامههايي كه پشت صحنه كارشون رو انجام ميدادن رو ميگفتن. داس از اين شعورا نداشت كه مالتي تسك باشه ولي چون برنامه نويسا باشعورتر بودن بهش حالي كرده بودن اين تريپ رو!) كه وقتي ران ميشه يه Vector برميگردونه كه ميتوني با دنبال كردن اون وكتور هويج هاي IP رو بدي دست اين آب ميوهگيري تا ضمن ارسالشون توي اينترنت به نور چشم فتحي هم تبديل بشي…
خلاصه اينكه فتحي ميخواست يه برنامه بنويسم كه با تست هزاران حالت ممكن بالاخره به پارامترهاي CRC دست پيدا كنم. ضمن اينكه براي همون يه كار راه سادهتري پيدا شد، براي كل پروژه هم سلوشن *انسانيتري يافت شد كه شيخ زياد گردش نگشته بود.
در اين باره
The Point-to-Point Protocol (PPP) RFC
PPP Design, Implementation, and Debugging (۲nd Edition)
A painless Guid to CRC error detection algorithms
پي نوشت:
*اگر من فراتر را نگريستم، با ايستادن بر شانههاي غولهاست .(نيوتون)
*آنكس كه نداند و بداند كه نداند، لنگان خرك خويش به منزل برساند (منسوب به امام فخر رازي)
*دي شيخ با چراغ همي گشت گرد شهر، كز ديو و دد ملولم و انسانم آرزوست
گفتيم يافت مينشود گشتهايم ما، گفت آنچه يافت مينشود آنم آرزوست (مولانا)
چی به چی شد آخرش ؟ D:
من که اصلا سر در نیاوردم
دایی خودت هم نفهمیدی ها
اعتراف کن شیطون D:
لذّت بردم.
“متین” !
.
.
.
بماند!
از این حس که اون کد اسمبلی رو من و تو ننوشتیم سخت عذاب میکشم.
عیب نداره مهندس شدن این چیزارم داره دیگه
درست میشی غصه نخور
گر صبر کنی هیچ کاری نمیشه
[…] گفتهبودم كه چطور پروتكل PPP رو براي اسمبل كردن روي يه دستگاه پياده سازي كردم… تا ديروز قرار بود كه اين دستگاه يه بيلبيلكي باشه كه معلوم نيست سر و تهش چيه و يه اسمبلي خاص خودش داره و ۸ بيتي هم هست و كلاً چيز وحشتناكي از آب در ميآد. ديروز يه دفعه متوجه شدم آقاي فتحي پلتفورم پروژه رو عوض كرده و قرار هست كه از اين به بعد پروژهي نهايي روي يه بيسكوئيت پيسي -كه از بس خلاصه هست، بيشتر به از اين بيسكوئيت باغ وحشها ميخوره تا بيسكوئيت عادي- پياده سازي و اجرا بشه. يه سيستم ۴۸۶ اينتل كه Lan و Keyboard و ۵۱۲K هارد فلشي و ۶۴۰K رم داره و از باقي امكاناتش بيخبرم و قرار هست كه قيمت خودش حدود ۶۰ تومن در بياد. دقت دارين كه هاردش كمتر از رمش هست! پايين، عكس يكي از اين بيسكوئيت پيسيهايي كه امروز توي شركت بود رو ميذارم. اين سه تا RS۲۳۲ و دوتا USB و كارت گرافيك و يه دونه ISA و كيبورد و موس و سي پي يوي ۲۳۳ و خلاصه كلي چيز ميز داشت ديگه! همهش هم تو همون بيلبيلك كه عكسش هست بود! […]