دنیا به سرعت در حال رشد است. از زمانی که اینترنت و گوشیهای هوشمند تکامل یافتهاند، فناوریهای مالی به طور انفجاری رشد کردهاند. بر اساس گزارشها، از هر 781 نفر روی کره زمین یک نفر به صورت آنلاین تجارت میکند. این عدد وقتی با دیگر کارهایی که انسانها انجام میدهند مقایسه شود، عدد بزرگی به نظر خواهد رسید. در این مطلب در مورد دادههای بازار سهام، روش دانلود کردن آنها از ترمینال و پرکاربردترین نمودار در حوزههای تجاری که به نام نمودار «شعدانی» یا «کندلاستیک» (Candlestick) شناخته میشود بیشتر خواهیم آموخت. همچنین، روش رسم نمودارهای کندلاستیک را با استفاده از پایتون و Bokeh از صفر فرا خواهیم گرفت. در ادامه این مطلب راجع به ساخت نمودارهای مالی با Bokeh با مجله فرادرس همراه باشید.
برای مطالعه قسمت قبلی این مجموعه مطلب آموزشی میتوانید روی لینک زیر کلیک کنید:
در این مرحله به صورت گام به گام کارهایی که باید انجام یابند را توضیح میدهیم. ابتدا باید با نوشتن دستور زیر پکیج pandas_datareader را نصب کنیم:
pip3 install pandas_datareader --user
این بسته به ما کمک میکند که دادههای بازار سهام را دانلود کنیم. نکته جالب این است که این کار از ترمینال نیز امکانپذیر است. کار دوم این است که کتابخانه datetime را نصب میکنیم تا قاب زمانی را برای بازهای که دادههایش را لازم داریم ثبت شود.
در این مرحله دادهها را از نهم اکتبر 2018 دریافت میکنیم. اینک برای واکشی دادهها باید در پارامتر نخست نام شرکت یا سهام را وارد کنیم. برای مثال عبارت TSLA برای اشاره به شرکت Tesla استفاده میشود. هر شرکت یک نام اختصاری یا ticker برای خود دارد. شرکت Yahoo نیز منبع خوبی برای بررسی دادههای مالی محسوب میشود. از این رو از Yahoo به عنوان منبع دادهها استفاده میکنیم. موارد دیگر که میتوانید استفاده کنید، Google ،FRED ،Robinhood و موارد بسیار دیگر است. دو پارامتر آخر نیز قاب زمانی هستند که قبلاً اشاره کردیم.

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

تنها به کمک این پنج ستون میتوانیم گراف مالی خود را بسازیم تا دادهها به حالت بصری درآیند و بتوانیم از آن نتیجهگیریهایی بکنیم. بنابراین منتظر چه هستیم؟ در ادامه این کار را انجام میدهیم. همواره نهایت تلاش خود را بکنید که پول دربیاورید، اما هیچ گاه این سخن بنجامین فرانکلین را فراموش نکنید که: «سرمایهگذاری روی دانش، بالاترین بهره را میدهد.»

نمودار کندلاستیک روشی بسیار کارآمد برای نگاه کردن همزمان به همه ستونهایی است که در بخش قبل اشاره کردیم. همان طور که در تصویر فوق میبینید، کندل سبز نشان میدهد که قیمت امروز افزایش یافته است، در حالی که کندل قرمز نشانگر کاهش است. قیمتهای high و low نیز روی آن کندل نمایش مییابند.
اینک ما میدانیم که نمودارهای کندلاستیک چیست و همچنین با روش دانلود دادههای بازار سهام آشنا شدیم. بنابراین اکنون نوبت آن رسیده است که بدنه نمودارهای کندلاستیک خود را با استفاده از متد rect در کتابخانه Bokeh بسازیم. اما قبل از این کار باید یک تصویر (figure) بسازیم که نمودار درون آن نمایش پیدا میکند. در واقع این یک زمینه بیرونی است. به این منظور از متد figure کتابخانه Bokeh استفاده میکنیم.
کد فوق یک کادر خالی ایجاد میکند که نمودار ما در ادامه روی آن نمایش پیدا خواهد کرد. اگر از متد rect استفاده کنیم باید چهار پارامتر اجباری به آن ارسال کنیم که باعث ساخت یک مستطیل کامل میشوید. دو پارامتر نخست یعنی X-coordinate and و Y-coordinate نقاط مرکزی مستطیل هستند (این وضعیت پیشفرض، گرچه روش عجیبی است؛ اما به هر حال مهم است). دو پارامتر دیگر Width و Height یعنی عرض و ارتفاع تصویر هستند. ابتدا نگاهی به کد میاندازیم:
اینک نوبت آن رسیده است که همه پارامترهای مورد استفاده در متد rect را توضیح دهیم، به طوری که بدانیم نخستین نمودار کندلاستیک چگونه آمادهسازی میشود.
اینک موفق شدهایم بخش اصلی کار را به پایان ببریم. حال میدانیم که همه چیزهای لازم برای ساخت نمودار کندلاستیک بر اساس دادههای شرکت مورد نظر در اختیارمان قرار دارند. نمودار ما برای TESLA چیزی مانند تصویر زیر است:

هیچ کس دوست ندارد همیشه میلههای آبی را تماشا کند که هیچ معنایی ندارند. به همین دلیل باید تغییراتی در آنها ایجاد کنیم. ما از میلههای سبز و قرمز به ترتیب برای بالا رفتن و پایین آمدن قیمت استفاده میکنیم. ضمناً تابعهای مستقلی برای همه پارامترها در متد rect ایجاد میکنیم. در ادامه یک ستون جدید برای هر کدام ایجاد کردهایم و دادهها را در آن ذخیره میکنیم تا درک طرز کار همه موارد آسانتر باشد. میتوانید قاب داده بهروزرسانی شده را زیر قطعه کدی که در ادامه آمده است ببینید و پس از آن نمودار بهروزرسانی شده ارائه شده است:


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

بدین ترتیب موفق شدهایم یک نمودار عالی کندلاستیک را برای 10 روز بسازیم. همین کار را میتوان برای بازه 3 ماهه و یا بیشتر نیز ایجاد کرد. نموداری که در ادامه مشاهده میکنید، با استفاده از همان 60 خط کد فوق ساخته شده و مربوط به دادههای سه ماه است.

همانطور که همه ما میدانیم، بصریسازی به درک بهتر دادههای خام کمک زیادی میکند. ایجاد نمودارهای بصری از دادهها مزیتهای بسیاری دارد و به کمک کتابخانههای خارجی مانند Bokeh و همچنین فرایند بصریسازی پایتون این کار قدرتمندتر از هر زمان دیگری انجام میپذیرد. در این مطلب مواردی را در خصوص دادههای بازار سهام، روش دانلود کردن آنها، مفهوم نمودارهای کندلاستیک، و روش ایجاد آنها به کمک کتابخانه Bokeh آموختید.
منبع: فرادرس
در این راهنما با روش ایجاد و اجرای یک الگوریتم تشخیص چهره در پایتون با استفاده از OpenCV و Dlib آشنا میشویم. همچنین برخی قابلیتهای آنها را برای شناسایی همزمان چشمها و دهان روی چهرههای مختلف معرفی خواهیم کرد. در این مقاله روش پیادهسازی مقدماتی تشخیص چهره را به طور کامل توضیح میدهیم که شامل ابزارهای طبقهبندی آبشاری، پنجرههای HOG، و CNN-های یادگیری عمیق میشود.
برای مشاهده مخزن گیتهاب این مقاله به این لینک (+) مراجعه کنید.
ما در این مطلب از OpenCV استفاده خواهیم کرد که یک کتابخانه متنباز برای بینایی ماشین است و به زبان ++C/C نوشته شده است. این کتابخانه اینترفیسهایی در زبانهای ++C، پایتون و جاوا دارد. OpenCV از پلتفرمهای ویندوز، لینوکس، macOS ،iOS و اندروید پشتیبانی میکند. برخی از بخشهای کار نیازمند Dlib هستند که یک کیت ابزار ++C شامل الگوریتمهای یادگیری ماشین و ابزارهایی برای خلق نرمافزارهای پیچیده است.
نخستین مرحله برای شروع کار، نصب OpenCV و Dlib است. به این منظور دستور زیر را وارد کنید:
pip install opencv-python pip install dlib
بسته به این که از کدام نسخه از پایتون استفاده میکنید، فایل در مسیرهای مختلفی نصب میشود. در مورد نسخهای که ما استفاده میکنیم، وضعیت به صورت زیر بوده است:
/usr/local/lib/python3.7/site-packages/cv2
اگر در نصب Dlib با مشکلاتی مواجه شدید به این مقاله (+) مراجعه کنید.
ما یک نتبوک ژوپیتر/فایل پایتون میسازیم و کار خود را با آن آغاز میکنیم:
import cv2 import matplotlib.pyplot as plt import dlib from imutils import face_utils font = cv2.FONT_HERSHEY_SIMPLEX
ابتدا به بررسی طبقهبندی آبشاری میپردازیم.
طبقهبندی آبشاری یا آبشارهای مشهور طبقهبندی ارتقا یافته به همراه ویژگیهای شِبه Haar (یا Haar-like feature) عمل میکنند و یک کاربرد خاص از «یادگیری گروهی» (ensemble learning) محسوب میشوند که boosting نام دارند. این ابزارها به طور عمده روی طبقهبندیهای Adaboost و دیگر مدلها مانند Real Adaboost ،Gentle Adaboost یا Logitboost تکیه دارند.
ابزارهای طبقهبندی آبشاری روی چند تصویر نمونه از یک موضوع آموزش میبینند. این تصاویر شامل سوژهای است که میخواهیم شناسایی کنیم. همچنین از تصاویر دیگر که شامل آن موضوع نیستند نیز استفاده میشود.
چگونه میتوان تشخیص داد که در تصویری چهره انسان وجود دارد یا نه؟ یک الگوریتم به نام فریمورک شناسایی شیء Viola–Jones وجود دارد که شامل همه مراحل مورد نیاز برای شناسایی زنده چهره است. این موارد شامل فهرست زیر میشوند:
اگر میخواهید مقاله اصلی Viola-Jones را ببینید، به این لینک (+) مراجعه کنید.
برخی ویژگیهای مشترک وجود دارند که در همه چهرههای انسانی میتوان مشاهده کرد:
این خصوصیات به نام ویژگیهای Haar نامیده میشوند. فرایند استخراج ویژگی مانند زیر است:

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

سپس این مستطیل را به عنوان یک کرنل کانولوشنی روی کل تصویر اعمال میکنیم. برای این که رویکرد جامعی داشته باشیم، باید همه ابعاد و موقعیتهای ممکن برای هر کرنل را اعمال کنیم. یک تصویر ساده 24 در 24 پیکسل، معمولاً منتهی به 160،000 ویژگی میشود که هر یک از جمع/تفریق کردن مقادیر پیکسلها به دست آمدهاند. بدین ترتیب امکان تشخیص چهره زنده از دست میرود. بنابراین سؤال این است که این فرایند چگونه عملیاتی میشود؟
زمانی که ناحیه مناسبی به وسیله یک مستطیل شناسایی میشود، اجرای پنجره روی نواحی مختلف چهره بیفایده خواهد بود. این کار به وسیله Adaboost صوت میگیرد.
ویژگیهای مستطیل با استفاده از مفهوم تصویر یکپارچه محاسبه میشوند که روشی بسیار سریعتر است. در مورد این روش در بخش بعدی بیشتر توضیح خواهیم داد.

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

اینک که ویژگیها گزینش شدهاند، آنها را با استفاده از طبقهبندی Adaboost روی مجموعهای از تصاویر آموزشی اعمال میکنیم. بدین ترتیب مجموعهای از طبقهبندیهای ضعیف با هم ترکیب میشود تا یک مدل گروهی دقیق را تشکیل دهند. با استفاده از 200 ویژگی (به جای 160،000 ویژگی اولیه) میزان دقتی برابر با 95% به دست میآید. ما در این نوشته از 6000 ویژگی استفاده کردهایم.
محاسبه ویژگیهای مستطیلی به سبک کرنل کانولوشنی، ممکن است مدت زمان بسیار زیادی طول بکشد. به همین دلیل طراحان اولیه این روش Viola و Jones یک بازنمایی میانجی از تصویر را پیشنهاد کردهاند که آن را تصویر یکپارچه مینامند. نقش تصویر یکپارچه این است که امکان محاسبه مجموع هر مستطیلی را به سادگی با استفاده از تنها چهار ویژگی فراهم میکند.
فرض کنید میخواهیم ویژگیهای مستطیلی را در یک پیکسل مفروض با مختصات x و y محاسبه کنیم. سپس تصویر یکپارچه پیکسل را در مجموع پیکسلهای سمت بالا و سمت چپ پیکسل محاسبه میکنیم:

در فرمول فوق (ii(x،y تصویر یکپارچه و (i(x،y تصویر اصلی است.
زمانی که تصویر یکپارچه به صورت کامل محاسبه شد، یک رابطه بازگشتی وجود دارد که یک بار روی تصویر اصلی اعمال میشود. در واقع میتوانیم جفت روابط بازگشتی زیر را تعریف کنیم:

که (s(x،y مجموع ردیف تجمعی و s(x−1)=0، ii(−1،y)=0 است.
این رابطه چه فایدهای دارد؟ تصور کنید ناحیه D وجود دارد که در آن میخواهیم مجموع پیکسلها را محاسبه کنیم. ما سه ناحیه دیگر را نیز به صورت A ،B و C تعریف کردهایم.
از این رو مجموع پیکسلها در ناحیه D را میتوان با استفاده از فرمول زیر محاسبه کرد:
4+1−(2+3)
با استفاده از یک گذر میتوان مقدار درون یک مستطیل را با استفاده از تنها 4 ارجاع آرایهای محاسبه کرد:

باید بدانید که مستطیلها عملاً ویژگیهای کاملاً سادهای هستند، اما اهمیت زیادی در تشخیص چهره دارند. فیلترهای Steerable هنگامی که با مسائل پیچیده سر و کار داریم، انعطافپذیری بیشتری دارند.

با فرض وجود یک مجموعه برچسب خورده از تصاویر آموزشی (مثبت یا منفی) Adaboost به صورت زیر مورد استفاده قرار میگیرد:
از آنجا که اغلب ویژگیها در میان 160،000 ویژگی نامرتبط تصور شدهاند؛ الگوریتم یادگیری ضعیف که با استفاده از مدل boosting ساختیم طوری طراحی شده است که ویژگی مستطیلی منفردی را انتخاب کند که مثالهای مثبت و منفی را به بهترین روش از هم جدا میکند.
با این که فرایند توصیف شده فوق کاملاً کارآمد است، اما هنوز یک مشکل عمده بر سر راه آن پابرجا است. در یک تصویر اغلب بخشها را قسمتهای غیر از چهره تشکیل میدهند. دادن اهمیت یکسان به همه بخشهای چنین تصویری بیمعنی است، چون باید تمرکز عمده روی ناحیهای باشد که احتمال وجود چهره بیشتر است. Viola و Jones در روش خود به نرخ شناسایی بالایی دست یافتند و در عین حال زمان محاسبه را با استفاده از طبقهبندیهای آبشاری کاهش دادند.
ایده اصلی این بوده است که آن پنجرههای فرعی را که شامل چهره نیستند رد کنند و در عین حال مناطقی که چنین خصوصیتی را دارند حفظ نمایند. از آنجا که وظیفه ما شناسایی مناسب چهره بوده است، میخواهیم نرخ تشخیص منفی نادرست، یعنی موادی که شامل چهره بودهاند، اما چنین شناسایی نشدهاند را کاهش دهیم.
یک سری از طبقهبندیها روی هر پنجره فرعی اعمال میشوند. این طبقهبندیها درختهای تصمیم سادهای هستند:
هر نتیجه منفی در یک نقطه، منتهی به رد پنجره فرعی میشود که احتمالاً شامل یک چهره است. طبقهبندی اول اغلب مثالهای منفی را با هزینه محاسباتی پایین کاهش میدهد و طبقهبندیهای بعدی مثالهای منفی بعدی را که هزینه بالاتری دارند با استفاده از توان محاسباتی بالاتر حذف میکنند.

طبقهبندیها با استفاده از Adaboost آموزش داده میشوند و حد آستانه طوری تعیین میشود که نرخ تشخیص نادرست کمینه شود. زمانی که چنین مدلی را آموزش میدهیم، متغیرها به صورت زیر هستند:
خوشبختانه در OpenCV، کل مدل از قبل برای تشخیص چهره تعلیم یافته است.
مرحله بعدی این است که وزنهای از قبل آموزشیافته را مکانیابی کنیم. ما از مدلهای از پیش آموزشدیده برای تشخیص چهره، چشمها و دهان استفاده خواهیم کرد. بسته به این که از چه نسخهای از پایتون استفاده میکنید فایلهای مربوطه باید در چنین مکانهایی باشند:
/usr/local/lib/python3.7/site-packages/cv2/data
الگوریتمهای طبقهبندی آبشاری را به روش زیر اعلان میکنیم:
cascPath = "/usr/local/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml" eyePath = "/usr/local/lib/python3.7/site-packages/cv2/data/haarcascade_eye.xml" smilePath = "/usr/local/lib/python3.7/site-packages/cv2/data/haarcascade_smile.xml" faceCascade = cv2.CascadeClassifier(cascPath) eyeCascade = cv2.CascadeClassifier(eyePath) smileCascade = cv2.CascadeClassifier(smilePath)
پیش از پیادهسازی یک الگوریتم تشخیص چهره واقعی، نسخه سادهای از آن را روی یک تصویر ساده به کار میگیریم. کار خود را با بارگذاری یک تصویر تست آغاز میکنیم:

سپس چهره را تشخیص داده و یک مستطیل پیرامون آن اضافه میکنیم:
در ادامه فهرستی از پارامترهای مشترک را برای تابع detectMultiScale مشاهده میکنید:
در نهایت نتیجه نمایش پیدا میکند:

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

این وضعیت به صورت پیشفرض در OpenCV پیادهسازی شده است:
اینک از متغیر faceCascade که در بخش قبلی تعریف کردیم استفاده میکنیم. این متغیر شامل یک الگوریتم از پیش آموزشدیده است و آن را روی یک تصویر خاکستری اعمال میکنیم.
برای هر چهرهای که تشخیص داده شود، یک مستطیل پیرامون چهره ترسیم میشود:
در مورد هر دهان که تشخیص داده میشود نیز یک مستطیل پیرامون آن رسم میشود:
همچنین برای هر چشم شناسایی شده یک مستطیل در پیرامونش ترسیم میشود:
سپس تعداد کل چهرهها شمارش شده و تصویر نهایی نمایش پیدا میکند:
زمانی که میخواهیم از دوربین خارج شویم یک گزینه خروج نیز پیادهسازی میکنیم تا با ارسال حرف q فعال شود:
در نهایت هنگامی که همه کارها انجام یافت، دریافت ویدئو قطع میشود و همه پنجرهها بسته میشوند. البته بستن پنجرهها در سیستم Mac با برخی مشکلات مواجه میشود که ممکن است نیازمند توقف پردازش پایتون در Activity Manager باشد:
کد کامل ما اینک به صورت زیر است:
در ویدئوی کوتاه زیر عملکرد پیادهسازی تشخیص چهره ما را مشاهده میکنید:

دومین پیادهسازی محبوب برای تشخیص چهره از سوی Dlib ارائه شده و از مفهومی به نام هیستوگرام گرادیانهای جهتدار (HOG) بهره میگیرد. در این بخش به پیادهسازی روش اصلی پیشنهاد شده در مقاله Dalal و Triggs (+) میپردازیم.
ایدهای که در پشت HOG قرار دارد این است که میتوان ویژگیها را به صورت یک بردار استخراج کرد و آن را به یک الگوریتم طبقهبندی، برای مثال ماشین بردار پشتیبانی داد که ارزیابی کند آیا یک چهره (یا هر چیز دیگر که برای شناساییاش تعلیم دیده است) در آن ناحیه وجود دارد یا نه.
ویژگیهای استخراج شده، توزیعها (هیستوگرامها)-ی جهتگیری گرادیانها (یا گرادیانهای جهتدار) از تصویر هستند. گرادیانها عموماً در بخشهای لبه و گوشه، مقادیر بالایی دارند و بدین ترتیب به ما امکان میدهند که آن نواحی را تشخیص دهیم.
در مقاله اصلی، فرایند کار برای تشخیص بدن انسان به صورت زیر پیادهسازی شده است و زنجیره تشخیص به شرح زیر است:

قبل از هر چیز، تصاویر ورودی باید هماندازه باشند. از این رو برش و تغییر مقیاس لازم است. وصلههایی که ما در این مقاله استفاده میکنیم، دارای نسبت 1:2 هستند و از این رو ابعاد تصاویر ورودی باید برای نمونه 64 در 128 یا 100 در 200 باشد.
نخستین گام، محاسبه گرادیانهای افقی و عمودی تصویر از طریق بهکارگیری کرنلهای زیر است:

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

با این حال ما تصویر را پیشپردازش نکردهایم.
در ادامه تصویر به سلولهای 8 در 8 تقسیم میشود تا یک بازنمایی فشرده ایجاد شود و HOG در برابر نویز مقاومت بیشتری بیابد. سپس HOG را برای هریک از این سلولها محاسبه میکنیم.
برای تخمین جهت گرادیان درون ناحیه، یک هیستوگرام میان 64 مقدار از جهتگیریهای گرادیان (8 در 8) میسازیم و بزرگی آنها (64 مقدار دیگر) درون هر ناحیه را نیز محاسبه میکنیم. دستههای هیستوگرام با زوایای گرادیان از 0 تا 180 درجه مرتبط هستند. در مجموع 9 دسته به صورت 0، 20، 40،… و 160 درجه وجود دارند.
کد فوق دو نوع اطلاعات را در اختیار ما قرار میدهد:
زمانی که HOG را میسازیم، 3 حالت فرعی وجود دارد:


HOG برای هر سلول 8 در 8 به صورت زیر به دست میآید:

در نهایت، یک بلوک 16 در 16 را میتوان برای نرمالسازی تصویر و برای مثال حذف تأثیر نوردهی اعمال کرد. این نتیجه به سادگی با تقسیم کردن هر مقدار HOG با اندازه 8 در 8 بر L2-norm مربوط به بلوک HOG 16 در 16 که شامل آن است صورت میگیرد. در واقع این یک بردار ساده با طول 9*4 = 36 است.
در نهایت همه بردارهای 36 در 1 در یک بردار بزرگ تجمیع میشوند و کار به پایان میرسد. بدین ترتیب بردار ویژگی به دست میآید و با استفاده از آن میتوان یک الگوریتم طبقهبندی SVM نرم (C=0.01) را آموزش داد.
پیادهسازی این روش کاملاً سر راست است:

همانند روش قبلی، پیادهسازی آنی این الگوریتم نیز آسان است. ما یک نسخه سبکتر از آن را که تنها چهره را تشخیص میدهد را پیادهسازی کردهایم. Dlib شناسایی نقاط کلیدی چهره را نیز به صورت کاملاً ساده اجرا میکند که البته بررسی آن خارج از حیطه این مقاله است:
آخرین روش که در این مقاله برای تشخیص چهره بررسی میکنیم مبتنی بر شبکههای عصبی کانولوشنی (CNN) است. برای پیادهسازی این روش از نتایج این مقاله (+) در مورد شناسایی شیء (Max-Margin (MMOD بهره جستهایم.
شبکههای عصبی کانولوشنی (CNN) شبکههای عصبی پیشخور (feed-forward) هستند که به طور عمده برای بینایی ماشین استفاده میشوند. این شبکهها یک پیش-آموزش خودکار را نیز همراه با بخش شبکه عصبی فشرده ارائه میکنند. CNN-ها انواع خاصی از شبکههای عصبی برای پردازش دادهها با فناوری شبه grid هستند. معماری CNN از کورتکس بینایی جانداران الهام گرفته است.
در رویکردهای قبلی، بخش عمدهای از کار مربوط به انتخاب فیلترها برای ایجاد ویژگیهایی جهت استخراج بیشینه ممکن اطلاعات از تصاویر بوده است. با ظهور یادگیری عمیق و ظرفیتهای محاسباتی بالاتر این کار اکنون به صورت خودکار صورت میگیرد. نام CNN از این واقعیت ناشی میشود که ورودی تصویر اولیه با یک مجموعه از فیلترها پیچش (convolve) مییابد. پارامتری که باید انتخاب کرد، تعداد فیلترهایی که باید اعمال شوند و ابعاد فیلترها است. بُعد فیلتر به نام طول stride نامیده میشود. مقادیر معمول برای این stride بین 2 و 5 هستند:
خروجی CNN در این مورد خاص یک طبقهبندی باینری است که در صورت وجود چهره مقدار 1 و در غیر این صورت مقدار 0 میگیرد.
برخی اجزای این رویکرد در پیادهسازی تغییر مییابند. نخستین گام، دانلود کردن مدل از پیش آموزشدیده (+) است. وزنها را به پوشه خود منتقل و dnnDaceDetector را تعریف کنید:
dnnFaceDetector = dlib.cnn_face_detection_model_v1("mmod_human_face_detector.dat")سپس مشابه روشی که تا به اینجا عمل کردیم پیش میرویم:

در نهایت نسخه آنی تشخیص چهره CNN را پیادهسازی خواهیم کرد:
سؤال دشواری است و برای پاسخ به آن باید دو معیار مهم زیر را در نظر گرفت:
اگر سرعت را معیار قرار دهیم، HoG سریعترین الگوریتم به نظر میرسد و سپس طبقهبندی آبشار Haar و CNN قرار دارند.
با این حال، CNN-ها و Dlib دقیقترین الگوریتمها هستند. HoG نیز عملکرد خوبی دارد، اما مشکلاتی در شناسایی چهرههای کوچک دارد. طبقهبندی HaarCascade نیز به خوبی HoG عمل میکند. اگر میخواهید تشخیص سریعی در ویدئوهای زنده خود داشته باشید پیشنهاد میکنیم از روش HoG استفاده کنید.
منبع: فرادرس
تحلیل شبکه های اجتماعی یکی از مباحث داغ روز است که در این مطلب به طور کامل به آن پرداخته خواهد شد. از زمان پیداش «شبکههای اجتماعی برخط» (Online Social Networks | OSN) تاکنون، جمعیت کاربران این شبکهها روز به روز افزایش مییابد. بر اساس آخرین گزارش «دیجیتال ۲۰۱۹» (Digital 2019) که توسط «هوتسوئیت» (Hootsuite) ارائه شده است (این گزارش ۲۲۱ صفحهای، چشماندازی دقیق از وضعیت استفاده از وب و به طور خاص شبکههای اجتماعی ارائه میکند)، در سال ۲۰۱۹، اینترنت از سراسر جهان ۴.۳۸۸ میلیارد کاربر (نفوذ ٪۵۷) دارد و نسبت به سال گذشته، رشد ٪۹.۱ داشته است. شایان توجه است که جمعیت کل جهان، ۷.۶۷۶ میلیارد نفر است.
همچنین، تعداد کاربران شبکههای اجتماعی در سال ۲۰۱۹ برابر با ۳.۴۸۴ میلیارد (نفوذ ٪۴۵) گزارش شده که نسبت به سال گذشته ٪۹ رشد داشته است. تعداد کاربران تلفن همراه در سال ۲۰۱۹، برابر با ۵.۱۱۲ میلیارد است که رشد ٪۲ نسبت به سال گذشته از خود نشان میدهد. در این میان، تعداد کاربران شبکههای اجتماعی موبایل، ۳.۲۵۶ میلیارد نفر (نفوذ ٪۴۲) است.

از سوی دیگر، مدت زمانی که افراد برای حضور در شبکههای اجتماعی صرف میکنند رشد قابل توجهی داشته و به نوعی میتوان گفت این روزها، شبکههای اجتماعی همیشه و همه جا همراه افراد هستند و بخش قابل توجهی از زندگی آنها را شامل میشوند. با توجه به همین آمار و ارقام و حجم محتوایی که هر روز افراد در شبکههای اجتماعی برخط تولید کرده و به اشتراک میگذارند، مبحثی جدید با عنوان تحلیل شبکه های اجتماعی شکل گرفته است.
در این مطلب، آموزش تحلیل شبکه های اجتماعی با R ارائه شده است. البته به منظور درک هر چه بهتر مطلب، ابتدا مفهوم شبکه اجتماعی و دلایل نیاز به تحلیل شبکه های اجتماعی بیان شده، فرصتهای شغلی این حوزه مورد بررسی قرار گرفته و سپس، به چگونگی انجام تحلیل شبکه های اجتماعی با R پرداخته شده است. در نهایت، منابع آموزشی مفید برای فراگیری کامل و تسلط بر این مبحث، ارائه شدهاند.
یک تعریف ساده و کوتاه قابل ارائه از شبکههای اجتماعی این است: «شبکه اجتماعی، ساختاری متشکل از افراد (یا سازمانها) است». به بیان جامعتر، شبکه اجتماعی ساختاری متشکل از بازیگران شبکه (افراد یا سازمانها) و روابط میان آنها است.
در واقع، یک شبکه اجتماعی را میتوان به صورت یک «گراف» (Graph) در نظر گرفت که در آن، بازیگران شبکه همان «گرههای» (Nodes) گراف و روابط میان آنها «یالهای» (Edges) گراف است. قدمت شبکههای اجتماعی به تشکیل اولین اجتماعات انسانی باز میگردد. یک خانواده، فامیل، سازمان و حتی مدرسه، به دید سنتی یک شبکه اجتماعی محسوب میشود. در واقع، انواع گوناگونی از روابط میتواند میان بازیگران یک شبکه اجتماعی برقرار باشد.

جنس جدیدی از شبکههای اجتماعی با ظهور وب ۲.۰ ایجاد شدند. «شبکههای اجتماعی برخط» (Online Social Networks)، نوعی از شبکههای اجتماعی مبتنی بر وب هستند. این شبکههای اجتماعی انواع گوناگونی دارند که میتوان به شبکههای اجتماعی به اشتراکگذاری ویدئو، صوت، متن و شبکههای اجتماعی ترکیبی که انواع محتوا را میتوان در آن به اشتراک گذاشت اشاره کرد.
هرچند، در حال حاضر اغلب شبکههای اجتماعی با وجود آنکه برای هدف خاصی طراحی شدهاند، معمولا امکان به اشتراکگذاری چند نوع محتوا را به طور همزمان به کاربر میدهند و هر بار در گذر زمان، از قابلیتهای جدیدی در این راستا، بهرهبرداری میکنند. از جمله معروفترین و محبوبترین شبکههای اجتماعی برخط، میتوان به «فیسبوک» (Facebook)، «یوتیوب» (YouTube)، واتساپ (WhatsApp)، «ویچت» (WeChat)، «اینستاگرام» (Instagram)، «توییتر» (Twitter) و «لینکدین» (Linkedin) اشاره کرد. نکته شایان توجه این است که در حال حاضر از عبارت شبکههای اجتماعی معمولا برای اشاره به شبکههای اجتماعی برخط استفاده میشود و کمتر پیش میآید که با بیان شبکه اجتماعی شکل سنتی آن مد نظر باشد.
همانطور که پیش از این اشاره شد، مفهوم شبکههای اجتماعی به اولین اجتماعات انسانی شکل گرفته توسط بشر باز میگردد و مفهوم کنونی شبکه اجتماعی که در واقع منظور از آن، شبکه اجتماعی برخط است، با ظهور وب ۲.۰ ایجاد شد. اولین رشتههای تحلیل اجتماعات انسانی نیز به تلاشهای جامعهشناسان اولیه مانند «گئورگ زیمل» (Georg Simmel) و «امیل دورکیم» (Émile Durkheim) مربوط میشود که مطالعات و آثار مکتوبی را پیرامون الگوهای روابطی که بازیگران شبکههای اجتماعی را به یکدیگر متصل میکند دارند. در سال ۱۹۳۰ بود که «جاکوب مورنو» (Jacob L. Moreno) و «هلن جنگینز» (Helen Jennings) روشهای تحلیلی پایهای را برای شبکههای اجتماعی معرفی کردند.
در ابتدای قرن بیستم، برخی از جامعهشناسان، از عبارت «شبکه اجتماعی» برای اشاره به روابط پیچیده بین اعضای اجتماعات انسانی در ابعاد شخصی و بین فردی گرفته تا بینالمللی استفاده کردند. در واقع میتوان گفت، «تحلیل شبکه های اجتماعی» (Online Social Network Analysis | OSNA | SNA)، استراتژی برای بررسی شبکههای اجتماعی است. تحلیل شبکههای اجتماعی به دو صورت «ساختاری» (Structural) و «رفتاری» (Behavioral) انجام میشود. در تحلیل ساختاری، گراف ساختاری یک شبکه اجتماعی (شامل گرهها و یالها) مورد بررسی قرار میگیرد.

در تحلیل رفتاری، رفتار کاربر در یک شبکه اجتماعی، شامل محتوایی که به اشتراک میگذارد، زمانهای فعالیت و برخی از دیگر موارد، مورد بررسی قرار میگیرد. یکی از وظایف اصلی که در تحلیل رفتاری شبکههای اجتماعی معمولا انجام میشود، «متنکاوی» (Text Mining)است. برای مثال، توییتهای ارسالی کاربران فارسی زبان در یک شبکه اجتماعی مانند توییتر، در یک بازه زمانی مشخص گردآوری میشوند و با استفاده از روشهای متنکاوی، «تحلیل احساسات» (Sentimental Analysis) که به آن عقیدهکاوی (Opinion Mining) یا تحلیل عواطف نیز گفته میشود، تحلیل عواطف کاربران در جهت تشخیص حسابهای کاربری که به «نفرت پراکنی» (Hate Speech)میپردازند انجام میشود (البته برخی از دانشمندان، تفاوتهای ظریفی بین تحلیل احساست و عقیدهکاوی بر میشمارند).
با توجه به آمارهای ارائه شده در ابتدای این مطلب، به خوبی مشهود است که جهان کنونی، جهانی متشکل از ساختارهای اجتماعی شکل گرفته در وب و در واقع دنیای شبکههای اجتماعی برخط است. افراد حاضر در شبکه، احساسات، عقاید، خواستهها، اخبار و مسائل گوناگون را به صورت آنی با یکدیگر به اشتراک میگذارند. این یعنی، یک بایگانی عظیم و به وسعت جهان از دادههای افراد گوناگون که با تحلیل آنها میتوان به دانشی فوقالعاده در راستای شناخت بشر و دنیای انسانی دست یافت. چنین شناختی میتواند در راستای اهداف گوناگون، از جمله موارد زیر مفید واقع شود.
نمونهای از قدرت تحلیل شبکههای اجتماعی و استفاده از دانش حاصل شده از آن جهت دستیابی به اهداف گوناگون را میتوان در ماجرای «کمبریج آنالیتیکا» (Cambridge Analytica) و فیس بوک و تاثیر به سزایی که گفته میشود در انتخابات آمریکا داشته است مشاهده کرد.
با توجه به نقش مهمی که شبکههای اجتماعی در تدوین استراتژیهای کسب و کارها در حال حاضر دارند، و تاثیر به سزایی که دانش حاصل از تحلیل شبکه های اجتماعی در حوزههای گوناگون داشته است، فرصتهای شغلی متعدد با درآمد خوب برای کارشناسان این حوزه وجود دارد. تحلیلگران شبکههای اجتماعی میتوانند تا حتی ۱۱۰,۰۰۰ دلار در سال حقوق دریافت کنند. انتظار میرود تعداد فرصتهای شغلی این حوزه با توجه به رشد روزافزون ضریب نفوذ شبکههای اجتماعی، افزایش پیدا کند.

همانطور که پیش تر بیان شد، تحلیل شبکه های اجتماعی به دو شکل ساختاری (بر اساس گراف شبکه) و رفتاری (محتوای به اشتراک گذاشته شده توسط کاربر و رفتار کاربر در شبکه مانند ساعات حضور و به اشتراکگذاری محتوا) انجام میشود. هر یک از این دو نوع تحلیل، اصول و روشهای خاص خود را دارند. برای مثال، در تحلیل ساختاری، نیاز به تسلط بر مباحث زیر وجود دارد:
در تحلیل رفتاری، یکی از مرسومترین راهکارها استفاده از محتوای متنی به اشتراک گذاشته شده توسط کاربر است. بدین معنا که برای مثال متن توییتها، پستهای فیسبوک و یا کپشنهای پستهای اینستاگرام را گردآوری و تحلیل میکنند. بدین منظور، کاربر نیاز به آشنایی با مفاهیم متنکاوی و ابزارهای آن دارد.
برای پیادهسازی تحلیل شبکه های اجتماعی میتوان از ابزارهای ویژه این حوزه استفاده کرد. از جمله این ابزارها، زبانهای برنامهنویسی R و «پایتون» (Python) هستند. R یک زبان محاسباتی قدرتمند است که در ابتدا به طور ویژه برای محاسبات آماری به کار میرفت. اما در گذر زمان و با توسعه «بستههای» (Packages) این زبان برای «علم داده» (Data Science)، «یادگیری ماشین» (Machine Learning) و به طور خاص «متنکاوی» (Text Mining) استفاده از این زبان برای انجام تحلیل شبکههای اجتماعی نیز رواج یافت. نمونهای از پروژههای تحلیل شبکه های اجتماعی با R را میتوان در مطلب «تحلیل احساسات در توییتر با زبان R — راهنمای کاربردی» و «تحلیل ترافیک شهری با استفاده از شبکههای اجتماعی و R — راهنمای کاربردی» مشاهده کرد.

تحلیل شبکههای اجتماعی به اشکال گوناگون و با اهداف متنوعی صورت میپذیرد. به منظور انجام تحلیل شبکه های اجتماعی، کاربر نیاز به آشنایی با مفاهیم این حوزه، مباحث دادهکاوی و متنکاوی و همچنین یک ابزار مانند زبان برنامهنویسی R دارد. به علاقهمندان یادگیری تحلیل شبکه های اجتماعی، مشاهده دوره آموزش ویدئویی آموزش تحلیل شبکه های اجتماعی با زبان R و متن کاوی که به زبان فارسی تهیه شده و مدت زمان آن ۷ ساعت و ۲۵ دقیقه است، توصیه میشود.
منبع: فرادرس
حلقهها در برنامهنویسی برای تکرار یک بلوک خاص از کد استفاده میشوند. در این مقاله با روش ایجاد حلقه while و do…while در ++C آشنا خواهیم شد. در برنامهنویسی رایانه، حلقه برای تکرار یک بلوک کد تا زمانی که شرط خاصی برقرار شود، مورد استفاده قرار میگیرد. در زبان برنامهنویسی ++C، سه نوع حلقه وجود دارند:
برای مطالعه قسمت قبلی این مجموعه مطلب آموزشی میتوانید به پست حلقه for در زبان برنامه نویسی ++C — به زبان ساده مراجعه کنید.
ساختار این حلقه به صورت زیر است:
که در آن testExpression روی هر مدخل حلقه while بررسی میشود.

Enter a positive integer: 4 Factorial of 4 = 24
در این برنامه از کاربر تقاضا میشود که یک عدد صحیح مثبت وارد کند که در متغیر number ذخیره میشود. فرض کنید کاربر مقدار 4 را وارد کند.
سپس حلقه while شروع به اجرای کد میکند. طرز کار حلقه while به صورت زیر است:
حلقه do…while نوع دیگری از حلقه while است که یک تفاوت مهم با آن دارد. بدنه حلقه do…while پیش از بررسی عبارت تست، یک بار اجرا خواهد شد.
ساختار حلقه do…while به صورت زیر است:

Enter a number: 2 Enter a number: 3 Enter a number: 4 Enter a number: -4 Enter a number: 2 Enter a number: 4.4 Enter a number: 2 Enter a number: 0
بدین ترتیب به پایان این بخش از آموزش مفاهیم زبان برنامهنویسی ++C میرسیم.
برای مطالعه قسمت بعدی این مجموعه مطلب آموزشی میتوانید روی لینک زیر کلیک کنید:
در این مقاله، به بررسی اهمیت هش کردن رمزهای عبور میپردازیم. نگاهی سریع به ماهیت آن خواهیم داشت و دلیل اهمیت آن را نیز توضیح میدهیم. همچنین برخی روشهای امن و ناامن برای اجرای هش کردن رمزهای عبور در جاوا را معرفی میکنیم.

هش کردن فرایندی است که در طی آن یک رشته یا Hash از یک پیام مفروض با استفاده از یک تابع ریاضی ساخته میشود. این تابع ریاضی به نام «تابع هش رمزشناختی» (Cryptographic Hash Function) نامیده میشود. با این که چند تابع هش هم اینک وجود دارند، اما توابعی که برای هش کردن رمزهای عبور طراحی شدهاند باید چهار مشخصه زیر را داشته باشند تا امن محسوب شوند:
یک تابع هش که هر چهار مشخصه فوق را داشته باشد، گزینه خوبی برای هش کردن رمزهای عبور است، زیرا مجموعه مشخصههای فوق موجب میشوند که مهندسی معکوس رمز عبور از روی هش دشوار باشد.
ضمناً، تابعهای هش کردن رمزهای عبور باید کُند باشند، چون الگوریتمهای سریع مستعد حملات brute force هستند که در طی آن مهاجمان تلاش میکنند یک رمز عبور را با هش کردن و مقایسه میلیاردها یا تریلیونها رمز عبور بالقوه در طی هر ثانیه حدس بزنند.
برخی تابعهای هش عالی که همه معیارهای فوق را دارند شامل PBKDF2 ،BCrypt و SCrypt هستند. اما ابتدا باید برخی الگوریتمهای قدیمیتر را بررسی کنیم تا ببینیم چرا استفاده از آنها دیگر توصیه نمیشود.
نخستین تابع هش که بررسی میکنیم، الگوریتم «چکیده پیام» (message-digest) به نام MD5 است که در سال 1992 توسعه یافته است. متد MessageDigest جاوا امکان محاسبه آن را ساده کرده است و هنوز در برخی موارد میتواند مفید باشد. با این وجود، در طی سالهای اخیر ثابت شده است که MD5 مشخصه چهارم هش کردن رمزهای عبور را که در بخش قبلی اشاره کردیم ندارد. چون از نظر محاسباتی تولید تصادم بسیار راحت است. علاوه بر آن MD5 یک الگوریتم سریع است و از این رو در برابر حملههای brute-force کارایی ندارد.
در این بخش نگاهی به SHA-512 خواهیم داشت که بخشی از خانواده الگوریتم هش امن است. این خانواده با معرفی SHA-0 در سال 1993 آغاز شده است.
از آنجا که توان رایانهها به صورت مداوم افزایش مییابد و هر روز آسیبپذیریهای جدید را کشف میکنیم، محققان نسخههای جدیدی از SHA را طراحی کردهاند. نسخههای جدیدتر به تدریج طول بیشتری دارند و در برخی موارد محققان نسخه جدید را بر مبنای الگوریتم قبلی منتشر میسازند.
SHA-512 طولانیترین کلید را در نسل سوم از الگوریتمهای هش دارد. با این که در حال حاضر نسخههای امنتری از SHA ارائه شدهاند، اما SHA-512 قویترین نسخهای است که در جاوا پیادهسازی شده است.
در این بخش به بررسی پیادهسازی الگوریتم هش کردن SHA-512 در جاوا میپردازیم. ابتدا باید مفهوم Salt را درک کنیم. Salt به بیان ساده یک دنباله تصادفی است که برای هر هش جدید تولید میشود.
با استفاده از این خصوصیت تصادفی بودن میزان آنتروپی هش بالا میرود و پایگاه داده خود را در برابر لیستهای از قبل تهیه شده از هشها که به نام «جداول رنگینکمان» (rainbow tables) شناخته میشوند مقاومتر میسازیم. تابع هش جدید ما به طور تقریبی به صورت زیر است:
برای استفاده از Salt از کلاس SecureRandom از java.security استفاده میکنیم:
سپس از کلاس MessageDigest برای پیکربندی تابع SHA-512 با Salt خود کمک میگیریم:
بدن ترتیب اینک میتوانیم از متد digest برای تولید رمز عبور هش شده جدید خود بهره بگیریم:
حتی زمانی که از Salt استفاده میکنیم، SHA-512 همچنان یک گزینه متوسط محسوب میشود، اما گزینههای قویتر و کُندتری نیز وجود دارند. ضمناً گزینههای دیگر که در ادامه بررسی خواهیم کرد، یک ویژگی مهم به نام «قدرت قابل پیکربندی» (Configurable Strength) دارند.
PBKDF2 ،BCrypt و SCrypt سه الگوریتم هش کردن هستند که استفاده از آنها توصیه میشود.
هر کدام از این الگوریتمها کند هستند و هر کدام یک ویژگی مشترک عالی به نام قدرت قابل پیکربندی دارند. این بدان معنی است که با افزایش توان محاسباتی رایانهها میتوانیم الگوریتم را از طریق تغییر دادن ورودیها کندتر کنیم.
اکنون Salt-ها مفهومی بنیادی در زمینه هش کردن رمزهای عبور محسوب میشوند و از این رو باید یکی از آنها را برای PBKDF2 نیز استفاده کنیم:
سپس یک PBEKeySpec و یک SecretKeyFactory ایجاد میکنیم که با استفاده از الگوریتم PBKDF2WithHmacSHA1 وهلهسازی میشوند:
پارامتر سوم (65536) به طرز مؤثری پارامتر قدرت است. این پارامتر تعیین میکند که این الگوریتم برای چند بار تکرار خواهد شد و بدین ترتیب زمان مورد نیاز برای تولید هش افزایش مییابد. در نهایت میتوانیم از SecretKeyFactory برای تولید هش استفاده کنیم:
تا به این جا مشخص شد که BCrypt و SCrypt هنوز در جاوا پشتیبانی نمیشوند؛ اما برخی کتابخانههای جاوا از آنها پشتیبانی میکنند. یکی از این کتابخانهها Spring Security نام دارد.
با این که جاوا به صورت بومی از هر دو الگوریتم هش کردن PBKDF2 و SHA پشتیبانی میکند، اما الگوریتمهای BCrypt و SCrypt همچنان پشتیبانی نمیشوند.
خوشبختانه کتابخانه Spring Security از طریق اینترفیس PasswordEncoder از هر سه این الگوریتمهای توصیه شده پشتیبانی میکند، بنابراین:
انکودرهای رمز عبور برای PBKDF2 ،BCrypt و SCrypt همگی از پیکربندی قدرت مطلوب هش رمز عبور پشتیبانی میکنند. حتی بدون وجود یک اپلیکیشن مبتنی بر Spring Security میتوان از این انکودرها به صورت مستقیم استفاده کرد. همچنین اگر از سایت خود با استفاده از Spring Security حفاظت میکنید در این صورت میتوانید انکودر رمز عبور مطلوب خود را از طریق DSL آن یا از طریق تزریق وابستگی پیکربندی کنید.
برخلاف مثالهای قبلی که مطرح شدند، این الگوریتمها Salt را برای ما به صورت داخلی تولید میکنند. الگوریتم Salt را درون هش خروجی برای استفادههای بعدی در زمان اعتبارسنجی رمز عبور ذخیره میکند.
بدین ترتیب در این مطلب بررسی نسبتاً عمیقی در مورد روشهای هش کردن رمز عبور داشتیم و به کاوش مفاهیم و کاربردهای آنها پرداختیم. همچنین نگاهی به برخی تابعهای قدیمی هش کردن داشتیم و برخی انواع که هم اینک پیادهسازی شدهاند را پیش از کدنویسی در جاوا بررسی کردیم. در نهایت دیدیم که کتابخانه Spring Security با کلاسهای رمزنگاری خاص خود، طیفی از تابعهای هش کردن مختلف را در جاوا پشتیبانی میکند.
منبع: فرادرس