Forwarded from مشورت کامپیوتریها (Navid)
#database
#sql
#oracle
#index
خب توی این پست میخوایم با چند تا از اصطلاحهایی که توی دیتابیسهای sql ای به گوش میخوره مخصوصا indexها(با محوریت Oracle البته)، آشنا بشیم. از موارد ساده شروع میکنیم تا ...
توی دیتابیسهای sql، ما یه table داریم که توی اون table تعدادی column با type مشخص ایجاد میشه که میتونیم دادههامون رو به صورت rowدر اون table ذخیره کنیم. این مقدمه ریز رو گفتم تا بتونیم بهتر index رو تعریف کنیم. index یه ساختمان داده آپشنال هست که اگه بخوایم، میشه روی یک یا چند ستون از جدولا تعریف کرد. ما وقتی روی یکسری ستونها، index تعریف میکنیم، میتونیم با پرفورمنس بالایی، اون دیتاها رو از دیتابیس واکشی کنیم. تعریف index زمانی برای ما مفید میشه که برای یه کاربرد خاص، تعداد درخواستهای نسبتا زیادی بر روی یکسری دادهها داریم، در این صورت میتونیم سرعت کل برنامه رو به کمک indexها افزایش بدیم.
نکته قابل توجهش اینه که تعریف index ها کاملا مستقل از داده اصلی هست و صرفا با استفاده از ساختمانداده مناسب، دسترسی به دادههای index شده رو افزایش میده. گفتم ساختماندادههای مناسب، بخوام یه اشارهای بکنم، توی Oracle یکی از ساختمان دادههایی که برای این منظور استفاده میشه، B-Tree هست. (احتمالا جزو اون درختایی بوده که توی درس ساختمانداده خوندین و با خودتون گفتین خب به چه دردی میخوره🙂) همچنین متدهای Reverse key indexes، Bitmap indexes و Function-based indexes هم در Oracle قابل استفاده هستند که برای مطالعه بیشتر میتونین به این لینک یه سر بزنین:)
یکی دیگه از دلایلی که استفاده از indexباعث افزایش سرعت واکشی میشه، اینه که باعث میشه دسترسی کمتری به بلوکهای حافظه و I/O disk داشتهباشه و این دسترسی رو به لطف همون ساختماندادهها، به حداقل میرسونه.
در آخر هم درخواست ساختن index رو صرفا برای اینکه بفهمیم چقدر سادس(!) ببینیم:
و در نهایت:)
برای اینکه اطلاعات بیشتر درباره indexها و نوعهاش و چگونگی کارکردش بدونین خوندن بخش Indexes and Index-Organized Tables از این داکیومنت که مال Oracle هست پیشنهاد میشه:)
#sql
#oracle
#index
خب توی این پست میخوایم با چند تا از اصطلاحهایی که توی دیتابیسهای sql ای به گوش میخوره مخصوصا indexها(با محوریت Oracle البته)، آشنا بشیم. از موارد ساده شروع میکنیم تا ...
توی دیتابیسهای sql، ما یه table داریم که توی اون table تعدادی column با type مشخص ایجاد میشه که میتونیم دادههامون رو به صورت rowدر اون table ذخیره کنیم. این مقدمه ریز رو گفتم تا بتونیم بهتر index رو تعریف کنیم. index یه ساختمان داده آپشنال هست که اگه بخوایم، میشه روی یک یا چند ستون از جدولا تعریف کرد. ما وقتی روی یکسری ستونها، index تعریف میکنیم، میتونیم با پرفورمنس بالایی، اون دیتاها رو از دیتابیس واکشی کنیم. تعریف index زمانی برای ما مفید میشه که برای یه کاربرد خاص، تعداد درخواستهای نسبتا زیادی بر روی یکسری دادهها داریم، در این صورت میتونیم سرعت کل برنامه رو به کمک indexها افزایش بدیم.
نکته قابل توجهش اینه که تعریف index ها کاملا مستقل از داده اصلی هست و صرفا با استفاده از ساختمانداده مناسب، دسترسی به دادههای index شده رو افزایش میده. گفتم ساختماندادههای مناسب، بخوام یه اشارهای بکنم، توی Oracle یکی از ساختمان دادههایی که برای این منظور استفاده میشه، B-Tree هست. (احتمالا جزو اون درختایی بوده که توی درس ساختمانداده خوندین و با خودتون گفتین خب به چه دردی میخوره🙂) همچنین متدهای Reverse key indexes، Bitmap indexes و Function-based indexes هم در Oracle قابل استفاده هستند که برای مطالعه بیشتر میتونین به این لینک یه سر بزنین:)
یکی دیگه از دلایلی که استفاده از indexباعث افزایش سرعت واکشی میشه، اینه که باعث میشه دسترسی کمتری به بلوکهای حافظه و I/O disk داشتهباشه و این دسترسی رو به لطف همون ساختماندادهها، به حداقل میرسونه.
در آخر هم درخواست ساختن index رو صرفا برای اینکه بفهمیم چقدر سادس(!) ببینیم:
CREATE INDEX index_name
ON table_name (column1, column2, ...columnN);
و در نهایت:)
برای اینکه اطلاعات بیشتر درباره indexها و نوعهاش و چگونگی کارکردش بدونین خوندن بخش Indexes and Index-Organized Tables از این داکیومنت که مال Oracle هست پیشنهاد میشه:)
#linux
#storage
#LVM
Logical Volume Manager (LVM)
Let’s start with LVM itself. The Logical Volume Manager is the software layer responsible for managing the logical volume infrastructure. It provides tools and utilities to create, resize, and manage logical volumes, volume groups, and physical volumes. LVM facilitates dynamic allocation and resizing of storage resources without requiring downtime.
Physical Volume (PV)
A physical volume refers to a physical storage device or LVM partition, such as a hard disk drive (HDD) or solid-state drive (SSD). LVM utilizes these physical volumes as building blocks for logical volume management.
Volume Group (VG)
A volume group is a collection of one or more physical volumes that are combined to form a single storage pool. It acts as a container for logical volumes and provides a higher level of abstraction for storage management. Within a volume group, available physical extents are pooled together.
Physical Extent (PE)
A physical extent is the smallest unit of allocation within a volume group. It represents a fixed-size block of storage space, typically a few megabytes in size, and is used for allocating logical volumes. The physical extents from different physical volumes are combined to form a single pool of available extents within a volume group.
Advantages of LVM:
Dynamic Storage Allocation
Logical Volume Snapshots
Striping and Mirroring
Volume Group Aggregation
Online Data Relocation
Backup and Restore Flexibility
#storage
#LVM
Logical Volume Manager (LVM)
Let’s start with LVM itself. The Logical Volume Manager is the software layer responsible for managing the logical volume infrastructure. It provides tools and utilities to create, resize, and manage logical volumes, volume groups, and physical volumes. LVM facilitates dynamic allocation and resizing of storage resources without requiring downtime.
Physical Volume (PV)
A physical volume refers to a physical storage device or LVM partition, such as a hard disk drive (HDD) or solid-state drive (SSD). LVM utilizes these physical volumes as building blocks for logical volume management.
Volume Group (VG)
A volume group is a collection of one or more physical volumes that are combined to form a single storage pool. It acts as a container for logical volumes and provides a higher level of abstraction for storage management. Within a volume group, available physical extents are pooled together.
Physical Extent (PE)
A physical extent is the smallest unit of allocation within a volume group. It represents a fixed-size block of storage space, typically a few megabytes in size, and is used for allocating logical volumes. The physical extents from different physical volumes are combined to form a single pool of available extents within a volume group.
Advantages of LVM:
Dynamic Storage Allocation
Logical Volume Snapshots
Striping and Mirroring
Volume Group Aggregation
Online Data Relocation
Backup and Restore Flexibility
pvcreate /dev/sdX
vgcreate myvg /dev/sdX
lvcreate -L 10G -n mylv myvg
#database
#partitioning
#oracle
بریم سراغ یکی از قابلیتهای دیتابیسها که تو حجم بالای داده، خیلی به دردمون میخوره. پارتیشنینگ. پارتیشنینگ میاد برامون جدولها و ایندکس های خیلی بزرگ رو میشکنه به قسمتهای کوچیکتر تا بتونیم مدیریت بهتری روشون داشته باشیم و کارایی رو ببریم بالا.
با یه مثال ادامه بدیم. فرض کنین مدیر یه کتابخونه هستین و تعداد زیاااادی کتاب زیر دستتون هست که باید با سرعت بالایی کتاب مورد نظرتون رو پیدا کنین و بدین به درخواست کننده. خب برای این کار یکی از راههاش اینه که یه قفسه بزررررگ داشته باشین که همه کتابها توی اون قفسه باشه و هر بار که میخواین یه کتابی رو پیدا کنین از اول تا آخر بگردین که بتونین اون کتاب رو پیدا کنین و برش دارین. ولی خب همونطور که دیدین هیچ کتابدار عاقلی این حرکت رو نمیزنه!:) یکی از راههایی که میتونیم این کار رو به صورت بهینه تر انجام بدیم و بهمون کمک میکنه که بتونیم مدیریت بهتری روی کتابها داشته باشیم، اینه که بیایم اون قفسه بزررررگ رو به قفسههای کوچکتری بشکنیم و توی هر قفسه یه سری کتاب خاص رو قرار بدیم که وقتی نیاز داشتیم به اون نوع کتابهای خاص بدونیم باید بریم سراغ کدوم قفسه. مثلا بیایم کتابها رو بر اساس سال چاپ بذاریم توی قفسههای مختلف. یا اینکه بر اساس موضوع بذاریم توی قفسههای مختلف یا ... . به این کار کتابدار توی دیتابیس میگن پارتیشنینگ. حالا همین چطوری جدا کردن این قفسهها خودش میتونه روشهای مختلفی داشته باشه که باعث میشه پارتیشنینگهای مختلفی داشته باشیم:
Range Partitioning
Interval Partitioning
List Partitioning
Hash Partitioning
Refrence Partitioning
Composite Partitioning
قبل از اینکه این موارد رو یه توضیح مختصری بدیم نیازه که با Partition Key آشنا بشیم. Partition Key یک یا مجموعهای از ستونها هست که با توجه به اون ها تصمیم گرفته میشه که یه ردیف از داده، توی کدوم پارتیشن قرار بگیره. هر ردیف داده، به صورت یکتا توی یک پارتیشن قرار میگیره.
#partitioning
#oracle
بریم سراغ یکی از قابلیتهای دیتابیسها که تو حجم بالای داده، خیلی به دردمون میخوره. پارتیشنینگ. پارتیشنینگ میاد برامون جدولها و ایندکس های خیلی بزرگ رو میشکنه به قسمتهای کوچیکتر تا بتونیم مدیریت بهتری روشون داشته باشیم و کارایی رو ببریم بالا.
با یه مثال ادامه بدیم. فرض کنین مدیر یه کتابخونه هستین و تعداد زیاااادی کتاب زیر دستتون هست که باید با سرعت بالایی کتاب مورد نظرتون رو پیدا کنین و بدین به درخواست کننده. خب برای این کار یکی از راههاش اینه که یه قفسه بزررررگ داشته باشین که همه کتابها توی اون قفسه باشه و هر بار که میخواین یه کتابی رو پیدا کنین از اول تا آخر بگردین که بتونین اون کتاب رو پیدا کنین و برش دارین. ولی خب همونطور که دیدین هیچ کتابدار عاقلی این حرکت رو نمیزنه!:) یکی از راههایی که میتونیم این کار رو به صورت بهینه تر انجام بدیم و بهمون کمک میکنه که بتونیم مدیریت بهتری روی کتابها داشته باشیم، اینه که بیایم اون قفسه بزررررگ رو به قفسههای کوچکتری بشکنیم و توی هر قفسه یه سری کتاب خاص رو قرار بدیم که وقتی نیاز داشتیم به اون نوع کتابهای خاص بدونیم باید بریم سراغ کدوم قفسه. مثلا بیایم کتابها رو بر اساس سال چاپ بذاریم توی قفسههای مختلف. یا اینکه بر اساس موضوع بذاریم توی قفسههای مختلف یا ... . به این کار کتابدار توی دیتابیس میگن پارتیشنینگ. حالا همین چطوری جدا کردن این قفسهها خودش میتونه روشهای مختلفی داشته باشه که باعث میشه پارتیشنینگهای مختلفی داشته باشیم:
Range Partitioning
Interval Partitioning
List Partitioning
Hash Partitioning
Refrence Partitioning
Composite Partitioning
قبل از اینکه این موارد رو یه توضیح مختصری بدیم نیازه که با Partition Key آشنا بشیم. Partition Key یک یا مجموعهای از ستونها هست که با توجه به اون ها تصمیم گرفته میشه که یه ردیف از داده، توی کدوم پارتیشن قرار بگیره. هر ردیف داده، به صورت یکتا توی یک پارتیشن قرار میگیره.
خب بریم سراغ این انواع پارتیشنها:
Range Partitioning:
توی این دسته، دیتابیس ردیفهای داده رو بر اساس یه رنجی از مقدار Partitioning Key به پارتیشنها میده که ذخیره کنند. این دسته معمولا بر اساس تاریخ و زمان هست. مثلا پارتیشنینگ بر اساس سال ایجاد اون سطر داده، انجام بشه و همه دادههای سال ۲۰۲۰ توی یه پارتیشن و ۲۰۲۱ توی یه پارتیشن و ... باشه.
Interval Partitioning:
این مدل از پارتیشنینگ، یه اکستنشن از Range Partitioning هست که ما رو از مشخص کردن دقیق رنج پارتیشنها معاف میکنه. یعنی نیاز نیست که حتما همه رینجهایی که نیاز داریم رو تعریف کنیم، بلکه با تعریف یکسری Range و یک Interval، در صورتی که داده مورد نظر، توی اون Range نبود، دیتابیس خودش بر اساس اون Interval، یک پارتیشن ایجاد میکنه و داده رو در اون قرار میده.
List Partitioning:
توی این دسته، برای هر پارتیشن، یک لیستی از مقادیر برای هر پارتیشن، مشخص میشه که بر اساس مقدار Partitioning Key دادهها، در اون پارتیشن قرار میگیره یا نه. مثلا میتونیم بگیم نوع محصولات خوراکی رو بریز توی یه پارتیشن و نوع محصول پوشیدنی رو بریز توی یه پارتیشن دیگه.
Hash Partitioning:
توی این دسته، دیتابیس به کمک یک تابع Hash داخلی، تصمیم میگیره که داده رو بین پارتیشنها تقسیم کنه. تو این مورد ما نمیتونیم بگیم که کدوم دادهها رو توی کدوم پارتیشنها ذخیره کن بلکه فقط میگیم که دادهها رو توی چند تا پارتیشن قرار بده. دیگه دیتابیس خودش میدونه و مقدار خروجی تابع Hashش.:)
Refrence Partitioning:
این روش Partitioning داره میگه که هر استراتژیای که برای ذخیره جدولهای parrent توی دیتابیس هست، توسط جدولهای child هم برقرار باشه. مثلا فررض کنین یک جدول Student داشته باشیم و یک جدول Code که کد های دانشجوها توش نگهداری میشه به این صورت که هر سطر داده در جدول Code یک Student_id به عنوان کلید خارجی داره و نشوندهنده این هست که هر کد مال کدوم دانشجو هست. در این صورت هر ردیف داده در جدول Code در همون پارتیشنی ذخیره میشه که داده متانظر Student_id ش ذخیره شده. این کار باعث میشه که پرفورمنس جوین بین جداول بالا بره.
Composite Partitioning:
این دسته، شامل ترکیبی از انواع پارتیشنینگ که تا حالا باهاشون آشنا شدیم، میشه. به این صورت که میتونیم بعد از تعریف یه Partitioning خاص برای جدول، برای هر پارتیشن یک Subpartition هم تعریف کنیم. مثلا متد Composite Hash-Range Partitioning میتونه Subpartitionهای خودش رو را با Hash Partitioning از پارتیشنهای ایجاد شده توسط Range Partitioning، ایجاد کنه.
و در آخر برای ادامه بازم لینک و داکیومنت جذاب و قشنگ...:)
میتونین برای آشنایی بیشتر با این مبحث، این لینک رو مطالعه کنین.
Range Partitioning:
توی این دسته، دیتابیس ردیفهای داده رو بر اساس یه رنجی از مقدار Partitioning Key به پارتیشنها میده که ذخیره کنند. این دسته معمولا بر اساس تاریخ و زمان هست. مثلا پارتیشنینگ بر اساس سال ایجاد اون سطر داده، انجام بشه و همه دادههای سال ۲۰۲۰ توی یه پارتیشن و ۲۰۲۱ توی یه پارتیشن و ... باشه.
Interval Partitioning:
این مدل از پارتیشنینگ، یه اکستنشن از Range Partitioning هست که ما رو از مشخص کردن دقیق رنج پارتیشنها معاف میکنه. یعنی نیاز نیست که حتما همه رینجهایی که نیاز داریم رو تعریف کنیم، بلکه با تعریف یکسری Range و یک Interval، در صورتی که داده مورد نظر، توی اون Range نبود، دیتابیس خودش بر اساس اون Interval، یک پارتیشن ایجاد میکنه و داده رو در اون قرار میده.
List Partitioning:
توی این دسته، برای هر پارتیشن، یک لیستی از مقادیر برای هر پارتیشن، مشخص میشه که بر اساس مقدار Partitioning Key دادهها، در اون پارتیشن قرار میگیره یا نه. مثلا میتونیم بگیم نوع محصولات خوراکی رو بریز توی یه پارتیشن و نوع محصول پوشیدنی رو بریز توی یه پارتیشن دیگه.
Hash Partitioning:
توی این دسته، دیتابیس به کمک یک تابع Hash داخلی، تصمیم میگیره که داده رو بین پارتیشنها تقسیم کنه. تو این مورد ما نمیتونیم بگیم که کدوم دادهها رو توی کدوم پارتیشنها ذخیره کن بلکه فقط میگیم که دادهها رو توی چند تا پارتیشن قرار بده. دیگه دیتابیس خودش میدونه و مقدار خروجی تابع Hashش.:)
Refrence Partitioning:
این روش Partitioning داره میگه که هر استراتژیای که برای ذخیره جدولهای parrent توی دیتابیس هست، توسط جدولهای child هم برقرار باشه. مثلا فررض کنین یک جدول Student داشته باشیم و یک جدول Code که کد های دانشجوها توش نگهداری میشه به این صورت که هر سطر داده در جدول Code یک Student_id به عنوان کلید خارجی داره و نشوندهنده این هست که هر کد مال کدوم دانشجو هست. در این صورت هر ردیف داده در جدول Code در همون پارتیشنی ذخیره میشه که داده متانظر Student_id ش ذخیره شده. این کار باعث میشه که پرفورمنس جوین بین جداول بالا بره.
Composite Partitioning:
این دسته، شامل ترکیبی از انواع پارتیشنینگ که تا حالا باهاشون آشنا شدیم، میشه. به این صورت که میتونیم بعد از تعریف یه Partitioning خاص برای جدول، برای هر پارتیشن یک Subpartition هم تعریف کنیم. مثلا متد Composite Hash-Range Partitioning میتونه Subpartitionهای خودش رو را با Hash Partitioning از پارتیشنهای ایجاد شده توسط Range Partitioning، ایجاد کنه.
و در آخر برای ادامه بازم لینک و داکیومنت جذاب و قشنگ...:)
میتونین برای آشنایی بیشتر با این مبحث، این لینک رو مطالعه کنین.
Oracle Help Center
VLDB and Partitioning Guide
Partitioning enhances the performance, manageability, and availability of a wide variety of applications and helps reduce the total cost of ownership for storing large amounts of data.
#soft_skill
#presentation
چند تا نکته کلا درباره ارائه دادن و حرف زدن
۱. یونیک کردن ارائه با اضافه کردن نظرات خود ارائه دهنده
درگیر کردن ذهن مخاطب با سوال
۲. تن صدای مناسب و فراز و نشیب
۳. تماس چشمی با مخاطب
۴. انسان ها از طریق هیجانات با هم صحبت میکنند:)
۵. قاعده آلبرت مهرابیان
۶. زبان بدن مثل طاووس
#presentation
چند تا نکته کلا درباره ارائه دادن و حرف زدن
۱. یونیک کردن ارائه با اضافه کردن نظرات خود ارائه دهنده
درگیر کردن ذهن مخاطب با سوال
۲. تن صدای مناسب و فراز و نشیب
۳. تماس چشمی با مخاطب
۴. انسان ها از طریق هیجانات با هم صحبت میکنند:)
۵. قاعده آلبرت مهرابیان
۶. زبان بدن مثل طاووس
#فیلم
#maze_runner
#movie
فیلم Maze runner
سه تاشو دیدم:)
یکم بگم ازش که مقداری هم اسپویل توش هست و اول فیلمو ببینین بعد ....:)
اگر بخوام ازش چند خط بنویسم، اول اینکه عشق خاصی توی فیلم نبود و خیلی تمرکزش روی عشق و عاشقی نبود بر خلاف خیلی فیلمای دیگه. و باز هم مثل خیلی فیلمای دیگه یه سوپرمنی بود که راهی رو میرفت بر خلاف راه عام مردم. انتخابی رو میکرد برخلاف انتخاب بقیه و کاری رو میکرد که بقیه انتظارش رو ندارن. یه چیز دیگه هم که جالب بود و کمتر توی فیلما پیدا میشد، از دست دادن عزیزان نقش اصلی بود توی این سه قسمت. توی هرکدوم از قسمت هاش یه جورایی نزدیک ترین دوستش رو از دست میداد و در آخر قسمت آخرش هم که هیچ:)
ته فیلم رو هم نفهمیدم آخرش بدون دارو دیگه طوریشون نشد یا چی ولی فکر کنم اخرش کسایی که فرار کرده بودن نجات پیدا کردن و کسایی هم که یه عمری جنگیدن برا پیدا کردن یه راه درمان ویروس، همشون مردن به جز اونایی که موفق شدن فرار کنن:)
راه درمانش هم از خون فقط یه نفر بود:)
جالبه
چرا خون یه نفر؟ چرا زندگی یه نفر باید نجات میافت کلا؟ و کلی چرای دیگه از جزییات که مجال گفتن نیست:)
خلاصه در کل همون که اول هم گفتم....جنگیدن برای زنده موندن...برای نمردن...برای دوستان همین:)
#maze_runner
#movie
فیلم Maze runner
سه تاشو دیدم:)
یکم بگم ازش که مقداری هم اسپویل توش هست و اول فیلمو ببینین بعد ....:)
ته فیلم رو هم نفهمیدم آخرش بدون دارو دیگه طوریشون نشد یا چی ولی فکر کنم اخرش کسایی که فرار کرده بودن نجات پیدا کردن و کسایی هم که یه عمری جنگیدن برا پیدا کردن یه راه درمان ویروس، همشون مردن به جز اونایی که موفق شدن فرار کنن:)
راه درمانش هم از خون فقط یه نفر بود:)
جالبه
چرا خون یه نفر؟ چرا زندگی یه نفر باید نجات میافت کلا؟ و کلی چرای دیگه از جزییات که مجال گفتن نیست:)
خلاصه در کل همون که اول هم گفتم....جنگیدن برای زنده موندن...برای نمردن...برای دوستان همین:)
#مشورت
#تجربه
#آینده
امروز یه صحبتی با مستر حقیقت داشتم که یه خلاصه نکاتش رو بد نیس مرور کنم:)
صحبت درباره آینده کار و دانشگاه بود بیشتر. اینکه اول یه مقایسه ای داشته باشیم بین دانشگاه و کار و اینکه میشه یه پا تو دانشگاه باشه یه پا تو شرکت...که گویا نمیشه. شرکت داشتن و کار کردن و کار به درد بخور کردن یه کار فول تایمه با تمرکز کامل. و اینکه کار شرکتی فقط کار فنی نیست یا فقط کار R&D نیست و خیلی کارای دیگه هم در خیلش هست. نمیدونم کارای hr ای، کارای حقوقی، کارای اجرایی و ... . تو دانشگاه بخوای ادامه بدی و درس بخونی تقریبا تک بعدیه...فقط درس و ریسرچ و مقاله و h-index و ... . لذا یه استاد که دغدغش h-index ش هست نمیتونه دغدغه کامل شرکت رو هم داشته باشه اونم یه شرکت بزرگ تو اسکیل ۵۰۰ نفر به بالا. مگر اینکه یه شرکت کوچول موچول داشته باشه که با چند تا دانشجوی کوچول موچول که دور خودش جمعشون کرده و یه پروژه ای برداشتن با سنگر و اسم داشنگاه که انجامش بدن و بعد از یه مدتی...اگر فیل هم نشه ولی یه کار قوی بعیده بشه.
(تقریبا قبول دارم تا بخشی. بعضی پروژههایی که خودم داشتم با استادا و موقع دانشجوییم با اینکه بسی خون و دل خوردم سرش و وقت گذاشتم و فلان و بهمان...ولی الان میدونم داره خاک میخوره و استفاده نمیشه. البته لازم به ذکره که بعضیاشونم داره استفاده میشه و زیر باره با قدرت و هنوزم دارم لذت میبرم از بزرگ کردن چنین بچههایی:)) ولی خب اسکیلش به اندازه محصولات یه شرکت بزرگ نیست منطقا)
دیگه اینکه یه حرف دیگه هم زده شد که جذاب بود برام. اینکه استاده یا کاری که تو دانشگاه داره انجام میشه، داره پشت دانشگاه انجام میشه و برای بقاش نمیجنگه. ولی وقتی توی یه شرکتی هستی باید توی رقابتای سنگین واقعا بجنگی برای بقا. کارای دانشگاهی و اینا میتونه خروجی داشته باشه میتونه نداشته باشه ولی کار صنعتی باید خروجی داشته باشه...باید کاری انجام بده وگرنه خورده میشه و هضم میشه و در نهایت...میمیره و تامام:) لذا اون روحیه جنگندگی و بدو بدو و اینا...فکر میکنم تو شرکت و صنعت بیشتر تقویت بشه. چون داری خروج یکارت رو میبینی...چون داری میبینی به درد میخوره این کارت ...چون داری میبینی این چند خط کدت چقدر تاثیر داره توی کشور، زندگی مردم و حتی خودت:) اره چند خط کد توی خود آدم هم تاثیر میذاره که دیگه بحثشو باز نمیکنم:)
دیگه اینکه تجربه خارج کشور...اگرم میخوای داشته باشی به کم قانع نشو:)
گزینه خارج تو مورد تحصیلیش که عملا داری باز میدویی دنبال مقاله پقاله و خروجی کار و تاثیرش شدیدا کمتره و من خودم آدم صرف مقاله ای نیستم و نمیتونم کاری نکنم و فقط دنبال ریسرچ و مقاله باشم. لذا هسیم فعلا به اندازه کافی و لازم:)
والسلام
#تجربه
#آینده
امروز یه صحبتی با مستر حقیقت داشتم که یه خلاصه نکاتش رو بد نیس مرور کنم:)
صحبت درباره آینده کار و دانشگاه بود بیشتر. اینکه اول یه مقایسه ای داشته باشیم بین دانشگاه و کار و اینکه میشه یه پا تو دانشگاه باشه یه پا تو شرکت...که گویا نمیشه. شرکت داشتن و کار کردن و کار به درد بخور کردن یه کار فول تایمه با تمرکز کامل. و اینکه کار شرکتی فقط کار فنی نیست یا فقط کار R&D نیست و خیلی کارای دیگه هم در خیلش هست. نمیدونم کارای hr ای، کارای حقوقی، کارای اجرایی و ... . تو دانشگاه بخوای ادامه بدی و درس بخونی تقریبا تک بعدیه...فقط درس و ریسرچ و مقاله و h-index و ... . لذا یه استاد که دغدغش h-index ش هست نمیتونه دغدغه کامل شرکت رو هم داشته باشه اونم یه شرکت بزرگ تو اسکیل ۵۰۰ نفر به بالا. مگر اینکه یه شرکت کوچول موچول داشته باشه که با چند تا دانشجوی کوچول موچول که دور خودش جمعشون کرده و یه پروژه ای برداشتن با سنگر و اسم داشنگاه که انجامش بدن و بعد از یه مدتی...اگر فیل هم نشه ولی یه کار قوی بعیده بشه.
(تقریبا قبول دارم تا بخشی. بعضی پروژههایی که خودم داشتم با استادا و موقع دانشجوییم با اینکه بسی خون و دل خوردم سرش و وقت گذاشتم و فلان و بهمان...ولی الان میدونم داره خاک میخوره و استفاده نمیشه. البته لازم به ذکره که بعضیاشونم داره استفاده میشه و زیر باره با قدرت و هنوزم دارم لذت میبرم از بزرگ کردن چنین بچههایی:)) ولی خب اسکیلش به اندازه محصولات یه شرکت بزرگ نیست منطقا)
دیگه اینکه یه حرف دیگه هم زده شد که جذاب بود برام. اینکه استاده یا کاری که تو دانشگاه داره انجام میشه، داره پشت دانشگاه انجام میشه و برای بقاش نمیجنگه. ولی وقتی توی یه شرکتی هستی باید توی رقابتای سنگین واقعا بجنگی برای بقا. کارای دانشگاهی و اینا میتونه خروجی داشته باشه میتونه نداشته باشه ولی کار صنعتی باید خروجی داشته باشه...باید کاری انجام بده وگرنه خورده میشه و هضم میشه و در نهایت...میمیره و تامام:) لذا اون روحیه جنگندگی و بدو بدو و اینا...فکر میکنم تو شرکت و صنعت بیشتر تقویت بشه. چون داری خروج یکارت رو میبینی...چون داری میبینی به درد میخوره این کارت ...چون داری میبینی این چند خط کدت چقدر تاثیر داره توی کشور، زندگی مردم و حتی خودت:) اره چند خط کد توی خود آدم هم تاثیر میذاره که دیگه بحثشو باز نمیکنم:)
دیگه اینکه تجربه خارج کشور...اگرم میخوای داشته باشی به کم قانع نشو:)
گزینه خارج تو مورد تحصیلیش که عملا داری باز میدویی دنبال مقاله پقاله و خروجی کار و تاثیرش شدیدا کمتره و من خودم آدم صرف مقاله ای نیستم و نمیتونم کاری نکنم و فقط دنبال ریسرچ و مقاله باشم. لذا هسیم فعلا به اندازه کافی و لازم:)
والسلام
⚡1👍1🔥1
#ParallelProcessing
#OpenMP
OpenMP
یه کتابخونه برای پردازش موازی بر پایه Shared Memory هست که توی c , cpp و fortran میشه ازش استفاده کرد.
پردازشهای موازی معمولا یا بر پایه Shared Memory اند یا بر پایه Message Passing. بخوام بگم این دو تا چین خیلی خلاصه، روش ارتباط بین پردازندهها. ما زمانی که میریم سراغ پردازش موازی، نیاز داریم که خیلی موقع ها پردازندههامون باهم ارتباط داشته باشن ...متغیر بگیرن بدن یا روی یه سری متغیر مشترک پردازش انجام بدن. زمانی که پردازش موازی مون بر پایه Shared Memory عه، میایم یه مموری مشترک میذاریم اون وسط میگیم همه پردازنده ها (یا تردهای هر پردازنده) به اون دسترسی داشته باشن و متغیرهای مشترک رو هم اونجا بنویسن و بخونن (البته با احتیاط:) ). زمانی هم که این پردازش موازیمون بر پایه Message Passing عه، با یه Interconnection Network ای، پردازندهها (یا تردها) با هم ارتباط میگیرن و دیتا برا همدیگه میفرستن. مثال سادش میشه مثلا روی شبکه اینترنت یا اینترانت بیان دیتاهاشون رو بفرستن برا هم و معمولا برای پردازشهای موازی توی کلاستر ها و روی چند تا نود بیشتر کاربرد داره.
خب برگردیم سر بحث اول. OpenMp مخفف Open Multiprocessing Programming هست. وقتی با این کتابخونه یه برنامه مینویسیم، میتونیم بهش دقیقا مشخص کنیم که کجاها رو موازی کنه، چطوی موازی کنه، از کجا به بعد دیگ موازی نباشه و خیلی چیزای دیگه. یعنی مستقیم به کامپایلر میگیم اقا تو فلان جای کد رو با اینقدر ترد موازیش کن و کامپایلر هم فایلهای اجرایی مربوط به اون رو ایجاد میکنه و میده سیستمعامل که انجامش بده. وقتی به کمک OpenMP موازی کد میزنیم، عملا کدمون میشه مجموعهای از Threadها که با fork و join ایجاد یا ادغام میشن. یه ترد مستر داریم همیشه که Thread 0 هست. بعد از اینکه fork زدیم، میاد یک سری تردهای اسلیو هم ایجاد میکنه که Thread >=1 رو شامل میشه.
حیفه درباره پردازش موازی صحبت بشه و درباره خطرش صحبت نشه:)
اگه حواسمون به متغیرهای مشترک نباشه ممکنه یه جایی رو بترکونیم:))
لذا یا با استفاده از lock یا متغیرهای پرایوت (متغیرهایی که مخصوص هر ترد میشه) و اشتراکی (متغیر های اشتراکی تردها) یا مشخص کردن critical section یا single thread region یا Barrierها یا عملیاتهای atomic، جلوی مشکلا رو باید گرفت تا پردازش درست انجام بشه:)
چند تا ریسورس:
منبع ۱
منبع ۲
و یک نمونه کد بدون شرح:
#OpenMP
OpenMP
یه کتابخونه برای پردازش موازی بر پایه Shared Memory هست که توی c , cpp و fortran میشه ازش استفاده کرد.
پردازشهای موازی معمولا یا بر پایه Shared Memory اند یا بر پایه Message Passing. بخوام بگم این دو تا چین خیلی خلاصه، روش ارتباط بین پردازندهها. ما زمانی که میریم سراغ پردازش موازی، نیاز داریم که خیلی موقع ها پردازندههامون باهم ارتباط داشته باشن ...متغیر بگیرن بدن یا روی یه سری متغیر مشترک پردازش انجام بدن. زمانی که پردازش موازی مون بر پایه Shared Memory عه، میایم یه مموری مشترک میذاریم اون وسط میگیم همه پردازنده ها (یا تردهای هر پردازنده) به اون دسترسی داشته باشن و متغیرهای مشترک رو هم اونجا بنویسن و بخونن (البته با احتیاط:) ). زمانی هم که این پردازش موازیمون بر پایه Message Passing عه، با یه Interconnection Network ای، پردازندهها (یا تردها) با هم ارتباط میگیرن و دیتا برا همدیگه میفرستن. مثال سادش میشه مثلا روی شبکه اینترنت یا اینترانت بیان دیتاهاشون رو بفرستن برا هم و معمولا برای پردازشهای موازی توی کلاستر ها و روی چند تا نود بیشتر کاربرد داره.
خب برگردیم سر بحث اول. OpenMp مخفف Open Multiprocessing Programming هست. وقتی با این کتابخونه یه برنامه مینویسیم، میتونیم بهش دقیقا مشخص کنیم که کجاها رو موازی کنه، چطوی موازی کنه، از کجا به بعد دیگ موازی نباشه و خیلی چیزای دیگه. یعنی مستقیم به کامپایلر میگیم اقا تو فلان جای کد رو با اینقدر ترد موازیش کن و کامپایلر هم فایلهای اجرایی مربوط به اون رو ایجاد میکنه و میده سیستمعامل که انجامش بده. وقتی به کمک OpenMP موازی کد میزنیم، عملا کدمون میشه مجموعهای از Threadها که با fork و join ایجاد یا ادغام میشن. یه ترد مستر داریم همیشه که Thread 0 هست. بعد از اینکه fork زدیم، میاد یک سری تردهای اسلیو هم ایجاد میکنه که Thread >=1 رو شامل میشه.
حیفه درباره پردازش موازی صحبت بشه و درباره خطرش صحبت نشه:)
اگه حواسمون به متغیرهای مشترک نباشه ممکنه یه جایی رو بترکونیم:))
لذا یا با استفاده از lock یا متغیرهای پرایوت (متغیرهایی که مخصوص هر ترد میشه) و اشتراکی (متغیر های اشتراکی تردها) یا مشخص کردن critical section یا single thread region یا Barrierها یا عملیاتهای atomic، جلوی مشکلا رو باید گرفت تا پردازش درست انجام بشه:)
چند تا ریسورس:
منبع ۱
منبع ۲
و یک نمونه کد بدون شرح:
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int main()
{
int th_id, num;
omp_set_num_threads(2);
#pragma omp parallel for
for (int i=0 ; i < 10 ; i++)
{
num = omp_get_num_threads();
th_id = omp_get_thread_num();
printf("thread Id : %d/%d Threads, Assigned Loop Index: %d\n", th_id, num, i);
}
return 0;
}
👍1🔥1
#softskill
مینی سافت اسکیل:)
شنونده خوبی باشیم:)))
یکم ایدت:
چطوری شنونده خوبی باشیم؟ نپریم وسط حرف
چطوری شنونده خوبی باشیم؟ یه ack بدیم با دست یا بدن یا سر به گوینده بفهمه داریم میشنویم و میفهمیم
چطوری شنونده خوبی باشیم؟ ارتباط چشمی داشته باشیم (که من بلد نیستم اینو:) )
چطوری شنونده خوبی باشیم؟ ...
مینی سافت اسکیل:)
شنونده خوبی باشیم:)))
یکم ایدت:
چطوری شنونده خوبی باشیم؟ نپریم وسط حرف
چطوری شنونده خوبی باشیم؟ یه ack بدیم با دست یا بدن یا سر به گوینده بفهمه داریم میشنویم و میفهمیم
چطوری شنونده خوبی باشیم؟ ارتباط چشمی داشته باشیم (که من بلد نیستم اینو:) )
چطوری شنونده خوبی باشیم؟ ...
❤🔥1👍1🔥1
#Reinforcement_Learning
#RL
#AI
#هوش_مصنوعی
#یادگیری_تقویتی
یادگیری تقویتی
قسمت اول: مقدمه
یکم درباره این شاخه از هوش بنویسیم (اصلا هم برا این نیست که فردا میانترمشو دارم:)) )
خیلی ساده بخوام بگم، اینجا یه ایجنت داریم، یه محیط داریم که اون ایجنت بر اساس یکسری policy یا سیاستهایی توی اون محیط داره عمل یا actionهایی رو انجام میده که در نتیجه اون اکشن، ممکنه یه پاداش یا rewardای از محیط دریافت کنه و state ایجنت عوض بشه.
این کلیدواژههایی که گفتم توی بند قبلی تقریبا توی کل الگوریتمهای RL هست و فقط با اینا بازی بازی کردن:)
action, state, reward, ...
هر جور فکر میکنم حسش نیست وارد جزییات ریاضیات و فرمولای الگوریتماش بشم پس صرفا چند تا تایتل معرفی میکنم بعدا شاید بیشتر دیتیل نوشتم ازشون.
multi-armed Bandits
Markov Decision Processes
Dynamic Programming
Monte Carlo Method
Temporal-Difference Learning
n-step bootstrapping
البته حیفه حرف از RL بشه و سخنی از کتابخونه gym openai زده نشه:)
و البته اینم جذابه برا کد زدن و دید گرفتن:)
q-learning
#RL
#AI
#هوش_مصنوعی
#یادگیری_تقویتی
یادگیری تقویتی
قسمت اول: مقدمه
یکم درباره این شاخه از هوش بنویسیم (اصلا هم برا این نیست که فردا میانترمشو دارم:)) )
خیلی ساده بخوام بگم، اینجا یه ایجنت داریم، یه محیط داریم که اون ایجنت بر اساس یکسری policy یا سیاستهایی توی اون محیط داره عمل یا actionهایی رو انجام میده که در نتیجه اون اکشن، ممکنه یه پاداش یا rewardای از محیط دریافت کنه و state ایجنت عوض بشه.
این کلیدواژههایی که گفتم توی بند قبلی تقریبا توی کل الگوریتمهای RL هست و فقط با اینا بازی بازی کردن:)
action, state, reward, ...
هر جور فکر میکنم حسش نیست وارد جزییات ریاضیات و فرمولای الگوریتماش بشم پس صرفا چند تا تایتل معرفی میکنم بعدا شاید بیشتر دیتیل نوشتم ازشون.
multi-armed Bandits
Markov Decision Processes
Dynamic Programming
Monte Carlo Method
Temporal-Difference Learning
n-step bootstrapping
البته حیفه حرف از RL بشه و سخنی از کتابخونه gym openai زده نشه:)
و البته اینم جذابه برا کد زدن و دید گرفتن:)
q-learning
🔥1😁1
#csharp
#dotnet
#backend
دو برابر شدن سرعت لوپ توی c# با استفاده از Span...!!!
البته با احتیاط باید استفاده بشه و لیستی ک روش میخوایم لوپ بزنیم سایزش رو تغییر ندیم و...
لینک
#dotnet
#backend
دو برابر شدن سرعت لوپ توی c# با استفاده از Span...!!!
البته با احتیاط باید استفاده بشه و لیستی ک روش میخوایم لوپ بزنیم سایزش رو تغییر ندیم و...
لینک
YouTube
Stop Using the Worst Way to Loop Lists in .NET!
Get 20% off our new Deep Dive: Domain-Driven Design course on Dometrain: https://bit.ly/44pf7sEGet the source code: Become a Patreon and get special perks: h...
🔥1🕊1🍾1
#ansible
#infra
#linux
Ansible is a powerful automation tool that allows you to automate tasks, configure systems, deploy applications, and more. Here are some steps to get started with Ansible:
1. Install Ansible on your system: You can install Ansible on your local machine or a control node. Ansible is available for all major operating systems. You can find installation instructions on the official Ansible documentation website
2. Understand the basics of Ansible:
Playbooks: Playbooks are files written in YAML format that define a set of tasks to be executed on remote hosts.
Inventory: The inventory file contains a list of hosts on which you want to run your tasks.
Modules: Modules are small programs that Ansible invokes on remote hosts to perform tasks.
Tasks: Tasks define the actions you want to perform on remote hosts.
Start writing your first playbook: You can create a simple playbook to perform basic tasks like installing packages, creating users, or managing files. You can refer to Ansible documentation and examples to get started.
3. Run your playbook: Once you have written your playbook, you can run it using the ansible-playbook command. Make sure to specify the inventory file containing the list of hosts on which you want to run the playbook.
4. Explore advanced features: Ansible has a lot of advanced features like roles, variables, conditionals, loops, and more. You can gradually explore these features as you become more comfortable with Ansible.
example:
inventory.ini
#infra
#linux
Ansible is a powerful automation tool that allows you to automate tasks, configure systems, deploy applications, and more. Here are some steps to get started with Ansible:
1. Install Ansible on your system: You can install Ansible on your local machine or a control node. Ansible is available for all major operating systems. You can find installation instructions on the official Ansible documentation website
2. Understand the basics of Ansible:
Playbooks: Playbooks are files written in YAML format that define a set of tasks to be executed on remote hosts.
Inventory: The inventory file contains a list of hosts on which you want to run your tasks.
Modules: Modules are small programs that Ansible invokes on remote hosts to perform tasks.
Tasks: Tasks define the actions you want to perform on remote hosts.
Start writing your first playbook: You can create a simple playbook to perform basic tasks like installing packages, creating users, or managing files. You can refer to Ansible documentation and examples to get started.
3. Run your playbook: Once you have written your playbook, you can run it using the ansible-playbook command. Make sure to specify the inventory file containing the list of hosts on which you want to run the playbook.
4. Explore advanced features: Ansible has a lot of advanced features like roles, variables, conditionals, loops, and more. You can gradually explore these features as you become more comfortable with Ansible.
example:
inventory.ini
[my_nodes]execute_noscript.yml
1.1.1.1
2.2.2.2
3.3.3.3
4.4.4.4
5.5.5.5
- name: Transfer and execute a noscript on specific nodes
hosts: my_nodes
become: yes # To execute commands with sudo privileges
tasks:
- name: Transfer the noscript
copy:
src: /path/to/mynoscript.sh # Replace with the actual path to your noscript
dest: /home/user/mynoscript.sh
mode: '0755' # Set appropriate permissions
- name: Execute the noscript
shell: sh /home/user/mynoscript.sh
🤯2⚡1🔥1
MrMohammadi_cluster (1).aac
20.3 MB
#تجربه
#ابررایانش
#آقای_محمدی
#clustering
#cloud
#proxmox
یه گپی زدیم با آقای محمدی مسئول ابررایانش شیخ بهایی دانشگاه صنعتی و اندکی کسب اطلاعات جذاب :)
موضوع هایی ک صحبت کردیم روش :
کلاستر کردن ویندوز با Microsoft HPC Pack
کلاستر کردن لینوکسها با Cluster Management و Provisioning
به کمک ابزار warewulf
زمانبندی جابها با ابزار Slurm و دارو دستش
و ارائه دادن جوپیتر نوتبوک و دسکتاپ با OnDemand
و چالشهای accounting , scheduling, queue
چالشهای proxmox و ارائه دادن vm
#ابررایانش
#آقای_محمدی
#clustering
#cloud
#proxmox
یه گپی زدیم با آقای محمدی مسئول ابررایانش شیخ بهایی دانشگاه صنعتی و اندکی کسب اطلاعات جذاب :)
موضوع هایی ک صحبت کردیم روش :
کلاستر کردن ویندوز با Microsoft HPC Pack
کلاستر کردن لینوکسها با Cluster Management و Provisioning
به کمک ابزار warewulf
زمانبندی جابها با ابزار Slurm و دارو دستش
و ارائه دادن جوپیتر نوتبوک و دسکتاپ با OnDemand
و چالشهای accounting , scheduling, queue
چالشهای proxmox و ارائه دادن vm
🔥2👍1
#linux
#windows
#msys2
یه متاع پیدا کردم برا لینوکس یوزرایی که روی ویندوزن :))
لینک خودش
لینک ابزارهایی که داره و میشه نصبشون کرد
#windows
#msys2
یه متاع پیدا کردم برا لینوکس یوزرایی که روی ویندوزن :))
لینک خودش
لینک ابزارهایی که داره و میشه نصبشون کرد
MSYS2 is a collection of tools and libraries providing you with an easy-to-use environment for building, installing and running native Windows software.
It consists of a command line terminal called mintty, bash, version control systems like git and subversion, tools like tar and awk and even build systems like autotools, all based on a modified version of Cygwin. Despite some of these central parts being based on Cygwin, the main focus of MSYS2 is to provide a build environment for native Windows software and the Cygwin-using parts are kept at a minimum. MSYS2 provides up-to-date native builds for GCC, mingw-w64, CPython, CMake, Meson, OpenSSL, FFmpeg, Rust, Ruby, just to name a few.
To provide easy installation of packages and a way to keep them updated it features a package management system called Pacman, which should be familiar to Arch Linux users. It brings many powerful features such as dependency resolution and simple complete system upgrades, as well as straight-forward and reproducible package building. Our package repository contains more than 3000 pre-built packages ready to install.
www.msys2.org
Software Distribution and Building Platform for Windows
#SOLID
#code
#clean_code
یه مروری بکنیم روی اصول SOLID که بسی مهم و کاربردیه توی کد زدن:)
Single-Responsibility Principle
هر کلاس یا ماژول فقط و فقط یک دلیل برای تغییر باشد داشته باشه. یعنی هر کلاس تنها مسئول یک و فقط یک کار هست و سعی کنه اون کار رو خوب انجام بده:)
فایدههایی که داره: کد رو ماژولار میکنه و بخشهای مختلف رو جدا میکنه از هم و دیباگ رو هم حتی راحت تر میکنه. تست پذیری بسی بهتر میشه و در نهایت تغییر یک قسمت از یک کد تاثیر روی بقیه کد نمیذاره.
پس هر جا دیدیم یه کلاسی داره دو تا یا چند تا کار رو با هم انجام میده خیلی سریع میشکنیمش به چند تا کلاس:))
Open-Closed Principle
میگه که open for extensions but close for modifications. وقتی کدی میزنیم باید بتونیم رفتار کد رو گسترش بدیم بدون اینکه تغییری در کدهای موجود بدیم. یعنی در واقع فیچر ها رو با اضافه کردن کد و کلاسهای جدید بدیم نه اینکه با تغییر کد و کلاسهای قبلی.
اینطور کد زدن کد رو استیبل تر نگهمیداره و قابل پیشبینی تر و احتمال ایجاد باگ رو کمتر میکنه. مثلا ایفمالیزیشن کد زدن باعث میشه کدمون open-close نباشه و برای اضافه کردن یه شرط جدید، هربار باید اون ایفمالیزیشن رو عوضش کرد.
Liskov Substitution Principle
این اصل میگه فرزندها باید بتونن جایگزین پدرها بشن!!!:))
درد واقع هر شی فرعی یا فرزند باید بتونه بجای نمونهای از نوع پایه خود بدون تاثیر بر صحت برنامه، استفاده بشه. این اصل ما رو مطمئن میکنه وقتی که داریم با نوع شئ های مختلفی کار میکنیم، رفتار کد تغییری نکنه. برای رعایت این اصل، همیشه باید مطمئن بشیم که هر کلااس فرزند، رفتاری شبیه پدرش داره. (توضیحش سخته ولی همینه تقریبا:) )
فایدههایی که داره: maintainable, flexibility, scalability, robustness
Interface Segregation Principle
یک کلاس نباید مجبور باشه اینترفیسی پیادهسازی کنه که استفاده نمیکنه. یک کلاس باید فقط اینترفیسی پیادهسازی کنه که نیاز داره و داره ازش استفاده میکنه.
باعث میشه وابستگی و کاپلنیگ توی کد کم بشه. بس اینترفیسهایی هم که استفاده میکنیم ممکنه شکسته بشه و به چند تا اینترفیس تبدیل بشه. لذا خوبه که سعی کنیم اینترفیسهای کوچیکی تعریف کنیم.
خوبی های زیادی هم داره دیگه:))
عوض کردن رفتار یه کلاس تاثیری دیگه نمیذاره روی بقیه کلاسها و رفتارها و میدونیم دقیقا کجا رو باید تغییر بدیم برا یه کلاس
Dependency Inversion Principle
در گذشتههای نزدیک، وقتی ملت کد میزدن کلاسهایی که توشون منطق بود و پیادهسازی داشت، از هم ارث میبردن ولی این اصل میگه این کارو نکنین و بجای این کار بیاین یه اینترفیس میانی بسازین و توی دوتا کلاس از اون استفاده کنین..
این کار باعث میشه هیچ دو کلاسی که پیادهسازی دارن به هم وابسته نشن و فقط بدونن که چنین کلاسهایی وجود داره و کامل مستقل میشه از جزییات پیادهسازی همدیگه:)
خوبیهاشم تست رو راحت تر میکنه و وابستگی رو کم و کد رو انعطافپذیر.
یه سری لینک که میتونه کمک کنه کلا تو این زمینه:
لینک ۱
لینک ۲
لینک ۳
اینم یه نمونه کد که تو سه تا فایل بررسی کرده. اصلا اصول رعایت نشده، رعایت نشده، رعایت شده:))
#code
#clean_code
یه مروری بکنیم روی اصول SOLID که بسی مهم و کاربردیه توی کد زدن:)
Single-Responsibility Principle
هر کلاس یا ماژول فقط و فقط یک دلیل برای تغییر باشد داشته باشه. یعنی هر کلاس تنها مسئول یک و فقط یک کار هست و سعی کنه اون کار رو خوب انجام بده:)
فایدههایی که داره: کد رو ماژولار میکنه و بخشهای مختلف رو جدا میکنه از هم و دیباگ رو هم حتی راحت تر میکنه. تست پذیری بسی بهتر میشه و در نهایت تغییر یک قسمت از یک کد تاثیر روی بقیه کد نمیذاره.
پس هر جا دیدیم یه کلاسی داره دو تا یا چند تا کار رو با هم انجام میده خیلی سریع میشکنیمش به چند تا کلاس:))
Open-Closed Principle
میگه که open for extensions but close for modifications. وقتی کدی میزنیم باید بتونیم رفتار کد رو گسترش بدیم بدون اینکه تغییری در کدهای موجود بدیم. یعنی در واقع فیچر ها رو با اضافه کردن کد و کلاسهای جدید بدیم نه اینکه با تغییر کد و کلاسهای قبلی.
اینطور کد زدن کد رو استیبل تر نگهمیداره و قابل پیشبینی تر و احتمال ایجاد باگ رو کمتر میکنه. مثلا ایفمالیزیشن کد زدن باعث میشه کدمون open-close نباشه و برای اضافه کردن یه شرط جدید، هربار باید اون ایفمالیزیشن رو عوضش کرد.
Liskov Substitution Principle
این اصل میگه فرزندها باید بتونن جایگزین پدرها بشن!!!:))
درد واقع هر شی فرعی یا فرزند باید بتونه بجای نمونهای از نوع پایه خود بدون تاثیر بر صحت برنامه، استفاده بشه. این اصل ما رو مطمئن میکنه وقتی که داریم با نوع شئ های مختلفی کار میکنیم، رفتار کد تغییری نکنه. برای رعایت این اصل، همیشه باید مطمئن بشیم که هر کلااس فرزند، رفتاری شبیه پدرش داره. (توضیحش سخته ولی همینه تقریبا:) )
فایدههایی که داره: maintainable, flexibility, scalability, robustness
Interface Segregation Principle
یک کلاس نباید مجبور باشه اینترفیسی پیادهسازی کنه که استفاده نمیکنه. یک کلاس باید فقط اینترفیسی پیادهسازی کنه که نیاز داره و داره ازش استفاده میکنه.
باعث میشه وابستگی و کاپلنیگ توی کد کم بشه. بس اینترفیسهایی هم که استفاده میکنیم ممکنه شکسته بشه و به چند تا اینترفیس تبدیل بشه. لذا خوبه که سعی کنیم اینترفیسهای کوچیکی تعریف کنیم.
خوبی های زیادی هم داره دیگه:))
عوض کردن رفتار یه کلاس تاثیری دیگه نمیذاره روی بقیه کلاسها و رفتارها و میدونیم دقیقا کجا رو باید تغییر بدیم برا یه کلاس
Dependency Inversion Principle
در گذشتههای نزدیک، وقتی ملت کد میزدن کلاسهایی که توشون منطق بود و پیادهسازی داشت، از هم ارث میبردن ولی این اصل میگه این کارو نکنین و بجای این کار بیاین یه اینترفیس میانی بسازین و توی دوتا کلاس از اون استفاده کنین..
این کار باعث میشه هیچ دو کلاسی که پیادهسازی دارن به هم وابسته نشن و فقط بدونن که چنین کلاسهایی وجود داره و کامل مستقل میشه از جزییات پیادهسازی همدیگه:)
خوبیهاشم تست رو راحت تر میکنه و وابستگی رو کم و کد رو انعطافپذیر.
یه سری لینک که میتونه کمک کنه کلا تو این زمینه:
لینک ۱
لینک ۲
لینک ۳
اینم یه نمونه کد که تو سه تا فایل بررسی کرده. اصلا اصول رعایت نشده، رعایت نشده، رعایت شده:))
Medium
SOLID principles: implementation and examples in C++
SOLID principles are widely adopted by software developers as a set of guidelines for designing maintainable and extensible code. By…
⚡1🔥1