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

آخرین مطلب من برای شرکت در مسابقه چرا گنو/لینوکس را دوست دارم؟  یه پروژه کوچیک بر مبنای 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

چه کارهای جالبی با گنو/لینوکس انجام می‌دهم : جایگزین کننده خودکار clipboard

بعد از نوشتن پست چرا گنو / لینوکس را دوست دارم ، وسوسه شدم پست چه کارهای جالبی با گنو/لینوکس انجام می‌دهم رو هم برای مسابقه بنویسم:


خوب معمولا این پست ها با طرح یه مشکل شروع میشن و بعد با یه حرکت ژانگولری لینوکسی تموم میشن پس اول میپردازیم به مشکل، داستان از اون جایی شروع شد که قصد کردم مستندات Django که یه فریم ورک نوشته شده با python هست رو مطاله کنیم و PDF مستندادشو گرفتم و هر از گاهی یه مقدارشو میخوندم.
مسئله از اینجا شروع شد که هر از گاهی به کدهایی بر میخوردم که باید کپی و پیست میکردم و مثال ها رو اجرا میکردم، کدهایی مثل کد زیر:

 

urlpatterns = patterns(’’,
(r’^articles/(d{4})/$’, ’news.views.year_archive’),
(r’^articles/(d{4})/(d{2})/$’, ’news.views.month_archive’),
(r’^articles/(d{4})/(d{2})/(d+)/$’, ’news.views.article_detail’),
)

 

مشکل اینجاست که به جای کاراکتر Typewriter single quotes یا همون کاراکتر ‘ که در برنامه نویسی هم بسیار مرسوم وقتی paste انجام میشه کاراکتر Single quotes (curly)  یا همون کاراکتر ‘ ’ پیست میشه و هر دفعه برای اجرای درست کد ها باید با سینگل کوت معمولی ( ‘ ) جایگزین بشن. اینجا میتونید راجع به علايم نقل قول اطلاعات کاملی بدست بیارید.

مثلا برای مثال بالا شکل درستش اینشکلیه:

urlpatterns = patterns('',
(r'^articles/(d{4})/$', 'news.views.year_archive'),
(r'^articles/(d{4})/(d{2})/$', 'news.views.month_archive'),
(r'^articles/(d{4})/(d{2})/(d+)/$', 'news.views.article_detail'),
)

 

و باور کنید بعد از دو بار انجام دادن جایگزینی، دیگه این کار حوصله سر بر میشه!!! و دنبال یه راه حل اتوماتیک برای این جور شرایط میوفتین .
وقتی دقت کردم دیدم من همین مشکلو حتی در برخورد با بعضی از کدهای قرار داده شده بر روی اینترنت هم دارم و مثلا به جای سینگل کت و یا دابل کت با این کاراکتر های ’ و ‘ و ” مواجه میشم که باید یک بار عمل replace رو روشون اعمال کنم تا درست اجرا شن.

خوب حالا که مشکل فهمیدیم باید دنبال یه راه حل باشیم:

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

autocmd BufWritePre * :%s/’/'/ge

کد بالا باعت میشه هر دفعه که در vim ما دستور :w رو برای ذخیره فایل زدیم، قبل از ذخیره عمل replace یا همون جای گزینی انجام بشه.

درسته که با همین کار کوچیک مشکلمون حل میشه اما راستش من تو کارهام بیشتر از ادیتورهای گرافیکی مثل geany و gedit استفاده میکنم! پس مشکل من هنوز کامل حل نشده.
پس باید یه فکر دیگه ای بکنم، هوووووم خوب من میدونم وقتی یه چیزی copy میشه در یک جایی به نام clipboard ذخیره میشه و اگه من بتونم مدام clipboard رو چک کنم میتونم اگر کاراکتر های ناخواستم توش پیدا شد همونجا عمل replace رو روشون انجام بدم تا وقتی چیزیو paste میکنم همه چیز درست و اونطوری که من میخوام باشه.
بنابراین بازم دست به یه سری سرچ میزنم و به کتابخونه Pyperclip میرسم که به زبان python برای کار با clipboard نوشته شده.
من python کار نیستم اما علاوه بر این که python کارا رو دوست دارم :دی میدونم وقتی یه زبان برنامه نویسی رو بلد باشی و ساختارهای کنترلیشو بشناسی سادس که با زبان های برنامه نویسی دیگه هم کار کنی.
بنا بر این گرچه خیلی ترو تمیز نیست ولی کد زیرو نوشتم ببینم کار میکنه یا نه!

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import pyperclip
import time

while 1:
	clipboard = pyperclip.paste()
	if '’' in clipboard or '‘' in clipboard:
		clipboard = clipboard.replace('’', ''')
		clipboard = clipboard.replace('‘', ''')
		pyperclip.copy(clipboard)
		time.sleep(1)

خوب خدا رو شکر کار میکنه و ما الان تو محیط گرافیکی تمام copy و paste هامون شامل قوانین replace کننده موردنظرمون میشه.
توضیح کد بالا به این صورته که یه حلقه بی نهایت ساختم که هر یک ثانیه یک بار اجرا میشه و با کمک کتابخونه Pyperclip محتویات clipboard رو میگیره و چک میکنه آیا کاراکترهای’ یا ‘ در اون هست یا نه و اگر هست عمل جایگزینی اونها رو با کاراکتر سینگل کوت موردنظر ما انجام میده و محتویات جدید رو جایگزین محتویات قبلی clipboard میکنه.

اما جریان اینجا تموم نشد! موقعی که این کد رو اجرا میکردم احساس میکردم صدای فن لپ تاپم زیاد میشه و وقتی با دستور top میزان مصرف منابع سیستممو چک کردن دیدم بله مصرف منابع کدی که نوشتم، خیلی بیشتر از هیکلشه!
خوب این یعنی حلقه بی نهایت جواب نمیده و باید خیلی دقیق تر بزنیم به هدف! مثلا این عمل جایگزینی فقط وقتی عمل کپی انجام میشه صورت بگیره! خوب سوال اینجاست از کجا بفهمیم کی یه عمل کپی کردن داره انجام میشه؟ شاید با DBUS بشه این کارو پیاده کرد ولی بابا آخه من همیشه دنبال آسون ترین راهم پس یه گوگلی میکنم تا ببینم تو نرم افزار های مدیریت clipboard کدوم به اونچیزی که من میخوام نزدیک تره که به glipper رسیدم.
در توضیحش امده:

It maintains a history of text copied to the clipboard from which you can choose. Glipper uses plugins to give the user all the extra functionality.

پس اگه بتونم یه plugin براش بنویسم احتمال زیاد بتونم مشکل خودمو با یه روش اصولی حل کنم.
بعد از نصبش سعی میکنم از ساختارش سر در بیارم!

[email protected]:~$ cd /usr/share/glipper/
[email protected]:/usr/share/glipper$ ls
plugins plugins-window.ui preferences-window.ui

 

خوب تونستم جایی که plugin هاش نصب میشه رو پیدا کنم و توی پوشه plugins به مورد جالبی بر خوردم! پلاگین newline.py بسیار ساده نوشته شده و میتونه بیس پلاگین جایگزین کننده من باشه، پس بر اساس اون شروع میکنم به کد زدن و به کد زیر میرسم:

#This is a clippboard replacor
#-*- coding:utf-8 -*-

import glipper
from gettext import gettext as _

def on_new_item(arg):
	#if type(arg) != 'NoneType':
		if '’' in arg or '‘' in arg:
			last_set_item = arg
			last_set_item = last_set_item.replace('’', ''')
			last_set_item = last_set_item.replace('‘', ''')
			glipper.set_history_item(0, last_set_item)
			glipper.add_history_item(last_set_item)

def info():
	info = {"Name": _("replacer"),
	        "Description": _("replace some characters"),
	        "Preferences": False}
	return info

 

خوب این کد ها رو داخل فایلی به نام replacer.py در مسیر /usr/share/glipper/plugins ذخیره میکنم و مریم برای تستش:


در نهایت همونطور که میبینید به هدفم رسیدم و الان دارم به این فکر میکنم که به پلاگینم یه قسمت مدیریت کارکتر های جایگزین شونده اضافه کنم تا کاربرا از طریق رابط گرافیکی بتونن کارکترهای دلخواهو بهش بدن، شاید برنامه نویس اصلی پروژه  glipper هم اگر مناسب دید این رو هم به پلاگین های رسمی پروژه اضافه کنه! به نظرم این زیبایی دنیای لینوکسه که بهت امکان آزمایشو خطا و یادگرفتنو یاد دادن و تکمیل کردن اجزای مختلفو میده و من تمام این چیزا رو دوست دارم :)

 

چرا گنو/لینوکس را دوست دارم؟

خوب امروز  میخوام راجع به موضوع “چرا گنو/لینوکس را دوست دارم؟”  بنویسم!
مدتیه فروشگاه sito به مدیریت دوست خوبم بهنام توکلی مسابقه ای با همین موضوع راه انداخته و بعضی از دوستانم مطالب  فنی خیلی خوبی در این مورد نوشتن اما امروز من از دریچه دیگه ای به موضوع نگاه میکنم :)

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

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


آشنایی با همین ایده ها و دیدن طرفدارانشون بود که تو ذهنم ایجاد این جرقه رو کرد که ما هم باید تو شهرمون یه همچین جمعی داشته باشیم و مبلغ یه همچین ایده های انسانی ای باشیم و این شد که ۳ سال پیش یعنی دقیقا ۱۵ تیرماه سال ۱۳۸۸ با کمک دوستان، گروه کاربران لینوکس زنجان رو تاسیس کردم.
تو این مدت کارهای مختلفی انجام دادیم، از برگزاری همایش های آشنایی با لینوکس تو دانشگاه ها و آموزشگاه ها تا کلاس های دور همیِ یاد گرفتن یه چیز مربوط به لینوکس ، الان که بهشون نگاه میکنم میبینم حداقل باعث شد بچه های ثابت زنجان لاگ از جمله خودم از یه طرفدار به یه کاربر واقعی و حتی مبلغ قابل قبولی برای لینوکس تبدیل بشیم :)
حتی پس از مدتی با پروژه های Linuxfm و Zconf که خاستگاهشون برو بچه های زنجان لاگ بود و با حمایت بی دریغ بچه های بسیار خوب جامعه متن باز کشور مواجه شدن، کارهایی در سطح کشور برای تبلیغ و گسترش گنو / لینوکس انجام دادیم.
حالا که بهش فکر میکنم میبینم بهترین قسمت این چهار و پنج سال زندگی داشنجویی اخیر من، همین فعالیت ها و رفاقت هایی بوده که حول جامعه متن باز ایران شکل گرفته و امید دارم هر روز هم بیشتر بشه :)

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

دیلماج، مترجم فارسی تحت خط فرمان!!!
نرم افزار مدیریت پروژه های وب
Unity-Dilmaj مترجم تحت Dash اوبونتو !
آیلین، بیس طراحی وب سایت

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

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

معرفی Irssi

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

امروز دوس دارم با یه نرم افزار لینوکسی که تو خط فرمان کار میکنه و کلاینت (سرویس گیرنده! ) IRC هست آشناتون کنم و طی این آشنایی با مباحث زیر روبرو میشیم:

  • irc چیست
  • دستورات irc
  • آشنایی با دستورات اولیه Irssi
  • نام های مستعار خود را بسازید
  • اجرای برنامه ها و چاپ خروجی آنها از داخل irssi
  • به کاربرانی که به شما msg/ میدهند بگویید نیستید
  • کارهای تکراری را در irssi خودکار کنید
  • چند ترفند برای مقابله با افراد/کانالهای شلوغ
  • تهیه گزارش از لاگهای irssi
  • برای irssi خود برنامه بنویسیم

irssi

ادامه خواندن معرفی Irssi

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

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

اما Git چیه؟

Git is…

Git is a free & open source, distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

از اونجایی که نه حس داستان سرایی دارم  نه توان فنیشو همینو بگم که بهترین راه مدیریت کد ها و کار گروهی روی اونها و محافظت از اونها و گزارش گیری از تغییرات و … همین سیستم های کنترل کد مثل svn و git هستند!

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

مقایسه‌ی Git با Subversion

والا اگه نبود اینترنت و این دوستان مجازیمون با این وضع آموزش اکادمیک و اوضاع شرکت های شهرستان ها فکر نمیکنم با یه همچین تکنولوژی هایی اشنا میشدیم ! در همین راستا دعوت میکنم از سایت اصلی برنامه git که دارای داکیومنتای کاملی دیدن کنید :

http://www.git-scm.com/

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

ساخت مخزن git

و یا بیایین از سایتهایی که به صورت جهانی این خدمات رو + امکانات بیشتر مثل ویکی و … برای پروژه هاتون فراهم میکنن استفاده کنید مثل:

http://gitorious.org/

http://github.com/

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

من رفتم سایت github و یه اکانت برا خودم ساختم چون در اونجا تعدادی از استادان مجازی منم هستن و یه خورده انگلیسی دوره دبرستانو به کار انداختمو  یه پروژه تعریف کردم اما در کار با اون چند تا نکته داره که در کمک های خود سایتم آمده اول

SSH key بود که میتونید برای ساخت و تنظیمش از این صفحه کمک بگیرین:

http://help.github.com/linux-key-setup/

که تو همون دستور اصلی

$ ssh-keygen -t rsa -C "[email protected]"

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

Creating and Commiting

$ cd (project-directory)
$ git init
$ (add some files)
$ git add .
$ git commit -m 'Initial commit'

اما خوب من دنبال یه منبع سری و ساده بودم که به این رسیدم:

Git for the lazy

و واقعا هم برا ماهاست ! فقط من به دستور العمل های فسمت start اش دستور

 git push origin master

رو هم اضافه کردم تا کارهایی که در لوکالهاست انجام دادم به سرور منتقل بشن !
پ . ن : امیدوارم شما زودتر از من برید سراغ این چون میفهمید که تاحالا چقدر عزاب بی خودی تو مدیریت پروژه هاتون کشیدین!
پ . ن . ۲ : تو کسایی که میشناسم فکر کنم مهرداد مومنی از همه بیشتر راجع به git نوشته :

مهاجرت سورس کد از سابورژن به گیت

چطور یک شاخه(branch) را از یک مخزن دور(remote) حذف کنیم!؟ (Git)

Qt و Gitorous یک گام بزرگ به جلو

پ . ن . ۳ :

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

نقل و نبات شماره شش (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) ( تعمیر ویندوز پس از عوارض لینوکس! )

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

و احتمال قوی منو فحش میداد چون من باعث و بانی لینوکس امتحان کردنش و خود لینوکسش بودم !

به من زنگ زدو باعث شد یه یادی از دوران ویندوز بکنیم ، گفتم اینجا هم بنویسم!

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

اونجا اگه help رو بنویسید همه دستورا میاد ولی برا تعمیر بوت و بوت لودر توسیه میشه:

fixboot

fixmbr

اینا رو بزنید و بعد از اتمام فرایند دستورات بالا سیستمو ریستارت کنید و حله!

اما اگه مشکل از بوت لودر نبود و میگفت NTLDR is missing باید تو همون ریپیر کنسول رفته که باز لازمش اینه که ویندوزتونو انتخاب کنید و یوزرو پس بدین تا به محیط خط فرمان کنسول تعمیر کننده وارد شین مثل دفعه قبل ! اما این دفعه نباید دستور خاصی رو بزنید بلکه با کمک دستورات CD و DIR باید به داخل درایو سی دی رامتون رفته و داخل پوشه i386 بشین و با کمک دستور COPY فایل NTDLR رو به درایو سیتون یا حالا هر درایوی که ویندوز روش نصبه کپی کنید!

تا همینجاش این کار باعث رفع مشکلتون میشه ولی ممکنه یه مشکل دیگه هم داشته باشین که بعد از رد شدن از این مرحله خودشو نشون میده و هی سیستم ریسیت میکنه برای رفع اون مشکل هم فایل ntdetect.com رو مثل قبلی از اینجا به درایو ویندوزتون کپی میکنید و بعد از اون با ریستارت کردن سیستم ، از اینکه مجبور نشدین ویندوز رو دوباره نصب کنید شنگول میشید .

پ . ن : ترک هر عادتی سخته ولی باور کنید لینوکس ارزش ترک عادتو داره ! یه روزی میبینید که نمیتونید تو ویندوز یه لحظه دووم بیارین!

پ . ن . ۲ :

در وفای عشق تو مشهور خوبانم چو شمع
شب نشین کوی سربازان و رندانم چو شمع

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

نقل و نبات شماره سه (tips & tricks) ( فیلمبرداری از دسکتاپ لینوکس )

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

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

ffmpeg -f alsa -itsoffset 00:00:02.000 -ac 2 -i hw:0,0 -f x11grab -s $(xwininfo -root | grep 'geometry' | awk '{print $2;}') -r 10 -i :0.0 -sameq -f mp4 -s wvga -y intro
با اجرای کد بالا در ترمینال لینوکستون ، از اونلحظه  محیط کاری لینوکس و تمام صداها ضبط میشن و هر وقت تصمیم به اتمام این کار گرفتین کافیه q رو بزنید و فایلی به عنوان intro.mp4 تحویل بگیرید یک بار دیگه از قدرت خط فرمان لینوکس لذت ببرید.
پ . ن : بعضی وقتا از بودن تو شبکه های عمومی مثل identi.ca خیلی حال میکنم ، مثلا در لحظه اشنایی من با این کد
پ . ن . ۲ : تفعلی زدیمو امد :
صبحدم مرغ چمن با گل نوخاسته گفت
ناز کم کن که در اين باغ بسی چون تو شکفت
گل بخنديد که از راست نرنجيم ولی هيچ عاشق سخن سخت به معشوق نگفت

وصل شدن به شبکه در لینوکس با دستورات متنی ( قسمت اول )

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

گفتم تمام چیزایی که امروز یاد داده شد رو هم مستند کنم شاید به درد بخوره!

خوب برای وصل کردن کامپیوترمون به شبکه مورد نظر اول از هر چیزی باید چک کنیم ببینیم ایا کابل به کارت شبکه وصل هست یا نه ؟ و بعد از اون چک کنیم ببینیم که ایا کارت شبکه ما up هست یا به قول ویندوزی ها enable یا نه؟

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

mii-tool

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

مثلا:

[email protected]:~# mii-tool

eth0: negotiated 100baseTx-FD flow-control, link ok

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

[email protected]:~# mii-tool

eth0: no link

و حتی اگه کارت شبکه مون به هر دلیلی غیر فعال باشه با این خروجی روبرو میشیم:

[email protected]:~# mii-tool

no MII interfaces found

ادامه خواندن وصل شدن به شبکه در لینوکس با دستورات متنی ( قسمت اول )

مجموع فایل کنفرانس های من در کلاس های دانشگاه

امروز داشتم در فایلهام دونبال یه مقاله میگشتم که به فایل یکی از ارائه هام در دانشگاه برخوردم!

اون ارائم مربوط میشد به سیستم عامل و انواع سیستم عامل ها و ویژگی ها و خصوصیات هر کدوم از اونها که به طور کلی بر روی دو خانواده unix base  و  windows تمرکز داشت !

تقریبا اکثر سیستم عامل ها رو هم شامل میشد:

unix , linux , BSD , solaris , mac os x, windows

۹x, xp , server , vista

گفتم اپلودش کنم شاید بدرد یکی بخوره!

http://blog.pitm.net/downloads/OS – Presentation.pdf

همچنین یه ارائه دیگه داشتم راجع به طراحی وب که خیلی ابتدائیه و فقط جنبه معرفیو داره:

http://blog.pitm.net/downloads/Web site.pdf

و یک مورو دیگه در مورد فناوری raid

http://blog.pitm.net/downloads/RAID.pdf

و دیگری راجع به وب ۲:

http://blog.pitm.net/downloads/web2.pdf

و یه دونه دیگه راجع به ip :

http://blog.pitm.net/downloads/IP.pdf

گفتم این فایل ها رو اپلود کنم شاید به درد یکی دیگه غیر خودمم بخوره

موفق باشید