بهینه سازی MySQL روی لینوکس

اشاره : این یک متن نیمه فنی است درباره بهینه کردن یک سرور MySQL روی لینوکس. مخاطب عمومی ندارد هرچند که خواندن اش بی مزه هم نیست (:

در حین کار رسیدم به جایی که باید روی بانک اطلاعاتی ای با حدود چهار میلیون رکورد حدود صد و شصت هزاربار جستجو و نتایج را ذخیره می کردم. برنامه مورد نظر را نوشتم و کار را شروع کردم. بعد از یکساعت تخمین زمانی اتمام کار حدود ۳۴ روز بود !

برنامه را اصلاح و بهینه کردم و بعد از اجرای دوباره تخمین اتمام کار حدود ۳۱ روز شد !

برنامه را MultiThreatMultiThreatd نوشتم (تقریبا به این معنا که برنامه می تواند به شکل موازی چندین بار اجرا شود) و اجرا کردم ولی زمان اتمام کار همان ۳۱ روز ماند ):

به کامپیوتر نگاه کردم و دیدم چراغ هارد یک نفس روشن است یعنی کل جستجو دارد از روی هارد انجام می شود. Bottle Neck پیدا شد: سرعت هارد. سعی کردم بانک اطلاعاتی چهارصد مگی را روی حافظه ببرم. اینترنت را به دنبال mysql optimization گشتم و در نهایت برای اینکار در فایل /etc/my.cnf دو خط زیر را اضافه کردم:

</pre>
[mysqld]

key_buffer_size=300M
read_buffer_size=300M
</pre >

و سرویس بانک اطلاعاتی را restart‌ کردم و برنامه را اجرا. سرعت بیشتر نشده بود ولی با نگاه کردن به /proc/meminfo می شد دید که بانک اطلاعاتی به حافظه منتقل شده است ولی به دلیل کمبود حافظه کماکان هارد به عنوان swap‌ کار می کند.

در مرحله بعد از مدیرم خواستم حافظه کامپیوترم را به 2GB ارتقاء بدهد. بعد از انجام این کار دوباره برنامه اولیه را اجرا کردم و به چراغ های کامپیوتر نگاه کردم. چراغ هارد برای چند ثانیه روشن بود و بعد کلا خاموش شد (همه بانک اطلاعاتی به رم منتقل شده بود). زمان متوسط اجرا رسید به چهار روز. حالا برنامه بهینه شده سه روز وقت می گرفت و نسخه multithread فقط یک و نیم روز. حالا برنامه در حال اجرا است.

پنج روش برای شروع عالی یک پست وبلاگی + یک جایزه

مهمترین چیز بعد از عنوان در یک پست چیست ؟

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

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

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

۱. یک سوال مطرح کنید

شروع با یک سوال مجذوب کننده همیشه مفید است. این سوال باید خواننده را نسبت به موضوعی کنجکاو کند و او را مجبور به فکر کردن کند. فکر کردن باعث می شود مخاطب با نوشته شما نزدیکی احساس کند و این بهترین چیز برای یک نویسنده است. پرسیدن اینکه «می دونین امروز چیکار کردم ؟» ممکن است افراد را جذب کند ولی آن ها را مجبور به فکر نمی کند ولی پرسیدن «مهمترین چیز بعد از عنوان در یک پست چیست ؟» باعث می شود خواننده خواندن متن را ادامه بدهد.

۲. یک مثل یا نقل قول بیاورید

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

۳. در ذهن خواننده تصویر بسازید

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

۴. از تمثیل ها، استعاره ها و ضرب المثل ها استفاده کنید

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

۵. یک آمار تکان دهنده بیاورید

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

نکته جایزه

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

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

ترجمه نسبتا آزاد از: Five simple ways to open your blog post with a bang

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

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

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


1 _ 8 _ _ _ _ _
_ 7 _ 1 4 5 _ _ 3 _ _ _ _ _ _ 9 6
_ _ _ _ 2 _ _ 9
_ 2 _ _ _ 8 _ _ 5 _ _ 7 _ _ _ _ _ 7 6 _ _ _ _ _ _ 8
_ 3 6 2 _ 7 _ _
_ _ _ _ 9 _ 6 _

و خروجی چیزی شبیه شکل زیر:

سورس برنامه حل کننده سودوکو را از اینجا برداشتم.

9 نکته که هر وبلاگنویسی باید بداند

این متن برداشتی است از 9 Things every blogger should understand.

  1. هر خواننده ای نظر منحصر به فرد خود را دارد.. و همه این نظرات هم قابل احترام هستند. همیشه به یاد داشته باشید که تعدادی از افراد با شما موافق خواهند بود و تعدادی مخالف. سعی کنید صحبت متقابل را تقویت کنید و اگر روزی همه موافق شما بودند بدانید که وبلاگ ناموفقی دارید که فقط دوستان و همفکرانتان آن را می خوانند.
  2. فرستادن مطلبی که دیگران آن را می فرستند، وبلاگ شما را بی ارزش می کند. ساده هم هست: وقتی کسی می تواند مطلبی را سریعتر از منبع اصلی بخواند، چه نیازی دارد که بیاید و آن را دست دوم در وبلاگ شما بخواند ؟ با اینکار به دیگران می گویید که خودتان مطلب قابل ارايه ای ندارید و لازم نیست به وبلاگ شما سر بزنند
  3. فرستادن مطلب اختصاصی خودتان، شما را مطرح می کند. مثل مورد قبل. اگر شما خودتان مطالب دست اول تولید کنند، آدم ها برای خواندن آن به وبلاگ شما خواهند آمد.
  4. مطالب بحث برانگیز شما بهتر است توسط مخالفان خوانده شوند تا موافقان. داشتن کامنت های «من هم همینطور» و «آقا ایول» یا «خیلی حال کردم خانومی» حوصله سر بر و بی فایده است. وقتی کسی مخالف شما کامنت گذاشت به این معنی است که یک نفر را مجبور به فکر کرده اید.
  5. درصد بسیار کمی از خوانندگان کامنت می گذارند. به جز حالتی که کلی کامنت «آقا ایول» و «به من هم سر بزن» داشته باشید باید بدانید که درصد کمی از افراد هستند که پس از خواندن یک مطلب جدی کامنت بگذارند. اگر برای داشتن کامنت و دوست جدید می نویسید، بروید سراغ مطالبی مثل «آه امروز چقدر دلم گرفته بود»
  6. شمارنده های بازدید کننده ها معنای چندانی ندارند. اگر علاقمند هستید وبلاگتان تاثیر گذار باشد، توجه زیادی به شمارنده صفحات نداشته باشید. شمارنده صفحات قابل تفسیرهای گوناگون هستند و داشتن یک مطلب حاوی عکس فلانی در پارتی فلان سال و کسب عدد ده هزار هیچ معنای خاصی ندارد. برای مفید بودن باید برای مخاطب خاص بنویسید.
  7. ترافیکتان را تحلیل کنید. استفاده از ابزارهای تحلیل ترافیک را یاد بگیرید و از آن ها استفاده کنید. بدانید که خوانندگان شما چه کسانی هستند و به چه چیزهایی دقت می کنند. با کسانی که برای شما ترافیک می فرستند مهربان باشید و سعی کنید با فرستادن ترافیک، دیگران را تشویق به مهربانی کنید. روند حرکت وبلاگ خود را زیر نظر داشته باشید
  8. کامنت گذاران تکراری را بشناسید. در وبلاگ ها همیشه یکسری افراد هستند که دایما برای مطالب مختلف کامنت می گذاارند. آن ها را بشناسید. اینها خوانندگان دایمی شما هستند که می خواهند شما بدانید خواننده دایمی شما هستند. اگر مثلا استاد دانشگاه یا معلم مدرسه باشید این مساله بیشتر و بیشتر نمود دارد.
  9. به سرویس دهنده وبلاگ خود حساس باشید. نمی گویم همه باید دومین و هاست خود را داشته باشند ولی استفاده از سرویس دهنده های وبلاگ باعث می شود گاهی کنترل شما روی چیزها کم باشد، از طرف دیگر مسوولیت پشتیبانی و دردسرهای فنی بر گردن شما نیست اما کسی هم در مقابل مشکلات پاسخگو نیست. سعی کنید با یک آدم فنی درباره انتقال وبلاگ خود به هاست و دومین شخصی مشورت کنید.

سودوکو را بدون لحظه ای فکر حل کنید

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

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

قدم اول – شروع برای شروع به یک جدول سودوکو و یک مداد و یک پاک کن احتیاج دارید.

1

قدم دوم – خانه های خالی را پر کنید شکی نیست که هر خانه ای باید با یکی از اعداد ۱ تا نه پر شود. پس در هر خانه خالی به ترتیبی که می بینید اعداد یک تا نه را بنویسید.

2

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

3

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

4

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

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

6

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

7

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

8

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

9

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

10

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

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

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