import zmq import time import sys port = "5556" if len(sys.argv) > 1: port = sys.argv[1] int(port) context = zmq.Context() socket = context.socket(zmq.REP) socket.bind("tcp://*:%s" % port) while True: # Wait for next request from client message = socket.recv() print "Received request: ", message time.sleep (1) socket.send("World from %s" % port)
import zmq from zmq import ssh import sys import paramiko port = "5557" if len(sys.argv) > 1: port = sys.argv[1] int(port) if len(sys.argv) > 2: port1 = sys.argv[2] int(port1) context = zmq.Context() print "Connecting to server..." socket = context.socket(zmq.REQ) socket.connect ("tcp://192.168.10.245:%s" % port) # Do 10 requests, waiting each time for a response for request in range (1,10): print "Sending request ", request,"..." socket.send ("Hello") # Get the reply. message = socket.recv() print "Received reply ", request, "[", message, "]"این سیستم میتواند به سادگی توسط zmq پیاده سازی شود.
ssh -L 127.0.0.1:5557:localhost:5556 user@192.168.10.245 -N
بعد از وارد کردن دستور بالا در ترمینال کلمه عبور سیستم A پرسیده میشود. بعد از وارد کردن آن میتون ارتباط امن بین پردازش ها را داشته باشیم. کد برنامه ها به صورت زیر تغییر پیدا میکند:
سیستم A که نقش سرور را دارد:
import zmq import time import sys port = "5556" if len(sys.argv) > 1: port = sys.argv[1] int(port) context = zmq.Context() socket = context.socket(zmq.REP) socket.bind("tcp://127.0.0.1:%s" % port) while True: # Wait for next request from client message = socket.recv() print "Received request: ", message time.sleep (1) socket.send("World from %s" % port)
کد سیستم B که نقش سرویس گیرنده دارد:
import zmq from zmq import ssh import sys import paramiko port = "5557" if len(sys.argv) > 1: port = sys.argv[1] int(port) if len(sys.argv) > 2: port1 = sys.argv[2] int(port1) context = zmq.Context() print "Connecting to server..." socket = context.socket(zmq.REQ) socket.connect ("tcp://127.0.0.1:%s" % port) # Do 10 requests, waiting each time for a response for request in range (1,10): print "Sending request ", request,"..." socket.send ("Hello") # Get the reply. message = socket.recv() print "Received reply ", request, "[", message, "]"
در کتابخانه pyzmq که یک پیاده سازی برای zmq است، یک گسترش بر روی اتصال zmq وجود دارد که همین کار اتصال تونل را انجام میدهد. کد نهایی به صورت زیر خواهد بود:
کد سیستم A تغییر نخواهد کرد و همان کد قسمت قبلی است
کد سیستم B به صورت زیر خواهد بود:
import zmq from zmq import ssh import sys import paramiko port = "5557" if len(sys.argv) > 1: port = sys.argv[1] int(port) if len(sys.argv) > 2: port1 = sys.argv[2] int(port1) context = zmq.Context() print "Connecting to server..." socket = context.socket(zmq.REQ) ssh.tunnel_connection(socket,"tcp://127.0.0.1:5556","user@192.168.10.245",password="111111") if len(sys.argv) > 2: socket.connect ("tcp://192.168.10.245:%s" % port1) # Do 10 requests, waiting each time for a response for request in range (1,10): print "Sending request ", request,"..." socket.send ("Hello") # Get the reply. message = socket.recv() print "Received reply ", request, "[", message, "]"
فرض کنید که میخواهید بسته های خاصی را با iptables فیلتر کنید، در iptables دستورات زیر را خواهید نوشت.
iptables -A FORWARD -p tcp --dport 22 -j LOG iptables -A FORWARD -p tcp --dport 22 -j DROP
با سیستم nftables دستور زیر را خواهید نوشت:
nft add rule filter forward tcp dport 22 log drop
فرض کنید که میخواهید بسته های چندین بسته را برای چندین پورت را فیلتر کنید و همچنین به نوع های خاص پروتکل icmpv6 اجازه عبود دهید. در iptables دستورات زیر را خواهید نوشت:
ip6tables -A INPUT -p tcp -m multiport --dports 23,80,443 -j ACCEPT ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
اما در nftables دستور زیر ر خواهید نوشت:
nft add rule ip6 filter input tcp dport {telnet, http, https} accept nft add rule ip6 filter input icmpv6 type { nd-neighbor-solicit, echo-request, nd-router-advert, nd-neighbor-advert } accept
mapping
یک ویژگی پیشرفته در nftables قابلیت مپ کردن است. این امکان وجود دارد که از داده هایی با اعواع مختلف استفاده کنیم و آنها را به هم مپ کنیم. برای مثال میتوان یک iface و مجموعه رول را به هم مرتبط کنیم. در مثال زیر زنجیره دستورات به نام low_sec و high_sec ساخته شده است.
# nft -i nft> add map filter jump_map { type ifindex => verdict; } nft> add element filter jump_map { eth0 => jump low_sec; } nft> add element filter jump_map { eth1 => jump high_sec; } nft> add rule filter input meta iif vmap @jump_map
در صورت نیاز به افزودن یک رابط شبکه، مثلا ppp1 دستور زیر را خواهیم نوشت:
nft> add element filter jump_map { ppp1 => jump low_sec; }
سرعت بروز رسانی و هسته
سیستم iptables با افزودن دستورات زیاد تر به حد زیادی دچار افت سرعت میشود. اما در سیستم جدیدتر nftables این کاهش سرعت وجود نخواهد داشت.
در سیستم iptables برای هر افزودن target یا match نیازمند ماژول و کامپایل دوباره کرنل هستیم. در سیستم nftables بیشتر وظایف در لایه کاربری انجام میشود که این مساله باعث کاهش نیاز به تغییرات هسته میشود. برای مثال ویژگی پشتیبانی از icmp6 با یک پچ قابل انجام است.
در مطلب بعدی به تغییرات معماری سیستم خواهیم پرداخت.
با سلام
در این پست، اسلاید های آموزشی که در کلاس تدریس میشه یا مطلب خوبی داشته باشه قرار داده میشه
http://bayanbox.ir/id/1940651557686741671
این مساله برای اولین بار توسط دایجسترا مطرح شد. در کتاب سیستم عامل سیلبرشاتس به صورت زیر آمده است:
"در یک آرایشگاه به تعداد n صندلی برای انتظار موجود و یک صندلی آرایشگری موجود است. اگر مشتری در مغازه نباشد، آرایشگر در این فرصت میخوابد. اگر یک مشتری وارد مغازه شد و همه صندلی ها پر باشد، مغازه را ترک میکند، اگر آرایشگر مشغول باشد، اما صندلی انتظار موجود باشد، مشتری در یک صندلی خالی مینشیند. اگر آرایشگر خوابیده باشد، مشتری او را بیدار میکند. یک برنامه برای هماهنگ سازی مشتری و ارایشگر بنویسید."
میتوان اطلاعات زیر را برای فهم بهتر مساله اشاره کرد:
مقدار درهی های اولیه:
customers = 0 mutex = Semaphore(1) customer = Semaphore(0) barber = Semaphore(0)
مقدار customers، تعداد مشتری های موجود در مغازه را مدیریت میکند و با میوتکس محافظت میشود.
آرایشگر برای customer منتظر میشود تا وارد مغازه شود و آنگاه مشتری منتظر مغازه دار میشود تا اجازه دهد که مشتری بر روی صندلی بنشیند.
کد مربوط به مشتری:
mutext.wait() if customers == n+1: mutext.signal() balk() customer += 1 mutex.signal() customer.signal() barber.wait() getHairCut() mutex.wait() customer -=1 mutex.signal()
اگر تعداد n صندلی پر باشد و یکی هم روی صندلی آرایش نشسته باشد (میشود n+1 نفر) یعنی مغازه پر است. مشتری در این شرایط وارد میشود و تابع bulk را صدا میزند. در غیر این صورت هر مشتری به مغازه دار یک سیگنال میدهد و منتظر آرایشگر میشود.
کد آرایشگر:
customer.wait() barber.signal() cutHair()
در کتاب استالینگز یک مساله آرایشگر پیچیده تر مطرح شده است:
"مغازه دارای سه صندلی آرایش و سه آرایشگر و همچنین یک فضای انتظار که برای مشتری های جدید. تعداد مشتری هایی که میتواند منتظر باشند، 20 نفر میباشند.
یک مشتری در صورت پر بودن مغازه وارد نمیشود. یک مشتری که منتظر است میتواند روی کاناپه بشیند یا اگر کاناپه پر بود، بیاستد. زمانی که یک آرایشگر خالی است، مشتری که بیشتری زمان انتظار را دارد سرویس داده میشود. زمانی که یک جا در کاناپه خالی شد، مشتری که بیشتری زمان سرپا بوده، مینشیند. زمانی که کار آرایش تمام شد، آرایشگر دستمزد را میگیرد، اما چونکه یک صندوق داریم، در هر لحظه هزینه یک مشتری دریافت میشود. آرایشگر زمان خود را بین آرایش کردن، پول گرفتن و خوابیدن تقسیم میکند."
میتوان گفت مسائل زیر در زمانبندی باید مد نظر باشد:
دشواری مساله در مکانهایی است که باید بر روی آنها انتظار انجام شود.
مقداردهی های مساله:
customers = 0 mutex = Semaphore(1) standingRoom = Fifo(16) sofa = Fifo(4) chair = Semaphore(3) barber = Semaphore(0) customer = Semaphore(0) cash = Semaphore(0) receipt = Semaphore(0)
کر مربوط به مشتری:
mutex.wait() if customers == 20: mutex.signal() exitShop() customers += 1 mutex.signal() standingRoom.wait() enterShop() sofa.wait() sitOnSofa() standingRoom.signal() chair.wait() sitInBarberChair() sofa.signal() customer.signal() barber.wait() getHairCut() pay() cash.signal() receipt.wait() mutex.wait() customers -= 1 mutex.signal() exitShop()
کد مربوط به آرایشگر:
customer.wait() barber.signal() cutHair() cash.wait() acceptPayment() receipt.signal()
روشهای زیادی برای فعال کردن قابلیت ورود خودکار (auto login) به محیط کاربری گرافیکی سیستم عامل لینوکس موجود است. اما این روشها وابسته به محیط گرافیکی است. برای مثال در محیط اوبونتو برای انجام این کار در محیط گرافیکی یک امکان خاص وجود دارد.
برای انجام این کار در محیط متنی میتوان از روش زیر استفاده کرد:
در محیط گرافیکی لینوکس، چندین tty که شبیه ساز ترمینال است موجود میباشد. برای اینکه کاربری به محیط خاصی لاگین کند، باید tty مشخصی را عوض کنیم. در محیط متنی معمولا با tty1 به صورت پیشفرض لاگین انجام میشود. در مثال زیر برای کاربر test، در tty1 به صورت پیشفرض لاگین انجام میشود.
در فایل
/etc/init/tty1.conf
خط:
exec /sbin/qetty -8 38400 tty1
را با خط زیر جایگزین کنید:
exec /bin/login -f test < /dev/tty1 > /dev/tty1 2>&1
سیستم OpenStack یک مجموعه از نرم افزارهای ابری است که توانایی اجرا بر روی سیستم های عادی را دارد. این سیستم برای اجرا به سخت افزار خاص یا پیش نیاز نرم افزاری خاصی نیاز ندارد و میتواند با محصولات دیگر هماهنگ شده و کارایی مناسبی دارد. به عنوان دیگر میتوان گفت این محصول میتواند به عنوان زیرساخت یک سازمان استفاده شود.
این سیستم در ابتدا توسط سازمان NASA و RackSpace توسعه پیدا کرد و اولین انتشار آن در سال 2010 بوده است. این محصول از ابتدا برای استفاده عمومی بوده و به صورت متن باز عرضه شده است.
کلود چیست؟
در ابتدا در مورد چیستی کلود و محاسبات ابری مطالبی عنوان میکنم. محاسبات ابری بر پایه تکنولوژی های موجود مانند مجازی سازی و کلاستربندی برای مجازی سازی سخت افزار، نرم افزار، ذخیره سازی، و منابع شبکه ای به صورت واحد های قابل انعطاف است که میتواند برای رسیدن به هدف خاصی تخصیص پیدا کند. بنابراین در عوض ساختار ایستای قدیمی که سخت افزار فیزیکی برای کارهای مختلفی در نظر گرفته میشد و ساختار ایستای شبکه و ذخیره سازی موجود قبلی در این روش به صورت یک مجموعه منایع شکل میگیرند. در این روش استفاده از سخت افزار بسیار آسان تر خواهد بود همچنین افزایش و کاهش میزان قدرت مورد نیاز نیز به سادگی انجام میشود.
سرویس های ابری میتواند به صورت خصوصی و به صورت عمومی مانند amazon ec2 باشد. میتوان سرویسهای ابری خصوصی و عمومی را با یکدیگر ترکیب کرد. برای مثال میتوان داده های مهم را در محیط ابری خصوصی نگه داری کرد. تمامی منابع امکان اشتراکی سازی بر روی فضای ابری را دارا میباشند. مدلهای اصلی سرویس ارائه شده به صورت زیر است:
در این پست، تمرینات هر جلسه قرار داده خواهد شد و زمان تحویل هر کدام نیز مشخص میشود
1,2,3,4,7,8,13,15,16,18,21,22,23
2. توضیح در مورد تکنولوژی IaaS، SaaS، PaaS
3. مساله برنامه نویسی: تمرین برنامه نویسی شماره 26 از کتاب سیلبرشاتس را انجام دهید (بعد از تمرینات کتاب، تمرینات برنامه نویسی قرار دارد).
آخرین زمان تحویل، جلسه یکشنبه، 26 آبان
$cat <file name>
با وارد کردن این دستور، برنامه شل، برنامه cat را همراه با پارامتر آن (در اینجا نام فایل) فراخوانی میکند. بعد از اجرای برنامه منتظر دستور دیگری از ورودی میشود.
برنامه نوشته شده باید دارای ویژگی های زیر باشد:
MultiCore, ManyCore, MultiProcessor, Distributed System
2. تمرین برنامه نویسی:
یک برنامه به زبان سی یا هر زبان دلخواه دیگر دز محیط لینوکس بنویسید و سیگنال CTRL+C (در حالت عادی از برنامه خارج میشود) را در آن مدیریت کنید (مثلا یک پیغام چاپ کند)
3. در مورد نحوه مدیریت نخ های پردازشی در زبان جاوا تحقیق کنید.
(زمان امتحان میان ترم-چهارشنبه 20 آذر ماه- مواد امتحانی شامل 5 فصل اول کتاب سیلبرشاتز میباشد و منبع امتحانی کتاب سیسلبرشاتز و اسلاید های کتاب استالینگز میباشد)
1, 2, 3, 6 ,8, 11, 13, 15 ,18
#apt-get install texmakerبعد از اتمام دستورات، میتوان برنامه texmaker را اجرا کرد. در این محیط میتوان متون انگلیسی را تایپ و آماده کرد. برای آموزش latex از فایل زیر میتوان استفاده کرد:
http://www.tug.org/twg/mactex/tutorials/ltxprimer-1.0.pdfبرای فعال سازی فارسی نویسی، نیازمند xelatex میباشیم، این نیازمندی با texmaker نصب میشود، اما باید تغییراتی برای آن اعمال کرد
#apt-get install texlive-lang-arabic texlive-latex-recommendedقلم های مورد نیاز را نصب کنید، مانند ویندوز فایل قلم را باز کنید و دکمه install را بزنید.
\documentclass{article}****توجه داشته باشید که amsmath قبل از xepersian فراخوانی شود.
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{xepersian}
\usepackage{amssymb}
\settextfont[Scale=1]{XB Niloofar}
\setlatintextfont[Scale=.9]{Times New Roman}
\setdigitfont{B Nazanin}
\title{نحوه فارسی نویسی در LATEX}
\author{حامد شیخلو}
\begin{document}
\maketitle
\begin{abstract}
چکیده مطلب
\end{abstract}
\indent\indent
\section{مقدمه}
مقدمه مطلب
\end{document}
apt install texstudio
apt install texlive-xetex
apt install install lmodern
apt install texlive-fonts-recommended