REST APIs have become a common way to establish an interface between web back-ends and front-ends, and between different web services. The simplicity of this kind of interface, and the ubiquitous support of the HTTP and HTTPS protocols across different networks and frameworks, makes it an easy choice when considering interoperability issues.
اشتراکها
یکی از دغدغههای جدی امروزه توسعه دهندگان نرم افزار در سمت Front end، توسعه برنامههای Cross Platform است. در این سری آموزشی به صورت قدم به قدم و پروژه محور میخواهیم برنامهای را برای Android/iOS/Windows توسعه دهیم که روی کامپیوتر، تبلت و موبایل به خوبی کار کند.
انتخاب ابزار درست برای شروع به کار از اهمیت شایانی برخوردار است و بد نیست در ابتدا به بررسی دلایل انتخاب ابزارهایی بپردازیم که قرار است در این دوره از آنها استفاده شود.
۱- زبان برنامه نویسی: CSharp
CSharp با وجود امکاناتی مانند Generics، Lambda Expressions، Linq، Async و ... که تا حدودی در سایر زبانها هم هستند، زبانی خوش ساختار و کاربردی است. همچنین اضافه شدن امکانات جدیدی مانند ref returns و ... نشان دهنده این است که این زبان رو به جلو در حرکت و در برخی موارد پیشرو است. اما در توسعه یک برنامه Cross Platform مواردی اهمیت پیدا میکنند که شاید توسعه دهنده نرم افزار مستقیما با آنها درگیر نشود، ولی از آنها تاثیر میپذیرد. در زبان CSharp مواردی مانند P/Invoke ،Pointers، Extern و ... جزء این دست از موارد هستند که کمک میکنند CSharp به یکی از لذت بخشترین زبان هایی تبدیل شود که قابلیت فراخوانی 100% امکانات زبانهای دیگر را بدون اما و اگرهای فراوان داشته باشد.
در سایر زبانهای Cross Platform اگر کتابخانههای توسعه داده شده و ترکیب زبانهای برنامه نویسی استفاده شده در آنها را بررسی کنید، میبینید که اگر قرار است کتابخانه مربوطه مثلا در JavaScript استفاده شود، توسعه دهنده کد، درصدی از کد را با Java، درصدی را با Swift و درصدی را با JavaScript توسعه داده است! اگر معادل همان کتابخانه را برای CSharp پیدا کنید، میبینید که تمامی قسمتهای مربوط به اندروید، iOS و ویندوز به زبان CSharp است.
برای مثال در ادامه کدهای مربوط به پروژهای را میبینید که هدف آن، ارائه متدهایی ساده برای کار با امکانات مختلف دستگاه، به صورت Cross Platform هست. مثلا برای بررسی وضعیت باطری بنویسید:
var state = Battery.State; // Charging, Full, Discharging, ...
که تماما با CSharp توسعه داده شده است.
اما معادل چنین پروژهای در هیچ زبان دیگری به صورت 100% با خود آن زبان توسعه داده نشدهاست و بیشتر مواقع با چنین چیزی مواجه میشوید:
این مسئله وقتی حائز اهمیت میشود که در پروژهتان به سمت کارهایی حرکت کنید که کمی خاص باشند و نتوانید کتابخانهای را پیدا کنید که نیازهای شما را پوشش دهد و یا از کیفیت خوبی برخوردار نباشد و ... و خلاصه بخواهید کمی بیشتر دست به کد شوید. در چنین مواقعی شما عملا درگیر چندین زبان و محیط توسعه و سیستم عامل و Debugger و ... میشوید. به هر میزان که برنامه شما خاص باشد، این هزینه افزایش پیدا میکند تا جایی که ممکن است ادامه توسعه نرم افزار را غیر ممکن کند.
در CSharp شما به صد در صد امکانات سیستم عاملها (Android/iOS/Windows/Linux/Mac/Tizen) دسترسی دارید.
۲- اجرا کننده برنامه: NET.
انتخاب NET. و کتابخانههای آن مانند Task Parallel Library - Entity Framework(Sqlite) - Noda - JSON.NET که در هر زمینهای بالاترین کیفیت ممکن را به شما ارائه میکنند به خودی خود منطقی به نظر میرسد. اما تمامی اینها در کنار سرعت اجرای NET. به صورت Native و همچنین قابلیت اجرای NET. در تمامی سیستم عاملها و همچنین امکان اجرای آن در مرورگر به کمک استاندارد Web Assembly آن را به انتخابی فوق العاده بدل میکند. سرعت گسترش محبوبیت و استفاده از NET. در دنیا نیز دلیل دیگری است برای اطمینان خاطر از انتخاب درست.
۳- Xamarin forms
Xamarin forms همه آن چیزهای پایهای است که برای نوشتن یک برنامه لازم داریم. کنترل هایی مانند ListView، Button و ...به همراه Binding - Navigation و ...
در عمل میتوانید آن را معادل Angular & Angular Material بدانید. وقتی شما فرمی را با Xamarin Forms توسعه میدهید و درون آن دکمهای است که از فرم اول، شما را به فرم دوم میبرد، میتوانید آن را در هر جایی که Xamarin forms پشتیبانی میکند، استفاده کنید. پشتیبانی Xamarin forms برای Android/iOS/Windows خوب و برای Linux/Mac/Tizen و Web در مراحل اولیه است.
در Xamarin forms شما UI کاملا Native خواهید داشت.
۴- Prism Patterns & practices
Prism همه آن چیزی است که برای نوشتن یک برنامه با کیفیت، با قابلیت نگهداری بالا و تست پذیر احتیاج داریم.
با نقش Bit و کمکهای آن در طول مسیر آموزش بیشتر آشنا خواهیم شد.
در قسمتهای بعدی به آموزش نصب و نحوه دیباگ کردن کد و ارائه پابلیش در Android-iOS-Windows خواهیم پرداخت و سپس وارد کدنویسی شده و پروژه اولیه را خواهیم ساخت و در قسمتهای بعد از آن هم کار با دیتابیس کلاینت ساید، ارتباط با سرور و ... را آموزش میبینیم.
اگر قبلا Xamarin Forms را تست کردهاید و به علت مسائلی مانند حجم بالای خروجی برنامه و یا کندی در توسعه برنامه یا اجرای آن در دستگاه مشتری آن را کنار گذاشتهاید، توصیه میکنم بار دیگر آن را با ما تست کنید و با رعایت چند نکته ساده از نوشتن برنامه Cross Platform به بهترین شکل لذت ببرید و خروجی خوبی را در نهایت به مشتریان سیستم ارائه کنید.
اشتراکها
مهاجرت به AngularJS 2.0
"Our goal with Angular 2 is to make the best possible set of tools for
building web apps not constrained by maintaining backwards compatibility
with existing APIs." —Angular blog
I’ve started looking at using MediatR for my domain events implementations. To that end, I created a quick sample project using ASP.NET Core 2.0. Overall things were pretty easy to get going. If you haven’t used MediatR before, or if you’re looking for a quick intro on how to set it up for ASP.NET Core, keep reading (if not, how did you get here? Was the title not clear?).
در این بخش قصد داریم تا به چگونگی آپلود فایل در AngularJs بپردازیم. پلاگینهای فراوانی جهت آپلود فایل وجود دارند، از جمله ng-file-Upload ، angular-file-upload و jquery-file-upload. البته نمونهی ذکر شدهی آخر، یکی از پلاگینهای معروف JQuery است که با AngularJs هم سازگار شده است.
پس از اینکه دو کامپوننت فوق را نصب نمودید، دو فایل اسکریپت دریافت شده را به فایل main html اضافه نمایید. پس آن شروع به نوشتن یک مثال ساده میکنیم.
تکه کد فوق مربوط به تگ آپلود فایل است که به توضیح آن خواهیم پرداخت. ngf-select Attribute دایرکتیوی برای تبدیل فایل آپلود، به ng-file-upload است. شما به طور کلی به دو صورت قادر هستید که این کار را انجام دهید. مورد اول ngf-select بود و مورد بعدی ngf-drop است. ngf-drop به گونهای دیگر نوشته میشود و کد زیر یک مورد استفادهی از ngf-drop میباشد.
همانطور که ملاحظه میکنید در این نوع فراخوانی، یک تگ div به یک file select مبدل شده که در مورد آن صحبت خواهیم نمود. همانطور که مشاهده میکنید، شما قادرید تا با استفاده از Attribute ایی با نام accept، فایلهای ارسالی را از لحاظ محتوایی فیلتر کنید. در کد فوق image/* این مفهوم را میرساند که شما قادرید فایلهای تصویری و با هر فرمتی را به سرور ارسال نمایید. اما اگر آن را به صورت image/jpg بنویسیم این عملیات تنها به تصاویر با فرمت jpeg منتهی میشود. مورد بعدی محدودیت حجمی تصویر است. شما با ngf-max-size و مقداری که درون آن قرار میدهید، قادرید تا محدودیت حجمی را بر روی فایلهای ارسالی به سرور اعمال نمایید. اگر با نوشتار form validationها در Angular آشنا باشید، به سادگی قادرید تا خطاهایی را که کاربر ممکن است در حین آپلود انجام دهد، به او گوشزد کنید. به کد زیر توجه کنید:
همانطور که مشاهده میکنید syntax نمایش خطاها دقیقا مانند نمایش خطاها در validation فرمهای انگیولاری است.
تمام عملیات در قالب یک فراخوانندهی ng-click از سوی view آغاز شدهاست. با این رخداد، متد uploadPic که همراه آن فایل attach شده نیز به عنوان پارامتر ارسال میگردد، فرخوانی میشود و کلیهی کارها طی عملیات post، توسط وابستگی Upload برای سرور ارسال میگردد. همانند http$ درون بلاک then سه متد Success ، Error و progress پیادهسازی شده است. البته اگر به فرایند مقداردهی Url و data توجه کنید میبینید که فایلها نیز درون data قرار گرفتهاند. شما برای ارسال فایلها میتوانید از وابستگی upload$ نیز استفاده کنید که مثالی هم در این زمینه در mono-software.com پیادهسازی شده است که از ng-file-upload و در سمت سرور، از ASP.NET Web API استفاده میکند. در این مثال چندین فایل به صورت غیر همزمان برای سرور ارسال میگردند.
ما قصد داریم تا در این مجموعه از ng-file-upload که توسط Danial Farid توسعه داده شده است، استفاده نماییم. این پلاگین شامل یک دایرکتیو کم حجم برای مدیریت آپلود فایل سمت کلاینت است و با تمامی تکنولوژیهای سمت سرور سازگار میباشد. صفحهی دمو پلاگین، شامل برخی از امکانات ذکر شده میباشد که قرار است به توسعه و بحث پیرامون آن بپردازیم. این مجموعه دارای اسناد معتبری است که میتوانید از آن برای توسعهی هر گونه آپلود فایل استفاده نمایید. نسخهی فعلی، نسخهی منتشر شدهی 3.0 است. نسخههای قبلی این پلاگین نیز در سایت GitHub موجود است.
ویژگی ها
در بخش زیر ویژگیهای این افزونه که در اسناد آن نیز موجود است، شرح داده شده است:
- امکان ایجاد progress bar و همچنین قابلیت لغو آپلود.
- Drag & Drop
- امکان paste کردن از Clipboard و قابلیت drag & drop از browser
- امکان resize کردن تصویر قبل از آپلود شدن
- امکان تغییر دادن orientation تصویر پیش از ارسال
- قابلیت resume و pause/play در آپلود
- امکان فیلتر کردن type، size و طول و عرض تصاویر
- قابلیت تبدیل به Flash shim در صورت عدم پشتیبانی html5 توسط مرورگر
نصب و پیاده سازی
برای استفادهی از پلاگین file upload لازم است که دو مجموعهی زیر را توسط Nuget یا Bower دریافت نمایید. پلاگین اول مربوط به مرورگرهایی است که از html5 پشتیبانی نمیکنند.
bower install ng-file-upload-shim --save bower install ng-file-upload --save
این مثال در JSFIDDLE قرار داده شده است، به این صورت که در این مثال یک فایل آپلود ساده در قالب یک فرم به سرور ارسال میگردد. امکانات خیلی ساده نظیر نمایش فایل، پیش از آپلود نیز در این قسمت قرار داده شده است.
به عنوان اولین گام به کد زیر توجه کنید:
<input type="file" ngf-select ng-model="picFile" name="file" accept="image/*" ngf-max-size="2MB" required>
<div ngf-drop ng-model="picFile" ngf-pattern="image/*"> ... </div>
<i ng-show="myForm.file.$error.required">*required</i><br> <i ng-show="myForm.file.$error.maxSize"> File too large: max is 2M </i>
و اما اینکه چه کارهایی نیاز است تا در سمت Controller انجام دهیم. اول اینکه لازم است شما dependency ngFileUpload زیر را به app.module اضافه نمایید. حال اینکه پس از inject کردن این وابستگی، تنها کافیست که وابستگی Upload را به کنترلر تزریق نمایید. این وابستگی وظیفهی ارسال فایل به سرور را بر عهده دارد. به مثال زیر توجه نمایید:
app.controller('MyCtrl', ['$scope', 'Upload', '$timeout', function ($scope, Upload, $timeout) { // the method uploadPic called from Angular View $scope.uploadPic = function(file) { file.upload = Upload.upload({ url: 'https://angular-file-upload-cors-srv.appspot.com/upload', data: {file: file, otherData: $scope.otherData}, }); file.upload.then(function (response) { // waiting for response $timeout(function () { file.result = response.data; }); }, function (response) { //error if (response.status > 0) $scope.errorMsg = response.status + ': ' + response.data; }, function (evt) { //progress file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total)); console.log(file.progress); }); } }]);
توحه داشته باشید که شما برای uploadهای ساده، قادر هستید تا دایرکتیو خاص خود را نوشته و از آن استفاده نمایید. در msdn نمونهای از این کار، یعنی نوشتن دایرکتیو فایل آپلود، به طور کامل پیادهسازی شده است. اما مزیت ng-file-upload این است که این پلاگین، با بسیاری از پلاگینهای 3rd party دیگر مانند ng-image-crop به خوبی همگام شدهاست. مثالی از آن را میتوانید در اینجا مشاهده نمایید.
در این مقاله، هدف کلی، چگونگی فایل آپلود در AngularJs و پس از آن معرفی و بررسی ویژگیها و همچنین تشریح عملکرد ng-file-upload بود. این افزونه قابلیتهای فراوان دیگری نیز دارد که بنابر نیاز میتوانید در کدهای خود از آنها استفاده نمایید.
نظرات مطالب
Protocol Buffers فرمتی برای تبادل دیتا
لطفا پیام بنده رو با دقت بخونید. من نگفتم باید کل دنیا رو به GRPC مجهز کنیم! گفتم جایی که میتونیم از خود grpc استفاده کنیم، استفاده از grpc-gateway و تبدیلش به RESTful اشتباه هست چون مزایاش رو از بین میبره. اشاره هم کردم که قطعا grpc-gateway هم کاربرد خاص خودش رو داره و کاربردشم جایی هست که کلاینت ما امکان استفاده از grpc رو نداشته باشه (مانند همون rust و swift یا آشنا نبودن برنامه نویسهای فرانت که شما هم اشاره کردید) وگرنه دلیل مقاومتتون رو متوجه نمیشم! در باره این گزاره بدیهی که وقتی از grpc استفاده میکنیم و کلاینتمون هم مشکلی نداره باهاش باز اصرار بر دفاع از grpc-gateway دارید! مثال صریح این قضیه هم در همین میکروسرویسها هست و استفاده از grpc-gateway برای ارتباطات بین میکروسرویسها اصلا توجیه پذیر نیست و توصیه نمیشه.
ضمنا همین پروژه etcd خروجی grpc داره و Go Client و CLI اش "صرفا" از grpc برای api call استفاده میکنه و از خروجی grpc-gateway رو برای کلاینت هایی که grpc ساپورت نمیکنن ارائه داده.
و در آخر به نظرم گفتگوی کاملی در این باره شده و تصمیم رو به عهده خوانندگان میسپارم و این بحث رو ادامه نمیدم و امیدوارم این گفتگو مخاطبین رو از به بیراهه کشوندنشون جلوگیری کرده باشه و به دوستان کمک کرده باشه که با "دید باز" و "آگاهی کامل"، یک ابزار رو انتخاب کنند.
نظرات مطالب
بررسی مشکلات AngularJS 1.x
بنده قصد خراب کردن این فریمورک را نداشتم. اشکالات بیان شده همگی مربوط به مقالاتی هستند که توسعه دهندگان به اشتراک گذاشتند. من هم آنها را تایید نکردم ولی وقتی میبینید که angular 2 همان اشکالات وارد شده به نسخه 1 را برطرف کرده است میتوان نتیجه گرفت که اشکالات نسخه 1 صحیح بوده اند و باید اصلاح میشدند.
بنده هم نگفتم که انگولار را یاد نگیرید، گفتم "حداقل یادگیری آن را تا انتشار نسخهی 2 آن به تعویق بیندازید."
نکته بحث "الان" هست نه گذشته. الان که قرار هست نسخهی 2 منتشر شه و تغییرات زیادی داره چه دلیلی داره پروژه جدیدی را با آن شروع کنیم و بعد شروع به تغییر کدهایمان کنیم.
بله راهنمایی برای مهاجرت از نسخهی 1 به نسخه 2 وجود دارد:
اگر با این روش با آپگرید پروژتون که ممکن است چند هزار خط داشته باشد مشکلی ندارید، معطل نکنید همین امروز پروژه جدیدتون را با انگولار آغاز کنید.
باز هم نمیگویم انگولار بد است، همین الان میشود مقاله ای برای مزیتهای نوشت. فقط قصدم این بود که به هنگام استفاده از انگولار و توسعه spa این موارد را هم در نظر داشته باشید.
نظرات مطالب
Senior Developer به چه کسی گفته می شود؟
اصولا بهترین روش برای تشخیص اینکه شما در کدام سطح قرار دارید این است که خودتون به مسیری که طی کردید تا به جایگاه فعلی برسید یک نگاه دقیق داشته باشید. اصولا اکثر برنامه نویسانی که در شرکتهای نرم افزاری مشغول به کار هستند در سطح Junior یا Mid Level هستند. در این پست تمرکز اصلی برای تشریح سطح برنامه نویس ارشد بود. متاسفانه در اکثر آگهیهای استخدام شاهد این هستیم که برنامه نویس باید با انبوهی از تکنولوژیهای آشنایی داشته باشد. مثلا حتما در آگهیها دیده اید که برنامه نویس Asp.Net MVC مسلط به JQuery و HTML و CSS و JavaScript و EF و.... بعنی باید برنامه نویس هم در لایههای سطح پایین نظیر Business و سرویس برنامه نویسی کند و هم به عنوان یک Front- End کار.
به صورت معمول زمانی که برنامه نویسان خودشون را در جایگاه Senior Developer نمیبینند از واژه Software Developer استفاده میکنند.