🔍 وقتی برای اسکرپ با Inspect سایت کار میکنیم، گاهی نیاز داریم خروجی توابعی مثل fetch رو دیباگ کنیم.
اما مشکل اینجاست که ابزار مستقیم و مشخصی نداریم که بفهمیم این خروجی کجا استفاده شده یا چطور ازش رد شده. 😕
برای حل این موضوع باید این کار رو انجام بدیم:
1️⃣ اول سورس رو در Inspect باز کنیم و اسکریپت مورد نظرمون رو override میکنیم و اگر فایلها Minify یا Build شده بودن، اونها رو Beautify کنیم. اسکریپت مورد نظر منظور بخشیه که کد استفاده شده و یا اگه تابع گلوبال مثل fetch هست اولین اسکریپتی که فراخوانی میشه باید باشه
2️⃣ بعد متغیر یا تابع مورد نظرمون و Proxy کنیم.
3️⃣ با این روش وقتی خروجی داده میشه، میتونیم با اضافه کردن debugger داخل Proxy، دیباگر رو فعال کنیم و توی Call Stack ببینیم که چطوری و کجا از این خروجی استفاده شده. 👀
مثال:
💡 با این روش، کنترل کاملی روی خروجی توابع داریم و میتونیم راحتتر مشکلها رو ردیابی کنیم!
اما مشکل اینجاست که ابزار مستقیم و مشخصی نداریم که بفهمیم این خروجی کجا استفاده شده یا چطور ازش رد شده. 😕
برای حل این موضوع باید این کار رو انجام بدیم:
1️⃣ اول سورس رو در Inspect باز کنیم و اسکریپت مورد نظرمون رو override میکنیم و اگر فایلها Minify یا Build شده بودن، اونها رو Beautify کنیم. اسکریپت مورد نظر منظور بخشیه که کد استفاده شده و یا اگه تابع گلوبال مثل fetch هست اولین اسکریپتی که فراخوانی میشه باید باشه
2️⃣ بعد متغیر یا تابع مورد نظرمون و Proxy کنیم.
3️⃣ با این روش وقتی خروجی داده میشه، میتونیم با اضافه کردن debugger داخل Proxy، دیباگر رو فعال کنیم و توی Call Stack ببینیم که چطوری و کجا از این خروجی استفاده شده. 👀
مثال:
const originalFetch = window.fetch;
window.fetch = function (...args) {
console.log("[fetch]", args[0]);
return originalFetch(...args).then(response => {
const url = response.url || (args[0] && args[0].toString());
if (url.includes("heavyweight")) {
console.log("[Intercepted fetch]", url);
['text', 'json', 'blob', 'arrayBuffer', 'formData'].forEach(method => {
const original = response[method].bind(response);
response[`_${method}`] = original;
response[method] = function (...mArgs) {
console.log(`[${method}()] called on heavyweight URL`);
debugger; // دیباگر اینجا متوقف میشه
return original(...mArgs);
};
});
if (response.body && typeof response.body.getReader === 'function') {
const originalGetReader = response.body.getReader.bind(response.body);
response.body.getReader = function(...readerArgs) {
const reader = originalGetReader(...readerArgs);
console.log("ReadableStream.getReader() called");
const originalRead = reader.read.bind(reader);
reader.read = async function(...readArgs) {
const result = await originalRead(...readArgs);
console.log("ReadableStream chunk read:", result);
debugger; // توقف روی هر chunk خوانده شده
return result;
};
debugger;
return reader;
};
}
}
return response;
});
};
💡 با این روش، کنترل کاملی روی خروجی توابع داریم و میتونیم راحتتر مشکلها رو ردیابی کنیم!
❤5
کانفیگ با لوکیشن اوکراین کسی داره برای دو سه ساعت؟
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
دوستان کدوم شبکه موقع انتقال تتر کمترین fee رو داره؟
Programs must be written for people to read, and only incidentally for machines to execute.
— Hal Abelson and Gerald Sussman
👍1
🔗 ممکنه بخواید node و پکیج های اون رو از windows روی محیط شبیه ساز لینوکسی alias کنید من این کد رو نوشتم و استفاده میکنم شاید بدردتون خورد
🔅 چون شبیه ساز های لینوکسی معمولا از NTFS پشتیبانی نمیکنن با حجم بالای node_modules یا استفاده از inotify مشکل میخورین این کمکتون میکنه
⚠️ بهتره مسیر جاری شبیه سازتون روی مسیر ویندوز باشه (میتونید جدا mount کنید) و از relative path استفاده کنید.
⚠️ به این موضوع هم توجه کنین که NTFS کلا تو مدیریت تعداد بالای فایل از ext4 سرعت کمتری داره ولی باز بهتر از mount کردن هست تو همچین موردی
WIN_NODE_PATH="/mnt/c/cmd/nodejs"
WIN_NPM_GLOBAL_PATH="/mnt/c/Users/avid/AppData/Roaming/npm"
WIN_CMD_PATH="/mnt/c/Windows/System32/cmd.exe"
winnodeinit() {
alias node="$WIN_CMD_PATH /c node"
alias npm="$WIN_CMD_PATH /c npm"
alias npx="$WIN_CMD_PATH /c npx"
export PATH="$PATH:$WIN_NPM_GLOBAL_PATH"
for cmd in "$WIN_NPM_GLOBAL_PATH"/*.cmd; do
if [ -f "$cmd" ]; then
cmd_name=$(basename "$cmd" .cmd)
alias "$cmd_name"="$WIN_CMD_PATH /c $cmd_name"
fi
done
}
winnodeundo() {
unalias node 2>/dev/null
unalias npm 2>/dev/null
unalias npx 2>/dev/null
for cmd in "$WIN_NPM_GLOBAL_PATH"/*.cmd; do
if [ -f "$cmd" ]; then
cmd_name=$(basename "$cmd" .cmd)
unalias "$cmd_name" 2>/dev/null
fi
done
export PATH=$(echo "$PATH" | sed -E "s;:?$WIN_NPM_GLOBAL_PATH;;")
}
🔅 چون شبیه ساز های لینوکسی معمولا از NTFS پشتیبانی نمیکنن با حجم بالای node_modules یا استفاده از inotify مشکل میخورین این کمکتون میکنه
⚠️ بهتره مسیر جاری شبیه سازتون روی مسیر ویندوز باشه (میتونید جدا mount کنید) و از relative path استفاده کنید.
⚠️ به این موضوع هم توجه کنین که NTFS کلا تو مدیریت تعداد بالای فایل از ext4 سرعت کمتری داره ولی باز بهتر از mount کردن هست تو همچین موردی
❤2
📘 یک کتابخانه آموزشی که جبر خطی F2^d برای integers هارو با F2[x]^d جایگزین میکنه و حتی در مواردی مثل md5 hashing محاسبتش میکنه. نمونه ای مناسب برای بررسی کارکرد توابع در سطح بیت به زبان پایتون.
📂 سورس پروژه و مستندات: GitHub – PolyF2
📂 سورس پروژه و مستندات: GitHub – PolyF2
❤1
ژوپیتـر اِیپیآی | Jupiter API
رفتم تو ضرر
ادیت کن پیامتو لانگ کن کسی نمیفهمه
با ربات ادیت کنی Edited نمیافته
با ربات ادیت کنی Edited نمیافته
🤣3
معجزه پایتون
😬 این مجیک متودهاش واقعا کار افراد حساسی مثل منو راحت میکنه
البته درکل بعضی جاها هم کمو کاستی داره ها
class Cursor:
def __init__(self, case: str):
self._case = case
def __eq__(self, other: object) -> bool:
if isinstance(other, list):
return self._case in other
elif isinstance(other, str):
return self._case == other
cursor = Cursor('sth')
cursor == 'sth' // True
cursor == ['sth'] // True
😬 این مجیک متودهاش واقعا کار افراد حساسی مثل منو راحت میکنه
البته درکل بعضی جاها هم کمو کاستی داره ها
❤1👎1
ژوپیتـر اِیپیآی | Jupiter API
البته درکل بعضی جاها هم کمو کاستی داره ها
یه موردش عدم وجود اوپراتوری مثل isset هست، البته راه حل داره که خب کثیف کاری و شلوغ کاریه
❤1
ژوپیتـر اِیپیآی | Jupiter API
البته درکل بعضی جاها هم کمو کاستی داره ها
یکی دیگش ویژگی goto هست که تو پایتون نداریمش اینم راه حل داره ولی خب ...
❤1
ژوپیتـر اِیپیآی | Jupiter API
البته درکل بعضی جاها هم کمو کاستی داره ها
یه مورد دیگه هم که اذیت کننده س قابلیت anonymous function هست که تو php خیلی خوب بهش پرداخته شده اما متاسفانه تو پایتون نه. توی پایتون lambda که تک خطیه فقط و محدوده و decorator ها یه جورایی اینو پوشش دادن ولی خب ...
❤1