متاسفانه اینقدر که از github actions استفاده کردم، اکانتم محدود شده و نمیتونه دیگه اکشنها رو ران کنه :(
گیتهاب خسیسه.
گیتهاب خسیسه.
💔4❤2💩1
من فایل pdf رو که با google chrome باز میکنم قابلیت اینکه بتونم از اکستنشن گوگل ترنسلیت استفاده کنم رو نداره
سر همین این سایت رو پیدا کردم. pdf رو باز میکنه و نیاز به اپلود هم نیست.
سر همین این سایت رو پیدا کردم. pdf رو باز میکنه و نیاز به اپلود هم نیست.
pdfviewer.softgateon.net
PDF Viewer Online
PDF Online Viewer, Reader is a free online tool that allows you to view PDF, DOC, XLS, PPT files directly in your web browser. PDF Viewer Online reads files without uploading the file to any servers. It does not save or share the file you select. It only…
❤4
اوضاع اینترنت داره خراب میشه.
از سگارو پرسدم گفت ریورس تانل خوب میتونه جواب بده.
اگه میتونید، بیایید همکاری کنیم یه چیزی بسازیم باهم.
pv: @m_shabane
از سگارو پرسدم گفت ریورس تانل خوب میتونه جواب بده.
اگه میتونید، بیایید همکاری کنیم یه چیزی بسازیم باهم.
pv: @m_shabane
Bit Orbit 🪐
میتونید،
خیلی کلی: ریورس تانل به سروری که از فردوسی کلاد خریدم کار نکرد. چون از خارج نمیشه بهش وصل شد اصلا :/ واقعا؟!!
ولی تونل مستقیم از ایران به اون کار کرد، اما روی اینترنت ایرانسل کلا به سرور ایران(فردوسی کلاد) نمیشه وصل شد،
چرا رفتم سرغ فردوسی کلاد؟ چون PAYG بود و من از قبل داخلش یه میزان پولی داشتم.
بنظرتون ریورس پراکسی روی سرور های دیگهای ممکنه کار کنه؟
یا مثلا از CDN اروان چی؟
ولی تونل مستقیم از ایران به اون کار کرد، اما روی اینترنت ایرانسل کلا به سرور ایران(فردوسی کلاد) نمیشه وصل شد،
چرا رفتم سرغ فردوسی کلاد؟ چون PAYG بود و من از قبل داخلش یه میزان پولی داشتم.
بنظرتون ریورس پراکسی روی سرور های دیگهای ممکنه کار کنه؟
یا مثلا از CDN اروان چی؟
Bit Orbit 🪐
خیلی کلی: ریورس تانل به سروری که از فردوسی کلاد خریدم کار نکرد. چون از خارج نمیشه بهش وصل شد اصلا :/ واقعا؟!! ولی تونل مستقیم از ایران به اون کار کرد، اما روی اینترنت ایرانسل کلا به سرور ایران(فردوسی کلاد) نمیشه وصل شد، چرا رفتم سرغ فردوسی کلاد؟ چون PAYG…
خب تا اینجا باید بگم که CDN آروان هم اصلا کار نکرد.
ترکیب vless, vmess + CDN + WS
ترکیب vless, vmess + CDN + WS
Forwarded from Woland's Linux Journal (Woland)
دسترسی به تمام برنامهها بدون vpn
با استفاده از Beeper، تمام چتهاتون رو یکجا داشته باشید.
بیپر از ماتریکس استفاده میکنه و بدون نیاز به vpn تمام چتهای شما رو اعم از تلگرام، واتساپ، توییتر، اینستاگرام، دیسکورد و ... توی خودش جمع میکنه.
ثبتنام رایگان و فقط با یک ایمیل انجام میشه.
بعد از اتصال برنامهها میتونین از طریق بیپر و بدون ویپیان تمام کانالها و چتهاتون رو ببینید و پیام بفرستید.
دانلود:
Android | iOS | macOS | Windows | Linux
لینک سایت:
beeper.com | matrix.org
#معرفی
با استفاده از Beeper، تمام چتهاتون رو یکجا داشته باشید.
بیپر از ماتریکس استفاده میکنه و بدون نیاز به vpn تمام چتهای شما رو اعم از تلگرام، واتساپ، توییتر، اینستاگرام، دیسکورد و ... توی خودش جمع میکنه.
ثبتنام رایگان و فقط با یک ایمیل انجام میشه.
بعد از اتصال برنامهها میتونین از طریق بیپر و بدون ویپیان تمام کانالها و چتهاتون رو ببینید و پیام بفرستید.
دانلود:
Android | iOS | macOS | Windows | Linux
لینک سایت:
beeper.com | matrix.org
#معرفی
👍2
من سروری که برای خودم خریدم متاسفانه از یک شرکت روسی مجبور به خرید شدم برای همین دسترسی به chatGPT و خیلی از ابزای های دیگه اصلا نداشتم. حتی با توجه به اینکه خود سرور باید توی کشور امریکا میبود!
برای همین اسکریپتی هست که چیزی به اسم وارپ فعال میکنه که برای کلادفلیر هست.
فعلا داره خوب جواب میده و باعث شده همه سرویس های اینطوری هم باز بشن برای من.
برای همین اسکریپتی هست که چیزی به اسم وارپ فعال میکنه که برای کلادفلیر هست.
فعلا داره خوب جواب میده و باعث شده همه سرویس های اینطوری هم باز بشن برای من.
GitHub
GitHub - yonggekkk/warp-yg: warp多功能一键脚本,支持warp-go与wgcf切换,无限生成warp配置文件,支持升级warp+、warp团队账户,查看VPS本地IP、netflix、chatgpt解锁状态
warp多功能一键脚本,支持warp-go与wgcf切换,无限生成warp配置文件,支持升级warp+、warp团队账户,查看VPS本地IP、netflix、chatgpt解锁状态 - yonggekkk/warp-yg
❤2🤔1
این مدت خواستم از روش icmp tunnelling بگم، اما هر 12 ساعت یکبار سرور من با این روش متاسفانه IPاش بلاک شد و اصلا استیبل نبود.
اما خیلی کلی: متصل بود و سرعت خوبی هم داشت.
اما خیلی کلی: متصل بود و سرعت خوبی هم داشت.
🔥3👍1
دوست دارم یه سایت بنویسم
برای تایمی که آدمها نیاز به خرید یک دورهای(هر محتوای دیجیتالی) دارند
بعد داخل اون قسمت کاربران دروه رو اضافه کنند و هرکسی وارد سایت که شد دورهای که دوست داره بخره رو به لیستش اد کنه،
اینطوری وقتی کسی دورهای نیاز داره هزینه بین کاربرانش تقسیم میشه.
من خواستم یک دورهی راست بخرم که مدرسش آرین اقبال بود، چند قسمتش رو به واسطهی یکی دیدم، واقعا بینظیر بود،
چون فقط سینتکس راست رو آموزش نمیداد، RFC باز میکرد و کامل توضیح میداد که مثلا چطوری یک متغیر عدد float نگهداری میکنه!
اگه بنظرتون شما هم به این دوره علاقه داشتین به منم خبر بدین باهم بگیریم.
ادرس دوره: https://anisa.co.ir/courses/software-development-courses/rust-course.html
برای تایمی که آدمها نیاز به خرید یک دورهای(هر محتوای دیجیتالی) دارند
بعد داخل اون قسمت کاربران دروه رو اضافه کنند و هرکسی وارد سایت که شد دورهای که دوست داره بخره رو به لیستش اد کنه،
اینطوری وقتی کسی دورهای نیاز داره هزینه بین کاربرانش تقسیم میشه.
من خواستم یک دورهی راست بخرم که مدرسش آرین اقبال بود، چند قسمتش رو به واسطهی یکی دیدم، واقعا بینظیر بود،
چون فقط سینتکس راست رو آموزش نمیداد، RFC باز میکرد و کامل توضیح میداد که مثلا چطوری یک متغیر عدد float نگهداری میکنه!
اگه بنظرتون شما هم به این دوره علاقه داشتین به منم خبر بدین باهم بگیریم.
ادرس دوره: https://anisa.co.ir/courses/software-development-courses/rust-course.html
❤1
این چند روز رو دارم ماتریکس ران میکنم، برای مواقعی که کلا از اینترنت قطع شدیم و کلا شبکه داخلی داشتیم
مجبور نباشیم بریم داخل پیامرسان های داخلی،
تا الان فقط بخش پیام رسانی رو تونستم بدون مشکل ران کنم.
اما یکی از قابلیت های خوبی که داره میشه باهاش تماس صوتی/تصویری گروهی بدون webRTC third party داشت!
که این قسمت رو هنوز درگیرش هستم،
یک سایت پیدا کردم که دامنهی ماتریکس شما رو میگیره و تست میکنه و هرجایی که ایراد داشته باشه رو بهتون میگه.
https://federationtester.matrix.org/
وقتی کارم تکمیل شد، روندش رو بلاگ میکنم :)
مجبور نباشیم بریم داخل پیامرسان های داخلی،
تا الان فقط بخش پیام رسانی رو تونستم بدون مشکل ران کنم.
اما یکی از قابلیت های خوبی که داره میشه باهاش تماس صوتی/تصویری گروهی بدون webRTC third party داشت!
که این قسمت رو هنوز درگیرش هستم،
یک سایت پیدا کردم که دامنهی ماتریکس شما رو میگیره و تست میکنه و هرجایی که ایراد داشته باشه رو بهتون میگه.
https://federationtester.matrix.org/
وقتی کارم تکمیل شد، روندش رو بلاگ میکنم :)
🔥6❤1👍1👏1
This media is not supported in your browser
VIEW IN TELEGRAM
یه فایل داریم توی مسیر
فایدهش برای تایمیه که کلی سرور رو باید مدیریت کنی و حفظ کردن ایپی و یورز های سرورها خیلی اذیت کنندهس.
از طرفی بازم یه ابزاری هست به اسم sshs که این رو هم راحتتر میکنه و یه TUI بر اساس اون کانفیگ برات میسازه.
ساختار فایل هم به این شکل هست که شما یک اسم برای کانکشنتون ست میکنید و بعد یوزنیم، آدرس و اگه پورت سرور ssh رو تغییر داده باشین، باید پورت رو هم مشخص کنید. برای مثال:
قبلا از asbru-cm استفاده میکردم. GUI داشت و قابلیتهای سادهای داشت. ولی یک روز که آرچ رو اپدیت کردم دیگه تصمیم گرفت که دیگه بالا نیاد و به لایبراری ارور بخوره.
~/.ssh/config
فایدهش برای تایمیه که کلی سرور رو باید مدیریت کنی و حفظ کردن ایپی و یورز های سرورها خیلی اذیت کنندهس.
از طرفی بازم یه ابزاری هست به اسم sshs که این رو هم راحتتر میکنه و یه TUI بر اساس اون کانفیگ برات میسازه.
ساختار فایل هم به این شکل هست که شما یک اسم برای کانکشنتون ست میکنید و بعد یوزنیم، آدرس و اگه پورت سرور ssh رو تغییر داده باشین، باید پورت رو هم مشخص کنید. برای مثال:
Host production/rabbitmq
HostName 192.168.1.3
User root
Host development/rabbitmq
HostName 10.10.0.2
User arya
قبلا از asbru-cm استفاده میکردم. GUI داشت و قابلیتهای سادهای داشت. ولی یک روز که آرچ رو اپدیت کردم دیگه تصمیم گرفت که دیگه بالا نیاد و به لایبراری ارور بخوره.
❤2
https://github.com/mcuadros/ofelia
این ایمیج خیلی جالبیه.
کارش اینه که مثلا شما نیاز دارین تا توی یک تایم خاصی یک کانتینر داکر اجرا بشه و روی اون یک کامند اجرا بشه و بعد exit بشه.
سینتکسش هم سادهست.
این ایمیج خیلی جالبیه.
کارش اینه که مثلا شما نیاز دارین تا توی یک تایم خاصی یک کانتینر داکر اجرا بشه و روی اون یک کامند اجرا بشه و بعد exit بشه.
سینتکسش هم سادهست.
[job-run "job-executed-on-new-container"]
schedule = @hourly
image = ubuntu:latest
command = touch /tmp/example
GitHub
GitHub - mcuadros/ofelia: A docker job scheduler (aka. crontab for docker)
A docker job scheduler (aka. crontab for docker). Contribute to mcuadros/ofelia development by creating an account on GitHub.
❤2
قطعا nexus رو میشناسین، دقیقا ساخته شده برای وضعیت ایران(اما با هدف دیگهای)
وقتی اینترنت قطع میشه و هیچ چیزی رو نمیتونید بیلد کنید چون تمامی لایبراریهایی که استفاده کردین از سرورهای اصلی npm, pypi میاد، اینجاست که یک Repository manager بکارتون میاد.
روش کارش اینطوریه که مثلا شما توی داکر تنظیم میکنید که تمامی ایمیج ها از nexus داخلی خودتون پول بشه، و با اینکار نکسوز هر ایمج رو برای شما کش میکنه و دفعه بعد از اینترنت دانلود نمیکنه.
اما حالا فرض کنید که نیاز دارین تا ایمیجها و لایبراریهای خوتون رو هم داخل یک ریپازیتوری لوکال داشته باشین، خب این امکان رو نکسوس بهتون میده.
اما یک ایرادی داره، اونم اینکه ما نیاز داریم تا وقتی میگیم مثلا ایمیجی که خودمون ساختیم رو بگیر، نکسوس ایمیج رو از ریپازتوری که تنظیم کردیم بگیره، خب اینم مشکلی نداره.
پس مشکل کجاست؟
اینکه حتما باید یک url مجزا برای pull و push رو داخل کلاینتها مشخص کنیم(تا جایی که من میدونم و سرچ کردم)چون push داخلی هست اما pull اول باید از اینترنت بیاد.
برای اینم نکسوس یه راه حل داده که نیاز نباشه دو ریپازیتوری مختلف رو تعریف کنیم، اینکه از ویژنگی group استفاده کنیم
با این ویژگی نکسوس اول سعی میکنه pull/push رو به ریموت ریپازیتوری اولی بزنه، بعد که fail شد میره سراغ دومی که همون self host خودمون روی نکسوس هست.
اما این قابلیت پولیه و یا کرک نیاز داره :(
من از این دو مورد تا جایی که یک ابزار مناسب و open source باشه دوری میکنم.
ابزار جایگزین برای nexus که همه این ویژگیها رو رایگان داره میشه pulpManager
اینکه با زبان با زبان java نوشته نشده هم شاید یه فیچر باشه :)))
وقتی اینترنت قطع میشه و هیچ چیزی رو نمیتونید بیلد کنید چون تمامی لایبراریهایی که استفاده کردین از سرورهای اصلی npm, pypi میاد، اینجاست که یک Repository manager بکارتون میاد.
روش کارش اینطوریه که مثلا شما توی داکر تنظیم میکنید که تمامی ایمیج ها از nexus داخلی خودتون پول بشه، و با اینکار نکسوز هر ایمج رو برای شما کش میکنه و دفعه بعد از اینترنت دانلود نمیکنه.
اما حالا فرض کنید که نیاز دارین تا ایمیجها و لایبراریهای خوتون رو هم داخل یک ریپازیتوری لوکال داشته باشین، خب این امکان رو نکسوس بهتون میده.
اما یک ایرادی داره، اونم اینکه ما نیاز داریم تا وقتی میگیم مثلا ایمیجی که خودمون ساختیم رو بگیر، نکسوس ایمیج رو از ریپازتوری که تنظیم کردیم بگیره، خب اینم مشکلی نداره.
پس مشکل کجاست؟
اینکه حتما باید یک url مجزا برای pull و push رو داخل کلاینتها مشخص کنیم(تا جایی که من میدونم و سرچ کردم)چون push داخلی هست اما pull اول باید از اینترنت بیاد.
برای اینم نکسوس یه راه حل داده که نیاز نباشه دو ریپازیتوری مختلف رو تعریف کنیم، اینکه از ویژنگی group استفاده کنیم
با این ویژگی نکسوس اول سعی میکنه pull/push رو به ریموت ریپازیتوری اولی بزنه، بعد که fail شد میره سراغ دومی که همون self host خودمون روی نکسوس هست.
اما این قابلیت پولیه و یا کرک نیاز داره :(
من از این دو مورد تا جایی که یک ابزار مناسب و open source باشه دوری میکنم.
ابزار جایگزین برای nexus که همه این ویژگیها رو رایگان داره میشه pulpManager
اینکه با زبان با زبان java نوشته نشده هم شاید یه فیچر باشه :)))
🤔2
فرض کنید وقتی یکی به سرورتون ssh کرد، بجای اینکه shell بگیره،
هر برنامهای که شما از قبل تنظیم کرده باشین اجرا بشه.
مثلا یک متن رندوم بهش نشون بده.
اینکار با تنظیم ForceCommand داخل ssh_config انجام میشه.
مثلا تست کنید روی سرور من, cmatrix اجرا میشه :)
NOTE: من این تست رو بر میدارم، صرفا جنبه فان داشت اما الان بنظرم دیگه ممکنه خطری باشه، گرچه تنظیمات امنیتی رو سعی کردم رعایت کنم.
هر برنامهای که شما از قبل تنظیم کرده باشین اجرا بشه.
مثلا یک متن رندوم بهش نشون بده.
اینکار با تنظیم ForceCommand داخل ssh_config انجام میشه.
#/etc/ssh/ssh_config
Match User guest
ForceCommand /home/guest/random_number.sh
مثلا تست کنید روی سرور من, cmatrix اجرا میشه :)
NOTE: من این تست رو بر میدارم، صرفا جنبه فان داشت اما الان بنظرم دیگه ممکنه خطری باشه، گرچه تنظیمات امنیتی رو سعی کردم رعایت کنم.
ssh random@random.wiregeek.ir
👍4🔥1
این مقاله/پست درباره string خیلی جاله، من قبلا درباره فرق unicode با utf-8 خونده بودم، اما اینجا بیشتر درباره تاریخشون فهمیدم،
زمانی که ascii معرفی شد کلا برای حروف انگلیسی ساخته شده بود، و البته یکسری از کاراکترها و دستورات دیگه.
مثلا برای اسپیس کد 32 و مثلا برای حرف A از کد 65 داخلش استفاده میشد.
ولی کدهای قبل 32 چی؟ اونها برای دستورات استفاده میشه مثلا کد 7 برای صدای beep هست!
حالا تمامی این کاراکترها کلا توی 7 بیت قرار میگیرن و بیشتر نیاز ندارن.
مثلا اگه حرف z رو درنظر بگیریم، کد اسکیش میشه 122
و باینری 122 میشه
اما کامپیوتر ها با هشت بیت کار میکنند، پس پیاده سازی ascii که داخل کامپیوتر یک بیت اضافهای به ما میده!(آخرین بیت سمت چپ) پس از کد 128 تا 255 برای هیچکاری استفاده نمیشه داخل تیبل ascii
اینجاست که شرکتها و برنامه نویس ها تصمیم میگیرن اون بیت آخر رو برای کار های خودشون استفاده کنند.
همچنین هر زبانی مثلا یونانی از برای خودش یه کد پیج داشته
مثلا توی بعضی از سیستم عامل ها از کد 130 برای کاراکتر
اینم باید بگم که همه قبول کردن که تمامی کد های زیر 128 دست نخورده بمونه خوشبختانه.
اینکه کدهای بالای 128 نماینده چه کاراکتری باشه بستگی داره به اینکه از چه code page استفاده میکردن. مثلا code page 862 در اسرائیل استفاده میشده و 737 در یونان.
حالا سیستم عامل DOS از کلی کد پیج ساپورت میکرده، ولی همزمان نمیشده توی یک فایل تکست از دو زبان استفاده کنی.
حالا عجیبتر اینکه این سسیتم توی زبان هایی مثل چینی بدرد نمیخوره، چون خب از 'حرف' استفاده نمیکنند و کاراکترهاشون نماده و هزاران کاراکتر دارند،
پس توی 8 بیت جا نمیشن. خب اینا چیکار کردن؟ از چیزی به اسم DBCS استفاده کردن این یعنی double bytes character set
درواقع برای پیادهسازی زبان چینی باید تعداد بایت ها رو دو برابر میکردن،
این خودش یه مشکلی داره، اینکه تایپ یک کاراکتر سادهست(حرکت رو به جلو) اما اگه بخای به عقب برگردی، این یه چالشه، چون نمیدونی کاراکتری که تایپ کردی یک بایتی بوده یا دو بایتی.
تا اینجا انچنان مشکلی نداشتیم، اما وقتی پای اینترنت به کامپیوترها باز شد، دیگه اینجا بود متنها توی سیستمهای مختلف به خوبی کار نمیکردند. و unicode اختراع شد.
به صورت خلاصه unicode به ازای هر کاراکتری یک کد داره، که بهش میگن code point، یونیکد طوری ساخته شده که حتی اگه در آیندههم کاراکتری و یا زبانی اختراع بشه، با unicode میشه یک کد منحصر بفرد بهش داد.
مثلا برای کاراکتر A از کد U0041 استفاده میشه،
و یا برای مثال U+0048 U+0065 U+006C U+006C U+006F. میشه Hello.
این کدها هگزا دسیمال هستند.
اوکی حالا سوال اینجاست که ما برای هرکاراکتری یک کد در نظر گرفتیم، اوکی خب چطوری روی هارد قراره ذخیرهش کنیم؟
در حالت اول و خب خیلی ساده میشه اکثر کد ها رو داخل 16 بیت دخیره کرد، اما دو مشکل وجود داره:
اول اینکه فضای بیشتری برای ذخیره میگیره،
دوم اینکه خب اینهمه تکست که از قبل نوشته شده، یکی باید همه اونها رو تبدیل کنه.
یا شاید یه بتونیم الگوریتم backward comaptible ایجاد کنیم.
اینجاست که جادوی utf-8 که یک encondig هست میاد وسط،
توی utf-8 از 0 تا 127 توی همون 8 بیت ذخیره میشه
و چیزی که به فضای بیشتری نیاز داره چی؟
وقتی کاراکتری بیشتر از 127 (یعنی نیاز به بیش از 7 بیت) نیاز داشته باشه، UTF-8 از چند بایت استفاده میکنه:
بایت اول یه "الگو" داره که نشون میده این کاراکتر چند بایتیه، و بایتهای بعدی با 10xxxxxx شروع میشن.
اینطوری کامپیوتر میفهمه این یه کاراکتر چندبایتیه و چطوری باید رمزگشاییش کنه.
> این متن رو از اینجا هم میتونید بخونید.
زمانی که ascii معرفی شد کلا برای حروف انگلیسی ساخته شده بود، و البته یکسری از کاراکترها و دستورات دیگه.
مثلا برای اسپیس کد 32 و مثلا برای حرف A از کد 65 داخلش استفاده میشد.
ولی کدهای قبل 32 چی؟ اونها برای دستورات استفاده میشه مثلا کد 7 برای صدای beep هست!
حالا تمامی این کاراکترها کلا توی 7 بیت قرار میگیرن و بیشتر نیاز ندارن.
مثلا اگه حرف z رو درنظر بگیریم، کد اسکیش میشه 122
و باینری 122 میشه
1111010
و همینطور که میبینید، با فقط هفت بیت حروف انگلیسی، اعداد، سیمبلها و دستورات رو میتونم داشته باشیم،اما کامپیوتر ها با هشت بیت کار میکنند، پس پیاده سازی ascii که داخل کامپیوتر یک بیت اضافهای به ما میده!(آخرین بیت سمت چپ) پس از کد 128 تا 255 برای هیچکاری استفاده نمیشه داخل تیبل ascii
اینجاست که شرکتها و برنامه نویس ها تصمیم میگیرن اون بیت آخر رو برای کار های خودشون استفاده کنند.
همچنین هر زبانی مثلا یونانی از برای خودش یه کد پیج داشته
مثلا توی بعضی از سیستم عامل ها از کد 130 برای کاراکتر
é
استفاده میشده، و یه ورژن دیگهای از همون سیستم عامل(DOS) از این کد برای کاراکتر ג
استفاده میشده.اینم باید بگم که همه قبول کردن که تمامی کد های زیر 128 دست نخورده بمونه خوشبختانه.
اینکه کدهای بالای 128 نماینده چه کاراکتری باشه بستگی داره به اینکه از چه code page استفاده میکردن. مثلا code page 862 در اسرائیل استفاده میشده و 737 در یونان.
حالا سیستم عامل DOS از کلی کد پیج ساپورت میکرده، ولی همزمان نمیشده توی یک فایل تکست از دو زبان استفاده کنی.
حالا عجیبتر اینکه این سسیتم توی زبان هایی مثل چینی بدرد نمیخوره، چون خب از 'حرف' استفاده نمیکنند و کاراکترهاشون نماده و هزاران کاراکتر دارند،
پس توی 8 بیت جا نمیشن. خب اینا چیکار کردن؟ از چیزی به اسم DBCS استفاده کردن این یعنی double bytes character set
درواقع برای پیادهسازی زبان چینی باید تعداد بایت ها رو دو برابر میکردن،
این خودش یه مشکلی داره، اینکه تایپ یک کاراکتر سادهست(حرکت رو به جلو) اما اگه بخای به عقب برگردی، این یه چالشه، چون نمیدونی کاراکتری که تایپ کردی یک بایتی بوده یا دو بایتی.
تا اینجا انچنان مشکلی نداشتیم، اما وقتی پای اینترنت به کامپیوترها باز شد، دیگه اینجا بود متنها توی سیستمهای مختلف به خوبی کار نمیکردند. و unicode اختراع شد.
به صورت خلاصه unicode به ازای هر کاراکتری یک کد داره، که بهش میگن code point، یونیکد طوری ساخته شده که حتی اگه در آیندههم کاراکتری و یا زبانی اختراع بشه، با unicode میشه یک کد منحصر بفرد بهش داد.
مثلا برای کاراکتر A از کد U0041 استفاده میشه،
و یا برای مثال U+0048 U+0065 U+006C U+006C U+006F. میشه Hello.
این کدها هگزا دسیمال هستند.
اوکی حالا سوال اینجاست که ما برای هرکاراکتری یک کد در نظر گرفتیم، اوکی خب چطوری روی هارد قراره ذخیرهش کنیم؟
در حالت اول و خب خیلی ساده میشه اکثر کد ها رو داخل 16 بیت دخیره کرد، اما دو مشکل وجود داره:
اول اینکه فضای بیشتری برای ذخیره میگیره،
دوم اینکه خب اینهمه تکست که از قبل نوشته شده، یکی باید همه اونها رو تبدیل کنه.
یا شاید یه بتونیم الگوریتم backward comaptible ایجاد کنیم.
اینجاست که جادوی utf-8 که یک encondig هست میاد وسط،
توی utf-8 از 0 تا 127 توی همون 8 بیت ذخیره میشه
و چیزی که به فضای بیشتری نیاز داره چی؟
وقتی کاراکتری بیشتر از 127 (یعنی نیاز به بیش از 7 بیت) نیاز داشته باشه، UTF-8 از چند بایت استفاده میکنه:
بایت اول یه "الگو" داره که نشون میده این کاراکتر چند بایتیه، و بایتهای بعدی با 10xxxxxx شروع میشن.
اینطوری کامپیوتر میفهمه این یه کاراکتر چندبایتیه و چطوری باید رمزگشاییش کنه.
> این متن رو از اینجا هم میتونید بخونید.
Joel on Software
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
Ever wonder about that mysterious Content-Type tag? You know, the one you’re supposed to put in HTML and you never quite know what it should be? Did you ever get an email from your friends in…
❤6🔥1
رادیو رو اپدیت کردم، تنها یه فیچر بدرد بخور بهش اضافه کردم که بشه آهنگی که داره پلی میشه رو دانلود کرد.
و خب چون هدفم از این سایت این بود که خیلی ساده باشه، دکمه دانلود رو توی منو کناریش گذاشتم که صفحهش شلوغ نشه.
و خب چون هدفم از این سایت این بود که خیلی ساده باشه، دکمه دانلود رو توی منو کناریش گذاشتم که صفحهش شلوغ نشه.
👍4❤1🔥1
یه چیزی داریم به اسم zip bomb مثلا فایل zip.42 که کلا 42 کیلوبایت هست اما وقتی اکسترکت بشه حجمش به 4.5 پتابایت میرسه. ولی چطوری؟
باید بدونیم الگوریتم های زیپ مثل DEFLATE چطوری کار میکنند.
الگوریتم های زیب وقتی میخان یه چیزی رو زیپ کنند، داده های تکراری رو حذف میکنند،
حالا فرض کنید که این دادههای تکراری دقیقا کل فایل باشه،
مثلا فایلی با سایز 4.5 پتابایت فقط پر شده از 0
حالا اگه این فایل زیپ بشه چقدر میشه حجمش؟
یه جدولی داخل فایل های زیپ هست به اسم dictionary
این جدول به یک دادهی تکراری پوینت میکنه
مثلا بجای اینکه چهار ترابایت 0 رو نگهداره
به هر جایی که قراره 0 باشه اشاره میکنه،
اما به این سادگی نیست، چرا؟ چون اصلا منطقی نیست داخل جدول یه کاراکتر بذاری و بعد داخل دیتا به این کاراکتر اشاره کنی، اینطوری حجم خود فایل بیشتر هم میشه.
پس این الگوریتم چطوری کار میکنه؟
میاد و با مجموعهای/توالی از دادههای تکراری کار میکنه.
مثلا وقتی یک توالی داده مثل 00001111 داشته باشیم، الگوریتم همه این رو یکجایی ذخیره میکنه و هرجایی که دقیقا همین دیتا تکرار شده باشه، یه پوینتر میذاره.
حالا ما یه محدودیتی داریم، اینکه ما داریم میگیم 4.5 پتابایت دادههای تکراری 0 قراره کنار هم باشن
خب این بازم منطقی نیست که بیای و توی دیکشنری همه این 0 ها رو بذاری و بگی اینا یکجا تکرار شده
و یا اینکه بگی ما یه 0 داریم و بقیه فایل همش از این 0 ساخته شده!
الگوریتم میاد و هر 258 بایت که متوالی تکرار شدن رو داخل جدول میذاره
بعد میبینه که خب 258 بایت بعدی هم که همونه! پس یه اشارهگر(پوینتر) میذاره کنار اشارهگر قبلی، و بعد دوباره همین روند رو باید برای 4.5 پتابایت دیتا انجام بده!
اینطوری به اندازه چند ترابایت ما پوینتر درست کردیم :))
پس zip bomb چطوری درست شد؟
خیلی ساده یکبار یک فایل زیپ مثلا 1 گیگ ساخته شد، بعد این فایل چند بار دیگه کپی شد و اون کپی ها زیپ شدن
این روند اینقدر ادامه پیدا میکنه تا یه فایل زیپ داشته باشیم که کلی فایل زیپ دیگه داخلش باشه(recursive)
وقتی برنامهای بخاد فایل رو اکسترکت کنه، هر فایل زیپ دیگهای هم داخل باشه اکسترکت میکنه.
من یه امتحانی کردم، با dd یک فایل 10 گیگ ساختم که همه از 0 پر شده بود.
بعد با الگوریتم lzma زیپ کردم، فایل نهایی شد 100 مگابایت.
همینکار رو مجدد تکرار کردم اما بجای استفاده از 0 از دیتای رندوم استفاده کردم، فایل زیپ هیچ تغییری نکرد.
باید بدونیم الگوریتم های زیپ مثل DEFLATE چطوری کار میکنند.
الگوریتم های زیب وقتی میخان یه چیزی رو زیپ کنند، داده های تکراری رو حذف میکنند،
حالا فرض کنید که این دادههای تکراری دقیقا کل فایل باشه،
مثلا فایلی با سایز 4.5 پتابایت فقط پر شده از 0
حالا اگه این فایل زیپ بشه چقدر میشه حجمش؟
یه جدولی داخل فایل های زیپ هست به اسم dictionary
این جدول به یک دادهی تکراری پوینت میکنه
مثلا بجای اینکه چهار ترابایت 0 رو نگهداره
به هر جایی که قراره 0 باشه اشاره میکنه،
اما به این سادگی نیست، چرا؟ چون اصلا منطقی نیست داخل جدول یه کاراکتر بذاری و بعد داخل دیتا به این کاراکتر اشاره کنی، اینطوری حجم خود فایل بیشتر هم میشه.
پس این الگوریتم چطوری کار میکنه؟
میاد و با مجموعهای/توالی از دادههای تکراری کار میکنه.
مثلا وقتی یک توالی داده مثل 00001111 داشته باشیم، الگوریتم همه این رو یکجایی ذخیره میکنه و هرجایی که دقیقا همین دیتا تکرار شده باشه، یه پوینتر میذاره.
حالا ما یه محدودیتی داریم، اینکه ما داریم میگیم 4.5 پتابایت دادههای تکراری 0 قراره کنار هم باشن
خب این بازم منطقی نیست که بیای و توی دیکشنری همه این 0 ها رو بذاری و بگی اینا یکجا تکرار شده
و یا اینکه بگی ما یه 0 داریم و بقیه فایل همش از این 0 ساخته شده!
الگوریتم میاد و هر 258 بایت که متوالی تکرار شدن رو داخل جدول میذاره
بعد میبینه که خب 258 بایت بعدی هم که همونه! پس یه اشارهگر(پوینتر) میذاره کنار اشارهگر قبلی، و بعد دوباره همین روند رو باید برای 4.5 پتابایت دیتا انجام بده!
اینطوری به اندازه چند ترابایت ما پوینتر درست کردیم :))
پس zip bomb چطوری درست شد؟
خیلی ساده یکبار یک فایل زیپ مثلا 1 گیگ ساخته شد، بعد این فایل چند بار دیگه کپی شد و اون کپی ها زیپ شدن
این روند اینقدر ادامه پیدا میکنه تا یه فایل زیپ داشته باشیم که کلی فایل زیپ دیگه داخلش باشه(recursive)
وقتی برنامهای بخاد فایل رو اکسترکت کنه، هر فایل زیپ دیگهای هم داخل باشه اکسترکت میکنه.
من یه امتحانی کردم، با dd یک فایل 10 گیگ ساختم که همه از 0 پر شده بود.
بعد با الگوریتم lzma زیپ کردم، فایل نهایی شد 100 مگابایت.
dd if=/dev/zero of=./data bs=100M count=100
tar --lzma -cvf data.lzma.tar ./data
همینکار رو مجدد تکرار کردم اما بجای استفاده از 0 از دیتای رندوم استفاده کردم، فایل زیپ هیچ تغییری نکرد.
dd if=/dev/random of=./data bs=100M count=100
tar --lzma -cvf data.lzma.tar ./data
GitHub
GitHub - iamtraction/ZOD: This is a decompression bomb (also known as zip of death or zip bomb) designed to crash or render useless…
This is a decompression bomb (also known as zip of death or zip bomb) designed to crash or render useless the program or system reading it. - iamtraction/ZOD
👍3❤1