خبر رو شنیدم! چه عجب بالاخره یه صدای اعتراض بلند شد از این جماعت دانشجو! تا کی میخواستین دور از جون، دور از جون مثل گوشت قربونی از این ساختمون به اون ساختمون ببرنتون! من همیشه تو دلم میگفتم شاید اگر من هم دانشجو بودم، جربزه این کار رو نداشتم ولی حالا که میبینم غیرت کردین و دارین یه کار مثبت برای خودتون انجام میدین، بسیار خوشحالم! از پراکندگیها و چند دستگیها جلوگیری کنین، حرفتون رو محکم بزنین! از خشونت هم پرهیز کنین چون بلافاصله براتون حرف در میارن و قضیه یه کم سیاسی میشه! همیشه تاکید کنین که این کار شما برای حل مشکلات صنفی است و هیچ ربطی به سیاست نداره! اگه کمکی از دست من برمی آد که بتونم انجام بدم، دریغ نمیکنم! موفق باشید!
تا بعد!!
اگر نتوانستم لباس بپوشم، یا موقع غذا خوردن لباسم را کثیف کردم، صبور باش و زمانی را بیاد آور که سعی میکردم همین کارها را به تو یاد دهم ...
اگر موقع صحبت کردن یک مطلب را هزاران بار تکرار کردم، صحبت مرا قطع نکن و به من گوش بده، زمانی را بیاد آور که هنگام خواب هزاران بار یک داستان را برایت میخواندم تا بخوابی ...
زمانی که نتوانستم حمام کنم، نه من را مسخره کن و نه سرزنش، به یاد آور زمانی را که هزاران روش مختلف را اختراع میکردم تا ترا به حمام کردن ترغیب کنم ...
زمانی که من به تکنولوژی جدید بی اعتنایی میکنم و آنرا نادیده میگیرم، به من فرصت مناسب برای یادگیری بده و من را با لبخند استهزاء نگاه نکن، زمانی را بخاطر بیاور که چیزهای زیادی را به تو یاد دادم، که مناسب لباس بپوشی، خوب غذا بخوری و بدرستی با زندگی روبرو شوی ...
زمانی که حافظه ام را از دست دادم یا موقع حرف زدن رشته کلام از دستم خارج شد، به من زمان مناسب برای فکر کردن بده و اگر نتوانستم عصبی نشو چرا که مسئله مهم حرفهای من به تو نیست، با تو بودن و توجه تو به من است...
اگر نخواستم چیزی بخورم، پافشاری نکن، من بخوبی میدانم که به چه چیزهایی احتیاج دارم و به چه چیزهایی نیاز ندارم...
زمانی که پاهای خسته من توان راه رفتن نداشت، دستت را به من بده، همانطوری که من این کار را کردم زمانی که اولین گامهایت را برمیداشتی...
و زمانی که به تو گفتم دیگر نمیخواهم زنده بمانم و میخواهم بمیرم، عصبانی نشو، خودت روزی خواهی فهمید، سعی کن بفهمی که برای من زنده ماندن مهم نیست، زندگی کردن مهم است...
روزی خواهی فهمید که علیرغم اشتباهاتی که داشته ام، همیشه میخواستم بهترین چیزها برای تو باشد و تمام سعی من این بوده که راه را برای تو هموار کنم...
زمانی که مرا نزدیک خود میبینی غمگین، عصبانی یا عاجز نباش، تو باید در کنار من باشی، سعی کنی مرا بفهمی و کمکم کنی، همانطوری که در ابتدای زندگی من این کار را برای تو کردم...
کمکم کن که راه بروم، کمکم کن که راهم را با عشق و صبوری به پایان برسانم، من پاسخ ترا با یک لبخند میدهم، من همه چیزم برای توست...
من ترا دوست دارم، پسرم... پدر
تا بعد!!
برگردیم به ExitProcess که در آن پارامتر uExitCode مقداری است که پس از اتمام برنامه و بازگشت، به ویندوز برمیگردد. میتوانید این تابع را بصورت زیر فراخوانی نمایید:
invoke ExitProcess, 0
اگر این عبارت را بلافاصله پس از start قرار دهید، برنامه بلافاصله به ویندوز باز میگردد. به مثال زیر که اولین برنامه ما میباشد، توجه کنید:
386.
model flat, stdcall.
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
data.
code.
:start
invoke ExitProcess, 0
end start
option casemap:none به MASM میگوید که مابین حروف کوچک و بزرگ تفاوت قائل شود (Case Sensitive). بنابراین ExitProcess با exitprocess تفاوت دارد.
include هم یکی از Directive ها است که بمنظور اضافه کردن فایلهای inc بکار میرود. در مثال فوق ما یکی از توابع kernel32.dll را فراخوانی میکنیم، بنابراین لازم است که prototype آن را که در فایل kernel32.inc است را در برنامه داشته باشیم، که این کار توسط include انجام میشود. در صورتی که در برنامه kernel32.inc را ذکر نکنیم، مجاز هستیم از ExitProcess بصورت ساده (بدون invoke) استفاده کنیم. بصورت خلاصه اینکه تنها زمانی میتوان یک تابع را invoke نمود که برنامه prototype آنرا بشناسد.
includelib یکی دیگر از Directiveهایی است که به اسمبلر میگوید برنامه از چه Library هایی استفاده میکند. زمانی که اسمبلر به این Directive برسد، در فایل Object یک دستور Linker قرار میدهد و در زمان لینک، لینکر Library مربوطه را به فایل Object اضافه میکند. با وجود اینکه میتوان Libraryهای مورد نیاز برنامه را در هنگام لینک کردن با دستور Link در خط فرمان ذکر کرد، ولی استفاده از includelib در برنامه روش مطمئنتری میباشد.
برنامه فوق را با نام msgbox.asm ذخیره کرده و آنرا بصورت زیر اسمبل میکنیم:
ml /c /coff /Cp msgbox.asm
c/ به MASM میگوید که فقط عمل اسمبل کردن را انجام دهد ولی برنامه را لینک نکند.
coff/ به MASM یادآوری میکند که فایل object را با فرمت Common Object File Format یا COFF بسازد.
Cp/ به MASM گوشزد میکند که شناسه های تعریف شده توسط برنامه نویس را بصورت Case Sensitive در نظر بگیرد (در واقع میتوان این کار را با اضافه کردن عبارت option casemap:none بلافاصله پس از Model نیز انجام داد).
پس از اسمبل کردن برنامه با موفقیت، همانطوری که میدانید فایل msgbox.obj ساخته میشود و این اولین گام است. حال لازم است که برنامه را لینک کنیم:
link /SUBSYSTEM:WINDOWS /LIBPATH:C:\MASM32\LIB msgbox.obj
SUBSYTEM/ مشخص کننده نوع EXE فایلی است که ساخته میشود.
LIBPATH/ هم مکان فایلهای کتابخانه ای را مشخص میکند که معمولاْ MASM32\LIB است.
پس از لینک کردن فایل اجرایی msgbox.exe که تحت ویندوز قابل اجرا است، ساخته میشود. این فایل را میتوانید اجرا کنید، ولی همانطوری که دیدیم این برنامه کار خاصی را انجام نمیدهد. در درس بعد برنامه ای مینویسیم که کار خاصی را انجام دهد!
تا بعد!!
تا بعد!!
386.
model flat, stdcall.
data.
code.
:start
.....
end start
همانطوری که میدانید اجرای برنامه از محلی شروع میشود که نام مقابل end انتهای برنامه مشخص میکند. یعنی در برنامه فوق برنامه از دستور بعد از :start شروع میشود. زمانی که دستورات برنامه به پایان میرسد و نیاز است که کنترل به ویندوز بازگردد، یک API فراخوانده میشود: ExitProcess.
ExitProcess Proto uExitCode:DWORD
خط فوق فراخوانی یک Prototype تابع است. Protype تابع ویژگیهای یک تابع را برای اسمبلر/لینکر تعریف میکند و اسمبلر/لینکر از طریق این تعریف میتواند نوع پارامترهای تابع را از نظر صحیح بودن بررسی کند. قالب کلی یک Prototype تابع بصورت زیر است:
...,FunctionName PROTO [ParameterName]:DataType, [ParameterName]:DataType
یا بصورت خلاصه، نام تابع با کلمه کلیدی Proto و سپس لیستی از پارامترهای ارسالی و نوع آنها (که با کاما از هم تفکیک میشوند) در این تعریف نوشته میشود. در مثالی که برای ExitProcess ذکر شد، میبینیم که فقط یک پارامتر وجود دارد و نوع آن Double Word است. Prototypeها زمانی که از invoke (فراخوانی از نوع High-Level) استفاده میکنید، بسیار مفید است. invoke یک فراخوانی ساده است که عمل بررسی نوع پارامترها را هم انجام میدهد.
بعنوان مثال اگر از این دستور استفاده کنید:
call ExitProcess
بدون اینکه قبل از آن یک Double Word را در Stack قرار داده باشیم، پس از اتمام برنامه اسمبلر/لینکر نمیتواند نوع خطایی که احتمالاْ در برنامه پیش آمده را به برنامه نویس برگرداند. ولی اگر از invoke استفاده کنیم:
invoke ExitProcess
لینکر به شما پیغام خطا میدهد که فراموش کرده اید یک Double Word در Stack قرار دهید. قالب کلی invoke بشکل زیر است:
[INVOKE expression [,arguments
expression میتواند نام یک تابع یا اشاره گری به آن باشد. پارامترهای تابع با کاما از هم جدا میشوند.
تقریباْ تمامی توابع API در فایلهای Include نگهداری میشوند. اگر از MASM32 استفاده کنیم، فولدری به همین نام در هنگام نصب برنامه ایجاد میشود (MASM\INCLUDE) که شامل فایلهای Include است. پسوند این فایلها همانطوری که میدانید inc. بوده و protoype توابع موجود در DLLها در آنها ذخیره شده است. این فایلها همنام DLLها هستند ولی با پسوند inc. بعنوان مثال ExitProcess متعلق به Kernel32 است و بهمین علت protoype آن در فایل kernel32.inc قرار دارد. شما هم میتوانید برای توابع خود prototype بسازید و آنرا در فایل Include که برای خودتان ایجاد کرده اید، قرار دهید.
تا بعد!!
زمانی که یک برنامه تحت ویندوز در حافظه Load میشود، ویندوز اطلاعات ذخیره شده در برنامه را میخواند. این اطلاعات شامل نام توابعی که در برنامه مورد استفاده قرار گرفته و DLL هایی که این توابع در آنها قرار دارند، میباشد. زمانی که ویندوز اطلاعات مورد نظر را در برنامه میبیند، DLL مربوطه را در حافظه Load کرده و آدرس تابع استفاده شده در برنامه را با آدرس واقعی حافظه تغییر میدهد.
بصورت کلی دو دسته توابع API وجود دارند: ANSI و Unicode. اسامی توابع ANSI با حرف A خاتمه می یابند، مانند: MessageBoxA. همچنین توابع Unicode با حرف W نشان داده میشوند. بصورت استاندارد ویندوز ۹۵ از توابع ANSI و ویندوز NT از توابع Unicode استفاده میکنند.
ما با رشته های ANSI آشنا هستیم، یعنی آرایه ای از کاراکترها که با کاراکتر Null خاتمه یافته است. طول هر کاراکتر ANSI یک بایت است. با وجود اینکه استاندارد ANSI قابلیت نمایش حروف زبانهای اروپایی را دارد ولی قادر نیست زبانهای شرقی را که شامل تعداد زیادی کاراکتر خاص هستند، حمایت کند. به همین علت Unicode بوجود آمد. هر کاراکتر در Unicode دو بایتی است و بنابراین ۶۵۵۳۵ نوع کاراکتر مختلف را میتواند در یک رشته نمایش دهد.
در اکثر اوقات شما نام API مورد نیاز خود را در برنامه ذکر میکنید و نوع Platform بصورت اتوماتیک بنا بر وضعیت موجود، انتخاب میشود.
این نکات را گفتیم، چون در برنامه هایی که مینویسیم، از این نوع توابع استفاده میکنیم.
تا بعد!!
اولاْ ، فرصتی که پیش بیاد و بتونم سر فرصت مطالعه کنم و بعد مطالب رو جمع بندی کنم و بنویسم کمتر پیش میاد! شرمنده، البته یه خورده تنبلی از منه! ولی سعی خودمو میکنم تا جبران کنم!
نکته دوم اینه که دیدم بعضی از دوستان مطالبی رو اینجا بعنوان نظر مینویسن که از دید من (بازم میگم از دید من!) جاش اینجا نیست، بنابراین تصمیم گرفتم نظرات رو اول بخونم، بعد اونایی که رو که فکر میکنم مناسبه و مشکلی نداره تایید کنم! (مگه اینطور نیست که میگن صلاح مملکت خویش خسروان دانند، بابا، من همین جا رو از دار دنیا دارم، اقلاْ بذارین هرجوری دلم میخواد بهش سر و شکل بدم!). شاید فکر کنین سانسور میکنم یا چه میدونم خودسانسوری میکنم ولی این اجازه رو به من بدین که اقلاْ همین یه جا رو به اختیار خودم حرف بزنم!!
نکته سوم، ایام عزاداریه امام سومه، تسلیت میگم به همه دوستداران اون حضرت و امیدوارم که شناخت مقامات مذهبی ما فقط در این مراسم خلاصه نشه. فکر میکنم نیاز داریم راجع به اونا عمیقاْ مطالعه کنیم و اهدافی که اونا داشتند رو بیشتر بررسی کنیم که آیا ما هم بدنبال همون اهداف هستیم یا اینکه اهداف خودمون رو در پوشش دین و مذهب دنبال میکنیم!
نکته چهارم که دیگه گفتن نداره، پرونده ارجاع شد به شورای امنیت و باید صبر کنیم ببینیم آخر و عاقبتمون چی میشه!
تا بعد!!
?DATA.
CONST.
CODE.
هر چهار Directive فوق مشخص کننده بخشهای مختلف برنامه می باشند (دقت کنید قبلاْ به این قسمتها سگمنت میگفتیم ولی اینجا دیگر سگمنت وجود ندارد). در win32 میتوان تمام فضاهای آدرسی را به بخشهایی تقسیم بندی کرد، که شروع هر بخش، انتهای بخش قبل را مشخص میکند. این بخشها در دو گروه دسته بندی میشوند: Data و Code. بخش اول (یعنی Data) سه نوع طبقه بندی دارد:
Data.: در این قسمت داده هایی تعریف میشوند که دارای مقدار اولیه باشند.
?Data. : در این قسمت داده هایی تعریف میشوند که بعداْ مقداردهی میگردند. گاهی اوقات پیش می آید که بخواهیم فضایی را برای یک متغیر در حافظه در نظر بگیریم، ولی به آن متغیر مقدار ندهیم. مزیت این کار این است که حجم برنامه در مقایسه با متغیری که از قبل دارای مقدار باشد، کمتر میشود. یعنی در زمان اجرا اینگونه متغیرها از حافظه فضا میگیرند.
Const. : همانطوری که از اسمش پیداست در این بخش مقادیر ثابت تعریف میشوند.
نکته قابل توجه این است که لزوماْ تمام بخشهای فوق نباید در یک برنامه وجود داشته باشد، هر قسمتی که نیاز داشتید در برنامه اضافه کنید.
برای Code هم فقط یک بخش وجود دارد که با عبارت Code. آغاز میشود. دستورات برنامه باید مابین
<end <label
قرار گیرند که Label یک نام اختیاری است.
تا بعد!!
نه از سر او، كه فرمانرواي او باشد،
نه از پاي او كه لگدكوب اميال او باشد،
از پهلوي او كه برابر و در كنار او باشد،
از زير بازوي او كه مورد حمايت او باشد و از نزديكترين نقطه به قلب او كه مورد عشق او باشد.
تا بعد!!
این یکی از Directive هاست که به اسمبلر یادآوری می کند از مجموعه دستورالعملهای ریزپردازنده ۳۸۶ استفاده کند. همچنین میتوان 486. یا 586. را نیز بکار برد، ولی فعلاْ ما همین 386. را در برنامه ها مینویسیم. البته برای هر مدل پردازنده از دو فرم مشابه میتوان استفاده کرد: 386P یا 386 و یا 486P یا 486. مدل P تنها زمانی بکار میرود که در برنامه ها بخواهیم از دستورات Privileged استفاده کنیم (این دستورات در حالت Protected ، دستورات رزرو شده توسط CPU و سیستم عامل هستند. نمونه برنامه هایی که از این دستورات در آنها وجود دارد Virtual Device Driver ها هستند). در اکثر اوقات برنامه هایی که ما مینویسیم بصورت Non-Privileged هستند و بنابراین از Directive های ساده مثل 386. استفاده میکنیم.
Model Flat, StdCall.:
همانطوری که میدانید این Directive مدل حافظه ای برنامه را مشخص میکند و همانطوری که قبلاْ گفتیم در Win32 تنها مدلی که استفاده میشود مدل Flat است.
StdCall به اسمبلر روش ارسال پارامتر را توضیح میدهد. این روش می تواند چپ براست یا راست به چپ باشد، همچنین چگونگی تنظیمات Stack بعد از فراخوانی توابع توسط این Directive تعیین می شود.
در win16 دو قاعده برای فراخوانی وجود دارد: C و Pascal.
در روش C پارامترها از راست به چپ ارسال می شوند، یعنی سمت راست ترین پارامتر، اول Push میشود. در این حالت برنامه فراخواننده مسئولیت تنظیم قالب Stack را در هنگام فراخوانی برعهده دارد. بعنوان مثال زمانی که تابع زیر به روش C فراخوانده میشود:
(foo(int first_param, int second_param, int third_param
کد اسمبلی بصورت زیر خواهد بود:
push [third_param] ; Push the third parameter
push [second_param] ; Followed by the second
push [first_param] ; And the first
call foo
add sp, 12 ; The caller balances the stack frame
در روش Pascal مراحل برعکس روش قبل می باشد. یعنی پارامترها از چپ براست ارسال میشوند و بنابراین برنامه فراخوانده شده مسئولیت تنظیم قالب Stack را برعهده دارد.
روش C زمانی بکار میرود که در هربار فراخوانی تعداد متفاوتی پارامتر ارسال میشود. نمونه این مسئله را در فراخوانی تابع ()wsprintf دیده میشود. در هنگام فراخوانی این تابع چون خود تابع نمیداند که در هنگام فراخوانی چند پارامتر ارسال میشود در نتیجه نمیتواند قالب Stack را تنظیم کند.
StdCall تلفیقی از روشهای C و Pascal میباشد. یعنی پارامترها از راست به چپ ارسال میشوند ولی برنامه فراخوانده شده وظیفه تنظیم قالب Stack را برعهده دارد.
Win32 بصورت کاملاْ انحصاری از این روش پیروی میکند.
تا بعد!!
در حالت ۳۲ بیتی دیگر نیازی به سگمنت و مدلهای مختلف حافظه نداریم، چرا که در این حالت فقط یک مدل حافظه ای (Flat) وجود دارد و دیگر از سگمنتهای ۶۴ کیلوبایتی خبری نیست. فضای حافظه به صورت یکپارچه و به اندازه ۴ گیگابایت در دسترس است. همچنین دیگر نیازی به ثباتهای سگمنت دیده نمیشود. می توان از هریک از ثباتهای سگمنت برای آدرسدهی به هرجای حافظه استفاده کرد و این کمک بسیار بزرگی به برنامه نویسی است که قبلاْ با زبانهای سطح بالا براحتی کار میکرده است.
زمانی که تحت ویندوز ۳۲ بیتی برنامه نویسی می کنید، باید چند قانون مهم را بدانید. اولین قانون این است که ویندوز از ثباتهای ESI و EDI و EBP و EBX برای عملیات داخلی خود استفاده میکند. در صورتی که از هر یک از این چهار ثبات در برنامه استفاده شود، باید مقادیر اولیه در جایی ذخیره شده و در انتها به ثباتها بازگردند.
ساختار یک برنامه اسمبلی تحت ویندوز بشکل زیر است:
386 .
.MODEL Flat, STDCALL
DATA .
......
?DATA.
......
CONST .
......
CODE .
همین. حالا باید هر بخش را با هم مرور کنیم، که در درس های بعد این کار را انجام میدهیم.
تا بعد!!
شاید کسی حوصله پیگیری نداشته باشه، ولی مینویسم برای دل خودم، شاید یکی پیدا شد و دنبال کرد این خضعبلاتو!!
یاد اون مورچه بیچاره افتادم که خودکشی کرد، چون بعد از دو سال فهمید که عاشق یه تفاله چایی شده بوده!
در ضمن اسمبلی تحت ویندوز رو هم در قسمت آرشیو موضوعی، با نام اسمبلی Win32 شروع کردم، اگر دوست داشتین دنبال کنین!
تا بعد!!
ای دیار روشنم، شد تیره چون شب روزگارت
کو چراغی جز تنم کاتش زنم در شام تارت
ماه کو، خورشید کو؟ ناهید چنگی نیست پیدا!
چشم روشن کو که فانوسش کنم در رهگذارت
آبرویت را چه پیش آمد که اینبیآبرویان
می گشایند آب در گنجینههای افتخارت
شیرزن شیرش حرام کام نامردان کودن
کز بلاشان نیست ایمن گور مردان دیارت
می فروشند آنچه داری: کوه ساکن، رود جاری
می ربایند آهوان خانگی را از کنارت
گنجهای سر به مهرت رهزنان را شد غنیمت
درج عصمت مانده بیدردانگان ماهوارت
شب که بر بالین نهم سر، آتش انگیزم ز بستر
با گداز سوز و ساز مادران داغدارت
در غم یاران بندی، آهوی سر در کمندم
بند بگشا- ای خدا- تا شکر بگذارد شکارت
مدعی را گو چه سازی مهر از گل در نمازت
سجده بر مسکوک زر پر سودتر آید به کارت
ای زن ای من! بر کمر دستی بزن، بر خیز از جا
جان به کف داری همین بس بهره از دار و ندارت
تا بعد!!
ولی وقتی نداریش همه اش تو فکرشی و صبح و شبتو به یاد اون میگذرونی! با خودت میگی کاشکی بود و ای کاش زمان رو از دست نداده بودم و اون موقع که بود، قدرشو میدونستم!
حالا هم هرچی دنبالش میگردی دیگه پیداش نمیکنی، انگار دود شده و رفته تو آسمونا!
فقط من این حس رو دارم، یا شما هم این تجربه رو داشتین؟
تا بعد!!
منکر این قضیه نیستم که در حال حاضر هم استادهای گرانقدری در دانشگاه ما در حال تدریس هستند ولی خودمونیم، تعدادشون نسبت به زمان ما کمتر شده و فکر میکنم نسلشون در حال انقراضه! اینطور نیست؟!
تا بعد!!
چند وقتیه میشنوم از این ور و اونور که نمره خریدنی شده!! راستش اولش باورم نمیشد، کدوم استادی میاد پول بگیره نمره بده! اینا همش شایعست! ولی وقتی چند تا از نزدیکان من گفتن که خودشون این کار و کردن، خیلی افسوس خوردم! لابد میگین افسوس خورده که چرا خودش اینکار و نکرده! نه، باور کنین نه! بنظر من یکی از اولین شرایط تدریس در هرجا (مدرسه یا دانشگاه فرقی نمیکنه) اینه که مدرس فکرش درگیر پول نباشه! منظورم این نیست که از پول بدش بیاد (که میدونم هیچکسی نیست که این جوری باشه) یا اینقدر مایه دار باشه که بگه به پول نیازی ندارم! ولی باید یه جورایی علاقه به تدریس اونو کشیده باشه تو این وادی، نه بوی پول!
نظر شما چیه؟ شما تا حالا این کارو کردین؟ خواهشم اینه که بدون اینکه از کسی نام ببرین، نظرتون رو اعلام کنین!
تا بعد!!
تا بعد!!
ولی آدم وقتی که درگیر زندگی میشه دیگه به این راحتیها نمیتونه همه چی رو ول کنه و بره تو کار فیلم دیدن! الان شاید بیش از ۵ ساله که تو جشنواره فیلم ندیدم! نه اینکه دیگه دوست نداشته باشم، فرصتش نیست! تازه، فکر میکنم تو این دوره و زمونه دیگه نوبت عاشقی ارزش نباشه، بلکه عشق نوبتی ارزشمند شده برای بعضیها!! یعنی آدما برا فیلم دیدن نمیرن سینما، میرن سینما که همدیگر رو ببینن!!
فکر میکنم چند تا فیلمه که اگه تونستین ببینین، بدک نباشه: چهارشنبه سوری، به نام پدر، آفساید و زمستان است. شاید کافه ستاره هم فیلم سرگرم کننده ای باشه! اگه دیدین نظرتون رو راجع بهش بگین!
تا بعد!!
ترسم از اینه که یه وقت خدای نکرده، گرفتار توهم بشم و فکر کنم از همه بهترم! میدونم که از تقریباْ قریب به اتفاق آدما اگر بدتر نباشم، بهتر نیستم!
پذیرای گرم انتقادها وپیشنهادهای شما هستم، تا خودمو اصلاح کنم! هر کسی هر نظری داره بگه، تا اگه بتونم اونو اجرا کنم و یه خرده بیشتر تامل کنم در مورد خودم!
تا بعد!!
آهان حالا فهمیدم، یه آقایی (یا شاید خانومی!) توی یه دانشگاه درس میداده بعد یه ایمیل براش میاد که یکی از دانشجوهاش براش فرستاده! هیچ ربطی هم به من نداره، بخونین:
به رسم ادب سلام،
آغاز تحصیلات دانشگاهی رو با ++C آغاز کردیم، با استادی بنام ....، حساب تقدیر بود. یک دل نه صد دل عاشق رشته شدیم و گفتیم هدف همینجاست. کعبه ما دیگه نرم افزاره. غافل از اینکه ++C به تنهایی ثمری نداره، بیان شیرین و جذاب استاد بوده که ما رو مجذوب و شیفته و مشتاق یادگیری و امتحان برنامه ها کرده. چه بسا اگر با استاد دیگری برمی داشتیم (که عده ای برداشتن) از کامپیوتر زده میشدیم... . حیف که نفهمیدیم علت اشتیاق ما در ++C از کجاست.
ترم بعد در پیشرفته جاش خالی بود. کمی حضورش احساس میشد ولی خودمونو با بودنش و برداشتن درس بعدی با او دلشاد میکردیم. حیف و صد حیف که این ترم او بود و ما بودیم و میدونستیم که ترم بعد رفتنیه و هیچ بهره ای نبردیم، آنچنان که باید و شاید. حیف که همیشه در غفلتیم. شاید با رفتنت خیال خیلی از استادها رو راحت میکنی چون دیگه تو کلاسشون نمیشنوند که "... گفت، ... نگفت".
زندگی صحنه یکتای هنرمندی ماست، هرکسی نغمه خود خواند و از صحنه رود، صحنه پیوسته بجاست، خرم آن نغمه که مردم بسپارند به یاد.
بالاخره رفتنت سخته، اگر هم شاید دیگه باهات کلاسی نداشته باشیم.
خدا پسرتو برات حفظ کنه و خودتو پایدار!
به رسم ادب، خداحافظ شما!
خب، خوندین؟ شرمنده شدم! روم سیاه، ببخشید!!
تا بعد!!
حالا که فکر میکنم می بینم راست میگین، آدمیزاد به امید زنده است، پس من چرا ناامید باشم (مگه من آدمیزاد نیستم؟!)، شاید هم جور شد و ترم بعد اومدیم!!
در مورد اون شخصی که اون داستان کوتاه رو توی برگش نوشته بود، باید بگم که پاس کرد، ولی نه بخاطر اون مطالب!! خب لابد غیر از این، چند تا سوال هم جواب داده بوده دیگه! نمرش ۱۰ شد، میدونین که ۱۰ در لیست من یعنی چی دیگه؟!!
تا بعد!!
پس به احتمال زیاد تا دو ترم بعد!! (البته وبلاگ فعال خواهد بود و بصورت مجازی کماکان در خدمتم!)
تا بعد!!
بخدا دوست ندارم کسی رو بندازم، اصلاْ من کسی رو نمیندازم، هر کسی نمره اش دست خودشه، یعنی خودش میخواد که بیفته! من از خدا میخوام همه پاس کنن! همه نمره هاشون عالی باشه، ولی چی کار کنم که نمیشه!
دوست ندارم ببینم غرور یه آدم اینقدر شکسته بشه، خواهش کنه، تمنا کنه، گریه کنه، اونم چی فقط بخاطر یه نمره! ولی متاسفانه امروز این مسئله بارها پیش اومد!! که امیدوارم ترم آخری باشه که شاهد این وضعیت هستم!
اونایی که پاس کردن مبارکشون باشه و اونایی که نکردن، ترم بعد، خدا بزرگه!!
میدونم که از امروز به بعد نه کسی تهرانی میشناسه، نه اسمبلی، همه چی فراموش میشه! مثل ترمهای دیگه!! ... ولی بی خیال، زندگی ادامه داره!!
تا بعد!!
تا بعد!!
