❓رفقا فرض کنید یه آبجکت از StringBuilder داریم با یه دنباله کاراکتری خیلی بلند
StringBuilder sb = new StringBuilder("Very Long long long String.... );
حالا برای تبدیل رشته به آرایه ای از کاراکتر ها آیا بصورت زیر بنویسیم بهینه تره
char charArray = stringbuilder.toString().toCharArray()
یا بصورت زیر؟
char[] charArray = new char[stringbuilder.length()];
stringbuilder.getChars(0, stringbuilder.length(), charArray, 0);
👈دلیلتون رو هم توی کامنت ها بنویسید :)
StringBuilder sb = new StringBuilder("Very Long long long String.... );
حالا برای تبدیل رشته به آرایه ای از کاراکتر ها آیا بصورت زیر بنویسیم بهینه تره
char charArray = stringbuilder.toString().toCharArray()
یا بصورت زیر؟
char[] charArray = new char[stringbuilder.length()];
stringbuilder.getChars(0, stringbuilder.length(), charArray, 0);
👈دلیلتون رو هم توی کامنت ها بنویسید :)
❤8
تیکه پاره های جاوا
❓رفقا فرض کنید یه آبجکت از StringBuilder داریم با یه دنباله کاراکتری خیلی بلند StringBuilder sb = new StringBuilder("Very Long long long String.... ); حالا برای تبدیل رشته به آرایه ای از کاراکتر ها آیا بصورت زیر بنویسیم بهینه تره char charArray = stringbu…
خب احتمالا تا الان به نتیجه رسیده باشید (قطعا رسیدید، 1 ماه گذشته و قرار ندادن پاسخ از کم کاری بنده بوده🙈)
👈راه اول در اصل دوبار کاری هستش. یعنی ما دنباله ی کاراکتری را به رشته و سپس از طریق رشته به آرایه ای از کاراکتر ها تبدیل میکنیم و همین دوبار حافظه را اشغال میکند!
👈 اما راه دوم مستقیم از متد getChars کاراکتر ها را از stringBuilder دریافت و در ارایه charArray ذخیره میکند
👈راه اول در اصل دوبار کاری هستش. یعنی ما دنباله ی کاراکتری را به رشته و سپس از طریق رشته به آرایه ای از کاراکتر ها تبدیل میکنیم و همین دوبار حافظه را اشغال میکند!
👈 اما راه دوم مستقیم از متد getChars کاراکتر ها را از stringBuilder دریافت و در ارایه charArray ذخیره میکند
❤7👍1
#معرفی_سایت
#پیشنهاد
یه ریپازیتوری خیلی باحال داخل گیتهاب وجود داره و بهتون نشون میده که چطوری تکنولوژی های معروفی که ازشون استفاده میکنید رو خودتون از صفر بنویسید :) مثلا گیت، داکر، دیتابیس و...
https://github.com/codecrafters-io/build-your-own-x
#پیشنهاد
یه ریپازیتوری خیلی باحال داخل گیتهاب وجود داره و بهتون نشون میده که چطوری تکنولوژی های معروفی که ازشون استفاده میکنید رو خودتون از صفر بنویسید :) مثلا گیت، داکر، دیتابیس و...
https://github.com/codecrafters-io/build-your-own-x
GitHub
GitHub - codecrafters-io/build-your-own-x: Master programming by recreating your favorite technologies from scratch.
Master programming by recreating your favorite technologies from scratch. - codecrafters-io/build-your-own-x
❤7👍2
💠 جاوابین (JavaBean)
در جاوا JavaBean در حقیقت قرار دادی است که مشخص میکند در هر کلاسی باید:
1. تمامی فیلد ها باید پرایوت باشد (دسترسی فقط از طریق setter/getter)
2. دارای یک کنستراکتور بدون آرگومان باشد (default constructor)
3. قابل سریال سازی باشد (Serializable). یعنی آبجکت های این کلاس میتوانند مستقیما در داخل استریم ها، فایل ها، دیتابیس و ... نوشته شوند.
🔆 یک نمونه از کلاسی که از چارچوب javaBean پیروی میکند:
در واقع JavaBean قراردادیست که کتابخانه های زیادی بر پایه ی آن پیاده سازی شده اند.
@java
در جاوا JavaBean در حقیقت قرار دادی است که مشخص میکند در هر کلاسی باید:
1. تمامی فیلد ها باید پرایوت باشد (دسترسی فقط از طریق setter/getter)
2. دارای یک کنستراکتور بدون آرگومان باشد (default constructor)
3. قابل سریال سازی باشد (Serializable). یعنی آبجکت های این کلاس میتوانند مستقیما در داخل استریم ها، فایل ها، دیتابیس و ... نوشته شوند.
🔆 یک نمونه از کلاسی که از چارچوب javaBean پیروی میکند:
public class User implements java.io.Serializable {
// Properties.
private Long id;
private String name;
private Date birthdate;
// Getters.
public Long getId() { return id; }
public String getName() { return name; }
public Date getBirthdate() { return birthdate; }
// Setters.
public void setId(Long id) { this.id = id; }
public void setName(String name) { this.name = name; }
public void setBirthdate(Date birthdate) { this.birthdate = birthdate; }
// Important java.lang.Object overrides.
public boolean equals(Object other) {
return (other instanceof User) && (id != null) ?
id.equals(((User) other).id) : (other == this);
}
public int hashCode() {
return (id != null) ? (getClass().hashCode() +
id.hashCode()) : super.hashCode();
}
public String toString() {
return String.format("User[id=%d,name=%s,birthdate=%d]"
, id, name, birthdate);
}
}در واقع JavaBean قراردادیست که کتابخانه های زیادی بر پایه ی آن پیاده سازی شده اند.
@java
👍10🔥2
#معرفی_سایت
#پیشنهاد
بازم یه ریپازیتوری خیییلی کاربردی که اکثر الگوریتم های معروف رو به زبون های مختلف بازنویسی کردن( الی الخصوص جاوا / جاوا اسکریپت / سی و... ). پیشنهاد میکنم حتما بهش سر بزنین :) هر الگوریتمی بخواین اینجا هست
🔗 لینک
@Java
#پیشنهاد
بازم یه ریپازیتوری خیییلی کاربردی که اکثر الگوریتم های معروف رو به زبون های مختلف بازنویسی کردن( الی الخصوص جاوا / جاوا اسکریپت / سی و... ). پیشنهاد میکنم حتما بهش سر بزنین :) هر الگوریتمی بخواین اینجا هست
🔗 لینک
@Java
👍5❤3🔥1
#معرفی_کتاب
#دیزاین_پترن
احتمالا تا الان چند باری اصطلاح دیزاین پترن به گوشتون خورده باشه. همونطور که میدونید دیزاین پترن ها مجموعه ای از الگو ها و تکنیک های توسعه ان که برای حل یکسری مسائل رایج در طراحی نرم افزار به کار گرفته میشن.
اما یکی از بهترین کتاب هایی که در یادگیری الگو های طراحی بشدت میتونه موثر باشه کتاب Dive Into DESIGN PATTERNS هستش.
توی کتاب 22 تا از معروف ترین الگو های طراحی بررسی شده + 8 اصل مهم که الگو ها بر پایه ی اونها نوشته شدن.
وجه تمایزش هم با مابقی کتاب ها، شیوه ی آموزشش هست. به اینصورت که برای هر الگوی طراحی چندین مورد بررسی شده:
⭕️ قیمت توی مارکت ها مابین 250 تا 300
✅ قیمت 215ت میتونین ازمون دریافت کنین😍
برای سفارش: @MRVJ475
#دیزاین_پترن
احتمالا تا الان چند باری اصطلاح دیزاین پترن به گوشتون خورده باشه. همونطور که میدونید دیزاین پترن ها مجموعه ای از الگو ها و تکنیک های توسعه ان که برای حل یکسری مسائل رایج در طراحی نرم افزار به کار گرفته میشن.
اما یکی از بهترین کتاب هایی که در یادگیری الگو های طراحی بشدت میتونه موثر باشه کتاب Dive Into DESIGN PATTERNS هستش.
توی کتاب 22 تا از معروف ترین الگو های طراحی بررسی شده + 8 اصل مهم که الگو ها بر پایه ی اونها نوشته شدن.
وجه تمایزش هم با مابقی کتاب ها، شیوه ی آموزشش هست. به اینصورت که برای هر الگوی طراحی چندین مورد بررسی شده:
کجا مشکل به وجود میاد؟
الگوی راه حل چیه؟
ساختار الگو به چه صورته؟
چه زمانی از الگو استفاد کنیم؟
توی دنیای حقیقی مشکل به چه صورت ظاهر میشه؟
مزایا و معایب استفاده از این الگو...
⭕️ قیمت توی مارکت ها مابین 250 تا 300
✅ قیمت 215ت میتونین ازمون دریافت کنین😍
برای سفارش: @MRVJ475
👍2❤1
تیکه پاره های جاوا
#معرفی_کتاب #دیزاین_پترن احتمالا تا الان چند باری اصطلاح دیزاین پترن به گوشتون خورده باشه. همونطور که میدونید دیزاین پترن ها مجموعه ای از الگو ها و تکنیک های توسعه ان که برای حل یکسری مسائل رایج در طراحی نرم افزار به کار گرفته میشن. اما یکی از بهترین کتاب…
Telegraph
الگوی طراحی Observer
آبزرور یکی از دیزاین پترن های رفتاریست که به شما اجازه ی تعریف یک مکانیزم اشتراکی را میدهد که به کمک آن میتوانید چندین آبجکت را از یک رویداد در حال رخ دادن مطلع سازید. ☹️ مسئله: فرض کنید دو نوع آبجکت از Customer و Store داریم. حالا از آنجا که مشتری به محصولات…
👍4❤1🔥1
تیکه پاره های جاوا
خروجی کد بالا چیست؟
💬 پاسخ کامل:
احتمالا شما هم انتظار خروجی دیگری رو داشتید اما نتیجه ی اجرای برنامه ی بالا، خطای کمپایل خواهد بود.😊
در واقع سینتکس جاوا به شما اجازه ی تعریف و مقدار دهی یک متغیر محلی در یک ایف / فور / وایل/ دو وایل تک استیتمنتی(تک دستوری) رو نمیده و یک متغیر محلی زمانی بعنوان استیتمنت ظاهر میشه که داخل بلاک کد { } قرار گرفته باشه. پس اگه فور بالا بصورت زیر نوشته بودیم، برنامه خروجی 100 رو داشت:
for(int i = 0;i<100;i++){
Creature creature = new Creature();
}
و یا ازونجا که برناممون قرار نیست از متغیر creature استفاده کنه، میتونستیم بصورت زیر هم بنویسیم:
for(int i = 0;i<100;i++)
new Creature();
@PieceJava
احتمالا شما هم انتظار خروجی دیگری رو داشتید اما نتیجه ی اجرای برنامه ی بالا، خطای کمپایل خواهد بود.😊
در واقع سینتکس جاوا به شما اجازه ی تعریف و مقدار دهی یک متغیر محلی در یک ایف / فور / وایل/ دو وایل تک استیتمنتی(تک دستوری) رو نمیده و یک متغیر محلی زمانی بعنوان استیتمنت ظاهر میشه که داخل بلاک کد { } قرار گرفته باشه. پس اگه فور بالا بصورت زیر نوشته بودیم، برنامه خروجی 100 رو داشت:
for(int i = 0;i<100;i++){
Creature creature = new Creature();
}
و یا ازونجا که برناممون قرار نیست از متغیر creature استفاده کنه، میتونستیم بصورت زیر هم بنویسیم:
for(int i = 0;i<100;i++)
new Creature();
@PieceJava
👍10❤2
💠 استفاده از _ برای جداسازی ارقام در کد
از بعد جاوای 7، برای جداسازی و افزایش خوانایی ارقام بزرگ در جاوا، میتوانید از _ استفاده کنید. مثلا فرض کنید برای ذخیره شماره کارت که باید 4 رقم 4 رقم برای خوانایی بهتر جداسازی شود. برای مثال:
در اصل وجود _ هیچ تاثیری در خروجی کد نخواهد داشت و فقط جنبه ی خوانایی دارد.
البته به یاد داشته باشید که در حالت های زیر، قرار دادن _ خطای کمپایل به همراه خواهد داشت:
1. قرار دادن _ در پایان یا شروع داده:
2. قرار دادن _ در مجاورت نقطه ی اعشار:
3. قبل یا بعد از حروف پسوندی F یا L که بترتیب برای مشخص کردن داده های اعشاری و لانگ به کار گرفته میشوند:
4. در جاهایی که از رشته ای از ارقام استفاده میکنید. برای مثال کد زیر خطای رانتایم دارد:
————
〽️ @PieceJava
از بعد جاوای 7، برای جداسازی و افزایش خوانایی ارقام بزرگ در جاوا، میتوانید از _ استفاده کنید. مثلا فرض کنید برای ذخیره شماره کارت که باید 4 رقم 4 رقم برای خوانایی بهتر جداسازی شود. برای مثال:
long x = 1_2_13_213_131L;
long population = 8_078_598_555L;
double db = 1_2_3.4_5_6;
int x4 = 5_______2;
در اصل وجود _ هیچ تاثیری در خروجی کد نخواهد داشت و فقط جنبه ی خوانایی دارد.
البته به یاد داشته باشید که در حالت های زیر، قرار دادن _ خطای کمپایل به همراه خواهد داشت:
1. قرار دادن _ در پایان یا شروع داده:
int x = _1;
2. قرار دادن _ در مجاورت نقطه ی اعشار:
```java
double d1 = 12_.2;
double d2 = 13._4;
3. قبل یا بعد از حروف پسوندی F یا L که بترتیب برای مشخص کردن داده های اعشاری و لانگ به کار گرفته میشوند:
long socialSecurityNumber1 = 999_99_9999_L;
4. در جاهایی که از رشته ای از ارقام استفاده میکنید. برای مثال کد زیر خطای رانتایم دارد:
int x = Integer.parseInt("23_34");————
〽️ @PieceJava
🔥9❤3
💠 نمونه ای از کاربرد های اینترفیس
🕘 زمان مطالعه: 2:00
🔆 در این مثال میخواهیم به کمک اینترفیس به بخشی از داده های یک کلاس داخلی دسترسی پیدا کنیم.
🔅 فرض کنید کلاس داخلی به نام Node را تعریف کرده اید:
💬لیست پیوندی (LinkedList) ساختمان داده ایست که در آن داده ها در قالب یک Node ذخیره و از طریق آدرس گره بعدی خود به همدیگر لینک میشوند. در واقع هر Node حامل داده و آدرس گره بعدی خودش است.
در مثال بالا هیچ لزومی ندارد که کاربر به محتویات کلاس Node دسترسی پیدا کند. برای همین کلاس Node را پرایوت میکنیم.
اما از طرفی فرض کنید که میخواهیم به کاربر اجازه ی دسترسی به خود داده ی ذخیره شده را صادر کنیم. (یعنی فقط به داده و نه چیز دیگری از این کلاس).
در این حالت از اینترفیس استفاده میکنیم. مثلا اینترفیس زیر را ایجاد میکنیم:
حالا برای کلاس داخلی Node اینترفیس Position را پیاده سازی میکنیم و از طریق متد getElement اجازه ی دسترسی به داده را صادر میکنیم:
در متد getFirst خروجی متد را از جنس Position<E> قرار داده ایم. این در واقع باعث میشود که کاربر به Node در قالب یک Position<E> دسترسی داشته باشد و همین باعث محدود شدن دسترسی اش به متد های اینترفیس Position خواهد شد. بنابراین از آنجا که Position فقط یک متد getElement را دارد، کاربر بجز به متد getElement، به هیچ داده ی دیگری از کلاس Node دسترسی نخواهد داشت.
👈 نکته ی 1: البته فکر میکنم شما به این موضوع واقف باشید که چه لزومی به پیاده سازی Position<E> داریم وقتی که میتوانیم بگوییم:
در حقیقت هدف محدود سازی دسترسی به کلاس داخلی بود و هر کجا که نیاز باشد به بخشی از کلاس داخلی اجازه ی دسترسی صادر کنید، میتوانید از اینترفیس استفاده کنید.
مثلا سناریویی را در نظر بگیرید که یک کلاس داخلی چندین نوع داده را نگهداری میکند. حالا میتوان با پیاده سازی اینترفیس ها در کلاس داخلی مشخص کرد که از طریق کلاس خارجی، به چه بخشی از داده های کلاس میتوان دسترسی پیدا کرد.
👈 نکته ی 2: مثال بالا از کتاب ساختمان داده ی Michael. T goodrich هستش. میتوانید از همین کتاب، صفحه ی 271، فصل 7، مبحث Positional Lists، این مثال رو بیشتر و دقیق تر بررسی کنید. در واقع از Position<E> برای پیاده سازی یک حالت خاص از پیمایش داده های لینکدلیست به کار گرفته میشود
#interface
———
@PieceJava
🕘 زمان مطالعه: 2:00
🔆 در این مثال میخواهیم به کمک اینترفیس به بخشی از داده های یک کلاس داخلی دسترسی پیدا کنیم.
🔅 فرض کنید کلاس داخلی به نام Node را تعریف کرده اید:
public class LinkedList<E>{
private class Node<E>{
...
}
...
}💬لیست پیوندی (LinkedList) ساختمان داده ایست که در آن داده ها در قالب یک Node ذخیره و از طریق آدرس گره بعدی خود به همدیگر لینک میشوند. در واقع هر Node حامل داده و آدرس گره بعدی خودش است.
در مثال بالا هیچ لزومی ندارد که کاربر به محتویات کلاس Node دسترسی پیدا کند. برای همین کلاس Node را پرایوت میکنیم.
اما از طرفی فرض کنید که میخواهیم به کاربر اجازه ی دسترسی به خود داده ی ذخیره شده را صادر کنیم. (یعنی فقط به داده و نه چیز دیگری از این کلاس).
در این حالت از اینترفیس استفاده میکنیم. مثلا اینترفیس زیر را ایجاد میکنیم:
public interface Position<E>{
E getElement();
}حالا برای کلاس داخلی Node اینترفیس Position را پیاده سازی میکنیم و از طریق متد getElement اجازه ی دسترسی به داده را صادر میکنیم:
public class LinkedList<E>{
private class Node<E> implements Position<E>{
E data;
Node next;
...
...
@Override
public E getElement(){
return data;
}
...
...
}
private Node<E> head;
private Node<E> tail;
...
...
public Position<E> getFirst(){
return head;
}
...
}در متد getFirst خروجی متد را از جنس Position<E> قرار داده ایم. این در واقع باعث میشود که کاربر به Node در قالب یک Position<E> دسترسی داشته باشد و همین باعث محدود شدن دسترسی اش به متد های اینترفیس Position خواهد شد. بنابراین از آنجا که Position فقط یک متد getElement را دارد، کاربر بجز به متد getElement، به هیچ داده ی دیگری از کلاس Node دسترسی نخواهد داشت.
👈 نکته ی 1: البته فکر میکنم شما به این موضوع واقف باشید که چه لزومی به پیاده سازی Position<E> داریم وقتی که میتوانیم بگوییم:
public E getFirst(){
return head.data;
}در حقیقت هدف محدود سازی دسترسی به کلاس داخلی بود و هر کجا که نیاز باشد به بخشی از کلاس داخلی اجازه ی دسترسی صادر کنید، میتوانید از اینترفیس استفاده کنید.
مثلا سناریویی را در نظر بگیرید که یک کلاس داخلی چندین نوع داده را نگهداری میکند. حالا میتوان با پیاده سازی اینترفیس ها در کلاس داخلی مشخص کرد که از طریق کلاس خارجی، به چه بخشی از داده های کلاس میتوان دسترسی پیدا کرد.
👈 نکته ی 2: مثال بالا از کتاب ساختمان داده ی Michael. T goodrich هستش. میتوانید از همین کتاب، صفحه ی 271، فصل 7، مبحث Positional Lists، این مثال رو بیشتر و دقیق تر بررسی کنید. در واقع از Position<E> برای پیاده سازی یک حالت خاص از پیمایش داده های لینکدلیست به کار گرفته میشود
#interface
———
@PieceJava
👍11
Media is too big
VIEW IN TELEGRAM
#مثبت_برنامه_نویس
یه مقایسه ی خیلی باحال از مسیریابی A* و الگوریتم Dijkstra
همونطور که میبینید تو این مقایسه:
- دایکسترا سرعت کمتر داره اما تضمین میکنه که سریعترین راه ممکن رو پیدا میکنه
- الگوریتم A* خیلی خیلی سریعتره اما تضمینی در پیدا کردن کوتاه ترین راه نیست
@PieceJava
یه مقایسه ی خیلی باحال از مسیریابی A* و الگوریتم Dijkstra
همونطور که میبینید تو این مقایسه:
- دایکسترا سرعت کمتر داره اما تضمین میکنه که سریعترین راه ممکن رو پیدا میکنه
- الگوریتم A* خیلی خیلی سریعتره اما تضمینی در پیدا کردن کوتاه ترین راه نیست
@PieceJava
👍5❤2🔥1
#معرفی_سایت
سایت QuickRef یه مرجع بسیار عالی برای cheatsheet ها. تو این سایت برای اکثر زبان ها، ابزار ها، نرم افزار ها، پایگاه داده ها، فریمورک ها، کتابخونه ها و... cheatsheet قرار داده شده.
https://quickref.me
@pieceJava
سایت QuickRef یه مرجع بسیار عالی برای cheatsheet ها. تو این سایت برای اکثر زبان ها، ابزار ها، نرم افزار ها، پایگاه داده ها، فریمورک ها، کتابخونه ها و... cheatsheet قرار داده شده.
https://quickref.me
@pieceJava
👍10❤2
#Android
💠 نکته: استفاده از tools:listitem
فرض کنید برای هر آیتم در داخل لیستتون یا ریسایکلر ویو، یک لی اوت طراحی کردید. توی این مثال فرض میگیریم اسمش contacts_item.xml باشه
حالا برای داشتن یک پیش نمایش از آیتم هاتون در داخل ریسایکلر ویو، میتونید اتریبیوت زیر رو به ریسایکلر ویو اضافه کنید:
@pieceJava
💠 نکته: استفاده از tools:listitem
فرض کنید برای هر آیتم در داخل لیستتون یا ریسایکلر ویو، یک لی اوت طراحی کردید. توی این مثال فرض میگیریم اسمش contacts_item.xml باشه
حالا برای داشتن یک پیش نمایش از آیتم هاتون در داخل ریسایکلر ویو، میتونید اتریبیوت زیر رو به ریسایکلر ویو اضافه کنید:
tools:listitem="@layout/contact_item"
@pieceJava
❤4👍3
تو این پست میخوایم یسری چیزای پایه ای رو با هم بررسی کنیم و یکسری معادل سازی هارو مابین کاتلین و جاوا انجام بدیم.
- خط 1: معادل متد main در جاوا و برای اجرای برنامه های کاتلین
- خط 2: تعریف متغیر Immutable نظیر کلیدواژه final در جاوا. این یعنی بعد از تعریف و مقدار دهی، نمیتوانید مقدار را عوض کنید
- خط 4: به main_loop @ لیبل گفته میشه. در واقع به کمک لیبل ها میتونید یک استیتمنت (مثل ایف، حلقه، when و...) را مارک کنید و در ادامه به کمک این مارک، یکسری کار هارو انجام بدید. برای مثال در خط 10 من از لیبل برای بریک کردن حلقه ی وایل استفاده کردم
- خط 7: بجز اسکنر، از طریق متد readLine هم میشه ورودی گرفت. منتها (توی این مثال) میباستی این ورودی رو به عدد تبدیل کرد(Integer.ValueOf).
- خط: 8: دستور when دقیقا مشابه switch هستش. یعنی مقادیر مختلف option رو بررسی میکنه.
- خط 11: معادل default در دستور switch اینجا از else استفاده میشه
#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥5👍1
💬 دارم داکیومنت کاتلین رو از صفر میخونم. هرچیز جالبی که بهش رسیدم رو اینجا باهاتون به اشتراک میزارم
اگرم شما هم در این زبان موضوع جالبی مدنظرتون قرار گرفت، توی کامنت ها به اشتراک بزارید که توی کانال با همه به اشتراک بزارم❤️ ^ ^
اگرم شما هم در این زبان موضوع جالبی مدنظرتون قرار گرفت، توی کامنت ها به اشتراک بزارید که توی کانال با همه به اشتراک بزارم❤️ ^ ^
❤20
│
└───
└───
│ log.txt
│
├───
│ text1.txt
│
└───
│ Main.kt
حالا با توجه به مسیر بالا:
در اینصورت آدرس دیگر بصورت نسبی نیست و از ریشه در نظر گرفته میشود:
————-
تیکه پاره های جاوا
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3
#kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4