هوش‌مصنوعی🔥برنامه‌نویسی | کدینگ‌یار
2.66K subscribers
21 photos
14 videos
5 files
81 links
Download Telegram
#خبر #هوش_مصنوعی #ChatGPT

🔄 حالا می‌تونید توی ChatGPT بین دو اکانت جابه‌جا بشید

قابلیت جابه‌جایی بین اکانت‌ها به ChatGPT اضافه شد. می‌تونید هم‌زمان با دو اکانت وارد بمونید و بدون خروج، بین‌شون سوییچ کنید. این قابلیت روی وب فعاله و روی اپ iOS و اندروید هم کم‌کم در حال عرضه‌ست.

چت‌ها، حافظه، فایل‌ها و اشتراک هر اکانت جدا می‌مونه و پلن پولی با سوییچ کردن به اکانت دیگه منتقل نمی‌شه. برای اضافه کردن اکانت دوم، روی وب از منوی حساب گزینهٔ Add account و توی موبایل از تنظیمات گزینهٔ Switch account رو بزنید.

🔗 راهنمای رسمی OpenAI رو اینجا بخونید
‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
❤3
#خبر #هوش_مصنوعی #Gemini

💎 کلی قابلیت تازه به Gemini اضافه شد

گوگل توی به‌روزرسانی جدید «Gemini Drops» این قابلیت‌ها رو به اپ Gemini آورد:

▫️ مدل Gemini 4 Argon برای کارهای پیچیده مثل ساخت وب‌اپ، فایل سه‌بعدی، اسلاید و گزارش
▫️ اتصال Antigravity به اپ مک، برای رفتن مستقیم از چت به محیط کدنویسی محلی
▫️ اپ Gemini برای ویندوز که با یه میان‌بر کیبورد باز می‌شه
▫️ قابلیت Skills برای ذخیرهٔ دستورهای پرتکرار و اجرای دوباره‌شون
▫️ مدل موسیقی Lyria 3.5 با انتخاب ژانر، طول آهنگ و حالت باکلام یا بی‌کلام
▫️ اتصال Gemini Notebook و اپ‌هایی مثل Adobe و Strava به چت

🔗 معرفی رسمی Gemini رو اینجا ببینید
‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
❤4
#خبر #هوش_مصنوعی #Gemini
📚 صدها کتاب درسی رایگان به Gemini Notebook اضافه شد
گوگل قابلیت تازه‌ای به اسم Textbooks رو به Gemini Notebook (همون NotebookLM سابق) اضافه کرده. حالا می‌تونید صدها کتاب درسی رایگان از ناشرهایی مثل OpenStax و Open Textbook Library رو مستقیم به نوت‌بوک‌تون اضافه کنید.
بعد از اضافه کردن کتاب، جواب سؤال‌ها فقط بر اساس همون کتاب و با ارجاع به صفحه‌هاش داده می‌شه و می‌تونید ازش خلاصه درسی، آزمون و فلش‌کارت بسازید. کافیه توی نوت‌بوک گزینهٔ Add sources و بعد Textbooks رو بزنید. این قابلیت فعلاً برای کاربران آمریکا و هند فعاله.
🔗 اطلاعیهٔ رسمی گوگل رو اینجا بخونید
‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
❤1👍1
#آموزش #جنگو
‌
⚡️
فقط اسم محصول‌ها رو از دیتابیس لازم دارین؟ لازم نیست جنگو کل آبجکت‌ها رو بسازه!
‌
متد values_list با flat=True فقط همون یک ستون رو از دیتابیس می‌خونه و به‌جای آبجکت‌های مدل، خودِ مقدارها رو برمی‌گردونه. فرض کنید مدل Product با فیلدهای name و price داریم و سه محصول Book (120)، Pen (15) و Bag (300) توی دیتابیس هست:
‌
qs = Product.objects.order_by("price")
names = qs.values_list("name", flat=True)
print(list(names))

‌
خروجی:
‌
['Pen', 'Book', 'Bag']

‌
نتیجه یک لیست معمولی پایتونه از اسم‌ها، مرتب‌شده بر اساس قیمت؛ آماده برای حلقه، ساختن فایل CSV یا فرستادن توی پاسخ API.✔️
پشت صحنه: فقط همون ستون خونده می‌شه
با چاپ کردن query می‌شه SQL ساخته‌شده رو دید:
‌
qs = Product.objects.order_by("price")
names = qs.values_list("name", flat=True)
print(names.query)

‌
خروجی:
‌
SELECT "shop_product"."name" AS "name" FROM "shop_product" ORDER BY "shop_product"."price" ASC

‌
توی SELECT فقط ستون name اومده. طبق مستندات جنگو، وقتی فقط چند فیلد لازم دارید و به امکانات آبجکت مدل نیازی نیست، گرفتن همون فیلدها بهینه‌تره؛ مخصوصاً برای جدول‌هایی با ستون‌های زیاد یا متن‌های بلند.💎
چند ستون: تاپل، namedtuple یا دیکشنری
اگه چند فیلد بدید، هر ردیف یک تاپل می‌شه. با named=True تاپل اسم‌دار (namedtuple) می‌گیرید و متد values هم هر ردیف رو به شکل دیکشنری برمی‌گردونه:
‌
qs = Product.objects.order_by("price")
print(list(qs.values_list("name", "price")))
print(qs.values_list("name", "price", named=True)[0])
print(qs.values("name", "price")[0])

‌
خروجی:
‌
[('Pen', 15), ('Book', 120), ('Bag', 300)]
Row(name='Pen', price=15)
{'name': 'Pen', 'price': 15}

⚠️
پارامتر flat فقط با یک فیلد
اگه flat=True رو با بیشتر از یک فیلد بدید، جنگو خطا می‌ده:
‌
Product.objects.values_list("name", "price", flat=True)

‌
خروجی (خط آخر خطا):
‌
TypeError: 'flat' is not valid when values_list is called with more than one field.

‌
▫️ برای گرفتن یک مقدار از یک ردیف خاص، بعدش get رو صدا بزنید:
‌
qs = Product.objects.values_list("price", flat=True)
print(qs.get(name="Book"))

‌
خروجی:
‌
120

‌
▫️ چیزی که برمی‌گرده آبجکت مدل نیست؛ پس متدهای مدل و save روی این مقدارها کار نمی‌کنن. هر جا آبجکت کامل لازم دارید، همون کوئری معمولی رو بنویسید.
‌
▫️ نتیجه هنوز یک QuerySet تنبله (lazy)؛ یعنی تا وقتی ازش استفاده نکنید (مثلاً با list یا یک حلقه) کوئری‌ای به دیتابیس نمی‌ره و می‌شه قبلش filter و order_by هم بهش زد.
‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
‌
‌
‌
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
هوش‌مصنوعی🔥برنامه‌نویسی | کدینگ‌یار
#کوئیز #پایتون ‌ پیش‌نیاز: برش (slicing) لیست، گام و اندیس منفی ⏳ پاسخ کوییز ۲۴ ساعت دیگه توی همین کانال میاد. ‌ @codingyar
#پاسخ_کوییز #پایتون
‌
🔔 پاسخ کوییز بالا (همین کوییزی که بهش ریپلای زدم) رو در زیر ببینید ⬇️
‌
✅ جواب درست: «[10, 30, 50] [40, 50]»
‌
برش لیست سه بخش داره: شروع، پایان و گام (start:stop:step). هر بخشی که خالی بمونه مقدار پیش‌فرضش رو می‌گیره: شروع از اول لیست، پایان تا آخر لیست و گام برابر ۱. عضوِ اندیسِ پایان هم هیچ‌وقت توی نتیجه نمیاد.
‌
توی خط دوم، [::2] یعنی از اول تا آخر با گام ۲؛ پس اندیس‌های 0 و 2 و 4 برداشته می‌شن و step برابر [10, 30, 50] می‌شه.
‌
توی خط سوم، اندیس منفی از آخر لیست می‌شمره: ‎-1 عضو آخره (50) و ‎-2 عضو یکی مونده به آخر (40). برش [-2:] از 40 شروع می‌شه و تا انتها می‌ره؛ پس last برابر [40, 50] می‌شه.
‌
اشتباه رایج: گزینهٔ «[20, 40] [40, 50]» یعنی فکر کنیم گام ۲ از عضو دوم شروع می‌شه؛ این نتیجهٔ برش [1::2] هست. گزینهٔ «[10, 30, 50] [50]» یعنی [-2:] رو با [-1:] قاطی کنیم. گزینهٔ «[10, 30] [40]» هم یعنی فکر کنیم عضو آخر لیست توی برش‌هایی که پایانشون خالیه نمیاد، در حالی که پایانِ خالی یعنی تا آخرِ لیست
‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
❤2
⚡️#آموزش #SQL
‌
می‌دونستین COUNT(*) و COUNT(email) روی یک جدول ممکنه دو عدد متفاوت بدن؟
‌
تابع COUNT(*) همهٔ ردیف‌ها رو می‌شمره، ولی COUNT(email) فقط ردیف‌هایی رو می‌شمره که email اون‌ها NULL نباشه. فرض کنید جدول users با ستون‌های name، city و email چهار کاربر داره و ایمیل یکی‌شون (Sara) خالیه، یعنی NULL:
‌
SELECT COUNT(*) AS all_rows,
COUNT(email) AS with_email
FROM users;

‌
خروجی (توی SQLite):
‌
all_rows  with_email
-------- ----------
4 3

‌
پس برای «تعداد کل کاربرها» از COUNT(*) استفاده کنید؛ COUNT(email) یعنی «تعداد کاربرهایی که ایمیل دارن». اگه این دو تا قاطی بشن، عددهای گزارش و داشبورد بی‌صدا غلط درمیان.
‌
✔️ شمردن مقدارهای یکتا با DISTINCT
با COUNT(DISTINCT city) هر مقدار فقط یک بار شمرده می‌شه (اونم باز بدون NULLها):
‌
SELECT COUNT(city) AS cities,
COUNT(DISTINCT city) AS unique_cities
FROM users;

‌
خروجی:
‌
cities  unique_cities
------ -------------
4 3

‌
دو نفر از Tehran هستن، پس از چهار شهر ثبت‌شده فقط سه شهر متفاوت داریم.
‌
💎 شمارش برای هر گروه با GROUP BY
همین قانون توی گروه‌بندی هم برقراره؛ مثلاً تعداد کاربرهای ایمیل‌دار هر شهر:
‌
SELECT city, COUNT(email) AS with_email
FROM users
GROUP BY city
ORDER BY city;

‌
خروجی:
‌
city   with_email
------ ----------
Shiraz 0
Tabriz 1
Tehran 2

‌
برای Shiraz عدد 0 اومده، چون تنها کاربرش ایمیل نداره؛ اگه COUNT(*) می‌نوشتیم، 1 می‌گرفتیم.
‌
⚠️ برای پیدا کردن NULL از = استفاده نکنید
مقایسهٔ هر چیزی با NULL (حتی خودِ NULL) نتیجه‌اش «نامعلومه»، نه درست؛ پس = NULL هیچ ردیفی رو پیدا نمی‌کنه و باید IS NULL بنویسید:
‌
SELECT COUNT(*) AS wrong FROM users WHERE email = NULL;
SELECT COUNT(*) AS correct FROM users WHERE email IS NULL;

‌
خروجی:
‌
wrong
-----
0
correct
-------
1

‌
▫️ توابع SUM و AVG هم NULLها رو نادیده می‌گیرن؛ مثلاً میانگین 10، 20 و NULL می‌شه 15، نه 10.
‌
▫️ این رفتار مخصوص SQLite نیست؛ طبق مستندات PostgreSQL و MySQL هم COUNT(*) همهٔ ردیف‌ها رو می‌شمره و COUNT(ستون) فقط مقدارهای غیر NULL رو. فقط ظاهر خروجی توی هر ابزار فرق داره.
‌
▫️ برای امتحان، sqlite3 رو با نمایش جدولی باز کنید:
‌
sqlite3 -header -column test.db

‌
بعد جدول نمونه رو بسازید و کوئری‌های بالا رو اجرا کنید:
‌
CREATE TABLE users (name TEXT, city TEXT, email TEXT);
INSERT INTO users VALUES
('Ali', 'Tehran', 'ali@example.com'),
('Sara', 'Shiraz', NULL),
('Reza', 'Tehran', 'reza@example.com'),
('Mina', 'Tabriz', 'mina@example.com');

‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
هوش‌مصنوعی🔥برنامه‌نویسی | کدینگ‌یار
#کوئیز #پایتون ‌ پیش‌نیاز: عملگرهای or و and، مقدارهای truthy و falsy ⏳ پاسخ کوییز ۲۴ ساعت دیگه توی همین کانال میاد. ‌ @codingyar
#پاسخ_کوییز #پایتون
‌
🔔 پاسخ کوییز بالا (همین کوییزی که بهش ریپلای زدم) رو در زیر ببینید ⬇️
‌
✅ جواب درست: «guest 0»
‌
عملگرهای or و and توی پایتون لزوماً True یا False برنمی‌گردونن؛ همیشه یکی از خودِ دو مقدار رو برمی‌گردونن. مقدارهایی مثل رشتهٔ خالی، عدد 0، لیست خالی و None «falsy» حساب می‌شن و بقیه «truthy».
‌
عملگر or از چپ شروع می‌کنه و اولین مقدار truthy رو برمی‌گردونه (اگه هیچ‌کدوم truthy نباشه، مقدار آخر رو). چون name رشتهٔ خالیه و falsy حساب می‌شه، نتیجه مقدار دوم یعنی "guest" می‌شه و user برابر guest هست.
‌
عملگر and برعکس عمل می‌کنه: اولین مقدار falsy رو برمی‌گردونه (اگه همه truthy باشن، مقدار آخر رو). چون count برابر 0 و falsy هست، پایتون همون‌جا متوقف می‌شه و اصلاً به 10 نمی‌رسه؛ پس result خودِ عدد 0 می‌شه.
‌
اشتباه رایج: گزینهٔ «guest False» یعنی فکر کنیم and همیشه True یا False برمی‌گردونه، در حالی که خودِ مقدار falsy یعنی 0 برمی‌گرده. گزینهٔ «True False» یعنی همین فکر رو برای هر دو عملگر بکنیم. گزینهٔ «guest 10» یعنی فکر کنیم and هم مثل or دنبال مقدار truthy می‌گرده و از 0 رد می‌شه.
‌
این رفتار برای مقدار پیش‌فرض خیلی کاربردیه (مثل name or "guest")، فقط حواستون باشه که 0 و لیست خالی هم falsy هستن و با این روش جایگزین می‌شن.

‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
#خبر #هوش_مصنوعی #ClaudeCode
‌
✨ دستور ultrathink به Claude Code برگشت
📰 قابلیت جدید
‌
وقتی تسکی که به Claude Code دادید سخت‌تر از انتظار درمیاد، لازم نیست کار رو قطع کنید و از اول شروع کنید. همون وسط کار، کافیه کلمه ultrathink رو تایپ کنید تا میزان فکر و تلاش مدل برای ادامه همون نوبت بیشتر بشه.
‌
تیم Claude Code این دستور رو مدتی خاموش کرده بود و حالا در آخرین نسخه CLI دوباره فعاله. اگه کار نکرد، اول Claude Code رو به‌روز کنید:
claude update

‌
🎁 این دستور فقط روی همون نوبت اثر داره و طبیعتاً توکن بیشتری مصرف می‌کنه، پس برای کارهای ساده لازمش ندارید.
‌
🔗 اعلام بازگشت ultrathink در X
‌
‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
#آموزش #پایتون
‌
⚡️ می‌دونستین با defaultdict دیگه لازم نیست قبل از اضافه کردن به دیکشنری، وجود کلید رو چک کنید؟
‌
توی defaultdict از ماژول collections، اگه کلیدی وجود نداشته باشه، خودش یک مقدار پیش‌فرض براش می‌سازه. مثلاً برای گروه‌بندی کلمه‌ها بر اساس حرف اولشون:
‌
from collections import defaultdict

words = ["apple", "bread", "avocado", "banana", "cherry"]
groups = defaultdict(list)
for word in words:
groups[word[0]].append(word)
print(dict(groups))

‌
خروجی:
‌
{'a': ['apple', 'avocado'], 'b': ['bread', 'banana'], 'c': ['cherry']}

‌
این‌جا list یعنی «برای هر کلید جدید یک لیست خالی بساز»؛ پس append همیشه کار می‌کنه و دیگه نه if لازمه، نه به KeyError می‌خوریم.
‌
✔️ شمارش با defaultdict(int)
تابع int اگه بدون ورودی صدا زده بشه، عدد 0 برمی‌گردونه؛ پس شمارش هر کلید جدید از صفر شروع می‌شه:
‌
from collections import defaultdict

text = "red blue red green red"
counts = defaultdict(int)
for color in text.split():
counts[color] += 1
print(dict(counts))

‌
خروجی:
‌
{'red': 3, 'blue': 1, 'green': 1}

‌
اگه فقط شمارش لازم دارید، Counter امکانات بیشتری مثل most_common داره؛ defaultdict جایی به کار میاد که مقدار پیش‌فرض چیز دیگه‌ای باشه (لیست، مجموعه، یا هر مقدار دلخواه).
‌
💎 هر مقدار پیش‌فرضی که بخواید
ورودی defaultdict می‌تونه هر تابعی باشه که بدون آرگومان صدا زده می‌شه؛ مثلاً یک lambda:
‌
from collections import defaultdict

roles = defaultdict(lambda: "guest")
roles["ali"] = "admin"
print(roles["ali"], roles["sara"])

‌
خروجی:
‌
admin guest

‌
کاربر sara اصلاً ثبت نشده بود، ولی به‌جای KeyError مقدار guest گرفت.
‌
⚠️ فقط خوندن یک کلید هم اون رو اضافه می‌کنه
وقتی با براکت سراغ کلیدی می‌رید که وجود نداره، defaultdict اون کلید رو با مقدار پیش‌فرض به دیکشنری اضافه می‌کنه؛ ولی متد get این کار رو نمی‌کنه:
‌
from collections import defaultdict

scores = defaultdict(int)
print(scores.get("sara"))
print(len(scores))
print(scores["ali"])
print(len(scores))

‌
خروجی:
‌
None
0
0
1

‌
متد get مقدار None داد و چیزی اضافه نشد (طول 0)؛ ولی scores["ali"] عدد 0 داد و کلید ali رو هم ساخت (طول 1). پس برای «فقط چک کردن» از in یا get استفاده کنید.
‌
▫️ برای چاپ یا تبدیل به دیکشنری معمولی، dict(groups) بنویسید؛ وگرنه print خروجی رو به شکل defaultdict(<class 'list'>, ...) نشون می‌ده.
‌
▫️ کلاس defaultdict زیرکلاس dict هست، پس هر جا dict کار می‌کنه (مثلاً json.dumps) این هم کار می‌کنه.
‌
▫️ نوع مقدار رو بدون پرانتز بدید: defaultdict(list) درسته؛ defaultdict(list()) خطای TypeError می‌ده، چون ورودی باید یک تابع باشه، نه یک لیست.
‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👏1
هوش‌مصنوعی🔥برنامه‌نویسی | کدینگ‌یار
#کوئیز #پایتون ‌ پیش‌نیاز: متد find رشته‌ها و شمارش اندیس از صفر ⏳ پاسخ کوییز ۲۴ ساعت دیگه توی همین کانال میاد. ‌ @codingyar
#پاسخ_کوییز #پایتون
‌
🔔 پاسخ کوییز بالا (همین کوییزی که بهش ریپلای زدم) رو در زیر ببینید ⬇️
‌
✅ جواب درست: «2 ‎-1»
‌
متد find دنبال یک زیررشته توی رشته می‌گرده و اندیس (شمارهٔ جایگاه) اولین جایی که پیدا بشه رو برمی‌گردونه. اندیس‌ها توی پایتون از صفر شروع می‌شن: توی banana حرف b اندیس 0 داره، a اندیس 1 و اولین n اندیس 2؛ پس first برابر 2 می‌شه.
‌
نکتهٔ ویژهٔ این کوییز: اگه زیررشته پیدا نشه، find نه خطا می‌ده و نه None برمی‌گردونه؛ طبق مستندات پایتون عدد ‎-1 رو برمی‌گردونه. چون z توی banana نیست، missing برابر ‎-1 می‌شه.
‌
اشتباه‌های رایج: گزینهٔ «3 ‎-1» یعنی شمردن جایگاه‌ها از یک، مثل شمردن معمولی خودمون. گزینهٔ «2 None» یعنی فکر کنیم وقتی چیزی پیدا نشه، «هیچی» برمی‌گرده. گزینهٔ «ValueError» هم از اینجا میاد که متد index دقیقاً همین کار رو می‌کنه، ولی وقتی چیزی پیدا نشه واقعاً ValueError می‌ده؛ find این‌طوری نیست.
‌
پس اگه فقط می‌خواید بدونید یک متن داخل رشته هست یا نه، عملگر in خواناتره؛ و اگه جایگاهش رو لازم دارید، از find استفاده کنید و حتماً حالت ‎-1 رو هم چک کنید.
‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
#خبر #هوش_مصنوعی #ClaudeAPI
‌
✨ قابلیت Message threads؛ API کلود برای مکالمه‌های طولانی سریع‌تر شد
📰 قابلیت جدید
‌
اگه با Messages API ایجنت یا چت طولانی می‌سازید، می‌دونید که هر نوبت باید کل مکالمه و نتیجه ابزارها دوباره فرستاده بشه. هرچه گفتگو بزرگ‌تر بشه، این بار اضافه زمان شروع جواب رو بالا می‌بره.
‌
Anthropic با Message threads که حالا بتای عمومی شده، این کار رو ساده کرده: اولین درخواست رو کامل می‌فرستید و thread می‌سازید؛ از نوبت بعد فقط پیام‌های تازه و شناسه پاسخ قبلی کافیه. Anthropic می‌گه در Claude Code با درخواست‌های ۵۰۰ هزار تا یک میلیون توکنی، میانه زمان رسیدن اولین توکن حدود ۳۵٪ کمتر شده.
‌
🛠 برای استفاده، هدر بتا و این پارامترها رو اضافه کنید:
anthropic-beta: message-threads-2026-08-12

"thread": {"type": "create"}

"thread": {"type": "continue",
"previous_message_id": "<id>"}

‌
⚠️ چند نکته: thread بعد از ۵ دقیقه بی‌استفاده‌ماندن منقضی می‌شه و باید کل مکالمه رو دوباره بفرستید. مصرف توکن تغییری نمی‌کنه، چون Claude باز هم کل گفتگو رو می‌خونه؛ فقط درخواست کوچک‌تر و شروع جواب سریع‌تره. روی پلتفرم Claude، AWS، Microsoft Foundry و Google Cloud با نرخ عادی در دسترسه.
‌
🔗 مستندات رسمی Message threads
‌
‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
❤2
#آموزش #گیت
‌
⚡️ می‌دونستین برای دور ریختن تغییرات یک فایل، دستور مخصوص git restore وجود داره؟
‌
دستور git restore تغییرات stage‌نشدهٔ یک فایل رو دور می‌ریزه و اون رو به نسخهٔ داخل stage برمی‌گردونه (اگه چیزی stage نکرده باشید، یعنی همون آخرین کامیت). فرض کنید توی app.py یک خط دیباگ اضافه کردید و می‌خواید پاکش کنید:
‌
echo "print('debug')" >> app.py
git status --short
git restore app.py
git status --short
cat app.py

‌
خروجی:
‌
 M app.py
print('v2')

‌
خط اول خروجی مال git status قبل از restore هست (حرف M یعنی فایل تغییر کرده). بعد از restore، دومین git status چیزی چاپ نمی‌کنه و cat نشون می‌ده فایل برگشته به محتوای آخرین کامیت.
‌
✔️ بیرون آوردن فایل از stage با ‎--staged
اگه فایلی رو اشتباهی add کردید، git restore --staged فقط اون رو از stage بیرون میاره و تغییراتش توی فایل می‌مونه:
‌
echo "print('debug')" >> app.py
git add app.py
git status --short
git restore --staged app.py
git status --short

‌
خروجی:
‌
M  app.py
M app.py

‌
جای حرف M عوض شد: ستون اول یعنی تغییر stage شده و ستون دوم یعنی تغییر فقط توی خود فایله. اگه می‌خواید هم از stage بیرون بیاد و هم تغییراتش پاک بشه، از این استفاده کنید:
‌
git restore --staged --worktree app.py

‌
💎 برگردوندن یک فایل از کامیت‌های قبلی
با --source می‌تونید نسخهٔ یک فایل رو از هر کامیت یا برنچی بیارید، بدون این‌که بقیهٔ پروژه تغییر کنه. این‌جا app.py دو کامیت داره (اول v1، بعد v2):
‌
git restore --source=HEAD~1 app.py
cat app.py
git status --short

‌
خروجی:
‌
print('v1')
M app.py

‌
حالا فایل نسخهٔ قبلی رو داره و به‌عنوان یک تغییر جدید دیده می‌شه؛ اگه همین رو می‌خواید، کامیتش کنید.
‌
⚠️ تغییرات دورریخته‌شده برنمی‌گردن
تغییری که هیچ‌وقت کامیت نشده، بعد از git restore جایی ذخیره نمی‌شه و reflog هم کمکی نمی‌کنه. اگه مطمئن نیستید، اول با git stash یک نسخه ازش نگه دارید.
‌
▫️ دستور git restore . همهٔ فایل‌های تغییرکرده توی پوشهٔ فعلی رو برمی‌گردونه، ولی به فایل‌های جدید (untracked) دست نمی‌زنه:
‌
echo "print('debug')" >> app.py
echo "temp" > notes.txt
git restore .
git status --short

‌
خروجی:
‌
?? notes.txt

‌
تغییر app.py پاک شد، ولی notes.txt (با علامت ??) سر جاشه.
‌
▫️ دستور restore از Git 2.23 (سال ۲۰۱۹) اضافه شده؛ قبل از اون همین کار با git checkout -- app.py انجام می‌شد.
‌
▫️ برای امتحان، یک مخزن تمرینی با دو کامیت بسازید و دستورهای بالا رو داخلش اجرا کنید:
‌
git init -q project
cd project
git config user.name "Demo"
git config user.email "demo@example.com"
echo "print('v1')" > app.py
git add app.py
git commit -q -m "first version"
echo "print('v2')" > app.py
git commit -q -am "second version"

‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
هوش‌مصنوعی🔥برنامه‌نویسی | کدینگ‌یار
#کوئیز #پایتون ‌ پیش‌نیاز: متد split رشته‌ها و تابع len ⏳ پاسخ کوییز ۲۴ ساعت دیگه توی همین کانال میاد. ‌ @codingyar
#پاسخ_کوییز #پایتون
‌
🔔 پاسخ کوییز بالا (همین کوییزی که بهش ریپلای زدم) رو در زیر ببینید ⬇️
‌
✅ جواب درست: «4 blue»
‌
متد split با جداکنندهٔ کاما، رشته رو هر جا کاما ببینه می‌بُره. توی red,green,,blue سه تا کاما داریم، پس چهار تکه به دست میاد: red، green، یک رشتهٔ خالی (بین دو کامای پشت‌سرهم) و blue.
‌
یعنی parts برابر ['red', 'green', '', 'blue'] می‌شه؛ طولش 4 هست و آخرین عضوش blue.
‌
اشتباه‌های رایج: گزینهٔ «3 blue» یعنی فکر کنیم رشتهٔ خالی بین دو کاما حذف می‌شه. گزینهٔ «5 blue» هم از شمردن اشتباه میاد؛ تعداد تکه‌ها همیشه یکی بیشتر از تعداد جداکننده‌هاست.
‌
نکته: اگه split رو بدون ورودی صدا بزنید، بر اساس فاصله‌ها می‌بُره و تکه‌های خالی رو حذف می‌کنه؛ ولی با یک جداکنندهٔ مشخص مثل کاما، تکه‌های خالی سر جاشون می‌مونن.
‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
#خبر #هوش_مصنوعی #مدل_متن‌باز
‌
🚀 مدل Hy4 تنسنت رسماً منتشر شد
📰 خبر کاربردی
‌
تنسنت نسخهٔ کامل Hy4 رو عرضه کرد؛ مدلی که قبلاً به‌صورت پیش‌نمایش (Hy4 preview) منتشر شده بود. تازگی‌هاش اینه: برای اولین بار درک تصویر داره و می‌تونه با خط فرمان و رابط گرافیکی کار کنه (computer use). کانتکستش حدود یک میلیون توکنه و از tool calling و خروجی ساختاریافته پشتیبانی می‌کنه.
‌
تنسنت می‌گه Hy4 جزو مدل‌های متن‌باز برتره. توی نمودار خودش از DeepSeek و GLM جلوئه، ولی توی بیشتر بنچمارک‌ها هنوز پشت Claude Opus 5.5 و GPT 6.1 Sol قرار داره. وزن‌های مدل هنوز منتشر نشده؛ تنسنت می‌گه «در چند روز آینده» همراه سیستم‌کارت میاد (نسخهٔ preview از قبل متن‌بازه).
‌
🛠 برای استفاده از API، مدل رو با این شناسه توی OpenRouter پیدا می‌کنید:
‌
tencent/hy4

‌
💰 قیمت رسمی حدود ۰٫۹۰ دلار برای هر میلیون توکنِ ورودی و ۲٫۷۰ دلار برای خروجیه. OpenRouter فعلاً با ۵۰٪ تخفیف عرضه‌اش کرده (حدود ۰٫۴۲ و ۱٫۲۵ دلار) و مدت این تخفیف مشخص نیست. WorkBuddy و CodeBuddy هم تا ۲۴ آبان رایگان هستن.
‌
اعلام رسمی تنسنت
‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
❤2
#آموزش #لینوکس
‌
⚡️می‌دونستین با find می‌شه فایل‌ها رو بر اساس اسم، حجم یا تاریخ تغییر پیدا کرد؟
‌
دستور find از پوشه‌ای که بهش می‌دید شروع می‌کنه و همهٔ زیرپوشه‌ها رو هم می‌گرده. مثلاً همهٔ فایل‌های لاگ پروژه:
‌
find . -name "*.log"

‌
خروجی:
‌
./logs/old.log
./logs/big.log
./logs/app.log

‌
نقطه یعنی «از همین پوشه». الگو رو حتماً توی کوتیشن بذارید تا شل خودش ستاره رو باز نکنه. ترتیب خروجی ممکنه روی سیستم شما فرق کنه.
‌
✔️پیدا کردن فایل‌های حجیم
گزینهٔ -type f یعنی فقط فایل (نه پوشه) و -size +1M یعنی بزرگ‌تر از ۱ مگابایت:
‌
find . -type f -size +1M

‌
خروجی:
‌
./logs/big.log

‌
به‌جای M می‌تونید k (کیلوبایت) یا G (گیگابایت) هم بنویسید. برای دیدن حجم هر فایل، du رو به آخر دستور اضافه کنید:
‌
find . -type f -size +1M -exec du -h {} +

‌
خروجی:
‌
2.0M ./logs/big.log

‌
💎فایل‌های قدیمی با ‎-mtime
گزینهٔ -mtime +7 یعنی فایل‌هایی که بیشتر از ۷ روزه تغییر نکردن (به‌خاطر گرد شدن روزها، عملاً ۸ روز و بیشتر) و -mtime -1 یعنی فایل‌هایی که توی ۲۴ ساعت گذشته تغییر کردن:
‌
find . -name "*.log" -mtime +7

‌
خروجی:
‌
./logs/old.log

‌
این‌جا old.log ده روز پیش تغییر کرده و بقیهٔ فایل‌ها همین الان ساخته شدن.
‌
⚠️قبل از ‎-delete حتماً لیست رو ببینید
اول دستور رو بدون -delete اجرا کنید و وقتی لیست درست بود، -delete رو به آخرش اضافه کنید:
‌
find . -name "*.log" -mtime +7 -delete
find . -name "*.log"

‌
خروجی:
‌
./logs/big.log
./logs/app.log

‌
فقط old.log پاک شد. طبق مستندات find، اگه ‎-delete رو اول دستور بنویسید، find سعی می‌کنه همه‌چیزِ زیر پوشهٔ شروع رو پاک کنه؛ پس جاش همیشه آخر دستوره.
‌
▫️ برای جست‌وجو بدون حساسیت به حروف بزرگ و کوچک، به‌جای ‎-name از ‎-iname استفاده کنید:
‌
find src -iname "*.py"

‌
خروجی:
‌
src/Utils.PY
src/main.py

‌
▫️ برای امتحان، این پوشهٔ نمونه رو بسازید و دستورهای بالا رو همون‌جا اجرا کنید:
‌
mkdir -p demo/logs demo/src
cd demo
echo "error" > logs/app.log
echo "ok" > logs/old.log
touch -d "10 days ago" logs/old.log
head -c 2M /dev/zero > logs/big.log
echo "print(1)" > src/main.py
echo "print(2)" > src/Utils.PY

‌
آموزش هوش مصنوعی و برنامه نویسی 👇
@codingyar
وبسایت آموزشی:
www.codingyar.com
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3