بایگانی دسته: وبلاگ

راهنمای کامل استفاده از Blazor در Asp.Net Core

راهنمای کامل استفاده از Blazor در Asp.Net Core


مهندسین فناوری اطلاعات توسعه دهنده ما امروز با یک وبلاگ عالی دیگر بازگشته اند. امروز ما Blazor را در Asp.Net و روش صحیح پیکربندی محیط توسعه با یک نمونه برنامه مورد بحث قرار خواهیم داد.

در حال حاضر چگونه برنامه های وب را توسعه می دهیم؟

توسعه یک برنامه وب فرآیندی است که به چندین چیز نیاز دارد. یکی از این موارد توسعه سمت سرور و دیگری توسعه سمت مشتری است. در مورد توسعه سمت سرور، ما از زبان های سمت سرور مانند C#، Java، PHP و غیره استفاده می کنیم. از طرف دیگر، توسعه سمت کلاینت از انواع چارچوب های JS از جمله React، Angular و Vue استفاده می کند.

یادگیری زبان هم از سرور و هم از مشتری برای جلوتر ماندن از رقبا مهم است. با این حال، در عصر مدرن، یادگیری دو نوع زبان مختلف برای ایجاد برنامه های کاربردی وب کاملاً معکوس به نظر می رسد.

آیا می توانیم از سی # برای توسعه سرور و مشتری استفاده کنیم؟

بله، امکان استفاده از سی شارپ برای هر دو نوع توسعه وجود دارد و این کار با کمک Blazor انجام می شود که رابط کاربری تعاملی وب ایجاد می کند. این امر به کاهش نیاز توسعه دهندگان به یادگیری جاوا اسکریپت همراه با C کمک می کند و روند توسعه را هموار می کند. کد C # هم روی سرور و هم در مرورگر مشتری کار می کند و به توسعه دهندگان این امکان را می دهد تا به جای یادگیری مهارت های کاملاً جدید، با مهارت های موجود کار کنند.

بلزور چیست؟

Blazor مجموعه ای از ابزارهای ایجاد شده توسط تیم Microsoft ASP.NET برای برنامه های کلاینت دات نت و WebAssembly است.

  • Blazor بر روی ابزارهای وب موجود مانند HTML و CSS ساخته شده است و از سی # و سینتکس Razor به جای جاوا اسکریپت برای رابط کاربری وب استفاده می کند.
  • همچنین مزایای یک برنامه غنی و مدرن یک صفحه ای را با استفاده از دات نت به صورت سرتاسری به شما می دهد.
  • Blazor اساساً Razor و C # را در یک پروژه مشتری که فقط در یک مرورگر وب اجرا می شود ترکیب می کند.

چگونه مرورگر می تواند کد C # را اجرا کند؟

به طور کلی، مرورگرها فقط کد جاوا اسکریپت را اجرا می کنند و در نتیجه ممکن است اجرای کد C# در مرورگر شما غیرممکن به نظر برسد. با این حال، این کار با ابزار کمتر شناخته شده ای به نام WebAssembly انجام می شود.

WebAssembly یک زبان سطح پایین است که از لحاظ استفاده از فرمت باینری کاملاً شبیه به اسمبلر است. با این حال، این می تواند در یک مرورگر وب مدرن کار کند. Blazor کد C # را در مرورگر با استفاده از WebAssembly اجرا می کند. این به آن اجازه می دهد تا در محیط امنیتی ایمن مانند JavaScript Frameworks اجرا شود، همانطور که React انجام می دهد. این به توسعه دهندگان اجازه می دهد تا تقریباً از هر زبان برنامه نویسی مرورگر استفاده کنند، نه فقط C#.

WebAssembly بر اساس استانداردهای مختلف وب باز است و بخشی طبیعی از تمام مرورگرهای وب مدرن، از جمله مرورگرهای ساخته شده برای دستگاه های تلفن همراه است. در نتیجه، نیاز خاصی برای اجرای برنامه های Blazor بر روی دستگاه کاربر شما وجود ندارد و در نتیجه احتمال ایجاد مزاحمت های غیر ضروری برای آنها کاهش می یابد.

مدل های هاست بلزور

Blazor دو مدل میزبانی مختلف را در اختیار توسعه دهندگان قرار می دهد. اینها Blazor WebAssembly هستند که در سمت کلاینت اجرا می شوند و Blazor Server که در سمت سرور اجرا می شوند.

Blazor WebAssembly

Blazor WebAssembly مدل میزبانی سمت مشتری است و مستقیماً در مرورگر WebAssembly کار می کند. بنابراین، هر چیزی که یک برنامه نیاز دارد مستقیماً در مرورگر دانلود می شود (کد برنامه کامپایل شده، وابستگی ها و زمان اجرا دات نت).

حرفه ای ها:

  • Blazor WebAssembly در واقع نیازی به اتصال فعال به سرور ندارد.
  • از منابع مشتری استفاده می کند و بنابراین بار روی سیستم سرور شما را کاهش می دهد.
  • Blazor WebAssembly برای میزبانی برنامه به یک وب سرور کامل ASP.NET Core نیاز ندارد.

معایب:

  • پردازش اولین درخواست Blazor WebAssembly کمی زمان می برد، زیرا کل برنامه وب و داده های مورد نیاز خود را در مرورگر مشتری دانلود می کند.
  • همچنین به قابلیت های مرورگر مورد استفاده مشتری محدود می شود.
  • برنامه وب شما ممکن است خیلی سختگیرانه نباشد، زیرا کاربران شما ممکن است سخت افزار مناسبی از سوی مشتری برای پشتیبانی از آن نداشته باشند.

سرور Blazor

سرور Blazor یک مدل میزبانی سرور نامیده می شود که برنامه وب را روی سرور شما اجرا می کند و آن را از یک برنامه ASP.NET Core می سازد. این همچنین به یک اتصال SignalR بین سرور و مشتری نیاز دارد. هر بار که یک رویداد در سیستم مشتری رخ می دهد، اطلاعات آن از طریق اتصال منتقل می شود و توسط سرور پردازش می شود، که تفاوت را برای HTML تولید شده محاسبه می کند.

سپس، به جای ارسال مجدد تمام HTML از طریق پیوند، سرور فقط تفاوت را ارسال می کند تا زمان پاسخ را کاهش دهد. سپس توسط مرورگر به روز می شود.

Blazor از معماری برنامه تک صفحه ای استفاده می کند که به صورت پویا همان صفحه را در پاسخ به اقدامات کاربر بازنویسی می کند، مانند مورد React.

حرفه ای ها:

  • برنامه وب بسیار سریعتر بارگیری می شود، زیرا بارگیری اولیه در مرورگر مشتری به میزان قابل توجهی کاهش می یابد.
  • سرور Blazor می تواند از منابع سرور شما استفاده کند.
  • مشتری شما برای استفاده از برنامه وب فقط به مرورگر نیاز دارد.
  • برنامه بسیار امن تر است زیرا کد آن توسط مشتری ارسال نمی شود.

معایب:

  • برنامه برای میزبانی به یک هسته کامل ASP.NET نیاز دارد.
  • سرور Blazor همیشه به یک اتصال فعال به سرور نیاز دارد.
  • برنامه ممکن است به دلیل سفر دو طرفه داده در هر رویداد تاخیر داشته باشد.
  • مقیاس پذیری برنامه با Blazor Server بسیار دشوارتر از Blazor WebAssembly است.

چرا بلزور؟

Blazor با دادن دسترسی کاربران به سیستم توسعه کامل پشته با چارچوب دات نت، توسعه وب را بسیار آسان تر و پربارتر می کند. مزایایی که با Blazor دریافت می کنید در اینجا آمده است:

  1. دات نت دارای مجموعه بزرگی از APIها است که همه آنها با Blazor در دسترس هستند.
  2. از زبان های مدرن مختلف مانند C# می توان برای آسان تر کردن و جالب تر کردن فرآیند توسعه استفاده کرد.
  3. Blazor را می توان به راحتی در Visual Studio و Visual Studio Code کدگذاری کرد که بهترین IDE ها در همه پلتفرم ها هستند.
  4. Blazor مزایای عملکرد مختلفی را ارائه می دهد و بسته به مدل میزبانی که استفاده می کنید توسعه را بسیار آسان می کند.
  5. Blazor همچنین از ویژگی های چارچوب SPA (برنامه تک صفحه ای) مانند:
    • مسیریابی
    • لوازم تزئینی
    • تزریق اعتیاد
    • تعامل با جاوا اسکریپت
    • فرم ها و اعتبار سنجی
    • نمایش سرور

کجا می توانیم از Blazor استفاده کنیم؟

Blazor WebAssembly را می توان در هر مرورگر مدرنی استفاده کرد و تنها شرط آن این است که دستگاه مشتری از برنامه وب شما با منابع مورد نیاز پشتیبانی کند. لیست مرورگرهای پشتیبانی شده توسط Blazor به شرح زیر است:

  • IE
  • لبه، پایان
  • فایرفاکس
  • کروم
  • سافاری
  • IOS Safari
  • اپرا مینی
  • مرورگر اندروید
  • مرورگر بلک بری
  • اپرا موبایل
  • کروم برای اندروید
  • فایرفاکس برای آندروید
  • IE Mobile
  • مرورگر UC برای اندروید
  • اینترنت سامسونگ

راه اندازی محیط

برای راه اندازی Blazor بر روی ماشین محلی خود، به دو چیز نیاز دارید، یعنی. NET SDK 3.1 یا بالاتر و IDE (محیط توسعه یکپارچه).

1 Net SDK 3.1 یا جدیدتر را نصب کنید:

ابتدا باید نصب کنیدNET SDK 3.1یا هر نسخه بعدی برای بررسی اینکه آیا NET Core SDK روی دستگاه شما نصب شده است یا خیر، وارد کنیدDotnet-list-SDKدر خط فرمان دستور داده و مانند تصویر زیر اینتر را فشار دهید.

همانطور که در تصویر بالا مشاهده می کنید، در دستگاه من، اگر متوجه شدیدNET Core SDK 5.0.401نصب شد. اگر .NET Core SDK 3.1 یا بالاتر را نصب نکرده اید، لطفاً آن را از این URL نصب کنید.

2. محیط توسعه یکپارچه (IDE) برای توسعه برنامه Blazor:

برای توسعه اپلیکیشن Blazor می توانید از هر یک از IDE های زیر استفاده کنید.

  • ویژوال استودیو 2019
  • کد ویژوال استودیو
  • Net Core CLI

بیا شروع کنیم

از آنجایی که همه چیز آماده است و کار می کند، بیایید شروع کنیم:

1. ما 2 پروژه Blazor ایجاد خواهیم کرد. یکی از پروژه های Blazor توسط سرور (Blazor Server App) و دیگری توسط مشتری (Blazor WebAssembly App) میزبانی می شود. ویژوال استودیو 2019 را باز کنید و روی گزینه Create New Project کلیک کنید، همانطور که در تصویر زیر نشان داده شده است:

2. وقتی روی گزینه Create New Project کلیک کنید، پنجره Create New Project باز می شود. در جعبه متن جستجو، Blazor را جستجو کنید و در اینجا دو گزینه برای ایجاد پروژه های Blazor پیدا خواهید کرد، مانند شکل زیر:

ابتدا گزینه Blazor Server App را انتخاب کرده و مانند تصویر بالا روی دکمه Next کلیک کنید.

3. با کلیک بر روی دکمه Next، پنجره پیکربندی پروژه جدید باز می شود. در اینجا باید نام پروژه (BlazorServer) و مکانی را که می خواهید پروژه ایجاد کنید را مشخص کنید. همچنین نام راه حل (BlazorApplication) را مشخص کرده و در نهایت کلیک کنیدمورد بعدیهمانطور که در تصویر زیر نشان داده شده است را فشار دهید.

4. با کلیک بر روی دکمه Next، پنجره با اطلاعات اضافی باز می شود. در اینجا باید نسخه هدف دات نت فریم ورک، انواع احراز هویت و غیره را انتخاب کنید. .NET 5.0 که نسخه فعلی است را انتخاب کنید و به سادگی روی دکمه Create کلیک کنید، همانطور که در تصویر زیر نشان داده شده است:

5. سپس روی دکمه Create کلیک کنید، که یک برنامه سرور Blazor با ساختار فایل و پوشه پیش فرض ایجاد می کند.

6. حالا سریع یک پروژه دیگر اضافه کنید، یعنی. برای میزبانی توسط مشتری روی راه حل کلیک راست کرده و Add را انتخاب کنید اضافه کردن -> پروژه جدید … گزینه مطابق شکل زیر:

7. مشابه مرحله 2، این بار یک پنجره پروژه جدید باز می شود. الگوی اسمبلی وب را مطابق شکل زیر انتخاب کنید:

8. روی Next کلیک کنید و نام پروژه مناسب را مطابق شکل زیر وارد کنید:

9. مرحله بعدی مانند مرحله 4 است که باید فریم Target را انتخاب کرده و دکمه ایجاد را فشار دهیم، پروژه Blazor WebAssembly را در راه حل ما ایجاد می کند و به شکل زیر خواهد بود:

10. حالا بیایید راه حل خود را برای اجرای همزمان هر دو پروژه پیکربندی کنیم. بر روی راه حل کلیک راست کرده و گزینه تنظیم یک پروژه راه اندازی را از منوی زمینه انتخاب کنید. پنجره ای مانند تصویر زیر باز می شود:

مطابق تصویر بالا گزینه را انتخاب کرده و روی Apply کلیک کنید. اکنون می توانید هر دو پروژه را همزمان شروع کنید.

11. برای شروع پروژه، F5 را فشار دهید، مانند تصویر زیر، دو پنجره / تب مرورگر باز می شود:

تصویر اول توسط اپلیکیشن سرور Blazor و تصویر دوم توسط اپلیکیشن Blazor WebAssembly اجرا می شود. هر دو برنامه همانطور که انتظار می رود کار می کنند.

Blazor Server و Blazor WebAssembly تنها دو روش متفاوت برای میزبانی برنامه Blazor هستند. همه چیز در برنامه Blazor یک جزء تیغ است. اجزای سازنده بلوک های اصلی برنامه Blazor هستند. روشی که ما این کامپوننت ها را می سازیم برای برنامه سرور Blazor مانند برنامه Blazor WebAssembly یکسان است.

جزء بلزور

فایل های کامپوننت دارای پسوند .razor هستند. کامپوننت ها را می توان تودرتو، استفاده مجدد، در چندین پروژه به اشتراک گذاشت. در Solution Explorer، فایل Counter.razor را در زیر پوشه pages باز کنید. به شکل زیر خواهد بود:

اگر می بینید، ترکیبی از دو چیز است:

  1. نشانه گذاری HTML
  2. کد سی # (در بلوک کد @)

هنگامی که برنامه کامپایل می شود، کد HTML و C # به یک فراخوانی جزء تبدیل می شود و نام کلاس مانند فایل کامپوننت خواهد بود. نام کلاس جزء باید با حروف بزرگ شروع شود. در غیر این صورت با خطای کامپایل مواجه خواهید شد.

هنگامی که در مرورگر به “/ Counter” می رویم جزء Counter بالا نمایش داده می شود و این در بالای فایل به عنوان دستور صفحه @ نشان داده می شود. شما همچنین می توانید این مؤلفه را با استفاده از نحو HTML در هر مؤلفه دیگری جاسازی کنید.

نتیجه

با دنبال کردن این وبلاگ، باید بتوانید اهمیت استفاده از Blazor برای توسعه اپلیکیشن وب خود را درک کنید. اگر در حین راه اندازی یا ایجاد با مشکلی مواجه شدید، لطفاً در نظر خود در زیر دریغ نکنید و ما مطمئناً به زودی پاسخ خواهیم داد.

انتشار راهنمای کامل برای استفاده از Blazor در Asp.Net Core اولین بار در مجله DEV IT ظاهر شد.

مروری بر گردش کار ابر و XCode


اپل به تازگی از ابر XCode به عنوان بخشی از XCode 13 در WWDC 2021 رونمایی کرده است و بسیاری کنجکاو هستند که بدانند چه کار می کند و چگونه کار می کند. پاسخ بسیاری از سوالات خود در مورد فضای ابری XCode را در این پست خواهید یافت که با دقت توسط مهندسان DEV IT ما ساخته شده است. بیایید مستقیم وارد آن شویم.

ابر XCode چیست؟

ابر XCode یک سیستم یکپارچه سازی و تحویل مداوم (CI / CD) است که شامل XCode، TestFlight و App Store Connect و همچنین ابزارهای دیگر برای توسعه برنامه ها و چارچوب ها برای پلتفرم های اپل است.

یکپارچه سازی و تحویل مداوم (CI / CD) یک روش معمولی توسعه نرم افزار است که به شما در توسعه، مدیریت و توزیع برنامه های آزمایش کننده و مشتری کمک می کند و با ابر XCode امکان پذیر است.

با XCode Cloud چه کاری می توانید انجام دهید؟

با استفاده از ابر XCode، می توانید کارهای زیر را به صورت خودکار و اغلب انجام دهید:

  • پروژه خود را بسازید
  • انجام تست و بازرسی.
  • با TestFlight، می‌توانید نسخه‌های آزمایش‌کننده را توزیع کنید و بازخورد جمع‌آوری کنید و در عین حال حریم خصوصی کاربر را حفظ کنید.

پس از تأیید موفقیت آمیز نرم افزار با ابر XCode و TestFlight، می توانید بلافاصله نسخه جدیدی از نرم افزار خود را در اپ استور مستقر کنید.

* توجه – ابر XCode در حال حاضر در مرحله بتا است و یکی از ویژگی های XCode 13 است.

الزامات استفاده از ابر XCode

1. حساب توسعه دهنده

برای استفاده از ابر XCode، باید:

  • در برنامه توسعه دهنده اپل ثبت نام کنید (حساب توسعه دهنده الزامی است).
  • Apple ID خود را به XCode اضافه کنید.
  • شما نقش یا مجوز لازم را برای ایجاد یک ورودی برنامه در App Store Connect برای برنامه خود دارید.

2. پروژه و فضای کاری

برای استفاده از فضای ابری XCode، مطمئن شوید که پروژه و فضای کاری شما شرایط زیر را دارد:

  • شما در یک فضای کاری یا پروژه XCode کار می کنید.
  • وابستگی های شما و اشخاص ثالث اضافی باید برای فضای ابری XCode در دسترس باشند.
  • شما از امضای خودکار کد استفاده می کنید.

3. الزامات کنترل منبع

برای استفاده از ابر XCode، باید از Git برای کنترل منبع استفاده کنید.

ارائه دهندگان مدیریت کد منبع زیر (SCM) توسط ابر XCode پشتیبانی می شوند:

  • Bitbucket Cloud و Bitbucket Server
  • GitHub و GitHub Enterprise
  • GitLab و نمونه های GitLab خود مدیریت شده

کجا می توانید از ابر XCode استفاده کنید؟

1. از XCode و وب

آره! درست شنیدی؛ حتی اگر از XCode دور هستید می توانید از ابر XCode استفاده کنید.

می توانید با پیکربندی پروژه یا فضای کاری خود از محصول -> ابر XCode از ابر XCode استفاده کنید. همان داده ها به صورت آنلاین در دسترس خواهد بود.

* توجه داشته باشید – ابر XCode در حال حاضر در مرحله بتا است و یکی از ویژگی های XCode 13 است.

2. رابط کاربری ابری XCode

رابط کاربری فوق از فضای ابری XCode است که پس از پیکربندی موفقیت آمیز پروژه خود با ابر XCode می توانید آن را مشاهده کنید. این در بخش آخر صفحه ناوبری موجود است، یعنی. بخش اقدام

در سمت چپ می‌توانید بسیاری از گردش‌های کاری و فهرستی از کامپایل‌هایی را ببینید که با موفقیت کامپایل شده یا شکست خورده‌اند.

در سمت راست می‌توانید تمام بینش‌های همه اعضای تیم خود را ببینید. همه موارد بالا در Appstore Connect نیز موجود است، لطفاً تصویر زیر را ببینید.

گردش کار چیست؟

Workflow پیکربندی است که به ابر XCode می‌گوید چه اقداماتی را انجام دهد و چه زمانی انجام دهد.

ابر XCode مجموعه‌ای از گردش‌های کاری است که در صورت نیاز به طور خودکار اجرا می‌شوند.

گردش کار از 4 چیز تشکیل شده است

1. شرایط اولیه

بر اساس شرایط اولیه، اقدامات برای هر تغییر در شاخه ای که در حالت اولیه مشخص کرده ایم گرفته می شود. می توانیم چندین شاخه به گردش کار اضافه کنیم.

2. محیط زیست

در اینجا نسخه تعریف شده XCode، نسخه macOS، متغیرهای محیطی وجود دارد.

3. اعمال

4 نوع عمل انجام شده توسط ابر XCode

عمل پس از عمل

پیاده سازی TestFlight، ارسال اعلان ها پس از تنظیم همه موارد فوق، گردش کار به این صورت خواهد بود

منابع

مراجع 1، 2، 3

در این پست با استفاده اپل از XCode Cloud آشنا شدید. با انجام مراحل ذکر شده در بالا، XCode Cloud شما باید بدون هیچ مشکلی راه اندازی شود. لطفاً در وبلاگ بعدی ما نظر خود را در مورد موضوعی که می خواهید بررسی کنید دریغ نکنید.

انتشارات Cloud Overview و XCode Workflow برای اولین بار در مجله DEV IT ظاهر شد.

نحوه ادغام برجسته‌کننده PDF dtSearch در یک برنامه Net


امروزه استفاده از Adobe Reader به رایج ترین راه برای باز کردن سریع و ایمن فایل های PDF در رایانه تبدیل شده است. برچسب گذاری فایل های PDF می تواند یک ویژگی یکپارچه باشد، اما چندان کاربردی نیست مگر اینکه نسخه های نرم افزار برتر را انتخاب کنید. در چنین مواردی، مهندسان DEV IT ما استفاده از آن را توصیه می کنند dtSearch توکن PDF برای تمام اهداف برجسته شما حتی به جستجو از برنامه های دیگر برای استخراج اطلاعات از Adobe Reader DC، XI یا X اجازه می دهد. این می تواند یک ابزار پولی باشد. با این حال، 30 روز دسترسی رایگان دارد، که زمان کافی برای دانستن اینکه آیا برای برنامه شما مناسب است یا خیر، ارائه می شود. بیایید نگاهی به مراحل مورد نیاز برای ادغام آن در برنامه Net خود بیاندازیم.

مراحل زیر برای ادغام تگ PDF Dtsearch در یک برنامه Net است.

1.) جعبه ابزار برجسته را روی سیستم پیکربندی کنید

ما باید جعبه ابزار هایلایتر را در سیستم خود نصب کنیم و برای مرحله اول تمام مجوزهای مناسب را به پوشه نصب شده ارائه کنیم. سپس می توانید جعبه ابزار نشانک را از این لینک دانلود کنید. این به شما 30 روز دسترسی رایگان می دهد.

اسکرین شات: 1

2.) برنامه Net خود را در IIS میزبانی کنید

اکنون همه ما می دانیم که چگونه یک برنامه .Net را در IIS پیکربندی کنیم. بنابراین، همانطور که در تصویر زیر نشان داده شده است، برنامه .net را در IIS میزبانی کردم.

اسکرین شات: 2

3.) پوشه برنامه وب جعبه ابزار برجسته را در برنامه Net پیکربندی کنید

جعبه ابزار نشانک یک پوشه، proxy-webapp را در اختیار شما قرار می دهد که باید آن را در برنامه .net خود پیکربندی کنیم.

با توجه به اسکرین شات، می توانید پوشه proxy -web app را که باید در IIS پیکربندی کنیم را در برنامه Net خود مشاهده کنید.

اسکرین شات: 3

طبق اسکرین شات 3، ما پوشه proxy-webapp را پیکربندی کرده ایم و نام دامنه را به عنوان یک نشانگر. اما، البته، شما می توانید هر نام دامنه را مشخص کنید.

ما نیازی به ایجاد هیچ تغییری در پوشه proxy-webapp نداریم. در عوض، ما باید پوشه را در برنامه .net خود در همان دایرکتوری مجازی پیکربندی کنیم.

پس از پیکربندی پوشه proxy-webapp، سعی می کنیم سرویس نشانه گذاری را در مرورگر خود راه اندازی کنیم و بررسی کنیم که آیا با موفقیت کار می کند یا خیر.

به عنوان مثال، http://xyz.com/highlighter (دامنه برنامه دات نت ما + تگ)

اگر proxy-webapp در جعبه ابزار برچسب گذاری با موفقیت پیکربندی شود، مطابق تصویر زیر ظاهر می شود.

اسکرین شات: 4

4. اسناد PDF را در برنامه .net پیدا کنید.

ما باید اسناد PDF را در برنامه .net خود با استفاده از کلمه کلیدی جستجو پیدا کنیم. به عنوان مثال، من با کلمه “Nationality” در برنامه .net خود جستجو می کنم و در نتیجه اسناد PDF را پیدا می کنم.

اسکرین شات: 5

اسکرین شات: 6

5.) برای دریافت URL یک فایل PDF با DTSearch API تماس بگیرید

DtSearch همچنین یک API در اختیار شما قرار می دهد تا از آن برای دریافت URL PDF استفاده کنید.

طبق اسکرین شات 6، پس از دریافت اسناد PDF منتهی به برنامه .net ما، باید یک فراخوانی API Dtsearch برای دریافت URL سند PDF انجام دهیم.

هنگامی که روی دکمه Complete Case and Analysis کلیک می کنید، با عبور از دو پارامتر جستجوی زیر، تماس های API را برقرار می کنید.

  • کلیدواژه ها را جست و جو کنید
  • مسیر URL PDF با نام دامنه

اسکرین شات: 7

طبق اسکرین شات 7، فیلد نارنجی کلمه کلیدی جستجو را نشان می دهد.ملیت “، و کادر قرمز مسیر سند PDF ما با نام دامنه برنامه .net ما است.

ما پاسخ زیر را از dtSearch API با URL سند دریافت می کنیم. برای برجسته کردن کلمه در PDF، این URL را در Iframe یا یک تب جدید باز کنید.

"success": true,
"documentUrl": "https://app.investorstatelawguide.com/highlighter/viewer/?file=https%3A%2F%2Fapp.investorstatelawguide.com%2F%2FDocuments%2FPDFFiles%2FIC-0091-29%2520-%2520Pey%2520Casado%2520-%2520Response%2520to%2520Annulment%2520%5BFrench%5D.pdf&highlightsFile=..%5Chits%2F488100af2dad5ecbb18645d101a7d8e2&q=&lang=en&nativePrint=1&script=..%2Fexamples%2Fviewer-copy-fix.js&hlCopy=1&",
"highlightedPages": 6,
"highlightedTerms": 8,

هنگامی که URL سند را با کلیک یک دکمه ارسال می کنید، فایل PDF باز می شود و کلمه جستجو را برجسته می کند، همانطور که در تصویر زیر نشان داده شده است.

می‌توانید از دکمه‌های ضربه قبلی و بعدی برای پرش مستقیم بین کلمات خط‌دار استفاده کنید.

نتیجه

در این وبلاگ توضیح داده ایم که چگونه می توانید به راحتی سرویس dtSearch PDF Highlighter را برای برجسته کردن هر کلمه در یک PDF یکپارچه کنید. ما واقعا امیدواریم که از این وبلاگ لذت برده باشید. اگر در این فرآیند با مشکلی مواجه شدید، لطفاً در توضیح زیر دریغ نکنید.

نشریه How to integrate dtSearch PDF Highlighter در برنامه Net اولین بار در مجله DEV IT ظاهر شد.

راهنمای مبتدیان: محدوده ذخیره سازی در اندروید 11


تغییر دسترسی به فضای ذخیره‌سازی Android 10 برای Android 11 اجباری می‌شود. این وبلاگ برای فضای ذخیره‌سازی است. چگونه می توانیم به آن دسترسی داشته باشیم و این برای برنامه ما چه معنایی دارد؟

اندروید 11 برخی تغییرات و محدودیت‌های عمده را برای بهبود حریم خصوصی کاربر اضافه می‌کند، مانند اعمال محدوده فضای ذخیره‌سازی، بازنشانی خودکار مجوزها، دسترسی به موقعیت مکانی پس‌زمینه، نمایان بودن بسته.

(1) مخزن با دامنه کاربرد: دسترسی به دایرکتوری های ذخیره سازی خارجی به دایرکتوری های خاص برنامه و انواع رسانه های خاص برنامه محدود می شود.

(2) مجوزهای بازنشانی خودکار: اگر کاربران چندین ماه با برنامه تعامل نداشته باشند، سیستم به طور خودکار مجوزهای حساس برنامه را بازنشانی می کند.

(3) دسترسی به موقعیت مکانی پس زمینه: کاربران باید به تنظیمات سیستم هدایت شوند تا برای مکان پس‌زمینه برنامه‌ها مجوز بگیرند.

(4) قابلیت مشاهده بسته: هنگامی که یک برنامه در لیست برنامه های نصب شده روی دستگاه جستجو می کند، لیست برگشتی فیلتر می شود.

ساختار ذخیره سازی قبل از اندروید نسخه 10:

قبل از اجرای این بخش، ابتدا بیایید نحوه سازماندهی داده ها قبل از اندروید 10 را درک کنیم:

ذخیره سازی خصوصی: همه برنامه ها دایرکتوری خصوصی خود را در حافظه داخلی دارند، به عنوان مثال. نام / داده / بسته Android از برنامه های دیگر قابل مشاهده نیست.

فضای ذخیره سازی مشترک: ذخیره سازی خصوصی، بقیه مخزن ذخیره سازی مشترک نامیده می شود. این شامل تمام فایل‌های رسانه‌ای و غیر رسانه‌ای ذخیره‌شده می‌شود و برنامه‌ای با مجوز ذخیره‌سازی می‌تواند به راحتی به آنها دسترسی داشته باشد.

ساختار فعلی و مسائل دسترسی:

فرض کنید ما از یک اپلیکیشن تجارت الکترونیک استفاده کرده ایم و فقط برای اینکه از کاربر بخواهیم عکس را در نمایه خود آپلود کند، نیاز به دسترسی به فضای ذخیره سازی داشتیم، که به معنای دسترسی به یک فایل یا سیستم فایل خاص است. چرا ما می خواهیم فضای ذخیره سازی دسترسی کامل کاربر را داشته باشیم؟

آیا تا به حال نگران داده های حساس بوده ایم؟ به عنوان مثال، آیا همه برنامه های نصب شده روی دستگاه شما به نسخه های پزشکی یا اسناد بانکی دسترسی دارند؟

محدوده ذخیره سازی:

گوگل دو دلیل خوب برای ایجاد این تغییر ارائه می دهد: کاهش باقی مانده ها و “انسداد برنامه ها” برای امنیت.

انتساب بهتر:

یک برنامه کاربردی دسترسی به بلوک های ذخیره سازی با داده های برنامه مربوطه را فراهم می کند.

بخش عمده ای از طراحی اندروید برنامه ها را از یکدیگر جدا می کند. اندروید کیو از همین اصل اولیه از محیط شنی اپلیکیشن ها استفاده می کند و گوگل فضای ذخیره سازی را با وسعت معرفی کرده است.

ذخیره سازی خصوصی مانند قبل است. مخزن مشترک بیشتر به رسانه ها و مجموعه ای از دانلودها که فایل های رسانه ای نیستند تقسیم می شود.

ساختار ذخیره سازی را در اندروید 10 به بعد ببینید:

کاهش شلوغی فایل:

سیستم اصلی آندروید مخزن را به برنامه مالک متصل می کند، که این امر باعث می شود سیستم راحت تر فایل های مناسب مربوط به یک برنامه را پیدا کند. هنگامی که برنامه حذف نصب می شود مفید است، زیرا تمام داده های مربوط به برنامه نیز حذف نصب می شوند.

جلوگیری از سوء استفاده از مجوز READ_EXTERNAL_STORAGE:

مجوز READ_EXTERNAL_STORAGE برای برنامه ما به کل برنامه از حافظه خارجی دسترسی پیدا کردیم، جایی که مواردی مانند عکس‌ها، اسناد خصوصی، ویدیوها و سایر فایل‌های بالقوه حساس را ذخیره می‌کنیم. Scoped Storage در اندروید 11 چیست؟

محدوده ذخیره سازی در اندروید فقط برنامه را اعمال می کند. ما می‌توانیم داده‌های آنها را در پوشه‌ها و انواع خاصی از رسانه‌ها مانند فایل‌های موسیقی با استفاده از سایر APIهای ذخیره‌سازی ببینیم.

این به من کنترل بیشتری بر روی فایل هایم می دهد و به من امکان دسترسی می دهد. همچنین اگر فایل های اختیاری با خود برنامه حذف شوند، فضای اضافی برای دستگاه ها فراهم می کند.

برنامه ها برای دسترسی به فایل ها از یک مخزن با محدوده به چه مجوزهایی نیاز دارند؟

قبلاً یک مجوز برای نوشتن همه فایل ها و دیگری برای خواندن وجود داشت. و اکنون با استفاده از فضای ذخیره‌سازی، دسترسی بر اساس نوع ذخیره‌سازی و مالکیت محتوا توزیع می‌شود.

  1. برنامه ها به حافظه خارجی و داخلی خود برای عملیات مجوز نوشتن و خواندن دسترسی خواهند داشت.
  2. تا زمانی که فایل در مجموعه سازماندهی شده ذخیره می شود، برنامه ها دسترسی محدودی به ارائه فایل های Media & NonMedia نخواهند داشت.
  3. مجموعه رسانه ارائه شده توسط برنامه های کاربردی دیگر بر اساس مجوز استفاده شده از “READ_STORAGE_PERMISSION” قابل دسترسی است. در اصل، مجوز “WRITE_STORAGE_PERMISSION” از نسخه بعدی رد می شود و در صورت استفاده، مانند “READ_STORAGE_PERMISSION” عمل می کند.
  4. فایل های غیر رسانه ای ارائه شده توسط برنامه های کاربردی دیگر را می توان از طریق Storage Access Framework API دسترسی داشت. هیچ مجوز صریحی لازم نیست. این بدان معنا نیست که برنامه ها به همه دایرکتوری های Root، Android / Data، دایرکتوری دانلود دسترسی دارند. هنگامی که کاربر به کاربر اجازه دسترسی داد، دسترسی کامل به خواندن، تغییر، حذف خواهد داشت.

یک برنامه از فضای ذخیره‌سازی قدیمی استفاده می‌کند، و قبل از اینکه نسخه هدف Android 10 یا کمتر باشد، می‌توانید داده‌ها را در فهرستی ذخیره کنید که وقتی مدل فضای ذخیره‌سازی فعال است، به آن دسترسی ندارید. هنگامی که به نسخه 11 تغییر می کنید، داده ها را به فهرستی که با محدوده ذخیره سازی سازگار است منتقل کنید. در بیشتر موارد، می‌توانید داده‌ها را به فهرستی خاص از برنامه خود منتقل کنید – مخازن ذخیره‌سازی Android 11.

بیایید درک و نحوه اعمال آن را ببینیم:

عملیات ذخیره سازی:

فایل را انتخاب کنید: این ACTION_OPEN_DOCUMENT سپس برنامه انتخاب فایل سیستم را باز می کند تا به کاربر اجازه دهد فایل مورد نظر را برای باز کردن انتخاب کند.

const val PICK_PDF_FILE = 2

fun openFile(pickerInitialUri: uri) {
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
        addCategory(Intent.CATEGORY_OPENABLE)
        type = "application/pdf"
        putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
    }
    startActivityForResult(intent, PICK_PDF_FILE)
}

پوشه را انتخاب کنید: این “ACTION_OPEN_DOCUMENT” در حال استفاده است، با ACTION_OPEN_DOCUMENT_TREE جایگزین شده است.

fun openDirectory(pickerInitialUri: Uri) {
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
        flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
        putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
    }

    startActivityForResult(intent, your-request-code)
}

فایل را ایجاد کنید: از این “ACTION_CREATE_DOCUMENT” برای ذخیره فایل در یک مکان خاص استفاده می کند.

const val CREATE_FILE = 1

private fun createFile(pickerInitialUri: Uri) {
    val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
        addCategory(Intent.CATEGORY_OPENABLE)
        type = "application/pdf"
        putExtra(Intent.EXTRA_TITLE, "invoice.pdf")
        putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
    }
    startActivityForResult(intent, CREATE_FILE)
}

نتیجه

در این وبلاگ مراحل مورد نیاز برای دسترسی و استقرار فضای ذخیره سازی برای برنامه اندروید 10 و جدیدتر خود را خواهید آموخت. این به شما این امکان را می دهد که حریم خصوصی کاربران خود را بهبود ببخشید و در عین حال از ازدحام دستگاه های آنها بکاهید. برای وبلاگ های عالی تر از مهندسان DEV IT ما، لطفاً وب سایت ما را بررسی کنید.

راهنمای مبتدیان: ذخیره سازی جامع در اندروید 11 اولین بار در مجله DEV IT ظاهر شد.

انتشار به روز رسانی های ویندوز سرور به طور مداوم هایپروایزر را راه اندازی مجدد و قطع کنید


معرفی

آخرین به روز رسانی های سیستم عامل ویندوز سرور مشکلات متعددی را برای مدیران ایجاد می کند و Hyper-V پس از راه اندازی مجدد راه اندازی نمی شود. همچنین مشکلات بیشتری وجود دارد، مانند حجم های ReFS غیرقابل دسترسی و چرخه های بوت کنترل کننده دامنه. با این حال، در این وبلاگ، مهندسان DEV IT ما عمدتاً بر این واقعیت تمرکز خواهند کرد که Hyper-V شروع نمی شود.

سیستم های تحت تأثیر

اگرچه این خطا عمدتاً نسخه ویندوز سرور 2012 R2 را تحت تأثیر قرار می دهد، اما گزارش هایی وجود دارد که سیستم های دیگر تحت تأثیر قرار گرفته اند. اینها هستند:

  • Windows Server 2012 R2 (KB5009624)
  • Windows Server 2019 (KB5009557)
  • Windows Server 2022 (KB5009555)

تاثیرات

تاثیر این باگ برای نسخه های مختلف سرور سیستم عامل ویندوز کاملا جدی است. اینها هستند:

سرورهای مجازی میزبانی شده در Hyper-V شروع نمی شوند

ما تجربه ای داشتیم که پس از نصب ماشین های مجازی KB ذکر شده بر روی Hypervisor، شروع به کار نکرد و به ذخیره شرایط. شرط. پیام زیر را دریافت کردیم:

“ماشین مجازی [name of virtual machine] نمی توان راه اندازی کرد زیرا هایپروایزر کار نمی کند.”

کنترل کننده دامنه ویندوز به راه اندازی مجدد ادامه می دهد

همچنین پس از نصب به‌روزرسانی، کنترل‌کننده‌های دامنه ویندوز به‌طور مداوم راه‌اندازی مجدد می‌شوند. به این دلیل که پس از نصب به روز رسانی، فرآیند LSASS.exe شروع به مصرف تمام منابع CPU روی سرور کرد. LSASS یک فرآیند بسیار مهم برای راه اندازی یک سرور ویندوز در مرحله سالم است.

هنگام راه‌اندازی مجدد کنترل‌کننده‌های دامنه به دلیل شکست فرآیند LSASS، Event Viewer رویداد زیر را ثبت می‌کند:

“فرآیند wininit.exe راه اندازی مجدد کامپیوتر را آغاز می کند [server name] از طرف کاربر به دلیل زیر: هیچ عنوانی به این دلیل یافت نشد. کد دلیل: 0x50006 نوع خاموش شدن: راه اندازی مجدد نظر: فرآیند سیستم “C: WINDOWS system32 lsass.exe” به طور غیرمنتظره ای با کد وضعیت -1073741819 پایان یافت. اکنون سیستم خاموش و راه اندازی مجدد خواهد شد.”

وضوح

دو راه حل برای رفع مشکل ذکر شده در بالا وجود دارد.

نصب به‌روزرسانی‌های خارج از باند (به‌روزرسانی اضطراری)

در هفدهمشما ژانویه مایکروسافت برای رفع مشکلات زیر یک به‌روزرسانی فوری خارج از باند منتشر کرد:

  • دامین کنترلر دوباره راه اندازی می شود
  • Hyper-V شروع نمی شود

همه به‌روزرسانی‌های OOB برای دانلود از وب‌سایت Microsoft Update Catalog در دسترس هستند و می‌توانند از طریق Windows Update به عنوان یک به‌روزرسانی اختیاری دانلود و نصب شوند.

به روز رسانی های زیر را می توان از طریق کاتالوگ مایکروسافت به روز رسانی دانلود و نصب کرد:

  • ویندوز سرور 2012 R2: KB5010794
  • ویندوز سرور 2012: KB5010797

به روز رسانی های زیر نیز از طریق Windows Update به عنوان آپدیت اختیاری در دسترس هستند:

  • ویندوز 11، نسخه 21H1 (نسخه اصلی): KB5010795
  • ویندوز سرور 2022: KB5010796
  • Windows Server 2019: KB5010791 (منتشر شده در تاریخ 01/18/22)

KB را از سرورهای ویندوز آسیب دیده حذف کنید

مدیران سروری که نمی‌خواهند فوراً به‌روزرسانی‌های اضطراری را نصب کنند، می‌توانند به‌روزرسانی‌های KB5009624، KB5009557 و KB5009555 را از رایانه‌های Windows Server مربوطه خود به شرح زیر حذف کنند:

با استفاده از خط فرمان elevated دستور زیر را اجرا کنید:

  • Windows Server 2012 R2: wusa / حذف نصب / kb: 5009624
  • Windows Server 2019: wusa / حذف / kb: 5009557
  • Windows Server 2022: wusa / حذف / kb: 5009555

نتیجه

در خاتمه، آخرین به روز رسانی سیستم های ویندوز سرور منجر به مشکلات متعددی شده است که تقریباً برای مدیران غیرقابل استفاده است. با این حال، با رعایت قطعنامه های بالا، باید سیستم خود را نسبتاً سریع راه اندازی کنید. برای هر گونه مشکلی که در طول فرآیند با آن مواجه می شوید، لطفاً در نظرات زیر دریغ نکنید

نشریه انتشار به‌روزرسانی‌های ویندوز سرور به طور مداوم راه‌اندازی مجدد و قطع‌کردن هایپروایزر برای اولین بار در مجله DEV IT ظاهر شد.

راهنمای توسعه دهندگان برای استقرار Bubble API در یک برنامه اندروید


معرفی

گوگل اخیرا یک API حباب دار در سال 2019 برای نمایش اعلان ها معرفی کرده است. در Android Q، این اعلان‌های سر چت را به عنوان یک API حباب بخشی از پلتفرم اندروید تبدیل کرد. این ویژگی اعلان حباب اولین بار فقط برای دستگاه های پیکسل معرفی شد و مشابه حباب چت فیس بوک مسنجر کار می کرد. در اندروید 10، این نسخه پایدار نبود و کاربران باید آن را از گزینه های توسعه دهنده در تنظیمات خود فعال می کردند.

نسخه نهایی Bubble API با Android 11 عرضه شد. Bubbles یک ویژگی پیش نمایش در اندروید 11 است که به شما کمک می کند بیش از یک کار را انجام دهید یا از بیش از یک برنامه در یک زمان استفاده کنید. اندروید دارای یک تبدیل داخلی است تا تماس‌ها را آسان‌تر و کاربرپسندتر کند. آنها در سیستم اطلاع رسانی تعبیه شده اند و روی سایر برنامه ها شناور هستند.

در این وبلاگ می آموزیم که چگونه از اعلان های حباب در برنامه خود استفاده کنیم. بنابراین، شروع کنید.

اعلان‌های حباب فقط زمانی ظاهر می‌شوند که نیاز تماس را برآورده کنند. در اینجا برخی از محدودیت ها در مورد زمان نمایش اعلان ها به صورت حباب وجود دارد.

محدودیت ها در اندروید 10

⦁ برای اعلان ها از Messingingstyle استفاده می کنیم و یک چهره اضافه شده است

⦁ هنگام ارسال اعلان ها، برنامه باید در پیش زمینه باشد

محدودیت در اندروید 11

⦁ اعلان ها از MessagingStyle استفاده می کنند

رهنمودها

الزامات مکالمه

⦁ ابتدا، برای برآورده کردن الزامات تماس اعلان – باید میانبرهای پویا یا اشتراک گذاری طولانی مدت را پیاده سازی کنیم و شناسه میانبر را به اعلان سبک پیام خود وصل کنیم.

حباب ها چگونه اجرا می شوند؟

1. نسخه SDK را بررسی کنید

  • اولین قدم این است که اطمینان حاصل کنیم که برنامه ما برای اندروید 11 (سطح API 30) هدف گذاری شده است.
Android {
	    compileSdkVersion 30
	    buildToolsVersion "30.0.2"

	    defaultConfig {
	        targetSdkVersion 30
	    }
	}

2. پیکربندی فعالیت

<activity
 	  Android:name=".bubbles.BubbleActivity"
	  Android:theme="@style/AppTheme.NoActionBar"
	  Android:label="@string/title_activity_bubble"
 	  Android:allowEmbedded="true"
 	  Android:resizeableActivity="true"
	/>
  • این فعالیت به صورت یک حباب نمایش داده می شود و باید قابلیت تغییر اندازه و جاسازی را داشته باشد.
  • بنابراین در اندروید 10، اعلان‌ها به صورت حباب ظاهر نمی‌شوند مگر اینکه documentLaunchMode = “همیشه” را در فایل مانیفست تنظیم کنید. با این حال، در اندروید 11 نیازی به تنظیم این مقدار نیست، زیرا سیستم به طور خودکار documentLaunchMode را برای همه تماس‌ها روی «همیشه» تنظیم می‌کند.

3. نیت ایجاد کنید

  • برای پیمایش فعالیت حباب باید یک PendingIntent ایجاد کنیم.
val screen = Intent(context, BubblesActivity::class.java)
val bubbleInt = PendingIntent.getActivity(context, 0, screen, 0 )

4. ابرداده ایجاد کنید

  • ما باید ابرداده ایجاد کنیم و کسی پیام را منتقل کند.
Val bubbleData=Notification.BubbleMetadata.Builder(bubbleInt ,
 Icon.createWithResource(context, R.drawable.icon))
.setAutoExpandBubble(true)
.setDesiredHeight(600).build()
  • وقتی روی یک حباب کلیک می کنید، محتویات آن نمایش داده می شود، اما همیشه می توانید با استفاده از این روش setAutoExpand (درست) حباب را به طور خودکار گسترش دهید.

5. خلق شخصیت

  • ما باید یک شی شخص با اطلاعات شریک چت ایجاد کنیم.
val chatPartner = Person.Builder()
    	.setName("Chat partner")
            .setImportant(true)
   	.build()

6. یک میانبر ایجاد کنید

val shortcut =ShortcutInfo.Builder(mContext, shortcutId)
      	.setIntent(Intent(Intent.ACTION_DEFAULT))
     	.setLongLived(true)
      	.setShortLabel(chatPartner.name)
      	.build()

8. یک اعلان ایجاد کنید

  • در نهایت اعلان را ایجاد کرده و با استفاده از متد setBubbleMetadata، متادیتا را تنظیم کنید.
val builder = Notification.Builder(context, CHANNEL_ID)
    	  .setContentIntent(contentIntent)
    	  .setSmallIcon(smallIcon)
    	  .setBubbleMetadata(bubbleData)
    	  .setShortcutId(shortcutId)
    	  .addPerson(chatPartner)
  • هنگام تنظیم مقادیر نرمال در سازنده اعلان، کاربر می تواند حباب ها را از تنظیمات سیستم حذف کند و سپس به جای حباب ها، اعلان عادی نمایش داده می شود.
with(builder) {
   		   setContentTitle("New message")
 		   setSmallIcon(R.drawable.ic_stat_notification)
 		   setCategory(Notification.CATEGORY_MESSAGE)
   		  setContentIntent(
      		  PendingIntent.getActivity(   context,    0,
            	  Intent(context, MainActivity::class.java),
           		   PendingIntent.FLAG_UPDATE_CURRENT
      		  )
    		)
	}
//then call the notification manager to send it
	notificationManager.notify(MY_NOTIFICATION, builder.build())

نتیجه

با دنبال کردن مراحل بالا، یاد خواهید گرفت که چگونه به درستی اعلان های سبک بالون را در برنامه خود اعمال کنید. این وبلاگ همچنین نکات مهمی را که باید هنگام اجرای اعلان‌های حباب به خاطر داشت، برجسته کرد. اگر در مورد این موضوع شک دارید، لطفاً نظر خود را دریغ نکنید و مهندسان DEV IT ما با شما تماس خواهند گرفت.

راهنمای توسعه‌دهنده انتشارات برای استقرار Bubble API در یک برنامه اندروید برای اولین بار در مجله DEV IT ظاهر شد.

راهنمای مبتدیان: توسعه آزمایش محور (TDD) با موکا و چای (با استفاده از Node Js)


به وبلاگ عالی دیگری از مهندسان DEV IT ما خوش آمدید. امروز ما در مورد روند اجرای یک توسعه که توسط آزمایشات با Mocha و Chai در Node JS هدایت می شود صحبت خواهیم کرد. بیا شروع کنیم.

توسعه تست محور (TDD) چیست؟

این فرآیندی است که در آن ابتدا تست تک خود را می نویسید، نحوه شکست آن را مشاهده می کنید و سپس در حین گذراندن آزمون، کد لازم را در ماژولی که ایجاد می کنید پیاده سازی می کنید. این است!

چگونه باید انجام شود؟

  • تست های واحد باید خاص باشند و باید مؤلفه ها و الگوریتم های خاصی از کدی را که می خواهید آزمایش کنید، آزمایش کنند
  • داده های مورد استفاده در تست باید ثابت یا متغیر باشند و نباید توسط فراخوانی های API خارجی تغییر داده شوند. به عنوان مثال، باید انتظار یک نتیجه خاص را داشت

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

تست یکی از مراحل اصلی در چرخه عمر توسعه نرم افزار (SDLC) قبل از استقرار و استفاده محصول نهایی است. انواع مختلفی از تست ها برای اطمینان از کیفیت و اطمینان بر روی محصول انجام می شود، مانند تست واحد. فریمورک‌های محبوبی وجود دارند که می‌توانند اسکریپت‌ها را آزمایش کنند، بسته‌های آزمایشی را پشتیبانی کنند و نتایج آزمایش را پر کنند.

موکا و چای چیست؟

Mocha یکی از محبوب‌ترین و پرکاربردترین فریم ورک‌های تست جاوا اسکریپت است که می‌تواند روی Node.js اجرا شود و گزارش‌های آزمایشی دقیق و ردیابی پشته‌ای را برای استثناهای کشف نشده ارائه دهد. روش دیگر، Chai یک کتابخانه بیانیه است که می تواند در ارتباط با هر چارچوب تست جاوا اسکریپت استفاده شود.

چای کتابخانه ای از ادعاها است. جعبه ابزار Chai رابط های Should Expect و Assert را فراهم می کند، روشی خوانا و گویا برای ایجاد تست بعد از BDD.

سخت: –

به عنوان آخرین پارامتر، می توانید یک پیام اضافی ارائه دهید که به عنوان یک پیام خطا ظاهر می شود.

من انتظار دارم: –

با Expect، چای سبک BDD را نشان می دهد. در نتیجه، کاربران می توانند عبارات را به زبان طبیعی متصل کنند.

بیایید نگاهی به نحوه عملکرد آن با راه اندازی یک آزمایش ساده در یک برنامه گره بیندازیم

1 بیایید با ایجاد یک پروژه گره با “npm init” شروع کنیم. سپس بیایید وابستگی های mocha و chai را با استفاده از دستور “npm install mocha chai” نصب کنیم.

2. اکنون در package.json باید “mocha” را به کلید تست شی اسکریپت اضافه کنید و پوشه ای به نام tests ایجاد کنید تا تست های خود را جداگانه مدیریت کنید تا بتوانید تمام فایل های تست مورد نیاز برای اجرای تست های خود را در اینجا ایجاد کنید.

3. موکا از قلاب ها برای سازماندهی ساختار خود استفاده می کند. ما اکنون برخی از ویژگی های اساسی را فهرست کرده ایم.

توصیف کردن (): برای گروه بندی استفاده می شود که می توانید آنقدر عمیق سرمایه گذاری کنید.

سپس (): این مورد آزمایشی است.

قبل از (): این یک قلاب اعدام قبل از اولین آن () یا توصیف ();

قبل از هر (): این یک قلاب است که قبل از هر آن اجرا می شود () یا توصیف ();

بعد از (): این قلاب اجرای پس از آن است () یا توصیف ();

بعد از هر (): این یک قلاب است که بعد از هر آن اجرا می شود () یا توصیف ();

Describe () تابعی است که شامل مجموعه ای از تست ها می شود یا می توانید آن را مجموعه ای از تست ها نیز بنامید. این دو پارامتر دارد، اولی یک نام معنی‌دار است که آنچه را که روش انجام می‌دهد توصیف می‌کند، و دومی یک تابع توصیف است که اساساً شامل یک یا چند تست است.

این () تابعی است که شامل محتویات و مراحل آزمایش واقعی است. همچنین دارای دو پارامتر است: نام آزمون و تابعی که حاوی محتوا است.

4. یک فایل افزودنی آزمایشی در پوشه تست، مثلا test.js، با نامی که دوست دارید ایجاد کنید. کد زیر را در فایل قرار دهید.

const chai = require('chai')
const expect = chai.expect
describe(Math Operation, () => {
	describe('Addition', () => {
		it('1 + 1 should be equals to 2', () => {
			expect(1+1).to.equal(2)
		})
	})
})

5. با عملیات ریاضی می توانید تمام توابع توضیح فرزند را که عملیات را با موارد تست انجام می دهند، گروه بندی کنید. آن را از ترمینال با استفاده از دستور “npm run test” اجرا کنید که تمام تست های شما را انجام می دهد.

6. اگر 1 + 2 را به جای 1 + 1 در حالت انتظار قرار دهید، نتیجه آن 3 خواهد بود، بنابراین برابر با 3 نخواهد بود، بنابراین در آزمون مردود می شود. سعی کنید 1 + 2 را به جای 1 + 1 در حالت انتظار قرار دهید، سپس این به 3 منجر می شود، بنابراین از آزمون عبور نمی کند.

خروجی نمونه، آزمون گذرانده شده: –

نمونه آزمون شکست خورده اولیه: –

7. بیایید چند عملیات مورد آزمایشی دیگر را در یک عملیات ریاضی اضافه کنیم.

describe('Subtraction', () => {
    it('1 - 1 should be equals to 0', () => {
        expect(1-1).to.equal(0)
    })
})

describe('Multiplication', () => {
    it('1 * 1 should be equals to 1', () => {
        expect(1 * 1).to.equal(1)
    })
})
describe('Division', () => {
    it('1 / 1 should be equals to 1', () => {
        expect(1 / 1).to.equal(1)
    })
})

8. دوباره بررسی کنید، همانطور که دفعه قبل انجام دادید، و خط فرمان تعداد موارد گذشته یا ناموفق را به شما نشان می دهد. شما می توانید موارد را بر اساس نیاز خود سفارشی کنید، به عنوان مثال خروجی باید یک عدد مثبت باشد یا صفر نباشد.

خروجی نمونه: –

9. مستندات رسمی mochajs.org می تواند جزئیات بیشتری را در اختیار شما قرار دهد و به شما در رسیدن به هدفتان کمک کند.

نتیجه

با روش توسعه مبتنی بر آزمایش که در بالا توضیح داده شد، زمان بسیار آسان‌تری برای آزمایش برنامه‌های Node خود خواهید داشت. اگر در مراحل ذکر شده در بالا با مشکل مواجه شدید، لطفاً در نظرات زیر دریغ نکنید.

انتشارات راهنمای مبتدیان: توسعه مبتنی بر آزمایش (TDD) با موکا و چای (با استفاده از Node Js) برای اولین بار در مجله DEV IT ظاهر شد.

معرفی SharePlay & GroupActivities Framework در اپلیکیشن iOS


مشخص است که اپل هر ساله ویژگی های جدید و جالبی را معرفی می کند و هرگز توسعه دهندگان را ناامید نمی کند. در WWDC21، آن‌ها این روند را حفظ کردند و ویژگی‌های جالبی را که برای توسعه‌دهندگان می‌آیند اعلام کردند. یکی از آنها SharePlay است.

SharePlay

SharePlay چیست؟

SharePlay یکی از بهترین ویژگی هایی است که اپل در WWDC21 معرفی کرده است.

با استفاده از آن، کاربران می توانند کارهایی را که در طول تماس های FaceTime انجام می دهند به اشتراک بگذارند. رایج ترین مورد استفاده از این ابزار اشتراک گذاری فیلم و رسانه های دیگر با دوستان است. همچنین می‌توانید ویدیوها را در سرویس پخش جریانی Apple TV تماشا کنید، جایی که ویدیو در زمان واقعی بین همه شرکت‌کنندگان در مکالمه همگام‌سازی می‌شود.

چگونه استفاده کنیم؟

برای استفاده از SharePlay، ابتدا باید مطمئن شوید که دستگاه شما به iOS 15 یا جدیدتر به روز شده است.

اکنون باید با فردی که از FaceTime استفاده می کند تماس بگیرید. پس از برقراری تماس، می توانید برنامه Apple TV یا Apple Music را راه اندازی کنید. به محض باز کردن یکی از این برنامه‌ها، گزینه‌ای در بالای صفحه نمایش داده می‌شود که می‌گوید «به‌طور خودکار برای تلویزیون به اشتراک گذاشته می‌شود». سپس هر ویدیو یا موسیقی را پخش کنید و با سایر کاربران در مکالمه به اشتراک گذاشته شود. همچنین هنگامی که ویدیو را مکث یا از سرگیری می کنید، سایر کاربران را مطلع می کند.

وقتی کارتان تمام شد، می‌توانید پخش را از هر دستگاهی متوقف کنید. پس از کلیک بر روی بستن، سه گزینه برای شما نمایش داده می شود. گزینه اول پخش برای هر کاربر را پایان می دهد، گزینه دوم فقط برای شما تمام می شود و گزینه سوم گزینه توقف پخش را لغو می کند.

مزایای

مزیت اصلی SharePlay این است که افراد می توانند برنامه شما را با دوستان خود به اشتراک بگذارند. این یک راه سریع و آسان برای ترغیب افراد به امتحان کردن برنامه شما است. API GroupActivities به شما امکان می دهد جریان های گنجاندن را برای کاربران جدیدی که به طور خاص برای کاربران SharePlay ایجاد شده اند را نمایش دهید.

کدام برنامه ها از SharePlay پشتیبانی می کنند؟

SharePlay در حال حاضر از Apple TV و Apple Music پشتیبانی می کند، اما بسیاری از برنامه های کاربردی دیگر نیز پشتیبانی می شوند، زیرا اپل SharePlay را برای توسعه دهندگان فعال کرده است. در حال حاضر، برنامه های شخص ثالثی که پشتیبانی می شوند عبارتند از Disney +، Hulu، Twitch، The NBA app، Paramount +، ESPN + و غیره.

نمای کلی SharePlay

SharePlay فقط با Apple Music و Apple TV کار نمی کند. می‌توانید به محتوای هر برنامه‌ای که از SharePlay پشتیبانی می‌کند دسترسی داشته باشید. این ویژگی جدید در iOS 15 گنجانده شده است و به کاربران این امکان را می دهد تا از طریق یک تماس حضوری ساده، محتوای خود را با عزیزان خود تماشا کنند.

توسعه دهندگان به لطف API می توانند به راحتی SharePlay و FaceTime را در برنامه های خود ادغام کنند. ادغام یکپارچه روند توسعه را سرعت می بخشد و در عین حال خطر مشکلات را کاهش می دهد و مهمتر از همه، تجربه کاربر را بهبود می بخشد.

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

دستگاه های اپل با iOS 15، iPadOS 15، macOS Monterey و حتی Apple TV با tvOS 15 می توانند از SharePlay استفاده کنند.

شما می توانید از چارچوب GroupActivities برای توزیع محتوای برنامه خود از طریق تجربه های SharePlay استفاده کنید که به کاربران حس ارتباط و بی واسطه بودن را می دهد.

به نظر می رسد اپل در نظر گرفته است که چگونه این کار برای کاربران مختلف کار می کند. موارد زیر برخی از مهمترین عواملی است که باید در نظر گرفته شود:

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

فعالیت های گروهی – بررسی اجمالی

چارچوب GroupActivities را می توان برای پیوند دادن محتوای برنامه خود که می توانید به SharePlay و کاربران خود ارائه دهید، استفاده کنید. به عنوان مثال، یک برنامه ویدیوی پخش جریانی می تواند به کاربران اجازه دهد به مهمانی های تماشای فیلم بپیوندند که در آن همه به طور همزمان از دستگاه خود تماشا می کنند. برنامه پخش هر دستگاه را کنترل می کند، اما چارچوب GroupActivities آن را همگام می کند و امکان ارتباط بین آنها را فراهم می کند.

GroupActivity می تواند برای تبلیغ برنامه شما به سایر کاربران استفاده شود. جلسه ای برای فعالیت فعلی که محتوا را بین دستگاه های شرکت کننده همگام می کند، GroupSession نامیده می شود.

نتیجه

در این وبلاگ، کارشناسان DEV IT ما ویژگی جدید SharePlay منتشر شده توسط اپل و اینکه چگونه می تواند برای برنامه iOS شما مفید باشد را توضیح دادند. اگر این وبلاگ را دوست داشتید و می خواهید آموزش دقیق تری در مورد استفاده از SharePlay داشته باشید، حتما در زیر نظر خود را بنویسید.

انتشار Introduction to SharePlay & GroupActivities Framework در برنامه iOS برای اولین بار در مجله DEV IT ظاهر شد.

راهنمای پیاده سازی AWS CodeStar برای پروژه توسعه برنامه


مهندسان DEV IT ما با نکات و ترفندهای جدید برای بهبود چرخه توسعه در این وبلاگ جدید بازگشته اند. AWS CodeStar یک فناوری است که بخشی از ابر AWS است و به توسعه‌دهندگان اجازه می‌دهد تا برنامه‌های کاربردی را در AWS به آسانی و به سرعت توسعه دهند. این به شما امکان می دهد زنجیره ای از ابزارهای خود را برای تحویل مداوم تنظیم کنید و کد خود را بسیار سریعتر اجرا کنید. پس بیایید با آن مقابله کنیم.

CodeStar چیست؟

AWS CodeStar یک رابط کاربری یکپارچه ارائه می دهد که به شما امکان می دهد به راحتی فعالیت های توسعه نرم افزار خود را در یک مکان مدیریت کنید.

این سرویس‌های مختلف AWS مانند AWS CodeCommit، AWS CodeDeploy، AWS CodeBuild و AWS CodePipeline را ادغام می‌کند.

AWS Project CodeStar خدمات AWS را برای زنجیره ابزارهای توسعه پروژه شما ایجاد و ادغام می کند.

CodeCommit چیست؟

AWS CodeCommit یک ابزار مدیریت نسخه است که به شما امکان می دهد کد منبع خود را ذخیره کنید.

CodeDeploy و CodeBuild چیست؟

CodeBuild سرویسی است که کد منبع را کامپایل می کند، آزمایش ها را انجام می دهد و بسته های نرم افزاری آماده برای استقرار یک سرور داخلی تولید می کند.

CodeDeploy سرویسی است که کد یا برنامه را در مجموعه ای از نمونه های EC2 مستقر می کند.

CodePipeline چیست؟

سرویس CodePipeline به خودکارسازی خطوط لوله راه اندازی شما برای به روز رسانی سریع و قابل اعتماد برنامه ها و زیرساخت ها کمک می کند. این راه حل از CodePipeline برای ایجاد یک خط لوله سرتاسر استفاده می کند که کد برنامه را از CodeCommit بازیابی می کند، آن را با CodeBuild می سازد و آزمایش می کند و در نهایت با CodeDeploy آن را مستقر می کند.

یک پروژه در CodeStar ایجاد کنید

مرحله ی 1: قالب را انتخاب کنید و فیلتر انتخاب شده را روی سرویس AWS، نوع برنامه و زبان برنامه نویسی اعمال کنید.

برای ایجاد یک پروژه NodeJS در سرویس AWS، باید AWS EC2 را انتخاب کنیم. در Application type باید Web application و برای زبان برنامه نویسی Node.js را انتخاب کنیم.

پس از اعمال فیلتر، قالب را انتخاب کرده و روی دکمه Next کلیک کنید.

گام 2: در این مرحله باید پروژه خود را راه اندازی کنیم. جزئیات پروژه را وارد کنید و مخزن پروژه را انتخاب کنید و نمونه EC2 را پیکربندی کنید. اگر قبلاً جزئیاتی در مورد پیکربندی نمونه EC2 داشته باشیم، می توانیم آن را انتخاب کنیم، در غیر این صورت باید نمونه جدیدی ایجاد کنیم.

پس از کلیک بر روی Next می توانید جزئیات پروژه را مشاهده کنید و روی دکمه ایجاد پروژه کلیک کنید و پروژه شما ساخته می شود.

پس از ایجاد پروژه، کد منبع در سرویس CodeCommit فعال می شود. می توانید مخزن CodeCommit را مشاهده کنید.

ما همچنین می‌توانیم CodePipeline خود را از طرف پروژه و در قسمت Pipeline پیکربندی کنیم.

پس از اتمام مراحل خط لوله، می بینیم که پروژه ما در مرورگر اجرا می شود.

در اینجا می توانیم کد منبع خود را با یک کد قالب پیش فرض جایگزین کنیم.

در این وبلاگ روش استفاده را خواهید آموخت AWS CodeStar برای توسعه و اجرای موثر پروژه های خود. علاوه بر این، CodeStar یک سرویس رایگان است و شما هیچ هزینه اضافی برای استفاده از آن به غیر از هزینه های معمول خود برای منابع AWS پرداخت نخواهید کرد. برای سوالات بیشتر در مورد این موضوع، از ارسال نظر در زیر دریغ نکنید و ما در اسرع وقت پاسخ خواهیم داد.

انتشار راهنمای استقرار AWS CodeStar در پروژه توسعه برنامه برای اولین بار در مجله DEV IT ظاهر شد.

نحوه رمزگذاری و رمزگشایی داده ها از انتها به انتها در فرم وب Asp.net


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

چندین مزیت برای رمزگذاری و رمزگشایی با ASP.Net وجود دارد. اینها هستند:

  1. رمزگذاری را می توان در تعداد نامحدودی از دستگاه ها انجام داد.
  2. این به اطمینان از امنیت داده های شما در حین کار از راه دور کمک می کند و یکپارچگی کلی آن را بهبود می بخشد.
  3. یک کلید رمزگذاری قوی از هک و سایر حملات به برنامه وب شما جلوگیری می کند.
  4. رمزگذاری همچنین از سرقت هویت جلوگیری می‌کند و به شما کمک می‌کند ناشناس بمانید.

در این وبلاگ مهندسان DEV IT ما مراحل مورد نیاز برای انجام رمزگذاری و رمزگشایی در فرم های وب ASP.Net را برای برنامه های کاربردی وب شما توضیح دادند. مراحل این کار عبارتند از:

1.) اول از همه، ما به فایل های جاوا اسکریپت لیست شده در زیر نیاز داریم تا سمت کلاینت بتواند محتوا را رمزگذاری کند.

  • System.debug.js
  • System.IO.debug.js
  • System.Text.debug.js
  • System.Convert.debug.js
  • System.BitConverter.debug.js
  • System.IO.BinaryReader.debug.js
  • System.BigInt.debug.js
  • System.Security.Cryptography.SHA1.debug.js
  • System.Security.Cryptography.debug.js
  • System.Security.Cryptography.RSA.debug.js

2.) سپس به کلاس رمزگشایی سرور زیر و سایر ویژگی ها نیاز خواهیم داشت.

public class EncryptionPageDataProvider : LibCommon.PageBase
    {
        public static string privateKey;
        public static string publicKey;
        public static RSACryptoServiceProvider rsa;
        public static string UserName = "";
        public static int saltLengthLimit = 32;
        
        //The function mentioned below is used to assign required parameter 

        public static void AssignParameter()
        {
            const int PROVIDER_RSA_FULL = 1;
            const string CONTAINER_NAME = "KeyContainer";
            CspParameters cspParams;
            cspParams = new CspParameters(PROVIDER_RSA_FULL);
            cspParams.KeyContainerName = CONTAINER_NAME;
            cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
            cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
            rsa = new RSACryptoServiceProvider(cspParams);
            rsa.PersistKeyInCsp = false;
        }


//The function mentioned below is used to assignor generate new public and private key 

        public static void AssignNewKey()
        {
            AssignParameter();
            RSA rsa = new RSACryptoServiceProvider(2048);
            string PrivateKeyXML = rsa.ToXmlString(true);
            privateKey = PrivateKeyXML; // sets the new private key.

            string publicOnlyKeyXML = rsa.ToXmlString(false);
            publicKey = publicOnlyKeyXML; // sets the new public key.
            LibCommon.LibResult res = new LibCommon.LibResult();
            DataProviders.EncryptionPageDataProvider.UpdateNewKeys(publicOnlyKeyXML, PrivateKeyXML);
            if (res.HasError)
            {
                throw new Exception(res.ErrorException.Message);
            }
        }

//The function mentioned below is used encrypt data with salt string

        public static string EncryptData(string data2Encrypt, string salt)
        {
            LibCommon.LibResult res = new LibCommon.LibResult();
            try
            {
                AssignParameter();
                

                res = GetKeys(UserName);
                if (res.HasError)
                {
                    return "";
                }
                else
                {
                    rsa.FromXmlString(res.ResultDS.Tables["tblKeys"].Rows[0]["PublicKey"].ToString());
                    //read plaintext, encrypt it to ciphertext
                    byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(data2Encrypt + salt);
                    byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
                    return Convert.ToBase64String(cipherbytes);
                }
            }
            catch (Exception ex)
            {
                throw new Exception(res.ErrorException.Message);
            }
            
        }

//The function mentioned below is used encrypt data without salt string
        public static string EncryptData(string data2Encrypt)
        {
            LibCommon.LibResult res = new LibCommon.LibResult();
            try
            {
                AssignParameter();
                
                res = GetKeys(UserName);
                if (res.HasError)
                {
                    return "";
                }
                else
                {
                    rsa.FromXmlString(res.ResultDS.Tables["tblKeys"].Rows[0]["PublicKey"].ToString());
                    //read plaintext, encrypt it to ciphertext
                    byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(data2Encrypt);
                    byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
                    return Convert.ToBase64String(cipherbytes);
                }
            }
            catch (Exception ex)
            {
                throw new Exception(res.ErrorException.Message);
            }

        }
//The function mentioned below is used decrypt the encrypted data without salt string
        public static string DecryptData(string data2Decrypt, string privatekey)
        {
            LibCommon.LibResult res = new LibCommon.LibResult();
            
                AssignParameter();

                byte[] getpassword = Convert.FromBase64String(data2Decrypt);

                string publicPrivateKeyXML = privatekey;
                rsa.FromXmlString(publicPrivateKeyXML);

                //read ciphertext, decrypt it to plaintext
                byte[] plain = rsa.Decrypt(getpassword, false);
                string dataAndSalt = System.Text.Encoding.UTF8.GetString(plain);
                return dataAndSalt;            
        }

//The function mentioned below is used decrypt the encrypted data with salt string 

        public static string DecryptData(string data2Decrypt, string privatekey, string salt)
        {
            LibCommon.LibResult res = new LibCommon.LibResult();

            AssignParameter();
            byte[] getpassword = Convert.FromBase64String(data2Decrypt);
            string publicPrivateKeyXML = privatekey;
            rsa.FromXmlString(publicPrivateKeyXML);

            //read ciphertext, decrypt it to plaintext
            byte[] plain = rsa.Decrypt(getpassword, false);
            string dataAndSalt = System.Text.Encoding.UTF8.GetString(plain);
            return dataAndSalt.Substring(0, dataAndSalt.Length - salt.Length);

        }

//The function mentioned below is used to get public and private key from the table   

        public static LibResult GetKeys(string UserName)
        {
            LibResult res;
            res = new LibResult();
            Database db = DatabaseFactory.CreateDatabase();
            DataSet ds = new DataSet();
            try
            {
                DbCommand cmd = db.GetStoredProcCommand("spGetKeys",UserName);
                cmd.CommandTimeout = 0;
                String[] tblNames = { "tblKeys" };
                db.LoadDataSet(cmd, ds, tblNames);
                res.ResultDS = ds;
            }
            catch (Exception e)
            {
                ds = null;
                res = new LibResult(e, null);
            }
            return res;
        }


        

//The function mentioned below is used to update the new public and private key user wise to table. 

public static LibCommon.LibResult UpdateNewKeys(string PublicKey,string PrivateKey)
        {
            LibResult res = new LibResult();
            Database db = DatabaseFactory.CreateDatabase();

            try
            {
                DbCommand cmd = db.GetStoredProcCommand("spUpdateNewKeys", PublicKey, PrivateKey, UserName);
                db.ExecuteNonQuery(cmd);
            }
            catch (Exception e)
            {
                res = new LibResult(e, null);
            }

            return res;
        }


//The function mentioned below is used to insert the activity of user, login time, sessionId etc.

        public static LibCommon.LibResult InsertIntoBankUserLog(string UserName, string SessionId, bool IsActive,DateTime LogInDateTime,string IpAddress)
        {
            LibResult res = new LibResult();
            Database db = DatabaseFactory.CreateDatabase();

            try
            {
                DbCommand cmd = db.GetStoredProcCommand("spInsertBankUserLog", UserName, SessionId, IsActive, LogInDateTime, IpAddress);
                db.ExecuteNonQuery(cmd);
            }
            catch (Exception e)
            {
                res = new LibResult(e, null);
            }

            return res;
        }


//The function mentioned below is used to track the activity of user, login time, logout time etc.

        public static LibCommon.LibResult UpdateBankUserLog(string UserName,string SessionId, bool IsActive, DateTime LogOutDateTime)
        {
            LibResult res = new LibResult();
            Database db = DatabaseFactory.CreateDatabase();

            try
            {
                DbCommand cmd = db.GetStoredProcCommand("spUpdateBankUserLog", UserName, SessionId, IsActive, LogOutDateTime);
                db.ExecuteNonQuery(cmd);
            }
            catch (Exception e)
            {
                res = new LibResult(e, null);
            }
            return res;
        }

//The function mentioned below is used to generate random salt string every time. 

    public static string getrandomvalue(int size)
        {
            try
            {
                var s = new System.Security.Cryptography.RNGCryptoServiceProvider();
                var buff = new byte[size];
                s.GetBytes(buff);
                return Convert.ToBase64String(buff);
            }
            catch (Exception)
            {

                throw;
            }
        }

3.) سپس به دو کلید مخفی نیاز دارید که برای کلید عمومی و رشته سالین ارسال شده است.

<asp:HiddenField ID="PublicKey" runat="server" />
 <asp:HiddenField ID="Salt" runat="server" />

4.) نمونه ای از کلید عمومی و کلید خصوصی که برای رمزگذاری و رمزگشایی استفاده می شود

کلید عمومی:

ماژول {RandomString}>AQAB

کلید خصوصی:

{RandomString} модул> AQAB Експонента>

6ixwohrsa7k3jxr8ta0dtfega1ntf / u / gpnfg3ozj6gsjsj20uDEH14JE + XHTYAFH23O9YN001QZFVDILJCRKHFMSME4EMVULIJB3Q + KCF5579V8CHB2GMVLLGK67VAZ7E7LCFCDISD / HMJPTNMIOHDNBDWR03VIGM8P5YPXDKOMM = P> + YAzMoJ9 / k5P9CB5NfnvhTyOWSNhgfTT5GEur09I / f9QM1VL + + + EpjaKZC5Nce6gjR OxX7q / 5zsZJKqz5i0ZRiS9wMrul0UoqYEc / tG7jr8xDeVsGsIqk + BHHLovUOb6TZjejME9UlwtDwtwniKqTTF54fA6gvCPocUzQ + djtcs = Q> xJvzAMW7UCujAlubkrxoW5BAvZ4L6dmUJ5qD2yyjA6Y39X8MbS0yvcx35r6z7hzlAwNeuaD1bb3GAW7N4k + 4ASj2JEZqCrtCK + 61KVK13JWeUIRWQ DP> л / lDooSgFP91mWrxj73CuyILj1w / DTOJ7AL4CrXzmWsiMP6krjj0Obe14PB8HoWBXGcqF6HfsuLr82mu11RhoDZp8zucKkV7NyFg19EGJJLGGt DQ> wrnigmnlg2jw1ll5zht4xjhrgpnu9ziht4xjo0m3oo5wzsm0rkwhezlcutgehwhwh6ignwohezlalz5vskno + 1ro4wixcxl / odmcxcmrmquepku / x3dmnweniy8akgv19k7fcl + kgtjvxwnyk0cm / 45la0ray + irddq4a8nf / fkq = InverseQ> dr55hcwt1BWvg 5FT1MHnGtQdyx0Gp5kO30zroJ7e7O8BBTYkAov57KoRG86bLzmvoyaupof / jGIYc5P0oa0vPy2N7IUboKG3ti2Rz / idfjw7GXMl8t64XRGFeyl / GhUWdawG9kwMa6TLGqrehpj + 73nzlz2eHB + b4wUJHcP5Okyo1vobvkh7RD3mM8388TLHaNf / H / b5F + Z8nt2lM9ZeUrCD265uBc / TkiZWbMRHIBdxojtltzECgJqui5GZIy90sIUtZvGAVJh3zUpykYllPz4ixmVWj5pnoxyBx0agOo34bCbsO97BtkgW / TD / mCSpWCADUOUHndz35tGzMVTR9Q == D> RSAKeyValue>

5.) شما می توانید این کلید را در جدول ذخیره کنید و با هر بار ورود کاربر، یک جلسه جدید شروع می شود و هر دو کلید تغییر کرده و در جدول ذخیره می شوند.

در زیر کدی وجود دارد که با هر بار ورود جدید هر دو کلید را تغییر داده و برای کاربر ذخیره می کند.

DataProviders.EncryptionPageDataProvider.UserName = UserName;
                                                        DataProviders.EncryptionPageDataProvider.AssignNewKey();

LibCommon.LibResult res = new LibCommon.LibResult();

SessionIDManager manager = new SessionIDManager();

Session["SessionId"] = manager.CreateSessionID(HttpContext.Current);
                                                        DataProviders.EncryptionPageDataProvider.InsertIntoBankUserLog(UserName, Session["SessionId"].ToString(), true, DateTime.Now, ClientIP);

6.) متغیرهای کلید عمومی و Salt Hidden Field را اختصاص دهید

protected void Page_Load(object sender, EventArgs e)
{
            
            LibCommon.LibResult res1 = new LibCommon.LibResult();
            res1 = DataProviders.EncryptionPageDataProvider.GetKeys(this.Page.User.Identity.Name);
            if (res1.HasError)
            {
                throw new Exception(res1.ErrorException.Message);
            }
            else
            {
                PublicKey.Value = res1.ResultDS.Tables["tblKeys"].Rows[0]["PublicKey"].ToString();
                DataProviders.EncryptionPageDataProvider.privateKey = res1.ResultDS.Tables["tblKeys"].Rows[0]["PrivateKey"].ToString();
            }
            this.Salt.Value = DataProviders.EncryptionPageDataProvider.getrandomvalue(DataProviders.EncryptionPageDataProvider.saltLengthLimit);

 }

7.) چگونه محتوای مشتری را رمزگذاری می کنیم.

$("body").on("click", "#MainContent_ImageButton1", function (e) {
                encrypt();
            });

function encrypt() {
            var PublicKey = $("[id*=PublicKey]").val();
            var Salt = $("[id*=Salt]").val();
            var KeyNo=$("[id*=txtKeyNo]").val();
            var FormFlag=$("#MainContent_DropDownList1 option:selected").text();
            var FormNo= $("[id*=txtFormNo]").val();
            if (KeyNo != "" || (FormFlag != "" && FormNo != "")) {
                var rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
                rsa.FromXmlString(PublicKey);
                if (KeyNo != "") {
                    var byteKeyNo = System.Text.Encoding.UTF8.GetBytes(KeyNo + Salt);                    
                    var encryptedBytesKeyNo = rsa.Encrypt(byteKeyNo, false);
                    var encryptedStringKeyNo = System.Convert.ToBase64String(encryptedBytesKeyNo);                    
                    $("[id*=txtKeyNo]").val(encryptedStringKeyNo);
                }
                if (FormFlag != "" && FormNo != "") {
                    var byteFormFlag = System.Text.Encoding.UTF8.GetBytes(FormFlag + Salt);
                    var encryptedBytesFormFlag = rsa.Encrypt(byteFormFlag, false);
                    var encryptedStringFormFlag = System.Convert.ToBase64String(encryptedBytesFormFlag);
                    $("[id*=EFormFlag]").val(encryptedStringFormFlag);

                    var byteFormNo = System.Text.Encoding.UTF8.GetBytes(FormNo + Salt);
                    var encryptedBytesFormNo = rsa.Encrypt(byteFormNo, false);
                    var encryptedStringFormNo = System.Convert.ToBase64String(encryptedBytesFormNo);
                    $("[id*=txtFormNo]").val(encryptedStringFormNo);
                }
                return true;

            }
            else {
                $("[id*=txtKeyNo]").val('');
                $("[id*=DropDownList1]").val('');
                $("[id*=txtFormNo]").val('');
                return false;
            }
        }

8.) در اینجا ما این محتوای رمزگذاری شده را در سمت سرور رمزگشایی می کنیم.

protected void btnGetDetail_Click(object sender, EventArgs e)
        {
            try
            {
                
                if (this.txtKeyNo.Text.Trim()!=string.Empty)
                    this.txtKeyNo.Text = DataProviders.EncryptionPageDataProvider.DecryptData(this.txtKeyNo.Text, DataProviders.EncryptionPageDataProvider.privateKey, this.Salt.Value);
                if (this.txtKeyNo.Text.Trim().Length == 0)
                {
                    throw new Exception("Key No should not be blank...");
                }
                else
                {                    
                    LibResult res = this.DisplayData(this.txtKeyNo.Text, "", "", "");
                    if (res.HasError)
                    {
                        throw new Exception(res.ErrorException.Message.ToString());
                    }
                    else
                    {
                        this.TaxDetailPnl.Visible = true;
                        this.lblerr.Text = "";
                    }
                }
                
            }
            catch (Exception Ex)
            {
                this.lblerr.Text = Ex.Message.ToString();
                this.TaxDetailPnl.Visible = false;
                
            }
        }

نتیجه

با انجام مراحل موجود در وبلاگ، روش ها و مزایای رمزگذاری و رمزگشایی داده های خود را خواهید آموخت. اکنون می توانید سطح پیشرفته ای از امنیت داده ها را در دنیای خطرناک هکرها برای خود و کاربران خود فراهم کنید. اگر در طول فرآیند با مشکلی مواجه شدید، در نظرات خود در زیر دریغ نکنید و ما مطمئناً با شما تماس خواهیم گرفت.

نشریه How to Encrypt and Decrypt Data End-to-End در فرم وب Asp.net اولین بار در مجله DEV IT ظاهر شد.

مقدمه ای بر طرح یک ستاره در برابر طرح یک دانه برف در برابر طرح کهکشان


در اینجا ما با وبلاگ دیگری از مهندسین IT Dev برمی گردیم تا به شما کمک کنیم زندگی توسعه خود را آسان تر کنید. این وبلاگ انواع طرح‌واره‌های انبار داده‌ای که امروزه مورد استفاده قرار می‌گیرد، از جمله طرح‌واره ستاره‌ای و Snowflake Skema و تفاوت‌های بین آنها را بررسی می‌کند. ما همچنین همین موضوع را برای Galaxy Schema پوشش خواهیم داد و در مورد نحوه استفاده از این طرح ها برای ساختار انبارهای داده بحث خواهیم کرد.

طرح انبار داده

در انبارهای داده، طرح واره تعریفی است از نحوه سازماندهی سیستم با تمام اشیاء پایگاه داده و ارتباط منطقی آنها. این شامل فرمت های داده مانند جداول واقعیت و جداول ابعاد است. در انبار داده ها، انواع طرح های زیر به طور گسترده مورد استفاده قرار می گیرند:

  1. طرح ستاره
  2. طرح دانه های برف
  3. طرح کهکشانی
  4. طرح خوشه ستاره ای

# 1. طرح ستاره

Star Schema ساده ترین و کارآمدترین نوع طرح در دسته ذخیره سازی است. این شامل یک جدول واقعیت است که توسط جداول چند بعدی به شکل ستاره ای احاطه شده است. جدول حقایق دارای روابط یک به چند با تمام جداول ابعاد است و هر یک از سطرهای آن نیز با یک سطر مربوطه در جدول ابعاد مرتبط است.

به همین دلیل، هنگام جستجوی داده های ذخیره شده، پیمایش بین جداول آسان می شود. این همچنین درک ساختار ذخیره داده های شما را برای کاربر نهایی آسان تر می کند، به همین دلیل است که مدل Star Schema در بین ابزارهای هوش تجاری بسیار رایج است. در طول فرآیند طراحی، جداول ابعاد غیرعادی می‌شوند تا از ویژگی‌های مختلف آن‌ها برای ذخیره داده‌های متنی برای همه انواع تحلیل و گزارش استفاده شود.

مزایای طرح ستاره

  • پرس و جوهای Star Schema از دستورات اتصال ساده در حین بازیابی داده ها استفاده می کنند که عملکرد پرس و جو را افزایش می دهد.
  • Star Schema بازیابی داده ها را در هر زمان برای اهداف گزارش آسان می کند.

معایب طرح ستاره

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

در زیر نمونه ای از طرح ستاره ای آورده شده است.

استعلام طرح ستاره

برای درخواست با مدل داده‌های Star Schema، کاربر نهایی باید با استفاده از ابزارهای Business Intelligence گزارشی را درخواست کند. سپس تمامی این درخواست‌ها با ایجاد زنجیره‌ای از درخواست‌های «SELECT» در سیستم داخلی پردازش می‌شوند. این پرس و جوها با عملکرد خود بر زمان اجرا تأثیر خواهند گذاشت.

به عنوان مثال، اگر کسب و کار شما نیاز دارد که بداند در ژانویه 2022 چه تعداد کتاب در ماهاراشترا فروخته شده است، می توانید پرس و جوی زیر را برای جداول Star Schema Model خود اجرا کنید:

SELECT    pdim.Name Product_Name,
                   Sum (sfact.sales_units) Quanity_Sold
FROM      Product pdim,
                   Sales sfact,
                   Store sdim,
                   Date ddim
WHERE sfact.product_id = pdim.product_id
                 AND sfact.store_id = sdim.store_id
                 AND sfact.date_id = ddim.date_id
                 AND sdim.state="Maharashtra"
                 AND ddim.month   = 1
                 AND ddim.year    = 2022
                 AND pdim.Name in (‘Books’)
GROUP BY pdim.Name

نتایج:

نام محصول کیفیت_فروش
کتاب ها 12702 امین رایج ترین

امیدواریم این مثال درک فرآیند درخواست در Star Schema را آسان‌تر کرده باشد.

# 2. طرح دانه های برف

طرح دانه های برف با استفاده از Star Schema به عنوان ورودی طراحی شده است. این امر لایه برداری برف را به یک فرآیند مهم تبدیل می کند که نمودار اندازه مدل Star Schema را به طور کامل عادی می کند.

این مدل شبیه دانه‌های برف به نظر می‌رسد، با جدول حقایق در مرکز و احاطه شده توسط سلسله مراتب جداول اندازه. هر ردیف از جدول واقعیت به دلیل ارجاع به کلید خارجی به چندین ردیف مربوطه در جداول ابعاد مرتبط است.

در طول فرآیند طراحی Snowflake، جداول ابعاد نرمال می شوند و کلیدهای خارجی به هر سطح اضافه می شود تا ویژگی والد را مرتبط کند. پیچیدگی این طرح به طور مستقیم با سلسله مراتب جداول اندازه متناسب است و این بر عملکرد پرس و جو تأثیر می گذارد.

مزایای طرح برف ریزه:

  • به دلیل ساختار سلسله مراتبی، افزونگی داده ها هنگام ایجاد جداول ابعاد جدید حذف می شود.
  • طرح Snowflake تمایل به استفاده از فضای ذخیره سازی کمتری نسبت به Star Schema دارد.
  • به روز رسانی طرح دانه برف در طولانی مدت بسیار آسان است و این باعث افزایش عمر کلی آن می شود.

معایب طرح برف ریزه:

  • به دلیل جداول اندازه نرمال شده، سیستم ETL باید تعداد جداول را بارگیری کند.
  • با توجه به عادی سازی جداول اندازه، سیستم ETL باید تعداد جداول را بارگذاری کند.
  • به دلیل تعداد زیاد جداول اضافه شده، ممکن است اغلب نیاز به استفاده از اتصالات پیچیده در هنگام اجرای پرس و جو داشته باشید. این باعث کاهش عملکرد برنامه در طرح دانه های برف می شود.

در زیر نمونه ای از طرح دانه های برف آورده شده است.

جداول اندازه در نمودار دانه های برف در بالا به شرح زیر نرمال می شوند:

  • بعد تاریخ به سه ماهه، ماهانه و هفتگی عادی می شود و کلیدهای خارجی در جدول تاریخ باقی می مانند.
  • بعد فروشگاه نرمال شده است تا جدول وضعیت را نیز شامل شود.
  • ابعاد محصول در برند نرمال شده است.
  • در بعد Client، ویژگی‌های مربوط به شهر به جدول City جدید منتقل می‌شوند و شناسه کلید خارجی در جدول Client باقی می‌ماند.

به همین ترتیب، یک بعد می تواند چندین سطح از سلسله مراتب را پشتیبانی کند.

سطوح مختلف سلسله مراتب در نمودار بالا را می توان به صورت زیر نشان داد:

  • شناسه سه ماهه، شناسه ماهانه و شناسه هفتگی به عنوان کلیدهای جانشینی استفاده می شوند که برای سلسله مراتب بعد تاریخ ایجاد می شوند و به عنوان کلیدهای خارجی به جدول ابعاد تاریخ اضافه می شوند.
  • شناسه وضعیت، کلید جایگزین جدیدی است که برای سلسله مراتب بعد فروشگاه ایجاد شده و به عنوان یک کلید خارجی به جدول ابعاد فروشگاه اضافه شده است.
  • شناسه برند، کلید جایگزین جدیدی است که برای سلسله مراتب ابعاد محصول ایجاد شده و به عنوان یک کلید خارجی به جدول ابعاد محصول اضافه شده است.
  • شناسه شهر کلید جانشین جدیدی است که برای سلسله مراتب بعد مشتری ایجاد شده و به عنوان یک کلید خارجی به جدول ابعاد مشتری اضافه شده است.

درخواست طرح برف ریزه

برای ایجاد یک پرس و جو، باید گزارش های کاربر نهایی مشابهی را تولید کنیم، همانطور که در ساختارهای نمودار ستاره نشان داده شده است. با این حال، پرس و جوها در مورد طرح دانه های برف کمی پیچیده تر می شوند.

در مثال مدل طرح دانه برف در بالا، همان پرس و جوی را ایجاد می کنیم که در مثال پرس و جو نمودار ستاره طراحی شده بود. بنابراین، اگر کسب‌وکار می‌خواهد بداند در ژانویه 2022 چند کتاب در ایالت ماهاراشترا فروخته شده است، می‌توانید درخواست زیر را برای جداول مدل طرح‌واره دانه‌های برف برآورده کنید:

SELECT    pdim.Name Product_Name,
                   Sum (sfact.sales_units) Quanity_Sold
FROM        Sales sfact
INNER JOIN Product pdim ON sfact.product_id = pdim.product_id
INNER JOIN Store sdim ON sfact.store_id = sdim.store_id
INNER JOIN State stdim ON sdim.state_id = stdim.state_id
INNER JOIN Date ddim ON sfact.date_id = ddim.date_id
INNER JOIN Month mdim ON ddim.month_id = mdim.month_id
WHERE stdim.state="Maharashtra"
                 AND mdim.month   = 1
                 AND ddim.year    = 2022
                 AND pdim.Name in (‘Books’)
GROUP BY pdim.Name

نتایج:

نام محصول مقدار_فروخته شده
کتاب ها 12702 امین رایج ترین

نکاتی که باید هنگام جستجو در جدول نمودار ستاره / یا دانه برف در نظر داشته باشید

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

بند انتخاب:

  • عبارت SELECT ویژگی هایی را که در نتایج پرس و جو ظاهر می شوند را تعریف می کند.
  • دستور SELECT از گروه های مختلف برای یافتن مقادیر جمع استفاده می کند. بنابراین باید از بند GROUP BY در عبارت WHERE استفاده کنید.

بند FROM:

  • جداول حقایق اصلی و جداول ابعاد باید با توجه به زمینه بند FROM انتخاب شوند.

بند جایی که:

  • بند WHERE ویژگی های مناسب ابعاد را با پیوند دادن آنها به ویژگی های جدول واقعیت تعریف می کند. کلیدهای جانشین در جدول ابعاد با استفاده از کلیدهای خارجی مربوطه در جداول واقعیت جمع‌آوری می‌شوند تا محدوده داده‌های مورد بررسی را ثابت کنند. برای این کار می توانید به مثال بالا از فرآیند اپلیکیشن Star Schema مراجعه کنید. همچنین می‌توانید در صورت داشتن اتصالات داخلی یا خارجی، داده‌های موجود در بند را پر کنید، مانند مثال با طرح برف‌ریزه.
  • ویژگی‌های ابعاد نیز به عنوان محدودیت‌های داده در عبارت Where نامیده می‌شوند.
  • با فیلتر کردن داده ها با تمام مراحل بالا، داده های گزارش مناسب را برمی گردانید.

بسته به نیاز کسب و کارتان، می‌توانید حقایق، ابعاد، ویژگی‌ها و محدودیت‌های مختلف را با ساختاری که در بالا ذکر شد به سیستم برنامه کاربردی Star Schema یا Snowflake Schema اضافه یا حذف کنید. این همچنین به شما امکان می دهد تا پرس و جوهای فرعی را اضافه کنید یا پرس و جوهای مختلف و نتایج آنها را برای تولید داده برای گزارش های پیچیده ترکیب کنید.

# 3. طرح کهکشانی

طرحواره کهکشان یا طرح صورت فلکی واقعیت یک قالب انباری است که در آن جداول واقعیت های مختلف می توانند جداول ابعاد را با یکدیگر به اشتراک بگذارند. این طرح در نهایت شبیه یک کهکشان است که تمام جداول آن ستاره ها را نشان می دهد.

ردیف های مشترک جداول ابعاد در این مدل طرحواره، ابعاد سازگار نامیده می شوند.

طرح کهکشان برای به دست آوردن الزامات پیچیده برای جداول واقعیت جمعی استفاده می شود، که بسیار پیچیده تر هستند تا توسط مدل های Star Schema یا Snowflake Schema پشتیبانی شوند. سطح پیچیدگی بالاتر در این مدل نگهداری آن را دشوارتر از بقیه می کند.

در زیر نمونه ای از طرحواره کهکشان آورده شده است.

# 4. طرح خوشه ستاره ای

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

مدل Star Schema اساس طرح خوشه ستاره ای را تشکیل می دهد و جداول ابعاد اصلی آن دانه های برف هستند که ساختار پایدارتری را با مزایای هر دو تشکیل می دهد.

در زیر نمونه ای از طرح خوشه ستاره ای آورده شده است.

کدام یک طرح دانه برف بهتر است یا یک طرح ستاره؟

پلتفرم های ذخیره سازی و ابزارهای هوش تجاری مورد استفاده در سیستم DW شما در نهایت نقشی حیاتی در تصمیم گیری برای طراحی ایفا می کنند. در نتیجه، روش‌های Star و Snowflake Schema بیشترین استفاده را در فرآیند ذخیره‌سازی داده‌ها دارند.

اگر ابزارهای هوش تجاری به کاربران اجازه دهند با استفاده از پرس و جوهای ساده با ساختارهای جدول تعامل داشته باشند، روش Star Schema ترجیح داده می شود. با این حال، اگر ابزارهای BI برای کاربران تجاری پیچیده‌تر باشد، مدل طرح‌واره برف‌ریزه ترجیح داده می‌شود.

بسته به اینکه می‌خواهید با طرح برف‌ریزه فضای ذخیره‌سازی را ذخیره کنید یا با Star Schema یک پرس‌وجو آسان‌تر ارائه کنید، می‌توانید از هر مدل طرحی استفاده کنید.

تفاوت بین طرح ستاره و طرح دانه برف

در زیر تفاوت های اصلی بین طرح ستاره و طرح دانه برف آورده شده است.

شماره S طرح ستاره طرح دانه های برف
1 پشتیبان گیری اطلاعات بیشتر است پشتیبان گیری از داده ها کمتر است
2 فضای قوی برای نمودار اندازه بیشتر است فضای قوی برای نمودار اندازه نسبتا کمتر است
3 شامل جداول اندازه غیرعادی شده است. شامل جداول اندازه نرمال شده است.
4 یک جدول واقعیت واحد توسط جداول با ابعاد چندگانه احاطه شده است. جدول تک فاکت توسط سلسله مراتب جداول ابعادی احاطه شده است.
5 کوئری ها از ارتباط مستقیم بین واقعیت و ابعاد برای بازیابی داده ها استفاده می کنند. پرس و جوها از روابط پیچیده بین حقایق و ابعاد برای بازیابی داده ها استفاده می کنند.
6 زمان اجرای درخواست کمتر است. زمان اجرای درخواست بیشتر است.
7 هر کسی می تواند به راحتی این طرح را درک و طراحی کند. درک و طراحی طرح مشکل است.
8 از رویکرد بالا به پایین استفاده می کند. از رویکرد پایین به بالا استفاده می کند.

نتیجه

امیدواریم از وبلاگ توضیحی دیگر مهندسان ما لذت برده باشید. اگر این وبلاگ به شما کمک کرده است تفاوت بین مدل‌های طرح را درک کنید و مدل مناسب را برای سازمان خود انتخاب کنید، در جستجوی سایت ما برای کسب دانش شگفت‌انگیزتر برای آسان‌تر کردن زندگی توسعه خود تردید نکنید.

نشریه مقدمه ای بر طرح ستاره در برابر طرح دانه های برف در برابر طرح کهکشان برای اولین بار در مجله DEV IT ظاهر شد.

مزایای مهاجرت از سرور فیزیکی به سرور مجازی (P2V)


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

در این وبلاگ، مهندسان DEV IT ما مزایای انتقال هاست خود را از یک سرور فیزیکی به یک سرور مجازی فهرست کردند. بیایید مستقیم وارد آن شویم.

الزامات مهاجرت (چالش های زیرساخت فیزیکی)

سرورهای فیزیکی معمولاً مکانی عالی برای شروع در مدیریت زیرساخت فناوری اطلاعات شما هستند. در واقع، استفاده از زیرساخت های فیزیکی دارای معایبی است، زیرا هر محیطی مزایا و معایب خاص خود را دارد. با این حال، اگر از زیرساخت های فیزیکی استفاده می کنید، باید برای موارد زیر آماده باشید:

  • مرکز داده های فیزیکی
  • سیستم خنک کننده مجزا
  • فضای فیزیکی
  • تیم مرکز داده

با توجه به عوامل فوق مدیریت زیرساخت های فیزیکی بسیار دشوار است و همچنین هزینه های زیادی برای شما دارد. در اینجا دلایلی وجود دارد که چرا ما در حال مهاجرت infra خود به یک محیط مجازی هستیم. با این حال، در ادامه این مقاله به مزایا و معایب آن خواهم پرداخت

  • قیمت پایین
  • آسان برای ارتقا / دانلود
  • زمان کار بالا
  • پشتیبان گیری / بازیابی آسان
  • سهولت اداره

مزایا و معایب

در هر شرایطی استفاده از مجازی سازی مزایا و معایبی دارد. درک این موضوع قبل از اینکه تصمیم بگیرید زیرساخت خود را به یک محیط مجازی منتقل کنید بسیار مهم است.

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

روش های مهاجرت

دو روش متداول برای انتقال هر بار کاری از فیزیکی به مجازی وجود دارد

  1. مهاجرت داغ
  2. مهاجرت سرد

مهاجرت داغ – به یک روش مهاجرت اشاره دارد که در آن سرور خروجی شما به صورت آنلاین منتقل می شود. این انتقال برای داده های ثابت توصیه می شود

مهاجرت سرد – به یک روش مهاجرت اشاره دارد که در آن سرور خروجی شما به صورت آفلاین منتقل می شود. این روش مهاجرت برای داده های پویا مانند AD، SQL توصیه می شود

مراحل مهاجرت در سطح بالا

  • شما باید با بررسی تنظیمات سخت افزاری موجود در سرور خروجی شروع کنید و تمام جزئیات مانند HDD، RAM، شبکه و غیره را دریافت کنید.
  • قبل از مهاجرت، باید مطمئن شوید که سرور فیزیکی شما آخرین به روز رسانی ها را دارد.
  • نکته دیگری که باید از آن اطمینان حاصل کنید این است که قبل از شروع فرآیند مهاجرت، تمام سرویس های در حال اجرا باید متوقف شوند.
  • بررسی کنید که VM هدف تمام الزامات برنامه شما را برآورده کند. پس از انجام این کار، سرویس chkdsk را روی سرور فیزیکی خود اجرا کنید تا بخش های بد را بررسی کنید.
  • همچنین یک فرآیند یکپارچه سازی دیسک را انجام دهید تا مطمئن شوید که زمان لازم برای فرآیند مهاجرت به حداقل می رسد. ممکن است لازم باشد از سی دی بوت VM استفاده کنید، به خصوص در مورد VMWare و Cold-Clone. اگر از Hyper-V استفاده می کنید، می توانید با استفاده از SCVMM تبدیل کنید.
  • در صورتی که ممکن است به زودی نیاز به بازگشت داشته باشید، از تغییر سرور فیزیکی خودداری کنید.

خطرات مهاجرت P2V

  • اگر متوجه شدید که برنامه شما ممکن است با VM سازگار نباشد، ممکن است با مشکلات سرور مواجه شوید.
  • تمیز کردن درایورها و دستگاه هایی که از plug-and-play پشتیبانی نمی کنند به تلاش دستی نیاز دارد.
  • سرورهایی که محدودیت های سخت افزاری دارند قابل تبدیل نیستند.
  • اگر سرور VM شما الزامات برنامه شما را برآورده نکند ممکن است با افت عملکرد مواجه شوید.
  • تغییر نام میزبان در ماشین مجازی نیز می تواند باعث ایجاد مشکل در برنامه شود.

نتیجه

مجازی سازی یک تکنیک قدرتمند برای افزایش ارزش سرمایه گذاری های سخت افزاری و نرم افزاری شماست. پذیرش مجازی سازی به دلایل زیادی بسیار سازنده است. مجموعه‌ای از سرورهای ناکارآمد را می‌توان با ماشین‌های کمتری جایگزین کرد. این نرم افزار را می توان در حالی که در پارتیشن های مجازی بی خطر ایزوله شده است آزمایش کرد.

نشریه مزایای مهاجرت از فیزیکی به سرور مجازی (P2V) اولین بار در مجله DEV IT ظاهر شد.

قرار دادن عملیات کارآمد IT در کانون توجه با Log4j


9 دسامبر خبرهایی برای آپاچی Log4j آسیب پذیری بهره برداری و در جنون دنیای نرم افزار بود. دلیل اصلی این امر این بود که Log4j محبوب ترین سرویس ثبت جاوا است و در خدمات و محصولات اینترنتی بی شماری استفاده شده است. این شامل محصولات غول های فناوری مانند آمازون، اپل، تسلا، استیم و کلودفلر و غیره می شود.

این وضعیت هم برای ارائه‌دهندگان و هم برای کاربران ترسناک است، زیرا یک آسیب‌پذیری با استفاده آسان است که امکان راه‌اندازی حملات کد از راه دور بر روی دستگاه‌های مختلف و همچنین به دست آوردن کنترل سرورهای مبتنی بر جاوا در شرکت‌ها را فراهم می‌کند. در حال حاضر تغییرات جدیدی به اکسپلویت اصلی اضافه می‌شود و پتانسیل حمله را با سرعتی سریع افزایش می‌دهد.

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

عملیات خط اول فناوری اطلاعات از هر شرکت Log4j محافظت می کند

مرحله ی 1. Log4j را در سیستم خود پیدا کنید

برای اولین قدم در محافظت در برابر آسیب‌پذیری‌های جدید، باید در مورد همه برنامه‌ها، وب‌سایت‌ها و سیستم‌های ردیابی Log4j خود تحقیق کنید. این امر به ویژه برای سیستم های مبتنی بر اینترنت که ممکن است داده های حساسی داشته باشند، صادق است. هنگامی که ارزیابی را کامل کردید، باید به سراغ سایر برنامه های کاربردی نقطه پایانی که استفاده کرده اید، مانند Citrix و Minecraft بروید.

خبر خوب برای شما این است که BigFix ابزارهایی را منتشر کرده است که می تواند به شما کمک کند همه ردپای Log4j را در سیستم خود پیدا کنید. این به لطف یک فرآیند دو مرحله ای ساده به دست می آید. اولین مرحله از شما می‌خواهد تا یک وظیفه را در تمام نقاط پایانی خود مستقر کنید که نام همه فایل‌های Log4j را جمع‌آوری کرده و آن نام‌ها را ذخیره می‌کند. مرحله دوم یک تجزیه و تحلیل ایجاد می کند که فایل ها را می خواند تا مدیر بتواند تمام نقاط پایانی آسیب پذیر را در سیستم شناسایی کند.

1.1 کار اسکن BigFix

BigFix از وظیفه اسکن برای جستجوی تمام آثار Log4j در سیستم شما استفاده می کند و سپس نام ها را در یک فایل متنی ذخیره می کند که می تواند در مکانی مورد نظر شما ذخیره شود. می‌توانید کار را با اسکریپت فرمان پوسته – ‘dir / s’ برای ویندوز و ‘find’ برای لینوکس اجرا کنید.

برای ذخیره نام ها، BigFix بررسی می کند که آیا مسیر یک مکان مشخص وجود دارد یا خیر. اگر نه، یک فایل جدید با نام “CVE-2021-44228.txt” در اینجا ایجاد می کند.

با شروع کار، تمام فایل‌های دارای پسوند Log4j، شماره نسخه، مسیر رجیستری و مقادیر مختلف دیگر در فایل داده شده ذخیره می‌شوند.

1.2 تجزیه و تحلیل توسط BigFix

تجزیه و تحلیل وظایف اسکن دومین بخش از کار تعیین شماره یا نام سرور در برابر آسیب پذیری و اینکه چه تعداد از سیستم شما در شبکه آسیب پذیر هستند است.

تحلیلگر نتیجه کار اسکن را بر اساس CVE-2021-44228 تجزیه و تحلیل می کند و ویژگی های زیر در نتیجه تجزیه و تحلیل گزارش می شود:

  • نتیجه اسکن وجود دارد – نشان دهید که اسکن در نقطه پایانی انجام شده است
  • زمان اتمام اسکن – اگر اسکن هنوز در حال انجام نیست، زمان اسکن را مشخص کنید
  • نام مسیرهای Log4j – مسیرهای فایل هایی را که هر فایل log4j-core.jar در آن یافت می شود را مشخص کنید *
  • Log4j به طور بالقوه آسیب پذیر است – بر اساس log4j-core.jar * یک فایل با نام نشان می دهد که نسخه قدیمی تر از 2.15.0 است
  • مقدار Log4j Sha و نسخه شناخته شده مربوطه – از بین تمام فایل‌های log4j-core.jar * یافت شده، فایل داده شده را با لیستی از هش‌های شناخته شده sha1 مقایسه کنید و مشخص کنید که آیا فایل با یکی از هش‌های شناخته شده مطابقت دارد یا خیر.

سپس می توانیم هش sha1 / sha256 را دانلود کنیم، در زیر لیست مقایسه وجود دارد

https://github.com/mubix/CVE-2021-44228-Log4Shell-Hashes/blob/main/sha1sum.txt

https://github.com/mubix/CVE-2021-44228-Log4Shell-Hashes/blob/main/sha256sums.txt

پس از انجام تجزیه و تحلیل، ما گزارش نهایی را دریافت می کنیم که آیا سرورها در برابر CVE-2021-44228 آسیب پذیر هستند یا خیر.

اگر می خواهید این کار را در شبکه خود اجرا کنید، می توانید آن را از لینک زیر دانلود کنید

BigFix Scan Task – https://bigfix.me/fixlet/details/26897

Fixlet برای تجزیه و تحلیل BigFix – https://bigfix.me/analysis/details/2998668

گام 2. تمام نقاط پایانی را بسته بندی کنید. اگر راه حل یا راه حلی پیدا نکردید، برنامه را حذف نصب کنید.

BigFix تشخیص و مدیریت تمام نقاط پایانی شما در یک سیستم را خودکار می کند. این نقاط پایانی می توانند آنلاین (مبتنی بر ابر) یا روی سرورهای محلی شما باشند.

اگرچه وضعیت همه گیر ممکن است بسیاری از نقاط پایانی را مجبور کرده باشد که در خانه کارمندان شما وجود داشته باشند، هنوز هم امکان تنظیم برنامه های Log4j وجود دارد. تیم عملیات شما باید از سیستم هایی مانند BigFix استفاده کند، زیرا ممکن است تعدادی از کارمندان شما دستورالعمل های برنامه را برای تصحیح برنامه در سیستم خود نادیده بگیرند.

چگونه BigFix کمک می کند

BigFix بینش آسیب پذیری را ارائه می دهد و آنها را با راه حل های مختلف مدیریت آسیب پذیری مانند Tenable ادغام می کند، که می تواند آسیب پذیری های موجود به دلیل Log4j را برطرف کند. به لطف BigFix، می‌توانید تمام نقاط پایانی خود را – در حال حاضر و در آینده – مدیریت کنید.

نتیجه

مراحل فوق برای جلوگیری از حملات به سیستم شما بسیار مهم خواهد بود. اگر در این مسیر با مشکلی مواجه شدید، لطفاً با مهندسین پشتیبانی DEV IT ما تماس بگیرید.

نشریه Putting Efficient IT Operations in Spotlight with Log4j برای اولین بار در مجله DEV IT ظاهر شد.

راه حل: هیچ سرور مجوز دسکتاپ از راه دور برای اعطای مجوز وجود ندارد


در این وبلاگ جدید به موضوعات مرتبط با آن می پردازیم مجوز سرور. ممکن است بسیاری از شما در طول تجربه کاری خود در جایی یا جایی با این مشکلات مواجه شده باشید. احتمالات زیادی برای چنین مشکلاتی وجود دارد، زیرا ممکن است پیام های خطای متفاوتی داشته باشند یا ممکن است توسط پارامترهای مختلف ایجاد شوند.

با این حال، چندین شرکت ممکن است پیکربندی واقعی را به جای توصیه به طور پیش‌فرض با تمام فناوری‌های ابری جدید سفارشی نگه دارند. بنابراین، امکان شناسایی چنین مشکلات یا خطاهایی با RDP / اتصال هر دستگاه با دسترسی از راه دور وجود دارد.

چرا هاست های دسکتاپ راه دور را روی سرورهای ویندوز نصب می کنیم؟

به طور پیش فرض، تنها دو کاربر می توانند در یک زمان به سرور وارد شوند. اما اگر از کاربر نهایی درخواستی برای افزایش محدودیت کاربری جلسه به بیش از دو کاربر وجود داشته باشد، باید یک جلسه دسکتاپ راه دور نصب کنید نقش میزبان در سرورهای ویندوز

بسیاری با سیاست مایکروسافت در مورد مهلت پیش فرض برای سرورهای سیستم عامل ویندوز آشنا نیستند. متأسفانه آنها فقط ارائه می دهند 120 روز از مهلت پیش‌فرض و پس از تجاوز از آن، کاربر هنگام ورود به سرورها با خطای زیر مواجه می‌شود.

دلیل علائم: هنگام تلاش برای رسیدن به دستگاه:

  • Remote Session خاتمه یافت زیرا هیچ سرور صدور مجوز دسکتاپ از راه دور وجود ندارد که نتواند مجوز اعطا کند.
  • سرور مجوز در دسترس نیست. به عنوان مثال، مشکلات اتصال شبکه ممکن است باعث این امر شود، سرویس Remote Desktop Licensing در سرور مجوز به حالت تعلیق درآمده یا مجوز RD در دسترس نیست.
  • دسترسی به دلیل یک خطای امنیتی رد شد.
  • مهلت سرور جلسه دسکتاپ از راه دور منقضی شده است، اما سرور میزبان جلسه RD با هیچ سرور دارای مجوز پیکربندی نشده است. بنابراین، اتصالات به سرور RD Session Host رد می شود مگر اینکه یک سرور مجوز برای سرور میزبان جلسه RD پیکربندی شده باشد.

خطا: جلسه راه دور خاتمه یافت زیرا هیچ سرور مجوز دسکتاپ از راه دور وجود ندارد که نتواند مجوز اعطا کند. لطفا با مدیر سرور تماس بگیرید.

مورد نیاز برای نصب نقش سرور RDS:

  • یک نقش میزبان جدید Remote Desktop Session از خود مدیر سرور اضافه کنید.
  • هنگامی که نقش با موفقیت نصب شد، باید Group Policy را با سرور مجوز RDS به روز کنیم.
  • سرور مجوز دسکتاپ از راه دور – مجوز کاربر را از سرور مجوز دریافت کنید.
  • اتصال بین سرور مجوز RDS و سرور میزبان جلسه (جایی که نقش ما نصب می شود)
  • محدودیت برای کاربران جلسه همزمان برای افزایش جلسه کاربر

پاسخ:

طبق خط مشی مایکروسافت، ما باید یک سرور مجوز RDS / TS CAL را تخصیص دهیم / اختصاص دهیم و سرور را به یک سرور دارای مجوز با مجوز کاربر / دستگاه هدایت کنیم تا مشکل را حل کنیم. اما ما راه حل دیگری برای تصحیح خطای لاگین بالا داریم.

ما باید مهلت سرور را تمدید کنیم تا محدودیت 120 روزه دیگر برای حذف کلید رجیستری دوره مهلت سرور از رجیستری تمدید شود.

مراحلی که باید دنبال کرد:

  • شما باید با یک مدیر وارد سرور شوید
  • رجیستری را باز کنید و به مسیر زیر بروید
  • کلید رجیستری Grace Period را حذف کنید
    • HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control Terminal Server RCM GracePeriod
  • سرور را مجددا راه اندازی کنید
  • پس از راه اندازی مجدد سرور، مهلت 120 روز دیگر تمدید خواهد شد.

پس از انجام مراحل بالا، مشکل حل خواهد شد و تا 120 روز آینده دیگر پیغام خطای ورود دریافت نخواهیم کرد.

راه حل انتشار: هیچ سرور مجوز دسکتاپ از راه دور برای اعطای مجوز برای اولین بار در مجله DEV IT ظاهر شد.

قسمت -2: آموزش تخصصی ویژگی های Azure


معرفی

به وبلاگ عالی دیگری که شخصاً توسط کارشناسان DEV IT ما گردآوری شده است، خوش آمدید. وبلاگ قبلی، راهنمای سریع ویژگی های Azure، به شرح ویژگی های Azure می پردازد و موضوعاتی از جمله:

  • ویژگی Azure چیست؟
  • بدون سرور چیست؟
  • نمونه ای از تابع Azure

وبلاگ دیگری در این سایت موضوعاتی را در مورد “استفاده از Injector Builder برای استقرار DI در Microsoft Azure” پوشش می دهد. این یکی دیگر از وبلاگ های مهم در مورد پروژه های عملکرد Azure است و برای اطمینان از یکپارچگی کد شما در حین کار بر روی پروژه عملکرد Azure ضروری است. این پست جدید اکنون به موضوعات تزریق وابستگی برای ویژگی‌های Azure V2 و V3 می‌پردازد. ما در حال حاضر به دنبال V1 نخواهیم بود، اما اگر می خواهید یک وبلاگ در مورد آن داشته باشید، لطفاً یک نظر در زیر بنویسید و من به زودی یکی را ارسال خواهم کرد.

بنابراین، بیایید بلافاصله به آن بپردازیم. این وبلاگ محرک های مختلفی را برای اجرای ویژگی های Azure پوشش می دهد.

تریگر آزور چیست؟

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

انواع مختلفی از محرک ها وجود دارد که ویژگی Azure در خارج از جعبه از آنها پشتیبانی می کند که در این پست وبلاگ به آنها خواهیم پرداخت. و اگر متوجه شدید که نیاز شما هیچ یک از محرک های موجود پشتیبانی شده توسط جعبه را برآورده نمی کند، نگران نباشید. نمونه ای از یک تریگر سفارشی را خواهیم دید و خواهیم دید که چگونه یک تریگر سفارشی می تواند پیاده سازی شود.

محرک های پشتیبانی شده برای ویژگی Azure

معمولاً در هر پروژه از محرک های زیر استفاده می شود:

  • HTTP و قلاب های وب
  • تایمر
  • ذخیره سازی وبلاگ
  • ذخیره سازی میز
  • ذخیره سازی دم
  • اتوبوس خدماتی
  • شبکه ای از رویدادها
  • مرکز رویداد

Http و قلاب های وب

راه‌انداز HTTP & webhooks برای فراخوانی یک تابع لاجوردی با برقراری تماس HTTP است. یعنی می توانید یک API بدون سرور ایجاد کنید یا با API های خود به عنوان یک قلاب یکپارچه سازی شخص ثالث رفتار کنید.

که در قسمت 1، نمونه ای از تابع لاجوردی HTTPTrigger را با استفاده از مثال HelloWorld دیدیم. پس از پیاده سازی، دیدیم که تابع می تواند در http: // localhost: 7071: // api / helloworldfunction فراخوانی شود.

در اینجا مواردی وجود دارد که هنگام اجرای ویژگی HTTP Trigger باید در نظر داشته باشید:

اتصال HTTP تمام شد

اگر HTTP API را با استفاده از HTTPClient در تابع HTTPTriger خود فراخوانی کنید، ممکن است با مشکل تخلیه پورت مواجه شوید که می توانید با به اشتراک گذاری اشیاء HTTPClient در چندین پیاده سازی عملکرد آن را حل کنید. راه های دیگری نیز وجود دارد که در اینجا با جزئیات بیشتر توضیح داده شده است – مدیریت اتصال HTTP در توابع Azure.

محافظت از ویژگی HTTP Trigger

به طور پیش فرض، ویژگی فعال کردن HTTP به اتصالات ناشناس اجازه می دهد. یعنی هر کسی با URL می تواند ویژگی ما را درخواست کند. این را می توان به چند روش حل کرد:

1. از کلیدهای تابع استفاده کنید – با استفاده از این کلید، فقط می توانید عملکرد Azure مربوطه را فراخوانی کنید.

2. از کلیدهای میزبان استفاده کنید – با استفاده از این کلید، می توانید تمام عملکردهای یک سرویس برنامه را فراخوانی کنید.

3. از کلیدهای اصلی استفاده کنید – با استفاده از این کلید می توانید به تمامی ویژگی ها و همچنین به API مدیریت ویژگی های Azure و سرویس اپلیکیشن دسترسی داشته باشید.

4. از مکانیزم احراز هویت سرویس برنامه استفاده کنید – Azure Application Service (ویژگی یا برنامه وب) دارای پشتیبانی داخلی برای احراز هویت و نقاط پایانی مجوز است. می‌توان از ASP.NET Identity تحت تابع لاجوردی برای مدیریت هویت‌ها و تولید توکن‌ها استفاده کرد و به میان‌افزار اجازه داد تا به سرویس برنامه اجازه دهد تا بخش مجوز را پردازش کند.

5. از سایر خدمات Azure مانند APIM استفاده کنید

6. مشابه با استفاده از مکانیسم احراز هویت، از قابلیت های مدیریت API می توان برای ایمن سازی API ها استفاده کرد.

از گزینه های پشتیبانی شده در بالا، اگر قصد دارید API را از طریق اینترنت در حال تولید در معرض دید قرار دهید، 4 و 5 روش پیشنهادی برای پیاده سازی هستند.

برای اطلاعات بیشتر در مورد «ارائه توابع محرک HTTP» اینجا را بخوانید.

یادداشت مهم: اگر تابع ماشه لاجوردی از کار بیفتد، زمان اجرای لاجورد تابع را دوباره امتحان نمی کند، یعنی. مکانیسم Retry در تابع TimerTrigger تعبیه نشده است.

تایمر

همانطور که از نام آن پیداست، ماشه تایمر اجازه می دهد تا یک تابع بر اساس زمان از پیش تعیین شده فراخوانی شود. عملکردی که با تایمر راه‌اندازی می‌شود به‌عنوان یک تابع زمان‌بندی شده در نظر بگیرید که می‌تواند هر روز در ساعت ۱۲ ظهر، هر دوشنبه در ساعت ۳:۰۰ صبح، یا هر ۳۰ دقیقه در روزهای دوشنبه، چهارشنبه، یعنی بسته به نموداری که تعریف می‌کنیم، عملکرد تایمر انجام شود. با اجرای تابع Azure اجرا می شود.

تریگر تایمر بر اساس عبارت NCRONTab اجرا می شود. به عنوان مثال، “0 * / 5 * * * *” یک عبارت کرون برای “هر 5 دقیقه یک بار” و “0 30 9 * Jan Mon” یک عبارت کرون برای “9:30 صبح هر دوشنبه در ژانویه است”.

توجه: بیان و زمان‌های CRON در ویژگی Azure (یا همه سرویس‌های لاجوردی) فقط بر اساس UTC هستند.

بیایید یک مثال را ببینیم:

[FunctionName("ScheduledImport")]
public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo timerRequest, ILogger logger)
{
    log.LogInformation($"Timer is running at {DateTime.UtcNow}!");
}

از مثال بالا می بینیم که TimerTrigger یک عبارت NCRON را به عنوان ورودی می گیرد و تصمیم می گیرد که چه زمانی تابع را اجرا کند. همچنین می توانید این عبارت را از فایل local.development.json دریافت کنید. TimerInfo را به عنوان یک پرس و جو ارسال می کند که به عنوان ویژگی هایی مانند:

  • ScheduleStatus.Last – آخرین بار برای انجام عملکرد لاجوردی
  • ScheduleStatus.Next – دفعه بعد برای اجرای تابع azure
  • IsPastDue – آیا این ویژگی دیرتر از زمان برنامه ریزی شده فعال می شود یا خیر.

یادداشت مهم: اگر تابع ماشه لاجوردی از کار بیفتد، زمان اجرای لاجورد تابع را دوباره امتحان نمی کند، یعنی. مکانیسم Retry در تابع TimerTrigger تعبیه نشده است.

ذخیره سازی Blob

عملکرد راه‌اندازی شده توسط Blog Storage زمانی اجرا می‌شود که زمان اجرای Azure یک لکه جدید/به‌روزرسانی شده را در یک ظرف پیکربندی شده شناسایی کند. از آنجایی که کشف نقاط جدید/به‌روزرسانی‌شده می‌تواند یک چالش عملکرد باشد، زمان اجرا Azure می‌تواند برخی از رویدادهایی را که می‌توانند باعث رفتار غیرمنتظره شوند نادیده بگیرد. یعنی تابع azure ممکن است برای رویدادهای blob اجرا نشود زیرا ممکن است از آنها صرفنظر شود.

بیایید یک مثال را ببینیم:

[FunctionName("ProfilePictureModify")]        
public static void Run([BlobTrigger("profile-pictures/{name}")] Stream blobRequest, string name, ILogger logger)
{
    log.LogInformation($"Function is executing for  blob name:{name} and Size: {myBlob.Length} Bytes");
}

یادداشت های مهم:

  • هنگامی که عملکرد ماشه حباب از کار می افتد، به طور خودکار تا 5 بار امتحان می کند. اگر هر پنج تلاش مجدد ناموفق باشد، مرجع اجرای blob به عنوان یک حباب سم به فروشگاه صف اضافه می شود. (یعنی لکه همانطور که در حساب ذخیره سازی هست باقی می ماند)
  • MaxDequeueCount تنظیمی است که می توان از آن برای امتحان مجدد استفاده کرد و به طور پیش فرض روی 5 تنظیم شده است.
  • به‌طور پیش‌فرض، 24 تابع blob را می‌توان به‌دلیل محدودیت پیش‌فرض به طور همزمان فعال کرد که می‌توان آن را در فایل host.json تغییر داد.

برای اطلاعات بیشتر در مورد نکات فوق اینجا را بخوانید – “استفاده از موازی سازی و حافظه”.

ذخیره سازی میز

ما به ذخیره سازی جداول با جزئیات بیشتری نگاه نمی کنیم، زیرا طرح ها شبیه به ذخیره سازی حباب ها با تفاوت های کوچک است که می توانید در اینجا بخوانید – Table Storage Trigger.

ذخیره سازی دم

صف فعال‌شده یکی از پرکاربردترین محرک‌های توابع لاجوردی است که کاملاً مشابه «ServiceBus»، «EventHub» و «EventGrid» هستند. بنابراین، نمونه‌هایی از نحوه اجرای Queue Trigger و سپس پوشش تفاوت‌های کلیدی بین سایرین را خواهیم دید.

توابع فعال شده توسط صف زمانی فراخوانی می شوند که پیام در فروشگاه صف موجود باشد.

بیایید مثالی بزنیم:

[FunctionName("SendNotificationForGroupCreation")]
public static void Run(
    [QueueTrigger("group creation notification queue", Connection = "StorageConnectionSetting")] string groupCreationRequest, 
    ILogger log)
{
    log.LogInformation($"Function is executing request for {groupCreationRequest}");
}

از مثال بالا، می بینید که هر بار که پیامی در صفی به نام “صف اعلان گروه” در حساب ذخیره سازی “StorageConnectionSetting” یافت می شود، تابع فراخوانی / اجرا می شود.

پرس و جوی ورودی می تواند یک رشته (کوئری ایجاد گروه) یا یک شی باشد (در این مورد زمان اجرا لاجوردی رشته را به نوع ارائه شده از حالت سریال خارج می کند).

یادداشت های مهم:

  • اگر یک تابع ناموفق باشد، azure runtime پنج تلاش را امتحان می‌کند و اگر همه تلاش‌ها با شکست مواجه شوند، زمان اجرای azure پیام را به صف Poison منتقل می‌کند، یعنی. {Original-Queue-Name} -poison.
  • اندازه دسته پیش فرض صف 16 است، یعنی. زمان اجرای Azure 16 پیام را از صف دریافت کرده و به صورت موازی اجرا می کند. این تنظیمات را می توان در فایل host.json تغییر داد.

تفاوت اصلی بین ماشه ذخیره سازی دم و ماشه باس سرویس:

  • در حالی که تابع راه‌انداز صف می‌تواند پیام‌های صف را بخواند، تابع راه‌انداز گذرگاه خدمات می‌تواند پیام‌ها و رشته‌های صف را بخواند.
  • تعداد دفعات تکرار برای ذخیره صف توسط تابع تعریف و پردازش می شود، در حالی که برای گذرگاه سرویس بر اساس تعداد تحویل پیام (و همچنین در سطح تابع) تعریف می شود.

جدول زیر را می توان به عنوان مرجعی برای انواع ماشه های پشتیبانی شده با توجه به نسخه Azure مشاهده کرد.

تایپ کنید 1.x 2.x و بالاتر ماشه ورود خروج
ذخیره سازی Blob
Azure Cosmos DB
داپر3
شبکه ای از رویدادها
مراکز رویداد
HTTP و قلاب های وب
مرکز اینترنت اشیا
کافکا 2
برنامه های موبایل
مراکز اطلاع رسانی
ذخیره سازی دم
RabbitMQ2
SendGrid
اتوبوس خدماتی
SignalR
ذخیره سازی میز
تایمر
تویلیو

ماشه سفارشی برای عملکرد Azure

در قسمت قبل انواع مختلفی از تریگرها را دیدیم که ویژگی Azure از آنها پشتیبانی می کند. اگر هیچ یک از آنها نیازهای شما را برآورده نکرد، می توانید یک ماشه سفارشی ذخیره کنید.

اساساً نوشتن یک پسوند سفارشی شامل دو بخش است:

  1. نوشتن ماشه – مسئول تماس است
  2. نوشتن صحافی – مسئول ارائه داده های لازم است.

بیایید یک اسکریپت برای نوشتن یک تابع لاجوردی در نظر بگیریم که بر اساس ایمیل دریافت شده در جعبه ایمیل شخصی انجام می شود. (پذیرش صرافی یا دفتر 365 در اینجا)

بیایید ابتدا Trigger را بنویسیم

[AttributeUsage(AttributeTargets.Parameter)]
[Binding]
public class OutlookTriggerAttribute: Attribute
{
    public string GraphConnectionString { get; set; }
    public string EmailId { get; set; }
    public string Password { get; set; }
    internal string GetOfficeGraphUri()
    {
        return Environment.GetEnvironmentVariable(GraphConnectionString );
    }
}

Now let’s implement a Listener responsible for reading messages:
public class OutlookListener: IListener
    {
        private readonly ITriggeredFunctionExecutor _executor;
        private readonly OutlookTriggerContext _context;
        public OutlookListener(ITriggeredFunctionExecutor executor, OutlookTriggerContext context)
        {
            _executor = executor;
            _context = context;
        }
        public void cancel()
        {
            if (_context == null || _context.Client == null) return;
            _context.Client.Disconnect();
        }

        public void Dispose()
        {
            _context.Client.Dispose();
        }


       public Task StartAsync(CancellationToken cancellationToken)
        {
            return Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    wtoken.Token.ThrowIfCancellationRequested();
	        //_context.Client.GetMessages();
                   // … Get message from graph API an
                    var triggerData = new TriggeredFunctionData
                    {
                        TriggerValue = outlookMessagePayload
                    };
                    var task = _executor.TryExecuteAsync(triggerData, CancellationToken.None);
                    task.Wait();
                    Task.Wait(10000);
                }
            }, wtoken, TaskCreationOptions.LongRunning);
        }
        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.Run(() =>{
                _context.Client.Disconnect();
            });
        }
    }
}

بیایید زمینه Outlook Trigger را اعمال کنیم.

public class OutlookTriggerContext
    {
        public OutlookTriggerAttribute TriggerAttribute;
        public GraphApiClient Client;

        public OutlookTriggerContext(OutlookTriggerAttribute  attribute, GraphApiClient client)
        {
            this.TriggerAttribute = attribute;
            this.Client = client;
        }
    }

اکنون Binding را برای ماشه Outlook خود پیاده سازی می کنیم

[assembly: WebJobsStartup(typeof(OutlookBinding.Startup))]
namespace WebJobs.Extension.Outlook
{
    public class OutlookBinding
    {
        public class Outlookup : IWebJobsStartup
        {
            public void Configure(IWebJobsBuilder builder)
            {
                builder.AddOutlookExtension();
            }
        }
    }
}

برای تکمیل باید متد AddOutlookExtension را اضافه کنیم

public static class OutlookWebJobsBuilderExtensions
    {
        public static IWebJobsBuilder AddNatsExtension(this IWebJobsBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            builder.AddExtension<OutlookExtensionConfigProvider>();
            builder.Services.AddSingleton<IOutlookServiceFactory, OutlookServiceFactory>();
            return builder;
        }
    }

اکنون می‌توانیم یک ویژگی لاجوردی را ذخیره کنیم که می‌تواند بر اساس ایمیلی که در جعبه ایمیل دریافت می‌کنید فعال شود:

public static class OutlookTriggerFunction
    {
        [FunctionName("OutlookTriggerFunction")]
        public static void Run(
            [OutlookTrigger(GraphConnectionString = "mail.outlook.com", EmailId = "myemail@outlook.com", Password = "Password")] string outlookMessage,
            ILogger log)
        {
            log.LogInformation($"Message Received From outlook mailbox is {outlookMessage}");
        }
    }

نتیجه

امیدوارم این وبلاگ به شما کمک کرده باشد تا در مورد محرک های V2 و V3 برای ویژگی های Azure بیاموزید. مجدداً، اگر شما نیز می‌خواهید یک وبلاگ V1 داشته باشید، لطفاً آن را در نظرات زیر ذکر کنید. همچنین، اگر شک دیگری دارید، لطفاً در زیر نظر دهید و مهندسان DEV IT ما با شما تماس خواهند گرفت.

نشریه قسمت -2: راهنمای تخصصی برای آموزش عملکرد Azure اولین بار در مجله DEV IT ظاهر شد.