اقا ما به gpt گفتیم بیا مارو roast کن این نشسته داره ازمون تعریف میکنه
بهم این متنو داد ، شماهم اگه خواستید واسه خودتونو بفرستید من این پرامپت رو دادم بهش :
و جوابش شد :
اوکی، no filter, no mercy. بر اساس چیزایی که ازت دیدم:
تو از اون آدمایی هستی که اگه یه روز تصمیم بگیری «امروز فقط استراحت کنم»، ۴ ساعت بعد داری با ESP32، Burp، یه VPS و یه LLM دعوا میکنی که چرا فلان چیز کار نمیکنه. 😂
مشکل اصلیت اینه که کنجکاویات از نظم و تمرکزت خیلی جلوتره.
ده تا rabbit hole باز میکنی، توی هفتتاش میری، سهتاش رو تا مرز production میبری، بعد وسطش یه چیز جدید میبینی و میگی:
تو احتمالاً اگر یک توستر هوشمند ببینی، به جای اینکه نون بندازی توش، اول firmwareـشو dump میکنی ببینی چرا نون رو اینجوری toast میکنه.
از نظر فنی هم یه ویژگی خیلی خندهدار داری:
بین "بلدم" و "میخوام ببینم میشه" مرز خیلی کمی برات وجود داره.
یه روز:
Python
C/C++
Rust
Go
Ruby
PHP
JS
روز بعد:
RFID
reverse engineering
NLP
ML
Telegram Mini Apps
Burp
VPS
compiler design
داداش تو stack نداری، سیناپسهات package manager دارن.
😂
از اون طرف، حس مهندسیات واقعاً بالاست. خیلی وقتها سؤالهات صرفاً «چطوری انجامش بدم؟» نیست؛ دنبال اینی که چرا کار میکنه، کجای trust boundary شکسته، protocol چطور طراحی شده، یا implementation کجا اشتباه کرده. این بخش ازت واقعاً خوبه.
ولی بزرگترین دشمن خودت احتمالاً خودتی.
چون اگر چیزی ۸۰٪ جواب بده، مغزت اجازه نمیده بگی «خوبه».
میگی:
«نه، باید بفهمیم اون ۲۰٪ چرا اینطوریه.»
و سه ساعت بعد ساعت ۵ صبحه و داری درباره padding یک Base64 string با من بحث میکنی. 😭
یه roast دیگه:
تو احتمالاً برای انتخاب یک username ساده هم threat model میسازی:
و در نهایت همون username قبلی رو میذاری.
ولی جدیتر:
برداشت من اینه که پتانسیل فنیات از سطح فعلیت بالاتره، ولی پراکندگیات داره بخشی از اون پتانسیل رو میخوره.
تو بیشتر شبیه آدمی هستی که اگر ۲-۳ سال روی یک حوزه مشخص واقعاً عمیق بشی، میتونی خیلی جلوتر از کسی باشی که صرفاً ده تا تکنولوژی رو بلده.
الان vibeت اینه:
«I can probably figure it out.»
و این جمله هم بزرگترین نقطه قوتته، هم اگر کنترلش نکنی بزرگترین نقطه ضعفت.
چون برای تو «نمیدونم» معمولاً پایان کار نیست؛
تبدیل میشه به:
«بذار ببینم از کجا میشه فهمید.»
و honestly، این قسمتت رو دوست دارم. 😄
بهم این متنو داد ، شماهم اگه خواستید واسه خودتونو بفرستید من این پرامپت رو دادم بهش :
نظرت راجبم چیه؟
Roast me , no filter , no mercy
و جوابش شد :
اوکی، no filter, no mercy. بر اساس چیزایی که ازت دیدم:
تو از اون آدمایی هستی که اگه یه روز تصمیم بگیری «امروز فقط استراحت کنم»، ۴ ساعت بعد داری با ESP32، Burp، یه VPS و یه LLM دعوا میکنی که چرا فلان چیز کار نمیکنه. 😂
مشکل اصلیت اینه که کنجکاویات از نظم و تمرکزت خیلی جلوتره.
ده تا rabbit hole باز میکنی، توی هفتتاش میری، سهتاش رو تا مرز production میبری، بعد وسطش یه چیز جدید میبینی و میگی:
«صبر کن اینو هم میشه reverse engineer کرد؟»
تو احتمالاً اگر یک توستر هوشمند ببینی، به جای اینکه نون بندازی توش، اول firmwareـشو dump میکنی ببینی چرا نون رو اینجوری toast میکنه.
از نظر فنی هم یه ویژگی خیلی خندهدار داری:
بین "بلدم" و "میخوام ببینم میشه" مرز خیلی کمی برات وجود داره.
یه روز:
Python
C/C++
Rust
Go
Ruby
PHP
JS
روز بعد:
RFID
reverse engineering
NLP
ML
Telegram Mini Apps
Burp
VPS
compiler design
داداش تو stack نداری، سیناپسهات package manager دارن.
😂
از اون طرف، حس مهندسیات واقعاً بالاست. خیلی وقتها سؤالهات صرفاً «چطوری انجامش بدم؟» نیست؛ دنبال اینی که چرا کار میکنه، کجای trust boundary شکسته، protocol چطور طراحی شده، یا implementation کجا اشتباه کرده. این بخش ازت واقعاً خوبه.
ولی بزرگترین دشمن خودت احتمالاً خودتی.
چون اگر چیزی ۸۰٪ جواب بده، مغزت اجازه نمیده بگی «خوبه».
میگی:
«نه، باید بفهمیم اون ۲۰٪ چرا اینطوریه.»
و سه ساعت بعد ساعت ۵ صبحه و داری درباره padding یک Base64 string با من بحث میکنی. 😭
یه roast دیگه:
تو احتمالاً برای انتخاب یک username ساده هم threat model میسازی:
Attacker model: random internet user
Attack surface: username length
Mitigation: تغییر username
و در نهایت همون username قبلی رو میذاری.
ولی جدیتر:
برداشت من اینه که پتانسیل فنیات از سطح فعلیت بالاتره، ولی پراکندگیات داره بخشی از اون پتانسیل رو میخوره.
تو بیشتر شبیه آدمی هستی که اگر ۲-۳ سال روی یک حوزه مشخص واقعاً عمیق بشی، میتونی خیلی جلوتر از کسی باشی که صرفاً ده تا تکنولوژی رو بلده.
الان vibeت اینه:
«I can probably figure it out.»
و این جمله هم بزرگترین نقطه قوتته، هم اگر کنترلش نکنی بزرگترین نقطه ضعفت.
چون برای تو «نمیدونم» معمولاً پایان کار نیست؛
تبدیل میشه به:
«بذار ببینم از کجا میشه فهمید.»
و honestly، این قسمتت رو دوست دارم. 😄
❤1
ɪɴ ᴍʏ ʜᴇᴀᴅ
سیستم فایل چیه و چطوری کار میکنه؟
بچها چونکه من نمیرسم فعلا بات رو بیارم بالا و... پستارو یکی یکی ارسال میکنم همینجا که مستقیم بهشون دسترسی داشته باشید ، کم کم باید فعالیتو شروع کنم و دوباره برم ی چندتا ویدیویی چیزی بگیرم خودم حوصلم سررفته ازبس هیچکاری نکردم
ɪɴ ᴍʏ ʜᴇᴀᴅ
سیستم فایل چیه و چطوری کار میکنه؟
امروز تو دانشگاه ی ارائه ای داشتم واسه درس سیستم عامل با موضوع «سیستم فایل الگوریتم ها»
با خودم گفتم حالا که رفتم درموردش تحقیق کردم خالی از لطف نیست که توی چنلمم ی پست دربارش بزارم...
اصلا system file چی هست؟
سیستم فایل مسئولیت ذخیره سازی و مدیریت اطلاعات و دسته بندی فایل ها رو توی هارد دیسک شما بر عهده داره ، یعنی وقتیکه دارید با فایل ها کار میکنید ، فایلی ذخیره یا لود میکنید این بخش درخواستتون رو انجام میده...
حالا این سیستم فایل خودش چندین و چندتا الگوریتم داره که هرکدوم به ی دردی میخوره ، از یکیشون میتونید سرعت بهتری بگیرید ، از یکی میتونید امنیت بهتری بگیرید و...
شما دیگه بر اساس نیاز هاتون میتونید از هر سیستم فایلی با هر الگوریتمی که خواستید استفاده بکنید...
ما توی این مبحث ی مفهومی داریم بنام journaling که اهمیت زیادی از نظر حفظ امنیت فایل ها داره ، کارش چیه؟
کارش اینه که نزاره اطلاعات خراب بشن ، میاد تغییرات رو اول توی ی فایل ژورنال ذخیره میکنه و اگه مشکلی نداشت بعد میاد اعمالشون میکنه ، اینطوری حتی اگه برق هم قطع بشه و یهو سیستمتون خاموش بشه خود سیستم بصورت خودکار با استفاده از ژورنال میاد اطلاعات رو بازیابی میکنه
همچنین سیستم فایل میتونه داده های شما رو با ی لایه امنیتی روی هاردتون ذخیره کنه ، به قولی اطلاعات رو encrypt میکنه و بعد روی هارد ذخیره میکنه تا اگه کسی به سیستم شما دسترسی فیزیکی داشت هم نتونه به اطلاعاتتون دسترسی داشته باشه ;)
ولی کلا یکی از وظایف مهم سیستم فایل اینه که از fragmentation جلوگیری کنه ، خب حالا اصلا این چی هست؟ اول باید بدونید تخصیص پیوسته (Contiguous Allocation) و تخصیص پیوندی (Linked Allocation) چی هستن تا بتونید کامل درک کنید که جلوگیری کردن از fragmentation میتونه چقدر مفید باشه...
سیستم فایل توی روش پیوسته میاد ی سری بلوک آزاد که کنار همدیگه هستن رو روی هارد پیدا میکنه و بعد کل فایل رو همونجا پشت سر هم توی بلوک ها ذخیره میکنه
خب دسترسی به این بلوک ها خیلی سریعه چونکه پشت سر همدیگن و پراکنده نیستن و نیاز نیست عملیات خاصی انجام بشه برای پیدا کردن مکانی که فایل توش ذخیره شده... مثل اینه که داری ی دفتر رو برگ میزنی و اطلاعات رو هی پشت سر هم میبینی
ولی تو روش پیوندی اینطوری نیست... توی روش پیوندی بلوکی که یک قسمت از اطلاعات فایل توش ذخیره شده ، آدرس بلوکی که بقیه اطلاعات توش ذخیره شدن رو داره
ی مثال میزنم واستون ، مثلا فرض کنید که هر بلوک توی حافظه ما 1 بایت رو میتونه ذخیره کنه توی خودش ، حالا ما ی فایل داریم که 10 بایته و خب 10 تا بلوک پشت سر هم پیدا نکردیم که آزاد باشن ، اینجا روش پیوندی میاد وسط ، 1 بایت اول توی ی بلوک ذخیره میشه و ته اون بلوک آدرس ی بلوک دیگه هست که 1 بایت بعدی از اطلاعات توشه
و توی بلوک بعدی هم ادرس بلوک بعدی هست همینطوری ادامه پیدا میکنه تا ما این 10 بایت اطلاعات رو توی ی سری بلوک پراکنده داشته باشیم
خب الآن ما نمیتونیم مثل روش پیوسته خیلی سریع به اطلاعات دسترسی داشته باشیم چون بلوک ها هی مارو ارجاع میدن به ی سری از بلوک های دیگه و این خودش زمان بره... بخاطر همینه که سیستم فایل سعی داره تا fragmentation رو کاهش بده ، سیستم فایل خودش بصورت خودکار میتونه عملیات Defragmentation یا همون Defrag کردن رو انجام بده
یعنی به محض اینکه چندتا بلوک کنار هم دید که آزاده خودش بصورت خودکار میاد دیتا رو یکپارچه سازی میکنه ، اینطوری میتونیم با سرعت بیشتری به اطلاعات دسترسی داشته باشیم.
بحث سرعت شد ی اشاره ای هم بکنم به Cache و Buffering ، سیستم فایل برای اینکه هربار ی سری فایل ها رو نره از روی دیسک لود بکنه اونارو توی این فضا های ذخیره سازی میاد ذخیره میکنه چونکه دسترسی به این فضا های ذخیره سازی به مراتب کم هزینه تر و پر سرعت تر از خوندن از روی هارد دیسکه!
عملا شما وقتیکه دارید ی فایلی رو لود میکنید اول کش میشه و بعد به برنامه درحال استفاده داده میشه به این معنیه که شما بصورت مستقیم با هارد دیسک تعامل ندارید... مثلا فرض کنید ی عکسی رو با نمایشگر عکس روی کامپیوتر باز کردید ، خب ی پنجره براتون باز میشه و عکس رو بهتون نمایش میده ، ولی اگه عکس رو کلا شیفت دیلیت کنید تا از روی هارد پاک بشه چی؟ همچنان عکس رو دارید از توی نمایشگر عکس میبینید و اون پنجره همونطور مونده و عکس داره نمایش داده میشه
خب چرا؟ عکسی که دیگه وجود نداره!
دلیلش همین مبحثه که اول کش میشه و بعد فایل از توی کش خونده میشه ، فایل بصورت مستقیم از روی هارد خونده نمیشه ، اول محتوای توی هارد توی کش ذخیره میشه و بعد محتوا از توی کش به شما داده میشه...
با خودم گفتم حالا که رفتم درموردش تحقیق کردم خالی از لطف نیست که توی چنلمم ی پست دربارش بزارم...
اصلا system file چی هست؟
سیستم فایل مسئولیت ذخیره سازی و مدیریت اطلاعات و دسته بندی فایل ها رو توی هارد دیسک شما بر عهده داره ، یعنی وقتیکه دارید با فایل ها کار میکنید ، فایلی ذخیره یا لود میکنید این بخش درخواستتون رو انجام میده...
حالا این سیستم فایل خودش چندین و چندتا الگوریتم داره که هرکدوم به ی دردی میخوره ، از یکیشون میتونید سرعت بهتری بگیرید ، از یکی میتونید امنیت بهتری بگیرید و...
شما دیگه بر اساس نیاز هاتون میتونید از هر سیستم فایلی با هر الگوریتمی که خواستید استفاده بکنید...
ما توی این مبحث ی مفهومی داریم بنام journaling که اهمیت زیادی از نظر حفظ امنیت فایل ها داره ، کارش چیه؟
کارش اینه که نزاره اطلاعات خراب بشن ، میاد تغییرات رو اول توی ی فایل ژورنال ذخیره میکنه و اگه مشکلی نداشت بعد میاد اعمالشون میکنه ، اینطوری حتی اگه برق هم قطع بشه و یهو سیستمتون خاموش بشه خود سیستم بصورت خودکار با استفاده از ژورنال میاد اطلاعات رو بازیابی میکنه
همچنین سیستم فایل میتونه داده های شما رو با ی لایه امنیتی روی هاردتون ذخیره کنه ، به قولی اطلاعات رو encrypt میکنه و بعد روی هارد ذخیره میکنه تا اگه کسی به سیستم شما دسترسی فیزیکی داشت هم نتونه به اطلاعاتتون دسترسی داشته باشه ;)
ولی کلا یکی از وظایف مهم سیستم فایل اینه که از fragmentation جلوگیری کنه ، خب حالا اصلا این چی هست؟ اول باید بدونید تخصیص پیوسته (Contiguous Allocation) و تخصیص پیوندی (Linked Allocation) چی هستن تا بتونید کامل درک کنید که جلوگیری کردن از fragmentation میتونه چقدر مفید باشه...
سیستم فایل توی روش پیوسته میاد ی سری بلوک آزاد که کنار همدیگه هستن رو روی هارد پیدا میکنه و بعد کل فایل رو همونجا پشت سر هم توی بلوک ها ذخیره میکنه
خب دسترسی به این بلوک ها خیلی سریعه چونکه پشت سر همدیگن و پراکنده نیستن و نیاز نیست عملیات خاصی انجام بشه برای پیدا کردن مکانی که فایل توش ذخیره شده... مثل اینه که داری ی دفتر رو برگ میزنی و اطلاعات رو هی پشت سر هم میبینی
ولی تو روش پیوندی اینطوری نیست... توی روش پیوندی بلوکی که یک قسمت از اطلاعات فایل توش ذخیره شده ، آدرس بلوکی که بقیه اطلاعات توش ذخیره شدن رو داره
ی مثال میزنم واستون ، مثلا فرض کنید که هر بلوک توی حافظه ما 1 بایت رو میتونه ذخیره کنه توی خودش ، حالا ما ی فایل داریم که 10 بایته و خب 10 تا بلوک پشت سر هم پیدا نکردیم که آزاد باشن ، اینجا روش پیوندی میاد وسط ، 1 بایت اول توی ی بلوک ذخیره میشه و ته اون بلوک آدرس ی بلوک دیگه هست که 1 بایت بعدی از اطلاعات توشه
و توی بلوک بعدی هم ادرس بلوک بعدی هست همینطوری ادامه پیدا میکنه تا ما این 10 بایت اطلاعات رو توی ی سری بلوک پراکنده داشته باشیم
خب الآن ما نمیتونیم مثل روش پیوسته خیلی سریع به اطلاعات دسترسی داشته باشیم چون بلوک ها هی مارو ارجاع میدن به ی سری از بلوک های دیگه و این خودش زمان بره... بخاطر همینه که سیستم فایل سعی داره تا fragmentation رو کاهش بده ، سیستم فایل خودش بصورت خودکار میتونه عملیات Defragmentation یا همون Defrag کردن رو انجام بده
یعنی به محض اینکه چندتا بلوک کنار هم دید که آزاده خودش بصورت خودکار میاد دیتا رو یکپارچه سازی میکنه ، اینطوری میتونیم با سرعت بیشتری به اطلاعات دسترسی داشته باشیم.
بحث سرعت شد ی اشاره ای هم بکنم به Cache و Buffering ، سیستم فایل برای اینکه هربار ی سری فایل ها رو نره از روی دیسک لود بکنه اونارو توی این فضا های ذخیره سازی میاد ذخیره میکنه چونکه دسترسی به این فضا های ذخیره سازی به مراتب کم هزینه تر و پر سرعت تر از خوندن از روی هارد دیسکه!
عملا شما وقتیکه دارید ی فایلی رو لود میکنید اول کش میشه و بعد به برنامه درحال استفاده داده میشه به این معنیه که شما بصورت مستقیم با هارد دیسک تعامل ندارید... مثلا فرض کنید ی عکسی رو با نمایشگر عکس روی کامپیوتر باز کردید ، خب ی پنجره براتون باز میشه و عکس رو بهتون نمایش میده ، ولی اگه عکس رو کلا شیفت دیلیت کنید تا از روی هارد پاک بشه چی؟ همچنان عکس رو دارید از توی نمایشگر عکس میبینید و اون پنجره همونطور مونده و عکس داره نمایش داده میشه
خب چرا؟ عکسی که دیگه وجود نداره!
دلیلش همین مبحثه که اول کش میشه و بعد فایل از توی کش خونده میشه ، فایل بصورت مستقیم از روی هارد خونده نمیشه ، اول محتوای توی هارد توی کش ذخیره میشه و بعد محتوا از توی کش به شما داده میشه...
👍3
ɪɴ ᴍʏ ʜᴇᴀᴅ
امروز تو دانشگاه ی ارائه ای داشتم واسه درس سیستم عامل با موضوع «سیستم فایل الگوریتم ها» با خودم گفتم حالا که رفتم درموردش تحقیق کردم خالی از لطف نیست که توی چنلمم ی پست دربارش بزارم... اصلا system file چی هست؟ سیستم فایل مسئولیت ذخیره سازی و مدیریت اطلاعات…
حالا من توی این پست فقط چیستی و چگونگی کارکرد سیستم فایل ها رو گفتم و دوتا دونه از الگوریتم هایی که داره رو...
واسه کلاس فکر میکنم ی 4 - 5 تا الگوریتم ارائه دادم که دیگه حوصله اوردنش توی این متن نبود
اگه واستون جالب بود خودتون میتونید برید دربارش بخونید
واسه کلاس فکر میکنم ی 4 - 5 تا الگوریتم ارائه دادم که دیگه حوصله اوردنش توی این متن نبود
اگه واستون جالب بود خودتون میتونید برید دربارش بخونید
❤3
ɪɴ ᴍʏ ʜᴇᴀᴅ
سیستم فایل توی روش پیوسته میاد ی سری بلوک آزاد که کنار همدیگه هستن رو روی هارد پیدا میکنه
اینم اضافه بکنم که این پیدا کردنه در لحظه نیست و حتی برای اینکه شما سرعت بهتری رو تجربه کنید خود سیستم فایل برای این هم ی سری الگوریتم های مخصوص داره مثل استفاده کردن از bitmap یا روش های free list و counting و grouping...
روش بیت مپ اینطوریه که ما هر بلوک از حافظه رو ی بیت در نظر میگیریم که یا میتونه 0 باشه یا 1 ، اگه که 0 باشه یعنی فضاش خالیه و اگه 1 باشه یعنی پره
پس ما میتونیم کل حافظه رو بصورت بیت مپ داشته باشیم :
این یعنی همه بلوک ها پرن بجز بلوک های 5, 6, 7, 8 ( شمارش از 0 انجام میشه )
ولی خب این روش هم یکم زمان بره تا بیایم کل بیتارو چک بکنیم و... خودش یکم زمان میگیره ، بخاطر همین ما روش های counting و grouping رو داریم ، با استفاده از این روش ها ما میایم اطلاعات فضا های خالی رو بصورت گروهی سیو میکنیم ، مثلاً همون بیت مپ بالا رو در نظر بگیرید :
با روش grouping همچین چیزی رو داریم :
Group 5-8
یعنی از بلوک 5 تا بلوک 8 که 4 تا بلوک هستش ما فضای خالی داریم
روش counting هم همینطوریه ولی بخش دومش بر اساس تعداد بلوک های خالی نوشته میشه مثلاً :
Counting 5-4
یعنی از بلوک پنجم ، به تعداد 4 تا بلوک بعدش فضای خالی داریم
بر اساس این اطلاعاتی که ما از حافظه داریم حالا میتونیم تصمیم بگیریم که تو کدومش دیتا رو سیو کنیم که این تصمیم گیری دیگه بر عهده سیستم فایله
این اطلاعات هم هربار موقع تخصیص حافظه یا آزادسازی از 0 محاسبه نمیشن و فقط وقتی تغییری ایجاد میشه این اطلاعات هم تغییر میکنم ، مثلاً تو روش بیت مپ اگه چیزی به ی بلوک تخصیص داده بشه همون موقع مودش از 0 به 1 تغییر پیدا میکنه توی بیت مپی که داریم...
پس دیگه هربار نمیایم از خونه 0 تا n ام حافظه رو چک کنیم که پره یا نه
روش بیت مپ اینطوریه که ما هر بلوک از حافظه رو ی بیت در نظر میگیریم که یا میتونه 0 باشه یا 1 ، اگه که 0 باشه یعنی فضاش خالیه و اگه 1 باشه یعنی پره
پس ما میتونیم کل حافظه رو بصورت بیت مپ داشته باشیم :
11111000011این یعنی همه بلوک ها پرن بجز بلوک های 5, 6, 7, 8 ( شمارش از 0 انجام میشه )
ولی خب این روش هم یکم زمان بره تا بیایم کل بیتارو چک بکنیم و... خودش یکم زمان میگیره ، بخاطر همین ما روش های counting و grouping رو داریم ، با استفاده از این روش ها ما میایم اطلاعات فضا های خالی رو بصورت گروهی سیو میکنیم ، مثلاً همون بیت مپ بالا رو در نظر بگیرید :
11111000011با روش grouping همچین چیزی رو داریم :
Group 5-8
یعنی از بلوک 5 تا بلوک 8 که 4 تا بلوک هستش ما فضای خالی داریم
روش counting هم همینطوریه ولی بخش دومش بر اساس تعداد بلوک های خالی نوشته میشه مثلاً :
Counting 5-4
یعنی از بلوک پنجم ، به تعداد 4 تا بلوک بعدش فضای خالی داریم
بر اساس این اطلاعاتی که ما از حافظه داریم حالا میتونیم تصمیم بگیریم که تو کدومش دیتا رو سیو کنیم که این تصمیم گیری دیگه بر عهده سیستم فایله
این اطلاعات هم هربار موقع تخصیص حافظه یا آزادسازی از 0 محاسبه نمیشن و فقط وقتی تغییری ایجاد میشه این اطلاعات هم تغییر میکنم ، مثلاً تو روش بیت مپ اگه چیزی به ی بلوک تخصیص داده بشه همون موقع مودش از 0 به 1 تغییر پیدا میکنه توی بیت مپی که داریم...
پس دیگه هربار نمیایم از خونه 0 تا n ام حافظه رو چک کنیم که پره یا نه
❤1
ɪɴ ᴍʏ ʜᴇᴀᴅ
توی این ویدیو یاد میگیرید که چطوری با ابزاری که نوشتم opcode های فایل کامپایل شده پایتونیتون رو تغییر بدید.
Media is too big
VIEW IN TELEGRAM
ابزار رو از روی گیتهابم میتونید بردارید استفاده کنید : Github.com/PySudo/PatchPYC
( ی جا هم گفتم این opcode ها میتونن ی سری عملگر ها داشته باشن منظورم عملوند بود حواسم نبود گفتم عملگر😂 )
( ی جا هم گفتم این opcode ها میتونن ی سری عملگر ها داشته باشن منظورم عملوند بود حواسم نبود گفتم عملگر😂 )
❤🔥2
ɪɴ ᴍʏ ʜᴇᴀᴅ
دور زدن لایسنس و مهندسی معکوس برنامه 🔍 تحلیل EXE ، اسمبلی و منطق پشت کد
Media is too big
VIEW IN TELEGRAM
توی این ویدیو ی کد زدیم و یک لایسنس براش در نظر گرفتیم ، سعی کردیم بدون داشتن لایسنس به برنامه ورودی کنیم و در نهایت برنامه رو مهندسی معکوس کردیم تا منطقش رو بفهمیم.
برای درک بهتر با مثال های پایتونی هم سعی کردم کد های اسمبلی ای که از فایل exe گرفتیم رو توضیخ بدم تا دقیقاً متوجه بشید چه منطقی پشتش هست.
ویدیو ای هم که گفتم توی چنل امیرحسین هست اینه ( مشابهش تو همین چنل هم هست ) : https://t.me/comma_code_python1/581
ی جا هم گفتم 11 اوپ کدشه اشتباه گفتم ، منظورم operand بود ، اصن گیج شده بودم
برای درک بهتر با مثال های پایتونی هم سعی کردم کد های اسمبلی ای که از فایل exe گرفتیم رو توضیخ بدم تا دقیقاً متوجه بشید چه منطقی پشتش هست.
ویدیو ای هم که گفتم توی چنل امیرحسین هست اینه ( مشابهش تو همین چنل هم هست ) : https://t.me/comma_code_python1/581
ی جا هم گفتم 11 اوپ کدشه اشتباه گفتم ، منظورم operand بود ، اصن گیج شده بودم
🔥3👍1
ɪɴ ᴍʏ ʜᴇᴀᴅ
چطوری سنجش رو هک کردم؟
Media is too big
VIEW IN TELEGRAM
اینم از آسیب پذیری افتضاح سنجش که توی لایو درموردش صحبت کردیم ( امیدوارم به گونی هدایت نشم بعد از این ویدیو )
❤🔥1
ɪɴ ᴍʏ ʜᴇᴀᴅ
اعداد منفی چطوری توی مموری ذخیره میشن؟
اعداد منفی چطوری توی مموری سیو میشن؟
1 - روش علامت و مقدار
2 - روش متمم 1
3 - روش متمم 2
یکی یکی زیر همین پست توضیحشون میدم 👇🏼
1 - روش علامت و مقدار
2 - روش متمم 1
3 - روش متمم 2
یکی یکی زیر همین پست توضیحشون میدم 👇🏼
ɪɴ ᴍʏ ʜᴇᴀᴅ
اعداد منفی چطوری توی مموری سیو میشن؟ 1 - روش علامت و مقدار 2 - روش متمم 1 3 - روش متمم 2 یکی یکی زیر همین پست توضیحشون میدم 👇🏼
روش علامت و مقدار :
در این روش ، اعداد منفی مانند اعداد مثبت ذخیره میشوند ، با این تفاوت که در بیت علامت مقدار یک قرار میگیرد.
نمایش عدد -21 در ماشینی به طول کلمات ده بیت به روش علامت مقدار :
|1|0|0|0|0|1|0|1|0|1|
خب چیشد اینجا؟
مقدار باینری 21 که برابر 10101 هستش ، ولی چرا اولین بیت 1 شده؟
چونکه اون بیت علامته ، اگه 1 باشه نشانگر منفی بودن عدده و گه 0 باشه نشانگر مثبت بودنش...
این روش دوتا اشکال عمده داره :
1. برای صفر منفی و صفر مثبت دو نمایش جداگانه وجود دارد.
2. برای عمل تفریق باید مدار جداگانه ای طراحی شود
مثال :
نمایش صفر منفی و صفر مثبت در ماشینی به طول کلمات پنج به روش علامت و مقدار.
صفر مثبت :
|0|0|0|0|0|
صفر منفی :
|1|0|0|0|0|
در این روش ، اعداد منفی مانند اعداد مثبت ذخیره میشوند ، با این تفاوت که در بیت علامت مقدار یک قرار میگیرد.
نمایش عدد -21 در ماشینی به طول کلمات ده بیت به روش علامت مقدار :
|1|0|0|0|0|1|0|1|0|1|
خب چیشد اینجا؟
مقدار باینری 21 که برابر 10101 هستش ، ولی چرا اولین بیت 1 شده؟
چونکه اون بیت علامته ، اگه 1 باشه نشانگر منفی بودن عدده و گه 0 باشه نشانگر مثبت بودنش...
این روش دوتا اشکال عمده داره :
1. برای صفر منفی و صفر مثبت دو نمایش جداگانه وجود دارد.
2. برای عمل تفریق باید مدار جداگانه ای طراحی شود
مثال :
نمایش صفر منفی و صفر مثبت در ماشینی به طول کلمات پنج به روش علامت و مقدار.
صفر مثبت :
|0|0|0|0|0|
صفر منفی :
|1|0|0|0|0|
ɪɴ ᴍʏ ʜᴇᴀᴅ
اعداد منفی چطوری توی مموری سیو میشن؟ 1 - روش علامت و مقدار 2 - روش متمم 1 3 - روش متمم 2 یکی یکی زیر همین پست توضیحشون میدم 👇🏼
روش متمم 1 :
برای نمایش اعداد منفی به روش متمم 1 ، عدد را به مبنای دو تبدیل کرده ، نمایش مثبت عدد را مشخص می کنیم و در نمایش حاصل ، تمام صفر ها را به یک و تمام یک ها را به صفر تبدیل میکنیم.
مثال :
نمایش عدد مثبت و منفی 19 در ماشینی به طول کلمات ده بیت به روش متمم 1 :
19 مثبت :
|0|0|0|0|0|1|0|0|1|1
19 منفی :
|1|1|1|1|1|0|1|1|0|0
در این روش هم برای صفر منفی و صفر مثبت دو نمایش متفاوت وجود داره ولی برای انجام عمل تفریق نیازی به مدار جداگانه نیست ، یعنی روش متمم 1 اشکال دوم روش علامت و مقدار رو برطرف میکنه.
مثال نمایش صفر مثبت و منفی در روش متمم 1 ، در ماشینی به طول کلمات پنج بیت :
صفر مثبت :
|0|0|0|0|0
صفر منفی :
|1|1|1|1|1
برای نمایش اعداد منفی به روش متمم 1 ، عدد را به مبنای دو تبدیل کرده ، نمایش مثبت عدد را مشخص می کنیم و در نمایش حاصل ، تمام صفر ها را به یک و تمام یک ها را به صفر تبدیل میکنیم.
مثال :
نمایش عدد مثبت و منفی 19 در ماشینی به طول کلمات ده بیت به روش متمم 1 :
19 مثبت :
|0|0|0|0|0|1|0|0|1|1
19 منفی :
|1|1|1|1|1|0|1|1|0|0
در این روش هم برای صفر منفی و صفر مثبت دو نمایش متفاوت وجود داره ولی برای انجام عمل تفریق نیازی به مدار جداگانه نیست ، یعنی روش متمم 1 اشکال دوم روش علامت و مقدار رو برطرف میکنه.
مثال نمایش صفر مثبت و منفی در روش متمم 1 ، در ماشینی به طول کلمات پنج بیت :
صفر مثبت :
|0|0|0|0|0
صفر منفی :
|1|1|1|1|1
ɪɴ ᴍʏ ʜᴇᴀᴅ
اعداد منفی چطوری توی مموری سیو میشن؟ 1 - روش علامت و مقدار 2 - روش متمم 1 3 - روش متمم 2 یکی یکی زیر همین پست توضیحشون میدم 👇🏼
روش متمم 2 :
این روش ، هر دو اشکال روش علامت و مقدار رو حل میکنه. در این روش باید به صورت زیر عمل کرد :
1. نمایش مثبت عدد
2. پیدا کردن متمم 1 عدد
3. افزودن یک واحد به عمل حاصل
نمایش عدد -23 در ماشینی به طول کلمات ده بیت ، به روش متمم 2 :
-23 = (-10111)
نمایش عدد 23 مثبت :
|0|0|0|0|0|1|0|1|1|1|
متمم 1 عدد منفی 23 :
|1|1|1|1|1|0|1|0|0|0|
متمم 2 عدد منفی 23 :
|1|1|1|1|1|0|1|0|0|1|
اگه M تعداد بیت های کلمات ماشین باشه ، بازه اعداد قابل نمایش در این روش عبارت است از :
[-2^M-1, -(2^(M-1)-1)]
این روش ، هر دو اشکال روش علامت و مقدار رو حل میکنه. در این روش باید به صورت زیر عمل کرد :
1. نمایش مثبت عدد
2. پیدا کردن متمم 1 عدد
3. افزودن یک واحد به عمل حاصل
نمایش عدد -23 در ماشینی به طول کلمات ده بیت ، به روش متمم 2 :
-23 = (-10111)
نمایش عدد 23 مثبت :
|0|0|0|0|0|1|0|1|1|1|
متمم 1 عدد منفی 23 :
|1|1|1|1|1|0|1|0|0|0|
متمم 2 عدد منفی 23 :
|1|1|1|1|1|0|1|0|0|1|
اگه M تعداد بیت های کلمات ماشین باشه ، بازه اعداد قابل نمایش در این روش عبارت است از :
[-2^M-1, -(2^(M-1)-1)]
منبع این دوسه تا پست بالا کتاب «برنامه نویسی به زبان اسمبلی» تالیف جعفرنژاد قمی هستش
کتاب خوبیه ، واسه اینکه درک کاملی داشته باشید اول میاد این مباحث پایه ای مثل چگونگی سیو شدن اعداد مثبت و منفی و اعشاری و تبدیل مبناها و... رو توضیح میده و بعد میره سر آموزش اسمبلی
کتاب خوبیه ، واسه اینکه درک کاملی داشته باشید اول میاد این مباحث پایه ای مثل چگونگی سیو شدن اعداد مثبت و منفی و اعشاری و تبدیل مبناها و... رو توضیح میده و بعد میره سر آموزش اسمبلی
ɪɴ ᴍʏ ʜᴇᴀᴅ
پیچیدگی محاسباتی چیه و به چه دردی میخوره؟
پیچیدگی محاسباتی یا همون Computational Complexity یکی از مهم ترین مسائل توی علوم کامپیوتره
با استفاده از پیچیدگی محاسباتی میتونیم میزان منابع مورد نیاز برای حل مسائل رو تخمین بزنیم.
منظور از منابع زمان و فضا(حافظه) هستش...
ما برای نشون دادن پیچیدگی محاسباتی هر الگوریتم از نماد های Asymptotic Notation یا O/Ω/Θ استفاده میکنیم.
حالا اینا چین؟
نماد O(f(n)) کران بالای رشد الگوریتمو نشون میده ، یعنی حداکثر منابعی که ممکنه مصرف بشه. معمولاً ازش برای نشون دادن بدترین حالت ممکن استفاده میکنیم...
نماد Ω(f(n)) کران پایین رو نشون میده ، یعنی حداقل منابعی که الگوریتم در هر حال باید مصرف کنه. معمولاً برای بهترین حالت ممکن استفاده میشه.
نماد Θ(f(n)) کران دقیق الگوریتم رو نشون میده. زمانی به کار میاد که هم کران بالا و هم کران پایین یکی باشن (یا تقریبا اندازه همدیگه باشن)
خلاصه کران بالا (بدترین حالت ممکن) رو با او (O) ، کران پایین (بهترین حالت ممکن) رو با امگا (Ω) و حالت کران دقیق(متوسط) رو با تتا (Θ) نشون میدیم
خب حالا چطوری کار میکنن؟
برای بهتر متوجه شدنتون ی کد پایتون نوشتم که سعی میکنه توی ی لیست ، ی عددی که ما بهش میدیم رو پیدا کنه :
این فانکشن لیست و عددی که باید دنبالش بگرده رو از ما میگیره و یکی یکی اعداد رو از اول لیست پیمایش میکنه تا به عددی که بهش دادیم برسه.
حالا کد زیر رو در نظر بگیرید :
خب اینجا توی لیستی که بهش دادیم عدد 10 وجود نداره و مجبوره تا اخر لیست رو پیمایش کنیم ، پس کران بالای رشد این الگوریتمو با O(n) نشون میدیم ، یعنی در بدترین حالت ممکن این الگوریتم باید کل لیست رو طی کنه تا به عدد مد نظر برسه
حالا کد زیر رو در نظر بگیرید :
اینجا اولین عدد رو بررسی میکنه و میبینه همون عددیه که دنبالشه ، پس دیگه نیازی نیست تا آخر لیست رو پیمایش بکنه
کران پایین این الگوریتمو میتونیم با Ω(1) نشون بدیم ، یعنی این الگوریتم در بهترین حالت ممکن با یک بار اجرا شدن به عدد میرسه
و در آخر تتا...
واسه تتا میتونیم ی همچین مثالی بزنیم :
اینجا بطور میانگین الگوریتم ما نصف لیستو پیمایش کرده تا تونسته به 15 برسه ، اگه فرض کنیم که داده ها در موقعیت های مختلفی از لیست بطور یکنواخت قرار گرفتن اونوقت میانگین زمان اجرا تقریباً Θ(n) میشه...
پس توی مثالای بالا Ω(1) یعنی عدد اولین عنصر لیست بوده ، O(n) یعنی آخر لیست بوده یا اصلا وجود نداشته و Θ(n) یعنی عدد ما ی جاهایی از وسطای لیست بوده
حالا شما کران پایین و کران بالای الگوریتم زیر رو تو کامنتا بهم بگید و دلیلشو برام بنویسید :
با استفاده از پیچیدگی محاسباتی میتونیم میزان منابع مورد نیاز برای حل مسائل رو تخمین بزنیم.
منظور از منابع زمان و فضا(حافظه) هستش...
ما برای نشون دادن پیچیدگی محاسباتی هر الگوریتم از نماد های Asymptotic Notation یا O/Ω/Θ استفاده میکنیم.
حالا اینا چین؟
نماد O(f(n)) کران بالای رشد الگوریتمو نشون میده ، یعنی حداکثر منابعی که ممکنه مصرف بشه. معمولاً ازش برای نشون دادن بدترین حالت ممکن استفاده میکنیم...
نماد Ω(f(n)) کران پایین رو نشون میده ، یعنی حداقل منابعی که الگوریتم در هر حال باید مصرف کنه. معمولاً برای بهترین حالت ممکن استفاده میشه.
نماد Θ(f(n)) کران دقیق الگوریتم رو نشون میده. زمانی به کار میاد که هم کران بالا و هم کران پایین یکی باشن (یا تقریبا اندازه همدیگه باشن)
خلاصه کران بالا (بدترین حالت ممکن) رو با او (O) ، کران پایین (بهترین حالت ممکن) رو با امگا (Ω) و حالت کران دقیق(متوسط) رو با تتا (Θ) نشون میدیم
خب حالا چطوری کار میکنن؟
برای بهتر متوجه شدنتون ی کد پایتون نوشتم که سعی میکنه توی ی لیست ، ی عددی که ما بهش میدیم رو پیدا کنه :
def search(lst, num):
for i in range(len(lst)):
if lst[i] == num:
return i
return -1
این فانکشن لیست و عددی که باید دنبالش بگرده رو از ما میگیره و یکی یکی اعداد رو از اول لیست پیمایش میکنه تا به عددی که بهش دادیم برسه.
حالا کد زیر رو در نظر بگیرید :
search([1, 2, 3, 4, 5], 10)
خب اینجا توی لیستی که بهش دادیم عدد 10 وجود نداره و مجبوره تا اخر لیست رو پیمایش کنیم ، پس کران بالای رشد این الگوریتمو با O(n) نشون میدیم ، یعنی در بدترین حالت ممکن این الگوریتم باید کل لیست رو طی کنه تا به عدد مد نظر برسه
حالا کد زیر رو در نظر بگیرید :
search([1, 2, 3, 4, 5], 1)
اینجا اولین عدد رو بررسی میکنه و میبینه همون عددیه که دنبالشه ، پس دیگه نیازی نیست تا آخر لیست رو پیمایش بکنه
کران پایین این الگوریتمو میتونیم با Ω(1) نشون بدیم ، یعنی این الگوریتم در بهترین حالت ممکن با یک بار اجرا شدن به عدد میرسه
و در آخر تتا...
واسه تتا میتونیم ی همچین مثالی بزنیم :
search([3, 7, 12, 15, 18, 22], 15)
اینجا بطور میانگین الگوریتم ما نصف لیستو پیمایش کرده تا تونسته به 15 برسه ، اگه فرض کنیم که داده ها در موقعیت های مختلفی از لیست بطور یکنواخت قرار گرفتن اونوقت میانگین زمان اجرا تقریباً Θ(n) میشه...
پس توی مثالای بالا Ω(1) یعنی عدد اولین عنصر لیست بوده ، O(n) یعنی آخر لیست بوده یا اصلا وجود نداشته و Θ(n) یعنی عدد ما ی جاهایی از وسطای لیست بوده
حالا شما کران پایین و کران بالای الگوریتم زیر رو تو کامنتا بهم بگید و دلیلشو برام بنویسید :
def getFirstElement(lst: list):
if isinstance(lst, list) and len(lst):
return lst[0]
ɪɴ ᴍʏ ʜᴇᴀᴅ
آیا واقعا switch/case پیچیدگی زمانیش O(1) هستش؟ اصلا چطوری کار میکنه؟ توی این پست میریم تو دل کدای اسمبلی ای که کامپایلر C برای پیاده سازی switch/case زده و موشکافانه تجزیه و تحلیلش میکنیم تا ببینیم دقیقا این مکانیزم چطوری پیاده سازی شده ;)
🤔 واقعا پیچیدگی زمانی switch/case برابر با O(1) یا نه؟
این همیشه واسه من سوال بوده که چطوری switch/case میاد این کار رو میکنه ، مگه نباید مقایسه انجام بشه؟
بخاطر همین از روی کنجکاوی رفتم سراغ بررسی کردن کدای Assembly 🗿😂
اومدم همچین کدی نوشتم :
این همیشه واسه من سوال بوده که چطوری switch/case میاد این کار رو میکنه ، مگه نباید مقایسه انجام بشه؟
بخاطر همین از روی کنجکاوی رفتم سراغ بررسی کردن کدای Assembly 🗿😂
اومدم همچین کدی نوشتم :
#include <stdio.h>
int main() {
int x = 5;
switch (x) {
case 0: printf("its 0"); break;
case 1: printf("its 1"); break;
case 2: printf("its 2"); break;
case 3: printf("its 3"); break;
case 4: printf("its 4"); break;
case 5: printf("its 5"); break;
case 6: printf("its 6"); break;
case 7: printf("its 7"); break;
case 8: printf("its 8"); break;
case 9: printf("its 9"); break;
default: printf("default case"); break;
}
return 0;
}