🔴 ایمن کردن تلگرام از هک شدن
🔹دوستان بهترین روش و تنها روش ایمن کردن تلگرامتون از هک شدن فعال کردن تایید دو مرحله ای هست که درصد هک شدن شما رو کاملا به صفر میرسونه(قبلا این اموزش رو گذاشتم ولی دوباره خیلی سوال راجب جلوگیری از هک شدن تلگرام شد که مجدد قرار دادم)
✅آموزش تایید دو مرحله ای تلگرام
1- وارد برنامه تلگرام شده و به منوی تنظیمات یا Setting بروید.
2- گزینه Privacy and Security را انتخاب نمایید.
در پنجره باز شده
3- گزینه Two-Step verification را انتخاب نمایید.
4- گزینه Set Additional Password را انتخاب نموده و یک رمز عبور دلخواه را متشکل از اعداد و حروف انتخاب کرده و در قسمت مربوطه وارد کنید.
5- برای بار دوم نیز، پسورد انتخاب شده خود را وارد نموده و به مرحله بعد بروید.
6- یک Hint جهت یادآوری پسورد خود انتخاب نمایید. این hint می تواند به طور مثال، دو شماره اول از رمزتان باشد که در صورت فراموشی، بتوانید آن را به یاد آورید.
7- یک آدرس ایمیل معتبر برای بازگردانی رمز عبور خود انتخاب نمایید تا در صورت فراموش کردن کد تایید دو مرحله ای تلگرام ، بتوانید اکانت خود را بازیابی کنید.
🔹دوستان بهترین روش و تنها روش ایمن کردن تلگرامتون از هک شدن فعال کردن تایید دو مرحله ای هست که درصد هک شدن شما رو کاملا به صفر میرسونه(قبلا این اموزش رو گذاشتم ولی دوباره خیلی سوال راجب جلوگیری از هک شدن تلگرام شد که مجدد قرار دادم)
✅آموزش تایید دو مرحله ای تلگرام
1- وارد برنامه تلگرام شده و به منوی تنظیمات یا Setting بروید.
2- گزینه Privacy and Security را انتخاب نمایید.
در پنجره باز شده
3- گزینه Two-Step verification را انتخاب نمایید.
4- گزینه Set Additional Password را انتخاب نموده و یک رمز عبور دلخواه را متشکل از اعداد و حروف انتخاب کرده و در قسمت مربوطه وارد کنید.
5- برای بار دوم نیز، پسورد انتخاب شده خود را وارد نموده و به مرحله بعد بروید.
6- یک Hint جهت یادآوری پسورد خود انتخاب نمایید. این hint می تواند به طور مثال، دو شماره اول از رمزتان باشد که در صورت فراموشی، بتوانید آن را به یاد آورید.
7- یک آدرس ایمیل معتبر برای بازگردانی رمز عبور خود انتخاب نمایید تا در صورت فراموش کردن کد تایید دو مرحله ای تلگرام ، بتوانید اکانت خود را بازیابی کنید.
معرفی بهترین دیتاسنترهای خارجی
کیفیت دیتاسنترهای خارجی ( از نگاه ایرانی ها )
آمریکا : 33.33%
آلمان : 13.64%
فرانسه : 13.64%
انگستان : 18.18%
هلند : 13.64%
کانادا : 7.58%
1-singlehop
محل دیتاسنتر:شیکاگو -آمریکا
محاسن : کیفیت و آپتایم بسیار عالی پورت نسبتا خوب و وقوی
معایب: قیمت بالا - حساسیت بالا
2-phoenixnap
محل دیتاسنتر : آمریکا
محاسن : قیمت پایین آپتایم 100 و قطعات خوب
زیاد به وارز گیر نمی دن
معایب: پورت 1 گیگ اشتراکی هست و سرعت پایین
به قول یکی از دوستان سرور هاش مثل بنزی می مونه که توش موتور پیکان هست
البته دارند یه کارایی روش انجام میدند
3-Softlayer
محل دیتاسنتر : آمریکا
محاسن : آپتایم 100 و قطعات خوب و پورت بسیار قوی
معایب: قیمت بالا -مشکل آی پی
4-iweb
محل دیتاسنتر : کانادا
محاسن : آپتایم 100 و قطعات خوب و کیفیت بسیار عالی - عدم تحریم
معایب: قیمت بالا - پورت 100
5-server4you - serverloft
محل دیتاسنتر : آمریکا آلمان
محاسن : قیمت بسیار پایین پورت 100 واقعی قطعات بالا و با کیفیت رم و سی پیو قوی
*دیتاسنتر آلمان زیاد به وارز گیر نمیده
معایب: پورت 100 - عدم ارائه آی پی بیش از 4 تا
6-ServerBoost
محل دیتاسنتر : هلند
محاسن : قیمت متوسط و معمولی پورت عالی
معایب: ویروس بوت نت در شبکه - بسته شدن آی پی ها بدون اطلاع
7-leaseweb -netdirect
محل دیتاسنتر : هلند - آلمان
محاسن : قیمت متوسط و معمولی پورت عالی شبکه خوب
معایب: محدودیت ارائه آی پی- جریمه های سنگین برای پهنای باند اضافه و مشکل در نمایش میزان حقیقی پهنای باند- پشتیبانی نه چندان خوب
8-Hetzener
محاسن:کیفیت بالا آپتایم عالی و پشتیبانی خوب نیمه وارز
معایب:خرید با واسطه-هزینه ستاپ – لینوکس سبک و هزینه برای نصب esxi
مکان سرور:المان
9-Giga ginternational
محاسن:آپتایم خوب - پاسخ گویی خوب
معایب:ترافیک کم - حساس به اسپم ترافیک اضافی نمی دهند
مکان سرور:المان
10-FastHost
محاسن:آپتایم عالی کیفیت عالی پورت 100 اختصاصی سخت افزار خوب پشتیبانی خوب
معایب:پورت 1 گیگ ندارند به شدت حساس هستد هزینه بالا + هزینه ستاپ محدودیت 3 آی پی و امکان مجازی سازی وجود نداره
مکان سرور:انگلیس
11-Ecatel
محاسن:وارز به تمام معنا کاملا وارز هست پورت عالی شبکه پایدار و آپتایم خوب
معایب:قیمت بالا - برای خرید ترافیک و پورت باید هزینه بالایی را بدید برای اضافه کردن قطعات جدید به سرور مثل هارد باید هزینه هارد را کاملا به صورت یک بار بپردازید
12-webnx
محاسن : پشتیبانی فوق الاده سریع و حرفه ایشبکه و پورت بسیار سریع و قوی با آپتایم 100%سخت افزار با کیفیت
معایب:تحریم نبود سیستم خرید برای خرید باید ایمیل بزنید
13- turnkeyinternet.net
آپتایم 100%
شبکه قوی و پورت نسبتا خوب
سخت افزار با کفیت و قیمت مناسب
14- gnax.net
شبکه قوی و آپتایم 99/999
پورت بسبتا قوی
قیمت متناسب
مشکل تحریم برای ایران
از بزرگترین نمایندگان این دیتاسنتر rockwan هست
15-Equinix
محاسن: سخت افزار قوی پینگ عالی به ایران پورت قوی تقریبا به وارز گیر نمی دن
معایب:بالا بودن هزینه آی پی ها
16- fastit
محاسن:قیمت خوب آپتایم خوب
معایب: پورت اشتراکی پشتیبانی ضعیف پهنای باند بسیار گران هست
17-located in Capelle a/d IJssel, The Netherlands
سرور های مناسب. قیمت خوب . پورت متوسط !! ترافیک کم . هزینه ترافیک اضافه بسیار گران. موقعیت اروپا. پشتیبانی قوی آفر غیر از این سرور ها نمیدن سرور دیگه ای بخوای ستاپ داره پهنای باند که خیلی بالا هست
پورت هم 1 گیگ واقعی نیست کمتر هست نمیشه گفت اشتراکی
18-XLHOST
بسیار حساس به اسپم و وارز
پورت 100 متوسط و خوب
کیفیت و آپتایم عالی پشتیبانی خوب
➖➖➖➖➖➖➖➖➖➖➖➖
@Simpleprogramming
کیفیت دیتاسنترهای خارجی ( از نگاه ایرانی ها )
آمریکا : 33.33%
آلمان : 13.64%
فرانسه : 13.64%
انگستان : 18.18%
هلند : 13.64%
کانادا : 7.58%
1-singlehop
محل دیتاسنتر:شیکاگو -آمریکا
محاسن : کیفیت و آپتایم بسیار عالی پورت نسبتا خوب و وقوی
معایب: قیمت بالا - حساسیت بالا
2-phoenixnap
محل دیتاسنتر : آمریکا
محاسن : قیمت پایین آپتایم 100 و قطعات خوب
زیاد به وارز گیر نمی دن
معایب: پورت 1 گیگ اشتراکی هست و سرعت پایین
به قول یکی از دوستان سرور هاش مثل بنزی می مونه که توش موتور پیکان هست
البته دارند یه کارایی روش انجام میدند
3-Softlayer
محل دیتاسنتر : آمریکا
محاسن : آپتایم 100 و قطعات خوب و پورت بسیار قوی
معایب: قیمت بالا -مشکل آی پی
4-iweb
محل دیتاسنتر : کانادا
محاسن : آپتایم 100 و قطعات خوب و کیفیت بسیار عالی - عدم تحریم
معایب: قیمت بالا - پورت 100
5-server4you - serverloft
محل دیتاسنتر : آمریکا آلمان
محاسن : قیمت بسیار پایین پورت 100 واقعی قطعات بالا و با کیفیت رم و سی پیو قوی
*دیتاسنتر آلمان زیاد به وارز گیر نمیده
معایب: پورت 100 - عدم ارائه آی پی بیش از 4 تا
6-ServerBoost
محل دیتاسنتر : هلند
محاسن : قیمت متوسط و معمولی پورت عالی
معایب: ویروس بوت نت در شبکه - بسته شدن آی پی ها بدون اطلاع
7-leaseweb -netdirect
محل دیتاسنتر : هلند - آلمان
محاسن : قیمت متوسط و معمولی پورت عالی شبکه خوب
معایب: محدودیت ارائه آی پی- جریمه های سنگین برای پهنای باند اضافه و مشکل در نمایش میزان حقیقی پهنای باند- پشتیبانی نه چندان خوب
8-Hetzener
محاسن:کیفیت بالا آپتایم عالی و پشتیبانی خوب نیمه وارز
معایب:خرید با واسطه-هزینه ستاپ – لینوکس سبک و هزینه برای نصب esxi
مکان سرور:المان
9-Giga ginternational
محاسن:آپتایم خوب - پاسخ گویی خوب
معایب:ترافیک کم - حساس به اسپم ترافیک اضافی نمی دهند
مکان سرور:المان
10-FastHost
محاسن:آپتایم عالی کیفیت عالی پورت 100 اختصاصی سخت افزار خوب پشتیبانی خوب
معایب:پورت 1 گیگ ندارند به شدت حساس هستد هزینه بالا + هزینه ستاپ محدودیت 3 آی پی و امکان مجازی سازی وجود نداره
مکان سرور:انگلیس
11-Ecatel
محاسن:وارز به تمام معنا کاملا وارز هست پورت عالی شبکه پایدار و آپتایم خوب
معایب:قیمت بالا - برای خرید ترافیک و پورت باید هزینه بالایی را بدید برای اضافه کردن قطعات جدید به سرور مثل هارد باید هزینه هارد را کاملا به صورت یک بار بپردازید
12-webnx
محاسن : پشتیبانی فوق الاده سریع و حرفه ایشبکه و پورت بسیار سریع و قوی با آپتایم 100%سخت افزار با کیفیت
معایب:تحریم نبود سیستم خرید برای خرید باید ایمیل بزنید
13- turnkeyinternet.net
آپتایم 100%
شبکه قوی و پورت نسبتا خوب
سخت افزار با کفیت و قیمت مناسب
14- gnax.net
شبکه قوی و آپتایم 99/999
پورت بسبتا قوی
قیمت متناسب
مشکل تحریم برای ایران
از بزرگترین نمایندگان این دیتاسنتر rockwan هست
15-Equinix
محاسن: سخت افزار قوی پینگ عالی به ایران پورت قوی تقریبا به وارز گیر نمی دن
معایب:بالا بودن هزینه آی پی ها
16- fastit
محاسن:قیمت خوب آپتایم خوب
معایب: پورت اشتراکی پشتیبانی ضعیف پهنای باند بسیار گران هست
17-located in Capelle a/d IJssel, The Netherlands
سرور های مناسب. قیمت خوب . پورت متوسط !! ترافیک کم . هزینه ترافیک اضافه بسیار گران. موقعیت اروپا. پشتیبانی قوی آفر غیر از این سرور ها نمیدن سرور دیگه ای بخوای ستاپ داره پهنای باند که خیلی بالا هست
پورت هم 1 گیگ واقعی نیست کمتر هست نمیشه گفت اشتراکی
18-XLHOST
بسیار حساس به اسپم و وارز
پورت 100 متوسط و خوب
کیفیت و آپتایم عالی پشتیبانی خوب
➖➖➖➖➖➖➖➖➖➖➖➖
@Simpleprogramming
#بیشتر_بدانید
این بار میخوام با کمک تکنیک
SFINAE
ماکرویی رو آماده کنم که تابع یه شی رو صدا بزنه به شرط اینکه وجود داشته باشه!!!
یعنی اگه وجود نداشت بی خیال صدا زدن اون بشه!!!
کامپایلری که من با استفاده از اون خروجی گرفتم:GCC v.5.1.0
حالا اولین قسمت کار رو مینویسیم
استراکتی که یه مقدار استاتیک داره که مشخص میکنه آیا یه تابع در اون نوع وجود داره یا نه
پس حتما با
SFINAE
آشنایی داشته باشید
این ها استراکت های مثال هستن:
استراکتی که کار چک کردن اینکه تابع وجود داره رو انجام میده:
یه مثال استفاده ازش:
به همین راحتی چک کردن رو انجام دادیم
ولی در پایان تبدیلش میکنیم به یه ماکرو که زیاد تایپ نکنیم
و حالا کافیه به جای اینکه اون همه تایپ کنیم فقط ماکرو زیر رو فراخونی کنیم
به همین راحتی
حالا میریم سراغ قسمت دوم کار
استراکتی که یه تابع داره که تابع مارو فراخونی میکنه به شرط اینکه مقدار بولین ورودیش صحیح باشه
یه مثال استفاده ازش:
پس تا اینجا تقریبا کار رو انجام دادیم😊
ولی خب اگه باز دقت کنین استراکت بالا هم میتونه تبدیل بشه به ماکرو تا این همه تایپ نکنیم هر بار
این بار میخوام با کمک تکنیک
SFINAE
ماکرویی رو آماده کنم که تابع یه شی رو صدا بزنه به شرط اینکه وجود داشته باشه!!!
یعنی اگه وجود نداشت بی خیال صدا زدن اون بشه!!!
کامپایلری که من با استفاده از اون خروجی گرفتم:GCC v.5.1.0
حالا اولین قسمت کار رو مینویسیم
استراکتی که یه مقدار استاتیک داره که مشخص میکنه آیا یه تابع در اون نوع وجود داره یا نه
پس حتما با
SFINAE
آشنایی داشته باشید
این ها استراکت های مثال هستن:
struct MyStruct1
{
void sayhello(){cout<<"Hello!\n"<<endl;}
};
struct MyStruct2
{
};
استراکتی که کار چک کردن اینکه تابع وجود داره رو انجام میده:
//چک کنیم آیا تابع "سی هلو" داره یا نه
//T: همون نوع کلاس یا استراکتی که میخواییم چک کنیم
//FuncType : نوع اشاره گر به تابع عضو که میشه نوع خود تابع
template<typename T,typename FuncType>
struct has_sayhello
{
//یه استراکت تست که دو تا تمپلیت آرگومان میگیره . اولیش نوع و دومیش یه چیزی از نوعش
template <typename U,U> struct AAA;
// یه تابع چک کردن با استراکت بالا . اگه نوع آ دارای اون تابع بود این تابع قابل فراخوانیه. نوع بازگشتیش هم یه چیزی هست که سایزش با تابع بعدی یکی نباشه
// sayhello همون تابعیه که میخوایم چک کنیم وجود داره یا نه
template <typename A> static char Check(AAA<FuncType,&A::sayhello >* in);
// اگه تابع بالا فراخوانی نشه این یکی فراخوانی میشه
template <typename A> static int Check(...);
// اگه نوع بازگشتی کاراکتر بود یعنی تابع وجود داره . چک کردن رو با سایزش انجام میدیم
const static bool value = sizeof(Check<T>(0))==sizeof(char);
};
یه مثال استفاده ازش:
MyStruct1 a;
MyStruct2 b;
//void(MyStruct1::*)() نوع اشاره گر به سی هلو هست
cout<<has_sayhello<MyStruct1,void(MyStruct1::*)()>::value<<endl;
cout<<has_sayhello<MyStruct2,void(MyStruct2::*)()>::value<<endl;
به همین راحتی چک کردن رو انجام دادیم
ولی در پایان تبدیلش میکنیم به یه ماکرو که زیاد تایپ نکنیم
#define _HAS_MEM(NAME,FUNCNAME)\
template<typename T,typename Sign>\
struct NAME\
{\
template <typename U,U> struct AAA;\
template <typename A> static char Check(AAA<Sign,&A::FUNCNAME >* in);\
template <typename A> static int Check(...);\
const static bool value = sizeof(Check<T>(0))==sizeof(char);\
};
و حالا کافیه به جای اینکه اون همه تایپ کنیم فقط ماکرو زیر رو فراخونی کنیم
_HAS_MEM(has_sayhello,sayhello);
int main()
{
MyStruct1 a;
MyStruct2 b;
cout<<has_sayhello<MyStruct1,void(MyStruct1::*)()>::value<<endl;
cout<<has_sayhello<MyStruct2,void(MyStruct2::*)()>::value<<endl;
return 0;
}
به همین راحتی
حالا میریم سراغ قسمت دوم کار
استراکتی که یه تابع داره که تابع مارو فراخونی میکنه به شرط اینکه مقدار بولین ورودیش صحیح باشه
//یه استراکت که یه تابع داره که فقط وقتی فراخوانی رو انجام میده که مقدار دوم تمپلیت صحیح باشه
// مقدار دوم همون استراکت بالایی هست
//T: نوعی که باید به تابع بدیم
//value: باید صحیح باشه تا فراخوانی شه . اور لودش میکنیم و تکلیف مقدار غلط رو هم مشخص میکنیم
template<typename T,bool value>
struct call_if_say_hello{
// ARGS همون نوع آرگومان هایین که باید به تابع بفرستیم
// از این بعدا استفاده میکنیم
template<typename ...ARGS>
// args اگه مقداری نداشته باشه چیزی به تابع نمی فرسته
// sayhello هم که تابعمونه دیگه
static void call(T in,ARGS... args){in.sayhello(args...) ;}
};
// اورلود استراکت بالا وقتی که مقدار دومی صحیح نیست
template<typename T>
struct call_if_say_hello <T,false>{
// چیزی وجود نداره که فراخوانی شه
template<typename ...ARGS>
static void call(T in,ARGS... args){}
};
یه مثال استفاده ازش:
MyStruct1 a;
MyStruct2 b;
call_if_say_hello<MyStruct1,has_sayhello<MyStruct1,void(MyStruct1::*)()>::value>::call(a);
call_if_say_hello<MyStruct2,has_sayhello<MyStruct2,void(MyStruct2::*)()>::value>::call(b);
پس تا اینجا تقریبا کار رو انجام دادیم😊
ولی خب اگه باز دقت کنین استراکت بالا هم میتونه تبدیل بشه به ماکرو تا این همه تایپ نکنیم هر بار
#define _CALL_IF(NAME,FUNCNAME)\
template<typename T,bool value>\
struct NAME{\
template<typename ...ARGS>\
static void call(T in,ARGS... args){in.FUNCNAME(args...) ;}\
};\
template<typename T>\
struct NAME <T,false>{\
template<typename ...ARGS>\
static void call(T in,ARGS... args){}\
};
🏴فرارسیدن سالروزشهادت مولی الموحدین امیرالمومنین علی علیه السلام تسلیت باد.
امشب ما رو از دعای خودتون بی نصیب نزارید 🖤
➖➖➖➖➖➖
@Simpleprogramming
امشب ما رو از دعای خودتون بی نصیب نزارید 🖤
➖➖➖➖➖➖
@Simpleprogramming
یادداشت های برنامه نویس آماتور | Amateur programmer notes
#بیشتر_بدانید این بار میخوام با کمک تکنیک SFINAE ماکرویی رو آماده کنم که تابع یه شی رو صدا بزنه به شرط اینکه وجود داشته باشه!!! یعنی اگه وجود نداشت بی خیال صدا زدن اون بشه!!! کامپایلری که من با استفاده از اون خروجی گرفتم:GCC v.5.1.0 حالا اولین قسمت کار…
مثال استفاده ازش:
این هم ماشالا از توانایی های دیگه سی پلاس پلاس بود که شاید در همین کانال در آینده ازش استفاده کنم
امیدوارم لذت برده باشید♥️
@Simpleprogramming
_HAS_MEM(has_sayhello,sayhello);
_CALL_IF(call_if_say_hello,sayhello);
int main()
{
MyStruct1 a;
MyStruct2 b;
call_if_say_hello<MyStruct1,has_sayhello<MyStruct1,void(MyStruct1::*)()>::value>::call(a);
call_if_say_hello<MyStruct2,has_sayhello<MyStruct2,void(MyStruct2::*)()>::value>::call(b);
return 0;
}
به همین راحتی
حالا بریم سراغ قسمت سوم کار:
اگه نگاه کنین تو تابع هم زیاده نویسی کردیم .
یه تابع دیگه مینویسیم اینکار رو انجام بده
البته نام تابع بالایی حتما باید مشخص باشه
_HAS_MEM(has_sayhello,sayhello);
_CALL_IF(call_ifsay_hello,sayhello);
// فقط یه تابع که مقدار میگیره و اگه وجود داشت فراخاونی میکنه
template<typename T>
void caller_sayhello(T in)
{
call_ifsay_hello<T,has_sayhello<T,void(T::*)()>::value>::call(in);
}
int main()
{
MyStruct1 a;
MyStruct2 b;
caller_sayhello(a);
caller_sayhello(b);
return 0;
}
آقا اینم میشه تبدیل به ماکرو شه خیلی راحت:
#define _CALLER(NAME,FUNCNAME)\
template<typename T>\
void NAME(T in)\
{\
_call_if_##FUNCNAME<T,_has_##FUNCNAME<T,void(T::*)()>::value>::call(in);\
}
نکته: ## برای چسبوندن
FUNCNAME
به
_call_if_
هست
مثال استفاده ازش:
_HAS_MEM(_has_sayhello,sayhello);
_CALL_IF(_call_if_sayhello,sayhello);
_CALLER(_caller_sayhello,sayhello);
int main()
{
MyStruct1 a;
MyStruct2 b;
_caller_sayhello(a);
_caller_sayhello(b);
return 0;
}
حالا بیایید یه ماکرو بنویسیم که اون سه تا ماکرو رو اضافه کنه و یه ماکرو دیگه که کار فراخوانی رو راحت تر کنه
#define CONFIG_CALL_IF_EXIST(FUNCNAME )\
_HAS_MEM(_has_##FUNCNAME,FUNCNAME)\
_CALL_IF(_call_if_##FUNCNAME,FUNCNAME )\
_CALLER(_caller_##FUNCNAME,FUNCNAME )
#define CALL_IF_EXIST(OBJ,FUNCNAME)\
_caller_##FUNCNAME(OBJ );
و حالا دیگه لازم نیست اووووووووووون همممممه تایپ کنیم😂
و این هم مثال استفاده ازش
CONFIG_CALL_IF_EXIST(sayhello)
int main()
{
MyStruct1 a;
MyStruct2 b;
CALL_IF_EXIST(a,sayhello);
CALL_IF_EXIST(b,sayhello);
return 0;
}
حالا فرض کنین یه تابع آرگومان دار باشه
اونوقت چی؟🤔
یه گله ماکرو ی دیگه برای آرگومان دارهاش مینویسیم
// پرانتز باز
#define PAROPEN (
// پرانتز بسته
#define PARCLOSE )
//این کالر هست و برای این یکی باید نوع آرگومان ها رو هم بفرستید
// ARGS هم یه ماکرو دیگه هست این شکلی فرستاده میشه
// ( آرگومان ها )
// اگه گیج تون کرد پایین تر رو نگاه کنید
#define _CALLER_WITH_ARGS(NAME,FUNCNAME,ARGS)\
template<typename T , typename... args>\
void NAME(T in,args... _args)\
{\
call_if_##FUNCNAME<T,__has_##FUNCNAME<T,void(T::*) ARGS >::value>::call(in,___args...);\
}
// فراخوانی با آرگومان
#define CALL_IF_EXIST_WITH_ARGS(OBJ,FUNCNAME,...)\
caller_##FUNCNAME(OBJ, VA_ARGS__ );
// کانفیگ با آرگومان
// اون آرگومان های بینهایت فقط نوع آرگومان های تابعمون هست
#define CONFIG_CALL_IF_EXIST_WITH_ARGS(FUNCNAME,...)\
_HAS_MEM(__has_##FUNCNAME,FUNCNAME)\
_CALL_IF(__call_if_##FUNCNAME,FUNCNAME )\
_CALLER_WITH_ARGS(__caller_##FUNCNAME,FUNCNAME, PAROPEN VA_ARGS PARCLOSE )
// PAROPEN VA_ARGS PARCLOSE
// تبدیل میشه به
// ( آرگومان هامون)
//_CALL_IF
// هم که قبلا گفتم میتونیم آرگومان هم براش بفرستیم
//_HAS_MEM هم که اصن به این چیزا کاری نداره
تمومه!!!
یه مثال مینویسم و از هر دوتاش استفاده میکنم
struct MyStruct1
{
void sayhello(){cout<<"Hello!\n"<<endl;}
};
struct MyStruct2
{
void shownumber(int in){cout<<in<<endl;}
};
CONFIG_CALL_IF_EXIST(sayhello)
CONFIG_CALL_IF_EXIST_WITH_ARGS(shownumber,int)
int main()
{
MyStruct1 a;
MyStruct2 b;
CALL_IF_EXIST(a,sayhello);
CALL_IF_EXIST(b,sayhello);
CALL_IF_EXIST_WITH_ARGS(a,shownumber,int(50));
CALL_IF_EXIST_WITH_ARGS(b,shownumber,int(100));
return 0;
}
این هم ماشالا از توانایی های دیگه سی پلاس پلاس بود که شاید در همین کانال در آینده ازش استفاده کنم
امیدوارم لذت برده باشید♥️
@Simpleprogramming
جهان سوم جاییه که یه دعانویس درآمدش از ما برنامه نویسا خیلی بیشتره …
دادستان تهران اعلام کرد که یکی از علل تحریک نجفی برای ارتکاب قتل همسر دومش شبکه های اجتماعی بوده و به احتمال قوی بزودی اینستاگرام، گوگل پلی، ایمو، adobe pdf reader و gallery فیلتر خواهند شد/ تسنیم 😐
موبوگرام اصلی هم توسط play protect ویروس شناخته شد و به صورت خودکار از گروهها حذف میشود.
@Simpleprogramming
@Simpleprogramming
یادداشت های برنامه نویس آماتور | Amateur programmer notes
موبوگرام اصلی هم توسط play protect ویروس شناخته شد و به صورت خودکار از گروهها حذف میشود. @Simpleprogramming
پیشنهاد میکنم یا تلگرام اصلی یا ایکس رو نصب کنید و یا سپر امنیتی گوگل پلی رو غیر فعال کنید که موبوگرامتون حذف نشه یا اگه حذف شده بتونید دوباره نصبش کنید.
Google play <~> Play protect
Scan device for security threats ->off
Improve harmful app detection ->off
@Simpleprogramming
Google play <~> Play protect
Scan device for security threats ->off
Improve harmful app detection ->off
@Simpleprogramming
🔴 آپدیت جدید تلگرام اصلی
💠قابليتهاى جديد نسخه 5.7.0:
1-در قسمت حریم خصوصی و امنیت معین کنید مشخصا چه کسانی بتوانند شماره تلفن شما را ببینند.
2- اضافه کردن گروه های چت به قسمت “همیشه / هیچ وقت ” به اشتراک گذاشته نشود. تنظیمات مربوطه هنگام ورود یا خروج کاربر جدید به صورت خودکار به روز می شود.
3- امکان مشاهده پیش نمایش هنگام ارسال اسناد با فرمت PDF
4- اضافه شدن فرمتهای مختلف (مانند Bold، Italic و …) هنگام تایپ متن
قابلیتهای اضافه شده به گروهها یا کانالها:
5- اضافه شدن دکمه Discuss و امکان انتخاب گروه پرسش و پاسخ یا گروه پشتیبانی به کانالها
6- امکان مشاهده کانالهای پابلیک، حتی در صورت نداشتن اکانت تلگرام
⬇️ لینک دانلود اندروید
https://play.google.com/store/apps/details?id=org.telegram.messenger
⬇️ دانلود آیفون
https://itunes.apple.com/us/app/telegram-messenger/id686449807
________________________
@Simpleprogramming
💠قابليتهاى جديد نسخه 5.7.0:
1-در قسمت حریم خصوصی و امنیت معین کنید مشخصا چه کسانی بتوانند شماره تلفن شما را ببینند.
2- اضافه کردن گروه های چت به قسمت “همیشه / هیچ وقت ” به اشتراک گذاشته نشود. تنظیمات مربوطه هنگام ورود یا خروج کاربر جدید به صورت خودکار به روز می شود.
3- امکان مشاهده پیش نمایش هنگام ارسال اسناد با فرمت PDF
4- اضافه شدن فرمتهای مختلف (مانند Bold، Italic و …) هنگام تایپ متن
قابلیتهای اضافه شده به گروهها یا کانالها:
5- اضافه شدن دکمه Discuss و امکان انتخاب گروه پرسش و پاسخ یا گروه پشتیبانی به کانالها
6- امکان مشاهده کانالهای پابلیک، حتی در صورت نداشتن اکانت تلگرام
⬇️ لینک دانلود اندروید
https://play.google.com/store/apps/details?id=org.telegram.messenger
⬇️ دانلود آیفون
https://itunes.apple.com/us/app/telegram-messenger/id686449807
________________________
@Simpleprogramming
IP:
PORT:
USER:
PASS:
Creation Time: 2019-05-11 01:09:14
TTL: 64 (1 min)
Expire Time: 01:10:11
Ping: 0 ms
Country: Iran
City: Tehran
ISP: Smart Land Solutions Co Ltd
Organization: Smart Land Solutions Co Ltd
Address: No.3,Park of Tehran University,16th Street,Northern AmirAbad, PostalCode:1439814448 Tehran
Tel: +98-21-88872011
Proxy Link: https://t.me/socks?server=94.101.121.155&port=443&user=zuser&pass=6160b02ae21b01
94.101.121.155PORT:
443USER:
zuserPASS:
6160b02ae21b01Creation Time: 2019-05-11 01:09:14
TTL: 64 (1 min)
Expire Time: 01:10:11
Ping: 0 ms
Country: Iran
City: Tehran
ISP: Smart Land Solutions Co Ltd
Organization: Smart Land Solutions Co Ltd
Address: No.3,Park of Tehran University,16th Street,Northern AmirAbad, PostalCode:1439814448 Tehran
Tel: +98-21-88872011
Proxy Link: https://t.me/socks?server=94.101.121.155&port=443&user=zuser&pass=6160b02ae21b01
⚙️کامنت گذاشتن برای پست های تلگرام
♦️ تلگرام همراه با معرفی گروه بحث و گفتگو، در حال معرفی ربات discussbot برای اضافه کردن نظرات زیر پست ها به کانال هاست.
@discussbot
💠قابلیت "بحث و گفتگو" که با یک دکمه جدید در کنار دکمه "بیصدا/باصدا" در زیر کانال به نمایش در میآید را، به نسخه جدید بتای تلگرام(تلگرام آزمایشی رسمی) اضافه کرد و پس از تنظیم گروه بر روی کانال، مطالب آن به صورت خودکار به آن گروه ارسال میشود و افراد میتوانند با پیوستن به آن گروه، به بحث و گفتگو درباره پست ها بپردازند.
💠تلگرام رباتی ایجاد کرده است که به صورت دلخواه به هر پست قابلیت کامنت گذاشتن را اضافه کند. این ربات با استفاده از یک ویژگی جدید در بخش لاگین به وبسایت از طریق اکانت استفاده خواهد کرد.
💠اگر کسی به نظر شما پاسخی بدهد ربات به شما اطلاع خواهد داد و نیاز به ترک تلگرام برای جواب دادن نیستید و در ربات میتونید جواب فرد را بدهید.
💠این ربات تنها در کانال های عمومی در حال حاضر کار می کند،مدیران کانال ها می توانند بعضی از نظرات که مورد پسندشان نیست را حذف کنند؛در حال حاضر فقط با پست های متنی و عکسی کار می کند!
💠برای استفاده از ربات:فقط نیاز به اضافه کردن ربات به کانال به عنوان مدیر و ربات پس از ادمین شدن در کانال، بعد از اینکه هر پستی به کانال ارسال میشود به صورت اتوماتیک دکمهای برای فرستادن کامنت در پایین آن اضافه میکند. با استفاده از پنل جدید کامنت، قادر خواهید بود تا با اکانت خودتان بتوانید به آن وارد شده و درباره آن کامنت گذاشته و حتی به نظرات دیگران پاسخ دهید.
⚠️توجه داشته باشید ربات و کانال آن رسمی میباشد ولی در حال حاضر در مرحله تست میباشد و ربات در آینده پیشرفته تر خواهد شد.
@Simpleprogramming
شماهم میتوانید نظرات خودتون رو زیر هر پست با زدن بر روی ( Add Coment ) اعلام کنید .
توجه: به دلیل فیلترینگ در ایران برای وارد شدن به سایت باید فیلتر شکن روشن باشد.
♦️ تلگرام همراه با معرفی گروه بحث و گفتگو، در حال معرفی ربات discussbot برای اضافه کردن نظرات زیر پست ها به کانال هاست.
@discussbot
💠قابلیت "بحث و گفتگو" که با یک دکمه جدید در کنار دکمه "بیصدا/باصدا" در زیر کانال به نمایش در میآید را، به نسخه جدید بتای تلگرام(تلگرام آزمایشی رسمی) اضافه کرد و پس از تنظیم گروه بر روی کانال، مطالب آن به صورت خودکار به آن گروه ارسال میشود و افراد میتوانند با پیوستن به آن گروه، به بحث و گفتگو درباره پست ها بپردازند.
💠تلگرام رباتی ایجاد کرده است که به صورت دلخواه به هر پست قابلیت کامنت گذاشتن را اضافه کند. این ربات با استفاده از یک ویژگی جدید در بخش لاگین به وبسایت از طریق اکانت استفاده خواهد کرد.
💠اگر کسی به نظر شما پاسخی بدهد ربات به شما اطلاع خواهد داد و نیاز به ترک تلگرام برای جواب دادن نیستید و در ربات میتونید جواب فرد را بدهید.
💠این ربات تنها در کانال های عمومی در حال حاضر کار می کند،مدیران کانال ها می توانند بعضی از نظرات که مورد پسندشان نیست را حذف کنند؛در حال حاضر فقط با پست های متنی و عکسی کار می کند!
💠برای استفاده از ربات:فقط نیاز به اضافه کردن ربات به کانال به عنوان مدیر و ربات پس از ادمین شدن در کانال، بعد از اینکه هر پستی به کانال ارسال میشود به صورت اتوماتیک دکمهای برای فرستادن کامنت در پایین آن اضافه میکند. با استفاده از پنل جدید کامنت، قادر خواهید بود تا با اکانت خودتان بتوانید به آن وارد شده و درباره آن کامنت گذاشته و حتی به نظرات دیگران پاسخ دهید.
⚠️توجه داشته باشید ربات و کانال آن رسمی میباشد ولی در حال حاضر در مرحله تست میباشد و ربات در آینده پیشرفته تر خواهد شد.
@Simpleprogramming
شماهم میتوانید نظرات خودتون رو زیر هر پست با زدن بر روی ( Add Coment ) اعلام کنید .
توجه: به دلیل فیلترینگ در ایران برای وارد شدن به سایت باید فیلتر شکن روشن باشد.
در بروزرسانی جدید تلگرام مشخص کنید که همه بتوانند شماره شما را مشاهده کنند! یا هیچکس(حتی مخاطبانتان) نتواند شماره شما را مشاهده کند
تنظیمات>حریم خصوصی و امنیت>شماره تلفن
settings>privacy and security>phone number
➖➖➖➖➖➖➖➖
@Simpleprogramming
تنظیمات>حریم خصوصی و امنیت>شماره تلفن
settings>privacy and security>phone number
➖➖➖➖➖➖➖➖
@Simpleprogramming
#بیشتر_بدانید
اینبار یه چیزی مینویسم تا کار سریالیز کردن کلاس ها و استراکت ها رو راحت تر کنه
#include <iostream>
#include <sstream>
#include <fstream>
#include <streambuf>
#include <string>
using namespace std;
//برای اینکه چک کنیم شی تابع سریالیز داره
// مبحث پست بالا همین بود
template<typename T,typename Sign>
struct hasserialize
{
template <typename U,U> struct AAA;\
template <typename A> static char Check(AAA<Sign,&A::serialize >* in);
template <typename A> static int Check(...);\
const static bool value = sizeof(Check<T>(0))==sizeof(char);
};
// برای نوع ورودی
struct BinaryIn
{
//لود کردن از فایل
void load(const char* filename)
{
fstream inf;
inf.open(filename,ios::in|ios::binary);
str<<inf.rdbuf();
inf.close();
}
//این برای موارد کلی هست
template<typename T>
void operator() (T& in)
{
// ارور برای وقتی که تابعه وجود نداره
staticassert(hasserialize<T,void (T::*)(BinaryIn&)>::value,"there are no member func Typename::serialize(BinaryIn&) to serialize object" );
in.serialize(*this);
}
stringstream str;
};
// از اینجا به بعد برای استثنا ها یا آن هایی که باید بیرون از کلاس سریالیزرشون تعریف شده باشه
// من یه چندتایی برای تست آماده کردم
template<>
void BinaryIn::operator() <int>(int& in)
{
str.read(reinterpretcast<char>(&in),sizeof(in));
}
template<>
void BinaryIn::operator() <double>(double& in)
{
str.read(reinterpret_cast<char>(&in),sizeof(in));
}
template<>
void BinaryIn::operator() <float>(float& in)
{
str.read(reinterpretcast<char*>(&in),sizeof(in));
}
// استرینگ خودش نوعی کلاسه اما چون استثنا هست این شکلی امکان لود بهش میدیم
template<>
void BinaryIn::operator() <string>(string& in)
{
sizet ss;
str.read(reinterpretcast<char>(&_ss),sizeof(__ss));
in.reserve(__ss);
char ins = new char[ss];
str.read(ins,ss);
in = ins;
delete ins;
}
// برای خروجی
struct BinaryOut
{
// ذخیره کردن در یه فایل
void save(const char filename)
{
fstream onf;
onf.open(filename,ios::out|ios::binary);
onf<<str.rdbuf();
onf.close();
}
template<typename T>
void operator() (T& in)
{
static_assert(has_serialize<T,void (T::)(BinaryOut&)>::value,"there are no member func Typename::serialize(BinaryOut&) to serialize object" );
in.serialize(this);
}
stringstream str;
};
//استثنا ها
template<>
void BinaryOut::operator() <int>(int& in)
{
str.write(reinterpret_cast<char>(&in),sizeof(in));
}
template<>
void BinaryOut::operator() <double>(double& in)
{
str.write(reinterpretcast<char*>(&in),sizeof(in));
}
template<>
void BinaryOut::operator() <float>(float& in)
{
str.write(reinterpretcast<char>(&in),sizeof(in));
}
template<>
void BinaryOut::operator() <string>(string& in)
{
size_t _s = in.size();
str.write(reinterpret_cast<const char>(&s),sizeof(in.size()));
str.write(in.cstr(),s);
}
// از اینجا به بعد یه مثال برای استفاده ازش هست
struct struct2
{
template <typename T>
void serialize(T& ar)
{
ar(a);
}
int a;
};
struct struct1
{
template <typename T>
void serialize(T& ar)
{
ar(a);
ar(b);
ar(c);
ar(d);
ar(e);
}
int a;
float b;
double c;
struct2 d;
string e;
};
int main()
{
struct1 a,b;
a.a=50;
a.b=80.0f;
a.c=410.0;
a.d.a=880;
a.e="Hello World!";
b.a=0;
b.b=0.0f;
b.c=0.0;
b.d.a=0;
b.e.clear();
BinaryOut tout;
tout(a);
tout.save("out.txt");
BinaryIn tin;
tin.load("out.txt");
tin(b);
cout<<b.a<<endl<<b.b<<endl<<b.c<<endl<<b.d.a<<endl<<b.e<<endl;
return 0;
}
تو مثال بالا محتویات
a
رو توی فایلی ذخیره میکنیم و
b
رو از روی همون فایل لود میکنیم
آخر کار هم تک تک محتویات
b
رو چاپ میکنیم تا خیالمون راحت شه که همه چیز ردیفه
محتویات و سایز
out.txt
رو بررسی کنید تا ببینید چه خبره
امیدوارم براتون جالب بوده باشه
@Simpleprogramming
اینبار یه چیزی مینویسم تا کار سریالیز کردن کلاس ها و استراکت ها رو راحت تر کنه
#include <iostream>
#include <sstream>
#include <fstream>
#include <streambuf>
#include <string>
using namespace std;
//برای اینکه چک کنیم شی تابع سریالیز داره
// مبحث پست بالا همین بود
template<typename T,typename Sign>
struct hasserialize
{
template <typename U,U> struct AAA;\
template <typename A> static char Check(AAA<Sign,&A::serialize >* in);
template <typename A> static int Check(...);\
const static bool value = sizeof(Check<T>(0))==sizeof(char);
};
// برای نوع ورودی
struct BinaryIn
{
//لود کردن از فایل
void load(const char* filename)
{
fstream inf;
inf.open(filename,ios::in|ios::binary);
str<<inf.rdbuf();
inf.close();
}
//این برای موارد کلی هست
template<typename T>
void operator() (T& in)
{
// ارور برای وقتی که تابعه وجود نداره
staticassert(hasserialize<T,void (T::*)(BinaryIn&)>::value,"there are no member func Typename::serialize(BinaryIn&) to serialize object" );
in.serialize(*this);
}
stringstream str;
};
// از اینجا به بعد برای استثنا ها یا آن هایی که باید بیرون از کلاس سریالیزرشون تعریف شده باشه
// من یه چندتایی برای تست آماده کردم
template<>
void BinaryIn::operator() <int>(int& in)
{
str.read(reinterpretcast<char>(&in),sizeof(in));
}
template<>
void BinaryIn::operator() <double>(double& in)
{
str.read(reinterpret_cast<char>(&in),sizeof(in));
}
template<>
void BinaryIn::operator() <float>(float& in)
{
str.read(reinterpretcast<char*>(&in),sizeof(in));
}
// استرینگ خودش نوعی کلاسه اما چون استثنا هست این شکلی امکان لود بهش میدیم
template<>
void BinaryIn::operator() <string>(string& in)
{
sizet ss;
str.read(reinterpretcast<char>(&_ss),sizeof(__ss));
in.reserve(__ss);
char ins = new char[ss];
str.read(ins,ss);
in = ins;
delete ins;
}
// برای خروجی
struct BinaryOut
{
// ذخیره کردن در یه فایل
void save(const char filename)
{
fstream onf;
onf.open(filename,ios::out|ios::binary);
onf<<str.rdbuf();
onf.close();
}
template<typename T>
void operator() (T& in)
{
static_assert(has_serialize<T,void (T::)(BinaryOut&)>::value,"there are no member func Typename::serialize(BinaryOut&) to serialize object" );
in.serialize(this);
}
stringstream str;
};
//استثنا ها
template<>
void BinaryOut::operator() <int>(int& in)
{
str.write(reinterpret_cast<char>(&in),sizeof(in));
}
template<>
void BinaryOut::operator() <double>(double& in)
{
str.write(reinterpretcast<char*>(&in),sizeof(in));
}
template<>
void BinaryOut::operator() <float>(float& in)
{
str.write(reinterpretcast<char>(&in),sizeof(in));
}
template<>
void BinaryOut::operator() <string>(string& in)
{
size_t _s = in.size();
str.write(reinterpret_cast<const char>(&s),sizeof(in.size()));
str.write(in.cstr(),s);
}
// از اینجا به بعد یه مثال برای استفاده ازش هست
struct struct2
{
template <typename T>
void serialize(T& ar)
{
ar(a);
}
int a;
};
struct struct1
{
template <typename T>
void serialize(T& ar)
{
ar(a);
ar(b);
ar(c);
ar(d);
ar(e);
}
int a;
float b;
double c;
struct2 d;
string e;
};
int main()
{
struct1 a,b;
a.a=50;
a.b=80.0f;
a.c=410.0;
a.d.a=880;
a.e="Hello World!";
b.a=0;
b.b=0.0f;
b.c=0.0;
b.d.a=0;
b.e.clear();
BinaryOut tout;
tout(a);
tout.save("out.txt");
BinaryIn tin;
tin.load("out.txt");
tin(b);
cout<<b.a<<endl<<b.b<<endl<<b.c<<endl<<b.d.a<<endl<<b.e<<endl;
return 0;
}
تو مثال بالا محتویات
a
رو توی فایلی ذخیره میکنیم و
b
رو از روی همون فایل لود میکنیم
آخر کار هم تک تک محتویات
b
رو چاپ میکنیم تا خیالمون راحت شه که همه چیز ردیفه
محتویات و سایز
out.txt
رو بررسی کنید تا ببینید چه خبره
امیدوارم براتون جالب بوده باشه
@Simpleprogramming
خبر فوری:
یادداشت های برنامه نویس آماتور
تلگرام اعلام کرد، حدود یک ماه دیگر دسترسی کاربران سراسر دنیا از جمله ایران به گروههای تلگرامی عمومی (دارای آیدی) فراهم خواهد شد. قبل از آن، تلگرام هماکنون درحال کار بر روی سختتر کردن فعالیت اسپمرها در این پیامرسان است.یادداشت های برنامه نویس آماتور