بایگانی دسته: روزنوشت

در نام گذاری از واحد استفاده کنید !!

نوشتن کد تمیز یکی از مهمترین مهارت هایی هست که هر برنامه نویسی باید حتما به اون توجه کنه. کد تمیز اصطلاح عامی به حساب میاد و به جنبه های مختلفی توی کد نویسی اشاره داره . از ظاهر کد گرفته تا نام گذاری متغیر ها و نوشتن کامنت داخل کد و غیره.
این مهارت به مرور زمان و قدم به قدم تقویت میشه و به نظر من بهترین روش یادگرفتنش این هست که چند وقت یکبار یکی از تکنیک هاش رو یاد بگیرید و سعی کنید از اون لحظه به بعد اون تکنیک رو داخل کد هاتون استفاده کنید.

مشکل کجاست ؟
به کد های زیر که به زبان های پایتون، جاوا و هسکل نوشته شدند نگاه کنید.
همه این  کد ها یک کار رو انجام می‌دهند یعنی سیستم رو برای یک مدت زمانی به تعلیق در میارن یا به عبارت دیگه از نظر زمانی توی اجرای برنامه تاخیر ایجاد می‌کنند. ظاهر کد که خیلی خوب و سادس ولی مشکل کجاست ؟‌

time.sleep(300)
Thread.sleep(300)
threadDelay 300


سوال اصلی این هست که برنامه ما چقدر قراره به حالت تعلیق در بیاد ؟ با توجه به کد های بالا برنامه پایتون برای 5 دقیقه،  برنامه به زبان جاوا برای 0.3 ثانیه و برنامه هسکل برای 0.3 میلی ثانیه به حالت تعلیق در میاد.
چیزی که مشخصه این هست که برنامه های مختلف از  واحد های زمانی مختلف برای کارهاشون استفاده می‌کنند و وقتی کسی کد رو میخونه اگر از قبل اطلاعات نداشته باشه باید بره و مستندات رو بررسی کنه و این یعنی کد به خودی خود خوانا نیست

راه حل چیه؟

۱ – نام گذاری برای آرگومان ها
بعضی از زبان ها مثل پایتون یا کاتلین این امکان رو دارند که بتونیم آرگومان هایی که به یک تابع می‌فرستیم رو به شکل کلید مقدار ارسال کنیم یعنی نام اون آرگومان رو هم کنارش قرار بدیم در نتیجه وقتی می‌خوایم تابع رو فراخوانی کنیم می‌تونیم اسم آرگومان رو کنارش بذاریم که اسم آرگومان، واحد رو هم داخل خودش داره.
یعنی به جای کد زیر

def frobnicate(timeout: int) -> None:
    ...

frobnicate(300)


این کد رو بنویسیم

def frobnicate(*, timeout_seconds: int) -> None:
    # The * forces the caller to use named arguments
    # for all arguments after the *.
    ...

frobnicate(timeout_seconds=300)


برای زبان هایی مثل جاوا هم که چنین امکانی رو ندارند میشه به شکل زیر یک متغیر تعریف کرد و واحد رو داخل اون مشخص کرد

sleep_seconds = 300
time.sleep(sleep_seconds)

۲ – استفاده از نوع داده خاص
راه حل اول همیشه جوابگو نیست چون زبان هایی مثل جاوا این امکان رو ندارن که بشه آرگومان ها رو همراه با اسم ارسال کرد. اما می‌تونیم نوع داده های خودمون رو داشته باشیم. مثلا به حای اینکه ورودی تابع من یک عدد int باشه که نشون دهنده زمان هست، ورودی از نوع کلاسی با عنوان TimeUnit باشه که واحد های زمانی رو داخل خوش مشخص میکنه.
یعنی به جای کد زیر

def frobnicate(timeout: int) -> None:
    ...

frobnicate(300)


از این کد استفاده کنیم

def frobnicate(timeout: timedelta) -> None:
    ...

timeout = timedelta(seconds=300)
frobnicate(timeout)


اما مسئله به اینجا ختم نمیشه و این مشکل نه تنها توی برنامه نویسی بلکه جا های دیگه هم وجود داره مثلا فرض کنید که می‌خواهیم با یک api کار کنیم و اون api جواب زیر رو برای ما ارسال می‌کنه.

{
   "error_code": "E429",
   "error_message": "Rate limit exceeded",
   "retry_after": 100,
}



راه حل هایی که گفته شد برای این موارد هم کاربرد داره مثلا برای این مورد می‌تونیم جواب رو به این شکل برگردونیم.

{
   "error_code": "E429",
   "error_message": "Rate limit exceeded",
   "retry_after_seconds": 100,
}


یا مثلا داخل فایل های کانفیگ برنامه ها ممکنه به چنین مواردی بر بخورید

request_timeout = 10



که بهتر هست به یکی از شکل های زیر تغییر کنند

request_timeout = 10s
request_timeout_seconds = 10


در نهایت این رو یادمون باشه که کدی خوبه که آدم های دیگه هم بتونن اون رو بخونن و هر چی کد های ساده تری رو بنویسیم برنامه نویس بهتری هستیم. کد های پیچیده  نوشتن نه تنها خفن بودن آدم ها رو نشون نمیده بلکه باعث میشه کم کم از بازی حذف بشیم و کسی دوست نداشته باشه باهامون کار کنه یا داخل پروژه هامون مشارکت کنه
منبع

باگ در !Hello World

میشه گفت اولین برنامه ای که هر برنامه نویسی نوشته Hello World هست. توی این برنامه شما فقط یک متن ساده رو داخل خروجی چاپ می‌کنید. اما چطوری ممکنه ی برنامه به این سادگی باگ داشته باشه ؟!

خب ، اول این رو بگم که توی زبان های مختلف این برنامه رو میشه به شکل های مختلفی نوشت مثلا توی زبانی مثل C یا C++ شما می‌تونید به چندین روش اون رو بنویسید. یکی از استاندارد ترین روش ها برای نوشتن این برنامه به زبان C کد زیر هست :

Hello World in C

اما هر چقدر هم که استاندارد بنویسیم باز هم این برنامه باگ داره 🙂
قبل از اینکه در مورد باگ این برنامه حرف بزنیم بیایید کمی با امکانات لینوکس آشنا بشیم.

dev/full/
توی لینوکس هر چیزی یا فایل هست یا پروسس. یکسری فایل هم داریم که واقعا فایل نیستن که بهشون میگیم device file مثل فایل های /dev/null و یا /dev/full.
فایل /dev/null مثل یک چاه هست که هیچ وقت پر نمیشه و هر چیزی که لازمش نداریم مثلا خروجی یک برنامه یا وارنینگ های یک برنامه رو داخلش میریزیم. فایل /dev/full برعکس dev/null/ ، فایلی هست که کاملا پر شده و شما نمی‌تونید داده ی جدیدی رو داخلش بنویسید. گاهی اوقات برای اینکه ببینیم برنامه ما IO stream ها رو به درستی مدیریت میکنه ازش استفاده می‌کنیم مثلا میخواهیم تست کنیم که آیا برنامه من زمانی که یک فایل پر شده می‌تونه به کار خودش ادامه بده و مشکلش رو حل کنه یا نه از این فایل برای تست استفاده میکنیم.
مثلا توی عکس زیر من یک متن رو داخل ترمینال چاپ کردم و خروجیش رو داخل این فایل ریختم و همونطور که می‌بینید بهم ارور داده که فضای کافی نداره.

?$
اگر به خط آخر مربوط به برنامه Hello World که بالا تر بود نگاه کنید می‌بینید که توی خط آخر از ‌return استفاده کردم. معنی این return این هست که اگر برنامه با موفقیت اجرا شد و به درستی به اتمام رسید مقداری که داخل EXIT_SUCCESS هست رو بهم برگردون و اگر موفق نبود خودش کد اروری که اتفاق افتاده رو برمیگردونه.
پس اگر قراره من بدونم که برنامم درست اجرا شده یا نه باید ببینم که چه مقداری رو بر میگردونه. توی لینوکس اگر بخواهیم مقدار بازگشتی برنامه رو بدونیم از ?$ استفاده میکنیم که یک متغیر هست و وضعیت خروج آخرین برنامه رو ذاخل خودش داره .
مثلا برنامه ای که توی تصویر بالا اجرا کردم به ارور خورد و حالا اگر بخواهم که مقدار بازگشتی این برنامه رو ببینم به این روش عمل میکنم :

دستور echo متنی رو روی صفحه کنسول من چاپ میکنه و همونطور که می‌بینید عدد 1 رو به من نشون میده که یعنی آخرین برنامه ای که اجرا کردی به ارور خورده و به درستی به اتمام نرسید. اگر 0 برگردونه یعنی برنامه به درستی اجرا و به اتمام رسیده.

باگ برنامه کجاست ؟ ‌
بیاید با چیز هایی که تا اینجا دیدیم برنامه Hello World رو اجرا کنیم.
من اول برنامه رو کمپایل می‌کنم ، اجراش میکنم و خروجیش رو داخل فایل /dev/full میریزم و بعد هم مقدار بازگشتی برنامه رو چک میکنم :

مشکل رو می‌بینید ؟ من انتظار داشتم که برنامه به من ارور بده و عدد 1 رو برگردونه چون فایل /dev/full  پر هست و نباید بشه چیزی رو داخلش نوشت اما خروجی چیز دیگه ای رو میگه.

مشکل کجاست ؟
بیایید ی نگاهی هم به سیستم کال ها یا همون فراخوانی های سیستمی کنیم. برای این کار توی لینوکس از دستور strace استفاده میکنیم

اگر نگاه کنید توی سمت راست اروری که ما میخواستیم وجود داره یعنی سیستم عامل این ارور رو تشخیص و گزارش داده ولی برنامه اون رو نادیده گرفته.

چقدر این باگ می‌تونه مشکل ساز بشه ؟
درسته که برنامه ی Hello World برنامه ی ساده ای هست و یک برنامه مهم و قابل استفاده نیست ولی داره همون کاری رو میکنه که یک برنامه واقعی ممکنه انجام بده، یک متن رو داخل خروجی استاندارد می‌نویسه و اون رو داخل یک فایل ریدایرکت میکنه.
فرض کنید فرزند یک پروسس میخواد داده ای رو به این شکل داخل یک فایل بنویسه و اون فایل حجم کافی رو نداره و داده ذخیره نمیشه اما برنامه هم ارور نمیده و والد پروسس هم متوجه ارور نمیشه و به کارش ادامه میده در نتیجه یکسری داده رو از دست میدیم.

توی زبان های دیگه چطور ؟
این باگ توی زبان های دیگه هم وجود داره داخل این لینک از گیت‌هاب می‌تونید لیست شون رو ببینید.

منبع

طرح صیانت تصویب شد

دو روز پیش یعنی 1400/12/3 طرح صیانت به تصویب رسید. این روز ها همه دارن در موردش حرف میزنند اما چیزی که به وضوح مشخصه این هست که این طرح خیلی وقت پیش شروع شده و الان صرفا علنی شده .
اکثریت مردم با این طرح مخالف هستند اما 18 نفر تصمیم گرفتن که موافق باشن  و اجراییش کنند.

اینجا نوشتمش که توی قسمتی از تاریخ باقی بمونه. شاید چند سال دیگه کسی پست های این وبلاگ رو بخونه و براش جالب باشه که توی این برهه از تاریخ مردم در تلاش برای بدست ‌‌آوردن مینموم حقوقشون بودند .

پ.ن : امروز هم 1400/12/5 هست که روسیه به اکراین حمله کرد. عده‌ای معتقدند که این جنگ جهانی سوم هست اما هنوز درگیری ها بین دو کشور وجود داره

web 3.0 چیست و آیا جایگزین وب فعلی خواهد شد ؟

یک از چیزهایی که این روزها خیلی در موردش حرف زده میشود web 3.0 هست و میشه گفت که ترند این روز های اینترنت هست.اینکه دقیقا چی هست رو هنوز اطلاع دقیقی ازش وجود نداره و بیشتر شکل تجاری و یک جورهایی تبلیغاتی به خودش گرفته.

قبل از اینکه در مورد وب 3.0 بنویسم ی نگاهی به گذشته اینترنت و وب داشته باشیم . اوایل همه گیر شدن اینترنت و وب که ما اون رو به عنوان web 1.0 میشناسیم کاربران صرفا مصرف کننده اطلاعات بودند یعنی یکسری صفحه ی استاتیک html بود که مثلا میتونستیم از داخل اون اخبار رو دنبال کنیم یا مجله بخونیم .
با گذشت زمان کمی ، مفهومی به نام web 2.0 مطرح شد که در واقع می‌تونیم فیسبوک رو بازیگر اصلی اون بدونیم و بعدش هم شبکه های اجتماعی و سرویس های دیگه که دنباله ی این مجموعه بودند. توی web 2.0 کاربران دیگه صرفا مصرف کننده اطلاعات نیودند بلکه بر عکس این کاربران بودند که اطلاعات و محتوا رو درست میکردند و داخل این بستر ها به اشتراک میذاشتند. مثلا یوتوب با اینکه یک سرویس اشتراک ویدیو هست ولی عمده محتوا و ویدیو های داخلش توسط کابران تولید میشوند. (اگر دوست داشتید به یوتوب من سر بزنید) .
نکته ای که باید بهش توجه کنیم این هست که سرویس هایی مثل یوتوب ، فیسبوک ، اینستاگرام و … همگی رایگان در اختیار کاربران قرار میگیرند و سوالی که پیش میاد این هست که چرا رایگان؟  و خب جوابش تقریبا مشخصه : “If you are not paying, so you are the product“.
در واقع شرکت های بزرگی که دارن این سرویس ها رو رایگان به کاربران میدهند ، اطلاعات کاربران را جمع آوری میکنند و به شکل های مختلفی که مهمترین اون ها استفاده در تبلیغات هست ، از اطلاعات استفاده می‌کنند.

مشکلی که در وب 2.0 وجود داره و ظاهرا وب 3.0 قرار هست اون رو برطرف کنه این هست که در وب 2.0 کاربران عمده اطلاعات را تولید میکنند  اما از اینکه چه دیتایی از کاربران جمع‌آوری میشه و یا اینکه اون دیتا ها کجا و در اختیار چه کسانی قرار میگیرند کنترل و اطلاع دقیق وجود نداره.
ایده وب 3.0 این هست که یک سیستم توزیع شده داشته باشیم (مثل تورنت) که اطلاعات رو به شکل بدون مرکزیت (decentralized) روی اون نگه داریم به عبارت دیگه توی وب 3.0 دیگر ارتباط بین نود ها یک ارتباط کلاینت ، سرور نیست بلکه هر نود داخل این شبکه هم سرور و هم کلاینت هست و یعنی ایده ای که داخل بلاک چین وجود داره الان به داخل وب هم راه پیدا کرده و قرار هست که وب 3.0 از این تکنولوژی به شکل یک زیرساخت استفاده کند.
پس میتونیم بگیم که web 3.0 قراره به شکل یک سیستم توزیع شده اطلاعات رو بین کاربران توزیع کنه و با این کار اطلاعات دیگه در انحصار شرکت های بزرگ وجود نداره و به شکل شفاف مشخص هست که اطلاعات به چه شکلی و کجا دارند استفاده میشوند.
چیزی که کاملا مشخصه این هست که اگر قرار باشه واقعا به شکل عملیاتی پیاده سازی بشه تغییرات بزرگی رو به همراه داره. شکل نرم افزار ها و سرویس ها احتمالا تغییر میکنن و به عنوان مثال احتمالا سرویس های فعلی اینترنت مثل گوگل ، یوتوب و …. دیگه به این شکل شاید ارائه نشوند (شاید هم بشوند هنوز چیزی مشخص نیست 🙂 ).

همانطور که اول مطلب اشاره کردم هنوز اطلاع دقیقی از نحوه عملکرد و اینکه واقعا قرار هست چه اتفاقی بیوفته در دست نیست. وب 3.0 این روز ها بیشتر شکل تجاری و تبلیغاتی به خودش گرفته و هر شرکت و شخصی که میخواهد نشان دهد خیلی به روز هست از این کلمه استفاده میکند.
این تغییرات یک شبه اتفاق نمی‌افتند و زمان بر هستند .کاری که فعلا ما میتونیم بکنیم این هست که صبر کنیم ببینیم در آینده چه اتفاقی میوفته ، ممکنه کل اینترنت رو دچار تحول و تغییر بکنه و یا ممکنه مثل خیلی از پروژه های دیگه به شکل یک ایده بدون پیاده سازی باقی بماند. ولی الان در حال حاضر خیلی دقیق نمی‌توان در موردش صحبت کرد.

کامپیوتری میخواهم که صاحب آن باشم

امروز داشتم مطلبی رو از یک وبلاگ شخصی می خوندم که به نظرم جالب اومد گفتم من هم در موردش بنویسم. اونم این بود که ما صاحب کامپیوتر هامون نیستیم.
ما حتی صاحب سیم کارت هامون یا حتی صاحب موبایل هامون هم نیستیم.
هزینه های زیادی رو بابت خرید یک گوشی یا یک سیم‌کارت میدیم ولی در نهایت کسی دیگه روی اون ها کنترل داره . این اتفاق هم توی سطوح مختلف میفته ، از لول های پایین که شرکت هایی مثل گوگل و … شروع میکنن به جمع کردن اطلاعات کاربراشون به بهانه اینکه میخوان به اونا کمک کنن ، تا سطح دولت های مختلف که از در پشتی یا شنود استفاده میکنند به این بهونه که میخوان مراقب ما باشن و امنیتمون رو تأمین کنن تا نشون دادن و فرستادن تبلیغ روی سیم کارت هایی که چندین برابر پول واقعیشون پول دادیم.
وجه مشترک همشون هم اینه که میخوان به ما کمک کنن و اینا فقط به خاطر کمک به ماست.
اگر من پول دادم و یک سیم کارت خریدم این سیم‌کارت منه و نباید کسی روش تبلیغ بفرسته و من رو مجبور کنه به دیدن یا خوندن چیزی که نمیخوام یا اگر پول دادم و ی لپ‌تاپ خریدم کسی نباید من رو مجبور کنه که از چه نرم افزار هایی استفاده کنم ، که اگر منو مجبور کنه یعنی من صاحب لپ‌تاپم نیستم و باید چیزی که اون میگه رو گوش کنم
با توجه به شکل زندگی امروزی این قضیه غیر‌قابل انکار و غیر قابل جلوگیریه. استفاده نکردن از هرکدوم از این وسایل باعث میشه که از جامعه دور بشید و شاید حتی زندگی رو هم مختل کنه .نویسنده اصلی توی قسمتی از مطلبش میگه که شاید باید بریم سراغ کامپیوتر هایی مثل x286 DOS که نتونن مارو دنبال کنن ولی باز هم این مشکل به شکل های دیگه ادامه پیدا میکنه. دوربین هایی که درسطح شهر نصب هستن و دائما اطلاعات آدمارو دارن و میدونن که شما الان کجایید یا دارین چیکار میکنین.
حتی سیستم هایی هم که از رمزنگاری استفاده میکنن هم نمیشه بهشون اعتماد کرد چون که خیلی از این الگوریتم های رمزنگاری توسط همون شرکت ها یا دولت ها طراحی میشن و خب نتیجه قابل حدسه.‌ استفاده از الگوریتم های متن باز هم مشکلات خودشون رو دارن که دائما این مشکلات گزارش میشن و برطرفشون میکنن.
یکی از دلایلی که من لینوکس رو به سیستم های دیگه ای (الزاما اینجا ماکروسافت و اپل ) ترجیح میدم آزادی بیشتری هست که می‌شه داشت. توی ویندوز شما عملا نمیدونی چه اتفاقی داره میوفته چون فقط قسمت های رو دارید می‌بینید که اون ها به شما اجازه دادن و خیلی از قسمت ها کدش قابل مشاهده نیست و ممکنه درب های پشتی ، سیستم های لاگر و … وجود داشته باشن. موضع اپل هم که از اول مشخص بوده ، قفس طلایی که شما فقط اجازه دارید از نرم افزار هایی که اونا اجازه میدن استفاده کنید.
فعلا که کار خاصی نمیشه با این قضیه کرد . به امید روزی که شاید قانونی تصویب بشه که اوضاع رو بهتر کنه.

برای انجام کاری، لازم نیست توی اون کار خوب باشیم

یکی از تصورات غلطی که همیشه وجود داشته برای خیلیا این بوده که اگر توی کاری بهترین نیستیم پس نباید انجامش بدیم و همین باعث میشه که هیچ وقت اون کار رو شروع نکنیم و با تصور اینکه توی اون کار خوب نیستیم حتی به نتیحه گیری هم نرسیم چون واقعا هیچ وقت انجامش ندادیم.
دلیل انجام ندادن کار ها هم میتونه چیز های متفاوتی باشه مثل ترس از شکست ، ترس از سرزنش ، اینکه مردم در مورد ما چی فکر میکنند و چیز های دیگه.
و خب همیشه عذاب امتحان نکردن بیشتر از عذاب شکست بوده پس بهتره که شروع کنیم به انجام دادنش نهایتا توی بد ترین حالت به شکست میرسیم و اتفاق خیلی خاصی نمیفته تاره تجربه هم بدست میاریم که مسلما ارزشمنده.
مسئله ی دیگه اینکه توی دنیا یک نفر که کامل همه چیز رو بلد باشه یا همه چیز رو باجزئیات دقیق بدونه وجود نداره ، منظورم از وجود نداره این هست که کسایی هم که توی یک کار مهارت زیادی دارند  بعضی اوقات یکسری چیز های رو فراموش میکنن. پس ترس از سرزنش دیگران یا اینکه بقیه چطوری در مورد ما فکر میکنند خیلی معنایی نداره.
راه حلش هم خیلی سادست کافیه سعی کنیم انجامش بدیم ، با حوصله پیش بریم ، یادبگیریم و مهمتر از همه تجربه کنیم و از مسیر لذت ببریم.
همه ی ما در نهایت تبدیل میشیم به چیزی که داریم در مسیرش حرکت میکنیم . فرض کنید یک کاری رو بلد نیستید اما از امروز شروع می‌کنید به انجام دادنش و قراره که یکسال انجامش بدید. اگر توی اون کار بدترین هم باشید بعد از گذشت یکسال مطمئنن پیشرفت کردید و با روز اولتون فرق کردید.پس میشه گفت که استعداد نقش اصلی رو بازی نمیکنه و تلاش ماست که مشخص میکنه چه اتفاقی بیفته.
البته اینم بگم که همه چیز به تلاش بستگی نداره و عوامل دیگه هم هستن که تاثیر میزارن، مشکل اصلی خیلی از کتاب ها مثل ، “قورباغه را قورت بده” یا مثلا “تخت خوابت رو مرتب کن” هم همینه . توی این جور کتاب ها میگن که مثلا اگر هرروز ساعت ۶ از خواب بیدار شی و همیشه تا دیر وقت بیدار باشی و تلاش کنی پس حتما موفق میشی اما “حتما” در کار نیست .
زندگی ما خواسته یا ناخواسته تحت تاثیر زندگی دیگران هم قرار میگیره و اینکه اتفاقات توی چه زمانی و به چه شکلی برامون پیش میان هم مهمه.
ی جمله ای رو هم چند وقت پیش یادم نیست کجا خوندم و نمیدونم از کیه ولی به نظرم این جمله نقش تلاش رو به خوبی نشون میده “شانس زمانی معنی پیدا میکنه که شما براش آماده باشید”