Finbuckle.MultiTenant is an open source framework for multitenant support in ASP.NET Core 2.0+ applications. Check out the GitHub repository for source code and samples or to provide feedback and suggestions.
پشتیبانی رسمی RethinkDB از Windows
آموزش Multithreaded Debugging
ابتدا از طریق فرمت protocol buffer، فایلهای خود را که قرار است انتقال داده شوند، مینویسیم.
سپس بصورت خودکار برای زبان برنامه نویسی مطبوع خود آن را generate میکنیم.
کدهای تولید شده بصورت خودکار و کاملا آماده هستند و ضمن اینکه encode/decode شدن بصورت خودکار توسط فریم ورک انجام شده و قابلیت تعامل بین زبانهای مختلف برنامه نویسی یا سرویسهای مختلف برقرار است.
نکته:
- بعضی از دیتابیسها از فرمت protocol buffers پشتیبانی میکنند.
- اکثر فریم ورکهای RPC شامل gRPC از پروتکل بافر برای تبادل دیتا استفاده میکنند.
- گوگل برای تمام سرویسهای داخلی خود از آن استفاده میکند.
- بعضی از پروژههای خیلی بزرگ مثل etcd از پروتکل بافر برای تبادل دیتا استفاده میکنند.
- ما در این مقاله از ورژن 3 پروتکل بافر استفاده میکنیم.
نصب Code generator
برای اینکه بتوانیم از طریق فایلهایی که میسازیم کدهای generate شده را تولید کنیم، احتیاج به کامپایلر مربوطه را داریم.
اگر از MacOSX استفاده میکنید، به راحتی با استفاده از دستور زیر میتوانید آن را نصب کنید:
brew install protobuf
اگر هم از ویندوز استفاده میکنید، از این طریق میتوانید نسخهی مورد نظر را به راحتی دانلود و مورد استفاده قرار بدهید:
https://github.com/google/protobuf/releases https://github.com/google/protobuf/releases/download/v3.5.1/protoc-3.5.1-win32.zip
حالا میخواهیم اولین فایل خود را با این فرمت بسازیم.
اول از همه با هم نگاهی به ساختار فایل مربوطه میاندازیم:
همانطور که در تصویر فوق میبینید، همه چیز به سادگی مشخص است؛ ورژن 3 که آخرین ورژن پروتکل بافر میباشد، آیتمی به نام MyMessage با پراپرتیهایی مشخص شده از Type بخصوص، تعریف شدهاند، تگها هم باید به ترتیب وارد شده باشند.
حالا میخواهیم بصورت واقعی protocol buffer خود را طراحی کرده و سپس از روی آن کدهای مربوطه را generate نماییم؛ به نام sample.proto بصورت زیر:
syntax = "proto3"; package helloworld; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
در فایل فوق علاوه بر تعریفهای اولیه، یک سرویس را هم اضافه کردهایم و همچنین متدی را با ورودی و خروجیهای مشخصی ایجاد کردهایم (امکانات پروتکل بافر خیلی بیشتر از این موارد است؛ از جمله فرمتهای آرایه و غیره را نیز پشتیبانی میکند، همچنین از روشی برای versioning استفاده میکند که obsolete کردن پراپرتیها و نسخه بندی را بسیار راحت میکند و ...). به سادگی قابلیت طراحی و پیاده سازی سرور و کلاینت مربوط به این آیتم ایجاد شده با استفاده از زبانهای برنامه نویسی مختلف فراهم میباشد. حال کافیاست که پروتکل بافر خود را با زبان دلخواه خود generate کنیم. در قسمت زیر برای زبانهای برنامه نویسی Go و #C، کدها را تولید میکنیم.
protoc sample.proto --go_out=plugins=grpc:.
protoc sample.proto --csharp_out=.
بعد از تولید شدن کدها با استفاده از زبان برنامه نویسی دلخواه خود میتوانید مشاهد کنید سرویس ها، تایپها و غیره همگی ساخته شدهاند و کاملا آمادهی استفاده هستند.
در مقالهی بعدی به آشنایی با gRPC میپردازیم و ضمن اینکه یک سرور با #C و یک کلاینت با زبان برنامه نویسی Go را نوشته که از طریق پروتکل بافر با هم به تبادل اطلاعات میپردازند!
<div ng-repeat="item in items"> <div ng-if="setting.header">{{item.header}}</div> <div>{{item.title}}</div> <div ng-if="setting.footer">{{item.footer}}</div> </div>
<div ng-if="setting.header && setting.footer"> <div ng-repeat="item in items"> <div>{{item.header}}</div> <div>{{item.title}}</div> <div>{{item.footer}}</div> </div> </div> <div ng-if="setting.header && setting.footer==false"> <div ng-repeat="item in items"> <div>{{item.header}}</div> <div>{{item.title}}</div> </div> </div> <div ng-if="setting.header==false && setting.footer"> <div ng-repeat="item in items"> <div>{{item.title}}</div> <div>{{item.footer}}</div> </div> </div> <div ng-if="setting.header==false && setting.footer==false"> <div ng-repeat="item in items"> <div>{{item.title}}</div> </div> </div>
حلقه های تکرار
انواع حلقههای تکرار
- حلقه تکرار for in
- حلقه تکرار for to
- حلقه تکرار while do
در ادامه به بررسی و پیاده سازی مثال برای هر سه حلقه میپردازیم
#1 حلقه for سادهlet list1 = [ 1; 5; 100; 450; 788 ] for i in list1 do printfn "%d" i
1 5 100 450 788
for i in 1 .. 2 .. 10 do printf "%d " i
1 3 5 7 9
for c in 'a' .. 'z' do printf "%c " c
a b c d e f g h i j k l m n o p q r s t u v w x y z
for i in 10 .. -1 .. 1 do printf "%d " i
10 9 8 7 6 5 4 3 2 1
let beginning x y = x - 2*y let ending x y = x + 2*y for i in (beginning x y) .. (ending x y) do printf "%d " i
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
for i = 1 to 10 do printf "%d " i
1 2 3 4 5 6 7 8 9 10
for i = 10 downto 1 do printf "%d " i
10 9 8 7 6 5 4 3 2 1
for i = (beginning x y) to (ending x y) do printf "%d " i
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#9 حلقه while do
ساختار کلی آن به صورت زیر است.
while test-expression do body-expression
open System let main() = let password = "monkey"//شناسه برای مقدار رمز عبور let mutable guess = String.Empty// شناسه برای حدس رمز عبور let mutable attempts = 0//تعداد دفعات تست while password <> guess && attempts < 3 do// تا زمانی که رمز عبور با حدس آن برابر نیست و تعداد دفعات تکرار کمتر از سه است Console.Write("What's the password? ")//چاپ پیغام در خروجی attempts <- attempts + 1//مقدار دفعات یکی افزایش مییابد guess <- Console.ReadLine()// حدس رمز عبور از ورودی دریافت میشود if password = guess then// اگر رمز عبور با حدس آن یکی بود Console.WriteLine("You got the password right!")// پیغام موفقیت else Console.WriteLine("You didn't guess the password")//پیغام عدم موفقیت Console.ReadKey(true) |> ignore//منتظر ورودی برای خروج از برنامه