چه کارهای جالبی با گنو/لینوکس انجام می‌دهم : گراف لحظه ای مصرف پهنای باند

آخرین مطلب من برای شرکت در مسابقه چرا گنو/لینوکس را دوست دارم؟  یه پروژه کوچیک بر مبنای HTML5 هست برای کشیدن گراف لحظه ای مصرف پهنای باند :)

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

ایده این بود که یک نمایش دهنده لجظه ای میزان دانلود یا همون Realtime Bandwidth Grapher رو بسازیم و شروع کردیم جمع کردن مواد مورد نیاز!

برای کشیدن گراف این کتابخونه جاوااسکریپتیو پیدا کردیم که با کمک المان canvas موجود در HTML5 گراف مورد نظرو میکشه.

در حقیقت canvas طراحی شده تا با کمک یک زبان اسکریپتی مثل javascript در لحظه اشکال هندسی که شما میخواهیدو  نمایش بده.

برای قسمت ارتباط مداوم با سرور از تکنولوژی SSE ارايه شده در HTML5 بهره بردیم که در حقیقت به مرورگر وبمون این امکانو میده که طبق فواصل زمانی که سرور بهش میگه اطلاعات رو بدون رفرش کردن صفحه از سرور بگیره.

و برای سمت سرور هم از یه کد تلفیقی کوچیک php و bash به صورت زیر استفاده کردیم:

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

$interface = "ppp0";
$rec = system("ifconfig $interface | grep 'RX bytes' | sed -e 's,.*RX bytes:,,' -e 's, .*,,'");

echo "retry: 1000n";
echo "data:{$rec}nn";
flush();

در دو خط اول ما نوع و خاصیت اطلاعات ارسالی رو طبق مثال موجود در سایت w3schools مشخص میکنیم و بعد یه متغییر به نام interface رو تعریف میکنیم که قراره اسم اینترفیس ارتباطی با اینترنت رو نگه داره مثل eth0 یا wlan0 یا ppp0 و بعد از اون با کمک تابع system که به ما امکان اجرای برنامه های خارجی رو میده مقدار اطلاعات دریافتی در لحظه رو بدست میاریم.

در اخر هم با کمک retry میگیم که مرورگر ۱ ثانیه دیگه دوباره به ما سر بزنه و با کمک data اطلاعات بدست آمده رو به مرورگر میفرستیم، در ضمن به اون دو تا اینتر آخر ماجرا هم توجه کنید چون در حقیقت وجود اوناست که میگه آخر درخواست HTTP ماست.

خوب ما کارهای سمت سرور رو انجام دادیم، حالا نوبت ساختن صفحه سمت کاربر با کمک تکنولوژی هایی که پیدا کردیم :)

<!DOCTYPE html>
<html>
<header>
	<title>Bandwidth Realtime Graph</title>
	<script>
		//this varible set your shaper maxmimom KB
		var range=500;
	</script>
	<style>
		#container
		{
			margin:0px auto;
			width:960px;
			text-align:center;
			min-height:550px;
		}
		#footer
		{
			text-align:center;
		}
	</style>
</header>
<body>
<div id="container">
<h1>Bandwidth Realtime Graph</h1>
<div id="result" style="font-weight:bold; color:red;"></div>
<canvas id="rec_graph" height="200" width="930" style="font-size: 6pt;"></canvas>
</div>
<div id="footer">
	<a href="http://www.w3.org/html/logo/">
		<img src="HTML5_Logo_64.png" alt="HTML5" />
	</a>
</div>
<script type="text/javascript" src="graph.js"></script>
<script>
if(typeof(EventSource) !== "undefined") {
	var source = new EventSource("rec.php");
	var seconds = 1;
	source.onmessage = function(event)
	{
		var new_rec = event.data;
		if ( typeof(old_rec) != "undefined") {
			bytes = new_rec - old_rec;
			rate_rec = bytes * 8 / seconds / 1024;// kbps
			document.getElementById("result").innerHTML=
					 Math.round(rate_rec) + " Kbps";
		}
		old_rec = new_rec;
	};
} else {
	document.getElementById("result").innerHTML=
		"Sorry, your browser does not support server-sent events...";
}

window.onload = function() {
    g_graph = new Graph(
    {
        'id': "rec_graph",
        'strokeStyle': "#819C58",
        'fillStyle': "rgba(64,128,0,0.25)",
        'interval': 1000,
		'range': [0,range],
		'grid': [40,40],
		'showlabels': true,
        'call': function(){return (Math.round(rate_rec));}
    });
}
</script>

</body>
</html>

خوب کد های بالا بر طبق مستنداتی که قبلتر لینکاشونو در صفحه قرار دادیم نوشته شدن و فکر نمیکنم توضیح خط به خطش لازم باشه، فقط راجع به متغییر range یه توضیحی بدم اونم اینه که باید ماکسیموم کیلوبایت بر ثانیه که ممکنه از اینترفیس شما دانلود بشه توش نوشته بشه تا تمام نقاطی که کشیده میشن صحیح کشیده بشن، مثلا اگه سرعت اینترنتتون ۲۵۶ کیلوبایت بر ثانیه هست عدد ۳۰۰ معقول به نظر میرسه.

 

و در نهایت اینم از این پروژه، یه کار لذت بخش همراه با رفقایی که دوستشون داری :)

برای دانلود و یا تصحیح و تکمیل پروژه میتونید از لینک زیر استفاده کنید:

https://github.com/pesarkhobeee/Realtime-Bandwidth-Grapher

ساخت یک اینترفیس تحت وب برای کارهای سیستمی با php و python

مدتها پیش مقاله ای نوشته بودم در باب اجرای دستورات خط فرمان درphp تو اون اشاره کرده بودم که در php توابعی وجود داره که میشه دستورات سیستمی مثل ls,pwd,.. رو اجرا کرد .
اما امروز بر اون شدم که با راهنمایی های استادم، اقای مقدم یه رابط کاربری تحت وب برای کارهای سیستمی بسازم!
اول رفتم سراغ php که مثلا بلدمش!و از اونجایی که حسو حال ساختن فرم ورود اطلاعات رو نداشتم از سایت http://www.phpform.org استفاده کردم و یه اینترفیس برای یه دیوار اتش ساده ساختم به شکل زیر:

و بعد از اون امدم خروجی فرم بالا رو گرفتم و تبدیل کردم به دستور موردنظر با کمک آرایه های انجمنی:

ادامه خواندن ساخت یک اینترفیس تحت وب برای کارهای سیستمی با php و python

نقل و نبات شماره هفت (tips & tricks) ( sqlite )

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

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

به قول شاعر : فل فل نبین چه ریزه بشکن ببین چه تیزه :D

خلاصش فهمیدیم بهش میگن  sqlite ! به نقل از ویکی پدیا :

SQLite یک پایگاه داده کوچک (حجمی در حدود ۵۰۰ KB) که به زبان C در قالب یک کتابخانه (Library) نوشته شده است و از پایگاه داده‌های RDBMS به حساب می‌آید. این پایگاه داده بدون لیسانس (Public Domain) ، آزاد و open source منتشر می‌شود. مزیت: پایگاه داده‌ای تک فایلی با حجم کم و عدم وابستگی به سیستم عامل. دارای محیط مدیریتی خوب که تمامی امکانات آن را پوشش می‌دهند. تنها مشکل بزرگ عدم پشتیبانی از تمامی امکانات استاندارد sql هست که ضعف بزرگ اون محسوب می‌شود.

اگه بخواهید اطلاعات بیشتری رو بدست بیارید توصیه میکنم به این پست نوشته های یک برنامه نویس مراجعه کنید ولی یک قسمت از مطلب ایشون رو هم اینجا میارم:

ابزارهای توسعه

یکی از مهمترین مزیت های این پایگاه داده امکان استفاده آن در اکثر زبانهای برنامه نویسی است. برنامه های دسترسی به این پایگاه داده در اکثر زبانها نوشته شده است و در دسترس است. برای مشاهده ابزارهای دسترسی به این ادرس مراجعه کنید: http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers
مهمترین کتابخانه های رابط برای استفاده از SQLite

dotNET Framework: http://sqlite.phxsoftware.com/
dotNET Framework: http://www.mono-project.com/SQLite
Delphi: http://www.aducom.com/
Delpi: http://wikitaxi.org/delphi/doku.php/products/sqlite3/index
C++: http://www.sqliteplus.com/
Java: http://www.ch-werner.de/javasqlite
PHP: SQLite is bundled with PHP 5. http://www.php.net/
Python: http://pysqlite.org/

برای طراحی و ایجاد پایگاه داده SQLite می توانید از ابزارهای زیر استفاده کنید:
SQLite Manager: یک extension برای مرورگر فایرفاکس که با به سادگی امکان دسترسی به تمامی امکانات SQLite رو فراهم می کند. لینک: https://addons.mozilla.org/en-US/firefox/addon/5817

SQLite مورد مقبولیت فراوانی برای استفاده به عنوان یک دیتابیس Embeded قرار گرفته و در پروژه های زیر مورد استفاده قرار گرفته است:

  • FireFox – این مرورگر برای ذخیره اطلاعات خود از SQLite استفاده می کند.
  • Mac OS X – سیستم عامل شرکت Apple به صورت داخلی از SQLite به عنوان یک پایگاه داده استاندارد استفاده می کند.
  • Skype – این نرم افزار چت و گفت و گوی آنلاین که با مقبولیت خوبی روبروست از SQLite استفاده می کند.
  • Symbian – سیستم عامل گوشی های موبایل در نسخه های جدید خود از این پایگاه داده به صورت توکار استفاده می کند.
  • Android – سیستم عامل جدید گوگل برای موبایل
  • iPhone و iPod touch : در این دو دستگاه محصول Apple از این پایگاه داده استفاده شده است.
  • Google Gears – ابزار گوگل برای نوشتن برنامه های تحت وب با استفاده از تکنولوژی های مختلف روز.
  • معایب

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

  • سخن آخر

پایگاه داده SQLite یک ابزار کوچک سریع و مطمئن است که برای مقاصد خاص نوشته شده است. از این پایگاه داده می توانید برای سیستم های Embeded استفاده کنید. یا برای نزم افزار های کوچک و تک کاربره خود تا خود را از شر مشکلات انتشار پایگاه داده های بزرگ همراه نرم افزار خود دور بمانید.
همچنین این یک گزینه فوق العاده برای کسانی است که از access صرفا برای پایگاه داده خود استفاده می کنند.

  • منابع مفید

سایت اصلی: http://www.sqlite.org
دانلود نسخه اصلی: http://www.sqlite.org/download.html
ویژگی های حذف شده از SQL استاندارد: http://www.sqlite.org/omitted.html
ویژگی های پیاده سازی شده: http://www.sqlite.org/lang.html

اما نمیدونم چرا من تا مدتها سراغش نرفتم ! بهر حال قسمت شدو بلاخره در php هم یه سری بهش زدیمو دیدم دستوراتش تفاوت زیادی با اون چیزی که قبلا کار میکردیم نداره ! از اونجایی که این نوشته نقل و نباته و قرار نیس من زیاد توش توضیح بدم فقط مثالی رو که درست کردم اینجا درج میکنم ، باشد که باعث اشنایی دیگران با این تکنولوژی جالب بشه:

برای دانلود مثال اینجا را کلیک کنید

در پایان اگه بخوام یه منبع برای آموزش sqlite در php معرفی کنم مطمئنا سایت زتکد خواهد بود:

http://www.zetcode.com/databases/sqlitephptutorial

پ . ن : جدیدا به این نتیجه رسیدم خیلی غافل بودم طرف sqlite نرفتم اخه تو برنا مه های موبایل خیلی جاهای دیگه کارایی بالایی داره حتی تو برنامه بلاگیلو مهردادم استفاده میشه

پ . ن . ۲ :

مرا مهر سيه چشمان ز سر بيرون نخواهد شد        قضاي آسمان است اين و ديگرگون نخواهد شد
رقيب آزارها فرمود و جاي آشتي نگذاشت        مگر آه سحرخيزان سوي گردون نخواهد شد

پ . ن . ۳ : راستی این هفتمین نوشته نقل و نباته منه  و به نظر من هفت عدد خیلی باحالیه :D

پ . ن . ۴ : راستی یادم رفت این لینکم ببینید:(افزودنی‌های فایرفاکس)

SQLite Manager 0.5.14

نقل و نبات شماره شش (tips & tricks) ( اجرای دستورات خط فرمان در php )

خوب برای امروز ، قصد این رو دارم دو تا تابع فوق العاده در php رو معرفی کنم:

  • exec
  • system

من همیشه دلم میخواست بفهمم چه طور ما برنامه هایی داریم که اینترفیس تحت وب دارن ولی کارای سیستمی انجام میدن ! مثلا وقتی ما وارد مودمون میشم و nat و firewall رو تنظیم میکنیم مسلما از دستور iptable لینوکس استفاده میشه !

و آیا میشه این کارارو با php کرد ؟

خوب با کمی جستجو به این رسیدم که در php هم توابعی تعبیه شده که امکان اجرای دستورات خط فرمانو به ما میده !

مثلا:

echo(exec(“whoami”));

به ما میگه که الان php ما با چه کاربری اجرا میشه که همون nobody معروفه!

اما وقتی شما خروجی دقیقا معادل اون چیزی که تو خط فرمان میبینیدو بخواهید اگه مجوزهای کاربر nobody اجازه بده باید از دستور system استفاده کنید!

یه مثال خوب رو نگاه کنید :

<!DOCTYPE html PUBLIC "-//IETF//DTD HTML ۲٫۰//EN">
<html>
<head>
<title>The WorldsEnd.NET - Free Ping Script, written in PHP</title>
</head>
<?php
//  This script was writen by [email protected], Aug.2001
//  http://www.theworldsend.net
//  This is my first script. Enjoy.
//
// Put it into whatever directory and call it. That's all.
// Updated to ۴٫۲ code
// Get Variable from form via register globals on/off
//-------------------------
$max_count = ۱۰; //maximum count for ping command
$unix      =  ۱; //set this to ۱ if you are on a *unix system
$windows   =  ۰; //set this to ۱ if you are on a windows system
// -------------------------
// nothing more to be done.
// -------------------------
//globals on or off ?
$register_globals = (bool) ini_get('register_gobals');
$system = ini_get('system');
$unix = (bool) $unix;
$win  = (bool)  $windows;
//
If ($register_globals)
{
$ip = getenv(REMOTE_ADDR);
$self = $PHP_SELF;
}
else
{
$submit = $_GET['submit'];
$count  = $_GET['count'];
$host   = $_GET['host'];
$ip     = $_SERVER['REMOTE_ADDR'];
$self   = $_SERVER['PHP_SELF'];
};
// form submitted ?
If ($submit == "Ping!")
{
// over count ?
If ($count > $max_count)
{
echo 'Maximum for count is: '.$max_count;
echo '<a href="'.$self.'">Back</a>';
}
else
{
// replace bad chars
$host= preg_replace ("/[^A-Za-z0-9.-]/","",$host);
$count= preg_replace ("/[^۰-۹٫]/","",$count);
echo '<body bgcolor="#FFFFFF" text="#000000"></body>';
echo("Ping Output:<br>");
echo '<pre>';
//check target IP or domain
if ($unix)
{
system ("ping -c$count -w$count $host");
system("killall ping");// kill all ping processes in case there are some stalled ones or use echo 'ping' to execute ping without shell
}
else
{
system("ping -n $count $host");
}
echo '</pre>';
}
}
else
{
echo '<body bgcolor="#FFFFFF" text="#000000"></body>';
echo '<p><font size="2">Your IP is: '.$ip.'</font></p>';
echo '<form methode="post" action="'.$self.'">';
echo '   Enter IP or Host <input type="text" name="host" value="'.$ip.'"></input>';
echo '   Enter Count <input type="text" name="count" size="2" value="4"></input>';
echo '   <input type="submit" name="submit" value="Ping!"></input>';
echo '</form>';
echo '<br><b>'.$system.'</b>';
echo '</body></html>';
}
?>

در این مثال ما عمل ping رو تحت وب اجام میدیم ! خیلی جالبه نه؟

امیدوارم خودتون راجع به اینا تحقیق کنید و راجع به سوال اول من ، که اینکه اگه بخواهیم کارای سیستمی با مجوز بالا با اینترفیس وب انجام بدیم باید چه کرد؟

پ . ن . ۱ : البته من جواب سوالمو با کمک استاد پژمان مقدم پیدا کردم! لا اقل یکی از جوابهای ممکن! ایشالله سر فرصت اونم مینویسم.

پ . ن .۲ : منبع کد بالا به همراه مثالهای با حالتر رو از اینجا ببینید!

پ . ن . ۳:

ستاره‌ای بدرخشيد و ماه مجلس شد

دل رميده ما را رفيق و مونس شد

نگار من که به مکتب نرفت و خط ننوشت

به غمزه مسله آموز صد مدرس شد


نقل و نبات شماره یک (tips & tricks) ( معرفی کتابخانه SimplePie )

مدتهاست چیزی ننوشتم و یه جورایی وبلاگم مرده ! خوب این اتفاقی که برا خیلیا میوفته و برا خیلیا نمیوفته! این روزا اگه بتونم گوگل ریدرمو صفر کنمو به فعالیت های دنیای اپن سورسم مثل مدیریت زنجان لاگ و لینوکس اف ام برسم هنر کردم !

ولی یه ایده ای دارم اونم اینه که درسته نه وقت و نه حوصله نوشتن متون طولانی دارم ولی میتونم با نکاتی که هر روز برخورد میکونم و یاد میگیریم اینجا رو زنده نگه دارم!

ایشالله که بقیه هم خوششون بیاد و مفید باشه.

خوب برای مطلب اول دوس دارم یه کلاس خیلی قوی و در عین حال ساده تو php رو که بلد شدم رو معرفی کنم:

simplepie یک کلاس فوق العاده ، آسون در بگارگیری و در عین سریع و استاندارد برای کار با rss هست !

برای اینکه درکش کنید و یه نمه کف کنید، توصیه میکنم فیلم آموزشیشو ببینید که به سادگی یه گوگل ریدر کوچولو میسازه:

http://simplepie.org/tutorials/introduction_to_simplepie.mov

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

http://simplepie.org/wiki/reference/start

و اینم محل اصلی اموزشای صوتی و تصویری و نوشتاریش:

http://simplepie.org/wiki/tutorial/start

پ . ن : یکی از دلائل علاقه من به زبان اپن سورس پی اچ پی و سوییچ کردنم ازasp.net به php همین زیادی کلاسهای فوق العاده در این زبانه چون php برای همست ;)

پ . ن . ۲: از Chris Monnat بخاطر اینکه سبب آشنایی من با این کلاس شد متشکرم.

پ . ن . ۳ : تفعلی زدیم و آمد :

آنکس که بدست جام دارم     سلطانی جمع مدام دارم