جاوا‌اسکریپت: بررسی وجود یک ویژگی در شئ

برای این کار سه روش معمول وجود داره که به ترتیب اونارو بررسی می‌کنیم:

روش خسته: استفاده از خاصیت undefined

انجام این کار به لطف یک رفتار خاص و البته جالب جاوا‌اسکریپت خیلی راحت انجام می‌شه: اگه یک ویژگی در شیئ موجود نباشه، مقدار undefined برای اون بر‌می‌گرده. مثلا:

const objA = {
  propA: 'A property!',
  propB: 'B property!',
};

console.log(typeof objA.propA); // prints 'string'
console.log(typeof objA.propC); // prints 'undefined'


function fA (obj) {
  // هست propFooBar اگه شیئ دارای ویژگی
  if (obj.propFooBar === undefined) // Or: typeof obj.propFooBar === 'undefined'
    console.log(obj.propFooBar);
  else
    console.log('Object does not have propFooBar');
}

fA({propSilly: "I am silly!"}); // prints 'Object does not have propFooBar'
fA({propFooBar: "I am here!"}); // prints 'I am here!'

از اونجا که در جاوا‌اسکریپت undefined وقتی به یک مقدار بولین (Boolean) تبدیل میشه معادل false میشه، شاید بعضیا تصور کنن به جای استفاده از اپراتور typeof یا مقایسه با undefined می‌تونن این کار رو انجام بدن:

const objA = {};
const objB = {propFooBar: false};

function fA (obj) {
  if (obj.propFooBar)
    console.log('Object has propFooBar');
  else
    console.log('Object does not have propFoobar');
}

/*
 * هردوی دستورات زیر خروجی دوم رو چاپ می‌کنن
 * رو ندارن propFooBar یعنی تابع فکر می‌کنه هردوی این اشیاء ویژگی 
 * در صورتی‌که شئ دوم این ویژگی رو داره
 */
fA(objA);
fA(objB);

اما این کار اشتباهه چون اگه حتی propFooBar در شئ تعریف شده باشه و مثلا مقدارش false یا null باشه بازهم به این تعبیر می‌شه که این ویژگی تعریف نشده و می‌تونه برنامه رو با خطا مواجه کنه.

حالا چرا گفتیم این ویژگی خاصه؟ چون در اکثر زبان‌ها (مثل پایتون)، وقتی می‌خوایم به یک ویژگی از شئ که اون ویژگی موجود نیست، دسترسی پیدا کنیم، با خطا مواجه می‌شیم. یعنی برای بررسی وجود یک ویژگی در شئ باید یک بلوک try…catch بنویسیم یا از توابع و امکانات خاصی که در اون زبان وجود داره استفاده کنیم (مثلا در پایتون میشه از تابع hasattr استفاده کرد). اما توجه کنید که این ویژگی در جاوا‌اسکریپت یه چاقوی دو لبس و اگه حواسمون نباشه می‌تونه آسیب بزنه!

روش دوم: استفاده از hasOwnProperty

بیاین شیئ زیر رو در نظر بگیریم:

const objC = {
  propA: undefined,
};

در objC ویژگی propA تعریف شده ولی صریحا مقدار undefined به اون داده شده! احتمالا می‌تونید حدس بزنید که اگه بخوایم با استفاده از روش قبلی بررسی کنیم که آیا این شئ ویژگی propA رو داره یا نه به اشتباه فکر خواهیم کرد که این ویژگی روی شئ تعریف نشده، در صورتیکه اینطور نیست! پس باید چیکار کرد؟ باید دست به دامن ابزار‌های خاصی شد که جاوا‌اسکریپت برامون فراهم کرده. ادامه مطلب

ترفند پایتونی: بروزرسانی پکیج‌هاي pip در اوبونتو

متاسفانه هنوز دستوری برای بروزرسانی تمام بسته‌های pip وجود نداره؛ و برای این کار باید هر بسته رو جداگونه بروزرسانی کرد. (گرچه این امکان به عنوان یه درخواست برای تیم توسعه pip در حال بررسیه و شاید بزودی به pip اضافه بشه)

دستوری که من برای این کار (در اوبونتو) ازش استفاده می‌کنم و ممکنه به درد شما هم بخوره، این دستوره: (برای python3)

pip3 list --outdated | cut -d ' ' -f 1 | xargs -n1 pip3 install -U --user

و برای python2:

pip list --outdated | cut -d ' ' -f 1 | xargs -n1 pip install -U --user

اگه می‌خواید بسته‌ها به جای user برای کل سیستم نصب بشن کافیه این تغییرات رو بدید : (برای python2 به جای pip3 از pip استفاده کنید)

pip3 list --outdated | cut -d ' ' -f 1 | xargs -n1 sudo pip3 install -U

اگه نسخه‌ای از pip رو استفاده می‌کنید که از دستور pip3 list –outdated پشتیبانی نمی‌کنه، این لینک ممکنه بدردتون بخوره.

و اگه علاقه‌مندید بدونید این دستور چطوری کار می‌کنه، فهمیدن طرز کار دستورات cut و xargs و مفهوم pipeline در لینوکس می‌تونه کمکتون کنه.

اگه ترفند مرتبطی بلدید و یا پیشنهادی دارید، در پایین پست دیدگاهتون رو با بقیه سهیم بشید 🙂

ترفند پایتونی: پیاده‌سازی آسون توابع مقایسه‌ای

انواع اپراتور‌های مقایسه‌ای در پایتون و تابع مربوط به اونا برای پیاده‌سازیشون در کلاسها به شرح زیر هستن:

  • <           __gt__
  • >           __lt__
  • ==        __eq__
  • =!         __ne__
  • =<        __ge__
  • =>        __le__

فرض کنید می‌خوایم مفهوم خط هندسی رو در قالب یه کلاس پیاده‌سازی کنیم:

from math import sqrt


class Line:
    """
    پیاده سازی خط هندسی
    """
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def length(self):
        """
       محاسبه طول خط
        """
        return sqrt(self.x**2 + self.y**2)

حالا فرض کنید دو تا شیئ از این کلاس درست می‌کنیم و بعد از اون، طول این خط‌ها را که در قالب کلاس Line تعریف شدن، باهم مقایسه می‌کنیم:

l1 = Line(1, 2)
l2 = Line(-3, -4)

if l1 < l2:
    print('اولی کوچیکتره')

اگه کد بالا رو اجرا کنیم با خطای ()TypeError: unorderable types: Line() < Line مواجه می‌شیم. این خطا داره بهمون میگه که اپراتور کوچکتر از برای این کلاس تعریف نشده. پس نیاز داریم تا اول این اپراتور رو تعریف کنیم:

from math import sqrt


class Line:
    """
    پیاده سازی خط هندسی
    """
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def length(self):
        """
        محاسبه طول خط
        """
        return sqrt(self.x**2 + self.y**2)
        
    def __lt__(self, other):
        """
        < سربارگذاری عملگر
        """
        return self.length() < other.length()

می‌بینید که برای کلاس Line مفهوم کوچکتر بودن رو این معنا کردیم که طول خط یکی، کوچتر از دیگری باشه. مثلا اگه به جای خط قرار بود کلاس Person (اطلاعات یک شخص) رو پیاده‌سازی کنیم ممکن بود مفهوم کوچتر بودن رو، کوچکتر بودنِ سن یک فرد نسبت به دیگری معنا می‌کردیم.
بعد از تعریف این متد، دیگه به راحتی می‌تونیم دو شیئ از کلاس Line رو با عملگر > باهم مقایسه کنیم.

اما بقیه عملگرها چی؟ هنوز ۵ تای دیگه باقی موندن!

نکتهاپراتور‌های زیر دو به دو همدیگه رو انعکاس میدن؛ به این معنا که اگه یکی رو پیاده سازی کنیم و دیگری رو پیاده‌سازی نکنیم، اپراتور دیگری اتوماتیک پیاده‌سازی خواهد شد:

  • >     و    <
  • ==   و    =!
  • =>   و    =<

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

اما می‌رسیم به قسمت خوب ماجرا؛ تابع total_ordering در ماژول functools.
در مستندات این تابع اینطور نوشته که تنها کافیه یکی از توابع __lt__، __gt__، __le__ یا __gt__ به همراه تابع __eq__ رو برای کلاسمون تعریف کنیم و کلاس رو با تابع total_ordering دکور کنیم! بعدش خیلی راحت کلاسمون هر شش تابع مقایسه‌ای رو خواهد داشت. مثال:

from math import sqrt
from functools import total_ordering


@total_ordering
class Line:
    """
    پیاده سازی خط هندسی
    """
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def length(self):
        """
        محاسبه طول خط
        """
        return sqrt(self.x**2 + self.y**2)
    
    def __eq__(self, other):
        """
        == سربارگذاری عملگر 
        """
        return self.length() == other.length()
        
    def __lt__(self, other):
        """
        < سربارگذاری عملگر 
        """
        return self.length() < other.length()

 

البته ناگفته نمونه که اگه برای برنامه شما سرعت خیلی حیاتیه، بهتره توابع مقایسه‌ای رو خودتون و به صورت دستی پیاده‌سازی کنید؛ چون استفاده از این روش نسبت به پیاده‌سازی دستی کندتره.

اگه اشکالی در جایی از متن پیدا کردید و یا پیشنهادی داشتید، ممنون می‌شم تا پایین پست، دیدگاهتون رو با بقیه در‌میون بذارید 🙂

args* و kwargs** در پایتون

args* به ما این امکان رو میده که به جای تعداد ثابتی ورودی یه تابع بتونه تعداد متغیری ورودی بگیره. برای مثال تابع زیر رو در نظر بگیرید:

def my_sum(a, b):
    return a + b

my_sum(2, 3) # 5

این تابع دو تا عدد رو باهم جمع می‌کنه و همیشه دو تا ورودی می‌گیره و اگه بیشتر یا کمتر ورودی بهش بدیم با خطا مواجه می‌شیم.
فرض کنید به جای دو عدد میخوایم چندتا عدد (که ممکنه در هر بار فراخوانی تابع تعدادشون فرق کنه) رو با هم جمع کنیم. یه راه اینه که تابعمون یه ورودی list بگیره و اعداد توی لیست رو با هم جمع کنه. برای مثال:

def sum_list(nums):
    sum = 0
    for num in nums:
        sum += num
    return sum

sum_list([2, 3]) # 5
sum_list([2, 3, 5, 8]) # 18

اما راه دیگه اینه که به جای قرار دادن عددهامون توی یه لیست، اونارو مستقیم و به شکل آرگومان به تابعمون بدیم:

def my_sum(*nums):
    sum = 0
    for num in nums:
        sum += num
    return sum
    
my_sum(2, 3) # 5
my_sum(2, 3, 5, 8) # 18

ادامه مطلب

فشرده‌سازی تصاویر JPEG با خط فرمان لینوکس

قانون نانوشته‌ای هست که میگه برای انجام هرکاری یه روش به سبک ترمینال لینوکسی وجود داره! فشرده‌سازی تصاویر JPEG هم از این قاعده مستثنی نیست.

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

ادامه مطلب

ترجمه داستانِ کوتاه “هدایای کریسمس”

یک دلار و هشتاد و هفت سنت؛ تمام پولی که همراهش بود. هرروز وقتی برای خرید بیرون می‌رفت، خیلی کم خرج می‌کرد. ارزان‌ترین گوشت و سبزیجات را می‌خرید، و درحالیکه از خستگی رمقی برای راه رفتن نداشت، تمام فروشگاه‌ها را می‌گشت تا ارزانترین غذا را پیدا کند.

دِلا (Della) پول را دوباره شمرد. اشتباه نکرده بود. درست یک دلار و هشتاد و هفت سنت ته جیبش باقی مانده بود؛ و فردا هم کریسمس بود. ادامه مطلب

git dago

یکی از امکانات دلنشین git، امکان ایجاد دستورات مستعاره (alias). و یکی از دستورات مستعاری که من خیلی از اون استفاده میکنم dago هست که به شکل زیر تعریف میشه:

git config --global alias.dago "log --decorate --all --graph --oneline"

این دستور همون دستور git log است که option هایی به اون اضافه شده. و نتیجه اجرای دستور گرافی از commit های مخزن به شکل زیر رو تولید میکنه: git dago output in terminal

SU در لینوکس به زبان ساده

SuperUser

لینوکس تمهیدات امنیتی زیادی برای حفاظت از سیستم ما در برابر تهدیدات و بعضا اشتباهات و حماقت‌های خود ما دارد!
سه ویژگی اصلی برای اعمال محدودیت و ارائه‌ی دسترسی و انجام تغییرات در سیستم (در صورت نیاز) در لینوکس به شرح زیر است:

اگرچه از SU معمولا به عنوان super user یاد می‌شود اما در حقیقت SU مخفف substitute user است و امکان اجرای دستورات با file permissions‌های کاربران دیگر را به ما می‌دهد و این کاربر دیگر به طور پیشفرض کاربر ریشه است. این ابزار بسیار قوی و کمک‌کننده است اگر به طور صحیح استفاده شود و از آن‌سو اگر نادرست استفاده شود می‌تواند بسیار مخرب باشد.

در ادامه به جزئیات بیشتری در رابطه با دستور SU می‌پردازیم و توضیح می‌دهیم که چرا هنگام استفاده از این دستور باید محتاط بود.

ادامه مطلب

ایده های شاد: پروژه Ulo

خیلی از ما یه دفترچه کوچیک یا یه سری یادداشت توی گوشیمون داریم که ایده هامونو مینویسیم و احتمالا بعضیاشون عملی میشن و احتمالا بیشترشون هیچوقت عملی نمیشن!
یکی از همین ایده‌هایی که من یه مدت تو سر داشتم، ساخت گجت کوچیک و ارزونی بود که با اون بشه خیلی راحت از اتاق فیلم برداری کرد و با استفاده از اینترنت هرکجا که باشید بتونید تصویر دوربین رو ببینید.
تحقیق زیادی نکردم که ببینم آیا همچین چیزی ساخته شده  یا نه. و البته میدونم که خیلی از wifi-camera‌ها امکاناتی مشابه رو دارند. ولی علاقه‌ی شخصیم این بود که این کارو با برد رازبری و با استفاده از نرم‌افزارها و سخت‌افزارهای آزاد انجام بدم.

یادم نیست کجا ولی جایی خوندم که طبق قانونی نانوشته(!) هر ایده‌ای که به ذهنتون میرسه به احتمال ۹۰ درصد قبلا به ذهن یکی دیگه هم رسیده. و در این مورد خاص نه تنها به ذهن یکی دیگه رسیده، که خیلی قشنگتر و بامزه‌تر از ایده‌ی من ساختتش!تصویر جغد Ulo

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

این گجت دوست داشتنی ساخته و پرداختهٔ طراح فرانسوی ویویِن مولر(Vivien Muller) است وپروژهٔ  Ulo در کیک استارتر در حال جمع آوری کمک های مالیه. و تا الان که من بررسی کردم 335,265 یورو جمع‌آوری کرده. و نکته‌ی جالب اینه که‌ هدف پروژه جمع‌آوری 199,000 یورو بوده. یعنی هنوز ۳ روز به پایان مهلت کمک‌های مالی باقی مونده و پروژه 136,256 یورو بیشتر از میزان هدفش کمک مالی دریافت کرده 🙂

اگه میخواین عکسها و فیلمهای بیشتری از این جغد جاسوس ( 🙂 ) ببینید، به آدرس پروژش در KIKSTARTER مراجعه کنید. شاید خوشتون اومد و به پروژه کمک مالی کردید. البته اگه ویزا کارد یا مستر کارد یا همچین چیزی داشته باشید. چون مثلا کارت بانک ملی و کلا کارتهای خفن عضو شتاب(!) ‌همچین جاهایی به  درد نمیخورن!

آدرس پروژه در کیک استارتر: https://www.kickstarter.com/projects/vivienmuller/ulo

فونت آزاد وزیر

چیزی در حدود ۱۰ ماه از شروع کمپین قلم فارسی آزاد میگذره و در این مدت چندتا ایمیل از طرف این کمپین فرستاده شد که روند طراحی قلم را شرح میداد.

اما خبر خوب و شادی که تازگی پخش شده، اینه که دوست خوبی به نام صابر راستی کردار قلم فارسی آزاد  وزیر رو طراحی و منتشر کرده که به شخصه خیلی این قلم رو پسندیدم و تصمیم گرفتم به طور موقت از این قلم در وبلاگم استفاده کنم تا هم بازخوردشو ببینم و هم از این کار زیبای دوستمون حمایتی کرده باشم.

بهتون پیشنهاد میکنم به این فونت دوست داشتنی نگاهی بندازید و اگه خوشتون اومد ازش استفاده کنید. ازش استفاده کنید چون آزاده 🙂

آدرس پروژه در گیتهاب: https://github.com/rastikerdar/vazir-font