نکات کاربردی

طبقه بندی موضوعی

آخرین مطالب

  • Querydsl

یک چارچوب است که امکان ساخت پرس وجوی های مشابه با دستور SQL را مهیا می کند.

به جای نوشتن درخواست ها به صورت رشته های inline یا انتقال آنها به فایل های XML، آنها می توانند از طریق یک API ساده و روان مانند Querydsl ساخته شوند.


  • برای مثال مزایای استفاده از API روان در مقایسه با رشته های ساده
  1. تکمیل کد در IDE
  2. انواع و خواص دامنه را می توان بصورت ایمن ارجاع داد.
  3. اصلاح تغییرات در انواع دامنه بهتر انجام می شود.

  • Querydsl برای نگهداری مطمین پرس و جوهای HQL متولد شد.
  • ساختار افزایشی پرس و جوهای HQL نیازمند پیوند رشته است و نتیجه را در خواندن کد سخت می کند. منابع نامناسب برای انواع و خواص دامنه از طریق رشته های ساده، مسئله دیگری با ساختار HQL مبتنی بر String بود.
  • با تغییر دامنه مدل ایمنی نوع مزایای زیادی را در توسعه نرم افزار به ارمغان می آورد. تغییرات دامنه به طور مستقیم در نمایش داده ها منعکس شده است و تکمیل خودکار در ساخت پرس و جو باعث ایجاد سریعتر و ایمن تر ساخت پرس و جو می شود.

Querydsl Reference Guide

behrad nasehi
۱۷ آذر ۹۷ ، ۱۰:۴۴ موافقین ۰ مخالفین ۰ ۰ نظر
‎@OneToMany:

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

عناصر اختیاری:

- cascade

- fetch

- mappedBy

- orphanRemoval

- targetEntity

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



The best way to map a @OneToMany relationship with JPA and Hibernate

behrad nasehi
۲۹ آبان ۹۷ ، ۱۴:۱۲ موافقین ۰ مخالفین ۰ ۱ نظر

Resource :
هر جزء فیزیکی یا مجازی با دسترسی محدود در سیستم کامپیوتری است


URI :Uniform Resource Identifier

تعاریف URI

- توالی پیوسته ای از کارکترهاست برای شناسایی یه منبع(Resource ) فیزیکی یا انتزاعی.

- رشته ای است که به یک منبع اشاره دارد.


      URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

      hier-part   = "//" authority path-abempty
                  / path-absolute
                  / path-rootless
                  / path-empty



7 Rules for REST API URI Design

behrad nasehi
۰۹ آبان ۹۷ ، ۱۸:۱۱ موافقین ۰ مخالفین ۰ ۰ نظر

بهترین راه برای تعریف و استفاده از فوت در JasperReports ایجاد و استفاده از قابلیت font extension است. 

استفاده از font extension در JasperReports باعث می شود تا گزارش بجای فونت های سیستمی یا توکار،با فونت های خارجی TTF, SVG, WOFF,  EOT لود شود. این تضمین می کند که یک فونت خاص به همان شیوه هر بار که گزارش اجرا می شود رفتار می کند.

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

Font extensions کمک میکند تا از مشکلات زیر جلوگیری شود:
•  یک فونت می تواند در یک سیستم عامل در دسترس باشد، اما نه در یک دیگر. در این مورد، فونت پیش فرض برای عنصر استفاده می شود، اما ممکن است از character set مورد انتظار پشتیبانی نکند.
•  دستگاه مجازی جاوا می تواند نام های فونت منطقی را به فونت های مختلف فیزیکی نشان دهد.
فونت موجود در سیستم عامل های مختلف می تواند کمی متفاوت از یک سیستم عامل دیگر باشد.

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


Adding fonts for embedding in PDF

behrad nasehi
۰۴ شهریور ۹۷ ، ۱۷:۲۱ موافقین ۰ مخالفین ۰ ۰ نظر
change-data-capture-چیست؟

معرفی انواع CDC در MySQL

عملیات CDC را میتوان در هر لایه ای از پروژه انجام داد.

روشهای ضبط تغییرات داده (CDC) در بانکهای اطلاعاتی (databases) :

  1. Timestamps on rows: ستونی در جدول اضافه شود تا تاریخ آخرین تغییر را نشان دهد.

    در MySQL  اینکار از طریق نوع TIMESTAMP قابل پیاده سازی است . مثال عملیاتی

  2. Version Numbers on rows : ستونی در جدول اضافه شود که شماره نسخه را ذخیره میکند . این ستون به ازاء هر تغییر افزوده می شود.
    در
    SQL Server  اینکار از طریق نوع rowversion قابل پیاده سازی است . مستندات

    میتوان از این ستون برای قفل های خوشبیتاته(Optimistic Locking) استفاده شود مانند Hibernate. مطالعه بیشتر 

  3. Status indicators on rows : ستونی از نوع Boolean که در صورت تغییر ردیف مقدار True میگیرد. این ستون می تواند مکمل بخش های قبلی باشد.
  4. Time/Version/Status on rows : سه ستون قبلی هر سه در جدول تعریف می شوند تا بتوان تغییرات داده های جدول را بصورت جامع بررسی کرد.

  5. Triggers:

    1. Database triggers : تعریف Trigger برای جدول روشی برای ثبت تغییرات داده هاست. هر بانک اطلاعاتی ازTriggerپشتیبانی میکند.

    2. Application-level triggers:
      1. Auditing with JPA :
        JPA به صراحت شامل یک auditing API نیست، اما این قابلیت را می توان با استفاده از حوادث چرخه حیات entity بدست آورد. جزییات مثال مثال2 مثال3

      2. Hibernate Envers : چارچوبهایی (frameworks) مانند Hibernate Envers وجود دارد که بانک اطلاعاتی را در سطح برنامه شبیه سازی میکنند. مثال

      3.  Spring Data JPA: مثال 

      4. audit4j :
        برای بررسی وقایع مربوط به سرورها، برنامه ها و پایگاه های داده مورد استفاده قرار گیرد

      5. JaVers : یک کتابخانه سبک جاوا است که برای ضبط تغییر داده هاست.
  6. Event Programming : هر چند این روش نیاز به برنامه نویسی دارد ولی روشی بسیار دقیق و مطلوب تر و انعطاف بیشتری دارد.

  7. Log scanners on databases : استفاده از transaction log بانکهای اطلاعاتی.
    • با توجه به دسترسی نداشتن به مستندات log، پیاده سازی از این طریق چالش بزرگی است.
    • استفاده از این روش نیازی به ایجاد ساختار جدیدی نبوده و صرفا کافی است transaction log خوانده شود.
      هر بانک اطلاعاتی روش خودش را برای خواندن از transaction log دارد بعنوان نمونه :
      - اوراکل GoldenGate را ارائه می دهد.
      -
      SQL Server پشتیبانی از CDC را ارائه می دهد.
      - MySQL، که به طور گسترده ای برای برنامه های کاربردی وب مورد استفاده قرار گرفته است، اجازه می دهد شما را به ضبط رویدادهای CDC از طریق راه حل های 3rd party های مختلف، مانند DataBus LinkedIn
      • برای بانکهای اطلاعاتی مدرن Tracking the capture از دو روش معمول زیر انجام می شود:
        • Database Triggers
        • Reading the transaction log

  8. Debezium :
    Debezium یک پروژه منبع باز جدید است که توسط RedHat اداره می شود که اتصال دهنده های اوراکل، MySQL، PostgreSQL و حتی MongoDB است.
    • با این پروژه نه تنها شما می توانید رویدادهای CDC را استخراج کنید، بلکه می توانید آنها را به Apache Kafka بفرستید، که به عنوان یک ستون فقرات برای تمام پیام های مورد نیاز برای مبادله بین ماژول های مختلف یک سیستم بزرگ سازمان عمل می کند.


behrad nasehi
۱۶ مرداد ۹۷ ، ۱۴:۴۹ موافقین ۰ مخالفین ۰ ۰ نظر

انکودینگ Base64 مکانیزیمی است که در اصل به منظور انکودینگ داده های باینری به فرمت متنی ایجاد شد. انکودینگ Base64 ابتدا در سیستم های ایمیل که نیاز به پیوست داده های باینری همچون تصویر و اسناد متنی داشتند استفاده شد. چرا که این نوع پیوست ها بایستی به فرمت اسکی (ASCII) ارسال می شد.


مجموعه کاراکتری انکودینگ Base64

Base64 حاوی یک مجموعه کاراکتری از کاراکترهای اسکی قابل چاپ می باشد. ۶۲ مقدار اصلی در تمام انواع انکودینگ Base64 یکسان می باشد که شامل :

  • کاراکترهای حروف بزرگ زبان انگلیسی A تا Z
  • کاراکترهای حروف کوچک زبان انگلیسی a-z
  • اعداد ۰ تا ۹

کاراکتر های موجود در ایندکس ۶۲ و ۶۳ بر اساس نوع انکودینگ متفاوت می باشد. این کاراکترها شامل + / , – _ . : ! ~ می باشد. جدول زیر کاراکترهای نسخه اصلی Base64 را نشان می دهد :

انکودینگ base64 - فرآیند انکودینگ Base64 - مجموعه کاراکتری انکودینگ Base64

فرآیند انکودینگ Base64

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

  • داده های باینری یا غیرباینری از سمت چپ به راست خوانده شده
  • سه جفت داده هشت بیتی جداگانه از ورودی گرفته شده تا در مجموعه یک گروه ۲۴ بیتی را ایجاد کند.
  • این گروه ۲۴ بیتی در ادامه به ۴ گروه ۶ بیتی تقسیم می شود.
  • اکنون هر کدام از این شش بیت جداگانه توسط انکودینگ Base64 با استفاده از جدول ایندکس بالا فرمت دهی می شود. چگونه ؟

در مثال زیر واضح توضیح می دهیم . به جدول زیر دقت کنید. در اینجا می خواهیم کلمه God انکودینگ کنیم.

انکودینگ base64 - فرآیند انکودینگ Base64 - مجموعه کاراکتری انکودینگ Base64

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

انکودینگ base64 - فرآیند انکودینگ Base64 - مجموعه کاراکتری انکودینگ Base64

سپس باینری به گروههای ۶ بیتی تبدیل شده. عدد باینری به دسیمال تبدیل شده و بر اساس جدول ایندکس ها معادل آن نوشته می شود. مثلا ایندکس ۱۷ متعلق به کاراکتر R و ایندکس ۳۶ متعلق به کاراکتر k و….

نتیجه اینکه معادل Base64 کلمه God می شود R29k

هرچند یک مشکلی در اینجا پدیدار می شود. اگر حرف ما بر اساس الگوی ۲۴ بیتی نباشد چه باید کرد ؟ مثلا کلمه Netamooz نمی توان آن را با این الگو تطبیق داد. Net می شود ۲۴ بیت , amo می شود ۲۴ بیت و oz می شود ۱۶ بیت !! با ۸ بیت آخر چه باید کرد.

این همان جایی است که مکانیزم پدینگ (Padding) وارد می شود.

پدینگ در انکودینگ Base64

هر کجا که ۸ بیت خالی بماند برای تبدیل شدن آن به یک مجموعه ۲۴ بیتی بایستی با کاراکتر = پر شود. و اگر ۱۶ بیت خالی باشد دو کاراکتر مساوی == اضافه می شود. دقیقا شبیه جدول زیر که به این مکانیزم پدینگ گویند.

انکودینگ base64 - فرآیند انکودینگ Base64 - مجموعه کاراکتری انکودینگ Base64

انکودینگ Base64

شیوه های کدگذاری

استفاده از base64 برای inline کردن عکس

از base64 برای encode کردن باینری به متن استفاده می شود. با استفاده از این تکنیک این امکان وجود دارد که هر عکسی را به صورت داده های متنی ذخیره کرد. خوشبختانه مرورگرهای مختلف می توانند base64 را decode کنند. به عبارت دیگر اگر شما یک عکس را به صورت base64 به صورت inline در فایل HTML در <img> بنویسید، مرورگرها می توانند آن عکس را در صفحه HTML رندر کرده و به کاربر نمایش دهند. به عبارت دیگر با استفاده از این تکنیک، دیگر درخواست جداگانه برای لود عکس به سرور ارسال نمی شود و عکس به صورت قسمتی از متن صفحه HTML در مرورگر لود شده و در نهایت رندر و به کاربر نمایش داده می شود.

مزیت inline کردن عکس

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

ایراد inline کردن عکس

وقتی عکس به صورت فایل در یک صفحه لود شود، مرورگر می تواند آن عکس را کش کرده و برای دفعات بعد برای بارگذاری عکس به سرور درخواستی ارسال نکند و عکس را از کش لوکال بارگذاری کند. در نتیجه همه کاربران جدیدی که وارد صفحه مورد نظر می شوند برای بارگذاری عکس به سرور request ارسال می کنند ولی کاربران تکراری برای لود عکس از حافظه کش خودشان استفاده می کنند. ولی وقتی از تکنیک inline کردن عکس استفاده می کنید، مرورگر آن عکس را کش نمی کند و هر بار برای لود عکس باید کاراکترهای base64 درون HTML را بخواند. در نتیجه برای عکسهایی که در صفحات گوناگون استفاده می شوند، استفاده از تکنیک اینلاین کردن عکس ها در HTML کار منطقی به نظر نمی رسد.

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

بهینه سازی سایت با inline کردن عکس


فرض کنید شما یک داده ی باینری دارید و می خواهید آن را در بستر شبکه انتقال دهید. به طور کلی شما این کار را تنها از طریق Stream کردن بیت ها و بایت های خام انجام نخواهید داد. چرا؟ زیرا ابزارهایی برای Stream کردن متن وجود دارد. شما هرگز اطلاع ندارید که برخی از پروتکل ها ممکن است داده های باینری شما را به عنوان کاراکترهای کنترلی تفسیر کنند ( درست به مانند یک مودم) و یا برخی دیگر از پروتکل ها همانند FTP ممکن است تصور کنند که شما یک کاراکتر خاص مانند ending را وارد کرده اید.

mccaffrey-fig3

بنابراین برای مقابله با این مشکلات داده های باینری را به رشته ای از کاراکترها کد گذاری (encode) می کنند. Base64 یکی از انواع این گونه کد گذاری می باشد. چرا Base64؟ زیرا با استفاده از آن شما می توانید همواره بر ۶۴ کاراکتری که در اغلب مجموعه کاراکترها (character set) ارائه می شود حساب کنید و بنابراین از نحوه ی صحیح نمایش داده های خود در سمت گیرنده اطمینان بیشتری کسب کنید.

استفاده از Base64 برای طراحان وب کاربردهای بسیار مفیدی دارد. بعنوان مثال می توان برای جلوگیری از ارسال یک Request اضافه از سمت Client آیکون معروف به Favicon را به جای فایل درون تگ جاسازی نمود که در زیر نمونه آن را می بینیم:

<link href=”data:image/png;base64,iVBORw0KGgoAAAANSUhEU. …” rel=”icon” type=”image/x-icon”>

حتماً این سوال برایتان به وجود می آید که در مثال بالا چطور می توانید یک تصویر را به Base64 تبدیل کنید. برای این کار راه های مختلفی وجود دارد ولی یکی از در دسترس ترین راه ها استفاده از اپلیکیشن های آنلاین است که در زیر یکی از آنها را می توانید ملاحظه کنید:

https://www.base64-image.de/

Base 64 چیست و چه کاربردی دارد؟



چگونه مبنای 64 به‌سرعت صفحات کمک می‌کند؟

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

  1. HTML
  2. CSS
  3. اولین تصویر
  4. دومین تصویر

 


اینجا یک صفحه وب دیگر با تصاویر بر مبنای 64 وجود دارد. این صفحه برای بارگذاری تنها به دو چیز نیاز دارد.

  1. HTML
  2. CSS


تأثیر Base64 بر سئو چگونه است؟

تأثیر اصلی که تصاویر Base64 بر سئو می‌گذارد این است که تصاویر توسط گوگل شناخته نمی‌شوند. به این معنی که تصاویری که شما بر مبنای 64 استفاده کردید توسط جستجوی تصاویر گوگل نمایش داده نمی‌شوند و یا همچنین در موتورهای جستجوی دیگر نیز نمایش داده نمی‌شوند.


پس چرا از آن استفاده می‌کنیم؟

بسیاری از تصاویری که در صفحه شما وجود دارد مهم نیستند و اگر آن‌ها شناخته نشوند تأثیری بر روی ترافیک شما ندارند. بهترین مثال می‌تواند آیکون‌های اجتماعی باشد، تعداد آن‌ها کم است مانند Twitter، Google+، Facebook و غیره.
تصاویر واقعاً کوچک هستند و نیاز به شناخته شدن ندارند. شما هرگز از ترافیک آیکون کوچک توییتر سود نمی‌برید. در مورد تصاویری که فقط برای طراحی استفاده می‌شوند مانند «دکمه پایین»، «نقل‌قول» فکر کنید، چیزهایی شبیه به این‌ها برای سئو مهم نیستند؛ اما سرعت بارگذاری صفحاتتان را کم می‌کنند. درهروب سایت 8 تا 12 آیکون اجتماعی وجود دارد که هرکدام از آن‌ها یک درخواست را به HTTP می‌فرستند درحالی‌که اگر شما از Base64 استفاده کنید نیاز نیست که آن‌ها دانلود شوند.


سایر ملاحظات

بهتر است که تنها برای تصاویر کوچک از Base64 استفاده کنیم. اگر شما سعی می‌کنید که تصاویر بزرگ را بر مبنای 64 بیاورید آنگاه شما با یک مقدار بزرگی کد در HTML روبرو هستید که مزیت عملکرد Base64 را از دست می‌دهید.


چگونه در این سایت از Base 64 استفاده کرده‌ایم؟

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


چگونه گوگل Base64 را شناسایی می‌کند؟

همان‌طورکه قبلاً ذکرشد گوگل تصاویرکدگذاری شده برمبنای 64 را نمی‌تواند بشناسد. دراین مقاله چندعکس بزرگ وجود دارد. همه آن‌ها توسط گوگل شناسایی‌شده‌اند.

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

یک‌راه این است که یک پوشه تصاویر که همه تصاویر آن کدگذاری شده‌اند را داشته باشید، سپس شما آن را روی هاست خود آپلود کنید، در قسمت HEAD در HTML از نشانه‌های Opengraph برای جهت‌دهی گوگل به آن تصاویر استفاده کنید.

اینجا کدهایی را که در قسمت HEAD در HTML این صفحه آورده‌ام را قرار داده‌ام.

<!DOCTYPE html>
<html lang="en-US" prefix="og: http://ogp.me/ns#" xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml" itemscope itemtype="http://schema.org/Article">
<head>
<meta name=viewport content="width=device-width, initial-scale=1">
<meta property="og:image" content="https://shift.ir/pagespeed/images/base64-image.png">

در بخش اول این کدهای به‌هم‌ریخته، Opengraph ها آورده شده‌اند و در بخش آخر تصویر معرفی‌شده است، نتیجه این کار این است که تصاویر من در گوگل شناخته‌شده است.

<meta property="og:image" content="https://shift.ir/pagespeed/images/base64-image.png">


مسائل مربوط به‌اندازه

نتیجه کدگذاری یک فایل عکس 2kb بر مبنای 64 2.5 یا 3kb است. بااین‌حال اگر شما باید فایلتان را فشرده کنید. در پایان سایزی در حدود همان سایز فایل عکس به دست می‌آورید. من توصیه نمی‌کنم که برای عکس‌های بزرگ‌تر از 5kb از کدگذاری بر مبنای 64 استفاده کنید.


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

یک عکس معمولی در HTML شما وجود دارد.
مکان فایل (به‌طور مثال Example.com) را با اطلاعات SRC به‌دست‌آمده از ابزار Base64 جایگزین کنید. اکنون منبع عکس شما از یک فایل خارجی دیگری نیست در عوض آن، داده‌های کدگذاری شده در SRC قرار دارد.


ابزار

برای تست کار با Base64، لطفاً از ابزار رایگان base64 image encoder tool استفاده کنید.

behrad nasehi
۰۸ مرداد ۹۷ ، ۱۶:۵۵ موافقین ۰ مخالفین ۰ ۱ نظر

A scope is a module: a stored procedure, trigger, function, or batch

SCOPE_IDENTITY


behrad nasehi
۱۴ تیر ۹۷ ، ۱۳:۲۰ موافقین ۰ مخالفین ۰ ۰ نظر

کلاس wrapper مربوط به اعداد


با سلام به همه دوستان وهمراهان Itpro. اعداد ویژگی های متعددی در زبان جاوا دارند که در این بخش به بحث در مورد اعداد در جاوا می پردازیم. وقتی که شما از اعداد در جاوا استفاده می کنید به این معنی است که شما از انواع داده های اولیه در جاوا مثل byte,int, long, double , … استفاده می نمایید. برای مثال به کد زیر توجه کنید:

int i = 5000;
float gpa = 13.65;
byte mask = 0xaf;
در زمان برنامه نویسی ممکن است وضعیتی پیش بیاید که ما به جای انواع داده اولیه از اشیاء استفاده کنیم. جاوا این امر را با استفاده از کلاس های wrapper میسر می سازد. در جاوا کلاس هایی وجود دارد که متناظر با انواع داده اولیه هستند و در این کلاس ها مجموعه متدهایی تعریف شده است که می تواند در برنامه نویسی بسیار مورد استفاده قرار بگیرد. همه ی کلاس های wrapper از کلاس Number ارث برده اند. شکل زیر انواع این کلاس ها را نشان می دهد.
Image

اشیائی که از کلاس wrapper ساخته می شود می تواند یک مقدار از نوع داده مورد نظر را درخود ذخیره کند. تبدیل نوع داده واقعی به یک شی را boxing می گویند و این عمل توسط کامپایلر انجام می شود. بنابراین زمانی که یک شی از کلاس wrapper می سازیم باید در constructor آن یک مقدار از نوع داده متناسب آن قرار دهیم. تبدیل شئی از کلاس wrapper به نوع داده اولیه را unboxing می گویند. کلاس Number در پکیج java.lang قرار دارد. در کد زیر مثالی از boxing و unboxing آورده شده است.
public class Test{

   public static void main(String args[]){
      Integer x = 5; // boxes int to an Integer object
      x =  x + 10;   // unboxes the Integer to a int
      System.out.println(x); 
   }
}
نتیجه اجرای کد بالا 15 خواهد بود. وقتی که یک شی از کلاس Integer ساخته می شود و نام آن را x می گذاریم. وقتی که یک مقدار عدد صحیح به این شئ انتساب می دهیم کامپایلر عمل boxing را انجام می دهد و آن را در داخل یک شئ می ریزد. اما در خط بعد که عمل جمع کردن عدد انجام می شود کامپایلر باید x را تبدیل به نوع اصلی int بکند تا بتواند با عدد10 جمع کند و در این حالت عمل unboxing انجام می شود.

متدهای کلاس Number


در ادامه به لیستی از متدهای موجود در کلاس های ارث برده از کلاس Number آورده شده است و هرکدام توضیح داده شده اند. کلاس های wrapper که گفته شد همه از کلاس Number ارث برده اند.
  • تابع [datatype]Value این تابع عمل تبدیل نوع داده شده را به نوع خواسته شده انجام می دهد. مقدار datatype در اول این تابع می تواندبا نام انواع داده های عددی جایگزین شود توابع این متد به شکل زیر هستند:
byte byteValue()
short shortValue()
int intValue()
long longValue()
float floatValue()
double doubleValue()
توابع گفته شده متدهای پیش فرض هستند و هیچ پارامتری ندارند و مقدار بازگشتی آنها همان مقدار [datatype] است. برای درک بهتر به کد زیر توجه کنید:
public class Test{ 

   public static void main(String args[]){
      Integer x = 5;
      // داده بایت برمی گرداند
      System.out.println( x.byteValue() );

      // نوع داده دابل برمیگرداند
      System.out.println(x.doubleValue());

      // نوع داده لانگ برمی گرداند
      System.out.println( x.longValue() );      
   }
}
نتیجه اجرای کد بالا به شکل زیر خواهد بود.
5
5.0
5
  • متد compareTo: این متد عدد شی صدا زننده را با عددی که به عنوان آرگومان به متد داده شده را مقایسه می کند. با استفاده از این تابع می توان اعداد از انواع متفاوت را با هم مقایسه کرد ولی باید دقت داشت که هر دو عدد از یک نوع باشند و نمی توان تابع compareTo مربوط به یک نوع byte را با ورودی long صدا زد. این عمل باعث خطا می شود. شکل نوشتاری این متد مانند خط زیر است:
public int compareTo( NumberSubClass referenceName )
همانگونه که گفته شد پارامتر ورودی این متد یک شی از کلاس wrapper متناظر می باشد. مقدار بازگشتی این متد یک عدد صحیح از نوع int است که می تواند یا 0 یا 1 و یا -1 باشد. که به شرح این اعدا می پردازیم. اگر دو عدد با یکدیگر برابر باشند در نتیجه متد عدد 0 را بازمی گرداند و اگر عدد از آرگومان خودش کوچکتر باشد عدد -1 و اگر عدد از آرگومان خود بزرگتر باشد عدد 1 به عنوان نتیجه بازگشت داده می شود. برای مثال به کد زیر دقت کنید:
public class Test{ 

   public static void main(String args[]){
      Integer x = 5;
      System.out.println(x.compareTo(3));
      System.out.println(x.compareTo(5));
      System.out.println(x.compareTo(8));            
     }
}
و نتایج کدهای بالا به شکل زیر است:
1
0
-1
  • متد equals: این متد مشخص می‌کند که دو عدد با هم برابر هستند یا خیر. کار این متد به این شکل است توسط شئی صدا زده می‌شود و یک عدد به آن داده می‌شود اگر عدد داده شده برابر با مقدار خود شئ باشد مقدار true و اگر برابر نباشد مقدار إfalse برگردانده می‌شود.شکل تعریف شده این تابع به شکل زیر است:
public boolean equals(Object o)
چیزی که این متد به عنوان پارامتر ورودی می‌گیرید می‌تواند هر نوع شیئی باشد.
مقدار بازگشتی این متد همانطور که گفته شد یک مقدار boolean است که اگر ورودی متد با خود شئ برابر باشند true برگردانده می شود. در ادامه مثالی برای این متد آورده شده است:
public class Test{ 

   public static void main(String args[]){
      Integer x = 5;
      Integer y = 10;
      Integer z =5;
      Short a = 5;

      System.out.println(x.equals(y));  
      System.out.println(x.equals(z)); 
      System.out.println(x.equals(a));
     }
}
خروجی کد بالا به شکل زیر خواهد بود
false
true
false
  • متد valeuOf: این متد مقدار عددی موجود در یک شئ وارد شده را بر‌می‌گرداند. آرگومان ورودی می‌تواند نوع داده اصلی یا String و مانند این‌ها باشد.
این یک متد استاتیک است. این متد می‌تواند ۲ آرگومان ورودی داشته باشد که آرگومان اولی یک رشته و آرگومان دوم مبنای عدد مورد نظر باشد. به این شکل که اگر بخواهیم عدد موجود در رشته را به یک عدد در مبنای ۱۶(هگزادسیمال) تبدیل شود آرگومان دوم را ۱۶ قرار دهیم. شکل‌های استفاده از این تابع در کد زیر آمده است:
static Integer valueOf(int i)
static Integer valueOf(String s)
static Integer valueOf(String s, int radix)
پارامتر ورودی در خط اول کد بالا برای یک عدد int است که وارد می‌شود و می‌توان این عدد را با استفاده از این متد به انواع داده عددی مختلف تبدیل کرد. در خط دوم یک رشته به متد داده می‌شود که دارای اعداد در داخل رشته است که با استفاده از این متد می‌توان آن را تبدیل به عدد کرد. در خط سوم نیز یک رشته دارای عدد به عنوان پارامتر ورودی اولی می‌باشد و پارامتر دوم نیز مبنای عدد است. خروجی این تابع یک عدد است که در مثال زیر استفاده از این متد آورده شده است.
public class Test{ 

   public static void main(String args[]){
      
      Integer x =Integer.valueOf(9);
      Double c = Double.valueOf(5);
      Float a = Float.valueOf("80");               

      Integer b = Integer.valueOf("444",16);

      System.out.println(x); 
      System.out.println(c);
      System.out.println(a);
      System.out.println(b);
   }
}
خروجی کد به شکل زیر خواهد بود:
9
5.0
80.0
1092
  • متد toString این متد مقدار هر شی را تبدیل به رشته می‌کند و بازمی گرداند. این متد می‌تواند یک ورودی عددی داشته باشد که آن را به رشته تبدیل کرده و بازمی گرداند. این متد برای همه اشیاء درجاوا وجود دارد. انواع مختلف این متد به شکل‌های زیر است:
String toString()
static String toString(int i)
مثال‌هایی از این متد در کد زیر نشان داده شده است:
public class Test{ 

   public static void main(String args[]){
      Integer x = 5;

      System.out.println(x.toString());  
      System.out.println(Integer.toString(12)); 
   }
}
خروجی کد به شکل زیر خواهد بود:
5
12
در این بخش به معرفی کلاس های wrapper مربوط به اعداد پرداختیم و متدهای آن را معرفی کردیم. در مطالب بعدی به ادامه معرفی متدهای این کلاس ها خواهیم پرداخت Itpro باشید


نویسنده: مهدی عادلی فر
منبع: انجمن تخصصی فناوری اطلاعات ایران
behrad nasehi
۲۰ خرداد ۹۷ ، ۱۶:۵۸ موافقین ۰ مخالفین ۰ ۰ نظر
معرفی فریمورک Spring جاوا
سلام دوستان. در سری آموزش های زبان جاوا گفتیم که زبان جاوا یک زبان قدرتمند است که می توان با آن برای فریمورک های مختلف و تکنولوژی های متفاوت برنامه نویسی کرد. یکی از بستر هایی که امروز برنامه نویسی در آن بیشتر از بقیه مورد استفاده قرار می گیرد بستر وب می باشد. دلایل محبوبیت برنامه نویسی در بستر وب می تواند پیشرفت ارتباطات اینترنتی و سهولت استفاده از آن در همه دستگاه ها از جمله کامپیوتر های لپتاپ و تبلت و موبایل و ... باشد. اخیرا هم شاهد ظهور اینترنت اشیا می باشیم. با این تفاسیر زبان جاوا هم باید در این بستر خیلی مهم حرفی برای گفتن داشته باشد.
Image


Spring framework


زبان جاوا برای برنامه نویسی وب فریمورک ها و تکنولوژی های بسیار متنوعی ارائه کرده است که معروفترین و محبوب ترین آنها فریمورک spring می باشد. البته این تکنولوژی فقط برای وب نیست و با آن می توان برنامه های مختلفی نوشت. Spring در برنامه نویسی تجاری جاوا معروف ترین فریمورک است و میلیون ها برنامه نویس با آن کار می کنند. دلایل استفاده این همه برنامه نویس از این فریمورک performance بسیار بالا و تست راحت و معماری آن است. فریمورک spring یک پلتفرم اوپن سورس جاوا است که توسط Rod Johnson در سال 2003 نوشته شده است. با استفاده از ویژگی های spring می توان هر برنامه جاوایی را نوشت. با این حال قابلیت هایی را برا نوشتن برنامه های تحت وب تحت پلت فرم Java EE دارد. هدف فریمورک spring این است که برنامه نویسی J2EE را آسان تر کند و با استفاده از مدل برنامه نویسی POJO، برنامه نویسی را گسترش دهد. قبل از این که به ادامه بحث در مورد spring بپردازیم دو کلمه J2EE و POJO را معرفی می کنیم.

J2EE چیست؟


Image


J2ee مخفف java to platform, enterprise edition می باشد. که در برنامه نویسی نرم افزار های سازمانی و تجاری بسیار مورد استفاده قرار می گیرد. این پلتفرم API ها و روتین هایی برای برنامه نویسی نرم افزار های سازمانی فراهم می آورد که از جمله آنها API هایی برای کار با شبکه و وب سرویس ها می باشد. j2ee علاوه بر شکل استاندارد جاوا ویژگی هایی مانند ORM ها و معماری چند لایه و وب سرویس ها را نیز دارا می باشد. برای برنامه نویسی j2ee باید از زبان جاوا استفاده شود. در حال حاضر نسخه 7 جاوا مورد استفاده قرار می گیرد. یکی از مهم ترین API های j2ee ، servlet می باشد که مربوط به درخواست های http و پردازش آن ها است که امکان نوشتن برنامه های وب بر پایه سرور جاوایی را فراهم می کند. و صفحاتی که با jsp طراحی می شوند از این امکان بهره می برند.
Image


POJO چیست؟


POJO مخفف Plain Old Java Object می باشد. این کلمه به اشیائی اطلاق می شود که کلاس آنها به هیچ کلاس دیگری وصل نیست و از طرف هیچ کلاسی محدود نشده اند. در جاوا به صورت واضح به کلاس هایی گفته می شود که از هیچ کلاس دیگری extend نشده باشند و هیچ اینترفیسی را implement نکرده باشند. همچنین قید های هیچ کلاسی را نداشته باشند.

ویژگی های spring


Spring بر پایه برنامه نویسی جنبه گرا (aspect oriented) و معکوس کردن کنترل (inversion of control) طراحی شده است. Spring به شکل ماژولار طراحی شده است و از ماژول های مختلف برای رفع نیاز برنامه نویسان استفاده می کند. تست کردن در این فریمورک ساده است. چون کدهایی که شما می نویسید ربطی به محیط ندارند. همچنین قسمت وب spring بر مبنای معماری mvc ساخته شده است.

Dependency Injection


یکی از تکنولوژی هایی که spring به خاطر آن مشهور شده است Dependency injection با استفاده از Inversion of Control می باشد به خاطر این که معنی فارسی این عبارات گویای همه چیز نیست از معادل انگلیسی آن استفاده می کنیم برای مثال تزریق وابستگی ها و معکوس کردن کنترل شاید منظور را نرساند. دوست خوبم مهندس احمدی در این لینک این مفاهیم را در زبان سی شارپ توضح داده اند. Inversion of control یک مفهوم کلی است و به شکل های گوناگونی می توان آن را توضیح داد و dependency injection یک مثال از inversion of control می باشد. زمانی که ما یک برنامه جاوا می نویسیم کلاس ها و اشیا باید تا جایی که جا داشته باشد از هم مستقل باشد. مستقل بودن کلاس ها از هم به استفاده مجدد از کد بسیار کمک می کند. و همچنین اگر شما کد را تغییر دهید چون بقیه کلاس ها با هم وابستگی کمی دارند نیاز به تغییر در کل نمی شود. ولی اگر همه کلاس ها به هم وابسته باشد وقتی که یک کلاس را تغییر می دهید به صورت دومینو باید بقیه کلاس ها را نیز تغییر دهید و این بسیار زمانبر و هزینه بر می باشد. dependency injection برای این که کلاس ها از یکدیگر مستقل باشند ولی از یکدیگر استفاده کنند بسیار کمک می کند.

Aspect oriented programming یا برنامه نویسی جنبه گرا چیست؟


Image


همانطور که گفتیم یکی از خصوصیات Spring برنامه نویسی جنبه گرا می باشد. حال این برنامه نویسی جنبه گرا چیست؟ گاهی اوقات باید قابلیت هایی را به برنامه اضافه کنیم که در چند بخش از برنامه عمل می کنند. برای مثال ما امنیت را در برنامه باید در قسمت های مختلفی به کار ببریم. به این نوع قابلیت ها cross-cutting concern گفته می شود به معنی قید هایی که قسمت های مختلف باید آن ها را رعایت کنند. معمولا cross-cutting concern ها جدا از منطق اصلی برنامه می باشند. برای مثال لاگ گرفتن عملیات ها و یا کش کردن یا امنیت جزء اصلی منطق برنامه نیستند ولی کارهایی هستند که باید آنها را انجام داد. در برنامه نویسی شی گرا جزء اصلی برنامه شی و کلاس می باشد ولی در برنامه نویسی جنبه گرا جزء اصلی جنبه است. همانطور که dependency injection به شما کمک می کند که کلاس ها و اشیا با هم وابستگی نداشته باشند برنامه نویسی جنبه گرا هم کمک می کند که منطق اصلی برنامه از cross-cutting concern ها جدا باشد.
شاید با خواندن این مطلب علامت سوال هایی در ذهن شما ایجاد شده باشد که در مطالب بعدی در مورد spring آنها را برطرف خواهیم کرد Itpro باشید


نویسنده: مهدی عادلی فر
منبع: Itpro

behrad nasehi
۲۰ خرداد ۹۷ ، ۱۶:۵۰ موافقین ۰ مخالفین ۰ ۱ نظر

در قسمت قبلی سری آموزشی با مفهوم interface ها آشنا شدیم. interface ها نقش بسیار موثری در روند نوشتن یک برنامه بازی می کنند و در صورتی که یک برنامه نویس با نحوه استفاده صحیح از interface ها آشنا باشه، توانایی ایجاد کدهایی ساختاریافته و قابل گستری و نگهداری رو داره. در این قسمت از سری آموزشی زبان برنامه نویسی سی شارپ و برنامه نویسی شئ گرا، با دو مفهوم بسیار مهم در برنامه نویسی آشنا خواهیم شد، IoC که مخفف Inversion of Control و DI که مخفف Dependency Injection هست.همه ما در طول زندگی با وسایل زیادی سر و کار داریم، از وسایل اولیه زندگی مانند ماشین، یخچال، تلویزیون و ... تا وسایل که هر کس بر اساس نیاز کاری خودش با اونها سر و کار داره، مانند کامپیوتر یا لپ تاپ و گوشی. برای مثال، گوشی هوشمند خود را فرض کنید، این گوشی از قطعات زیادی تشکیل شده، صفحه نمایش، پردازنده، حافظه رم، باتری و کلی قطعات دیگه. حالا اتفاقی پیش میاد و خدای نکرده گوشی شما از دستتون میافته و صفحه نمایش گوشیتون آسیب میبینه.

کاری که می کنید باید گوشی رو به یک نمایندگی برده و صفحه نمایش رو تغییر بدید. حالا فرض کنید که گوشی شما جوری طراحی شده باشه که با آسیب دیدن صفحه نمایش نیاز باشه تا یک گوشی جدید تهیه کنید!!!! یا برای کارتون یک لپ تاپ تهیه کردید. بعد از مدتی نیاز دارید تا حافظه رم لپ تاپ رو افزایش بدید. در این حالت شما لپ تاپ رو پیش نمایندگی یا یک کارشناس در این زمینه می برید و حافظه رم لپ تاپ شما افزایش داده میشه. حال فرض کنید که لپ تاپ شما همچین قابلیتی نداشته باشه و شما نیاز باشه برای تغییر یا ارتقا حافظه یک لپ تاپ جدید خریداری کنید! برای حل این مشکل لوازم الکتریکی از قطعات مختلفی تشکیل شدند که قابلیت تغییر یا تعویض دارند. به این قابلیت طراحی ماژولار گفته میشه. در پیاده سازی سیستم های نرم افزاری نیز شما نیز به عنوان برنامه نویس باید با همچین دیدی نسبت به پیاده سازی نرم افزار اقدام کنید. ما در اینجا در مورد تغییر یکی از قسمت های نرم افزار صحبت خواهیم کرد که ارتباط مستقیمی به interface ها و IoC و DI دارد.برای آشنایی بیشتر با این مفاهیم، با یک مثال جلو میرویم. فرض کنید سیستمی پیاده سازی کردید که اعضاء می توانند در این سامانه اقدام به ثبت نام کنند. برای عملیات های مرتبط با مدیریت اعضاء کلاسی با نام Members می نویسیم:

public class Members
{
    public void Register(string firstName, string lastName)
    {
        // add member to database            
    }
}

همانطور که مشاهده می کنید این کلاس یک متد با نام Register دارد که عملیات ثبت نام اعضاء را انجام می دهد (تنها متد تعریف شده و کدی برای ثبت نام نوشته نشده است). پس از مدتی، فردی که درخواست پیاده سازی نرم افزار را از شما داشته، می خواهد زمانی که یک عضو جدید به سامانه اضافه شد، یک ایمیل برای شخص ارسال شود. کد کلاس به صورت زیر تغییر می کند:

public class Members
{
    public void Register(string firstName, string lastName)
    {
        // add member to database
        // send email to name@host.com
    }
}

تا اینجا مشکلی نیست، بعد از مدتی مجدداً شخص ذکر شده از شما می خواهد به جای ارسال ایمیل، یک پیامک برای او ارسال شود. شما مجدداً باید کد داخل متد Register را تغییر داده و عملیات ارسال پیامک را اضافه کنید:

public class Members
{
    public void Register(string firstName, string lastName)
    {
        // add member to database
        // send sms to 0912*******
    }
}

با هر درخواست، ما دائماً در حال تغییر کدهای نوشته شده داخل کلاس Members هستیم. اگر کمی اصولی کار کنیم، کلاسی با نام SmsManager ایجاد می کنیم و از آن کلاس داخل کلاس Members استفاده می کنیم:

public class SmsManager
{
    public void Send(string message)
    {
        // send sms to 0912*******
    }
}

public class Members
{
    public void Register(string firstName, string lastName)
    {
        // add member to database
        var sms = new SmsManager();
        sms.Send("New user registered!");
    }
}

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

public class EmailManager
{
    public void Send(string message)
    {
        // send message to name@host.com
    }
}

public class SmsManager
{
    public void Send(string message)
    {
        // send sms to 0912*******
    }
}

public class Members
{
    public void Register(string firstName, string lastName)
    {
        // add member to database
        var email = new EmailManager();
        email.Send("New user registered!");
    }
}

با تعریف کلاس های EmailManager و SmsManager، حجم تغییرات کلاس Members خیلی کم شد. اما می توان این تغییرات را خیلی کمتر کرد. در اینجا می خواهیم یکی از کاربردهای بسیار مهم interface ها، یعنی IoC یا Inversion of Control را بررسی کنیم. در ابتدا ما یک interface با نام INotifySender به صورت زیر ایجاد می کنیم:

public interface INotifySender
{
    void Send(string message);
}

اگر دقت کنید، متد signature متد Send در کلاس های EmailManager و SmsManager مشترک است. پس این دو کلاس قابلیت پیاده سازی INotifySender را دارند. کلاس های ذکر شده را به صورت زیر تغییر می دهیم:

public class EmailManager : INotifySender
{
    public void Send(string message)
    {
        // send message to name@host.com
    }
}

public class SmsManager : INotifySender
{
    public void Send(string message)
    {
        // send sms to 0912*******
    }
}

در قدم بعدی باید کلاس Members را جوری تغییر دهیم تا وابستگی متد Register به یک کلاس خاص از بین برود، یعنی به کلاس EmailManager یا SmsManager وابسته نباشد. اینکار را می توان با استفاده از INotifySender انجام داد. کد کلاس Members را به صورت زیر تغییر می دهیم:

public class Members
{
    private readonly INotifySender sender;

    public Members()
    {
        sender = new EmailManager();
    }

    public void Register(string firstName, string lastName)
    {
        // add member to database
        sender.Send("New member registered!");
    }
}

تغییرات کد بالا را با هم بررسی می کنیم، فیلدی تعریف کردیم از نوع INotifySender که داخل متد Register از این فیلد برای ارسال پیام استفاده می کنیم. این فیلد از داخل سازنده کلاس Members مقدار دهی می شود. در کد بالا ما شئ ای از نوع EmailManager که INotifySender را پیاده سازی کرده است ایجاد کرده و داخل فیلد sender میریزیم. حال فرض کنید که بخواهیم عملیات را از ایمیل به پیامک تغییر دهیم، برای اینکار تنها سازنده را به صورت زیر تغییر می دهیم:

public class Members
{
    private readonly INotifySender sender;

    public Members()
    {
        sender = new SmsManager();
    }

    public void Register(string firstName, string lastName)
    {
        // add member to database
        sender.Send("New member registered!");
    }
}

به عملیات بالا، Inversion of Control گفته می شود. ما در حقیقت وابستگی متد Register را به یک کلاس خاص از بین بردیم. به این نوع پیاده سازی tightly coupled گفته می شود. اما باز یک مشکل وجود دارد، ما هنوز هم در حال تغییر کلاس Members هستیم. در قدم بعد باید وابستگی کلاس Members را به کلاس های EmailManager و SmsManager به طور کامل از بین ببریم. برای اینکار، ما به جای ساختن شئ داخل سازنده، آن را به عنوان یک پارامتر به سازنده کلاس Members ارسال می کنیم:

public class Members
{
    private readonly INotifySender sender;

    public Members(INotifySender sender)
    {
        this.sender = sender;
    }

    public void Register(string firstName, string lastName)
    {
        // add member to database
        sender.Send("New member registered!");
    }
}

نحوه استفاده از کلاس Members به صورت زیر است:

var members = new Members(new EmailManager());
members.Register("Hossein", "Ahmadi");

حال اگر بخواهیم نوع ارسال پیام را به پیامک تغییر دهیم تنها کافیست نوع شئ ارسالی به سازنده کلاس Members را تغییر دهیم:

var members = new Members(new SmsManager());
members.Register("Hossein", "Ahmadi");

به این تکنیک، DI یا Dependency Injection گفته می شود. ترکیب IoC و DI کمک زیادی به شما در نوشتن کدهایی می کنند که به راحتی قابلیت تغییر و به روز رسانی دارند. در این مقاله با یکی از کاربردهای بسیار مهم interface ها آشنا شدید. کتابخانه های آماده ای برای IoC و DI وجود دارند که به آنها IoC Container نیز گفته می شوند که روند DI رو برای شما به عنوان یک برنامه نویس بسیار راحت تر می کنند. در یک فیلم آموزشی در مورد IoC Container ها به تفصیل صحبت خواهیم کرد. در قسمت بعدی با مفهوم Type Casting و انواع Cast ها در زبان سی شارپ آشنا خواهیم شد. ITPRO باشید

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


آشنایی با مفاهیم Inversion of Control و Dependency Injection

behrad nasehi
۲۰ خرداد ۹۷ ، ۱۶:۴۵ موافقین ۰ مخالفین ۰ ۰ نظر