نکات برنامه‌نویسی

نکات برنامه‌نویسی و رایانه‌ای - امیرمسعود ایرانی

نکات برنامه‌نویسی

نکات برنامه‌نویسی و رایانه‌ای - امیرمسعود ایرانی

۹ مطلب با موضوع «پایگاه داده» ثبت شده است

مرتب سازی بر اساس فیلد تاریخ جدول وابستگی چندریختی در لاراول

امیرمسعود ایرانی | شنبه, ۲۶ تیر ۱۳۹۵، ۰۴:۴۴ ب.ظ | ۰ نظر

وابستگی‌های چند ریختی( Polymorphic Relation ) در سیستم‌های ORM نوعی از ارتباط میان دو جدول هستند که تعداد نامحدودی از ردیف‌های جدول دوم به تعداد نامحدودی از ردیف‌های جدول اول مرتبط می‌شوند.

برای مثال تعداد نامحدودی از دانش‌آموزان هر یک می‌توانند در تعداد نامحدودی از کلاس‌ها ثبت نام کنند.

نگهداری ارتباط میان این دو جدول در ساختار پایگاه داده رابطه‌ای( Relational Database ) در یک جدول واسط امکان‌پذیر است.

در لاراول این ارتباط با استفاده از دستور belongsToMany ایجاد و مورد استفاده قرار می‌گیرد.

برای مثال تعریف دسترسی به دانش‌آموزانی که در یک کلاس ثبت نام کرده‌اند به شکل زیر در مدل کدنویسی می‌شود:

public function Users() {
return $this->belongsToMany( 'User', 'user_lessons', 'lesson_id', 'user_id' );
}
در هنگام استفاده از کد بالا، لازم است که یک جدول واسط با نام user_lessons حاوی دو فیلد lesson_id و user_id تعریف کنیم.

لاراول به صورت پیش‌فرض، تنها فیلدهای شناسه، و این دو فیلد را مقداردهی می‌کند و فیلدهای اضافی مانند فیلد تاریخ در این جدول پر نمی‌شوند.
برای دانستن زمان ثبت نام هر کاربر در هر کلاس، لاراول این امکان را به ما می‌دهد که با تغییراتی در مدل، تاریخ ایجاد و آخرین به‌روزرسانی را نیز در این جدول ثبت کنیم:
public function Users() {
return $this->belongsToMany( 'User', 'user_lessons', 'lesson_id', 'user_id' )->withTimestamps();
}
اضافه شدن دستور withTimestamps به انتهای belongsToMany به لاراول می‌گوید که در هنگام ایجاد ارتباط، تاریخ‌های ثبت و به روزرسانی را نیز مانند سایر جدول‌ها به این ارتباط پیوست کند.

استفاده از فیلدهای تاریخ در هنگام خواندن مقادیر

فیلدهای تاریخ ذخیره شده در این جدول واسط در هنگام مرتب‌سازی و خواندن اطلاعات به صورت زیر در دسترس خواهند بود:

$users = $class->Users()->latest( 'pivot_created_at' )->get();

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

  • امیرمسعود ایرانی

فهرست کامل شهرها و استان‌های ایران با قابلیت جستجو

امیرمسعود ایرانی | پنجشنبه, ۷ آبان ۱۳۹۴، ۰۶:۲۸ ب.ظ | ۰ نظر
یکی از نیازهای روزمره در هنگام برنامه‌نویسی، در اختیار داشتن اطلاعات مختلف است و یکی از متداول‌ترین داده‌های موجود، فهرست شهر‌ها و استان‌های ایران به تفکیک و با قابلیت جستجو است.
به دلیل فراگیر بودن این نیاز یک صفحه با امکانات ابتدایی جستجو و نمایش استان‌ها و شهرهای ایران آماده کردم که می‌توانید در نشانی زیر به آن دسترسی پیدا کنید.
این پایگاه داده می‌تواند برای جستجوگران عادی که تخصص برنامه‌نویسی هم ندارند مفید باشد.

فهرست شهر‌ها و استان‌های ایران - اینجا کلیک کنید
  • امیرمسعود ایرانی

ایندکس چند ستونی( Multi-Column Index ) در MySQL

امیرمسعود ایرانی | يكشنبه, ۲۰ ارديبهشت ۱۳۹۴، ۰۵:۴۰ ب.ظ | ۰ نظر

استفاده از ایندکس‌ها در پایگاه داده به دو منظور، جستجوی سریع و مرتب‌سازی سریع به انجام می‌رسد.

برای مثال اگر بخواهیم، در جدول کاربران، کاربری با شماره ملی 1234567890 را بیابیم، با ایندکس گذاری روی ستون کد ملی، این جستجو در زمانی بسیار کوتاه به نتیجه می‌رسد.

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

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


نوع دیگری از ایندکس‌ها، ایندکس‌های چند ستونی یا Multi-Column Index ها هستند.

این نوع ایندکس به صورت ترکیبی از چند ستون ساخته می‌شود. برای مثال «شماره ملی و معدل». یا «شناسه و نام خانوادگی».

مورد استفاده از ایندکس‌های چند ستونی هنگامی است که بخواهیم، اطلاعات را از پایگاه داده با شرط‌های ترکیبی بازخوانی کنیم. برای مثال تمام کاربرانی که سال تولدشان کمتر از ۱۳۸۰ است و معدلشان بیش از ۱۹ است.

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

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

این مزیت هنگامی است که تنها اطلاعات موجود در ایندکس چند ستونی را SELECT کنیم.

برای مثال، جستجو برای دانش‌آموزانی که سال تولد ۱۳۸۰ دارند و SELECT کردن تنها ستون معدل آن‌ها، با سرعت بسیار زیاد به انجام می‌رسد. زیرا نیازی به مراجعه به دیسک سخت برای پیدا کردن تک تک ردیف‌های دارای شرط نیست و اطلاعات مورد نیاز قبلا در ایندکس موجود است

  • امیرمسعود ایرانی

حذف Binary Log در MySQL

امیرمسعود ایرانی | يكشنبه, ۶ ارديبهشت ۱۳۹۴، ۱۱:۴۶ ب.ظ | ۰ نظر

Binary Log چیست؟

Binary Log در MySQL فایل‌هایی هستند که تاریخچه‌ای از تمام تغییرات صورت گرفته روی بانک اطلاعاتی را در خود نگهداری می‌کنند. این تغییرات می‌تواند در هنگام استفاده از سرورهای موازی برای همزمان سازی مورد استفاده قرار بگیرد. همچنین برای بازیابی و تعمیر بانک اطلاعاتی، وجود این تاریخچه بسیار مفید است.

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

فایل‌های Binary Log با نام‌هایی شبیه mysql-bin.000001 در کنار فایل‌های اطلاعاتی MySQL ذخیره می‌شود.

حذف Binary Log

برای حذف این فایل‌ها می‌توان از نگارش CLI یا خط فرمان MySQL کمک گرفت

برای این منظور به محیط خط فرمان مراجعه کنید و دستورات زیر را اجرا نمایید.

C:\.....> mysql --user=root --password=
mysql> reset master;
mysql> exit
خط نخست در قطعه کد بالا، نگارش خط فرمان mysql را با نام کاربری و رمز پیش‌فرض اجرا می‌کند
در خط دوم که محیط اجرای دستورات mysql است، وضعیت Master Replication یا پایگاه داده مرکزی را به حالت خام برمی‌گردانیم و در نتیجه فایل‌های Binary Log حذف خواهند شد.

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

تهیه پشتیبان از فایل‌های پروژه با استفاده از 7Zip و MySQLDump

امیرمسعود ایرانی | چهارشنبه, ۱۲ فروردين ۱۳۹۴، ۰۲:۰۲ ق.ظ | ۰ نظر

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

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

برای افزایش سرعت و دقت، می‌توان از Batch File برای مکانیزه کردن فرآیند فشرده‌سازی فایل‌ها و پایگاه داده استفاده کرد.

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

@echo off
SET PATH=C:\wamp\bin\mysql\mysql5.6.12\bin\;C:\Program Files\7-Zip\
mysqldump.exe --skip-comments -u root azmoon > azmoon\db.sql
del "F:\Project\azmoon\www.7z"
7z a -x!azmoon\laravel\vendor -mx=9 "F:\Project\azmoon\www.7z" azmoon
pause
برای استفاده از اسکریپت بالا می‌بایست کدهای آن را در یک فایل bat در شاخه‌ی بالایی پروژه ذخیره کنید و پس از انجام تغییرات لازم در مسیرهای مشخص شده، آن را اجرا تا یک کپی از فایل‌های پروژه و بانک اطلاعاتی را در یک فایل فشرده در اختیار داشته باشید.

در ادامه به اختصار کارهای انجام شده را توضیح می‌دهم:
دستور echo off سبب می‌شود، دستورات اجرا شده در محیط خط فرمان چاپ نشوند و تنها خروجی به نمایش در آید.
دستور set path مسیرهای مقابل خود را در فهرست شاخه‌های عمومی درج می‌کند تا چنانچه بخواهیم یکی از فایل‌های موجود در این شاخه‌ها را اجرا کنیم، نیاز به تایپ مسیر کامل آن‌ها نباشد.
دستور mysqldump برای تهیه‌ی پشتیبان از یک پایگاه داده استفاده می‌شود. در این دستور از پایگاه داده‌ی azmoon با نام db.sql پشتیبان تهیه می‌کنیم.
دستور del برای حذف آخرین پشتیبان تهیه شده که در مسیر مقابل آن مشخص است به کار می‌رود.
دستور 7z نگارش خط فرمان نرم‌افزار 7Zip است که برای فشرده‌سازی مورد استفاده قرار گرفته است. در این دستور، ابتدا شاخه‌ی vendor را که حاوی کتابخانه‌های دانلود شده از اینترنت است و حاوی تعداد زیادی فایل است از نسخه‌ی پشتیبان استثنا می‌کنیم. سپس قدرت فشرده‌سازی را به حداکثر ممکن می‌رسانیم. و در پایان مسیر فایل پشتیبان که باید ساخته شود و شاخه‌ی فایل‌های پروژه را تعیین می‌کنیم.

با اجرا این دستور، پروژه و اسکریپت پایگاه داده در زمانی بسیار کوتاه به یک فایل فشرده تبدیل می‌شود.

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

درج حجم اطلاعات زیاد در جدول کاربران لاراول

امیرمسعود ایرانی | دوشنبه, ۲۷ بهمن ۱۳۹۳، ۰۵:۱۶ ب.ظ | ۰ نظر

یکی از شیوه‌های امنیتی برای حفاظت از اطلاعات شخصی کاربران، نگهداری رمزهای آنان به صورت کدشده است. در گذشته الگوریتم‌هایی مانند md5 و sha1 برای این منظور استفاده می‌شدند.

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

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

دستیابی به این امنیت بالا، معایبی نیز در کنار خود دارد. یکی از این معایب، هنگامی است که می‌خواهیم، فهرستی طولانی از کاربران را در بانک اطلاعاتی ذخیره کنید و رمزهای هر کاربر را نیز با استفاده از الگوریتم سنگین Bcrypt کدگذاری یا Hash کنیم.

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

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

برای حل مشکل بالا، در هنگام رمزگزاری گذرواژه‌ها، به جای استفاده از الگوریتم Bcrypt از الگوریتم قدیمی sha1 که سرعت زیادی دارد و نسبت به md5 نیز امنیت بیشتری برای ما فراهم می‌کند استفاده می‌کنیم.

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

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

با این روش، بار سنگین پردازش Bcrypt به اولین ورود کاربر موکول می‌شود.

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

  • امیرمسعود ایرانی

SQL Server Native Client چیست

امیرمسعود ایرانی | يكشنبه, ۱۹ مرداد ۱۳۹۳، ۱۲:۱۴ ب.ظ | ۰ نظر
SQL Server Native Client یک کتابخانه‌ی برنامه‌نویسی است که کار ارتباط نرم‌افزارها با پایگاه داده‌ی Microsoft SQL Server را برقرار می‌کند.
این ابزار روش‌های ارتباطی مختلف از جمله ODBC، OLE DB و ADO را پشتیبانی می‌کند.
با استفاده از این ابزار ارتباط با SQL Server نصب شده در شبکه و سیستم محلی به آسانی امکان‌پذیر خواهد بود.
بسیاری از نرم‌افزارها برای ارتباط با پایگاه داده از این کتابخانه استفاده می‌کنند و لازم است تا پیش از استفاده این کتابخانه روی سیستم استفاده کننده نصب شده باشد.
برای استفاده از SQL Native Client نیازی به نصب محلی SQL Server وجود ندارد. پایگاه داده می‌تواند روی سرور دیگری که دسترسی شبکه‌ای به آن فراهم است، نصب شود
مزیت استفاده از SQL Server Native Client نسبت به روش‌های دیگر این است که این کتابخانه از آخرین فناوری‌های استفاده شده در SQL Server پشتیبانی می‌کند. فناوری‌های مانند XML Data Type که با روش‌های دیگر ارتباطی قابل استفاده نیستند.
بسته به محیط برنامه‌نویسی ممکن است ابزارهای بهتری نیز وجود داشته باشند. برای مثال در محیط Microsoft .NET Framework  کتابخانه‌ی Data Provider for SQL Server در اختیار شما است که روش‌های آسان‌تری را برای ذخیره و بازیابی اطلاعات فراهم می‌کند.

برای دریافت آخرین نگارش SQL Native Client به این صفحه مراجعه کنید
بسته به نگارش SQL Server که استفاده می‌کنید ممکن است به نگارش‌های مختلفی از SQL Native Client نیز نیاز داشته باشید
  • امیرمسعود ایرانی

تغییر رمز کارمندان در پرستاشاپ

امیرمسعود ایرانی | شنبه, ۱۱ مرداد ۱۳۹۳، ۱۱:۱۵ ق.ظ | ۰ نظر
به هر دلیل ممکن است رمز دسترسی به بخش مدیریت پرستاشاپ را فراموش کنید و بخواهید از طریق بانک اطلاعاتی این رمز را تغییر دهید
برای این کار کافی است مراحل زیر را دنبال کنید:

۱- به phpMyadmin مراجعه کنید و بانک اطلاعاتی پرستاشاپ را باز کنید.
۲- جدول employee را باز کنید و ردیفی که مربوط به نام کاربری شماست بیابید.
۳- فایل settings.php که در شاخه‌ی config واقع شده است را بیابید و آن را باز کنید.
۴- به دنبال تنظیم _COOKIE_KEY_ بگردید و کد مقابل آن را نگهداری کنید.
این کد عبارتی شبیه XdkFxEueNLgfjLZM8vhqNrGgvQWhKCRxZ0WKRQIS69LMYQkIrVKohFTJ است
۵- یک نرم‌افزار یا سایت آنلاین برای ایجاد کدهای md5 بیابید. مثلا این سایت یا این سایت.
۶- کدی که در مرحله‌ی ۴ نگهداری کردید در یکی از سایت‌های بالا درج کنید و در انتهای آن رمز دلخواه خود را بنویسید
برای مثال XdkFxEueNLgfjLZM8vhqNrGgvQWhKCRxZ0WKRQIS69LMYQkIrVKohFToooamibooo.
در عبارت بالا رمز ما عبارت oooamibooo می‌باشد.
۷- کد md5 عبارت بالا را ایجاد کنید و آن را نگهداری کنید.
۸- کد ایجاد شده را در ستون passwd جدول employee جایگزین کنید.
۹- تمام

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

تفاوت utf8_unicode_ci و utf8_general_ci و utf8_persian_ci در MySQL

امیرمسعود ایرانی | دوشنبه, ۷ بهمن ۱۳۹۲، ۱۲:۲۳ ق.ظ | ۳ نظر

در هنگام ایجاد پایگاه داده، جدول‌ها و ستون‌های رشته‌ای در MySQL امکان تغییر دادن Collation پیش‌فرض وجود دارد

برای ذخیره‌سازی نوشته‌های یونیکد و از آن جمله فارسی، لازم است تا یکی از زیرمجموعه‌های utf8 انتخاب شود

تفاوت سه گزینه‌ی utf8_unicode_ci و utf8_general_ci و utf8_persian_ci در الگوریتم مرتب‌سازی آن‌هاست که می‌تواند اندکی در عملکرد و کارایی اثرگذار باشد


اگر می‌خواهید متن‌های فارسی را در فیلد خود ذخیره کنید، بهترین گزینه، utf8_persian_ci است که با بیشترین سرعت ممکن و بهترین دقت متن‌های فارسی را به درستی مرتب می‌کند

اگر فیلد شما حاوی متن‌های چندزبانه باشد انتخاب یکی از گزینه‌های utf8_general_ci و utf8_unicode_ci شما را به هدف می‌رساند

utf8_general_ci تفاوت اندکی با utf8_unicode_ci دارد و آن این است که بخشی از الگوریتم‌های یونیکد در آن پیاده نشده است و ممکن است در هنگام مرتب‌سازی برخی زبان‌ها اشتباهاتی در آن مشاهده شود. در عوض کارایی آن بهتر است


با توجه به افزایش قدرت پردازنده‌های امروزی، افزایش کارایی اندکی که با استفاده از utf8_general_ci به دست می‌آید قابل چشم‌پوشی است و بهتر است همیشه از utf8_unicode_ci استفاده کنید


منبع

  • امیرمسعود ایرانی