سادگی زیباست...

بررسی انواع معماری های سیستم عامل و برنامه های سیستمی و روشهای توسعه آنها

سادگی زیباست...

بررسی انواع معماری های سیستم عامل و برنامه های سیستمی و روشهای توسعه آنها

سادگی زیباست...
چند روز پیش یه مطلب در مورد فواید حل کردن جدول خوندم که چقدر برای تقویت تمرکز خوب هستش. اما خب، از اونجا که وقت بیکاری ندارم که یه گوشه بشینم و جدول حل کنم، رفتم سراغ گوشیم و یه برنامه جدول کلمات. متاسفانه مثل گذشته، برنامه ای که چالش داشته باشه، معمولا فراسیش وجود نداره :( :). خنده دوم برای این بود که خودم میسازمش. نتیجه کار شدن یه برنامه جدول کلمات فارسی کامل برای اندروید.

سعی کردم تو این برنامه حداکثر امکانات رو قرار بدم، مثل قابلیت زوم برای گوشی های کوچیک و یا تغییر تنظیمات برای تمامی قسمت ها. فکر کنم برنامه خوبی از آب در اومده باشه، کاربرا که راضی هستن.
لینکش برنامه تو بازار
۰ موافقین ۰ مخالفین ۰ ۰۱ اسفند ۹۲ ، ۱۹:۴۲
حامد شیخلو
کتابخانه ZMQ، یک کتابخانه برای ارتباطات غیر همگام با سرعت بالا است. این کتابخانه برای بسیاری از زبانهای برنامه نویسی دارای API میباشد و بسیار کارایی راحتی دارد. این کتابخانه یک صف پیغام (message queue) ایجاد میکند، اما بر خلاف میان افزارهای بر مبنای پیغام (message based middleware) نیازمند یک دلال پیغام (message broker) نمیباشد. این کتابخانه بسیار مشابه به یک API سوکت است.
معماری های اصلی موجود در ZMQ موارد زیر است:
  • Request-Reply: اتصال مجموعه ای از سرویس گیرنده ها به مجموعه ای از سرویس دهنده ها.
  • Publish-Subscribe: اتصال مجموعه ای از توزیع کنندگان به مجموعه ای از دریافت کنندگان. این یک مدل توزیع داده است.
  • Push-pull: یک مدل fan out/fan in که در این مدل یک صف پیغام به تمام دریافت کنندگان پوش میشود.
  • exclusive pair: اتصال دو سوکت به همدیگر به صورت جفت خاص
خود کتابخانه zmq در مورد امنیت امکانات خاصی ندارد. به منظور فراهم آوردن ارتباط امن بین دو سیستم (یا پردازش) میتوان از پروتکل SSH استفاده کرد. با استفاده از پروتکل SSH میتوان بین دو سیستم تونل ارتباطی برقرار کرد (همان کاری که برای رد کردن محدودیت اینترنتی انجام میشود).
فرض کنید که معماری زیر را داشته باشیم:
  • سیستم A دارای یک پردازش که به پورت 5556 گوش میدهد و خود سیستم دارای آدرس 192.168.10.245 است.
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)
  • سیستم B که به سیستم A متصل خواهد شد.
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 پیاده سازی شود.
در قدم بعدی میتوان با استفاده از تونل، ارتباط بین را امن کرد. در این مرحله یک تونل به صورت دستی ایجاد میشود. با دستور زیر یک ارتباط تونلی بین پورت 5557 سیستم B با پورت 5556 سیستم B توسط SSH برقرار میشود.
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, "]"

۴ موافقین ۰ مخالفین ۰ ۱۳ بهمن ۹۲ ، ۲۱:۴۹
حامد شیخلو
هسته شماره 3.13 لینوکس منتشر شد. یکی از اصلیترین ویژگی های این نسخه، قرار دادن نسخه نهایی nftables بر روی آن است. این سیستم جایگزین سیستم های iptables, ip6tables,arptables, ebtables خواهد بود. نسخه قرار داده شده بر روی هسته 3.13 نسخه کامل نیست و ویژگی های اضافی به تدریج به آن اضافه خواهد شد.
سیستم nftables با یک دستورات خط فرمان nft همراه است. این دستور جایگزین فرمان iptables خواهد بود اما ظاهر کاملا متفاوتی خواهد داشت. در صورتی که با hptables کار کده باشید، این تغییر میتوان آزار دهنده باشد، اما یک لایه هماهنگ ساز برای تبدیل دستورات iptables به nftables وجود دارد.
متاسفانه مستندات کمی برای آشنایی با این سیستم وجود دارد، در این مطلب سعی میکنیم آشنایی اولیه با این سیستم پیدا کنیم.

بررسی مثالهایی برای آشنایی

فرض کنید که میخواهید بسته های خاصی را با 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 با یک پچ قابل انجام است.

در مطلب بعدی به تغییرات معماری سیستم خواهیم پرداخت.

۱ موافقین ۰ مخالفین ۰ ۰۵ بهمن ۹۲ ، ۰۰:۳۵
حامد شیخلو

با سلام

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


اسلاید آموزشی فایروال iptables مر بوط به آزمایشگاه شبکه

http://bayanbox.ir/id/1940651557686741671


اسلاید آموزشی synchronization مربوط به درس سیستم عامل

http://bayanbox.ir/id/3131438666639153949

۳ موافقین ۰ مخالفین ۰ ۳۰ آذر ۹۲ ، ۱۴:۱۱
حامد شیخلو

این مساله برای اولین بار توسط دایجسترا مطرح شد. در کتاب سیستم عامل سیلبرشاتس به صورت زیر آمده است:

"در یک آرایشگاه به تعداد n صندلی برای انتظار موجود و یک صندلی آرایشگری موجود است. اگر مشتری در مغازه نباشد، آرایشگر در این فرصت میخوابد. اگر یک مشتری وارد مغازه شد و همه صندلی ها پر باشد، مغازه را ترک میکند، اگر آرایشگر مشغول باشد، اما صندلی انتظار موجود باشد، مشتری در یک صندلی خالی مینشیند. اگر آرایشگر خوابیده باشد، مشتری او را بیدار میکند. یک برنامه برای هماهنگ سازی مشتری و ارایشگر بنویسید."

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

  • پردازش مشتری یک تابع با عنوان getHairCut را فراخوانی میکند.
  • اگر پردازش مشتری زمانی که مغازه پر است وارد شود، میتواند balk را که چیزی بازگشت نمیدهد فراخوانی کند.
  • پردازش آرایشگر باید cutHair را فراخوانی کند.
  • زمانی که آرایشگر تابع cutHair را فراخوانی میکند، باید دقیقا یک پردازش getHairCut را فراخوانی کرده باشد.

مقدار درهی های اولیه:

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()

Hilzer’s barbershop

در کتاب استالینگز یک مساله آرایشگر پیچیده تر مطرح شده است:

"مغازه دارای سه صندلی آرایش و سه آرایشگر و همچنین یک فضای انتظار که برای مشتری های جدید. تعداد مشتری هایی که میتواند منتظر باشند، 20 نفر میباشند.

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


میتوان گفت مسائل زیر در زمانبندی باید مد نظر باشد:

  • مشتری این توابع را به ترتیب اجرا میکند: enterShop, sitOnSofa, sitInBarberChair, pay, exitShop
  • آرایشگر توابع cutHair و AcceptPayment را فراخوانی میکند.
  • مشتری در صورت پر بودن مغازه نمیتواند وارد مغازه شود.
  • اگر کاناپه پر باشد، مشتری نمیتواند sitOnSofa را اجرا کند، مگر اینکه یکی از مشتری ها sitOnBarberChair را اجرا کرده باشد.
  • اگر تمام صندلیهای آرایش پر باشد، یک مشتری که وارد مغازه میشود، نمیتواند sitOnBarberChair را اجرا کند، مگر آنکه یکی از مشتریها Pay را اجرا کرده باشد.
  • مشتری باشد ابتدا pay را اجرا کند و سپس آرایشگر acceptPayment را اجرا کند.
  • آرایشگر باید ابتدا acceptPayment را اجرا کند و سپس مشتری exitShop را اجرا کند.

دشواری مساله در مکانهایی است که باید بر روی آنها انتظار انجام شود.

مقداردهی های مساله:

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 باشد. میتوان سرویسهای ابری خصوصی و عمومی را با یکدیگر ترکیب کرد. برای مثال میتوان داده های مهم را در محیط ابری خصوصی نگه داری کرد. تمامی منابع امکان اشتراکی سازی بر روی فضای ابری را دارا میباشند. مدلهای اصلی سرویس ارائه شده به صورت زیر است:

  •  SaaS - Software as a Service
  • PaaS - Platform as a Service
  • IaaS - Infrastructure as a Service
نرم افزار به عنوان سرویس (SaaS) شامل یک کاربرد سرویس دهنده مرکزی است که از طریق کاربردهای سمت مشتری قابل دستیابی است، داده ها در سمت سرویس دهنده نگه داری میشود و از هر مکانی قابل دستیابی است.ایس معماری مشابه معماری سیستم های قدیمی است که به صورت مشتری-خدمت گذار بوده است، اما در این معماری جدی، تمامی کاربرد از طریق کاوشگر وب عرضه میشود. معماری SaaS توسط تولید کنندگان نرم افزار بسیار مورد استفاده قرار میگیرد، دلیل این امر کاهش هزینه پشتیبانی نرم افزار، افزایش قدرت کنترل بر روی سیستم، و همچنین قابلیت پشتیبانی سطح آخر میباشد. این مدل برای مشتری نیز به دلیل عدم وجود مشکلات نصب و راه اندازی بهتر میباشد.

PaaS یک انتخاب مناسب برای سازمانهایی است که خواهان کنترل بیشتری بر روی پایگاه داده (datacenter) خود میباشند امامشکلات ناشی از مدیریت شبکه و سیستم ها را نمیخواهند (یا نمیتوانند) مدیریت کنند. یک مثال برای این سیستم ها، سرویس ابری میزبان سرور وب میباشد که سازمان فراهم کننده سرویس ابری، مدیریت سخت افزار، سیستم عامل، شبکه، میزان بار کاری، تنظیم میزان بار کاری (load balancing)  و مدیریت پشتیبان گیری و دیگر مسائل را بر عهده دارد. فراهم کننده سرویس، برای مشتری راه اندازی و پیکربندی سرویس های مورد نیاز را فراهم میکند.

IaaS یک سیستم مجازی در اختیار مشتری قرار میدهد و مدیریت سخت افزار و نرم افزاری این سیستم به عهده مشتری است. سرویس دهنده در این مدل، مدیریت خود سیستم سخت افزاری و منبع انرژی و مسائل نگه داری سخت افزار را بر عهده دارد.

 واکاوی OpenStack
ساختار هسته openstack شامل اجزای زیر است:
  • OpenStack Compute: ماژول مدیریت و فراهم آوردن ماشین مجازی است. این ماژوا با عنوان Nova شناخته میشود. این ماژول ناظرهای (hypervisor)،از قبیل KVM, QEMU, LXC و XenServer  را پشتیبانی میکند. این ماژول کنترل تمامی بخشهای: شبکه بندی، پردازشگر، ذخیره سازی، حافظه اصلی، ساخت ، کنترل و حذف ماشین های مجازی، امنیت و کنترل دسترسی را بر عهده دارد. این مدیریت میتواند از طریق خط فرمان یا محیط گرافیکی وبی انجام شود.
  • OpenStack Glance: مدیریت سرویس ایمیج (image) سیستم openstack را بر عهده دارد. این زیر سیستم ایمیج های ماشین مجازی از قبیل Raw, Hyper-V, Virtual Box, QEMU/KVM و VMware(VMDK,OVF) را پشتیبانی میکند.
  • OpenStack Object Store: همانگونه که از نام این سرویس مشخص است، مدیریت ذخیره سازی را بر عهده دارد. به منظور قابلیت ذخیره سازی در تمام فرمتهای مورد نیاز، این زیر سیستم به صورت توزیع شده است. چندین لایه افزونگی و تکرار خودکار به منظور جلوگیری از پاک شدن داده ها وجود دارد و بازگردانی داده ها به صورت خودکار انجام میشود.
۲ موافقین ۰ مخالفین ۰ ۲۷ آبان ۹۲ ، ۱۶:۵۱
حامد شیخلو

در این پست، تمرینات هر جلسه قرار داده خواهد شد و زمان تحویل هر کدام نیز مشخص میشود

  • تمرینات سری چهارم:

1. تمرینات فصل دوم کتاب سیلبرشاتس، ویرایش 9. تمرینات شماره:
1,2,3,4,7,8,13,15,16,18,21,22,23

2. توضیح در مورد تکنولوژی IaaS، SaaS، PaaS

3. مساله برنامه نویسی: تمرین برنامه نویسی شماره 26 از کتاب سیلبرشاتس را انجام دهید (بعد از تمرینات کتاب، تمرینات برنامه نویسی قرار دارد).

آخرین زمان تحویل، جلسه یکشنبه، 26 آبان

  • تمرینات سری پنجم

1. تمرین برنامه نویسی: نوشتن یک برنامه رابط کاربری متنی مشابه شل لینوکس
رابط کاربری اصلی سیستم عامل لینوکس، متنی است که به عنوان ترمینال شناخته میشود. در این رابط کاربری کاربر نام برنامه مورد نظر خود را وارد میکند و محیط کاربری آن برنامه را همراه با پارامتر های مربوطه اجرا میکند. برای مثال به منظور لیست کردن محتوای یک فایل متنی از برنامه cat استفاده میشود، در رابط کاربری دستور زیر وارد میشود:
$cat <file name>

با وارد کردن این دستور، برنامه شل، برنامه cat را همراه با پارامتر آن (در اینجا نام فایل) فراخوانی میکند. بعد از اجرای برنامه منتظر دستور دیگری از ورودی میشود.

برنامه نوشته شده باید دارای ویژگی های زیر باشد:

  1. از کاربر نام برنامه را بگیرد و آن برنامه را اجرا کند
  2. قابلیت دریافت پارامتر های برنامه را داشته باشد
  3. بعد از اتمام اجرای برنامه منتظر دستورات جدید باشد
  4. دستور تغییر شاخه cd را بتواند اجرا کند
  • تمرینات سری ششم

1. تفاوت ها و شباهت های مفاهیم زیر را عنوان کنید:
MultiCore, ManyCore, MultiProcessor, Distributed System

2. تمرین برنامه نویسی:

یک برنامه به زبان سی یا هر زبان دلخواه دیگر دز محیط لینوکس بنویسید و سیگنال CTRL+C (در حالت عادی از برنامه خارج میشود) را در آن مدیریت کنید (مثلا یک پیغام چاپ کند)

3. در مورد نحوه مدیریت نخ های پردازشی در زبان جاوا تحقیق کنید.

(زمان امتحان میان ترم-چهارشنبه 20 آذر ماه- مواد امتحانی شامل 5 فصل اول کتاب سیلبرشاتز میباشد و منبع امتحانی کتاب سیسلبرشاتز و اسلاید های کتاب استالینگز میباشد)

  • تمرینات سری هفتم

1. تمرینات فصل چهارم کتاب سیلبرشاتس، ویرایش 9. تمرینات شماره:
1, 2, 3, 6 ,8, 11, 13, 15 ,18
    ۵ موافقین ۰ مخالفین ۰ ۱۹ آبان ۹۲ ، ۱۴:۱۶
    حامد شیخلو
    به منظور نوشتن مطلب فارسی در محیط latex نیازمندی اصلی، نصب برنامه texmaker است، در محیط مبتنی بر debian از دستورات زیر استفاده میکنیم
    #apt-get install texmaker
    بعد از اتمام دستورات، میتوان برنامه texmaker را اجرا کرد. در این محیط میتوان متون انگلیسی را تایپ و آماده کرد. برای آموزش latex از فایل زیر میتوان استفاده کرد:
    http://www.tug.org/twg/mactex/tutorials/ltxprimer-1.0.pdf
    برای فعال سازی فارسی نویسی، نیازمند xelatex میباشیم، این نیازمندی با texmaker نصب میشود، اما باید تغییراتی برای آن اعمال کرد
    اولین مرحله،‌فعال سازی قابلیت کامپایل با xelatex است، برای این منظور از منوی
    User-> User commands -> Edit User Commands
    را انتخاب میکنیم، در پنجره باز شده،‌ به صورت زیر عمل میکنیم:


    بسته های زیر را نصب کنید:
    #apt-get install texlive-lang-arabic texlive-latex-recommended
    قلم های مورد نیاز را نصب کنید، مانند ویندوز فایل قلم را باز کنید و دکمه install را بزنید.
    برای تست،‌ از مثال زیر استفاده کنید:
    \documentclass{article}
    \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}
    ****توجه داشته باشید که amsmath قبل از xepersian فراخوانی شود.
    برای اجرا ابتدا برنامه texmaker را باز کنید و کد بالا را در آن بنویسید،‌ از منوی کمپایل xelatex را انتخاب کنید و کامپایل را انجام دهید.

    برای نصب texStudio و بسته های مورد نیاز از روش زیر هم میتونین استفاده کنید:
    apt install texstudio
    apt install texlive-xetex
    apt install install lmodern
    apt install texlive-fonts-recommended





    ۲ موافقین ۱ مخالفین ۰ ۱۶ آبان ۹۲ ، ۲۲:۴۷
    حامد شیخلو
    لینوس توروالدز چند روز پیش گفت که بعد از نسخه 3.19 شماره گذاری لینوکس بر پایه 4 انجام میشه. اگر دو سال پیش برگردیم و شماره گذاری رو مرور کنیم، واقعاً برای خودش به معضل شده بود. شماره نسخه اصلی با n تا مینور ورژن بعدش که x تا هم پچ روش بود. عرضه نسخه 3 خیلی خوب بودش، تغییرات هم برای یه نسخه ماژور انصافا در حد قابل قبولی بود. اما اینکه بعد از یه تعداد مستر ورژن، صرفا با تاکید بر خود عدد یه نسخه ماژور عوض به شه یکم منطقی نیست. نسخه lts هم که تو ورژن 3.2 بسته شده. حالا این تغییر به نسخه 4 که احتمالاً تا آخر امسال اتفاق بیافته امیدوارم تو نسخه lts تأثیر مخرب نداشته باشه.
    ۰ موافقین ۰ مخالفین ۰ ۱۵ آبان ۹۲ ، ۱۳:۵۹
    حامد شیخلو