uk
Feedback
Sadra Codes

Sadra Codes

Відкрити в Telegram
3 591
Підписники
+1124 години
+407 днів
+13430 день

Триває завантаження даних...

Залучення підписників
червень '26
червень '26
+185
в 3 каналах
травень '26
+39
в 2 каналах
Get PRO
квітень '26
+57
в 0 каналах
Get PRO
березень '26
+22
в 0 каналах
Get PRO
лютий '26
+162
в 1 каналах
Get PRO
січень '26
+14
в 0 каналах
Get PRO
грудень '25
+24
в 1 каналах
Get PRO
листопад '25
+57
в 1 каналах
Get PRO
жовтень '25
+65
в 0 каналах
Get PRO
вересень '25
+54
в 1 каналах
Get PRO
серпень '25
+57
в 0 каналах
Get PRO
липень '25
+72
в 1 каналах
Get PRO
червень '25
+63
в 0 каналах
Get PRO
травень '25
+60
в 0 каналах
Get PRO
квітень '25
+47
в 0 каналах
Get PRO
березень '25
+88
в 8 каналах
Get PRO
лютий '25
+62
в 6 каналах
Get PRO
січень '25
+159
в 2 каналах
Get PRO
грудень '24
+204
в 5 каналах
Get PRO
листопад '24
+267
в 4 каналах
Get PRO
жовтень '24
+182
в 3 каналах
Get PRO
вересень '24
+182
в 5 каналах
Get PRO
серпень '24
+253
в 10 каналах
Get PRO
липень '24
+105
в 3 каналах
Get PRO
червень '24
+392
в 7 каналах
Get PRO
травень '24
+151
в 7 каналах
Get PRO
квітень '24
+126
в 7 каналах
Get PRO
березень '24
+126
в 5 каналах
Get PRO
лютий '24
+143
в 5 каналах
Get PRO
січень '24
+166
в 2 каналах
Get PRO
грудень '23
+229
в 8 каналах
Get PRO
листопад '23
+63
в 2 каналах
Get PRO
жовтень '23
+23
в 0 каналах
Get PRO
вересень '23
+90
в 0 каналах
Get PRO
серпень '23
+206
в 0 каналах
Get PRO
липень '23
+85
в 0 каналах
Get PRO
червень '23
+122
в 0 каналах
Get PRO
травень '23
+225
в 0 каналах
Get PRO
квітень '23
+279
в 0 каналах
Get PRO
березень '23
+214
в 0 каналах
Get PRO
лютий '23
+32
в 0 каналах
Get PRO
січень '23
+80
в 0 каналах
Get PRO
грудень '22
+97
в 0 каналах
Get PRO
листопад '22
+12
в 0 каналах
Get PRO
жовтень '22
+115
в 0 каналах
Get PRO
вересень '22
+15
в 0 каналах
Get PRO
серпень '22
+16
в 0 каналах
Get PRO
липень '22
+27
в 0 каналах
Get PRO
червень '22
+26
в 0 каналах
Get PRO
травень '22
+24
в 0 каналах
Get PRO
квітень '22
+20
в 0 каналах
Get PRO
березень '22
+72
в 0 каналах
Get PRO
лютий '22
+5
в 0 каналах
Get PRO
січень '22
+2
в 0 каналах
Get PRO
грудень '21
+2
в 0 каналах
Get PRO
листопад '21
+4
в 0 каналах
Get PRO
жовтень '21
+4
в 0 каналах
Get PRO
вересень '210
в 0 каналах
Get PRO
серпень '21
+2
в 0 каналах
Get PRO
липень '21
+2
в 0 каналах
Get PRO
червень '21
+7
в 0 каналах
Get PRO
травень '21
+4
в 0 каналах
Get PRO
квітень '21
+6
в 0 каналах
Get PRO
березень '21
+5
в 0 каналах
Get PRO
лютий '21
+3
в 0 каналах
Get PRO
січень '21
+3
в 0 каналах
Get PRO
грудень '20
+720
в 0 каналах
Дата
Залучення підписників
Згадування
Канали
26 червня+6
25 червня+12
24 червня+8
23 червня+6
22 червня+7
21 червня+6
20 червня+8
19 червня+3
18 червня+6
17 червня+5
16 червня+4
15 червня+13
14 червня+5
13 червня+15
12 червня+15
11 червня+15
10 червня+6
09 червня+8
08 червня+8
07 червня+10
06 червня+3
05 червня+3
04 червня+8
03 червня+5
02 червня0
01 червня0
Дописи каналу
اگر مسیج یک commit رو اشتباه نوشتید، اصلا نیاز نیست یه کامیت جدید بزنید. برای ویرایش آخرین commit:
git rebase -i HEAD~1
سپس:
reword abc123 Fix logni page
بعد از ذخیره فایل، Git از شما می‌خواد پیام جدید رو وارد کنید:
Fix login page
دستورهای مهم Interactive Rebase:
pick    استفاده از commit بدون تغییر
reword  تغییر پیام commit
edit    ویرایش commit
squash  ادغام با commit قبلی
fixup   ادغام بدون نگه داشتن پیام
drop    حذف commit
پی‌نوشت: من خودم واسه ادیت کردن آخرین کامیت، از این کامند استفاده می‌کنم. سریع‌تر و راحت‌تره:
git commit --amend -m "NEW MESSAGE"

منبع: https://blog.imsadra.dev/introduction-to-interactive-rebase-in-git Join 👉 @lnxpylnxpy

2
یکی از خفن‌ترین قابلیت‌های Git که تقریبا اجازه می‌ده همه نوع مانوری روی کامیت‌ها و هیستوری گیت داشته باشین، Interactive Rebase هست. یاد گرفتنش، خیلی دستتون رو باز می‌کنه. نکته مهم: Interactive Rebase تاریخچه Git رو بازنویسی می‌کنه؛ بنابراین روی branchهای حساس، باید با احتیاط ازش استفاده کرد. چطور چند commit را به یک commit تبدیل کنیم؟ فرض کنید همچین تاریخچه‌ای داریم: Add Login Fix Login Bug Fix Typo می‌خوایم ۳ تا کامیت آخر رو ادغام کنیم: git rebase -i HEAD~3 هیستوری‌تون توی ادیتور باز میشه. کافیه فایل رو به این شکل تغییر بدیم: pick abc123 Add Login squash def456 Fix Login Bug squash ghi789 Fix Typo در نتیجه، یک تاریخچه تمیزتر و خواناتر واسه ریویو خواهیم داشت. منبع: https://blog.imsadra.dev/introduction-to-interactive-rebase-in-git Join 👉 @lnxpylnxpy
360
3
می‌دونستید به راحتی می‌تونید یه اسکریپت پایتون بنویسید و کاملا رایگان روی سرورهای گیت‌هاب رانش کنید؟ تقریبا هر سناریو Automationی که مدنظر داشته باشین رو میشه پیاده کرد. مثلا: - یه اسکریپت پایتون که هر n ساعت، سریع‌ترین کانفیگ vmess و vless رو واست SMS کنه یا توی یه README نگهش داره. - هر n ساعت، یه پست AI-generated توی چنل تلگرامت منتشر کنه. - هرموقع کسی روی ریپازیتوریت issue باز کرد، واست SMS بیاد. تقریبا همه کار میشه باهاش کرد. یک سری محدودیت‌های ریز داره ولی خب این محدودیت‌ها موقعی تو چشم میان که کار شما هم خیلی خاص بشه. لینک پروژه: https://github.com/lnxpy/pyaction ✨ خودم این موارد رو تاحالا باهاش ساختم: - یه ریپازیتوری که از طریق issue باز کردن روش، بتونی با GPT صحبت کنی: https://github.com/lnxpy/mdb-ai-prompted-text - یه پایپ‌لاین که بلافاصله وقتی یه issue رو ریپازیتوری‌تون باز شه، شروع می‌کنه تغییرات رو بررسی کردن و به هر تغییر توی هر فایل، یه امتیاز میده و یه سری tip میده نسبت به تغییرات: https://github.com/lnxpy/revai - امکان ارسال SMS توی پایپ‌لاین‌های گیت‌هاب اکشن با کاوه‌نگار: https://github.com/lnxpy/kavenegar-action - یه چارت خیلی مینیمال و کوچیک از تعداد دانلود پکیج پایتونتون توی ریپازیتوری نگه می‌داره که می‌تونید توی README نمایشش بدید: https://github.com/lnxpy/pypi-chart-badge - یه پایپ‌لاین که اون موقع‌ها تا مقاله منتشر می‌کردم، با AI به هر زبان دیگه‌ای ترجمه‌اش می‌کرد و توی یه markdown file توی گیت‌هاب کامیتش می‌کرد: https://github.com/lnxpy/notio Join 👉 @lnxpylnxpy
608
4
یه زمان، بحث سر اضافه کردن براکت فرفری {😄} یا همون Curly Braces خیلی داغ بود. شاید تقریبا ۱۰-۱۵ سال پیش. پایتونم اومد یه همچین Easter eggی اضافه کرد که وقتی ایمپورتش می‌کنی، یه تریس‌بک جالب می‌ده: >>> from __future__ import braces File "<python-input-5>", line 1 from __future__ import braces ^^^^^^ SyntaxError: not a chance منبع: https://blog.imsadra.dev/10-python-easter-eggs Join 👉 @lnxpylnxpy
800
5
توی پایتون، یه Operand داریم، یه Operator. در مثال زیر، به x و y می‌گیم Operand و به < می‌گیم Opeartor. if (x > y): ... حالا این وسط یه Operatorی داریم که شاید کمتر کسی راجع بهش بدونه. اسمش Walrus operator هست. کارش چیه؟ عبارت مقایسه‌ای ما که سرجاشه.. حالا این وسط میاد یه Variable assignment هم انجام میده. مثلا اگه قبلا می‌نوشتید: length = len("test1234") if length < 8: print(f"Your password is {length} chars long. It must be longer than 8 chars.") زین پس بنویسید: if (length:=len("test1234")) < 8: print(f"Your password is {length} chars long. It must be longer than 8 chars.") و چه شرط true باشه چه false، متغیر length همیشه در دسترس خواهد بود. حالا یه اپراتور داریم که شاید اصلا ندیده باشینش. البته Deprecate شده ولی خب هنوز میشه ازش استفاده کرد و اسمش Barry Warsaw's Operator هست. بری خان دولوپر پایتون بوده و اون زمان، بجای =! یا همون Not equal، از <> استفاده می‌کردن. >>> 2 != 3 True >>> 2 <> 3 File "<python-input-1>", line 1 2 <> 3 ^^ SyntaxError: invalid syntax >>> from __future__ import barry_as_FLUFL >>> 2 != 3 File "<python-input-3>", line 1 2 != 3 ^^ SyntaxError: with Barry as BDFL, use '<>' instead of '!=' >>> 2 <> 3 True >>> کاملا بی‌مصرف و چرت. 😄 منبع: https://blog.imsadra.dev/10-python-easter-eggs Join 👉 @lnxpylnxpy
880
6
توی cli، ران کنید: python -c "import antigravity" Join 👉 @lnxpylnxpy
1 026
7
Love is neither true, or false. Love is just love. This is love. 🖤 >>> import this >>> love = this >>> this is love True >>> love is True False >>> love is False False >>> love is not True or False True >>> love is not True or False; love is love True Join 👉 @lnxpylnxpy
1 135
8
دیگه بهتر از بانو، نیاد.. 🖤 Join 👉 @lnxpylnxpy
1 026
9
واسه توسعه پکیج پایتون، من از استک‌ها و محیطی استفاده می‌کنم که تقریبا تمام نیازمندهام رو برطرف می‌کنه. از تست و کاوریج و داک
واسه توسعه پکیج پایتون، من از استک‌ها و محیطی استفاده می‌کنم که تقریبا تمام نیازمندهام رو برطرف می‌کنه. از تست و کاوریج و داکیومنت، تا اتومیشن‌ها و.. توی این مقاله، راجع به پروسه و تصمیماتی که حین توسعه می‌گیرم نوشتم. راجع به ابزارهای زیر هم صحبت کردم که هرکدوم به چه دردی می‌خورن: CodeCov - PyTest - Tox - Nox - Ruff - Mkdocs - Coverage‍‍.‍py - GitHub Actions - Pre-commit Link: https://blog.imsadra.dev/python-open-source-development-how-i-build-and-maintain-open-source-repositories Join 👉 @lnxpylnxpy
1 510
10
یه موضوع هست راجع به تنظیم دپریکیشن‌ها. مثلا شما قراره به زودی، یه utility که می‌تونه اصلا یه فانکشن باشه رو اسم یا ساختارش رو تغییر بدید. یا اصلا حذفش کنید و دیگه در دسترس نباشه و یک راه جایگزین واسش طراحی کنید. خلاصه قراره تغییری ایجاد کنید که شیوه استفاده از اون utility رو قراره تغییر بده. def greet(name: str) -> str: return f"hey {name}" توی ورژن جدید قراره اسم greet به say_hi تغییر کنه. بهتره که از چند ورژن قبل تر، یه همچین حرکتی بزنید: from warnings import deprecated @deprecated("greet function will be renamed to say_hi") def greet(name: str) -> str: return f"hey {name}" هر موقع که تابع greet کال شه، یه چنین وارنینگی هم نمایش داده میشه: DeprecationWarning: greet function will be renamed to say_hi یه سری پکیج‌ها و ابزارها هم هستن واسه مدیریت این دپریکیشن‌ها و تغییراتی که شیوه استفاده از اون موجودیت رو تغییر می‌دن. مثلا دقیقا توی چه ورژنی باید deprecationها رو ست کنید. دقیقا در چه ورژنی؟ بعدا راجع بهشون صحبت می‌کنیم. :) Join 👉 @lnxpylnxpy
1 193
11
وقتی دارید روی یه پکیج کار می‌کنید که یوزرها برنامه‌نویس هستن، در قسمت‌هایی از پروژه، ورژن پکیج رو قید کردین. مسلما هر بیلد، یه ورژن خاص خودش رو داره. معروف‌ترین نوع ورژن‌بندی هم که همه تقریبا باهاش آشناییم همون Semantic Versioning هست که از سه بخش اصلی درست شده: [MAJOR].[MINOR].[PATCH] شمارهٔ نسخهٔ اصلی (MAJOR) رو زمانی افزایش می‌دیم که تغییرات بزرگ اعمال شدن و ممکنه باعث Breaking Changes در بخش‌هایی از پروژه شده باشن. شمارهٔ نسخهٔ جزئی (MINOR) رو زمانی افزایش می‌دیم که قابلیت‌هایی اضافه شدن که با نسخه‌های قبل سازگار هستند. (مثلا اکوسیستم و پترن‌ها همون پترن‌های قبلن، یه دوتا ماژول یا util جدید اضافه شدن به ساختار قبلی) شمارهٔ نسخهٔ (PATCH) رو زمانی افزایش می‌دیم که صرفا یه باگ فیکس کردیم که با نسخه‌های قبل هم سازگار هست و Breaking Changesی نداریم. یه اصطلاح هست به اسم Version Bumping. موقعی شما ورژن رو بامپ می‌کنید که تغییراتی ایجاد کردید و می‌خواید یه بیلد جدید بگیرید از پکیج. (شما هیچوقت نمی‌تونید از یه ورژن، دوتا بیلد داشته باشید. حتی اگه یه خط هم اضافه کنید، نیازه واسه منتشر کردنش، حتما یه ورژن بامپ کنید و بعد بیلد بگیرید) قبلا من از bump-my-version استفاده می‌کردم. کاری که می‌کنن، ورژن فعلی رو از pyproject یا setup.py یا.. می‌خونن، ورژن فعلی رو پیدا می‌کنن توی تمام قسمت‌های پروژه، سپس شما اجرا می‌کنی: bump-my-version bump patch و این میاد در هر قسمت از پروژه که ورژن اصلی (مثلا 1.2.3 ثبت شده) رو تبدیل می‌کنه به 1.2.4. اگه از uv استفاده می‌کنید، با این روش هم می‌تونید ورژن رو بامپ کنید و خیلی بهتر و تمیزتره. منبع: https://blog.imsadra.dev/python-313-new-features-deprecations منبع: https://semver.org Join 👉 @lnxpylnxpy
1 229
12
واسه اینکه راحت‌تر درک کنید قدرت Genericها رو در پایتون، چند مثال پایین رو ببینید، قشنگ جا میوفته واستون. ساختار به این شکله: def FUNCTION_NAME[TYPES](ARGS..) -> TYPE: مثال: ```python def select[T](items: List[T]) -> T: ... پس داریم: python select(items=[1, 2, 3, 4, 5]) # T=int & List[T] = List[int] select(items=["a", "b", "c"]) # T=str & List[T] = List[str] select(items=[1.2, 1.3, 1.4]) # T=float & List[T] = List[Float] # Therefore, we have.. users = [User("Abby"), User("Chris"), User("Nick")] select(items=users) # T=User & List[T] = List[User] همونطور که محسوسه، T داره بصورت داینامیک، طبق دیتایی که توی items قرار می‌گیره، ماهیت و نوعش تغییر می‌کنه. پوینت کل ماجرا همینه. چرا اصلا اسمش T هست؟ اصلا مهم نیست اسمش چی باشه. یه سری مسائل هست که Conventionalان. یعنی یک سری قواعد نانوشته‌ای هستن که توسعه‌دهنده‌ها ازش بصورت مرامی، پیروی می‌کنن وگرنه این مثال هم کاملا درسته: python def convert[B](item: B) -> Tuple[B, B, B]: return (item,) یه تابع، با چند Generic Type: python def convert[A, B](first: A, second: B) -> Tuple[A, B]: return (first, second) ` منبع: https://blog.imsadra.dev/generic-typing-in-python Join 👉 @lnxpylnxpy
1 613
13
چرا Generic Typing مهمه؟ خیلی از برنامه‌نویسای پایتون هنگام استفاده از Type Hinting تنها از انواع مشخصی مانند str`، `int یا list[str] استفاده می‌کنن. اما زمانی که یک تابع یا کلاس باید با چندین نوع داده مختلف کار کنه، استفاده از Generic Typing باعث می‌شه هم انعطاف‌پذیری حفظ شه و هم Type Safety از بین نره. به جای اینکه برای هر نوع داده یک تابع جداگانه بنویسید، می‌تونید یک Type Variable تعریف کنید و نوع ورودی و خروجی رو به اون وابسته کنید. به این ترتیب ابزارهایی مثل MyPy و Pyright قادر خواهند بود خطاهای احتمالی رو پیش از اجرای برنامه تشخیص بدن. from typing import TypeVar T = TypeVar("T") def first(items: list[T]) -> T: return items[0] در این مثال، تابع first می‌تونه روی لیستی از هر نوع داده‌ای کار کنه؛ اما نوع خروجی دقیقاً با نوع عناصر لیست مطابقت داره. منبع: https://blog.imsadra.dev/generic-typing-in-python Join 👉 @lnxpylnxpy
1 951
14
نزدیک به ۵۰ تا مقاله پیرامون تجربیاتم در زمینه‌ها مختلف پایتون، وب، تست‌نویسی، برنامه‌نویسی، AI و.. نوشتم که همشون اینجا در دسترسن: blog.imsadra.dev هدفم اینه که مهم‌ترین‌ مقاله‌ها و مواردی که بیشترین بازدید رو داشتن رو انتخاب و به کمک AI به فارسی برگردونم و ترجمه و بصورت bite-sized، همینجا به اشتراک بذارم. اینطوری هم خسته نمی‌شید، هم مطالب در دسترسن. :) ❤️
2 015
15
اگه نیاز به نسخه pdf کتاب‌های مرتبط با برنامه‌نویسی داشتین، احتمالا اینجا پیداش کنین: @progerbooks (تبلیغ نیست، خودم یه سری کتاب ها رو میخواستم و دقیقا همون ویرایش ها رو داشت)
2 627
16
Немає тексту...
2 481
17
من برنامه‌نویسی در دبیرستان با csharp شروع کردم. کامپایلری بود، کد رو مینوشتی، کامپایل میشد و نهایتا یه فایل قابل اجرا بهت می‌داد که طبق منطقی که واسش برنامه‌نویسی کرده بودی، کار می‌کرد. اگه پروگرمت درست کار نمی‌کرد، دوباره باید ادیت می‌کردی، دوباره کامپایل و.. معقولانه بود. واسه شروع بد نبود. دید جالبی نسبت به برنامه نویسی بهم داد. بعد. رفتم سراغ پایتون. دیدم بهه بههه..! چه خوبه، سریع، بدون دردسر و خفنه ولی چرا نمیشه فایل اجرایی ازش گرفت؟ یعنی همیشه، پروگرمت هرجا می‌خواد بره، پایتونم باید اونجا نصب باشه؟ عهخ. این بده که.. اینجا بود که کم کم با مفهوم زبان های مفسری اشنا شدم. فهمیدم اون فایل اجرایی که csharp بهم میداد هم همچین standalone نبود.. حتما باید dot net نصب داشته باشی واسه اجراش و چون بیسیک ترین ابزار ها روی ویندوز، دات نت از نیازمندی‌هاشونه (حتی خود سیستم عامل ویندوز)، واسه همین حس میکنی برنامه ای که نوشتی همه جا کار می‌کنه، روی تمام سیستم ها اجرا میشه و به به و اینا. (اینو موقعی فهمیدم که روی لینوکس اولین پروگرم سی شارپم رو کامپایل و اجرا کردم) 😁 بعد رفتم سراغ embedded و iot. دیدم اونجا،‌ اکثر تمرکز دیگه سمت برنامه نویسی نیست. تقریبا ۷۰ درصد تمرکز سمت طراحی و معماری فیزیکی ماژول ها و الکترونیکه. برنامه نویسیش هم خیلی اصول خاصی نیاز نداره به رعایت کردن. (مگر در شرایط خاص که قرار باشه فریم ورک یا پروژه بزرگی رو پیاده کنی) پلن بعدی جاوا اسکریپت و ری‌اکت بود. اولش خیلی گنگ بود واسم. حتی همون اوایل مسیرم. یه فانکشن می‌نوشتم، الان کار می‌کرد، نیم ساعت بعد هرچی رانش میکردم جواب نمیداد. کلا js تو دیدم یه چیز به شدت unreliable و غیرقابل اعتماد بود. نمیدونم چرا. 😂 یکم جی اس خوندم و ریکت رو شروع کردم. قشنگ لمس کردم که یه کمپانی یا تیم، چقدر خوب می‌تونه یه مفهوم رو به کل عوض کنه و کلا یک ساختار و معماری جدید، به شدت قدرتمند،‌ زیبا و در عین حال باحال بسازه. ری‌اکت، روی خوش js رو بهم نشون داد. واقعا کیف کردم از کار کردن با ری‌اکت. دیدم نسبت به این اکوسیستم و برنامه‌نویسی یک‌نواختی که انجام میدادیم عوض شد. ناگفته نماند، شما توی ری‌اکت، یه سری ساختارها و قابلیت‌هایی می‌بینید که هرکدومشون می‌تونن یه کورس جداگانه باشن بس که به ظاهر ساده و زیبا هستن، ولی به شدت عمیق‌ان و سر از یه سری کانسپت‌های خیلی پایه‌ای در میارن. (دیگه یه سری از کتابخونه ها و پکیج هایی که واسه ری‌اکت درست شدنم نگم..) بعد از ری‌اکت، صرفا بخاطر نیاز، یکم کوچ کردم به سمت ری‌اکت نیتیو و expo. تجربه جالب بود. ولی خب پایتون یه چیز دیگه‌اس.. تو این مسیر، خیلی چیزا رو تجربه کردم. اینکه می‌گن ۱۰۰ درصد تمرکزت رو بذار روی یه زبان/فریم ورک یا تکنولوژی، بنظرم کاملا اشتباه هست. ناخوداگاه داره جلوی بروز خلاقیت در ذهنت رو میگیری. هر استکی دیدید باحاله، حتما یه چنگی بهش بزنید. در کنارش، سر کار هم برید و تایتل پروفایل کاریتون ثابت باشه. بنظرم اینجوری، تجربه شیرین‌تره، مسیر کمتر یکنواخته، خستگی کمتره، هیجان و کنجکاوی بیشتره و چیزی جز‌ خودپروری و پیشرفت درش نمی‌بینم. موفق باشید. :) ❤️
2 874
18
Ah shit.. here we go again. 🚬
2 396
19
بنظرم یه ترم جدید باید داشته باشیم تحت عنوان “Shipophobia” به خصوص تو این دوره که ابزارهایی مثل Claude و Codex و.. روند توسعه
بنظرم یه ترم جدید باید داشته باشیم تحت عنوان “Shipophobia” به خصوص تو این دوره که ابزارهایی مثل Claude و Codex و.. روند توسعه رو تغییر دادن. به زودی راجع بهش می‌نویسم. بنظرم یه ترس و احساس خطریه که شاید اکثر کسایی که حرفه‌ای (تا قبل از AI) کد می‌زدن تو این برهه باهاش مواجه‌‌ان. اینکه چطور باهاش مواجه شیم و بعنوان یه اهرم پیشرفت ازش استفاده کنیم رو واستون توضیح میدم.
3 091
20
خب شادباش می‌گم (؟!). یکی از زنجیرهایی که به پامون بسته بودن رو باز کردن و تنها یک گام به اینترنت آزاد (چیزی که حق انکارناپذیر مردمه و همه دنیا آزادانه ازش استفاده می‌کنن) نزدیک‌تر شدیم. همونجایی که همیشه بودیم؛ پس خوشحالی نداره. درضمن، تو این ۸۰-۹۰ روزی که پشت سر گذاشتیم، بی‌شرفی و شرافت خیلیا به مردم ثابت شد. امیدوارم هنوز امیدتون رو از دست نداده باشین. به امید روزهای بهتر. 💪❤️
3 185