مهدی نوری توی پرسش و پاسخ ارائهاش در irlogcat یه اشاره کوچیکی به Json Schema کرد، دیروز در موردش سرچ کردم و فهمیدم یکی از چالشهایی که خودمون با تعریف قرارداد بین کلاینت و سرور حل میکردیم رو با تعریف استاندارد حل کردن.😃
اگر توسعهدهندهی موبایل باشید یا برای کلاینتها وبسرویس نوشته باشید، احتمالا درگیر فرمهای داینامیک شدید. بطور مثال توی پروژههای املاک در موقع ثبت ملک، اطلاعاتی که کاربر وارد میکنه براساس نوع ملک تغییر میکنه. مثال دیگه پروژههای ثبت آگهی هستند، براساس اینکه کاربر چه دستهبندی رو انتخاب میکنه، باید اطلاعات متفاوتی رو در مورد آگهی بنویسه. حالا وقتی کاربر روی دکمهی ثبت میزنه، کلاینت باید اطلاعات کاربر رو بصورت جیسان به سرور بفرسته تا در اونجا ثبت بشن.
اینکه اون جیسان باید چه فیلدهایی داشته باشه، ولیدیشنشون چطور باشه، تایپ فیلدها چی باشه و … رو باید یه جوری مشخص کرد تا کلاینت بفهمتش و ازش توی ساخت جیسان کمک بگیره🤕. ما خودمون برای حل این مشکل بین کلاینت و سرور یه سری قرارداد تعریف میکردیم که کلاینت بتونه لیست فیلدهای فرم رو در از یه URL بگیره، کنار هر فیلد مشخص شده تایپش چیه و از چه RegEx برای ولیدیشنش باید استفاده بشه و …
حالا با وجود JSON Schema دیگه میشه بصورت استاندارد اینکارو کرد و schema جیسان رو از طریق یه جیسان دیگه تعریف کرد. یجورایی میتونید باهاش برای جیسانهاتون داکیومنت بنویسید! جیسان زیر رو در نظر بگیرید:
1 2 3 4 5 6 |
{ "productId": 1, "productName": "A green door", "price": 12.50, "tags": [ "home", "green" ] } |
الان کلاینت از روی این نمیتونه بفهمه که توی جیسان کدوم فیلدها اجباریه، تایپ productId چیه یا … ، ولی با استفاده از Json Schema یه همچین چیزی میشه درست کرد که کلاینت اطلاعات کاملتری از فیلدها داشته باشه:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ ... "title": "Product", "description": "A product from Acme's catalog", "type": "object", "properties": { "productId": { "description": "The unique identifier for a product", "type": "integer" } }, "required": [ "productId" ] } |
مثلا تایپ productId از نوع Integer هست و حتما باید جیسانی که به سرور میره productId رو داشته باشه.
توی سایتش اطلاعات خیلی بیشتری میتونید پیدا کنید:
برای یادگیریش هم از این لینک استفاده کنید، همین مثال Productیی که نوشتمو توی این لینک خیلی کامل توضیح داده:
https://json-schema.org/learn/getting-started-step-by-step.html
امروز بالاخره فرصت شد تا قسمت Smithereens از فصل جدید سریال Black Mirror رو ببینم. خیلی ذهنمو درگیر خودش کرد و باعث شد تا بیام اینجا در مورد چیزهایی که گاهی بهشون فکر میکنم صحبت کنم😃. البته الان هدفم این نیست که خودم نتیجه گیری کنم و بیشتر دنبال این هستم که یه سری موضوع مطرح بشن تا بشه بیشتر در موردشون صحبت کرد. ادامه …
این مقاله بیشتر از اینکه یه مقالهی تخصصی از یه متخصص اسپرینگ و داکر باشه، داستان آخر هفتهایه که به کلنجار رفتن با داکر و پلتفرم فندق گذشت. قضیه از اینجا شروع شد که قبلا برای پایاننامهام یه وب اپلیکیشن با اسپرینگ بوت (و دیتابیس PostgreSQL) درست کرده بودم و از VPSها برای هاستش استفاده میکردم. با توجه به اینکه هزینههای VPS خیلی زیاده، همیشه به مشکل میخوردم. چند وقت پیش توی توییتر دیدم یه پلتفرم Paas به اسم فندق توی ایران درست شده که سرویس رایگان هم داره. واسه همین کنجکاو شدم تا ببینم میشه ازش برای کارم استفاده کنم یا نه.
برای شروع فکرکنم بهتر باشه اول یکم در مورد کلمههای توی این مقاله مثل داکرایز، فندق، اسپرینگ بوت و … صحبت کنیم. ادامه …
متاسفانه نظام آموزشی کشور ما در مدرسه و دانشگاه (به جزء دانشگاهها و مدارس خاص) جوری بوده که یادگیری هر موضوعی رو به دو بخش کاملا متفاوت تئوری و عملی تقسیم کرده. در ذهن بیشتر افراد، یادگیری تئوری یه روش خستهکننده و بی فایده هست اما یادگیری عملی روشی جذاب و مفید به حساب میاد. این شکاف توی کارهایی مثل برنامهنویسی خیلی عمیقتره! خیلی از افراد فقط آموزشهایی رو مطالعه میکنند که توی هر پاراگراف حداقل یه خط کد بهشون یاد بده وگرنه خوندن اون آموزش یا کتاب رو بیارزش و وقت تلف کردن میدونن.
این طرز تفکر باعث میشه که بیشتر افراد برای یادگیری برنامهنویسی روش پروژه محور رو انتخاب کنند. این انتخاب به خودی خود مشکلی نداره ولی مشکل اونجاست که بنظر من درک درستی از یادگیری پروژه محور ندارند. معمولا یادگیری پروژه محورشون شبیه فرآیند زیر هست: ادامه …
قدیما اگر کسی میخواست یک پروژهی نرمافزاری رو بینقص انجام بده، زمان زیادی رو برای تحلیل و توسعه صرف میکرد تا در انتها نرمافزاری که از نظر خودش عالی بود رو بتونه تحویل بده. ولی دیگه مشخص شده که این روش خیلی خوب نتیجه نمیده، بهتره پروژه بصورت چرخهی تکرار شونده (مثلا توسعه،تست،تحویل) انجام بشه که در آخر هر چرخه هم یک محصول قابل ارائه وجود داشته باشه. ادامه …
خیلی از شرکتها و افراد از نبود نیروی کار متخصص صحبت میکنند ولی به این نکته دقت نمیکنند که خودشون توی این قضیه نقش دارند. درسته بالاخره در هر شرایطی افرادی با تلاش و پشتکار خودشون به تخصص میرسن ولی وقتی که شرکتها زیاد میشن و همشون نیروی کار متخصص میخوان، دیگه تعداد افراد این مدلی کافی نیست! و نیاز هس هر شرکتی به اندازهی خودش به رشد نیروهای متخصص کمک کنه. شرکتها میتونن حداقل با دوتا کار به رفع مشکل کمبود نیروی متخصص کمک کنند: ادامه …
خیلی وقت بود که دوست داشتم روی اپهای ماژولار کار کنم، این دوست داشتن مقدمهی یه هفتهای مطالعه و تست بود که در نهایت خروجیش تبدیل به ریپوی AndroidModularization توی گیتهاب شد. در کنار هدف اصلی (اپ ماژولار) یه هدف فرعی هم داشتم که یه نمونه کد authentication با قابلیت رفرش شدن توکن برای وبسرویس moviesapi.ir درست کنم. اگر بخوام خلاصش کنم میشه این پروژه یه اپ ماژولار هست که از قابلیتهای وبسرویس moviesapi.ir استفاده میکنه.
توی توسعه این پروژه از کتابخونههایی مثل Rxjava ,Dagger2 ,Retrofit, Room , Databinding و … استفاده شده ولی تمرکز اصلی روی ساخت اپ ماژولار با استفاده از Dagger2 بوده. یعنی اگر میخواید RxJava یاد بگیرید، توی این پروژه نباید دنبال Best Practiceهاش باشید.
روزی که جنریتور “حلما” رو درست کردم، تصمیم گرفتم Open Sourceش کنم. چون اولین بار بود که میخواستم اینکارو بکنم، هیچ ایدهای نداشتم که از کجا باید شروع کرد یا باید به چه نکاتی توجه کنم. به همین دلیل، پیش یکی از بهترین دوستام به اسم گوگل!! رفتم تا مثل همیشه کمکم کنه، توی گوگل با کلیدواژههای start، open source و how جستجو کردم. بیشتر مقالههایی که آورد رو خوندم، یه تعدادیشون نکتههای خیلی خوب داشتند، این نکتههارو توی Evernote نوشتم تا سرفرصت تبدیلشون کنم به این مقالهای که الان میخونید. ادامه …
هر موقع در مورد اینکه توی شرکتهای خوب خارجی TDD کار میکنند صحبت میشد، پیش خودم میگفتم که خب توی ایران با توجه به ددلاینهای پروژه، اخلاق کارفرما و … نمیشه مثل اونا بود وگرنه منم حتما TDD کار میکردم. برای خودم تست ننوشتن رو همینجوری توجیه میکردم تا اینکه تصمیم گرفتم یه پروژه که فرصت زیاد داشت رو بصورت TDD انجام بدم. همیشه فکرمیکردم Unit Testing خیلی راحته و اگر توی تست نوشتن بخوام جاییش گیر کنم قسمت Integration Testing و End to End Testing هست. ولی همون اول کار تا شروع به Unit Test نوشتن کردم، برام کلی سوال جورواجور پیش اومد! مثلا چطوری باید تستهارو نامگذاری کرد؟ چطوری میشه متدهایی که نیاز دارند با پارامترهای زیاد تست بشن رو تست کرد؟ حتما باید برای تست نوشتن از mockito استفاده کرد یا نه؟ ادامه …
میخواستم وقتی رسپبریپای خریدم، از کارهای جالبی که باهاش میکنم توی کانال و بلاگم بنویسم! ولی خب متاسفانه خیلی فرصت نمیشه سراغش برم، این تعطیلات چند روزه باعث شد تا بعد مدتها سعی کنم کارهایی که میخواستم باهاش انجام بدم رو عملی کنم. مهمترین کارم این بود که بجای وصل کردن لپتاپ به تلویزیون از رسپبریپای برای دیدن سریال یا ویدئوهای یوتیوب استفاده کنم. یه روزی درگیر این بودم که یه فیلم FullHD رو روی رسپبریپای با زیرنویس فارسی اجرا کنم که آخرشم نشد. (البته میخواستم اینکار رو روی Raspbian انجام بدم، OMXPlayer فیلمو خیلی خوب پخش میکرد ولی با زیرنویس فارسی مشکل داشت)
به این فکرمیکردم که چیکار کنم، یادم افتاد تلویزیون یه بخشی داره که مستقیم به یوتیوب وصل میشه ولی خب اینترنت ایران اون رو باز نمیکنه. درواقع اگر من بتونم یه شبکهای داشته باشم که این قضیه دسترسی رو حل کنه! نه تنها میتونم با همون تلویزیون ویدئوهای یوتیوب رو ببینم، هرجایی که مشکلاتی از قبیل تحریم و دسترسی داشتم (مثل کنسول PS4 یا بیلد کردن پروژههای اندروید) با وصل شدن به این شبکه حل میشه!
مودمم که این قابلیت رو نداره، پس تنها راه همون رسپبریپای بود. با کمی سرچ کردن توی گوگل آموزش ساخت هاتاسپات با رسپبریپای رو پیدا کردم و بعد رفع یکی دو تا مشکل که در ادامه توضح دادم، تونستم کاری که میخوام رو بکنم. ادامه …