چاپ سطر جدید روی آخرین سطر چاپ شده

اگه با ترمینال سروکار داشته باشید حتما برنامه‌هایی رو دیدی که خروجی رو بصورت یک سطر ولی پویا به کاربر نشون میدن. برای مثال curl، axel و … خروجی رو توی یک سطر نمایش ‌میدن. ولی سوال اینجاست که چجوری؟
پیش از اینکه بریم سراغ چگونه انجام دادن این کار اجازه بدید سوالی رو مطرح کنم. تا حالا شده بخواید یک فایل متنی رو توی برنامه خودتون بخونید سطر به سطر جدا کنید ولی استفاده از \n مشکلتون رو حل نکرده باشه و بعد از جستجو یا دانسته‌های قبلی \r رو هم استفاده بکنید؟ (البته من اینجا کاری ندارم که این کی پیش میاد و چرا ولی اگه با ویندوز کار کرده باشید احتمال زیاد با این مشکل روبرو شدید)
خب اگه این اتفاق براتون افتاده یا می‌دونید که \rچیکار می‌کنه شما خودتون قبلا راه حل سوال اولمون (اینکه چجوری میشه یک سطر رو پاک و چاپ کرد) رو بلدید.

ادامه را بخوانید

مهاجرت از دروپال 6 به hexo

24 فوریه 2016 میلادی ( 5 اسفند 1393 خورشیدی) دروپال6 به پایان راه خود رسید و تیم توسعه دهنده بطور رسمی اتمام پروژه دروپال6 رو اعلام کرد.1
این دلیلی شد تا بخوام بلاگم رو از دروپال 6 منتقل کنم به جای دیگه، خب در نهایت Hexo رو انتخاب کردم، یک سایت‌ساز ایستا که با nodejs نوشته شده. اسباب کشی به Hexo کمی چالش برانگیز و جذاب بود. اینجا قصد دارم این اسباب کشی رو شرح بدم.

ادامه را بخوانید

خواندن فایل باینری در R

اگر فایل باینری داشته باشیم و بخوایم اون رو توی R بخونیم و استفاده کنیم، چطور باید عمل کنیم؟ در قدم اول باید بدونیم که ساختار فایل باینری به چه شکل است.
در مورد فایل خودم، این فایل با کد C++ ایجاد شده و حاوی ساختاری خاص برای ذخیره سازی مدل ایجاد شده از یک Matrix Factorization است.
به این صورت که چهاربایت اول فایل یک Integer چهار بایت دوم و سوم و … هفتم float و …

ادامه را بخوانید

نصب و راه اندازی ftp سرور روی CentOS

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

ادامه را بخوانید

انتقال اطلاعات از یک جدول به جدولی دیگر بصورت دوره‌ای

یکی از پروژه‌هایی که من روش کار می‌کنم دارای جدولی است که درحال حاضر بطور متوسط هر ثانیه یک سطر به اون اضافه میشه، این جدول علاوه بر چندین ستون، چند تا INDEX هم داره که این باعث میشه، هزینه INSERT یک سطر بالا باشه، برای همین من یک جدول میانی درست کردم که هیچ INDEXای روش نداره و هر ۱۰ دقیقه یکبار سطرهای این جدول میانی رو به جدول اصلی انتقال میدم، اینجوری سربار ساختن ایندکس‌ها موقع INSERT اولیه برداشته میشه. (البته در نظر داشته باشید چون دقیق بودن جدول اصلی در لحظه اهمیت بالایی نداره، ما میتونیم همچین کاری انجام بدیم)

ادامه را بخوانید

رزم آخر: یک سوال ساده

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


ادامه را بخوانید

بلاک رفرالهای اسپم در nginx

امروز همکارم بهم گفت که این سایت buttons-for-website.com چیه که توی آمار referer سایت رتبه بالایی رو داره. در حقیقت این سایت‌ها اسپم هستند، اسپم از نوع referer. قضیه خیلی ساده است یک کسی یکسری درخواست جعلی با یک referer جعلی به سرور شما ارسال میکنه و شما فکر می‌کنید که یک بازدید کننده سایت شما رو بازدید کرده درصورتی که اصلا بازدید کننده ای در کار نبوده و یک ربات وارد سایت شما شده، با یک referer جعلی، تنها تصوری که من از هدف این اسپم‌ها دارم تبلیغاتی بودن اون‌هاست. اینکه هرجا که قرار باشه رفررهای سرور شما دیده بشه، این سایت‌ها هم نشون داده میشن. البته ممکنه دلایل دیگر زیادی هم داشته باشه که حداقل من از اون‌ها بی‌خبر هستم.
راه حل مناسب برای مقابله با این اسپم‌ها بلاک کردن درخواست‌هایی هستند که referer جعلی دارند. جعلی یعنی همون سایت‌های شناخت شده‌ای که قبلا دیده شدند، چون هیچ راهی برای تشخیص جعلی بودن یا نبودن یک درخواست وجود نداره.

اول باید به سراغ فایل /etc/nginx/nginx.conf بریم و درون بلوک http کد زیر رو وارد کنیم


1
2
3
4
5
6
7
8
##
# Referer spam
##
map $http_referer $bad_referer {
default 0;
"~*buttons-for-website.com" 1;
}

با استفاده از دستور map قصد داریم متغییر جدید به نام $bad_referer ایجاد کنیم تا بتونیم بدها رو از خوب‌ها تشخیص بدیم.
همانطور که در کد اضافه شده می‌بینیم بصورت پیش‌فرض $bad_referer برابر مقدار 0 یا همون false هست و فقط در صورتی که $http_referer با سایت مورد نظر ما مطابقت داشته باشه این مقدار 1 یا true میشه. همیچنین دو کاراکتر ~* قبل از اسم سایت نشان‌دهنده عدم حساسیت به حروف بزرگ و کوچک است.
توجه داشته باشید که دستور map تنها درون بلوک http قابل استفاده است.
تنها کافیه سری به تنظیمات سایت خودمون بزنیم (فرض کنیم آدرس /etc/nginx/conf.d/default ) و درون بلوک server متغیرر $bad_referer رو چک کنیم در صورت لزوم درخواست رو بلاک کنیم.


1
2
3
if ($bad_referer) {
return 444;
}

توجه داشته باشید که نمیتونیم دستور if رو درون بلوک http بنویسیم و باید درون بلوک server نوشته بشه. همچنین کد 444 در nginx با این معنی است که هیچ خروجی‌ای به درخواست‌دهنده برگردونده نشه.
حال nginx خودمون رو ریستارت میکنیم و کار تموم. همیشه قبل از ریستارت با دستور nginx -t از صحت تنظیمات خود اطمینان حاصل کنید. هرچند در نسخه‌های جدید nginx خودش این کار رو انجام میده و در صورت وجود خطا سرور رو ریستارت نمیکنه.


1
service nginx restart

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


1
curl -e "http://www.buttons-for-website.com" "http://moror.ir"

خروجی این دستور:


1
curl: (52) Empty reply from server

تا اینجا کار تمومه و ما به هدف خودمون رسیدیم. فقط درصورتی که بخوایم لیست بزرگی از اسپم‌ها داشته باشیم میتونیم تنظیمات خودمون توی فایل /etc/nginx/nginx.conf رو کمی بهتر کنیم و یک فایل (bad_referer.map) بسازیم و سایت‌های بد بد مورد نظر خودمون رو توی این مشخص کنیم.
پس درون فایل /etc/nginx/nginx.conf اینچنین می‌نویسیم.


1
2
3
4
5
6
7
8
##
# Referer spam
##
map $http_referer $bad_referer {
default 0;
include /etc/nginx/bad_referer.map;
}

فایل /etc/nginx/bad_referer.map رو هم ساخته و سایت‌ها رو لیست می‌کنیم.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"~*floating-share-buttons.com" 1;
"~*event-tracking.com" 1;
"~*free-social-buttons.com" 1;
"~*100dollars-seo.com" 1;
"~*buttons-for-website.com" 1;
"~*videos-for-your-business.com" 1;
"~*get-free-traffic-now.com" 1;
"~*success-seo.com" 1;
"~*trafficmonetize.org" 1;
"~*4webmasters.org" 1;
"~*webmonetizer.net" 1;
"~*sitevaluation.org" 1;
"~*dailyrank.net" 1;
"~*rightrelevance.com" 1;
"~*best-seo-offer.com" 1;
"~*semaltmedia.com" 1;

Relay access denied 554 5.7.1

خیلی از وقت امروزم صرف این شد که بفهمم چرا smtp سرور کار نمیکنه و با telnet و SwiftMailer خطای Relay access denied میده، نکته جالب اینجا بود که با برنامه‌های جانبی مثل Mail توی مک براحتی ایمیل ارسال می‌شود ولی با SwiftMailer خطا می‌داد. بعد گشت و گذار طولانی و دست از پا دراز بودن بسیار، آنچه می‌نشود یافت شد. باید IP سرور و IPv6 لوکال هاست رو توی تنظیمات postfix وارد می‌کردم. یعنی توی فایل /etc/postfix/main.cf باید همچین سطری داشته باشیم.


1
mynetworks = 127.0.0.0/8, <Server IP>, [::1]/128

همین.

دانلود جاوا از سرور اورکل با wget

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


1
2
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" \
"http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jre-8u60-linux-x64.rpm"

چندی درمورد جوملا

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


نمایش آلرت/پیام


1
JFactory::getApplication()->enqueueMessage('Message sent', 'success');


برای نمایش پیغام خطا یا اخطار میتونیم بجای success مقدار error یا warning قرار بدیم

نمایش textarea بصورت ویرایش‌گر متن ckeditor


1
JFactory::getEditor()->display('field_name', 'Default_value', '600px', '220px', '75', '15', false);

ارتباط با پایگاه داده


1
2
3
4
$db = JFactory::getDbo();
$db->setQuery( "SELECT * FROM `#__tokens`" );
$row = $db->loadRowList();
print_r($row);

در کوئری بالا بخش #__ با پیشوند جداول پایگاه داد جایگذاری می‌شود.

دسترسی به پارامتر‌های ارسالی به سرور get و post


1
2
3
4
$input = JFactory::getApplication()->input;
$value = $input->get('key');
$postValue = $input->post->get('key', 'defaultvalue', 'filter');
$allPostValues = $input->post->getArray();