ʜᴇʀᴏ ᴇxᴘᴇʀᴛ | کارشناس قهرمان – Telegram
ʜᴇʀᴏ ᴇxᴘᴇʀᴛ | کارشناس قهرمان
8.52K subscribers
229 photos
6 videos
7 files
237 links
🏅تبلیغات 👈🏻 @ExpertsAds
Download Telegram
⭐️ الگوی طراحی بیلدر [Builder] چیست؟

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

مزایای الگوی طراحی بیلدر

کد تمیزتر
خوانایی بالا
انعطاف‌پذیری بالا
کاهش پیچیدگی کد

🟡 مثال عملی الگوی طراحی بیلدر

⚫️ مثال عملی با زبان Go
🟠 مثال عملی با زبان Php
🟩 مثال عملی با زبان Python


📱 @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
2
👩‍💻 تکه‌ کد اعتبارسنجی لینک [Url]
⚠️ این تکه کد به زبان 🎲 نوشته شده است

function isValidUrl(url) {
url = decodeURIComponent(url);

try {
const parsedUrl = new URL(url);
if (url.length >= 2048) {
return false;
}
} catch (e) {
return false;
}

if (/\.\.\//.test(url)) {
return false;
}

if (url.toLowerCase().includes('javanoscript:') || url.toLowerCase().includes('<noscript>')) {
return false;
}

const parsedUrl = new URL(url);
if (parsedUrl.hostname && !parsedUrl.hostname.includes('.')) {
return false;
}

return true;
}

// Example
console.log(isValidUrl('https://hero')); // Output: false
console.log(isValidUrl('https://hero.ac')); // Output: true


✈️ @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤩 پایگاه داده ردیس [Redis] چیست؟

ردیس یک پایگاه داده بسیار سریع، ساده و متن باز است که داده‌ها را به جای هارد در حافظه ذخیره می‌کند. به دلیل سرعت و عملکرد فوق‌العاده بالا در ذخیره‌ سازی و بازیابی داده‌ ها بیشتر برای کارهایی مثل ذخیره‌ سازی موقت [Cache]، مدیریت صف‌ها [Queues] و نگهداری اطلاعات کوتاه‌ مدت در برنامه‌ ها استفاده می‌شود. این پایگاه داده از انواع مختلف داده‌ ها مثل متن، لیست، هش ها، استریم‌ ها و جداول پشتیبانی می‌کند، به‌ همین خاطر در بسیاری از برنامه‌ های آنلاین و بلادرنگ استفاده می‌شود.

⭐️ مزایای ردیس [Redis]

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


🆔 @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
👩‍💻 تکه‌ کد اتصال به پایگاه داده MySql
⚠️این تکه‌ کد برای اتصال به MySql می‌باشد
⚠️این تکه کد به زبان ⚫️ نوشته شده است

package main

import (
"fmt"
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)

func main() {
dataBase := map[string]string{
"name": "HeroExpert", // DbName
"userName": "root", //DbUserName
"passWord": "HeRo", // DbPassword
}

dsn := fmt.Sprintf("%s:%s@tcp(localhost:3306)/%s?charset=utf8mb4&parseTime=True&loc=Local",
dataBase["userName"], dataBase["passWord"], dataBase["name"])

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("Connection Failed: %v", err)
}

fmt.Println("Connecting Successfully")

sqlDB, err := db.DB()
if err != nil {
log.Fatalf("Failed to get database instance: %v", err)
}
defer sqlDB.Close()

fmt.Println("Connection closed.")
}


✈️ @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤩 معماری سرویس‌گرا [SOA] چیست؟

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

🌟 کاربرد های معماری سرویس‌گرا [SOA]

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


⚡️ @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
👩‍💻 تکه کد بررسی قدرت و کیفیت رمزعبور
⚠️ این تکه کد به زبان 🎲 نوشته شده است.

function passStrength(password) {
let hero = 0;
const size = password.length;
const charCount = {};

for (let char of password) {
charCount[char] = (charCount[char] || 0) + 1;
}

for (let char in charCount) {
const p = charCount[char] / size;
hero -= p * (Math.log(p) / Math.log(2));
}

let strength = (hero / 3.2) * 100;
if (strength > 100) {
strength = 100;
}

if (password.length < 8) {
return "رمزعبور حداقل باید 8 کاراکتر باشد";
}
if (!/[0-9]/.test(password)) {
return "حداقل باید یک عدد داخل رمزعبور باشد";
}
if (!/[A-Z]/.test(password)) {
return "حداقل باید یک حرف انگلیسی بزرگ داخل رمزعبور باشد";
}
if (!/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password)) {
return "حداقل باید یک کاراکتر خاص داخل رمزعبور باشد";
}

return `${strength.toFixed(0)} : قدرت رمزعبور`;
}

// Output = 99 : قدرت رمزعبور
console.log(passStrength('[s1P}a*lG'));


✈️ @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🔺 فریم‌ورک ناکست جِی‌اِس[Nuxt.js] چیست؟

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

ویژگی‌های ناکست جِی‌اِس [Nuxt.js]

توسعه سریع و ساده
ساختار منظم برای مدیریت صفحات
پشتیبانی از SSR و SSG برای بهبود سئو
اکوسیستم ویو‌ جِی‌اِس قوی و انعطاف‌پذیر
سیستم لایه‌ها و میدلورها برای توسعه‌حرفه‌ای


🔗 @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
الگوی طراحی استیت [State] چیست؟

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

مزایای الگوی طراحی استیت[State]

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

🔄 مثال عملی الگوی طراحی استیت[State]

⚫️ مثال عملی با زبان Go
🟠 مثال عملی با زبان PHP
🟩 مثال عملی با زبان Python


✈️ @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
👩‍💻 تکه کد ریدایرکت [Redirect] کاربر
⚠️ این تکه کد به زبان 🟩 نوشته شده است.

import sys
import html

def redirect(url, headers_sent=False):
    """Redirects to the given URL using HTTP headers if possible, otherwise falls back to JavaScript and meta refresh."""
   
    if sys.stdout.isatty():
        sys.exit(0)

    safe_url = html.escape(url)
   
    if not headers_sent:
        print("Content-Type: text/html")
        print(f"Status: 302 Found")
        print(f"Location: {safe_url}")
        print()
    else:
        print(f"""
        <noscript>window.location.replace('{safe_url}');</noscript>
        <nonoscript><meta http-equiv='refresh' content='0;url={safe_url}'/></nonoscript>
        """, end="")

    sys.exit(0)

if name == "main":
    redirect("https://aparat.com", headers_sent=False)


🔮 @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤩 زبان برنامه‌نویسی جولیا[Julia] چیست؟

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

🔝 مزایای جولیا [Julia]

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


🔮 @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🚩 افزونه Next.js برای VsCode

🔢 افزونه Next.js Snippets
⬇️ تعداد نصب 313 هزار
🔢 افزونه Path Intellisense
⬇️ تعداد نصب 15 میلیون
🔢 افزونه Live Server
⬇️ تعداد نصب 59 میلیون
🔢 افزونه Next.js
⬇️ تعداد نصب 100 هزار
🔢 افزونه ESLint
⬇️ تعداد نصب 40 میلیون

✉️ @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 تکه کد هش و اعتبارسنجی رمزعبور
⚠️ این تکه کد به زبان 🎲 نوشته شده است.

# Create Hash Password
function hashPassword($password) {
$salt = base64_encode(random_bytes(16));
$hashedPassword = password_hash($password . $salt, PASSWORD_ARGON2ID, ['memory_cost' => 65536, 'time_cost' => 4, 'threads' => 2]);
return $salt . ":" . $hashedPassword;
}

# Verify Hash Password
function verifyPassword($password, $storedHash) {
list($salt, $hashedPassword) = explode(":", $storedHash, 2);
return password_verify($password . $salt, $hashedPassword);
}

# Example
$password = "MySecurePassword"; $hashed = hashPassword($password); var_dump(verifyPassword($password, $hashed)); # OutPut : true
var_dump(verifyPassword("WrongPassword",$hashed)); # OutPut : false


⚡️ @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
2
🤩 معماری اِم‌ وی سی [MVC] چیست؟

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

🔝 ویژگی های معماری اِم‌ وی سی [MVC]

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


🌐 @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤩 فریم‌ورک ییی [Yii] چیست؟

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

⭐️ ویژگی‌های فریم‌ورک ییی [Yii]

⭐️ کدنویسی سریع و بهینه
⭐️ امنیت بالا و ضد حملات رایج
⭐️ ساختار ماژولار و مقیاس‌ پذیر
⭐️ پشتیبانی از چندین پایگاه داده


📱 @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
👩‍💻 تکه کد هش و اعتبارسنجی رمزعبور
⚠️ این تکه کد به زبان 🟩 نوشته شده است.

import base64
import os
import hashlib
import hmac

def hash_password(password: str) -> str:
salt = base64.b64encode(os.urandom(16)).decode()
hashed_password = hashlib.pbkdf2_hmac('sha256', password.encode(), salt.encode(), 100_000).hex()
return f"{salt}:{hashed_password}"

def verify_password(password: str, stored_hash: str) -> bool:
salt, hashed_password = stored_hash.split(":", 1)
computed_hash = hashlib.pbkdf2_hmac('sha256', password.encode(), salt.encode(), 100_000).hex()
return hmac.compare_digest(computed_hash, hashed_password)

# Example
password = "MySecurePassword"
hashed = hash_password(password)

print(verify_password(password, hashed))
# Output: True
print(verify_password("WrongPassword", hashed))
# Output: False


⚡️ @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🎲 موتور ذخیره‌ سازی پایگاه داده چیست؟

موتور ذخیره‌ سازی [StorageEngine] بخشی از سیستم مدیریت پایگاه داده است که نحوه ذخیره‌سازی، بازیابی و مدیریت داده‌ ها را در جداول مشخص می‌کند. هر پایگاه داده ممکن است از موتور های مختلفی پشتیبانی کند که هر کدام ویژگی‌ های خاص خود را دارند.

وظایف موتور ذخیره‌ سازی

کنترل خواندن و نوشتن
مدیریت ذخیره‌ سازی داده‌ها
بهینه‌ سازی عملکرد پایگاه داده
پشتیبانی از تراکنش‌ها و ایندکس‌ها

⚙️ انواع موتور های ذخیره‌ سازی رایج

🔹 موتور ذخیره‌ سازی CSV
🔹 موتور ذخیره سازی InnoDB
🔹 موتور ذخیره‌ سازی MyISAM
🔹 موتور ذخیره‌ سازی ARCHIVE
🔹 موتور ذخیره‌ سازی MEMORY


✉️ @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤩 معماری اِن-تایر [N-Tier] چیست؟

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

🔵 ویژگی های معماری اِن-تایر [N-Tier]

🔹 بهبود امنیت با جداسازی لایه‌ ها
🔹 استفاده در فریم‌ورک‌ های مدرن
🔹 تسهیل تست و نگهداری نرم‌افزار
🔹 بهبود مقیاس‌ پذیری برای داده‌های حجیم


✉️ @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤩 فرایند سی‌ای/سی‌دی [CI/CD] چیست؟

فرایند سی‌ای[CI] یا ادغام مداوم به فرایند یکپارچه‌ سازی تغییرات کد در یک مخزن مشترک به‌صورت مداوم اطلاق می‌شود. به این معنا که برنامه‌نویسان کد های خود را به‌طور منظم به مخزن پروژه مثل گیت‌هاب یا گیت‌لب اضافه می‌کنند. پس از هر تغییر، سیستم به‌طور خودکار تست‌ هایی را انجام می‌دهد تا مطمئن شود کد جدید مشکلی ایجاد نمی‌کند و با سایر بخش‌های سیستم سازگار است.
فرایند سی‌دی[CD] یا استقرار مداوم به فرایند انتشار خودکار کد هایی که تایید شده‌اند به محیط تولید اطلاق می‌شود. این فرایند به توسعه‌ دهندگان این امکان را می‌دهد که تغییرات جدید را به‌طور خودکار و بدون نیاز به مداخله دستی، به سرور های تولید منتقل کنند.

🔝 ویژگی‌ های سی‌ای/سی‌دی [CI/CD]

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


🌐 @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
👩‍💻 تکه کد هش و اعتبارسنجی رمزعبور
⚠️ این تکه کد به زبان ⚫️ نوشته شده است.

package main

import (
"crypto/sha256"
"encoding/hex"
"fmt"
"strings"
)

// HashPassword generates
func HashPassword(password string) string {
hash := sha256.New()
hash.Write([]byte(password))
hashedPassword := hash.Sum(nil)

return hex.EncodeToString(hashedPassword)
}

// VerifyPassword compares
func VerifyPassword(password, storedHash string) bool {
hash := sha256.New()
hash.Write([]byte(password))
hashedPassword := hash.Sum(nil)

return storedHash == hex.EncodeToString(hashedPassword)
}

// Example
func main() {
password := "MySecurePassword"
hashed := HashPassword(password)

fmt.Printf("Password valid: %v\n", VerifyPassword(password, hashed)) // Output: true

fmt.Printf("Password valid: %v\n", VerifyPassword("WrongPassword", hashed)) // Output: false
}


⚡️ @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🤩 پلتفرم سرکل‌سی‌آی [CircleCI] چیست؟

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

🔝 ویژگی‌های سرکل‌سی‌آی [CircleCI]

🔴 سرعت بالا در اجرا
🔴 اتوماتیک‌ سازی فرایند ها
🔴 پشتیبانی از کانتینر ها و داکر
🔴 یکپارچگی آسان با گیت‌هاب و گیت‌لب
🔴 پشتیبانی از چندین زبان برنامه‌ نویسی
🔴 مقیاس‌ پذیری بالا برای پروژه‌ های بزرگ


✈️ @HeroExpert_ir | کارشناس تکنولوژی
Please open Telegram to view this post
VIEW IN TELEGRAM
1