<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" 	xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
<channel>
<title>efazati.blog.ir :: دست نویس های یک برنامه نویس</title>
<link>http://efazati.blog.ir</link>
<description>دیده های محمد افاضاتی</description>
<language>fa</language>
<generator>http://blog.ir</generator>
<lastBuildDate>Mon, 23 Jan 2012 12:07:48 +0330</lastBuildDate>
	<item>
	<title>طریقه نصب پکیج های پایتون</title>
	
	<link>/post/%D8%B7%D8%B1%DB%8C%D9%82%D9%87-%D9%86%D8%B5%D8%A8-%D9%BE%DA%A9%DB%8C%D8%AC-%D9%87%D8%A7%DB%8C-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86</link>
		<description><![CDATA[<p>
	پیکیج های پایتون معمولا یک ساختار استاندارد دارند که در خود سایت اصلی طریقه ساخت به طور کامل توضیح داده شده است.</p>
<p dir="ltr">
	Creating a Package — The Hitchhiker's Guide to Packaging v1.0 documentation -&gt; <a href="http://guide.python-distribute.org/creation.html">http://guide.python-distribute.org/creation.html</a></p>
<p>
	برای نصب پیکیج های پایتون چند راه وجود دارد.</p>
<p>
	<br><br><strong>استفاده از source</strong><br>
	کلا اگر پکیج استاندارد باشد یک فایل setup.py است. که با اجرای خط زیر پکیج به pythonpath سیستم می رود.</p>
<pre>
$ python setup.py install</pre>
<p>
	دقت کنید که حتما sudo er باشید<br><br><strong>استفاده از easy_install</strong><br>
	برنامه ای به اسم setuptools وجود دارد که از طریق repository سیستم عاملتان می توانید نصبش کنید.</p>
<pre>
$ apt-get install python-setuptools
</pre>
<p>
	حالا شما می خواهید package django را نصب کنید. کافیست در ترمینال تایپ کنید</p>
<pre>
$ easy_install django
Searching for django
Reading http://pypi.python.org/simple/django/
Reading http://www.djangoproject.com/
Best match: Django 1.3.1
Downloading http://pypi.python.org/packages/source/D/Django/Django-1.3.1.tar.gz#md5=62d8642fd06b9a0bf8544178f8500767
^Cinterrupted
</pre>
<p>
	<br>
	ای وای بر من D: می خواستم ورژن ۱.۲.۵ را نصب کنم خوب چه کنم؟ حالا به easy_install ورژن برنامه ای که می خواهم را نیز می گویم.</p>
<pre>
$ easy_install django==1.2.5
Searching for django==1.2.5
Reading http://pypi.python.org/simple/django/
Reading http://www.djangoproject.com/
Best match: Django 1.2.5
Downloading http://pypi.python.org/packages/source/D/Django/Django-1.2.5.tar.gz#md5=e031ea3d00996035e49e4bfa86e07c40
Processing Django-1.2.5.tar.gz
Running Django-1.2.5/setup.py -q bdist_egg --dist-dir /tmp/easy_install-JlBUNe/Django-1.2.5/egg-dist-tmp-aNgfJX</pre>
<p>
	به همین سادگی package با همان ورژنی که می خواستم نصب شد.<br>
	راهنمای کاملش را در زیر می بینید</p>
<p dir="ltr">
	EasyInstall - The PEAK Developers' Center -&gt; <a href="http://peak.telecommunity.com/DevCenter/EasyInstall">http://peak.telecommunity.com/DevCenter/EasyInstall</a></p>
<p>
	 </p>
<p>
	<strong>استفاده از pip</strong><br>
	یک برنامه دیگر هم هست به اسم pip که به نسبت کامل تر است. برای استفاده برنامه را نصب کنید.</p>
<pre>
$ apt-get install python-pip</pre>
<p>
	حالا چند مدل دستور دارید</p>
<pre>
$ pip <span style="color:#ff0000;">search</span> babel
Babel                     - Internationalization utilities
  INSTALLED: 0.9.6 (latest)
Flask-Babel               - Adds i18n/l10n support to Flask applications
  INSTALLED: 0.8 (latest)
nibabel                   - Access a multitude of neuroimaging data formats
openbabel-python          - openbabel: Python interface to the Open Babel chemistry library
MakoLang                  - This package adds preprocessor to mako for convenient syntax of gettext strings, and
                            babel extractor to process such templates.
BabelDjango               - Utilities for using Babel in Django
BabelGladeExtractor       - Babel Glade XML files translatable strings extractor
chemfp                    - chemfp is a set of command-lines tools for generating cheminformatics fingerprints and
                            searching those fingerprints by Tanimoto similarity, as well as a Python library which
                            can be used to build new tools.  These algorithms are designed for the dense, 100-10,000
                            bit fingerprints which occur in small-molecule/pharmaceutical chemisty. The Tanimoto
                            search algorithms are implemented in C for performance and support both threshold and
                            k-nearest searches.  Fingerprint generation can be done either by extracting existing
                            fingerprint data from an SD file or by using an existing chemistry toolkit. chemfp
                            supports the Python libraries from Open Babel, OpenEye, and RDKit toolkits.
gpsbabel                  - Python wrapper for GPSBabel project

$ pip <span style="color:#ff0000;">install</span> babel
$ pip <span style="color:#ff0000;">install</span> SQLAlchemy <span style="color:#ff0000;">--upgrade</span>
Downloading/unpacking SQLAlchemy
  Downloading SQLAlchemy-0.7.4.tar.gz (2.5Mb): 2.5Mb downloaded
  Running setup.py egg_info for package SQLAlchemy

    warning: no files found matching '*.jpg' under directory 'doc'
    no previously-included directories found matching 'doc/build/output'
Installing collected packages: SQLAlchemy
  Found existing installation: SQLAlchemy 0.6.8
    Uninstalling SQLAlchemy:
      Successfully uninstalled SQLAlchemy
  Running setup.py install for SQLAlchemy
    building 'sqlalchemy.cprocessors' extension
    gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c lib/sqlalchemy/cextension/processors.c -o build/temp.linux-x86_64-2.7/lib/sqlalchemy/cextension/processors.o
    gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux-x86_64-2.7/lib/sqlalchemy/cextension/processors.o -o build/lib.linux-x86_64-2.7/sqlalchemy/cprocessors.so
    building 'sqlalchemy.cresultproxy' extension
    gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c lib/sqlalchemy/cextension/resultproxy.c -o build/temp.linux-x86_64-2.7/lib/sqlalchemy/cextension/resultproxy.o
    gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux-x86_64-2.7/lib/sqlalchemy/cextension/resultproxy.o -o build/lib.linux-x86_64-2.7/sqlalchemy/cresultproxy.so

    warning: no files found matching '*.jpg' under directory 'doc'
    no previously-included directories found matching 'doc/build/output'
Successfully installed SQLAlchemy
Cleaning up...

$ pip <span style="color:#ff0000;">uninstall</span> simplejson
Uninstalling simplejson:
  /home/me/env/lib/python2.7/site-packages/simplejson
  /home/me/env/lib/python2.7/site-packages/simplejson-2.2.1-py2.7.egg-info
Proceed (y/n)? y
  Successfully uninstalled simplejson</pre>
<p>
	 </p>
<p>
	<br>
	کلا امکانات زیادی دارد. از مجموعه امکاناتی که من در pip خیلی دوست داشتم ساخت فایل requirement است. به طور مثال می خواهید یک مجموعه ای از برنامه ها را دانلود کنید. یک لیست از برنامه ها را در یک فایل بگذارید و به دستور زیر همه را دانلود کنید. من همچین فایلی ساختم و همیشه بعد از نصب سیستم عامل جدید این فایل را اجرا می کنم.</p>
<pre>
$ pip install -r requirements
</pre>]]></description>
	<pubDate>Sat, 21 Jan 2012 15:42:00 +0330</pubDate>
	<comments>/post/%D8%B7%D8%B1%DB%8C%D9%82%D9%87-%D9%86%D8%B5%D8%A8-%D9%BE%DA%A9%DB%8C%D8%AC-%D9%87%D8%A7%DB%8C-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86#comments</comments>
	<dc:creator>asd</dc:creator>
	<guid isPermaLink="false">55.blog.ir/post/8</guid>
	<slash:comments>0</slash:comments>
	</item>
	<item>
	<title>افزونه های فایرفاکس</title>
	
	<link>/post/%D8%A7%D9%81%D8%B2%D9%88%D9%86%D9%87-%D9%87%D8%A7-%D9%81%D8%A7%DB%8C%D8%B1%D9%81%D8%A7%DA%A9%D8%B3</link>
		<description><![CDATA[<p>
	<img alt="" src="http://www.dirjournal.com/info/wp-content/uploads/2011/01/logo-wordmark.gif" style="width: 200px; height: 77px; margin: 5px; float: right;">فایرفاکس ابزار دوست داشتنی منه که با استفاده از اون خیلی راحت صفحات وب رو می بینم و کارهای روزانه ام رو انجام می دهم. برای طراحی سایت و کارهایی مثل این خیلی کمکم می کنه که البته مقدار زیادی از این کار و مدیون افزونه هایی هستم که استفاده می کنم.</p>
<p>
	خب من چیا استفاده می کنم؟</p>
<p>
	توی این پست من لیستی از افزونه ها با توضیحاتشون می گم که امیدوارم از اونایی که خوشتون اومد استفاده کنید.</p>
<p>
	</p>
<p>
	<br><strong>Adblock Plus </strong>2.0.1<br><a href="http://adblockplus.org/en/">http://adblockplus.org/en</a></p>
<p>
	در این افزونه شما به راحتی تبلیغات مزاحمی که می بینید رو حذف میکنید که همین باعث میشود صفحه خلوت تری و بهتری داشته باشید. خیلی خوبه</p>
<p>
	<br><strong>AutoProxy</strong> 0.4b2.2011041023<br><a href="https://autoproxy.org">https://autoproxy.org</a></p>
<p>
	هر کاربری معمولا یک لیست پر-وکسی داره و یه لیست سایت هایی که مشکل دارند که چون قضیه یه مقدار در همه کلا از پر-وکسی استفاده می کنیم. خب این افزونه خیلی راحت توی هر سایتی می گه می خواهی درخواست های این سایت از پرو-کسی استفاده کنم و باعث میشه ترافیک اضافی رو از جای دیگه نگیری. به نظرم کار خیلی خوبیه</p>
<p>
	<br><strong>ColorZilla</strong> 2.6.4<br><a href="http://www.colorzilla.com">http://www.colorzilla.com</a></p>
<p>
	برای طراح ها و کسانی که می خوان یه css کوچیک رو عوض کنند خیلی مهمه که بدونند این رنگ هایی که می بینند دقیقا چه رنگیه ( کد hex شون چیه؟ ) با این افزونه به راحتی می تونه رنگ و پیدا کنید و کپی کنید.</p>
<p>
	<br><strong>Delicious Bookmarks</strong> 2.3.1<br><a href="http://delicious.com/help/quicktour/firefox">http://delicious.com/help/quicktour/firefox</a></p>
<p>
	با شبکه Delicious ارتباط بر قرار می کنه و عملا می تونه جای bookmark های شما رو پر کنه. اون لینک هایی رو هم که دوست دارید می تونید به اشتراک بگذارید</p>
<p>
	<br><strong>DownThemAll</strong>! 2.0.8<br><a href="http://downthemall.net">http://downthemall.net</a></p>
<p>
	یک دانلودر خیلی خوب که با تمام سرعت ممکن می تونه فایل های شما رو دانلود کنه.</p>
<p>
	 </p>
<p>
	<strong>Email This! Bookmarklet Extension </strong>2.3.0<br><a href="http://www.lazyrussian.com/my-projects/email-this-firefox-extension">http://www.lazyrussian.com/my-projects/email-this-firefox-extension</a></p>
<p>
	برای من خیلی پیش میاد که صفحه ای رو که می بینم دوست دارم برای کسی ایمیل کنم خیلی ساده دکمه ctrl+alt+g رو می زنم و ایمیل میشه. این افزونه به درد همچین وقت هایی می خورد</p>
<p>
	<br><strong>Firebug</strong> 1.8.4<br><a href="http://www.getfirebug.com">http://www.getfirebug.com</a><br>
	دقیقا این افزونه زندگی هر برنامه نویس وبی رو می تونه عوض کنه. اگه یه روزی بخوام donate کنم این اولیشه.</p>
<p>
	با این افزونه شما می تونید DOM رو ببیند و کنترل کنید. کل element های html</p>
<p>
	از console در javascript استفاده کنید</p>
<p>
	با net تمام درخواست هایی که میاد رو مانیتور کنید و response مربوطه رو بگیرید</p>
<p>
	<br><strong>Firecookie</strong> 1.4<br><a href="http://www.janodvarko.cz/firecookie">http://www.janodvarko.cz/firecookie</a></p>
<p>
	این افزونه ای بر روی فایرباگ است که قبل تر دربارش حرف زدم. این تمام درخواست ها رو میبینه که چه کوکی هایی برایشون ارسال میشود</p>
<p>
	<br><strong>FireFTP</strong> 2.0<br><a href="http://fireftp.mozdev.org">http://fireftp.mozdev.org</a><br>
	یک کلاینت ساده برای کار با ftp که خیلی راحت میشه باهاش کار کرد</p>
<p>
	<br><strong>FireQuery</strong> 1.0<br><a href="http://firequery.binaryage.com">http://firequery.binaryage.com</a><br>
	خیلی پیش میاد که بخواهیم یه سری کار تو صفحه بکنیم که با jquery خیلی راحته. با کنسول firebug میریم که کد کوچیک و بزنیم میبینیم jquery نداره که، اینکه javascript هم بنویسیم معمولا بیشتر میشه با این افزونه می تونید به راحتی jquery رو به صفحه بی افزایید</p>
<p>
	<br><strong>Ghostery</strong> 2.6.2<br><a href="http://http://www.ghostery.com"> http://www.ghostery.com</a><br>
	این افزونه اکثر tracker های سایت ها رو تشخیص میدهد و شما می تونید بلاکشون کنید. به طور مثال من دوست ندارم google-analytics در کنار همه اطلاعاتی که داره دقیقا بدونه من چه سایت هایی هم رفته ام. برای همین کلا حذفش می کنم.</p>
<p>
	<br><strong>Google Docs Viewer</strong> 1.8</p>
<p>
	<a href="http://ttps://addons.mozilla.org/en-US/firefox/addon/google-docs-viewer-pdf-doc-doc">ttps://addons.mozilla.org/en-US/firefox/addon/google-docs-viewer-pdf-doc-doc</a></p>
<p>
	برای من خیلی پیش اومده بخواهم یه فایل مثل doc رو ببینم و نمی خواستم دانلودش کنم. این به راحتی با گوگل داک بازش می کنه</p>
<p>
	<br><strong>GrabMyBooks</strong> 1.4<br><a href="http://www.grabmybooks.com">http://www.grabmybooks.com</a><br>
	یه سری صحه می بینم که دوست دارم با ebook reader م بخونمشون و ... همه رو می دم به این افزونه و متن درستشم تلاش می کنه تشخیص بده یا من بهش می گم و در نهایت به من یه فایل epub کوچولو میده.</p>
<p>
	<br><strong>InstantFox</strong> 2.4.2<br><a href="http://www.instantfox.net">http://www.instantfox.net</a><br>
	ترکیب جستجو با آدرس بار به همراه یه سری امکانات مثل جستجوی مستقیم در جاهای مختلف، به طور مثال من می خوام توی ویکیدیا سرچ کنم می گم w و متنمو می نویسم.</p>
<p>
	<br><strong>JSView</strong> 2.0.8<br><a href="http://addons.mozilla.org">http://addons.mozilla.org</a><br>
	لیست همه جاوا اسکریپت ها و css های صفحه رو با حجمشون یه جا لیست می کنه که خیلی راحت میشه بازشون کرد و ...</p>
<p>
	<br><strong>Mozilla Archive Format</strong> 2.0.2<br><a href="http://maf.mozdev.org">http://maf.mozdev.org</a><br>
	یه صفحه رو کامل می خونه و save می کنه. با همه css و javascript ها و فایل های مدیا. خیلی افزونه خوبیه وقتی نیاز دارید یه html code رو خوب ذخیره کنید</p>
<p>
	<br><strong>My CopyFixer</strong> 1.2<br><a href="http://cyberrabbits.net">http://cyberrabbits.net</a><br>
	این افزونه رو دوست خوبم فرود نوشته که <a href="http://cyberrabbits.net/655/my-copyfixer/">اینجا</a> می بینید</p>
<p>
	 </p>
<p>
	<strong>Personal Menu</strong> 5.0.6<br><a href="https://addons.mozilla.org/firefox/addon/3895">https://addons.mozilla.org/firefox/addon/3895</a></p>
<p>
	منوی اصلی فایرفاکس رو می تونید ویرایش کنید و اونطوری که دوست داریدش تنظمیش کنید. واقعا چه چیزهایی لازم دارید همون ها رو بذارید و بقیه رو پاک کنید D:<br>
	 </p>
<p>
	<strong>Read It Later</strong> 2.1.3<br><a href="http://readitlaterlist.com">http://readitlaterlist.com</a><br>
	خیلی پیش می آید که یه سری صفحه باشه که وقت ندارید بخونید ولی دوست دارید بخونید. با این توی hub سایت read it later ذخیره میشه و هروقت هر جایی می تونید بخونیدشون.</p>
<p>
	 </p>
<p>
	<strong>Server Spy</strong> 0.2.1<br><a href="http://www.jacquet80.eu/mozilla/exts/ServerSpy/">http://www.jacquet80.eu/mozilla/exts/ServerSpy/</a><br>
	اسم سرور سایتی که دارید و از header درخواست ها در میاره و نمایش میده.</p>
<p>
	 </p>
<p>
	<strong>Shorten URL</strong> 0.3.8<br><a href="http://shortenurl.googlecode.com/">http://shortenurl.googlecode.com/</a><br>
	آدرس صفحه حاضر رو با هر سرویسی که بخواهید کوچیک می کنه.</p>
<p>
	 </p>
<p>
	<strong>Stylish</strong> 1.2.4<br><a href="http://userstyles.org">http://userstyles.org</a><br>
	میتونید یک css رو به css های یک سایت بی افزایید که کار خوبیه مثلا دوست دارید فونت یه سایت تاهوما باشه و ... با این افزونه به راحتی میشه این کارا رو کرد.</p>
<p>
	<br><strong>Tab Mix Plus</strong> 0.3.8.7<br><a href="http://tmp.garyr.net">http://tmp.garyr.net</a><br>
	یه سری امکانات خوب داره که باعث میشه tab ها امکانات بیشتری داشته باشند. رنگ خوانده ها معلوم تر شه یا بتونید lock کنید و ...</p>
<p>
	 </p>
<p>
	<strong>WebRank Toolbar</strong> 4.1.2<br><a href="http://http://www.webrankstats.com"> http://www.webrankstats.com</a><br>
	یه مجموعه از امکانات چک کردن رنک های مختلف مثل google page rank یا alexa و ... است البته از این افزونه ها زیاده ولی من از این استفاده می کنم چون یک دکمه است و خیلی جا نمیگیره D:</p>]]></description>
	<pubDate>Mon, 26 Dec 2011 09:16:50 +0330</pubDate>
	<comments>/post/%D8%A7%D9%81%D8%B2%D9%88%D9%86%D9%87-%D9%87%D8%A7-%D9%81%D8%A7%DB%8C%D8%B1%D9%81%D8%A7%DA%A9%D8%B3#comments</comments>
	<dc:creator>asd</dc:creator>
	<guid isPermaLink="false">55.blog.ir/post/7</guid>
	<slash:comments>1</slash:comments>
	</item>
	<item>
	<title>DWM راهکار مناسبی برای مدیریت پنجره ها در لینوکس</title>
	
	<link>/post/DWM-%D8%B1%D8%A7%D9%87%DA%A9%D8%A7%D8%B1-%D9%85%D9%86%D8%A7%D8%B3%D8%A8%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D9%BE%D9%86%D8%AC%D8%B1%D9%87-%D9%87%D8%A7-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3</link>
		<description><![CDATA[<p>
	<a href="http://bayanbox.ir/blog/efazati/images/dwm__1.png?info" target="_blank"><img alt="dwm-logo" src="http://bayanbox.ir/blog/efazati/images/dwm__1.png?image_preview" style="margin: 5px;"></a>مدت ها میشد که دنبال یک window manager می گشتم که هم خیلی سبک تر desktop environment هایی مثل gnome باشه هم خیلی راحت تر بتونم تنظیمش کنم. برای همین منظور چیز هایی مثل <a href="http://awesome.naquadah.org/" target="_blank">awesome</a>, <a href="http://wmii.suckless.org/" target="_blank">wmii</a>, <a href="http://i3wm.org/">i3</a>, <a href="http://www.nongnu.org/ratpoison/" target="_blank">ratpoison</a> رو امتحان کردم که در انتها <a href="http://dwm.suckless.org/" target="_blank">window manager dwm</a> نظرمو جلب کرد که با کمی تغییرات شد محیط اصلی ای که باهاش کار می کنم.</p>
<p>
	 </p>
<p>
	<strong>window manager چیست:</strong></p>
<p>
	ابزاری نرم افزاری که در محیط گرافیکی gui موقعیت پنجره ها رو مدیریت می کند. البته می توان گفت اکثر window manager ها تکمیل تر می شوند و کار DE ها رو هم انجام می دهند. DE ها از یک wm یک برنامه مدیریت فایل، یک مجموعه کتابخانه و ... تشکیل می شود.</p>
<p>
	</p>
<p>
	نصب Dwm کار سختی نیست که شما هم می توانید از طریق ریپو هایتان نصبش کنید و هم می توانید از طریق کامپایل کردن پکیجش نصب کنید. برای عوض کردن تنظیماتش راه دوم بهتر است.</p>
<p>
	برای همین از سایت اصلی <a href="http://dl.suckless.org/dwm/dwm-5.9.tar.gz">source</a> مربوطه را دریافت کنید. ( به این <a href="http://tools.suckless.org/dmenu">بسته</a> هم نگاه کنید. )</p>
<p>
	برای عوض کردن رنگ و چیزهای دیگر باید فایل config.h را تغییر بدهید. به طور مثال من با دکمه Alt به عنوان کلید اصلی مشکل داشتم برای همین همه چیز را به دکمه super تغییر دادم که با  emacs دوست داشتنی ام مشکلی نداشته باشد.</p>
<p>
	یکی از مهمترین خاصیت های dwm پشتیبانی از سیستم tiling است که در این حالت می تونید دو برنامه را به صورت خرد شده در کنار هم ببینید. من در تنظیمات خودم ۳ حالت دارم. اینکه یک پنجره را فقط نشان بدهد اینکه همه را tile کند اینکه کلا float باشد.\</p>
<p>
	 </p>
<p>
	نمونه کانفیگ فایلش رو میتونید <a href="https://bitbucket.org/efazati/coolconfig/src/d1c25c31dea2/dwm/config.h" target="_blank">اینجا</a> ببینید.</p>
<p>
	 </p>
<p>
	در این کانفیگ شما می تونید از دکمه های پایین استفاده کنید.</p>
<p>
	dmenu رو یا همون باز کننده برنامه هاتونه --&gt; super + space</p>
<p>
	باز کردن workspace ها --&gt; super + numkey</p>
<p>
	انتقال پنجره به workspace های دیگر --&gt; shift + super + numkey</p>
<p>
	layout به صورت tile در بیاید --&gt; super + t</p>
<p>
	layout به صورت full در بیاید --&gt; super + m</p>
<p>
	layout به صورت float در بیاید --&gt; super + f</p>
<p>
	و ...</p>
<p>
	کلا با خواندن فایل تنظیمات می توانید به همه دکمه ها پی ببرید D: .</p>
<p>
	 </p>
<p>
	<strong>نکات راهبردی:</strong></p>
<p>
	برای <strong>مدیریت شبکه </strong>توصیه می کنم از برنامه wicd استفاده کنید</p>
<pre>
sudo yum install wicd wicd-gtk wicd-curses
sudo service NetworkManager stop # Bad password errors if both are running…
sudo service wicd start
wicd-client -n</pre>
<p>
	 </p>
<p>
	برای <strong>مدیریت ترمینال</strong> دو برنامه خوب هست که کار راه اندازند</p>
<p>
	<a href="https://launchpad.net/terminator" target="_blank">terminator</a> که قابلیت tile شدن داخلی داره و خیلی کارایی دارد ( یه سری آموزش و توضیحات <a href="http://www.go2linux.org/terminal-emulators-quadkonsole-multi-gnome-terminal-yakuake-Eterm" target="_blank">اینجا</a> است.)</p>
<p>
	<a href="http://projects.comum.org/guake" target="_blank">guake</a> که یه سری کارهای گرافیکی می کنه :D</p>
<p>
	 </p>
<p>
	برای <strong>تغییر بک گراند</strong> از ابزاری به اسم <a href="http://linux.die.net/man/1/feh" target="_blank">feh</a> می تونید استفاده کنید که می تونه تصویر رو عوض کنه</p>
<p>
	 </p>
<p>
	برای <strong>فایل منیجر</strong> هم ابزار هایی مثل <a href="http://www.krusader.org/">krusader</a>, <a href="http://doublecmd.sourceforge.net/" target="_blank">doublecommander</a>, <a href="http://thunar.xfce.org/" target="_blank">thunar</a> هم خوب است. البته بی مشکل ترینشون همین krusader است که kde است.</p>
<p>
	 </p>
<p>
	برای<strong> تغییر زبان </strong>هم می توانید از <a href="http://www.xfree86.org/current/setxkbmap.1.html" target="_blank">setxkbmap</a> استفاده کنید.</p>
<pre class="msg">
setxkbmap -option grp:switch,grp:alt_shift_ toggle,grp_led:scroll us,ir</pre>
<p>
	 </p>
<p>
	کلا شما می توانید یک سری تنظیمات داشته باشید که در init ی جایی بازش کنید</p>
<p>
	نمونه کدی که می توانید بنویسید:</p>
<p>
	 </p>
<pre>
while true; do
    xsetroot -name "Memory $(free -m | grep '^Mem' | awk '{print "\x02 total: " $2 "MB used: " $3"MB \x01"}') CPU $(top -bn 1 | grep '^Cpu' | tr -d 'usy,' | awk '{print "\x02 user " $2 ", sys " $3 "\x01 Date \x02"}') $( date +"%F %R" ) $(uptime | awk '{print  "Up:" $3}' | tr -d ',')"
     
    sleep 60s
done &amp;

# start wallpaper

feh --bg-scale ~/Pictures/wallpapaer/7sobhgoode.jpg
</pre>
<p>
	در این کد با xsetroot مقدار رم مصرف شده و ... رو نوشته بک گراند هم عوض کردیم.</p>
<p>
	 </p>
<p>
	چند screenshot:</p>
<p style="text-align: center;">
	<a href="http://bayanbox.ir/blog/efazati/images/dwm.png?info" target="_blank"><img alt="dwm" src="http://bayanbox.ir/blog/efazati/images/dwm.png?image_preview" title="این تصویر دسکتاب منه"></a></p>
<p style="text-align: center;">
	<a href="http://bayanbox.ir/blog/efazati/images/dwm-20100318.png?info" target="_blank"><img src="http://bayanbox.ir/blog/efazati/images/dwm-20100318.png?image_preview"></a></p>
<p style="text-align: center;">
	<a href="http://bayanbox.ir/blog/efazati/images/dwm-guake__1.png?info" target="_blank"><img src="http://bayanbox.ir/blog/efazati/images/dwm-guake__1.png?image_preview"></a></p>]]></description>
	<pubDate>Fri, 09 Dec 2011 11:16:23 +0330</pubDate>
	<comments>/post/DWM-%D8%B1%D8%A7%D9%87%DA%A9%D8%A7%D8%B1-%D9%85%D9%86%D8%A7%D8%B3%D8%A8%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D9%BE%D9%86%D8%AC%D8%B1%D9%87-%D9%87%D8%A7-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3#comments</comments>
	<dc:creator>asd</dc:creator>
	<guid isPermaLink="false">55.blog.ir/post/6</guid>
	<slash:comments>3</slash:comments>
	</item>
	<item>
	<title>چگونه یک روبات جمع آوری اطلاعات از یک سایت بنویسیم؟</title>
	
	<link>/post/%DA%86%DA%AF%D9%88%D9%86%D9%87-%DB%8C%DA%A9-%D8%B1%D9%88%D8%A8%D8%A7%D8%AA-%D8%AC%D9%85%D8%B9-%D8%A2%D9%88%D8%B1%DB%8C-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%A7%D8%B2-%DB%8C%DA%A9-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%A8%D9%86%D9%88%DB%8C%D8%B3%DB%8C%D9%85%D8%9F</link>
		<description><![CDATA[<p>
	در این مقاله قرار است یک روبات بنویسیم که مطالب یک سایت را بخواند و در دیتابیس ذخیره کند ولی چگونه؟</p>
<p>
	من برای اینکار از چند تا کتابخانه استفاده خواهم کرد.</p>
<p>
	 </p>
<pre class="default prettyprint">
<code><span class="kwd">import</span><span class="pln"> urllib

site </span><span class="pun">=</span><span class="pln"> urllib</span><span class="pun">.</span><span class="pln">urlopen</span><span class="pun">(</span><span class="str">'http://www.google.com'</span><span class="pun">)</span>
<span class="pln">site_data </span><span class="pun">=</span><span class="pln"> site</span><span class="pun">.</span><span class="pln">read</span><span class="pun">()</span>
<span class="pln">site</span><span class="pun">.</span><span class="pln">close</span><span class="pun">()</span>
</code></pre>
<p>
	 </p>
<p>
	در urllib به سادگی می توانید یک آدرس را دانلود کنید. ما برای scrap باید آدرس را بسازیم و هر دفعه دوباره دانلود کنیم.</p>
<p>
	</p>
<p>
	لایبری بعدی که باید استفاده کنیم lxml است که با آن می توانیم دقیقا element مشخصی را با استفاده از Xpath یا selector از کل html خارج کنیم</p>
<p>
	 </p>
<pre>
from lxml import etree, html

content = html.fromstring(site_data)
content.find_class("title")</pre>
<p>
	خوب من یک کد کوچیک می نویسم که کارش اینه که آدرس سایت را بگیرد و هنگام کار بگویید چه کلاسی را می خواهید و در نتایجش که یک دیکشنری است ذخیره کند.</p>
<pre>
from HTMLParser import HTMLParser
from lxml import etree, html
import urllib

class Stripper(HTMLParser):
   
    def __init__(self):
        self.reset()
        self.fed = []
       
    def handle_data(self, d):
        self.fed.append(d)
       
    def get_data(self):
        return ''.join(self.fed)

def strip_tags(html_code):
    s = Stripper()
    s.feed(html_code)
    return s.get_data()

   
class scrap(object):
    """
    scrap site with addres and you can access to final_scrap for complete data
    """
    final_scrap = dict()
   
    def __init__(self, url=None):
        """
        download site
        """
        if not url:
            site = open('persian.html', 'r')
            site.seek(0)
        else:
            site = urllib.urlopen(url)
           
        self.content = site.read()
        self.content = html.fromstring(self.content)
       
    def normalize(self, data):
        striped = etree.tostring(data, encoding='utf-8')
        striped = strip_tags(striped)
        striped = striped.replace('\t','').replace('\n','')
        return striped

    def find_and_insert(self, name, element_class, element_number=None):
        """
        read self.content and find element_class form html with find_class
        """
        scrap_element = self.content.find_class(element_class)
        self.final_scrap[name] = self.normalize(scrap_element[element_number or 0])</pre>
<p>
	خوب حالا من چگونه از این کلاس می تونم استفاده کنم؟</p>
<p>
	برای این کار من فایل پایتونی scrap رو اجرا می کنم</p>
<pre>
$ ipython -i scrap.py
Welcome to rlcompleter2 0.96
for nice experiences hit &lt;tab&gt; multiple times
Python 2.6.7 (r267:88850, Aug  3 2011, 11:33:52)
Type "copyright", "credits" or "license" for more information.

IPython 0.10.2 -- An enhanced Interactive Python.
?         -&gt; Introduction and overview of IPython's features.
%quickref -&gt; Quick reference.
help      -&gt; Python's own help system.
object?   -&gt; Details about 'object'. ?object also works, ?? prints more.

In [1]: a = scrap('http://127.0.0.1')

In [2]: a.find_and_insert("title","title")

In [3]: a.fin
a.final_scrap      a.find_and_insert 

In [3]: a.final_scrap
Out[3]: {'title': '\xd9\xbe\xd8\xb1\xd8\xb4\xdb\x8c\xd9\x86'}

In [4]: print a.final_scrap['title']
پرشین</pre>
<p>
	همونطوری که می بینید تونست صفحه رو از localhost من بخونه و نتایج رو درست برگرداند. حالا شما که می خواهید یک مجموعه صفحه را بخوانید و اطلاعاتشان را بدست آورید در یک حلقه آدرس صفحات مختلف را بسازید و اطلاعات مربوطه را که یک دیکشنری است در پایگاه داده خود ذخیره کنید.</p>
<p>
	به طور مثال من سایتی دارم که آدرسی نظیر http://www.pesarak.ir/?p=320 دارد . همانطور که می بینید ۳۲۰ یک عدد است که با عوض کردنش می توانم به صفحات دیگر دسترسی پیدا کنم. خوب با بررسی بیشتر متوجه می شوم این سایت اخرین صفحه ای که دارد همان ۳۲۰ است پس یک حلقه درست می کنم که از ۱ تا ۳۲۰ برود و یک string که همان آدرس است درست می کنم و به برنامه scrap می دهم و برایم دریافت می کند و در دیتابیس ذخیره می کنم.</p>
<p>
	دقت کنید احتمال دارد که با گذاشتن اعداد مختلف به صفحه ای برسید که وجود ندارد برای همین بگویید اگر مثلا صفحه مقدار title داشت ذخیره کن وگرنه برو صفحه بعدی ( title فقط مثال است )</p>
<p>
	روبات شما الان به راحتی می تواند در مدت کوتاهی تمام اطلاعات یک سایت را بدست آورد.</p>
<p>
	 </p>
<p>
	موفق باشید</p>
<p>
	 </p>]]></description>
	<pubDate>Tue, 08 Nov 2011 17:03:00 +0330</pubDate>
	<comments>/post/%DA%86%DA%AF%D9%88%D9%86%D9%87-%DB%8C%DA%A9-%D8%B1%D9%88%D8%A8%D8%A7%D8%AA-%D8%AC%D9%85%D8%B9-%D8%A2%D9%88%D8%B1%DB%8C-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%A7%D8%B2-%DB%8C%DA%A9-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%A8%D9%86%D9%88%DB%8C%D8%B3%DB%8C%D9%85%D8%9F#comments</comments>
	<dc:creator>asd</dc:creator>
	<guid isPermaLink="false">55.blog.ir/post/5</guid>
	<slash:comments>4</slash:comments>
	</item>
	<item>
	<title>معرفی Twisted - event-driven networking engine</title>
	
	<link>/post/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-Twisted-event-driven-networking-engine</link>
		<description><![CDATA[<p>
	کار اصلی <a href="http://twistedmatrix.com">Twisted</a> ساخت برنامه های network در پایتون است. کارهایی از قبیل asynchronous programming به راحتی با Twisted قابل انجام است. در انتها می بینید که به راحتی می توانید یک وب سرور ساده با Twisted بنویسید. کلا کارهای کولی با Twisted میشه کرد :D</p>
<p>
	 </p>
<p>
	در اکثر جاها Twisted کارها، نوشتن یادگیری Twisted نیاز به کار و تمرین زیاد داره در عین حالی که کد خوبی داره و مستندات کاملی داره.</p>
<p>
	 </p>
<pre>
from twisted.web import server, resource
from twisted.internet import reactor

class HelloResource(resource.Resource):
    isLeaf = True
    def render_GET(self, request):
        request.setHeader("content-type", "text/plain")
        return "Hello, world!"

reactor.listenTCP(8080, server.Site(HelloResource()))
reactor.run()</pre>
<p>
	در نمونه ی بالا اومده با وب سرور Twisted یک صفحه ساده Hello, World ساده درست می کند.</p>
<p>
	 </p>
<p>
	چند وقتی هست که دوست دارم درباره Twisted مطالبی بنویسم. مطلب فارسی مناسبی برای این کتابخانه وجود ندارد.</p>
<p>
	بعد از این درباره asynchronous و thread و parallel می گم و در نهایت یه برنامه ای می نویسیم .</p>
<p>
	 </p>
<p>
	سایت اصلی:</p>
<p>
	http://twistedmatrix.com</p>
<p>
	</p>
<p>
	 </p>
<p>
	یکی از کتاب های خوب آموزش Twisted</p>
<p>
	<a href="http://www.amazon.com/Twisted-Network-Programming-Essentials-Fettig/dp/0596100329/ref=sr_1_9?ie=UTF8&amp;qid=1320656435&amp;sr=8-9">Twisted Network Programming Essentials</a></p>
<p>
	یه pdf خیلی خوب هم دیدم که بیشتر با این من جلو می رم</p>
<p>
	<a href="http://bayanbox.ir/blog/efazati/documents/twisted-intro.pdf?info" target="_blank"><img src="http://bayanbox.ir/st/images/download_icon/download_3.png">دریافت فایل</a><br>
	سایز فایل:1.32 مگابایت<br>
	توضیحات فایل:کتاب آموزش twisted</p>
<p>
	 </p>
<p>
	منابع:</p>
<p>
	http://krondo.com/blog/?page%5Fid=1327</p>
<p>
	http://jcalderone.livejournal.com/tag/sixty%20seconds</p>
<p>
	http://twistedmatrix.com/documents/current/core/howto/pb-intro.html</p>
<p>
	http://twistedmatrix.com/documents/current/core/howto/index.html</p>
<p>
	 </p>
<p>
	 </p>]]></description>
	<pubDate>Sun, 06 Nov 2011 12:27:00 +0330</pubDate>
	<comments>/post/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-Twisted-event-driven-networking-engine#comments</comments>
	<dc:creator>asd</dc:creator>
	<guid isPermaLink="false">55.blog.ir/post/4</guid>
	<slash:comments>1</slash:comments>
	</item>
	<item>
	<title>Nginx</title>
	
	<link>/post/Nginx</link>
		<description><![CDATA[<p>
	<strong>web server چیست؟</strong> به طور کلی هر چیز ( نرم افزاری یا سخت افزاری ) که داده ای را از طریق اینترنت یا شبکه به کاربر منتقل کند web server نامیده می شود.<br><br><a href="http://nginx.org">nginx</a> نامweb server/reverse proxy ی سبکی است که در سال ۲۰۰۲ به علت مشکل تعداد درخواست زیاد در سایت روسی <a href="http://www.rambler.ru">http://www.rambler.ru</a> شکل گرفت و در سال ۲۰۰۴ اولین نسخه رسمی خود را انتشار داد. تا کنون این وب سرور 11.28%. از سهم تمام وب سرور های دنیا را در دست دارد.<br><br>
	این وب سرور که هر روز جمع بیشتری از آن استفاده می کنند Wordpress.com را لیست استفاده کننده گان خود دارد.<br><br>
	از نکات مهم این وب سرور این است که بر روی سیستم عامل های windows linux Bsd و osx به راحتی نصب می شود<br><br>
	در این سیستم استفاده از روش  asynchronous event-driven  است که باعث شده که به میزان استفاده ثابت از RAM برسیم.<br><br><br><br><br><strong>asynchronous event-driven چیست؟</strong><br><br>
	وب سرور ها به طریق مختلفی اقدام به مدیریت درخواست ها  (connection ) می کنند</p>
<ul><li>
		    برای هر درخواست یک process جدید درست می کنند</li>
	<li>
		    برای هر درخواست یک process جدید درست می کنند در حالی که سیستم connection poll هم دارند که تا مدتی process ها را نگه می دارد و در صورتی که در آن زمان درخواست جدیدی بیاید از process های بیکار استفاده می کنند</li>
	<li>
		    برای هر درخواست یک thread جدید درست می کنند</li>
	<li>
		    برای هر درخواست یک thread جدید درست می کنند در حالی که سیستم thread poll هم دارند که تا مدتی thread ها را نگه می دارد و در صورتی که در آن زمان درخواست جدیدی بیاید از thread های بیکار استفاده می کنند</li>
	<li>
		    یک process همه event ها را مدیریت می کند. (قبول درخواست، پاسخ به کاربر، خواندن داده و … )</li>
	<li>
		    ترکیبات روش ها</li>
</ul><p>
	<br>
	Nginx از روش چهارم استفاده می کند به همراه ساخت process برای مجموعه از event ها … البته مقداری مشخص را در config مشخص می کند. همه این ها برای این است که بیشترین استفاده را از سیستم خود بکنیم.<br><br>
	به طور کلی باز کردن process و thread هزینه بر است و از آن مهمتر مدیریت اینهاست. وب سرورهایی شبیه Apache که  process و thread هستند با درخواست های زیاد به شدت درگیر مدیریت  process و thread می شوند که در نتیجه فشار زیاد تری به سرور می آورند<br><br>
	http://www.devside.net/articles/apache-performance-tuning<br>
	The more RAM your system has, the more processes [and threads] Apache can allocate and use; which directly translates into the amount of concurrent requests/clients Apache can serve.<br><br>
	ارتباط مستقیمی بین RAM و درخواست ها در این وب سرور ها وجود دارد که در روش nginx تا جای ممکن از استفاده ی اضافه آن جلوگیری شده است.<br><br>
	توضیح دیگری را دیدم که جالب به نظر می رسید.#<br><br>
	فکر کنید که وب سرور یک پیتزا فروشیست که باید سفارش ها را از طریق تلفن دریافت کند. در روش process و thread فروشگاه کارمند استخدام می کند (process و thread) که هرکدامشان یک خط تلفن دارند و هر کدام سفارش را از طریق تلفن می گیرند و صبر می کنند تا پیتزا حاضر شود تا به مشتری بگویند ( هنوز تلفن قطع نشده) پیتزای شما حاضر است.<br><br>
	در روش Nginx فقط تعداد محدودی کارمند استخدام می شود که تلفن ها را پاسخ می دهد و می گوید به محض حاضر شدن به شما می گوییم. و وقتی حاضر شد زنگ می زند.<br><br><strong>nginx چه کارهایی بلد است؟</strong><br><br>
	nginx علاوه بر این که یک وب سرور است  reverse proxy و e-mail (IMAP/POP3) proxy هم هست … علاوه بر درخواست های http در خواست های مربوط به IMAP و POP3 هم می تواند از امکانات nginx استفاده کند. در این روش شما می توانید از روش ها loadbalancing و چیزهایی از این قبیل برای ایمیل استفاده کنید. البته شما می توانید حتی کارهای عجیب غریبی مثل authentication mail را هم از طریق nginx انجام دهید.</p>
<p>
	 </p>
<p style="text-align: center;">
	<a href="http://bayanbox.ir/blog/efazati/images/image08.png?info" target="_blank"><img src="http://bayanbox.ir/blog/efazati/images/image08.png?image_preview"></a></p>
<p>
	reverse proxy درخواست های بیرونی را به صورت صف شده و جاهای مختلف می فرستد</p>
<ul><li>
		    reverse proxy ها موجودی سرور های شما را مخفی می کنند و همه ی دنیا شما را از دریچه reverse proxy می بینند.</li>
	<li>
		    تمام درخواست ها از reverse proxy می گذرد پس جای مناسبی برای firewall ها و … است</li>
	<li>
		    reverse proxy درخواست ها به صورت گسترده ای می تواند پخش کند.</li>
	<li>
		    reverse proxy فشار را با cache کردن محتوای صفحات ثابت می تواند کم کند</li>
	<li>
		    reverse proxy با فشرده سازی محتوای خروجی سرور ها می تواند زمان درخواست ها را کم کرده و پاسخ به درخواست ها را سریع تر کند.</li>
	<li>
		    درخواست ها بین سرور reverse proxy و سرور اصلی به سرعت انجام می شود و connection در reverse proxy باز می ماند و سرور اصلی در گیر نمی شود. ( روش SpoonFeeding )</li>
</ul><p>
	<br><br><strong>نصب Nginx:</strong><br><br>
	از سایت  <a href="http://nginx.org/en/download.html">http://nginx.org/en/download.html </a>نسخه آخر را دریافت کنید ( که در این مقاله nginx-1.0.6 است)<br><br>
	فایل فشرده شده را باز کنید.</p>
<p style="text-align: center;">
	<a href="http://bayanbox.ir/blog/efazati/images/image09.png?info" target="_blank"><img src="http://bayanbox.ir/blog/efazati/images/image09.png?image_preview"></a></p>
<p>
	وارد پوشه شوید و از دستور ./configure برای چک کردن نیازمندی ها و ساخت makefile</p>
<p style="text-align: center;">
	<a href="http://bayanbox.ir/blog/efazati/images/image03.png?info" target="_blank"><img src="http://bayanbox.ir/blog/efazati/images/image03.png?image_preview"></a></p>
<p style="text-align: center;">
	<a href="http://bayanbox.ir/blog/efazati/images/image06.png?info" target="_blank"><img src="http://bayanbox.ir/blog/efazati/images/image06.png?image_preview"></a></p>
<p>
	با دستور make install وب سرور شما نصب می شود. به صورت پیش فرض در آدرس /usr/local/nginx/ قرار می گیرد. برای اجرای وب سرور فایل nginx را اجرا کنید.</p>
<pre>
/usr/local/nginx/sbin/nginx</pre>
<p>
	حالا port 80 localhost خود را در مروگری چک کنید.<br>
	 </p>
<p style="text-align: center;">
	<a href="http://bayanbox.ir/blog/efazati/images/image00.png?info" target="_blank"><img src="http://bayanbox.ir/blog/efazati/images/image00.png?image_preview"></a></p>
<p>
	وب سرور شما با موفقیت نصب و اجرا شد.<br><br>
	برای تست وب سرور با پایتون نیاز یک منتقل Web Server Gateway Interface احتیاج داریم که درخواست های ما را به پایتون بدهد. ما برای این کار از uwsgi استفاده می کنیم. خوشبختانه از 0.8.40# به صورت پیشفرض تنظیماتش اضافه شده است.<br><br>
	برای شروع باید uwsgi را نصب کنید.<br><br>
	از سایت اصلی دانلود کنید http://projects.unbit.it/downloads/uwsgi-0.9.9.tar.gz بعد از خارج کردن از حالت فشرده آن را compile کنید . دقت کنید که برای اینکه بتوانید این ماژول c  و پایتونی را کامپایل کنید می بایستی python-dev را هم نصب کنید.<br><br>
	من یک پوشه به اسم /srv/www/zconf/ می سازم که در آن ۲ پوشه وجود دارد<br>
	 </p>
<p style="text-align: center;">
	<a href="http://bayanbox.ir/blog/efazati/images/image05.png?info" target="_blank"><img src="http://bayanbox.ir/blog/efazati/images/image05.png?image_preview"></a></p>
<p>
	 </p>
<p>
	در پوشه application من برنامه ای که از فریم ورک flask# استفاده کرده است گذاشتم و در پوشه دیگر هم logfile مربوط به uwsgi و access مربوط به nginx را گذاشته ام.</p>
<p>
	برنامه ما حالت بسیار ساده ای دارد که فقط درخواست را می گیرد و بدون هیچ cache ای محتوا را بر می گرداند.</p>
<pre>
#!/usr/bin/env python
# -*- encoding: utf-8 -*-  
<span class="str">"""</span>
  app.py
~~~~~~~~~
"""
from flask import Flask
from flask import render_template_string
from werkzeug.contrib.fixers import ProxyFix

app = Flask(__name__)
@app.route('/')
def index():
   return render_template_string('&lt;h1&gt;Hello Zconf&lt;/h1&gt;')

app.wsgi_app = ProxyFix(app.wsgi_app)</pre>
<p>
	<br><br>
	در فایل تنظیمات مربوط به nginx هم می بایستی بگوییم که از uwsgi بخواند.</p>
<p>
	فایل تنظیمات Nginx:</p>
<pre>
#user  nobody;

worker_processes  1;</pre>
<p>
	 </p>
<p>
	میزان process ی که nginx می تواند باز کند اینجا مشخص می شود<span id="cke_bm_98E" style="display: none;"> </span><span id="cke_bm_97E" style="display: none;"> </span></p>
<pre>
#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;</pre>
<p>
	مسیر پیشرفض error ها و نوع error ها در اینجا مشخص می شود</p>
<pre>
events {

   worker_connections  1024;

}</pre>
<p>
	تعداد events هایی که یک process می تواند مدیریت کند</p>
<p>
	پس می توان گفت تعداد connection ها ضرب بین این متغیر و تعداد process هاست</p>
<pre>
http {

   include       mime.types;</pre>
<p>
	مسیری که mime ها را از آن می خواند</p>
<p>
	 </p>
<pre>
   default_type  application/octet-stream;</pre>
<p>
	نوع پیشفرض mime ی که استفاده می شود</p>
<pre>
#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

#                  '$status $body_bytes_sent "$http_referer" '

#                  '"$http_user_agent" "$http_x_forwarded_for"';</pre>
<p>
	قالب log</p>
<p>
	 </p>
<pre>
   #access_log  logs/access.log  main;</pre>
<p>
	log مربوط به درخواست ها</p>
<p>
	 </p>
<pre>
   sendfile        on;</pre>
<p>
	درخواست های مربوط به فایل را قبول کند یا نه</p>
<p>
	 </p>
<pre>
   #tcp_nopush     on;</pre>
<p>
	HTTP response header را با یک پکت ارسال م یکند</p>
<pre>
   #keepalive_timeout  0;

   keepalive_timeout  65;</pre>
<p>
	میزان زمانی که می خواهیم connection باز باشد تا جواب داده شود</p>
<pre>
   server {

       listen       80;</pre>
<p>
	port پیشفرض</p>
<p>
	 </p>
<pre>
       server_name  localhost;</pre>
<p>
	اسم سرور</p>
<p>
	 </p>
<pre>
       #charset koi8-r;</pre>
<p>
	charset پیشفرض</p>
<pre>
#access_log  logs/host.access.log  main;

    location / {

   include uwsgi_params;</pre>
<p>
	در اینجا من می گویم که از فایل uwsgi_params که به صورت پیشفرض در پوشه conf داری تنظیمات خود را بخوان</p>
<p>
	 </p>
<pre>
   uwsgi_pass 127.0.0.1:3031;</pre>
<p>
	آدرسی که از آن می توانی درخواست ها را بخوانی</p>
<pre>
        }

       error_page   500 502 503 504  /50x.html;

       location = /50x.html {

           root   html;

       }

   }

}</pre>
<p>
	همونطور که دیدید من درخواست های مربوط به port ۸۰ را به uwsgi دادم. در این مرحله باید با به uwsgi بگوییم که در پورت مورد نظر اجرا شود</p>
<pre>
# uwsgi --socket 127.0.0.1:3031 --file application/app.py --callable app --processes 4 --daemonize logs/uwsgi.log</pre>
<p>
	حالا سرور nginx را kill کنید و دوباره startکنید</p>
<p>
	 </p>
<p style="text-align: center;">
	<a href="http://bayanbox.ir/blog/efazati/images/image07.png?info" target="_blank"><img src="http://bayanbox.ir/blog/efazati/images/image07.png?image_preview"></a></p>
<p>
	وب سرور شما به خوبی توانست درخواست را از فایل پایتون بگیرد و نمایش دهد.<br><br>
	بنچمارک nginx<br><br>
	در این مرحله با apache benchmark به تعداد ۱۰۰۰۰۰ درخواست را به سرور می فرستیم که نتیجه کار را ببینیم</p>
<pre>
efazati@efazati-PA65-UD3-B3:~$ ab -n 100000 -c 10 -g test_data_1.txt http://zconf/

This is ApacheBench, Version 2.3 &lt;$Revision: 655654 $&gt;

Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking zconf (be patient)

Completed 10000 requests

Completed 20000 requests

Completed 30000 requests

Completed 40000 requests

Completed 50000 requests

Completed 60000 requests

Completed 70000 requests

Completed 80000 requests

Completed 90000 requests

Completed 100000 requests

Finished 100000 requests

Server Software:        nginx/1.0.6

Server Hostname:        zconf

Server Port:            80

Document Path:          /

Document Length:        20 bytes

Concurrency Level:      10

Time taken for tests:   19.961 seconds

Complete requests:      100000

Failed requests:        0

Write errors:           0

Total transferred:      17600000 bytes

HTML transferred:       2000000 bytes

Requests per second:    5009.86 [#/sec] (mean)

Time per request:       1.996 [ms] (mean)

Time per request:       0.200 [ms] (mean, across all concurrent requests)

Transfer rate:          861.07 [Kbytes/sec] received

Connection Times (ms)

             min  mean[+/-sd] median   max

Connect:        0    0   0.0      0       0

Processing:     1    2   1.5      2      35

Waiting:        1    2   1.5      2      35

Total:          1    2   1.5      2      35

Percentage of the requests served within a certain time (ms)

 50%      2

 66%      2

 75%      2

 80%      2

 90%      2

 95%      3

 98%      6

 99%     12

100%     35 (longest request)



</pre>
<p style="text-align: center;">
	 </p>
<p>
	همانطور که دقت می کنید با اینکه Concurrency برابر ۱۰ بود زمان connection زمانی معادل ۰ داشته</p>
<p>
	از طرفی هم نمودار های دیگری نیز وجود دارد که استفاده از آنها خالی از لطف نیست.</p>
<p style="text-align: center;">
	<a href="http://bayanbox.ir/blog/efazati/images/image01.png?info" target="_blank"><img src="http://bayanbox.ir/blog/efazati/images/image01.png?image_preview"></a></p>
<p style="text-align: center;">
	<a href="http://bayanbox.ir/blog/efazati/images/image02.jpg?info" target="_blank"><img src="http://bayanbox.ir/blog/efazati/images/image02.jpg?image_preview"></a></p>
<p>
	 </p>
<p>
	در مجموع نصب کردن و کار کردن به این وب سرور کار راحتی است و با رشدی که دارد پیش بینی می کنم در آینده درصد بیشتری از سهم وب سرور ها را به خود اختصاص دهد.</p>
<p>
	<br><strong>منابع:</strong></p>
<p dir="ltr">
	 </p>
<p dir="ltr">
	<br><a href="http://articles.slicehost.com/nginx">http://articles.slicehost.com/nginx</a><br><br><a href="http://articles.slicehost.com/2009/8/14/debian-lenny-nginx-configuration">http://articles.slicehost.com/2009/8/14/debian-lenny-nginx-configuration</a><br><br><a href="http://wiki.nginx.org">http://wiki.nginx.org</a><br><br><a href="http://articles.slicehost.com/2009/3/4/ubuntu-intrepid-installing-nginx-from-source">http://articles.slicehost.com/2009/3/4/ubuntu-intrepid-installing-nginx-from-source</a><br><br><a href="http://wiki.nginx.org/Install">http://wiki.nginx.org/Install</a><br><br><a href="http://wiki.nginx.org/NgxWSGIModule">http://wiki.nginx.org/NgxWSGIModule</a><br><br><a href="http://library.linode.com/web-servers/nginx/python-uwsgi/debian-6-squeeze">http://library.linode.com/web-servers/nginx/python-uwsgi/debian-6-squeeze</a><br><br><a href="http://wirtel.be/2011/02/24/nginx_gunicorn_flask/">http://wirtel.be/2011/02/24/nginx_gunicorn_flask/</a><br><br><a href="http://brandonkonkle.com/blog/2010/sep/14/django-uwsgi-and-nginx/">http://brandonkonkle.com/blog/2010/sep/14/django-uwsgi-and-nginx/</a><br><br><a href="http://en.wikipedia.org/wiki/Nginx">http://en.wikipedia.org/wiki/Nginx</a><br><br><a href="http://projects.unbit.it/uwsgi/wiki">http://projects.unbit.it/uwsgi/wiki</a><br><br><a href="http://projects.unbit.it/uwsgi/wiki/Doc">http://projects.unbit.it/uwsgi/wiki/Doc</a><br><br><a href="http://projects.unbit.it/uwsgi/wiki/RunOnNginx">http://projects.unbit.it/uwsgi/wiki/RunOnNginx</a><br><br><a href="http://library.linode.com/web-servers/nginx/configuration/basic">http://library.linode.com/web-servers/nginx/configuration/basic</a><br><br><a href="http://www.baus.net/on-tcp_cork">http://www.baus.net/on-tcp_cork</a><br><br><a href="http://en.wikipedia.org/wiki/Web_server_benchmarking">http://en.wikipedia.org/wiki/Web_server_benchmarking</a><br><br><a href="http://en.wikipedia.org/wiki/Reverse_proxy">http://en.wikipedia.org/wiki/Reverse_proxy</a><br><br><a href="http://en.wikipedia.org/wiki/Proxy_server">http://en.wikipedia.org/wiki/Proxy_server</a><br><br><a href="http://www.webfaction.com/blog/nginx-apache-memory.png">http://www.webfaction.com/blog/nginx-apache-memory.png</a><br><br><a href="https://farm4.static.flickr.com/3241/2298693485_df1606c495.jpg?v=0">https://farm4.static.flickr.com/3241/2298693485_df1606c495.jpg?v=0</a><br><br><a href="http://www.ehow.com/list_6183870_list-server-software.html">http://www.ehow.com/list_6183870_list-server-software.html</a></p>]]></description>
	<pubDate>Fri, 04 Nov 2011 16:30:03 +0330</pubDate>
	<comments>/post/Nginx#comments</comments>
	<dc:creator>asd</dc:creator>
	<guid isPermaLink="false">55.blog.ir/post/3</guid>
	<slash:comments>6</slash:comments>
	</item>
	<item>
	<title>برنامه انتشار ماه آبان و آذر</title>
	
	<link>/post/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%D9%86%D8%AA%D8%B4%D8%A7%D8%B1-%D9%85%D8%A7%D9%87-%D8%A2%D8%A8%D8%A7%D9%86</link>
		<description><![CDATA[<p>
	طبق عادت گذشته در ابتدای ماه لیستی از چیزهایی که دوست دارم اینجا درباره شان بنویسم در می آورم. اینگونه نقشه راهی خواهم داشت که می تونم به راحتی با استفاده از اون وقتم و بیشتر متمرکز کنم. در حقیقت دارم تلاش می کنم برای خودم برنامه ریزی بهتری بکنم.</p>
<p>
	خب برای ماه آبان و آذر چه کارهایی قرار است بکنیم؟</p>
<ul><li>
		معرفی Nginx - <span style="color:#808080;">مقاله ارایه شده در دومین کنفرانس نرم افزار های آزاد - زنجان شهریور ۱۳۹۰</span></li>
	<li>
		معرفی Twisted - event-driven networking engine</li>
	<li>
		چگونه یک روبات جمع آوری اطلاعات از یک سایت بنویسیم؟</li>
	<li>
		DWM راهکار مناسبی برای مدیریت پنجره ها در لینوکس</li>
	<li>
		تست و معرفی Dart - زبان گوگل</li>
	<li>
		راه اندازی DNS Server</li>
	<li>
		استفاده از KVM به عنوان یک ابزار عملی - نصب و راه اندازی</li>
</ul>]]></description>
	<pubDate>Wed, 02 Nov 2011 16:35:00 +0330</pubDate>
	<comments>/post/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%D9%86%D8%AA%D8%B4%D8%A7%D8%B1-%D9%85%D8%A7%D9%87-%D8%A2%D8%A8%D8%A7%D9%86#comments</comments>
	<dc:creator>asd</dc:creator>
	<guid isPermaLink="false">55.blog.ir/post/2</guid>
	<slash:comments>0</slash:comments>
	</item>
	<item>
	<title>شروع دوباره با بلاگ</title>
	
	<link>/post/start</link>
		<description><![CDATA[<p>
	بعد از مدتها مطلب ننوشتن در <a href="http://pesarak.ir">پسرک</a>، راه اندازی <a href="http://blog.ir">بلاگ</a> بهانه ای شد برای دوباره نوشتن.</p>
<p>
	اینجا دوست دارم چیز هایی که می بینم و خیلی ساده توضیح بدهم ...</p>
<p>
	چیزایی که دوست دارم، درباره برنامه نویسی، <a href="http://python.org">python</a>،  <a href="http://php.net/">php</a> , <a href="http://www.nginx.org">nginx</a>, <a href="https://www.linux.org">linux</a> ‌و ... است .</p>
<p>
	 </p>
<p>
	اگر وقت و حوصله داشته باشم حتما مطالبی رو که قبلا نوشتم رو منتقل می کنم و همینطور شاید دامنه pesarak.ir را هم به این بلاگ ست کردم</p>
<p>
	 </p>
<p>
	 </p>]]></description>
	<pubDate>Sat, 08 Oct 2011 21:53:53 +0330</pubDate>
	<comments>/post/start#comments</comments>
	<dc:creator>asd</dc:creator>
	<guid isPermaLink="false">55.blog.ir/post/1</guid>
	<slash:comments>0</slash:comments>
	</item>
</channel>
</rss>

