CSS Reset چیست؟ راهنما و آموزش کامل CSS Reset

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

CSS Reset چیست

برای درک کامل CSS Reset ها و رسیدن به پاسخ سوال CSS Reset چیست ، فیلم آموزشی زیر میتواند بسیار مفید باشد

https://www.aparat.com/v/ba3W4

انواع مرورگرها

همانطور که میدانید ما انواع مختلفی از مرورگرها داریم. ممکن است شما به عنوان یک طراح وب یا برنامه نویس وب، از مرورگرهای مختلفی مثل گوگل کروم، فایرفاکس، اینترنت اکسپلورر، سافاری و… استفاده کنید.

هرکدام از مرورگرهای موجود، یک سری استایل های پیشفرضی دارند که روی تگ های HTML اعمال میکنند. برای مثال گوگل کروم و فایرفاکس، مقادیر مختلفی از margin ها، padding ها و… را روی تگ های HTML اعمال میکنند.

این استایل های پیشفرضی که توسط مرورگرها روی تگ های مختلف HTML اعمال میشود، باعث میشود که نحوه‌ی نمایش صفحه‌ی وب طراحی شده توسط شما در مرورگرهای مختلف بصورت های متفاوتی باشد. زیرا استایل های پیشفرض مرورگرها با هم متفاوت است.

چرا باید از CSS Reset ها استفاده کنیم؟

برای اینکه بتوانید این استایل های پیشفرض مرورگرها را از بین ببرید و خنثی کنید، باید از CSS Reset ها استفاده کنید. در واقع اگر بخواهیم بگوییم که CSS Reset چیست ، میتوانیم این تعریف را داشته باشیم:

CSS Reset چیست : CSS Reset ها به شما کمک میکنند که استایل های پیشفرضی که مرورگرها روی تگ های مختلف اعمال میکنند را خنثی کنید و از بین ببرید. این موضوع باعث میشود که صفحه‌ی وب طراحی شده توسط شما در نهایت روی تمامی مرورگرها، به یک شکل نمایش داده میشود.

در واقع CSS Reset ها به شما کمک میکنند که طراحی یکسانی در تمام مرورگرها داشته باشید.

شاید برایتان سوال پیش بیاید که CSS Reset چیست ؟ آیا یک روش کدنویسی است؟ یا یک کتابخانه است؟

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

CSS Reset چیست و دقیقا چه کاری میکند؟

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

یک صفحه‌ی وب ساده بدون استفاده از CSS Reset شکلی شبیه به زیر خواهد داشت:

اما وقتی CSS Reset را وارد یک صفحه‌ی وب میکنید و از آن استفاده میکنید، صفحه‌ی وب‌تان شبیه عکس زیر میشود:

همانطور که در تصویر بالا میبینید، بعد از استفاده از CSS Reset ها، چند اتفاق برای سایت شما می‌افتد:

  1. همه‌ی padding ها و margin های پیشفرض مرورگر ها از بین میرود
  2. همه‌ی استایل های متون مثل سایز، رنگ، کلفتی متن و… از بین میرود
  3. و بطور خالی صفحه‌ی وب شما خالی از هرگونه استایل پیشفرض میشود.

بعد از استفاده از CSS Reset ها، شما میتوانید بدون دخالت استایل های پیشفرض مرورگرها، اقدام به طراحی صفحات وب خودتان کنید. صفحات وبی که در همه‌ی مرورگرها به یک شکل نمایش داده میشود، زیرا استایل های پیشفرض مرورگرها را با استفاده از CSS Reset ها خنثی کرده‌ایم.

روش استفاده از CSS Reset ها

برای اسفتاده از CSS Reset ها کافیست چند خط کد ساده‌ی CSS را که از قبل نوشته شده است را وارد فایل استایل خود کنید.

برای اینکار ابتدا کد زیر را کپی کنید (منبع):

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
  margin: 0;
  padding: 0;
 border: 0;
  font-size: 100%;
  font: inherit;
  vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
  display: block;
}
body {
  line-height: 1;
}
ol, ul {
  list-style: none;
}
blockquote, q {
 quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
 content: '';
  content: none;
}
table {
  border-collapse: collapse;
  border-spacing: 0;
}

سپس یک فایل مثلا با نام reset.css بسازید و این کد ها را در آن قرار دهید.

کار تمام است. الان فقط کافی است که این فایل را با استفاده از یک خط کد HTML ساده، در قسمت تگ فایل HTML خود وارد کنید تا استایل های CSS Reset لود شود:

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

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

منبع: یادیفای

نوشته CSS Reset چیست؟ راهنما و آموزش کامل CSS Reset اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

آموزش مینی فریم ورک فلسک

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

کتاب آموزش فلسک

دو پاراگراف اول کتاب رو در ادامه می تونید بخونید.

فریم ورک برنامه تحت وب یا به بیان ساده تر، فریم ورک وب شامل مجموعه ای از کتابخانه ها و ماژول هایی ست که به یک توسعه دهنده برنامه تحت وب امکان می دهد که برنامه ها را بدون درگیری با جزئیات سطح پایین مانند پروتکل ها، مدیرت تردها بنویسد.

فلسک، فریمورک توسعه برنامه های تحت وب برای زبان برنامه نویسی پایتون است. Ronacher Armin توسعه دهنده آن است که گروه علاقه مندان به پایتون با نام Pocco را نیز رهبری می کند. فلسک بر پایه ابزار WSGI Werkzeug و موتور نشانه گذاری Jinja٢ کار می کند که هر دو از پروژه های Ronacher هستند.

برای دانلود کتاب به پروژه متن باز آموزش فلسک بروید و فایل PDF رو برای خواندن آموزش و یا فایل TEX را برای ویرایش فایل لاتکس پروژه دانلود فرمایید.

نوشته آموزش مینی فریم ورک فلسک اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

آشنایی با نرم افزار GIMP؛ یک ویرایشگر عکس رایگان و کاربردی

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

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

پیش از آغاز کار با نرم افزار GIMP

قبل از اینکه کار با GIMP را شروع کنیم چند نکته را باید با هم مرور نماییم:

  • تصاویر باید در حالت غیر زوم (حالتی که نزدیک نمایی انجام نشده باشد) باز شود. برای این که تصاویر در اندازه‌های مناسب باز شود، به مسیر View > Zoom > Fit Image in Window بروید.
  • هر تغییری که با استفاده از این اپلیکیشن روی تصویر اعمال می‌کنید، به صورت دائم روی تصویر باقی خواهد ماند. بنابراین بهتر است از پروژه‌تان بکاپ بگیرید و یا روی یک کپی از فایل کار کنید.
  • همچنین در نظر داشته باشید که بهتر است همه‌ی تغییرات خود را روی یک کپی از لایه‌های مختلف اعمال نمایید (روی لایه‌ها از پنل Layers کلیک راست کنید و در سمت راست گزینه‌ی Duplicate Layer را بزنید). بعد از اعمال تغییرات می‌توانید لایه را حذف کنید.

۱. چگونه با استفاده از GIMP افق را صاف کنیم؟

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

GIMP 2.0 به صورت پیش فرض ابزاری برای صاف کردن خط افق دارد. از بخش ابزار Measure Tool را از ستون سمت چپ انتخاب کنید.

روی یک نقطه از خط افق کلیک کرده و آن را روی خط افق بکشید و سپس کلیک را رها کنید. حالا از بخش Tools در نوار بالای نرم افزار گزینه‌ی Clipping را روی Crop to result قرار داده و سپس Straighten را بزنید.

نرم افزار GIMP

تصویر شما حالا صاف خواهد شد. اگر از نتیجه راضی هستید به مسیر Image > Crop to content بروید و همه‌ی بخش‌های خالی تصویر را از بین ببرید. اگر نتیجه راضی کننده نیست، گزینه‌ی Undo را بزنید.

۲. چگونه عکس‌ها را در GIMP کراپ کنیم؟

کراپ کردن تصاویر یکی از تاثیرگذارترین روش‌های ترکیب بندی عکس‌ها یا از بین بردن بخشی ناخواسته از عکس‌ها محسوب می‌گردد.

ابزار Crop را انتخاب کنید (می‌توانید از کلید میانبر Shift + C استفاده کنید). حالا با کلیک کردن روی تصویر و کشیدن ماوس به بخش‌های مختلف می‌توانید بخش‌هایی از عکس که می‌خواهید کراپ شود را مشخص کنید. برای حفظ کردن نسبت پیش فرض عکس می‌توانید در حین کلیک کردن ماوس و کشیدن آن دکمه‌ی Shift را نگه دارید.

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

۳. چگونه نمایش تصاویر در GIMP را بهبود ببخشیم؟

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

برای این کار به مسیر Colors > Exposure بروید. در پنجره‌ی کوچکی که باز می‌شود سطح مشخص شده‌ی Black را به سمت راست ببرید تا تاریکی نقاط مشکی را بیشتر کنید. با بردن Exposure به سمت راست روشنایی عکس بیشتر و با بردن آن به سمت چپ روشنایی عکس کمتر خواهد شد.

مطمئن شوید که گزینه‌ی Preview فعال باشد تا تغییرات اعمال شده را به صورت زنده روی عکس مشاهده نمایید. همچنین می‌توانید با انتخاب Split view دو پنجره‌ی مختلف مشاهده کنید که عکس را قبل و بعد از تغییرات به نمایش می‌کشد. وقتی از تغییرات اعمال شده احساس رضایت داشتید گزینه‌ی OK را بزنید.

اگر روی عکس‌ها با فرمت JPEG کار می‌کنید باید در انتخاب مقدار Exposure دقت کنید. چرا که در صورت عدم تمرکز کافی روی این موضوع، شاهد نویز در تصویر خواهید بود.

۴. چگونه توازن رنگ سفید (White Balance) را در GIMP اصلاح کنیم؟

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

برای حل این مشکل به مسیر Colors > Auto > White Balance بروید. با این کار احتمالا مشکل به طور کامل حل می‌شود.

اگر از نتیجه راضی نبودید، می‌توانید به صورت دستی نیز تغییرات مد نظر خود را اعمال کنید. برای این کار باید به Colors > Levels رفته و پایین پنجره روی آیکون قطره چکان مشخص شده در تصویر زیر کلیک کنید.

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

۵. چگونه رنگ عکس‌ها را در GIMP تنظیم کنیم؟

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

برای این کار به مسیر Colors > Hue-Saturation بروید. از این بخش می‌توانید تمام تصویر را با تنظیم بخش Saturation با تغییر مواجه نمایید. البته نباید در این امر زیاده روی کنید، چون ممکن است عکس‌تان حالت مناسب خودش را از دست بدهد.

برای آن که مدیریت بیشتری روی رنگ‌ها داشته باشید، می‌توانید رنگ‌های خاصی مثل قرمز، ارغوانی، آبی، نیلی، سبز و زرد را به صورت جداگانه تغییر دهید. در این بخش متغیر دیگری به نام Lightness مشاهده خواهید کرد که گاهی می‌تواند مهم‌تر از متغیر Saturation باشد.

برای مثال برای این که یک آسمان را بیشتر به رنگ آبی درآورید، باید تمرکز بیشتری روی رنگ‌های آبی و نیلی داشته باشید و از طرفی متغیر Lightness را به سطح تاریک تری وارد کنید.

۶. چگونه به تصاویر در GIMP کنتراست دهیم؟

بهترین روش برای افزایش تاثیرگذاری یک عکس، بالابردن کنتراست آن است. این موضوع می‌تواند یک تصویر بی احساس را به یک تصویر خاطره انگیز تبدیل کند. بهترین کار برای بالا بردن کنتراست در عکس‌ها از طریق ابزار Levels امکان پذیر است. برای این کار باید به Colors > Levels بروید.

حال با پنجره‌ی کوچک Levels مواجه خواهید شد که دارای یک هیستوگرام یا نمودار تحت عنوان Input Levels در بخش بالایی آن است. این نمودار محدوده‌ی تونال تصویر شما را نمایش خواهد داد. مشکی در سمت چپ، سفید در راست و سایه‌هایی از سبز در وسط.

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

۷. چگونه با استفاده از GIMP لکه‌های موجود در تصاویر را حذف کنیم؟

نرم افزار GIMP ابزاری ساده و کاربردی بدین منظور دارد که می‌تواند گرد و خاک و کثیفی ناشی از لنز را از بین ببرد.

ابتدا روی نقطه‌ای که می‌خواهید حذفش کنید زوم نمایید. برای این کار می‌توانید View > Zoom > 1:1 را بزنید یا با زدن کلید ۱ در کیبورد این کار را انجام دهید. حال می‌توانید در تصویر به دنبال نقطه‌ی مورد نظر خود بگردید.

بعد از یافتنش روی ابزار Healing Tool از بخش ابزار بزنید یا کلید H را فشار دهید. با استفاده از کلید‌های « ] » و « [» می‌توانید اندازه‌ی ابزار را مشخص نمایید.

در ویندوز کلید Ctrl و در مک کلید Cmd را نگه دارید و سپس روی رنگی همرنگ با پس زمینه‌ی لکه کلیک کنید. حالا نشانگر را روی لکه بزنید تا آن را حذف کنید.

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

۸. چگونه با استفاده از نرم افزار GIMP پس زمینه را حذف کنیم؟

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

برای انجام این کار به مسیر Layer > Transparency > Add Alpha Channel بروید. با این کار می‌توانید پس زمینه را در GIMP شفاف یا Transparent کنید تا اجزای پشتش قابل مشاهده باشد.

سپس، Foreground Select Tool را انتخاب نمایید. یک محیط حدودی دور اجزای بخش جلویی تصویر (که پس زمینه بخشی از آن نیست) ایجاد کنید و سپس Enter را بزنید.

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

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

البته به یاد داشته باشید که این روش تنها یکی از روش‌های حذف تصویر پس زمینه در عکس‌ها به شمار می‌رود و روش‌های بیشتری برای این کار نیز وجود دارند.

۹. چگونه با استفاده از GIMP‌ اندازه‌ی تصاویر را تغییر دهیم؟

این کار به سادگی انجام پذیر است. کافیست به مسیر Image > Scale Image بروید و در بخش Image Size طول و عرض مورد نظر خود را در واحد پیکسل وارد نمایید. گزینه‌ی Interpolation را روی Cubic قرار دهید. البته این گزینه کمترین سرعت را دارد اما کیفیت عکس را به بهترین شکل ممکن حفظ می‌کند.

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

در ضمن اگر می‌خواهید تصاویر را بعد از تغییر اندازه چاپ کنید، باید از مسیر Image > Print Size نسبت به تغییر عکس خود اقدام نمایید.

نوشته آشنایی با نرم افزار GIMP؛ یک ویرایشگر عکس رایگان و کاربردی اولین بار در دیجیاتو پدیدار شد.

گردآوری توسط ایده طلایی

هوش مصنوعی چگونه موجب ساده شدن سخت افزارها در گوشی های هوشمند می شود؟

اسنپدراگون ۸۵۵ برای گوشی‌های هوشمند و اسنپدراگون ۸cx برای کامپیوتر‌ها که کوالکام در رویداد ماه گذشته‌ی اسنپدراگون معرفی کرد، جهشی عظیم در بخش تکنولوژی محسوب می‌شد. اما در عصری که تنها تعداد کمی از اپلیکیشن‌ها می‌توانند از نهایت قدرت تلفن‌های هوشمند استفاده کنند، کوالکام نشان داد که بهینه سازی هوش مصنوعی تا چه حد می‌تواند بیش از پیشرفت سخت افزاری اهمیت داشته باشد.

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

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

هوش مصنوعی

همه‌ی این مسائل نشان دهنده‌ی قدرت فوق العاده‌ی هوش مصنوعی و بهینه بودن آن است. این که هوش مصنوعی می‌تواند نوع مختلفی از اشیاء صوتی و تصویری را تشخیص دهد و تلاش کند تا آن‌ها را بهبود بخشد.

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

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

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

گردآوری توسط ایده طلایی

زبان برنامه نویسی ارلنگ

ارلنگ چیست؟

اولش این رو بگم که ارلنگ یک زبان برنامه‌نویسی تابع‌گرا است.

اگه تا حالا با زبان‌های دستوری کار کرده باشین عباراتی مثل ++i ممکنه براتون عادی باشه اما در برنامه نویسی تابع‌گرا مجاز نیست. در واقع تغییر دادن مقدار یک متغیر شدیدا ممنوعه!‍‍‍ ممکنه عجیب و غریب به نظر بیاد ولی اگه کلاس ریاضی رو یادتون باشه چیزی که یادگرفتین این بود:‍‍‍‍‍‍

y = 2
x = y + 3
x = 2 + 3
x = 5

اگه اینو اضافه کنیم:

x = 5 + 1
x = x
∴ ۵ = ۶‍‍

گیج شدین؟! برنامه‌نویس‍‍ی تابع‌گرا این را به رسمیت میشناسه. اگه ما بگیم که x برابر است با ۵؛ منطقا نمتونیم مدعی باشیم برابر ۶ هم هست! و همچنین اینکه یک تابع با پارامتر یکسان همیشه یه چیز برمیگردونه:

x = add_two_to(3) = 5
∴ x = 5

خروجی توابع با پارمترهای یکسان همیشه یکی است و تغییر نمی‌کنه که به این اصل referential transparency میگیم. این اصل چیزیه که اجازه میده add_two_to(3) رو با ۵ جاگزین کنیم؛ در نتیجه ۳+۲ همیشه برابر با ۵ است. این به این معنی است که میتونیم چندین تابع رو به هم بچسبونیم تا یک مسئله پیچیده تر رو حل کنیم بدون اینکه مشکلی پیش بیاد. منطقی و تروتمیز. اینجوری نیست؟ مشکلی هست این وسط:

x = today() = 2018/10/22
-- یک روز صبر کنین --
x = today() = 2018/10/23
x = x
∴ ۲۰۱۸/۱۰/۲۲ = ۲۰۱۸/۱۰/۲۳

وای نه! معادله زیبای من! ناگهان همه چیز اشتباه میشه! چجوریه میشه وقتی که خروجی تابع من هر روز فرق می‌کنه؟

مشخصا مواردی وجود داره که خوبه referential transparency نقض بشه. ارلنگ رویکرد عملگرایی با برنامه نویسی تابع‌گرا داره: پیروی کنید از خالص ترین اصول( پرهیز کردن از تغییر دادن داده، referential transparency و غیره) اما وقتی به مسائل دنیای واقعی برخوردید این اصول رو نقض کنید .

الان ارلنگ رو تعریف میکنیم: ارلنگ یک زبان برنامه‌نویسی تابع‌گرا است، اما با تاکید بسیار زیاد روی همزمانی(concurrency) و قابلیت اطمینان بالا (high reliability). ارلنگ برای اینکه بتواند ده‌ها کار رو همزمان انجام بدهد از مدل بازیگر (actor model) بهره می‌برد و هر بازیگر یک فرایند (process) ماشین مجازی است. اگه شما یه بازیگر در جهان ارلنگ بودید، یک شخص تنهایی هستید که در یک اتاق تاریک بدون پنچره نشسته‌اید و منتظرین تا یک نامه‌ای رو از صندوق‌ پستی بگیرین. وقتی که نامه رو گرفتین، یک کار مشخصی میکنین: صورتحساب رو پرداخت میکنین وقتی که یک صورتحساب گرفتین؛ وقتی یه کارت تبربک گرفتین، یه نامه «تشکر» مینویسین و بی‌خیال نامه هایی میشین که درکی ازش ندارین.

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

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

وقتی ما ارلنگ رو تعریف میکردیم در سطح زبان بودیم ولی در یک معنای وسیعتر این همه اون چیزی نیست که وجود داره؛ ارلنگ یک محیط توسعه هم هست. کد به بایت‌کد ترجمه میشود و داخل ماشین مجازی اجرا می‌شود. بنابراین ارلنگ شبیه جاوا و بچه‌هاش همه جا میتونن اجرا بشن. توزیع استاندارد ارلنگ شامل ابزار‌های توسعه ( کامپایلر، دیباگر، پروفایلر و فریمورک تست)، فریمورک OTP، یک وب سرور،پایگاه داده mnesia؛ یک سیستم ذخیره سازی کلید-مقدار که میتونه خودشو روی چندین سرور توزیع کنه؛از تراکنش های چند سطحی پشتیبانی میکنه و اجازه میده بهتون هر نوع داده‌ی ارلنگ رو ذخیره کنین.

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

جلوتر میبینم که چجوری از این ابزارها استفاده میشه ولی برای الان بزارید یک قانون کلی در ارلنگ رو بگم: «بزار سقوط کنه!» نه شبیه یک هواپیما با ده‌ها مسافر که دارن میمیرن بلکه بیشتر شبیه کسی که در ارتفاع روی یک توری مطمئن داره راه میره. درحالی که شما سعی میکنین اشتباه نکنین، نیازی هم نیست که هر نوع خطا یا شرایط خطا رو در اغلب موارد چک کنین.

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

خیلی نوشابه نخورین!

ارلنگ در بعضی زمینه ها خیلی خوبه و عشاق ارلنگ ممکنه چیزایی بیشتر از اون چیزی که واقعا هست بگن.

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

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

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

یه چیز دیگه هم هست که تو ذهنتون داشته باشین: در حالی که ارلنگ بعضی کارها رو خوب انجام میده، میشه همون نتیجه رو با یک زبان دیگه هم گرفت، برعکسش هم درسته؛ نیاز هست که هر مسئله‌ای درست ارزیابی بشه و متناسب با اون ابزارش هم انتخاب بشه. ارلنگ در بعضی زمینه‌ها آش دهن سوزی نیست، مخصوصا برای کارهایی مثل پردازش تصویر، درایور سیستم عامل و غیره و در برخی زمینه ها هم عالیه مثل نرم‌افزاهای بزرگ سروری (مثل صف، نگاشت-کاهش)، پیاده سازی پروتکل های سطح بالاتر، پیام‌رسان و غیره. موضوعات این وسط بستگی به شما داره. الزاما خودتون رو در ارلنگ به نرم‌افزار های سروری محدود نکنین. مواردی وجود داره که افراد کارهای غیرمنتظره و شگفت‌انگیزی هم انجام دادن، مثلا ربات IANO که توسط تیم UNICT درست شده و برای هوش مصنوعی این ربات از ارلنگ استفاده شده و در مسابقات یوروبات ۲۰۰۹ مدال نقره رو هم برنده شده. مثال دیگه‌ش Wings 3D هست، یک مدل کننده سه بعدی (نه رندرکننده) که متن بازه و با ارلنگ نوشته شده و بنابراین چند سکویی هم هست.

برای شروع چه چیزی نیاز دارین؟

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

روی لینوکس هم به راحتی و با دستور زیر نصب کنین

apt-get install erlang # debain based linux
yum install erlang # redhat based linux

روز خوش یا هم شب بخیر!

نوشته زبان برنامه نویسی ارلنگ اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

ریفکتور کردن پروژه جنگو: جابجایی مدل ها

این نوشته رو روی مدیوم منتشر کرده بودم حالا تصمیم گرفتم روی ویرگول هم بنویسم.

Photo by Chris Ried on Unsplash

ریفکتور کردن کد بخش مهمی از توسعه ی نرم افزار هست که باعث میشه کد ما ساده تر و قابل فهم تر بشه و توسعه ی دوباره ی اون رو راحت تر کنه.

https://cdn-images-1.medium.com/max/800/1*ZXixptvL4rzkx3EDuj38xw.jpeg

این موضوعی بود که چند وقت پیش باهاش روبرو شدم، منابع خیلی مناسبی واسه ی این راه حل پیدا نکردم و حتی توی استک اورفلو هم جواب خوبی پیدا نکردم(!) واسه ی مشکلی که داشتم. به خاطر همین بعد از حل کردن مشکل تصمیم گرفتم درباره ی راه حل این مسئله بنویسم. بریم سراغ جابجایی مدل ها!

توی مشکل من همچین مدل هایی وجود داشتن:

#app1 
class ChildModel(ParentModel):
  title = models.CharField(max_length=20)
class OtherModel(models.Model):
  relation = models.Foreinkey(ChildModel, on_delete=models.SET_NULL)
#app2
class ParentModel(models.Model):
  name = models.CharField(max_length=20) 

کاری که قرار بود انجام بشه جابجایی ParrentModel از app2 به app1 بود، روند اصلی این کار اینطوریه:

۱- تغییر اسم تیبل ParentModel به اپ مقصد، چون جنگو اسم تیبل هارو به این شکل ‘app1_childmodel’ نگه میداره پس وقتی اپ یه مدل عوض میشه باید اسم تیبل رو هم تغییر بدیم تا با ساختار جدید همخوانی داشته باشه

۲- نوشتن migration برای جابجایی ParentModel به app1

۳- اپدیت کردن foreignkeys و رابطه ها

۴- نوشتن migration برای پاک کردن ParentModel از app2

۵- جابجا کردن کد مدل

تغییر اسم تیبل

برای این کار باید از meta.db_table استفاده کنیم، به این صورت:

#app2
ParentModel(models.Model):
    #fields
    class Meta:
        db_table = "app1_parentmodel"

جابجا کردن ParrentModel به app1

این اون قسمتیه که یکمی تریکیه، باید تابعی بنویسیم که اونو با کامند RunPython اجرا کنیم و ParentModel رو به app1 ببره ولی مشکل اینجاست که چون ChildModel به ParentModel وابسته هست به خاطر ارث بری توی این مایگریشن اطلاعات کلاس پدر رو از دست میده و به این اررور میرسیم:

django.db.migrations.state.InvalidBasesError: Cannot resolve bases for []
This can happen if you are inheriting models from an app with migrations (e.g. contrib.auth)-

چیزی که فهمیدم این بود که اگر ChildModel رو از state اپ پاک کنیم و این تغییرات رو انجام بدیم بعد دوباره ChildModel رو برگردونیم بدون هیچ اروری migration ها اجرا میشن، الان میشه فهمید که پس اون foreignkey هم به همین مشکل میخوره چون که وقتی ChildModel حذف بشه(موقت)‌اون هم رفرنس رو از دست میده و احتمالاً حدس میزنید که اون فیلد رو هم از state پاک میکنم، حالا بریم ببینیم state چیه؟!

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

این روشی هست که توی اون ChildModel و Foreignkey رو از State پاک میکنیم.

#app1 0001 migration
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
        ('app2','0001_renaming_the_table'),
    ]
state_operations = [
        migrations.RemoveField(
            model_name='othermodel',
            name='relation',
        ),
        migrations.DeleteModel('ChildModel'),
    ]
operations = [ migrations.SeparateDatabaseAndState(state_operations=state_operations)
    ]

توی این migration هیچ دیتایی از دست نمیره اما از نظر جنگو این مدل و فیلد پاک شدن.

حالا میتونیم migration رو برای جابجا کردن ParentModel به app1 بنویسیم

from django.db import migrations, models
def update_contentypes(apps, schema_editor):
    """
    Updates content types.
    We want to have the same content type id, when the model is moved.
    """
    ContentType = apps.get_model('contenttypes', 'ContentType')
    db_alias = schema_editor.connection.alias
# Move the ParentModel to app1
    qs = ContentType.objects.using(db_alias).filter(app_label='app2', model='parentmodel')
    qs.update(app_label='app1')
def update_contentypes_reverse(apps, schema_editor):
    """
    Reverts changes in content types.
    """
    ContentType = apps.get_model('contenttypes', 'ContentType')
    db_alias = schema_editor.connection.alias
# Move the TrackingAlert model to tracking
    qs = ContentType.objects.using(db_alias).filter(app_label='app1', model='parentmodel')
    qs.update(app_label='app2')
class Migration(migrations.Migration):
dependencies = [
        ('app1', '0001_delete_from_state'),
        ('app2', '0001_renaming_table'),
    ]
state_operations = [
        migrations.CreateModel(
            name='ParentModel',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                #all the other fields
            ],
        ),
    ]
database_operations = [
        migrations.RunPython(update_contentypes, update_contentypes_reverse),
    ]
operations = [
        migrations.SeparateDatabaseAndState(
            state_operations=state_operations,
            database_operations=database_operations
        ),
    ]

توی متد CreateModel حتماً باید مدل رو همونطوری که توی کد هست تعریف کنیم تا ناهماهنگی پیش نیاد.

اپدیت کردن ForeignKey ها و روابط

توی این حالتی که من بررسی کردم Foreignkey ای نداشتیم که به ParentModel اشاره کنه، ولی شما ممکنه داشته باشید پس راهشو توضیح میدم.

باید برای هر مدلی که دارای این فیلد ForeignKey به مدل ParentModel باشه یه مایگریشن درست کنیم و توی اون با AlterTable مکانی که ParentModel توش هست رو عوض کنیم مثل این:

from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
        ('app1', '0002_move_parent_model'),
        # other dependencies
    ]
state_operations = [
        migrations.AlterField(
            model_name='somemodel',
            name='theforeignkeyfield',
            field=models.ForeignKey(on_delete=models.deletion.CASCADE,
                                    to='app1.ParentModel'),
        ),
    ]
operations = [     migrations.SeparateDatabaseAndState(state_operations=state_operations)
    ]

بعد از اپدیت کردن ریلیشن ها آماده ایم که کد مدل رو جابجا کنیم(yay!)

نوشتن مایگریشن برای پاک کردن مدل ParentModel از app2

چرا این مرحله باید انجام بشه؟ چون گفتم که جنگو یه اطلاعات از ساختار دیتابیس شما داره که اون رو اعمال میکنه روی دیتابیس ما نمیخوایم که مدل توی دیتابیس تغییر بکنه(پاک بشه) ولی میخوایم جنگو فکر کنه این مدل از این اپ پاک شده و به app2 رفته پس این مایگریشن رو مینویسم:

class Migration(migrations.Migration):
dependencies = [
        ('app2', '0001_renaming_table'),
    ]
state_operations = [
        migrations.DeleteModel('ParentModel'),
    ]
operations = [
        migrations.SeparateDatabaseAndState(state_operations=state_operations)
    ]

این مرحله هم تموم شد میریم مرحله بعدی

جابجا کردن کد مدل

حالا کد مدل رو میبرم توی اون اپ و import هایی که داریم رو هم درست میکنیم.

بعد از این میتونیم اون فیلد و مدلی که اول کار یه جورایی به جنگو گفتیم که وجود ندارند رو دوباره برگردونیم که کار سختی نیست با CreateModel و Addfield و SeparateDatabaseAndState انجامش میدیم:

from django.db import migrations, models
import django
class Migration(migrations.Migration):
dependencies = [
        ('app1', '0002_move_parent_model'),
    ]
state_operations = [
        migrations.CreateModel(
            name='ChildModel',
            fields=[
                ('parentmodel_ptr',
                 models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True,
                                      primary_key=True, serialize=False, to='app1.ParentModel')),
                ('title',models.CharField(max_length=20,),
    ]
        bases=('app1.parentmodel',))
           migrations.AddField(
            model_name='othermodel',
            name='relation',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_Null), to='app1.ChildModel')
        ),
operations = [
migrations.SeparateDatabaseAndState(state_operations=state_operations)
    ]

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

امیدوارم مفید بوده باشه.

نوشته ریفکتور کردن پروژه جنگو: جابجایی مدل ها اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

خمیده کردن گوشه‌ی المان‌ها (Border Radius) در CSS

در CSS3 امکانی افزوده شده است که با استفاده از آن میتوانید گوشه ی المان های خودتان را بصورت گرد شده و خمیده شده داشته باشید. این خاصیت Border Radius در CSS نام دارد. در این آموزش یاد میگیریم که چطور میتوانیم با استفاده از سی اس اس (CSS) گوشه‌ی المان ها را خمیده یا گرد کنیم.

Border Radius در CSS

اگر میخواهید با خاصیت Border Radius در CSS بصورت کامل آشنا شوید، پینشهاد میکنم حتما فایل آموزشی زیر را مشاهده کنید.

https://www.aparat.com/v/C9En8

برای اینکه بتوانیم از Border Radius در CSS استفاده کنیم، نیاز هست که مرورگری داشته باشیم که از کدهای CSS3 پیشتیبانی کنند. اگر مرورگر شما یک مرورگر معروف و بروز باشد، از این قابلیت  کاملا پشتیبانی خواهد کرد.

Border Radius قابلیتی است که در آخرین نسخه CSS یعنی سی اس اس ۳ معرفی شده است و به شما کمک میکند که به راحتی گوشه المان هایتان را بصورت گرد شده داشته باشید.

برای استفاده از Border Radius در CSS کافی است که یک المان را در CSS انتخاب کنیم. برای مثال در تکه کد زیر، ما یک div با کلاس mydiv ساخته ایم و در CSS به آن طول و ارتفاع ۲۰۰ پیکسل و رنگ پس زمینه‌ی قرمز را داده‌ایم:

.mydiv{
    width:200px;
    height:200px;
    background-color: red;
}

الان میتوانیم از خصوصیت Border Radius در CSS استفاده کنیم. برای اینکار، تکه کد زیر را به کد CSS خود اضافه میکنیم:

border-radius: 10px

با استفاده از اضافه کردن این تکه کد به کدهای بالا، خروجی کار ما شبیه به تصویر زیر میشود:

همین کار را دقیقا با عکس ها هم میتوانید انجام دهید. برای مثال اگر بخواهید یک تصویر داشته باشید که گوشه‌هایش گرد و خمیده باشد، Border Radius در CSS به کمک شما خواهد آمد. برای اینکار دوباره یک عکس را انتخاب میکنیم، آنرا با اسفتاده از تگ img وارد صفحه‌ی وب خود میکنیم و کد زیر را برای آن مینویسیم:

img{
    border-radius:  20px; 
}

با استفاده از این تکه کد، عکسی که در صفحه‌ی وب‌مان وارد کرده بودیم، با اسفتاده از Border Radius در CSS ، گوشه‌هایش به اندازی ۲۰ پیکسل خمیده میشود و به شکل زیر در می‌آید:

تبدیل یک المان یا عکس به دایره با Border Radius در CSS

شما میتوانید عکس ها یا المان های خودتان را با استفاده از Border Radius در CSS به شکل دایره تبدیل کنید. برای اینکار کافی است که ۲ کار را انجام دهید:

  1. مقدار width و height عکس یا المانی که میخواهید دایره شود را به یک میزان قرار دهید. مثلا هر دوی آ‌ن‌ها ۲۰۰ پیکسل باشد. تا عکس یا المان شما یک شکل مربع به خود بگیرد.
  2. سپس مقدار Border radius آن‌را برابر مقدار %۵۰ قرار دهید.

با استفاده از انجام این ۲ کار، المان یا عکس شما بصورت دایره‌ای شکل نمایش داده میشود:

در این مقاله درباره‌ی Border Radius در CSS صحبت کردیم. با استفاده از خصوصیت Border Radius در CSS میتوان کارهای خیلی جذاب و پیچیده‌ای نیز کرد که در مقالات آینده در یادیفای درباره‌ی آن‌ها صحبت خواهیم کرد.

منبع: یادیفای

نوشته خمیده کردن گوشه‌ی المان‌ها (Border Radius) در CSS اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی