پیدا کردن یک عبارت در فایل در لینوکس

فرض کنید صدها و یا هزاران فایل داریم (مثلا به زبان php یا هر زبان دیگری) و می خواهیم بدانیم فلان عبارت در کدام فایل استفاده شده است. مشابه عملکرد search in file که در ادیتورهایی همچون sublime موجود است. برای اینکار از دستور grep در لینوکس استفاده می کنیم که به صورت زیر است؛

grep -ril "Media_Model_Library" .

اگر عبارت شما به صورت یک خط کد باشد نیز به اینصورت عمل می کنیم؛

grep -ril '$(\'.push_datetimepicker\'\).datetimepicker\({' .

ذخیره تاریخ در دیتابیس

۱۹ ژانویه ۲۰۳۸ چه روزی است؟!
حتما از خودتان می پرسید این تاریخ چیست و چه ارتباطی با عنوان این متن دارد، عجله نکنید، ادامه متن را بخونید.
در حال حاضر در زبان برنامه نویسی php و بسیاری زبان های دیگه، راه های مختلفی برای ذخیره تاریخ (date) در دیتابیس وجود داره، اما یکی از راه های بسیار رایج برای اینکار که توسط رفرنس های بسیاری مورد تایید هست و سفارش شده، ذخیره تاریخ به صورت timestamp در دیتابیس هست.

timestamp چیست؟
unix timestamp یا به اختصار timestamp یک پروتکل (قراردادی) است که تعداد ثانیه هایی که از تاریخ ۱ ژانویه ۱۹۷۰ ساعت ۱۲ بامداد (به وقت GMT) تا هر لحظه را نشان می دهد. به عنوان مثال در لحظه نگارش این جمله، timestamp برابر است با ۱۵۰۱۵۰۱۲۲۸ . (محاسبه توسط این سایت)
در زبان php و بسیاری دیگر از زبان های برنامه نویسی نحوه دسترسی به timestamp توسط تابع time() امکان پذیر است.

چرا timestamp را ذخیره کنیم؟
فکر کنید یک برنامه داریم که می خواهیم تاریخی مهم را در دیتابیس ذخیره کنیم. همانطور که می دانید راه های زیادی برای ذخیره تاریخ در دیتابیس وجود دارد، از جمله ذخیره تاریخ به فرمت Y-m-d و… اما همواره یکی از بهترین راه ها برای ذخیره تاریخ در دیتابیس، ذخیره نمودن timestamp می باشد. چرا که توسط آن می توانیم عملیات ریاضی را به راحتی روی آن انجام دهیم، به سادگی آن را به تقویم های دیگر تبدیل کنیم و یا حتی آن را به time zone های دیگر تبدیل کرد و با همین یک عدد می توان به روز و ماه و سال و ساعت و دقیقه و ثانیه و فصل و روز هفته و شماره هفته از سال و… پی برد.

خب حالا برگردیم سر بحث خودمون. به شخصه برای ذخیره timestamp از نوع داده ای integer برای فیلد مورد نظر استفاده می کنم. این مورد را در بسیاری از کتاب ها و رفرنس ها و سیستم ها دیدم. اما یک نکته…
برگردیم چند خط بالاتر و به timestamp اون لحظه ای که اشاره کردم دقت بفرمایید. یک عدد ۱۰ رقمی، timestamp امروز (۳۱ جولای ۲۰۱۷) را تشکیل میده. از طرفی حداکثر مقدار در نوع داده ای integer برابر با ۲,۱۴۷,۴۸۳,۶۴۷ هست. (اطلاعات بیشتر)
حالا کافیه توسط همون سایتی که بالاتر معرفی شد این عدد را وارد کنیم تا برامون تبدیل به تاریخ کنه. بله؛ ۱۹ ژانویه ۲۰۳۸ ساعت ۰۶:۴۴:۰۷ (۶ صبح) به وقت ایران. یعنی از اون لحظه به بعد، دیگه timestamp در نوع داده ای integer گنجانده نمیشه و ممکنه باعث کرش کردن برنامه و اختلال در بسیاری از سیستم های چه بسا مهم (نظامی، مالی، مخابراتی و …) بشه. (به اصطلاح سرریز بافر رخ میده) حالا شاید بپرسید چاره چیه؟! یکی از راه ها اینه که برای نوع داده فیلد مورد نظر از نوع داده bigint استفاده بشه که حداکثر مقدار اون برابر با ۹۲۲۳۳۷۲۰۳۶۸۵۴۷۷۵۸۰۷ هست، یعنی شما حداقل خیالتون بابت برنامتون در هزاره سوم راحته 😉

به پایان نگارش پست رسیده بودم که با خودم گفتم یعنی اینو من کشف کردم و کسی قبل از من به این مسئله پی نبرده بود؟! رفتم گوگل و این عبارت را جستجو کردم: ۱۹ january 2038

بله همونطور که حدس میزدم این مسئله پیش از من توسط عُلما کشف شده بود 🙂 (به این لینک مراجعه شود)

گرفتن رکورد قبلی و بعدی در MySQL

فرض کنید هم اکنون در رکورد ۴ هستیم.

$id = 4;

حالا رکورد قبلی و بعدیش را میخوایم.

برای گرفتن رکورد قبلی از دستور زیر:

SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table WHERE id < $id)

و برای گرفتن رکورد بعدی از دستور زیر:

SELECT * FROM table WHERE id = (SELECT MIN(id) FROM table WHERE id > $id)

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