[{"content":"Contact Information Contact: huaweilaomke402@gmail.com\nCopyright Notice Just credit the source.\n","date":"2023-09-10T21:36:10+07:00","permalink":"/en/p/pinned-announcement/","title":"Pinned Announcement"},{"content":"Introduction: Can an 11-year-old Veteran Step onto the Streets of Japan? In this test, I am pushing a NVIDIA GeForce GTX 960 (2GB)—a card released back in 2015—to its absolute breaking point by running the 2026 next-gen racing masterpiece, Forza Horizon 6.\nIs it heroically keeping up, or is it time for this legend to finally retire?\nTest Bench Specifications (E5 \u0026ldquo;God Tier\u0026rdquo; + Extreme Overclock) Looks like a budget build, but honestly, it\u0026rsquo;s a masterpiece scavenged from the deepest corners of secondhand markets like Pinduoduo and Xianyu.\nComponent Detailed Specification CPU Intel Xeon E5-2666 v3 (Turbo Boost to 3.5GHz) GPU ASUS GTX 960 DirectCU II OC LOL Edition (Core +100MHz / Memory +520MHz) VRAM 2GB GDDR5 RAM 64GB DDR3 RECC 1600MHz (Overclocked to 1866MHz) Motherboard X99 (HM55 Chipset) OS Windows 10 LTSC 2021 (64-bit) Display Toshiba 19HV15V1 (Native Resolution 1366 x 768) Storage WD 120GB M.2 SSD (System) + Toshiba 500GB HDD (Games) Please Ignore the \u0026ldquo;Unsupported Hardware\u0026rdquo; Warning Upon launching Forza Horizon 6, the system will inevitably throw an \u0026ldquo;Unsupported Hardware / Outdated Driver\u0026rdquo; warning. Don\u0026rsquo;t panic. For a 2GB VRAM card in 2026, this is standard procedure. Just click \u0026ldquo;Ignore\u0026rdquo; and you can still proceed to the Festival.\nPhase 1: Extreme Low Settings + FSR OFF (00:00 - 02:06) Tested at 1280x720P resolution with all graphics settings set to \u0026ldquo;Extreme Low\u0026rdquo;:\nVisuals: Relatively clear textures, but VRAM usage is dangerously close to the 1.9GB limit. Performance: Consistently stays around 60 FPS. Surprisingly playable for a base experience. Phase 2: Extreme Low Settings + FSR Performance (02:06 - 04:07) Enabled AMD FSR (Performance Mode):\nPerformance: Frame rates become very stable, locked well above 60 FPS. Visual Trade-off: Noticeable shimmering on car edges and \u0026ldquo;grainy\u0026rdquo; textures on distant trees. Conclusion: This is the \u0026ldquo;Sweet Spot\u0026rdquo; for the GTX 960. While there are visual sacrifices, the driving input lag is minimized. Phase 3: Extreme Low Settings + FSR Ultra Performance (04:07 - 06:05) Pushing FSR to its limit:\nPerformance: Frame rates soar past 60 FPS (Estimated 75+ FPS if uncapped). Visual Trade-off: Heavy blurring. The game looks like a port from the PS2 era. Conclusion: Redundant FPS. For a GTX 960, the visual degradation is too extreme for the extra frames. This mode is better suited for lower-end integrated graphics or cards like the GT 1030. (Note: GTX 950 is the absolute minimum for the 900 series to support DX12 for this game). Final Verdict: 2GB VRAM is Enough to Run, but Not to Win Through this benchmark, it is clear that the GTX 960\u0026rsquo;s biggest enemy in 2026 isn\u0026rsquo;t its core clock or raw compute power—it is the 2GB Physical VRAM.\nAvoid \u0026ldquo;High\u0026rdquo; Settings: Once VRAM demand exceeds 2.1GB, the game will instantly crash to the desktop. Resolution Limits: 1080P is too heavy for the 960. Stick to 720P or 768P for a smooth experience. Recording Impact: This test was recorded using OBS (NVENC H264), which consumes about 3-5 FPS. If you are just playing, expect slightly better performance. Video Version: I have uploaded the full benchmark to YouTube and Bilibili. Check out the side-by-side comparisons below. Copyright Notice: All benchmark data is original. Please credit the source when reposting.\nYouTube Version Bilibili Version ","date":"2026-05-16T10:20:28+07:00","image":"/p/gtx960-forza-horizon-6-benchmark-2026/image.png","permalink":"/en/p/gtx960-forza-horizon-6-benchmark-2026/","title":"Forza Horizon 6: GTX 960 2GB | Extreme Low Settings | FSR Off vs Performance vs Ultra Performance"},{"content":"Introduction As a classic card from 2015, can the GTX 960 still run Arknights: Endfield in 2026? Is 2GB of VRAM enough to play?\nHardware Configuration Component Specifications CPU Intel Xeon E5-2666 v3 @ 3.5GHz GPU NVIDIA GeForce GTX 960 (2GB VRAM) RAM 64GB DDR3 ECC 1600MHz (Overclocked to 1866MHz) OS Windows 10 LTSC 2021 (64-bit) Performance Test Results All results reflect performance after overclocking (Core +100MHz, Memory +520MHz).\n1. Frame Gen OFF + FSR Scaling FSR set to Performance mode.\nMetric Value Average FPS 64.4 1% Low FPS 18.7 2. Frame Gen ON + FSR Scaling Both set to Performance mode.\nMetric Value Average FPS 51.9 1% Low FPS 13.3 3. Windowed Mode No scaling applied.\nMetric Value Average FPS 90.5 1% Low FPS 27.0 ","date":"2026-02-06T12:29:18+07:00","image":"/p/gtx960-2gb-run-endfield/image.png","permalink":"/en/p/gtx960-2gb-run-endfield/","title":"[Quick Test VOL1] Can the GTX 960 2GB Actually Run Arknights: Endfield?"},{"content":"Introduction It\u0026rsquo;s my first time seeing this tea\u0026hellip; 5000 KIP for a 350ml bottle? I guess it\u0026rsquo;s a store promotion\u0026hellip;\nThis tea is Fuzz Tea, a Ready-To-Drink (RTD) Tea brand under The Coca-Cola Company. I guess because it\u0026rsquo;s non-carbonated, it uses a soft plastic bottle. The Coca-Cola I used to drink came in hard bottles.\nTasting Overall it\u0026rsquo;s sour, but it tastes pretty good—after all, it\u0026rsquo;s lemon tea. However, I\u0026rsquo;m still not used to non-carbonated drinks. But compared to this, iced black tea is a bit weak; my personal taste prefers sweet drinks.\nPrice Mine is probably a promotional version haha. The regular version would probably be twice the price. 5000 Kip converts to about 2 RMB per bottle, which is quite affordable.\nEvaluation Not bad, the price is okay, but I still think iced black tea is better.\n","date":"2026-02-05T06:58:14+07:00","image":"/p/laos-vlog-vol1/image-1.png","permalink":"/en/p/laos-vlog-vol1/","title":"[Laos VLOG.VOL1] Buying Fuzz Tea for 5000 Kip on Promotion - Pretty Good"},{"content":"PUBG Rookie Failed Match Analysis Vol.1 [!NOTE] The guide on optimization for low-end PCs will be released later along with the game review. This is a pilot for a new section; errors are expected.\nI\u0026rsquo;ve played PUBG for a long time without ever reviewing my gameplay. I usually drop into remote areas, loot up, and then head straight to the final circle. Almost every time I encounter someone, I \u0026ldquo;potato\u0026rdquo; my aim. Even with teammates, we\u0026rsquo;re basically just three walking loot boxes. I\u0026rsquo;ve never reviewed my matches, so usually, after I\u0026rsquo;m done looting, I just end up delivering my supplies to the enemy for free.\n[Core Logic]: To improve your aim, you must be willing to hot drop in places like Bootcamp (Training Center), Novorepnoye, or the Military Base.\nTrain Your Speed: In these places, whoever loots faster calls the shots. Overcome Fear: Train your ability to not be afraid of dying. Don\u0026rsquo;t worry about turning into a crate. Dying 1,000 times in the game costs you nothing. Most experience comes from watching the Death Cam to discover habits, info-gathering details, and intuition. Simply dying 1,000 times is useless; you must analyze your death回放 (Replays).\nPart 1: Landing Phase - Mindset \u0026amp; Basic Details In this episode, I originally intended to drop into a city with fewer people. However, just as I was about to open my parachute, I realized there were a ton of people right in my face, forcing me to speed up my pace.\n[Mindset]: If you see people when landing, do not panic. Whoever picks up a gun first has the upper hand. [Weapon Priority]: Early Landing: SMG (Vector) \u0026gt; Burst AR (e.g., MK47). Reason: Early game fights are mostly close-quarters; an SMG can usually down an enemy in one clip. The MK47\u0026rsquo;s burst mode has a low margin for error; if your clicking speed can\u0026rsquo;t keep up, you\u0026rsquo;ll likely miss. SMGs are the kings of close-range combat. [Looting Details]: Close the Door: Always close the door to prevent sneak attacks; windows can also serve as observation points. Angle Snapping (TPP): Use the third-person camera to peek before opening a door. Do not expose your body directly to the outside. Entry Logistics: Close the door immediately after entering to block long-range snipers or backstabs. [Field Details]: No \u0026ldquo;Shopping\u0026rdquo; in the Open: Don\u0026rsquo;t stay in open fields for too long. If there\u0026rsquo;s no cover, you\u0026rsquo;re a sitting duck. Part 2: Indoor Combat - FOV Management \u0026amp; Teamwork [ADS Timing]: Aim before you Scope: At close range, ADS (Aiming Down Sights) is prone to massive offset. If you miss, you rarely get a second chance to correct. Face-hugging Range (5-10m): Prioritize Hip Fire (don\u0026rsquo;t ADS). Reason: ADS slows your movement and narrows your vision. Hip fire allows for faster movement and better kiting. [Line of Fire Management (Core)]: Scenario: Encountering an enemy at a door, I blocked my teammate\u0026rsquo;s line of fire. Wrong Move: Standing still in the doorway. One spray from the enemy downs both of us. Correct Move: When engaging, either immediately strafe out or crouch/prone to clear the path for your teammate. [Team Mindset]: Stop Complaining: As long as your teammate revives you, the mistake is in the past. Moving on is key. [Safe Looting]: Crouch while Looting: In houses with glass doors or many windows, you must crouch. Bad Example: Standing while healing or looting = A moving target / Sitting duck. Door Thresholds: Only at doors should you briefly expose your full body to move; otherwise, stay behind cover. Part 3: Consumables - Meds are Combat Power [Healing Awareness]: Meds are for using, not for delivery: In the late game, everything is an encounter. Whoever has more energy runs faster and heals quicker. Action Guide: Keep your energy bar full at all times. Part 4: Mid-Long Range - Movement, Dueling \u0026amp; Holding [Basic Avoidance]: When spotted by a sniper, find cover or close the door immediately. [Refuse Ineffective Duels]: Gear Disparity Rule: Never duel a distant bolt-action sniper with a Holo or 1x scope. It\u0026rsquo;s pure suicide. High Risk, Low Reward: You can barely see him, but he only needs one headshot to end your game. [Movement Details]: Irregular Movement: When under fire, move with unpredictable rhythm. Healing Posture: Find cover and crouch while healing, while rotating your view to watch for flankers. Cover Awareness: When rotating between compounds, stick to cover. Don\u0026rsquo;t \u0026ldquo;stroll\u0026rdquo; in the open. [Holding Priorities]: Near then Far: The nearest enemy is the immediate threat. Clear your close proximity first. Finishing Logic: Once you down someone at a distance, you can ignore them (they can\u0026rsquo;t escape). Watch for their teammates coming for the rescue before finishing them. Part 5: Core Awareness - Sound Whoring \u0026amp; Rotation [Scenario Analysis]: Flanking an enemy but only looking forward, ignoring footsteps upstairs and the sound of a VSS (Silent Sniper). [Observation Logic]: Don\u0026rsquo;t just \u0026ldquo;rush.\u0026rdquo; Confirm your surroundings before rotating. [Detail Capture]: Death by Sound. Recognize distinct sound signatures (like the VSS). If you don\u0026rsquo;t clear your flanks, your back is just a bullseye. [Rotation Taboo]: Never loot on the way until you reach your final destination. Video There are both Bilibili and YouTube versions. Friends abroad can watch on YouTube, and friends in China can watch on Bilibili.\nYoutube Bilibili Conclusion This match was a mess in Pochinki, but skill levels were generally low. My biggest mistake was Narrow Vision (focusing only on what\u0026rsquo;s in front).\nLife Advice: Don\u0026rsquo;t just look at the 5% right in front of you. The sides and the rear are usually what determine if you live or die.\n","date":"2026-01-22T16:58:46+07:00","image":"/p/pubg-rookie-guide-optimization/image-8.png","permalink":"/en/p/pubg-rookie-guide-optimization/","title":"PUBG Rookie Failed Match Analysis Vol.1"},{"content":"How to Start and Download Minecraft with PCL2 PCL2 is a very popular Minecraft launcher, but it is not compatible with Linux and macOS because it uses the .NET runtime environment.\nStep 1: Download the Launcher from the Web Disk Official Afdian link and web disk addresses:\nDownload Address\nDownload: LanzouCloud (Extraction code: pcl2)\nJAVA download link: Azul Zulu\nStep 2: Extract the Files Right-click the downloaded file and use the built-in Windows extraction tool to select \u0026ldquo;Extract All\u0026rdquo;.\nStep 3: Run PCL2 Double-click the PCL2.exe file in the extracted folder to run the launcher.\nStep 4: Log in to your Minecraft Account This is already very simple. Enter your Minecraft account and password, then click login.\nStep 5: Download Minecraft Version Click on \u0026ldquo;Versions\u0026rdquo; in the bottom left corner of the launcher, then click \u0026ldquo;Download\u0026rdquo;.\nStep 6: Start Minecraft Click \u0026ldquo;Start Game\u0026rdquo; on the main interface.\nConclusion Startup complete.\nOther Information The CPU affects the startup speed of MC. If your CPU is low-end, please be patient.\nTry not to resize the game window if you are using integrated graphics, as it may easily crash.\nPlease do not modify the configuration files randomly. Always make a backup copy before making changes, or it will be very troublesome later.\nIf you have any questions, please leave a message in the comments section, and I will reply as soon as possible.\nBe sure to download JAVA before starting, otherwise it will not launch.\nUsing JRE is not as stable as using JDK, as versions after 1.16.5 require JDK for stable startup.\n","date":"2025-07-17T12:36:14+07:00","image":"/p/how-to-start-minecraft-and-download-pcl2/image-1.png","permalink":"/en/p/how-to-start-minecraft-and-download-pcl2/","title":"Detailed Tutorial on How to Start and Download Minecraft using PCL2"},{"content":"How to Start and Download Minecraft (HMCL Launcher Tutorial) (JAVA Edition Only) Beginners who are new to the game and don\u0026rsquo;t know how to start or download Minecraft can follow this tutorial.\nUsage and Download of HMCL HMCL is an open-source Minecraft launcher that uses JAVA as its runtime environment, allowing it to run alongside MC. As long as you have JAVA, you can use HMCL. Therefore, HMCL exists on mobile devices, Linux, Windows, and macOS, and even on Deepin and Ubuntu.\nStep 1: Download First, go to the official website to download the HMCL launcher. Official website: https://hmcl.huangyuhui.net/. Just download the latest version.\nClick where the blue circle points:\nThen click here to return to the home page:\nClick here to see the release builds:\nPrefer downloading the EXE; if that fails, download the Jar:\nStep 2: Put the file into a folder This step is to prevent folder clutter. It is recommended to create a new folder to place the HMCL launcher and related files.\nOnce done, open the launcher.\nStep 3: Start HMCL After opening HMCL, an interface will appear. Enter the download page to install a new game.\nStep 4: Download the game Select the version you need.\nVersion Description Recommendation 1.7.10 Not very smooth, laggy; requires many MODs to fix and make it usable. Old PCs stand up! 1.8.9 Relatively well-optimized with many helper tools available. Hackers stand up! 1.12.2 Suitable for Crystal PVP and 1.9 PVP. Has attack cooldown but smoother than 1.8.9; many Crystal clients available. 1.16.5 Last version to support JAVA 8 and OpenGL 2.0. Suitable for old machines. 1.18.2 Includes Cave \u0026amp; Cliffs update; many fun mods and helper tools. Good for modded play. 1.21.1 Current mainstream version for 2B2T; many helper tools. New players stand up! After finding 1.8.9, click on it to enter the next page.\nChoose a mod loader based on the mods you want to play. If you prefer the pure vanilla version, just click install without selecting a mod loader.\nDownload starts!\nInstallation successful!\nStart! Before starting, ensure you have an account. You can log in with a genuine account or use offline mode.\nAssuming you have already added an account:\nStart!\nError Handling for Old Graphics Cards and New JAVA Failed?\nThe computer\u0026rsquo;s graphics card is too old to start with the latest JAVA 8. Switch to the 51u version of JAVA. Currently, it can only be downloaded from GitHub; I\u0026rsquo;ll make a mirror site when I have time, haha.\nAfter selecting your system version, if the X64 download won\u0026rsquo;t open, use the I586 version.\nOkay, assuming you have finished the installation, let\u0026rsquo;s select the JAVA version.\nClick on the \u0026ldquo;Java\u0026rdquo; section:\nSelect the 51u version.\nCongratulations! You have successfully learned how to use the HMCL launcher to download and start Minecraft.\nIn the next issue, we will cover the usage and download of the PCL2 launcher.\n","date":"2025-07-08T19:22:13+07:00","image":"/p/how-to-start-and-download-minecraft-pcl2-hmcl-tutorial/image8.webp","permalink":"/en/p/how-to-start-and-download-minecraft-pcl2-hmcl-tutorial/","title":"How to Start and Download Minecraft (HMCL Launcher Tutorial)"},{"content":"How to start and shut down a computer (beginner version) B station video tutorial direct to How to start and shut down a computer (beginner version)\nWelcome to this computer getting started tutorial. If you are new to computers and are a little confused about how to turn them on and off, don\u0026rsquo;t worry, that\u0026rsquo;s completely normal. This article will teach you how to properly start and shut down your computer step by step in the simplest and most straightforward way.\nPart 1: How to Start a Computer (Turn on) Starting up a computer is the first step in using it. Whether it is a desktop or a laptop, the operation is similar.\n1. Find the power button\nFirst, you need to find the power button of your computer. This button is the \u0026ldquo;key\u0026rdquo; to start the computer.\nFor desktop computers (main chassis): The power button is usually located on the front or top of the main chassis. It may be a relatively large round or square button, and often has an internationally recognized power symbol (an incompletely closed circle with a vertical line in the middle). For laptops: The power button is usually located in the upper area of ​​the keyboard, and sometimes it may be on the side of the keyboard. It is similar in style to a desktop computer and also has a power symbol. 2. Press the power button\nOnce you find the power button, press it gently and then release it. You don\u0026rsquo;t need to press it for a long time.\n3. Wait patiently\nAfter pressing the button, you may hear the fan spinning and the screen will light up and display the brand logo (such as Dell, HP, Lenovo, Apple, etc.). This means that the computer is \u0026ldquo;waking up\u0026rdquo; and self-checking, a process we call \u0026ldquo;starting up\u0026rdquo; or \u0026ldquo;powering on\u0026rdquo;.\nIf your computer is stuck on a page with a lot of words, you must try the shortcut keys output in the last line above. For example, mine was left unpowered for a long time, causing the CMOS time to run out and asking me to set it. Press F1 to enter the system\nThe whole process may take tens of seconds to one or two minutes. Please wait patiently until you see the login interface or desktop of the operating system.\nPart 2: How to turn off the computer (shutdown) Properly shutting down the computer is as important as turning it on. Pressing the power button directly to shut down is an emergency operation that is not recommended and may cause file corruption or system errors.\nWe should shut down through the normal process provided by the operating system.\n1. Use the mouse to find the \u0026ldquo;Start\u0026rdquo; or Apple menu\nFor Windows system: Move the mouse to the lower left corner of the screen and click the \u0026ldquo;Start\u0026rdquo; button (usually a Windows logo). In the pop-up menu, find and click the \u0026ldquo;Power\u0026rdquo; icon. In the new options, select \u0026ldquo;Shut down\u0026rdquo;. For macOS system (Apple computer): Move the mouse to the upper left corner of the screen and click the Apple logo (). In the pop-up drop-down menu, select \u0026ldquo;Shut down\u0026hellip;\u0026rdquo;. The system will pop up a confirmation window, just click \u0026ldquo;Shut down\u0026rdquo; again. 2. Wait for the computer to shut down completely\nAfter clicking \u0026ldquo;Shut down\u0026rdquo;, the operating system will start to close all running programs and save related settings. This process also takes a little time.\nWhen the computer screen goes completely black, the indicator light on the mainframe goes out, and the fan stops, it means that the computer has been successfully shut down.\nImportant Tips: The difference between shutdown, restart, and sleep In the power options, you may also see \u0026ldquo;Restart\u0026rdquo; and \u0026ldquo;Sleep\u0026rdquo;.\nShut Down: Completely cut off the power to the computer.\nRestart: The computer will automatically shut down and then immediately turn on automatically. This is usually required after installing software or system updates.\nSleep: Put the computer into a low-power standby state. You can quickly wake it up and return to the previous working state, but it still consumes a small amount of power.\nSummary\nCongratulations! Now you have mastered the most basic operation of the computer - turning it on and off. Remember, turning it on only requires a light press of the power button, while shutting it down is recommended to operate through the system menu. Practice a few more times and you will find that it is actually very simple. Happy computer use!\n","date":"2025-07-04T16:00:18+07:00","image":"/p/computer-on-off-guide/guanji.webp","permalink":"/en/p/computer-on-off-guide/","title":"How to start and shut down a computer (beginner's version)"},{"content":"A Set of Huawei P10 Battery Photos This is a set of Huawei P10 battery photos, taken on February 26, 2025.\n","date":"2025-06-19T07:04:30+07:00","image":"/p/p10-battery-photos/IMG_20250226_202026-1.webp","permalink":"/en/p/p10-battery-photos/","title":"A Set of Huawei P10 Battery Photos"},{"content":"About Adding a Voltmeter, a 24V High-Speed Fan, and a Thermometer to My Bicycle Because frying the controller on my bicycle has basically become a daily routine, I decided to add a voltmeter, a 24V high-speed fan, and a thermometer. The high-speed fan is for heat dissipation, the thermometer is to monitor the temperature, and the voltmeter is to monitor the battery\u0026rsquo;s voltage.\nUnboxing A bunch of tools and their corresponding accessories.\nFan and Controller These two need to be put together to be effective. It used to rely entirely on passive cooling, but now that it has active cooling, it should extend the lifespan of the controller.\nThermometer and Its Probe Just place the probe directly on top of the controller, and connect the other end to the display screen.\nConnecting the Battery and the Voltmeter Together This way, it can successfully display the voltage.\nThe Final Assembled Result It works pretty well!\n","date":"2025-06-19T06:51:23+07:00","image":"/p/ebike-24v-fan-temp/IMG_20250221_063622-1.webp","permalink":"/en/p/ebike-24v-fan-temp/","title":"About Adding a Voltmeter, a 24V High-Speed Fan, and a Thermometer to My Bicycle"},{"content":"Riding My Modified E-Bike to Enjoy the Scenery Along the Way The modified e-bike can manage to run for about 3 hours on flat ground at a speed of 25 km/h, which is equivalent to a 75-kilometer range. While riding, I can enjoy the scenery along the way. I didn\u0026rsquo;t bring an action camera because my budget doesn\u0026rsquo;t support buying one, but taking photos with a phone doesn\u0026rsquo;t make much of a difference anyway, so I snapped a few, haha.\nGrassland off-roading\nAnd by the river\nUhh, I can\u0026rsquo;t push it too hard or it might break, doge\n","date":"2025-06-18T11:41:44+07:00","image":"/p/ebike-scenery/IMG_20250222_114047-1.webp","permalink":"/en/p/ebike-scenery/","title":"Riding My Modified E-Bike to Enjoy the Scenery Along the Way"},{"content":" This bicycle has been ridden for 15 years. I found that the bottom bracket, tires, brakes, and the center headset screws were getting quite old and produced strange squeaking noises when riding, so I decided to convert it into an electric bike.\nOn Taobao, there are both brushless and brushed motor versions available. However, the brushless motor version is very complicated—it has three wires, unlike the brushed one which only needs two to get the job done. Plus, brushless motors require an ESC (Electronic Speed Controller) and Hall sensors. Sellers usually sell them as whole kits, and they are not cheap. Moreover, brushless motors don\u0026rsquo;t have that \u0026ldquo;engine sound,\u0026rdquo; making the ride feel a bit dull. This brushed motor, being a gear reduction motor, produces a very loud mechanical gear sound, giving it the feel of riding a motorcycle.\nI used this MY1016Z2 brushed DC motor I had on hand to modify the bike. Honestly, I\u0026rsquo;m not a total professional at this, but I figured out some parameters and wiring diagrams while tinkering with it and thought it would be fun to share. In mainland China, you can\u0026rsquo;t officially register a heavily modified bike like this and will face fines if caught on the road. If they allowed such modifications, the speed-limited standard national e-bikes wouldn\u0026rsquo;t sell at all. But such DIY modifications are generally fine abroad.\nBecause the voltage difference (cell imbalance) of LiFePO4 (Lithium Iron Phosphate) batteries can get quite large, an active balancer is necessary. Otherwise, after prolonged use, the cells will become highly unbalanced, and the battery won\u0026rsquo;t be able to charge properly.\nSince the charging current can be quite high, reaching up to 10A, I soldered two connectors to combine the power interface and the charging interface together.\nFor motors like this, a 20A protection board (BMS) is useless even if the motor\u0026rsquo;s rated current is 13A; it will still easily trigger the overcurrent protection. So, I chose a 40A protection board. My battery has a capacity of 15Ah and a 2C discharge rate, which means the maximum continuous discharge current is 30A. The BMS rated at 40A is perfectly fine and won\u0026rsquo;t exceed the battery\u0026rsquo;s tolerance. Note that my battery pack can handle a peak discharge of 3C.\nHere is the battery pack assembly process. Once finished, it was ready to use.\nIt can also step down the 24V power to charge a mobile phone.\nMy next article will be about taking this e-bike out for a ride to enjoy the scenery!\n","date":"2025-06-17T22:11:23+07:00","image":"/p/diy-ebike/IMG_20241207_160645-2.webp","permalink":"/en/p/diy-ebike/","title":"Converting a 26-Inch Vintage Bicycle into an E-Bike with a MY1016Z2 Motor and LiFePO4 Battery"},{"content":"I Made an Electric Vehicle Battery Pack Because finished battery packs are too expensive (usually around 600-700 RMB), I decided to build my own for only about 200 RMB. The advantage of LiFePO4 is safety; the disadvantage is poor consistency. You need active balancing, or the voltage difference will increase over time, rendering it unusable. It\u0026rsquo;s best to use battery brackets for DIY packs to avoid future trouble, especially for cylindrical cells like these. Brackets are far better than epoxy boards. Also, choosing the stud-conversion version can effectively reduce installation hassle.\nThe type of battery I\u0026rsquo;m making this time is a LiFePO4 pack. 29.2V is the full charge voltage, but in actual testing, it only reaches 27V for some reason. Regardless, it works fine.\nMaterials: 8x C33 cells, 1x Daly BMS (protection board), 1x active balancer, 1x set of battery brackets, various screw connecting plates, soldering iron, etc.\nBMS, batteries, and soldering iron.\nSingle-Cell Charger Used for the initial charge of the cells. The 24-pin interface has a memory power line, which is exactly 3.2V—perfect for LiFePO4. However, the current is high (up to 10A), which might exceed the battery\u0026rsquo;s charging current. Fortunately, the power supply has overcurrent protection, so there\u0026rsquo;s no need to worry.\nFinal Use: Electric Vehicle Battery ","date":"2025-06-17T06:50:52+07:00","image":"/p/lstl-29v-diy/IMG_20250201_200343.webp","permalink":"/en/p/lstl-29v-diy/","title":"DIY LiFePO4 Power Battery Pack (8 Cells in Series, 29V)"},{"content":"Kuaishou LOL Memes These are seriously hilarious, including Big Yu memes – they\u0026rsquo;re making my butt spin!\nThe \u0026ldquo;Edgy\u0026rdquo; Version Below ","date":"2025-03-13T19:23:07+07:00","image":"/p/kuaishou-emoji/52089760414015464501727703452298-1.webp","permalink":"/en/p/kuaishou-emoji/","title":"Abstract Kuaishou Emoji Extravaganza (Collector's Edition)"},{"content":"Preface The thing is, I bought a small GTX750 graphics card on Taobao for the first time when I was learning to install a computer. It cost me more than 130 yuan. But it had a distorted screen when it was sent to me. Although it is now in my cabinet as a figurine, I still want to say that if you want to buy it, buy it from a more expensive store. Don\u0026rsquo;t go to some cheap stores or Xianyu to take advantage of it. I suffered a loss (the courier fee for returning the money for buying a card is very expensive).\nGTX750 graphics card A GTX750 graphics card supports HEVC hardware decoding and encoding. I actually bought the wrong card because I didn\u0026rsquo;t do enough homework. In fact, I could have enjoyed better performance by paying a little more money to buy a 750Ti. . .\nThere are many types of interfaces, at least more universal than the DP+HDMI+DVI of the GTX960.\nAfter installing the motherboard There is no problem with the installation, but the network card blocks the fan, so the fan noise is quite loud, and the cooling effect of the graphics card is also average, but the power consumption of the graphics card is not high, so it is not a big problem.\nOther perspectives 6PIN power supply used\nOverall appearance It\u0026rsquo;s actually my E5 computer XD\nRun wifi password cracking EWSA The speed is OK\nTest the machine Time is running out. After the machine is baked, the screen is distorted when playing games\nThe screen is distorted. The screen is distorted The fleeting graphics card\nThe screen is distorted Various flower screens minecraft Finally, I used a hair dryer to save the video memory. In fact, it only worked for a while, and then the screen was distorted again.\nFollow-up This GTX750 eventually broke down, so I replaced it with a GTX960. After the oven repair, it still couldn\u0026rsquo;t be turned back on, so I threw it into the figurine stand. Haha.\n","date":"2025-03-03T20:57:23+07:00","image":"/p/nvidia-gouwu-gtx750/IMG_20240917_163138-1.webp","permalink":"/en/p/nvidia-gouwu-gtx750/","title":"I bought a broken GTX750 graphics card"},{"content":"Preface I bought GTX750 and found that the memory soldering error caused the screen to be distorted\nTake it apart and check\nPut it in oven\nPut it in oven\nEnding It is better to find a repairman. After the graphics card was baked, the plastic parts were destroyed.\n","date":"2025-02-19T22:02:30+07:00","image":"/p/%E5%B0%9D%E8%AF%95%E4%BD%BF%E7%94%A8%E7%83%A4%E7%AE%B1%E4%BF%AE%E5%A4%8Dgtx750%E6%98%BE%E5%8D%A1%E5%A4%B1%E8%B4%A5%E4%BA%86/IMG_20240921_114449.webp","permalink":"/en/p/try-to-use-oven-to-repair-gtx750-graphics-card-failed/","title":"Try to use oven to repair GTX750 graphics card (failed)"},{"content":"Computer assembly Since the performance of my laptop is already the performance of ten years ago, that is, the first generation of I3 390M, upgrading the memory can alleviate the lag, but after all, it has been there for years.\nComputer configuration The following is a table based on the information you provided:\nComponent name Specification/description Price (RMB) Remarks Power supply Unknown 500W (actually 400W is enough) 30 Actual power 400W is enough CPU E5 2666V3 20 Memory stick DDR3 64GB (16GB x 4) 40 10 yuan per stick SSD Western Digital M.2 120GB 20 NGFF hard drive Motherboard X99 magic modified board 80 Graphics card GTX960 300 A bit expensive Monitor - 100 Chassis - 0 Free Keyboard and mouse - 10 Total 710 Modeling, PUBG, Minecraft, Horizon 4 and other games Parts display Actually some stock photos\nMemory stick ECC REG is referred to as RECC memory stick, a memory stick used on servers, but E5 can be used directly, and there are many obsolete server memory sticks that are very cheap.\nCPU radiator 6 heat pipe tower radiator\nPower supply 500W Jinhetian power supply, at least better than Juebai.\nOptical drive Ordinary optical drive, used to organize the contents of the optical discs at home\nMotherboard Produced by a small workshop of a miscellaneous X99 brand\nChassis fan I bought three\nFamily portrait Installation process Installing parts to the motherboard I wanted to install a network card but found out it was M.2. . .\nInstall the motherboard to the chassis Install this inside the chassis\nInstall the power supply Weird operation but observe the chassis Install the system Convert an old computer power supply to a charger Monitor Install the motherboard pins Install the PCIE wireless network card GTX960 Minecraft TrollHack frame rate test Second-hand deteriorated gaming mouse Minecraft has 200FPS when looking at the sky I want to download 1.21.1 but I found that there is no network connection Resurrected and entered the game again The screen is distorted again after playing MC Enter the BIOS to adjust the parameters Repair system test ","date":"2025-02-13T22:10:43+07:00","image":"/p/computer-diy-e5-gtx960/IMG_20240917_175545-1.webp","permalink":"/en/p/computer-diy-e5-gtx960/","title":"Assembling my first super cheap desktop! E5CPU+GTX960"},{"content":"1.21 Low-End Shader Recommendations Below are the low-end shader recommendations and analyses for Minecraft version 1.21, combining visual effects, performance optimization, and suitable scenarios to provide a reference for players with different needs. The shaders recommended in this article support either Bedrock Edition or Java Edition (please note compatibility) and include official download links.\n1. MakeUp Ultra Fast Shaders Keywords: Minimalist performance, Super low-end friendly\nCore Features: Focuses on \u0026ldquo;ultra-fast rendering\u0026rdquo; by removing complex lighting effects while retaining basic shader enhancements like dynamic shadows and soft sky lighting. Suitable for frame-rate-sensitive older devices (such as laptops with integrated graphics or mobile phones). Advantages: At default settings, the frame rate is close to vanilla Minecraft. However, by adjusting parameters, simple water reflections and dynamic clouds can be enabled to balance performance and visuals. Suitable Scenarios: Survival players, Redstone engineers, and other users who require long-term smooth performance. Download Link: MakeUp Shaders 2. BSL Shaders Keywords: Classic \u0026amp; balanced, Highly customizable\nCore Features: As a veteran low-end shader, BSL is known for its natural tones and mild contrast, supporting high customization (such as cloud shapes and water transparency). Advantages: Low performance cost at default settings, and it offers a \u0026ldquo;Performance Mode\u0026rdquo; to further optimize frame rates, making it highly suitable for mid-to-low-end PCs. The lighting depth is vastly superior to vanilla, especially standing out in cave and forest environments. Disadvantages: The visual style leans slightly conservative, lacking the \u0026ldquo;cinematic\u0026rdquo; effects seen in Photon or Bliss. Download Link:BSL Shaders 3. Solas Shader Keywords: Fresh style, Dynamic weather\nCore Features: Features bright tones and a dynamic weather system. The rain and snow effects are detailed, and natural halos form when light penetrates the clouds. Advantages: Advanced optimization algorithms. At the exact same visual quality, the frame rate is 10%~15% higher than BSL, and it supports the mobile Bedrock Edition (requires manual adaptation). The skybox and aurora effects are major highlights [citation: user provided link]. Suitable Scenarios: Players who love exploring the open world and highly value the environmental atmosphere. Download Link: Solas Shader 4. Photon Shader Keywords: Low-end GOAT, Cinematic tones\nCore Features: Hailed by players as the \u0026ldquo;ceiling of low-end shaders,\u0026rdquo; Photon achieves both high frame rates and high quality through optimized algorithms, supporting SSGI (Screen Space Global Illumination) and dynamic volumetric fog. Advantages: Lighting Details: Softened shadows, natural AO (Ambient Occlusion), and highly cinematic day-night transitions. Performance: Default settings yield a frame rate 20% higher than BSL, and smoothness can be further boosted by disabling SSGI. Disadvantages: Water reflection effects are relatively weak, and the high contrast in cave scenes might cause visual fatigue over time. Download Link: Photon Shader 5. IterationT 3.2.0 (Unofficially known as ITT3.0) Keywords: Technological innovation, Next-gen experience\nCore Features: A top-tier Chinese-developed shader. It integrates high-end features like volumetric clouds, PBR material reflections, and parallax mapping, yet is exceptionally optimized, running smoothly even on mid-to-low-end devices. Advantages: Visual Effects: Dynamic volumetric clouds, realistic water ripples, and fully supports the \u0026ldquo;Distant Horizons\u0026rdquo; mod to expand distant rendering details. Performance Optimization: Compared to previous versions, 3.2.0 boosts frame rates by 30% and supports multiple loaders like OptiFine and Iris. Suitable Scenarios: Players pursuing a breakthrough in graphics with decent device performance (Recommended RAM ≥ 8GB). Download Link:IterationT 3.2.0 Comprehensive Comparison \u0026amp; Selection Guide Shader Name FPS Priority Visuals Priority Recommended Scenarios MakeUp ★★★★★ ★★☆ Survival, Redstone BSL ★★★★☆ ★★★☆ Building, Forest Exploration Solas ★★★★☆ ★★★☆ Dynamic Weather, Aurora Photon ★★★★☆ ★★★★☆ Cinematic Photography, Day-Night Cycle IterationT 3.2 ★★★☆☆ ★★★★★ Distant Views, Water Effects Installation \u0026amp; Tuning Tips Compatibility Check: Ensure the shader pack matches your game version and shader loader (e.g., OptiFine, Iris). Parameter Adjustment: Disabling effects like \u0026ldquo;Volumetric Fog\u0026rdquo; and \u0026ldquo;SSR Reflections\u0026rdquo; can significantly boost frame rates (applicable to Photon and IterationT). Resource Pack Conflicts: If using HD texture packs, it is recommended to lower the render distance to balance overall performance. ","date":"2025-02-01T10:55:59+07:00","permalink":"/en/p/wdsj-shader/","title":"Minecraft Low-End Shader Recommendations"},{"content":"Grade problem I feel like I\u0026rsquo;ll be in trouble if I keep playing, doge\nI came back to see it in 2025 Hahaha, nothing has changed. At that time, I could still win easily, but now I regret it. (I hope I can pass the exam)\n","date":"2024-10-27T22:16:47+07:00","image":"/p/%E6%97%A5%E8%AE%B0-10.27/%E6%8D%95%E8%8E%B7.webp","permalink":"/en/p/diary-10.27/","title":"Today's 10.27 Diary"},{"content":"Easy-to-use automatic synchronization software: FreeFileSync Recently, I studied how to automatically back up files from a computer to a mobile hard disk, and found that many people are recommending FreeFileSync (official website: FreeFileSync).\nThis is a free software, and installation packages are provided in various systems. The software installation process is very simple. At present, I have installed it directly to the C drive. After installation, you can see two software: the green FreeFileSync and the red RealTimeSync. The method we use is: first use the green one to set the synchronization options, and then use the red one to execute and monitor the automatic synchronization of the directory.\nNote:\n**1. Please confirm whether the path is correct before synchronization! Do not write the two paths in reverse! ! ! **\n**2. This software is equivalent to automatic copy and paste. It is recommended to select [Historical Version] in [Synchronization Settings] - [Synchronization] - [Delete Files] to save the historical versions of the files that will be overwritten and deleted to avoid file loss! ! ! **\n3. At present, some people have used this software to cause file loss (I did not find this situation during use, which may be caused by using a cloud disk). Please test it before formal use and download the software from the official website ( FreeFileSync )\nSynchronization options Open the green software, click the gear-shaped settings button above, and the synchronization configuration menu will pop up:\nMy usage scenario is: I want to back up multiple versions of data, so I will put all files in the mobile hard disk but will not copy the files in the mobile hard disk back, that is, I need to perform one-way synchronization**(Note: In this configuration, the redundant files/historical versions of files in the mobile hard disk will be deleted, not two-way synchronization!)**; and I want to save the historical versions of files to another folder, so my settings are as shown in the figure:\nThe folder here for historical versions is similar to the Recycle Bin, which will record the historical versions of each file. **Note: It is best not to select [Permanent], otherwise the historical versions of the overwritten/deleted files cannot be restored! **\nThe left side is the source path of the file to be copied, and the right side is the target path (folder in the mobile hard disk). **Note: Do not write the paths of the two folders in reverse! **\nAfter configuration, you can save this file. File-Save As can save this configuration as a normal synchronization file, which can be synchronized by clicking the mouse in the green software; and File-Save as Batch Job can save it as a ffs_batch file, which can be used for automatic synchronization.\nAutomatic synchronization settings Open the red software, File-Open Select the ffs_batch file just created, and you can perform automatic synchronization. You can set the time interval for automatic synchronization (the default is 10 seconds).\nIf the folder is on a mobile hard disk, the software will detect whether there is such a drive letter. If not, j will not act rashly. Therefore, synchronization can be performed every time the hard disk is plugged in.\nDrive letter setting Since the drive letter on Windows may change, we can use the name of the disk instead of the drive letter. For example, my mobile hard disk is called HenryFox (right-click and rename to change the name):\nWhen setting the drive letter, we can use the name of the disk instead of the drive letter, such as:\nIn this way, there will be no error caused by different drive letters due to different insertion order of the mobile hard disk.\nAutomatically start synchronization on Windows First, we need to find the location of the RealTimeSync we installed, and just right-click on the shortcut and open the file location**.\nAfter opening, click the address bar and you can copy the directory where the file is located. For example, mine is C:\\Program Files\\FreeFileSync\nNext, write a txt text file with the following content:\n1 2 @echo off start \u0026#34;realtimesync\u0026#34; \u0026#34;C:\\Program Files\\FreeFileSync\\RealTimeSync.exe\u0026#34; C:\\Users\\HenryFox\\Desktop\\Backup and Recording\\DataFolderSyncSettings.ffs_batch The first half of C:\\Program Files\\FreeFileSync needs to be replaced with your FreeFileSync directory, and the path to your ffs_batch file is after the space. Note: If the path has spaces, it needs to be enclosed in double quotes\nNext, use File-Save As to save, and set the encoding to ANSI\nFinally, open the startup folder and copy the bat file just now! (The steps to open the startup folder are: press win+R on the keyboard, enter shell:startup and press Enter)\n","date":"2024-08-23T12:20:39+07:00","image":"/p/shuju-backup/v2-d7bb4c518630c9e10a995526cef3759b_b.webp","permalink":"/en/p/shuju-backup/","title":"FreeFileSync Tutorial"},{"content":"Software RAID is a disk array function implemented through operating system-level software, eliminating the need for expensive hardware RAID controller cards. While it may not match hardware RAID in terms of extreme performance, it excels in being free of charge and easy to configure, making it a very stable low-cost storage and data redundancy solution.\nIn this article, we will use Windows Server 2022 as an example (though this method applies to Windows XP and all subsequent versions) to walk you through how to create and configure software-based RAID in Windows.\nStep 1: Prepare Hard Drives and Enter \u0026ldquo;Disk Management\u0026rdquo; Connect the prepared hard drives to your computer and boot into Windows. Right-click the Start icon at the bottom of the screen and select Disk Management from the system menu. If the newly connected disks are not yet initialized, a prompt will automatically appear. Choose either MBR or GPT partition style based on your capacity needs to complete the initialization. Step 2: Understanding Disk Volume Types in Windows In the Disk Management interface, right-click the \u0026ldquo;Unallocated\u0026rdquo; space of any new disk. You will see several options for creating new volumes. Before proceeding, it is important to understand their differences and use cases:\nSimple Volume: The most basic partition type, created using free space on a single hard drive. Spanned Volume: Stitches space from two or more disks together into a single large drive letter. it provides no performance boost or data redundancy; if one disk fails, the data may be at risk. Striped Volume (Similar to RAID 0): Distributes data across multiple disks, significantly improving read/write (I/O) performance. The downside is that it provides no data redundancy or fault tolerance. If any one disk fails, all data in the entire volume will be lost. There is no limit on the number of disks. Mirrored Volume (Similar to RAID 1): Requires at least two disks. Data is written to both disks simultaneously, creating a mirror copy (50% space utilization). If one disk fails, the other takes over seamlessly. This offers high data security, but read/write performance improvements are negligible. RAID-5 Volume: Requires at least 3 disks. It offers a perfect balance between read/write speed and data fault tolerance. The usable capacity is calculated as Capacity of single disk × (Total number of disks - 1). Note: In the Windows ecosystem, usually only Server editions support creating this volume type directly. Step 3: Hands-on: Creating a RAID-5 Volume Now, let\u0026rsquo;s demonstrate how to configure a RAID-5 volume, which balances speed and safety.\nRight-click the \u0026ldquo;Unallocated\u0026rdquo; space of any target disk, select New RAID-5 Volume, and click \u0026ldquo;Next\u0026rdquo; on the wizard welcome page. Select Disks: In the disk selection interface, move the disks you want to include in the RAID 5 array from the \u0026ldquo;Available\u0026rdquo; list on the left to the \u0026ldquo;Selected\u0026rdquo; area on the right by clicking \u0026ldquo;Add.\u0026rdquo; Assign Drive Letter: Assign an easily identifiable drive letter (e.g., D:, E:) to the array you are about to create, or you can choose to mount it under an empty NTFS folder. Format Settings: Choose the file system (usually NTFS by default) and a Volume Label (the name of the drive, e.g., \u0026ldquo;Data_RAID5\u0026rdquo;). It is highly recommended to check \u0026ldquo;Perform a quick format\u0026rdquo; to save time, then click \u0026ldquo;Next.\u0026rdquo; Confirm Information: Review all settings and click \u0026ldquo;Finish.\u0026rdquo; (Note: A prompt may appear stating that the operation will convert basic disks to dynamic disks. This is a required step for software RAID; click \u0026ldquo;Yes\u0026rdquo; to proceed.) Step 4: Wait for Synchronization and Begin Usage After completing the wizard, return to the main Disk Management interface. You will notice the disks have changed to a specific color representing the array (RAID-5 is typically cyan).\nThe system will perform a short formatting and data synchronization process in the background. Once the status shows as \u0026ldquo;Healthy\u0026rdquo;, your Windows software RAID array is ready. You can now use it in \u0026ldquo;This PC\u0026rdquo; just like a standard hard drive!\n","date":"2024-08-23T12:00:32+07:00","image":"/p/raid-windows/1.webp","permalink":"/en/p/raid-windows/","title":"Complete Guide to Creating Software RAID on Windows"},{"content":"Reasons Whether it\u0026rsquo;s jailbreaking, tweaking parameters, replacing IPA data, or modifying system files, there\u0026rsquo;s always a risk of rendering the system and apps unusable.\nA backup is the lowest-risk and most efficient insurance against this.\nThe Main Thread of This Tutorial Series This article is part of a series. If you came from a search engine and are interested, you can check out the other tutorials in the main directory.The Ultimate Guide to Tinkering with iPhone 6 and iOS 12 (Jailbreak + Optimization + IPA Reverse Engineering + App Downgrade + Firmware Flashing + Full Backup + IPA Personal Signing + Jailbreak Tweak Recommendations + Notes + Resource Downloads)\nYou are currently at: Using i4 Tools to Fully Back Up iPhone 6 Data + Backup File Analysis\nDownloading i4 Tools Since we need to back up iOS data, we inevitably think of downloading iTunes. However, i4 Tools (Aisi Assistant) makes backing up iOS much more convenient (it\u0026rsquo;s essentially a wrapper software using iTunes as its core).\nDownload i4 Tools\nDownload either the 32-bit or 64-bit version.\nOpening and Installing the Software After clicking the program, the installation page appears.\nClick \u0026ldquo;Install\u0026rdquo; on the installation page.\nEntering the Software Find the software icon on your desktop.\nAfter it finishes installing the necessary drivers, we can successfully enter the interface shown below.\nConnecting the Phone and Trusting the Computer Use a data cable to connect your phone to the computer.\nA \u0026ldquo;Trust\u0026rdquo; or \u0026ldquo;Don\u0026rsquo;t Trust\u0026rdquo; prompt will appear on your phone.\nAfter a successful connection, it will look like this:\nStart Backing Up the Phone Directly click the Backup/Restore Data button on the home page.\nFull Backup An iOS full backup refers to copying almost all data and settings from your iPhone or iPad to another location, such as your computer, iCloud, or an external hard drive. Unlike iCloud backups or selective iTunes backups that only save specific data types, a full backup creates a complete snapshot of your device.\nA full backup usually includes the following:\nDevice settings: Including display brightness, wallpapers, sounds, notifications, Touch ID settings, etc. App data: Including the apps themselves, app settings, game progress, login info, etc., but not all apps support data backup. Photos and videos: Including Camera Roll, Photo Stream, albums, etc. Messages: Including iMessage, SMS, and MMS. Call logs: Including outgoing, incoming, and missed calls. Contacts: Including all contact information. Calendar: Including all calendar events and reminders. Notes: Including all notes and attachments. Voice Memos: Including all recordings. Health data: Including steps, heart rate, sleep data, etc. Safari browser data: Including bookmarks, history, cookies, etc. Keychain data: Including Wi-Fi passwords, website login info, etc. Please note that a full backup does NOT include the following:\nDownloaded music, movies, and TV shows: These are usually copyright-protected and need to be re-downloaded from the iTunes Store, App Store, or other sources. Data stored in iCloud: This data is already in the cloud and does not need to be included in the local backup. Face ID or Touch ID data: For security reasons, this data is not backed up. Apple Pay information: For security reasons, this is not backed up. Pros of a full backup:\nComprehensive data protection: Backs up almost all data on the device. Easy restoration: Can be used to restore the device to its previous state. Convenient data migration: Can be used to transfer data to a new device. Cons of a full backup:\nLarge file size: Requires a lot of storage space. Longer backup time: Takes more time to complete. Operation Steps There is a difference in content between unencrypted and encrypted backups:\nPlease note that the content included in an unencrypted backup and an encrypted backup varies. An encrypted backup may contain information not found in an unencrypted backup, including: your saved passwords, Wi-Fi settings, website history, Health data, and call history.\nDirectly click \u0026ldquo;Backup Now\u0026rdquo; (立即备份).\nThe backup process begins.\nThe Difference Between Password-Protected and Unprotected Full Backups Full Backup Data is Encrypted You will notice that the full backup files are encrypted by default.\nThis is what it looks like when viewed through i4 Tools\u0026rsquo; built-in viewer.\nSelective Backup (Customized Backup) With this type of backup, you can freely select the specific data you need, except you cannot back up in-app data.\nThe main difference is that data backed up this way is not encrypted.\nImportant Notes The full backup file is generally best suited for the current device. If you switch to a different phone model, there is no guarantee that everything will work perfectly upon restoration.\nSome app data may become invalid or corrupted, such as WeChat and QQ.\nIt is highly recommended to use the official built-in backup features for WeChat and QQ to migrate your chat history.\n","date":"2024-07-21T12:35:22+07:00","image":"/p/ios-backup-i4-iphone/%E5%9C%96%E7%89%8721.webp","permalink":"/en/p/ios-backup-i4-iphone/","title":"Using i4 Tools to Fully Back Up iPhone 6 Data + Backup File Analysis"},{"content":"Zram is usually used in embedded devices such as Android phones. For example, in a 2.0GB running memory, there are 1.8 real running memory and 0.2 zram memory to make up the number. Another advantage of zram is that it does not occupy hard disk space or wear hard disk\nThe difference between zRAM and Swap zRAM and traditional swap space (Swap) are technologies used by Linux systems to increase available memory, but their working methods and usage scenarios are different.\nTraditional Swap Space (Swap):\nStorage Medium: Swap usually uses a hard disk drive (HDD) or solid-state drive (SSD) as a swap area.\nPerformance: Because hard disks are much slower than RAM, using swap may significantly slow down the system, especially when memory is exhausted.\nReliability: Swap is on a different physical medium, so it does not affect the life of RAM.\nPurpose: It can be used as an overflow area when physical memory is exhausted, but due to its slow speed, it is usually only suitable for very low memory pressure.\nzRAM:\nStorage Medium: zRAM is a compressed RAM block device that uses the memory itself to store compressed data.\nPerformance: zRAM reads and writes much faster than traditional swap because it operates directly on RAM. Compressing and decompressing data requires some CPU resources, but usually this overhead is less than the time to read and write data from the hard disk.\nReliability: Because zRAM uses RAM, frequent reading and writing may affect the life of RAM, although the actual impact is very small.\nPurpose: zram is very suitable for devices with limited RAM or that need a fast swap area, such as embedded devices or old computers, and is also commonly used in Android devices.\nSummary: zRAM provides a way to increase the effective memory capacity without increasing physical memory, by creating a compressed block device in RAM.\nTraditional swap space (Swap) is a part of the hard disk that is used as virtual memory when the system\u0026rsquo;s physical memory is insufficient.\nzram is particularly suitable for systems with small memory because it can add some \u0026ldquo;virtual\u0026rdquo; memory with little performance overhead, although this will increase the burden on the CPU.\nTraditional swap is suitable for situations where there is enough hard disk space and the memory pressure is not very large, especially when the system load is not high, but occasionally more memory is needed.\nThe best practice may be to use zRAM and traditional swap together for more flexible and optimized performance. When memory is tight, zRAM can provide faster data exchange, and when zRAM is also exhausted, traditional swap can be used as a last backup.\nOne-click script setting https://github.com/spiritLHLS/addzram\nhttps://github.com/spiritLHLS/addswap\nSwap memory (occupies hard disk space) Update time: 2023.08.27\nAdd swap partition (virtual memory) for openvz and kvm virtualized linux servers\n1 curl -L https://raw.githubusercontent.com/spiritLHLS/addswap/main/addswap.sh -o addswap.sh \u0026amp;\u0026amp; chmod +x addswap.sh \u0026amp;\u0026amp; bash addswap.sh Added automatic addition of swap when restarting the openvz architecture\nOpenvz\u0026rsquo;s addition = stealing the bell from the ears, which is actually due to virtualization restrictions and should not be added. It can only be controlled by the virtualized host. Similarly, LXC virtualization can only be controlled by the host, and virtual memory SWAP cannot be added autonomously\nUnit conversion: input 1024 to generate 1G SWAP memory\nZram memory (CPU usage) Updated: 2023.08.30\nEnable zram device (compressed memory) for linux server\n1 curl -L https://raw.githubusercontent.com/spiritLHLS/addzram/main/addzram.sh -o addzram.sh \u0026amp;\u0026amp; chmod +x addzram.sh \u0026amp;\u0026amp; bash addzram.sh It’s just that zram is compressed memory usage, and swap is additional virtual memory to increase memory space. Both will occupy CPU resources. zram is better used on machines with redundant CPU performance\n(In theory, zram will have lower performance usage than swap, but it has not been actually tested)\nUnit conversion: Enter 1024 to generate 1G of zram device compressed memory. The size of the zram device should not be larger than the actual memory size.\n","date":"2024-07-18T20:20:43+07:00","image":"/p/linux%E5%A6%82%E4%BD%95%E5%BC%80%E5%90%AFzram/install-zram-ubuntu.webp","permalink":"/en/p/how-to-enable-zram-in-linux/","title":"How to enable Zram in Linux"},{"content":"Introduction Doxing (also known as \u0026ldquo;opening the box\u0026rdquo; or exposing someone\u0026rsquo;s household register) and intimidation have become frequent occurrences on the Chinese internet. Leaking personal information can make the victim fearful, thereby stopping them from continuing to do certain things.\nDoxing and Intimidation Go Hand in Hand These two are usually connected. After doxing someone and obtaining their personal information, the abuser will send this info to the victim to achieve an intimidating effect. Threatening first and doxing later is rare, mostly seen among penniless elementary school kids.\nIntimidation simply relies on low-cost methods to scare the victim, such as extreme verbal abuse or threatening to send razor blades. I am completely used to this method because, in the Minecraft PvP hacker community I am in, most of the kids don\u0026rsquo;t have the money to actually pay for a dox. At most, they just talk big. If they actually sent me razor blades, I\u0026rsquo;d just use them to cut things—free stuff, why not use it?\nActual doxing is generally seen among vocational school students or delinquents with a bit of money. When they get into a dispute with someone, they usually collect the person\u0026rsquo;s personal information first, and then go straight to Telegram to publicly expose the victim\u0026rsquo;s data.\nCases Other cases can be found all over the place; it is an incredibly common occurrence.\nHow to Prevent Being Doxxed Do not give out too much personal information to anyone other than your close friends and family, and never casually click on websites or links provided by strangers.\nDoes Calling the Police Work? Reporting to the police usually ends up yielding no results. This is because doxxers are typically hiding in the shadows while the victim is out in the open, making it extremely difficult to track them down. Even if they are caught, they usually don\u0026rsquo;t have the money to compensate for your losses anyway. These types of people are generally just internet idlers with too much time on their hands, looking for a cheap sense of superiority online.\n","date":"2024-07-18T19:53:07+07:00","permalink":"/en/p/huji-beikai/","title":"How to Respond if You Are Threatened or Doxxed"},{"content":"Introduction Moving is both time-consuming and expensive. It is something I have to keep facing until I finally have a permanent residence.\nLet me share the stories of my previous moves The Story of My First Move My mom came to Laos and brought me along to work. Later, when I was 3 years old, my mom started her own business. My grandpa chose a place, which was this small single-story bungalow.\nAt that time, our home was just a small bungalow. Life was okay and we had food on the table, but after living there for a while, I contracted myocarditis. I had to take a trip to Kunming, Yunnan, and only got better after taking traditional Chinese medicine prescribed by a doctor. Because the landlord wanted to build a new house on the plot, we had to move out.\nAt this place, I got to know the grandpa next door who sold bread; he was a really nice guy. Now, the place is empty. He used to drink beer often and passed away from liver cancer. There was also the kid from the optical shop next door.\nThe Second Move For the second move, the roof leaked after we moved in. A very dedicated worker tried to fix it for half a day, even cutting his hands on the iron sheets, but still couldn\u0026rsquo;t completely fix it. A leaking roof leaks wealth; we could never save up any money while living there.\nWhile living here, a tuk-tuk once crashed into our family car. Someone came to tell us, and through that incident, I made a friend named Liu Rui, and another named Liu Xing. They have since moved away.\nThe Third Move For the third move, our home was no longer a small single-story house but a two-story building. Here, I became friends with the child of the uncle next door. Now, that uncle has passed away due to heart problems, and the family has moved away as well.\nThe Fourth Move This time we moved to the main street, into a three-story building, which is where I am right now. However, there are some Chinese people nearby producing toxic fumes, causing my mom and me to suffer from high uric acid levels and dizziness, so we have no choice but to move once again.\nThe Fifth Move To protect my own privacy, I won\u0026rsquo;t disclose this one for now.\nAfterword Moving is exhausting and bitter. Every time I move, I learn something new, and every time, some of my belongings get damaged. But even so, I still persevere.\n","date":"2024-07-03T21:13:46+07:00","permalink":"/en/p/gonewhome/","title":"Moving Diary"},{"content":"What is a Forum? A forum is a place where many people can chat together, but it lacks the real-time nature of apps like WeChat. Back around the year 2000, early forums were those black-background BBS systems. Everyone used dial-up internet, which was very slow, so all sessions had to be cached locally, replied to, and then uploaded to the server. Today\u0026rsquo;s forums, such as V2EX and various domestic forums in China, mostly retain the classic thread-based style of those early days with almost no changes. The great advantage of forums is their high degree of openness. It is much easier to find valuable information openly available on the internet through forums. Often, we realize that forums are as old as the internet itself.\nSoftware Needed to Build a Forum There are various types of software for building forums; only a few are listed here.\nXiuNobbs XiuNobbs\nThis forum software is extremely lightweight. It requires almost no configuration after installation and even supports running on shared hosting (virtual hosts) where restrictions are usually tight.\nThe Blogger\u0026rsquo;s Forum\nDiscuz Discuz Official Website\nI believe those of you who frequently browse the internet have noticed that Discuz often powers various old forums. Because this forum software has been around for a very long time, its plugin ecosystem is incredibly vast, and many paid plugins even have cracked versions available online. However, the configuration is quite troublesome. If you have a lot of free time, you can give it a try. It is also friendly to shared hosting environments.\n2B2T.XIN\u0026rsquo;s Forum\n52pojie (吾爱破解)\nEnshan Forum\nPHPBB This is also a veteran forum software. I haven\u0026rsquo;t used its plugins much, so I won\u0026rsquo;t comment on its plugin ecosystem. However, this is another shared-hosting-friendly forum software, though its support for Chinese localization is relatively poor.\nPHPBB Official Website\nDvBBS (Dongwang BBS) This is a \u0026ldquo;tear of an era\u0026rdquo;—a forum software based on ASP. Today, we can still download the installation package for DvBBS, but their official company no longer develops forum software.Official Website Archive on the Internet ArchiveCS1.6 sorpack Forum\nAfterword Many forums will eventually disappear, so cherish these still-existing forum software and active forums. I believe the internet will continue to thrive and prosper.\n","date":"2024-07-03T20:45:21+07:00","permalink":"/en/p/luntan-chatroom/","title":"Forum Software Recommendations and Nostalgia"},{"content":"Introduction Data backup is an effective way to minimize losses. Once a hard drive fails, no amount of money can easily restore your data. Many people claim their new hard drives are reliable and don\u0026rsquo;t need backups, but when the drive suddenly dies and they go to a data recovery company, they find it\u0026rsquo;s extremely expensive—1000 RMB for a 500GB drive. Regret comes too late. 1000 RMB could have bought several new drives. So, remember: backup your data before the drive fails; otherwise, it\u0026rsquo;s too late.\nHardware RAID Cards A RAID card refers to an HBA card that implements RAID. It typically consists of components like an I/O processor, disk controller, disk connectors, and cache.\nHBA (Host Bus Adapter): A physical connection interface between a server\u0026rsquo;s internal I/O channel and a storage system\u0026rsquo;s I/O channel (external). Usually, server PC motherboards support the IDE protocol, and IDE disk controllers support it too, so they can connect directly. However, if a disk only supports the SCSI protocol, it cannot connect directly to the server; you need a SCSI card (HBA card) to enable disk support. Thus, the SCSI card becomes the Host Bus Adapter (HBA). The scope of HBA cards is quite broad.\nRAID cards can be categorized by disk transmission protocol into SATA RAID cards, SAS RAID cards, and SCSI RAID cards. In the server field, SAS RAID cards are most common. Depending on the SCSI controller on the card, they can be single-channel, dual-channel, triple-channel, or even eight-channel. The number of channels determines how many disks can be carried: Number of channels * disks per single controller.\nIf there is no integrated SCSI controller and the card uses the motherboard\u0026rsquo;s SCSI controller to manage disks, it is a zero-channel RAID card.\nAdditionally, RAID cards are generally equipped with cache and a BBU (Battery Backup Unit). The former is for caching, and the latter is a battery configured for data integrity.\nThey are relatively expensive, ranging from several hundred to several thousand RMB. They are much more reliable than software RAID, offer higher speeds, and are relatively simple to configure.\nSoftware RAID I strongly discourage using Windows\u0026rsquo; built-in software RAID. This RAID is intended for servers; if a power outage occurs, it will perform a full copy of the entire data on your disks, which is extremely annoying. If another power outage occurs during this process, it\u0026rsquo;s absolute \u0026ldquo;Amennos\u0026rdquo; (game over).\nArticle on Enabling Windows Software RAID - This is an article teaching you how to use Windows\u0026rsquo; built-in RAID functionality, but I don\u0026rsquo;t recommend using it. A power outage will trigger a full disk rebuild that takes a long time, and if power fails again during that, your disks might die directly.\nTwo-way Synchronization FreeFileSync is an open-source synchronization software that can sync to both local and remote servers simultaneously. It supports various protocols including FTP, SFTP, and WebDAV. It supports resume, file difference comparison, versioning, permission settings, and encryption. It\u0026rsquo;s a very powerful tool but requires manual setup. If you\u0026rsquo;re not tech-savvy, using a cloud drive is recommended.\nTutorial\nCloud Storage Cloud Drive Encyclopedia Cloud drives can serve as off-site backups, provided you encrypt your files (e.g., using encrypted zip files).\nFree Cloud Drives 1. Baidu Netdisk pan.baidu.com\nBaidu Netdisk was established in 2012 (originally Baidu Cloud). It\u0026rsquo;s a veteran service provider with a massive user base. It covers major PC and mobile OSs and has an official TV client. Free users get 2TB of space.\n(Price images as of Feb 3, 2023). Super VIPs enjoy high-speed downloads, video speed control, 5TB space, HD quality, and instant sync.\nThe base space is large, but free users suffer from severe speed limits, making large file downloads very painful without a membership.\n2. Tencent Weiyun www.weiyun.com\nTencent Weiyun was established in 2012 (originally QQ Disk). It\u0026rsquo;s another veteran tied to QQ, so it has many users. It covers major platforms. Free users get 10GB of space and 1GB of free daily upload traffic.\nMembers enjoy 3TB storage, 45GB daily upload traffic, playback/transfer acceleration, and offline downloads. Super VIPs get 6TB and online decompression.\nWeiyun is more like Google Drive or OneDrive—it charges for space rather than bandwidth. Free users have slow uploads rather than slow downloads. It seems like a neglected project within Tencent now.\n3. Alibaba Drive www.aliyundrive.com\nAlibaba Drive was launched in 2020/2021. It\u0026rsquo;s an unthrottled, large-capacity drive that has become very popular. It covers major platforms and has third-party TV clients. Free users get 800GB of permanent space.\nSuper VIPs enjoy 8TB space, backup drives, photo backup, cloud decompression, etc.\nIt doesn\u0026rsquo;t limit speeds (though it\u0026rsquo;s starting to a bit now). Memberships are mainly for space and video features. Downloads don\u0026rsquo;t strictly require membership. A downside is that files like .zip or .apk cannot be shared.\n4. Tianyi Cloud (e-Cloud) cloud.189.cn\nTianyi Cloud was established in 2011 by China Telecom. Its main advantage is that it\u0026rsquo;s unlikely to shut down—a very strong selling point. Free users get 30+30GB (30GB cannot be shared) and 2GB daily traffic.\nGold members get 2TB+2TB space and 200GB daily traffic. Platinum members get 4TB+4TB and unlimited photo storage. It\u0026rsquo;s very reliable and cheaper than Baidu.\n5. Lanzou Cloud www.lanzoux.com\nLanzou Cloud was established in 2014. It\u0026rsquo;s very popular for resource sharing. However, it lacks content moderation, which is a risk. Free users can only upload files up to 100MB; paid users up to 300MB. It\u0026rsquo;s too small for many needs.\n6. Chengtong Netdisk www.ctfile.com\nChengtong was established in 2009. It\u0026rsquo;s a famous \u0026ldquo;earn-from-downloads\u0026rdquo; drive. Personally, I don\u0026rsquo;t like it because of its annoying mechanics. Free users get 500GB (requires frequent login to keep).\nMembership offers high-speed downloads and WebDAV. It\u0026rsquo;s okay if you disable the \u0026ldquo;earn\u0026rdquo; mode, otherwise, it\u0026rsquo;s very slow.\n7. Quark Drive pan.quark.cn\nQuark was established in 2019 by Alibaba. It uses Alibaba Cloud infrastructure. It\u0026rsquo;s affordable and high quality. Free users get 10GB.\nIt used to have a very cheap \u0026ldquo;youth plan.\u0026rdquo; It\u0026rsquo;s decent and doesn\u0026rsquo;t restrict sharing as much as Alibaba Drive, though it has started some speed limiting.\n8. 123 Cloud Drive www.123pan.com\n123 Cloud Drive was established in 2021. It\u0026rsquo;s a rising star with 2TB free space and no speed limits for downloads. However, it has strict censorship—you cannot share videos, audio, or encrypted archives (though you can still download them yourself).\nI currently use this drive for my website, and I\u0026rsquo;ve been whitelisted to share encrypted archives. It\u0026rsquo;s great because it doesn\u0026rsquo;t require login for downloads.\n9. Quqi Cloud www.quqi.com\nQuqi was established in 2017. It has a nice group feature, good for small teams. Free users get 2TB. It\u0026rsquo;s a small company without a big backer, but speeds are generally okay.\n10. Xunlei Cloud pan.xunlei.com\nXunlei was established in 2003 and returned in 2020. Despite its age, it\u0026rsquo;s not very popular. It throttles speeds like Baidu. Free users get 500GB.\nI have no good feelings for this drive—lots of ads, poor offline downloads, and it negatively affects the domestic BT environment.\n11. Nutstore (JianGuoYun) www.jianguoyun.com\nNutstore was established in 2011. It\u0026rsquo;s focused on enterprise collaboration. It limits traffic (1GB upload/3GB download per month for free users) rather than space. Not recommended for personal use.\n12. 115 Drive www.115.com\n115 was established in 2009. Famous for its offline download capabilities. Free users get 15GB. It\u0026rsquo;s expensive and its offline features aren\u0026rsquo;t what they used to be. For offline downloads, PikPak is better.\n13. China Mobile Cloud yun.139.com\nChina Mobile Cloud (formerly HeCaiYun) was established in 2014. It doesn\u0026rsquo;t throttle speeds. Free users get 20GB+20GB. Mobile users can get 1TB through tasks. It cannot share APK files.\n14. China Unicom Cloud pan.wo.cn\nChina Unicom Cloud has a history of shutting down and rebranding. I don\u0026rsquo;t trust it with important files. Free users get 10GB.\n15. CowTransfer cowtransfer.com\nEstablished in 2017, focused on quick file transfers rather than long-term storage. Free users get 10GB. It\u0026rsquo;s unthrottled.\n16. Feiji Pan (Small Plane Drive) www.feijipan.com\nEstablished in 2021, allows downloads without login. Free users get 10GB. It\u0026rsquo;s unthrottled but it\u0026rsquo;s a new company, so longevity is uncertain. (I\u0026rsquo;ve stopped using it).\n17. BitQiu pan.bitqiu.com\nEstablished in 2006, focused on white-collar office users. Free users get 20GB. It\u0026rsquo;s a decent alternative to 115 Drive.\nOptical Discs Ordinary recordable DVDs have dye fading issues because they use organic dyes. Luck lasts 10 years; bad luck lasts only a few. Blu-ray discs use inorganic dyes, which are relatively better and last longer. Most importantly, never buy dual-layer (DL) discs; they have a very high failure rate. Store discs in a cool, dark place. Do not expose them to sunlight, as solar energy is similar to the recording laser and can overwrite your useful data with useless \u0026ldquo;solar noise.\u0026rdquo; LTO Tape Not recommended for ordinary people. While tapes are cheap, the drives are expensive (400 to 2000 RMB used) and require many accessories. Also, random access is almost zero because you have to wait for the tape to wind to the specific data location.\nPrinting Printed materials can generally last 50 years. If protected with sealed bags and iron boxes, paper documents are almost impossible to destroy; they will only yellow and age.\nUSB Sticks, SSDs, SD/CF Cards Do not use these for long-term backups. They use flash memory, which stores data as electrical charges. Over time, the charges leak. Eventually, ECC correction fails, and data is lost. This usually happens within 10 years.\nMental Memory Useful for passwords, but requires constant use to prevent forgetting.\nHorror Stories of Data Recovery People who gamble with their data often end up paying a high price for recovery.\nAfter inquiring, I found that recovering data from a used 500GB Seagate drive costs 600-1000 RMB, whereas the drive itself only costs 10-15 RMB shipped.\nBackup Multiple Copies A backup drive and main drive failed simultaneously—a \u0026ldquo;minefield\u0026rdquo; of a DM001 and an MQ03 drive. One had a firmware bug, the other \u0026ldquo;froze\u0026rdquo; to death.\nBackup and Main Drive Failure Together\nModels that Scratch Platters upon Failure Certain Seagate models will scratch the platters as soon as they fail. If you have one of these, back up your data immediately.\nSeagate 7200.12 1TB\nSeagate \u0026ldquo;Record Player\u0026rdquo; DM001\nConsequences of No Off-site Backup Off-site backup protects against robbery, fire, water, earthquakes, or lightning. Recovering data from fire-damaged drives is not only costly but often impossible.\nFire-damaged Drive (Recovery Failed)\n","date":"2024-06-18T20:22:21+08:00","permalink":"/en/p/backup/","title":"Data Backup Plan"},{"content":"Introduction As one of the most frequently used storage devices, computer hard drives are often taken for granted. Most of the time, to save money, people choose not to buy a second hard drive to back up their data. They only regret it when the hard drive can no longer be read. At that point, you have to bear huge risks, and even swallow the bitter pill if the recovered data turns out to be incomplete. You might end up paying 10 times the price of your current hard drive just to recover the data, and sometimes it even leads to disputes.\nHow It All Started I bought a second-hand hard drive on Taobao. It was a used Seagate drive. At the time, I had no idea that such a terrifying scenario was about to unfold.\nBack then, I went \u0026ldquo;all-in\u0026rdquo; and dumped all my data onto this single drive. Plus, the drive was second-hand. The disaster debuffs were fully stacked.\nIt Happened Two Years Later One day, right when I connected it to my computer, I suddenly found that the partition had turned into RAW format, and I noticed that the S.M.A.R.T C5 value (Current Pending Sector Count) of the hard drive was climbing.\nI panicked instantly, thinking that recovering this mountain of data would cost more money than I even had.\nI searched for two data recovery software programs and found their cracked versions:\nDiskGenius Cracked Professional Edition\nR-Studio Cracked Edition\nBut there were some twists and turns.\nThe DiskGenius crack was incomplete; it crashed shortly after I opened it.\nAfter opening R-Studio, I didn\u0026rsquo;t experience any crashes. I immediately went to create an image of my failing hard drive, and fortunately, the entire image was successfully exported in the end.\nHowever, after extracting the data from the image, I found 40 bad sectors, and about 10% of my data was lost.\nData Status\nStepping into the Pit Again The ordeal above wasn\u0026rsquo;t over yet.\nI mentioned earlier that I had actually bought two drives. I put the recovered data onto the other drive, and for some inexplicable reason, I deleted the exported image file.\nLater, this second drive failed even harder than the first one—it went straight into the \u0026ldquo;click of death\u0026rdquo; (clicking hard drive).\nAs soon as I realized something was wrong with the drive, I immediately cut the power. I continuously tapped the hard drive with my hand, and surprisingly, the drive suddenly became readable again.\nI immediately started exporting the data. This time, I decisively avoided using that previous hard drive, but unfortunately, 60% of my data had already been lost by now.\nUltimately, 20% of the data was exported before the drive started clicking again. But this time, the drive was completely dead.\nI found that a large portion of that 20% recovered data was corrupted. Suddenly, I remembered some materials I had backed up previously—they were all the critical files. Eventually, I found a third hard drive and successfully merged the materials together.\nAfterword You MUST back up your data! You MUST back up! The most important things inside a hard drive are your memories. If this data is gone, it\u0026rsquo;s like having your memories erased.\nIn my next article, I will write about how I do my backups now.\n","date":"2024-06-18T20:22:05+08:00","permalink":"/en/p/rec-disk/","title":"A Record of a Tortuous Hard Drive Data Recovery Journey"},{"content":"Preface As a TG user, you must have group chats and channels, which is also a feature of TG. Today, I bring you a GITHUB repository that is dedicated to collecting group chats, channels and robots, so that you can stay in TG for a day\nTG group chat robot channel collection\n","date":"2024-06-07T20:34:00+07:00","image":"/p/telegramgroup/telegram.webp","permalink":"/en/p/telegramgroup/","title":"How to get group chats and channels in Telegram"},{"content":"Materials Needed Chrome Browser Steps Enabling DOH\nOpen Chrome 1. In your browser settings, click \u0026ldquo;Privacy and Security\u0026rdquo; → \u0026ldquo;Security\u0026rdquo; in sequence. Go to \u0026ldquo;Advanced\u0026rdquo; and enable \u0026ldquo;Use secure DNS\u0026rdquo;. Then select a DNS provider (if you don\u0026rsquo;t know, just choose Cloudflare). Enable ECH\nOpen this address in your Chrome browser: chrome://flags/#encrypted-client-hello, and change the Encrypted ClientHello option to Enabled.\nDetection Open this CF website: https://www.cloudflare.com/zh-cn/ssl/encrypted-sni/, and click the \u0026ldquo;Check my browser\u0026rdquo; button. If you see a checkmark under \u0026ldquo;Secure DNS\u0026rdquo;, it means DOH is enabled. If you see a checkmark under \u0026ldquo;Secure SNI\u0026rdquo;, it means ECH is enabled. Notes If you are using a software router, this doesn\u0026rsquo;t matter and you don\u0026rsquo;t need to worry about it. If you are using other clients, you need to enable TUN. The mode allows it to take over all traffic; otherwise, the browser will not use its own DOH service but will instead hand it over to the proxy software for resolution, which in turn will be sent to the node server for DNS resolution, resulting in invalid traffic.\n","date":"2024-05-29T06:46:10+07:00","image":"/p/chrome-doh-ech/1_-_Cover.width-1200.format-webp.webp","permalink":"/en/p/chrome-doh-ech/","title":"Enabling DOH and ECH Encryption in Chrome"},{"content":" When using Chrome , we sometimes need to download large files. Due to Chrome\u0026rsquo;s default single-thread limitation, it cannot fully utilize bandwidth for downloads. In this article, I will show you how to enable multi-threaded download settings in Chrome.\nPrerequisites Chrome Browser Steps Open Chrome browser and go to chrome://flags/#enable-parallel-downloading. Set Parallel downloading to Enabled. Then click the Relaunch button. You can see the download speed has increased from the original 100+ KB/s to around 5-6 MB/s. Conclusion This method allows you to achieve high-speed downloads without using IDM (Internet Download Manager).\n","date":"2024-05-29T06:43:44+07:00","image":"/p/chrome-download-muilt/1_-_Cover.width-1200.format-webp.webp","permalink":"/en/p/chrome-download-muilt/","title":"Enabling Chrome Download Speed Boost"},{"content":"Preface My mobile phone number has been disabled. When this happens, Telegram mobile and PC will automatically disconnect and exit. When you try to log in again, it will prompt that this mobile phone number has been blocked.\nHowever, if you have performed a large number of illegal operations, it is recommended to directly change the new mobile phone number and re-register, because the possibility of being unblocked is basically zero.\nSolution Method 1\nClick Help directly on the banned page, and the TG client will automatically generate an email and you can just click Send\nMethod 2\nThe second method to unblock is faster, because the email method is used by many people, and you can appeal together when you appeal\nUse a mobile phone or computer browser to open the link: https://telegram.org/support This page is the Telegram support page.\nFill in the following content on this page. This is what I filled in, you can copy it\n1 2 3 Dear Sir/Ma\u0026#39;am. MY number +1 xxx xxx xxxx was banned and i am not able to figure out the reason for supension, please help me to recover my account. Thank you. Fill in your email:\n1 Fill in your email address, any email address is fine, and you will not receive any emails later. Fill in your phone number:\n1 Fill in your phone number to log in to Telegram. Come back in 2025 and see what I found Well, it can only be used for the first time the account is blocked, and the second time it will not be used at all.\n","date":"2024-05-29T06:42:53+07:00","image":"/p/telegram%E8%AF%AF%E5%B0%81%E7%94%B3%E8%AF%89%E6%8C%87%E5%8D%97/tg.webp","permalink":"/en/p/telegram-wrongly-blocked-appeal-guide/","title":"TeleGram wrongly blocked appeal guide"},{"content":"What is Record-Filing? Q: What is \u0026ldquo;Mainland China Website Record-Filing\u0026rdquo; (ICP License)?\nA: Website record-filing is a license required to operate a website in Mainland China. It determines whether you can host and run a website within its borders.\nWhy is Record-Filing Required? According to the regulations of the Ministry of Industry and Information Technology (MIIT) of Mainland China, websites hosted in Mainland China (whether on home broadband or through service providers) must undergo record-filing. Websites that are not filed will have their resolution forcibly blocked.\nAre Unfiled Websites Impossible to Open? It\u0026rsquo;s found that unfiled servers in Mainland China can sometimes be accessed via IP + port directly. However, if traffic is high, service providers will use DPI (Deep Packet Inspection) to detect the site and suspend the service, often without a refund.\nCan\u0026rsquo;t unfiled domains be opened? Not exactly. If the domain is registered outside of Mainland China, you can point it to a domestic Chinese server, but the service provider will still suspend the service once they detect unfiled traffic.\nIt\u0026rsquo;s a Bit Troublesome The rule is: You must file through the service provider where you purchased your hosting. You need to prepare a domain, a cloud server or virtual host, and filing materials. The provider reviews the materials and submits them to MIIT. The review process takes about 20 working days.\nWhile many people go through this process, a 20-working-day wait is long. If the review fails, you have to resubmit and wait another 20 days. Your website\u0026rsquo;s momentum could be lost before it\u0026rsquo;s even officially filed.\nWhat Happens After Record-Filing? Pros Domestic CDN and Server Acceleration: This significantly improves access speeds for users in Mainland China. (Note: Domestic servers often have low bandwidth like 3M-5M. In case of a DDoS attack, they are often null-routed. CDNs also require strict rate limiting to avoid massive bills during an attack). Priority in Search Engines: Baidu, 360, and Sogou tend to favor filed websites. Domestic Ad Network Access: If you have many stable domestic users, domestic ad networks can offer better payouts than Google Ads. Increased Credibility: It shows the site is officially recognized. Cons Privacy Risks: Since names and ID information are stored in official query systems, \u0026ldquo;human flesh searching\u0026rdquo; (doxing) becomes much easier. Compliance Risks: Your filing can be revoked for things deemed non-compliant, such as hosting Google Ads or certain comments. Censorship: You are required to moderate or remove comments. Naming Restrictions: There are keyword restrictions on website names. Footer Restrictions: You are limited in what you can add to the footer. How I Avoid Record-Filing I host my domains on international platforms and pay via PayPal (which offers dispute protection), and then purchase an international server to host my site.\nConclusion If record-filing offers more benefits than drawbacks for you, then you should definitely do it. However, if you are running a personal website, I suggest avoiding this \u0026ldquo;high-end\u0026rdquo; hassle, as it can be costly and restrictive.\n","date":"2024-04-18T13:29:19+07:00","permalink":"/en/p/beian-website/","title":"Personal Website Record-Filing: From Idea to Burial"},{"content":"Second-hand SSD Purchase Experience I always like to buy second-hand hard drives. The biggest advantage of second-hand hard drives is that they are cheap. Only once did I get a real Samsung hard drive. This time, the no-name solid-state drive made me know what cost-effectiveness is\nStarting point When I turned on my computer, opened Windows 8.1, logged in, opened my IDE and prepared to start a day of thinking, I suddenly found that the delay of my SSD was even more outrageous than that of a mechanical hard disk\nLook at this very touching delay, mechanical hard disks are more powerful than this, but I suddenly thought of the second-hand SSD I bought some time ago, and then I disassembled the laptop\n![Two hard Disk\nAll the following stories happened in that black disk, the dark disk.webp\nNext, let’s search for the brand of this disk\nWhy are there only some marketing accounts’ Douyin videos and Taobao links, and there is not even an official website. It must be a fake brand\nIn this case, I will first see how to test the performance of the hard disk. I checked and found that the software HD TUNE is needed. Then let’s take a look at the 10GB test!\nHow come it doesn’t reach 50MB/S in the end? I feel there is something mysterious\nThe 50GB mode test made me feel what garbage particles are. Look at the speed drop and fluctuation. My system was directly stuck at that time. This is a large USB flash drive!\nWith these questions, I started my decryption journey\nThe mystery-solving journey officially begins The hard drive has a warranty sticker, but it doesn’t matter because it’s second-hand. You can just take a screwdriver and tap it to open it\nLook at thiscleansimple layout, not even screw holes reserved\nDoes this brand\u0026hellip; look strange to you? In fact, I also felt very unfamiliar at first glance. There were no screws in the disassembly process of this hard drive, and it was all done by clips. It felt very different from the disassembly process of genuine SSDs such as Samsung.\nThe following is the motherboard of the SSD\nI have disassembled Samsung SSDs and have never seen such crossed particles. Generally, crossed lines represent waste, so I have a bad feeling\nEnter the name of the main control 58XT\nAh? Solid-state USB flash drive, according to the following clues, it is found that the particles carried by this main controller are not very good. The main controller itself is good, but the particles are not good.\nI am still skeptical after seeing the following\nSM2258XT\u0026rsquo;s ability to capture bad blocks; everyone who has played with SSD knows a saying, SM2258XT card cannot be opened, and particles that cannot be used normally can be thrown directly into the trash can, so there is no need to worry about the data written due to bad particles cannot be read. For example; SM2259XT (essentially SM2258XT) mass-produced QLC N18, that kind of junk particles, 136G (yes, the original N18 1CE is 136G) has too many bad blocks, and can only open 90G capacity particles. Can they be mass-produced and used normally? May I ask if there are any other controllers that have such capabilities\n― 争锋麦芒, 神话断者之： SM2258XT是最佳固体USB弹控 The following one directly let me know what is called a high-level controller doge\nSM2258XT stability; The following is the key point, those who see it should pay attention to it; 58XT firmware is 4-fold backup, that is, if the entire solid state has 4 CEs, the firmware is 4 identical ones distributed in the 4 CEs. Why is 58XT called the king of knockoffs? This is the case. The test rack 58XT mass-produced 4 particles. Except for the first particle, any particle can be removed and cleared, and it can still be used normally. 4WAY is written in the firmware card opening file. This is the strength of Huirong. Even if the firmware is lost, it can be recognized normally. I don’t know the specifics, but it can be the king of garbage particles and the world’s most sold SSD master controller. How can it be possible without two brushes\n― 争锋麦芒, Rumor Terminator: Is SM2258XT the best solid-state USB flash drive controller? Now I am interested, let\u0026rsquo;s check what the particles are\nThe legendary big S black film particles\nNow the truth is revealed, but I found that this main control has 4CE and only occupies 2CE, which means that two more disks can be soldered\nThere are a lot of points that are dropped, which clearly means they don\u0026rsquo;t want me to solder. Forget it, this kind of hard drive is like the barrel effect. New particles will be dragged down by old particles even if they are good.\nThe road of tossing In fact, there is nothing to do with this kind of disk, because the particles are from unknown sources and the firmware can\u0026rsquo;t be found. Now the original firmware can also be used. I don\u0026rsquo;t want to do any overclocking. I use FLASH_ID to check and the parameters are as follows\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 v0.567a Drive: 0(ATA) OS: 6.3 build 9600 Model: XSJ-X100-128G Fw: T0910A0 Size: 122104 MB [128.0 GB] From smart : [SMI2258XT] [T0910A0 00] [B1600] Controller: SM2258 bufferless FlashID: 0x2c,0xa4,0x8,0x32,0xa1,0x0,0x0,0x0 - Micron 64L(B16A) TLC 256Gb/CE 256Gb/die Channel: 4 CE: 1 TotDie : 4 Plane: 2 Die/Ce : 1 Ch map: 0x0F CE map: 0x01 Inter.: 1 First Fblock: 3 Total Fblock : 504 Total Hblock : 1908 Fblock Per Ce : 504 Fblock Per Die: 504 Original Spare Block Count : 42 Vendor Marked Bad Block : 0 Bad Block From Pretest : 8 Look at the bad blocks, there are 8 of them\nI checked the firmware and found that it is not a clear disk\nSuccessfully concluded Finally, I tested the speed and it feels good enough for daily use\nCheap SSDs also have their audiences, and expensive SSDs also have their audiences\nDon\u0026rsquo;t say to the cheap SSD group: Why don\u0026rsquo;t you eat meat\n","date":"2024-03-28T20:14:18+07:00","image":"/p/badssd-58xt-get-test/IMG_0017.webp","permalink":"/en/p/badssd-58xt-get-test/","title":"A Record of a Second-Hand SSD Failure"},{"content":"Introduction This program is designed to convert all images within its directory, including all subdirectories. It is compatible with Windows 7 and above.\nPractical Effect Source Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 import os import sys import time from PIL import Image from tqdm import tqdm def convert_to_webp(input_file, output_file, quality=80): try: with Image.open(input_file) as im: im.save(output_file, \u0026#34;webp\u0026#34;, quality=quality) print(f\u0026#34;Converted: {input_file} =\u0026gt; {output_file}\u0026#34;) except Exception as e: print(f\u0026#34;Error converting file: {input_file}\u0026#34;) print(str(e)) def convert_to_jpg(input_file, output_file): try: with Image.open(input_file) as im: im.save(output_file, \u0026#34;JPEG\u0026#34;) print(f\u0026#34;Converted: {input_file} =\u0026gt; {output_file}\u0026#34;) except Exception as e: print(f\u0026#34;Error converting file: {input_file}\u0026#34;) print(str(e)) def process_folder(folder_path, conversion_type): for root, dirs, files in os.walk(folder_path): for filename in tqdm(files): if conversion_type == 1 and filename.lower().endswith(\u0026#39;.webp\u0026#39;): input_file = os.path.join(root, filename) output_file = os.path.splitext(input_file)[0] + \u0026#34;.jpg\u0026#34; convert_to_jpg(input_file, output_file) elif conversion_type == 2 and any( filename.lower().endswith(ext) for ext in [\u0026#39;.jpg\u0026#39;, \u0026#39;.jpeg\u0026#39;, \u0026#39;.webp\u0026#39;, \u0026#39;.jpeg\u0026#39;]): input_file = os.path.join(root, filename) output_file = os.path.splitext(input_file)[0] + \u0026#34;.webp\u0026#34; convert_to_webp(input_file, output_file) if __name__ == \u0026#34;__main__\u0026#34;: print(\u0026#34;MoeGeek xpdbk.com Batch Image Processor. Continue? [Press Enter]\u0026#34;) input() print(\u0026#34;Convert WebP to JPG [1]\\nConvert PNG and JPG to WebP [2]\\nPlease enter 1 or 2:\u0026#34;) conversion_type = int(input()) print(\u0026#34;WARNING: This program will convert ALL images in the program\u0026#39;s folder. Please use with caution. [Press Enter to continue]\u0026#34;) input() folder_path = os.path.dirname(sys.argv[0]) process_folder(folder_path, conversion_type) print(\u0026#34;Conversion complete. The program will exit in 5 seconds.\u0026#34;) time.sleep(5) ","date":"2024-03-16T18:26:25+07:00","image":"/p/python-img-jpg-webp-png-jpeg/%E6%8D%95%E8%8E%B7.webp","permalink":"/en/p/python-img-jpg-webp-png-jpeg/","title":"The Ultimate Directory Image Conversion Tool Made with Python"},{"content":"Python\u0026rsquo;s running speed and source code decompilation have always been a difficult problem. However, after using Nuitka, you will enjoy the speed of C++ and avoid the worry of being completely decompiled from the source code after being packaged by pyinstaller\nExplain the difference between pyinstaller and Nuitka The difference between the two is that pyinstaller is cooking on the spot, and everything is clearly seen by the people present (unpacking the source code), but Nuitka is a bunch of things into a paste and you don’t know what is in it. You can only roughly guess what this thing does (disassembly can only get the assembly but not the source code)\nPython version selection The older the Python version, the better, and the more compatible it is. Choosing python 3.8.10 is enough\nNotes The installation directory cannot have Chinese, otherwise there will be a lot of bugs that you can’t solve\nPIP installs some things 1 2 3 pip install ordered-set # Accelerate compilation pip install nuitka # Main program pip install zstandard # Compress files when onefile One-click command 1 python -m nuitka --mingw64 --standalone --output-dir=out --show-progress --onefile main.py You can save it as build.bat so you can open it and use it\n","date":"2024-03-15T20:20:42+07:00","image":"/p/python%E7%9A%84nuitka%E6%89%93%E5%8C%85%E6%95%99%E7%A8%8B/1_ScB4PGTVq3wv0T5bgsz2vg.webp","permalink":"/en/p/python-nuitka-packaging-tutorial/","title":"Python Nuitka Packaging Tutorial"},{"content":"illustrate This program is a program used to obtain the UUID and skin of Minecraft players. It uses mojang\u0026rsquo;s API. This program is compatible with win7 and above and provides source code for your own compilation.\nActual operation effect https://www.youtube.com/watch?v=5lkHtSF68-A\nNetwork disk download Only Windows7 64-bit or above Access password: arkc Compression password: HQUUIDAND123\nMD5 Verification: 12C8ED57930947CE44A7DDAD88FC04CB\nsource code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 import requests import json import base64 import re import urllib.request def get_minecraft_skin(): print(\u0026#34;MoeGeek blog.xpdbk.com Minecraft skin uuid crawler 1.0 \u0026lt;press enter to skip\u0026gt;\u0026#34;) input() filename = input(\u0026#34;The name of the skin image after saving: \u0026#34;) username = input(\u0026#34;Please enter the genuine player username: \u0026#34;) # Check whether the username complies with Minecraft naming rules if not re.match(\u0026#34;^[a-zA-Z0-9_]{3,16}$\u0026#34;, username): print(\u0026#34;Username does not comply with Minecraft naming rules\u0026#34;) return try: response = requests.get(f\u0026#34;https://api.mojang.com/users/profiles/minecraft/{username}\u0026#34;) response.raise_for_status() except requests.exceptions.HTTPError as errh: print(\u0026#34;Http Error:\u0026#34;, errh) return except requests.exceptions.ConnectionError as errc: print(\u0026#34;Error Connecting:\u0026#34;, errc) return except requests.exceptions.Timeout as errt: print(\u0026#34;Timeout Error:\u0026#34;, errt) return except requests.exceptions.RequestException as err: print(\u0026#34;Something went wrong\u0026#34;, err) return data = response.json() uuid = data[\u0026#34;id\u0026#34;] print(f\u0026#34;The UUID is {uuid}, do you want to get the skin? Press Enter to continue\u0026#34;) input() try: response = requests.get(f\u0026#34;https://sessionserver.mojang.com/session/minecraft/profile/{uuid}\u0026#34;) response.raise_for_status() except requests.exceptions.HTTPError as errh: print(\u0026#34;Http Error:\u0026#34;, errh) return except requests.exceptions.ConnectionError as errc: print(\u0026#34;Error Connecting:\u0026#34;, errc) return except requests.exceptions.Timeout as errt: print(\u0026#34;Timeout Error:\u0026#34;, errt) return except requests.exceptions.RequestException as err: print(\u0026#34;Something went wrong\u0026#34;, err) return data = response.json() base64_data = data[\u0026#34;properties\u0026#34;][0][\u0026#34;value\u0026#34;] decoded_data = base64.b64decode(base64_data).decode(\u0026#39;utf-8\u0026#39;) skin_data = json.loads(decoded_data) skin_url = skin_data[\u0026#34;textures\u0026#34;][\u0026#34;SKIN\u0026#34;][\u0026#34;url\u0026#34;] try: urllib.request.urlretrieve(skin_url, f\u0026#34;{filename}.webp\u0026#34;) except Exception as e: print(f\u0026#34;Error occurred while saving the image: {e}\u0026#34;) return print(\u0026#34;Skin has been saved\u0026#34;) if __name__ == \u0026#34;__main__\u0026#34;: get_minecraft_skin() I USE API? YES!,I USE MOJANGAPI\nprofiles api id = uuid\nhttps://api.mojang.com/users/profiles/minecraft/MoeGeek\n1 2 3 4 { \u0026#34;id\u0026#34; : \u0026#34;36b37464b4ec436aa4a643dabc20717a\u0026#34;, \u0026#34;name\u0026#34; : \u0026#34;MoeGeek\u0026#34; } use uuid get skin https://sessionserver.mojang.com/session/minecraft/profile/36b37464b4ec436aa4a643dabc20717a\n1 2 3 4 5 6 7 8 9 { \u0026#34;id\u0026#34; : \u0026#34;36b37464b4ec436aa4a643dabc20717a\u0026#34;, \u0026#34;name\u0026#34; : \u0026#34;MoeGeek\u0026#34;, \u0026#34;properties\u0026#34; : [ { \u0026#34;name\u0026#34; : \u0026#34;textures\u0026#34;, \u0026#34;value\u0026#34; : \u0026#34;ewogICJ0aW1lc3RhbXAiIDogMTcxMDU4Nzc3MDk5MywKICAicHJvZmlsZUlkIiA6ICIzNmIzNzQ2NGI0ZWM0MzZhYTRhNjQzZGFiYzIwNzE3YSIsCiAgInByb2ZpbGVOYW1lIiA6ICJMRWxfRkVORyIsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS83NjQzY2M0YjUzNzNmYzU0MDE0NjZiN2M2ODMzYzZlNmNjZWJiM2RiOGIxZTAzYjQ0OTY1MjM1MGNkMTQxZDk1IiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0=\u0026#34; } ], \u0026#34;profileActions\u0026#34; : [ ] } Look Down\n1 \u0026#34;value\u0026#34; : \u0026#34;xxxxx\u0026#34; The is Base64 You Can Decrypt\n1 2 3 4 5 6 7 8 9 10 11 12 13 { \u0026#34;timestamp\u0026#34; : 1710587770993, \u0026#34;profileId\u0026#34; : \u0026#34;36b37464b4ec436aa4a643dabc20717a\u0026#34;, \u0026#34;profileName\u0026#34; : \u0026#34;MoeGeek\u0026#34;, \u0026#34;textures\u0026#34; : { \u0026#34;SKIN\u0026#34; : { \u0026#34;url\u0026#34; : \u0026#34;http://textures.minecraft.net/texture/7643cc4b5373fc5401466b7c6833c6e6ccebb3db8b1e03b449652350cd141d95\u0026#34;, \u0026#34;metadata\u0026#34; : { \u0026#34;model\u0026#34; : \u0026#34;slim\u0026#34; } } } } url Is Skin You download is good\n","date":"2024-03-15T20:17:36+07:00","image":"/p/python-mc-skin-get/1.webp","permalink":"/en/p/python-mc-skin-get/","title":"One-click obtainr of UUID and skin for Minecraft genuine account"},{"content":"Methods to Refresh iPhone Firmware I created this tutorial because an APT package manager crash occurred after I installed a plugin post-jailbreak.\nThe Mainline of This Tutorial Series This article is part of a series. If you\u0026rsquo;re coming from a search engine, you might be interested in other tutorials in the main directory.\nWrite down the guide for iPhone 6 and iOS 12 system (jailbreak + optimization + IPA reverse engineering + APP downgrade + firmware flashing + full backup + personal IPA signing + jailbreak plugin recommendations + precautions + resource download)\nStep 1 - Download i4Tools i4 download\nStep 2 - Install i4Tools Click next until the icon below appears on your desktop or start menu, then open i4Tools.\nStep 3 - Connect iPhone 6 This step may involve whether your charger supports data transfer and whether the data interface is corroded.\nSuccessful connection is shown below:\nStep 4 - Go to the Flashing Tab Click \u0026ldquo;Smart Flash\u0026rdquo;. Click \u0026ldquo;Download\u0026rdquo;. Click \u0026ldquo;Flash Now\u0026rdquo;. Conclusion Besides the latest firmware, you can also use older firmware, but this requires you to have backed up SHSH2 in advance. Apple officially doesn\u0026rsquo;t want you to downgrade your system because it increases the risk of jailbreaking. Therefore, you need to backup SHSH2 beforehand—specifically for the system version you can last jailbreak. This is because the jailbreakable version will be immediately replaced with the latest version after you flash your phone.\nFlashing is also a way to wipe traces of a jailbroken phone.\n","date":"2024-02-07T07:51:55+07:00","permalink":"/en/p/iphone6-firmware/","title":"How to Refresh iPhone 6 Firmware"},{"content":"Preface I was using x64dbg to study a program and suddenly thought of what would happen if I changed the string. This program is a Minecraft GC that I found on the Internet and put it in the following link for use\nLanzoue Cloud Access password: gy99\nCompression password: GgGg313df\nStart Open our x64dbg This software is a reverse software that can be downloaded on github. After opening the software and opening our sample program\nThen right click and there will be a tab\nThen we scan Search and then scan All modules and then click String\nAfter the analysis, we directly enter the characters and click the unique string\nThen modify the string according to hexadecimal\nAfter the modification, right-click the file in the upper left corner and click Patch\nAfter applying the patch, the file modification is complete\n","date":"2023-10-01T15:08:31+07:00","image":"/p/x64dbg%E6%94%B9%E5%AD%97%E7%AC%A6%E4%B8%B2/2.webp","permalink":"/en/p/x64dbg-modify-string/","title":"X64DBG Modify String"},{"content":"Free Ways for Video Hosting Yes, I finally chose the simplest method to combat the annoyance of malicious reports resulting in takedowns.\nOrigin Practice I used ffmpeg to transcode and compress my videos. For the specific code, check my previous article FFMPEG Batch Compression and Conversion to 30FPS. Then, I started looking for hosting methods and found Cloudflare Pages, which has unlimited traffic. Uploading to GitHub and accessing the filename is a seamless process.\nModified Hugo Shortcode Changed video.html to this:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 {{- $src := .Get \u0026#34;src\u0026#34; | default (.Get 0) -}} \u0026lt;div id=\u0026#34;dplayer\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;link rel=\u0026#34;preload\u0026#34; href=\u0026#34;https://lib.baomitu.com/dplayer/1.25.0/DPlayer.min.css\u0026#34; as=\u0026#34;style\u0026#34; onload=\u0026#34;this.onload=null;this.rel=\u0026#39;stylesheet\u0026#39;\u0026#34;\u0026gt; \u0026lt;script src=\u0026#34;https://lib.baomitu.com/dplayer/1.25.0/DPlayer.min.js\u0026#34; defer\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script defer\u0026gt; document.addEventListener(\u0026#39;DOMContentLoaded\u0026#39;, function () { var dp = new DPlayer({ container: document.getElementById(\u0026#39;dplayer\u0026#39;), screenshot: false, video: { url: \u0026#39;{{- $src -}}\u0026#39;, type: \u0026#39;auto\u0026#39; }, preload: \u0026#39;none\u0026#39;, lang: \u0026#39;en\u0026#39; }); dp.on(\u0026#39;fullscreen\u0026#39;, function () { dp.fullScreen.request(\u0026#39;web\u0026#39;); }); dp.on(\u0026#39;timeupdate\u0026#39;, function () { if (dp.video.currentTime === 0) { dp.seek(1); } }); document.addEventListener(\u0026#39;visibilitychange\u0026#39;, function() { if (document.hidden) { dp.pause(); } }); var dplayerContainer = document.getElementById(\u0026#39;dplayer\u0026#39;); var timer; dplayerContainer.addEventListener(\u0026#39;mouseleave\u0026#39;, function() { timer = setTimeout(function() { dplayerContainer.style.border = \u0026#39;none\u0026#39;; }, 1000); }); dplayerContainer.addEventListener(\u0026#39;mouseenter\u0026#39;, function() { clearTimeout(timer); dplayerContainer.style.border = \u0026#39;\u0026#39;; }); }); \u0026lt;/script\u0026gt; ","date":"2023-09-17T21:45:02+07:00","image":"/p/video-save-free/123123.webp","permalink":"/en/p/video-save-free/","title":"Video Hosting Methods"},{"content":"FFmpeg is a set of open source computer programs that can be used to record, convert digital audio and video, and convert them into streams. It provides software for recording, converting and streaming audio and video.\nDownload from official website http://www.ffmpeg.org/download.html and configure the environment after decompression\nConvert MP4 to M3U8 M3U8 is the Unicode version of M3U, encoded in UTF-8. Both \u0026ldquo;M3U\u0026rdquo; and \u0026ldquo;M3U8\u0026rdquo; files are the basis of the HTTP Live Streaming (HLS) protocol format used by Apple, which can be played on devices such as iPhone and Macbook.\nSimply put, m3u8 is a video format that divides a video into many small parts, which makes it easier to load the video.\nSimple operation, low efficiency 1 ffmpeg -i input.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 2 -hls_time 15 output.m3u8 The generated effect is:\nGenerate a ts file every 15 seconds for the input.mp4 video file, and finally generate an m3u8 file. The m3u8 file is the index file of ts.\nWe can directly open the m3u8 file with playback software such as VLC media player, just like playing mp4.\nThe default length of each piece is 2 seconds. The m3u8 file only saves the information of the latest 5 pieces by default, resulting in only the last small part of the last playback (pay special attention when live streaming). -hls_time n sets the length of each piece. The default value is 2, in seconds. -hls_list_size n Set the maximum number of entries saved in the playlist. If set to 0, all the information of the film will be saved. The default value is 5. -hls_wrap n Set the number of films to start overwriting. If set to 0, no overwriting will be done. The default value is 0. This option can avoid storing too many films on the disk and limit the maximum number of films written to the disk. -hls_start_number n Set the value of sequence number in the playlist to number. The default value is 0. Note: The sequence number of the playlist must be unique for each segment, and it cannot be confused with the file name of the film (when using the wrap option, the file name may be reused).\nFor more parameters, please see the document: ffmpeg.org/ffmpeg.html#Video-Options\nEfficiency optimization, improve efficiency TS file is an extension of a media, which is a packaging format for Japanese high-definition cameras. MPEG2-TS (Transport Stream; also known as TS, TP, MPEG-TS or M2T) is a communication protocol for audio, image and data, and was first used in real-time transmission of DVD programs. The characteristic of the MPEG2-TS format is that it requires that any segment of the video stream can be independently decoded.\n1 2 3 4 # 1. Video overall transcoding ts ffmpeg -y -i music.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb out\\music.ts # 2. .ts file slicing ffmpeg -i music.ts -c copy -map 0 -f segment -segment_list out\\music.m3u8 -segment_time 10 out\\15s_%3d.ts hls_time slicing time inaccuracy To play the ts slice of m3u8, you must download a ts slice completely before you can play it. Set the hls_time time interval as short as possible (depending on the actual situation). In the actual process, set the slicing time interval to 2 seconds and call the following command:\n1 ffmpeg -i test.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_time 2 index.m3u8 But the slice is not performed according to the input parameters.\nReason:\nThe cutting of ts file is also related to the GOP size of the original file video (that is, the time interval between two I frames), because the first frame of any ts segment must be an I frame, otherwise it cannot be played at the fastest speed, and the first frame is not an I frame, which is meaningless to the player and is directly thrown away by the player. Any video stream must obtain the first I frame to successfully decode the picture. Although it is specified to cut a ts file in 1 second, in fact, since the original video stream may have an I frame for several seconds, it must wait until the next I frame to restart the slicing.\nSolution:\nSince it is known that a ts segment is generated in 1 second, it is necessary to force a key frame to be generated in one second during the slicing process.\nSet the key frame interval, and set the interval to 2 seconds as follows: -force_key_frames \u0026quot;expr:gte(t,n_forced*2)“\nComplete command:\n1 ffmpeg -i test.mp4 -force_key_frames \u0026#34;expr:gte(t,n_forced*2)\u0026#34; -strict -2 -c:a aac -c:v libx264 -hls_time 2 -f hls index.m3u8 m3u8 format analysis The complete m3u8 file has three parts:\nindex.m3u8, saves the basic information of the video and the order of the segmented files; key, if the video is encrypted, save the key; data file, the others are video data files. Specific content analysis:\n#EXTM3U, is the beginning of the file #EXT-X-VERSION, identifies the HLS protocol version number; #EXT-X-TARGETDURATION, indicates the maximum duration of each video segment (in seconds); #EXT-X-MEDIA-SEQUENCE, indicates the sequence number of the first URL fragment file in the playlist; #EXT-X-PLAYLIST-TYPE, indicates the streaming media type; #EXT-X-KEY, encryption method, here the encryption method is AES-128, and IV is specified, which is required for decryption; #EXTINF, indicates the duration of the media fragment specified by the subsequent URL (in seconds). HLS The working principle of HLS is to divide the entire stream into small HTTP-based files for download, and only download some at a time.\nWhile a media stream is playing, the client can choose to download the same resource from many different alternative sources at different rates, allowing the streaming session to adapt to different data rates.\nWhen starting a streaming session, the client downloads an extended M3U (m3u8) playlist file containing metadata for finding available media streams.\nHLS only requests basic HTTP messages, and unlike the Real-time Transport Protocol (RTP), HLS can pass through any firewall or proxy server that allows HTTP data to pass through.\nIt is also easy to use a content distribution network to transmit media streams.\nMerge m3u8(ts) into MP4 Remote file 1 ffmpeg -i “https://xpdbk.com/demo/ffmpeg/hls265/output.m3u8” -vcodec copy -acodec copy -absf aac_adtstoasc output.mp4 Local file Open cmd\nEnter the command and merge according to the actual path of the file\nMerge into ts file copy /b F:\\f\\*.ts E:\\f\\new.ts\nMerge into MP4 file copy /b F:\\f\\*.ts E:\\f\\new.MP4\nAnd through ffmpeg command as follows:\n1 2 3 4 5 6 7 8 Direct conversion: ffmpeg -i new.ts -c copy -map 0:v -map 0:a output.mp4 Specify audio stream (usually use this): ffmpeg -i new.ts -c copy -map 0:v -map 0:a -bsf:a aac_adtstoasc output.mp4 Re-encode video: ffmpeg -y -i new.ts -c:v libx264 -c:a copy -bsf:a aac_adtstoasc output.mp4 PHP implementation code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 $url = \u0026#39;https://******.m3u8?Expires=15853412145\u0026amp;OSSAccessKeyId=******\u0026amp;Signature=******\u0026#39;; $ts_content = file_get_contents($url); $ts_content = explode(\u0026#39;,\u0026#39;, $ts_content); $ts_file = array(); foreach ($ts_content as $key =\u0026gt; $value) { if($key == 0) continue; $value = trim($value); $ts_file[] = substr($value, 0, strpos($value, \u0026#39;.ts\u0026#39;) + 3); } $url_prefix = substr($url, 0, strpos($url, \u0026#39;.m3u8\u0026#39;)); $url_prefix = substr($url, 0, strrpos($url, \u0026#39;/\u0026#39;) + 1); $file_content = \u0026#39;\u0026#39;; foreach ($ts_file as $key =\u0026gt; $value) { $file_content .= file_get_contents($url_prefix . $value); } file_put_contents(\u0026#39;tmp_out.ts\u0026#39;, $file_content); // FFMPEG_PATH is the bin path to decompress ffmpeg yourself, for example, mine is F:/ffmpeg/bin/ exec(FFMPEG_PATH . \u0026#34;ffmpeg -i tmp_out.ts tmp_out.mp4\u0026#34;); Python implementation code Directory structure\n./\n|\u0026ndash; m3u8.py\n|\u0026ndash; result\n|\u0026ndash; file 1\n|\u0026ndash; key\n|\u0026ndash; index.m3u8\n|\u0026ndash; data\u0026hellip;\n|\u0026ndash; file 2\n|\u0026ndash; \u0026hellip; 114514\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 import os import sys import time from Crypto.Cipher import AES def fileList(findex): rpath = os.path.dirname(os.path.realpath(findex)) name = rpath.split(\u0026#34;\\\\\u0026#34;)[-1] fi = open(findex, \u0026#39;r\u0026#39;) flag = False IV = None tl = [] for line in fi.readlines(): if line.startswith(\u0026#34;#EXT-X-KEY\u0026#34;): # If IV exists, extract it; if line.split(\u0026#34;,\u0026#34;)[-1].startswith(\u0026#34;IV=\u0026#34;): IV = line.split(\u0026#34;,\u0026#34;)[-1][5:] IV = bytes.fromhex(IV) if line.startswith(\u0026#34;#EXTINF\u0026#34;): flag = not flag continue if flag: tmp = line.strip().split(\u0026#34;/\u0026#34;)[-1] tmp = os.path.join(rpath, tmp) tl.append(tmp) flag = not flag fi.close() fk = open(os.path.join(rpath, \u0026#34;key\u0026#34;), \u0026#39;rb\u0026#39;) key = fk.read() fk.close() return name, tl, key, IV def aes_decode(data, key, IV): # If no IV value is specified, use the key value directly if not IV: IV = key cryptor = AES.new(key, AES.MODE_CBC, IV) plain_text = cryptor.decrypt(data) return plain_text def main(): fp = os.listdir() used = [s[:-4] for s in os.listdir(\u0026#34;./result/\u0026#34;)] for ind in fp: if not ind.isdigit(): continue if ind in used: continue try: name, fl, key, IV = fileList(os.path.join(ind, \u0026#34;index.m3u8\u0026#34;)) except: print(\u0026#34;-\u0026#34;*30) print(\u0026#34;[-] Error! file: \u0026#34;, ind) print(\u0026#34;-\u0026#34;*30) continue print(\u0026#34;[*] Begin process file: \u0026#34;, name) start = time.time() f = open(os.path.join(\u0026#34;./result/\u0026#34;, name+\u0026#34;.mp4\u0026#34;), \u0026#39;ab\u0026#39;) for i in fl: with open(i, \u0026#39;rb\u0026#39;) as inf: data = inf.read() f.write(aes_decode(data, key, IV)) f.close() print(\u0026#34;[+] Successfully! Cost time: \u0026#34;, time.time()-start) main() Golang implementation code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 package main import ( \u0026#34;io/ioutil\u0026#34; \u0026#34;net/http\u0026#34; \u0026#34;os/exec\u0026#34; \u0026#34;strings\u0026#34; ) func main() { url := \u0026#34;https://******.m3u8?Expires=15853412145\u0026amp;OSSAccessKeyId=******\u0026amp;Signature=******\u0026#34; resp, _ := http.Get(url) body, _ := ioutil.ReadAll(resp.Body) tsContent := strings.Split(string(body), \u0026#34;,\u0026#34;) var tsFile []string for key, value := range tsContent { if key == 0 { continue } value = strings.TrimSpace(value) tsFile = append(tsFile, value[:strings.Index(value, \u0026#34;.ts\u0026#34;)+3]) } urlPrefix := url[:strings.LastIndex(url, \u0026#34;/\u0026#34;)+1] var fileContent string for _, value := range tsFile { resp, _ := http.Get(urlPrefix + value) body, _ := ioutil.ReadAll(resp.Body) fileContent += string(body) } ioutil.WriteFile(\u0026#34;tmp_out.ts\u0026#34;, []byte(fileContent), 0644) cmd := exec.Command(\u0026#34;ffmpeg\u0026#34;, \u0026#34;-i\u0026#34;, \u0026#34;tmp_out.ts\u0026#34;, \u0026#34;tmp_out.mp4\u0026#34;) cmd.Run() } Rust implementation code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 use std::fs::File; use std::io::prelude::*; use std::process::Command; use reqwest; #[tokio::main] async fn main() -\u0026gt; Result\u0026lt;(), Box\u0026lt;dyn std::error::Error\u0026gt;\u0026gt; { let url = \u0026#34;https://******.m3u8?Expires=15853412145\u0026amp;OSSAccessKeyId=******\u0026amp;Signature=******\u0026#34;; let resp = reqwest::get(url).await?.text().await?; let ts_content: Vec\u0026lt;\u0026amp;str\u0026gt; = resp.split(\u0026#39;,\u0026#39;).collect(); let mut ts_file = vec![]; for (i, line) in ts_content.iter().enumerate() { if i == 0 { continue; } let value = line.trim(); ts_file.push(\u0026amp;value[0..value.find(\u0026#34;.ts\u0026#34;).unwrap()+3]); } let url_prefix = \u0026amp;url[0..url.rfind(\u0026#39;/\u0026#39;).unwrap()+1]; let mut file_content = vec![]; for file in ts_file { let resp = reqwest::get(\u0026amp;(url_prefix.to_string() + file)).await?.bytes().await?; file_content.extend_from_slice(\u0026amp;resp); } let mut file = File::create(\u0026#34;tmp_out.ts\u0026#34;)?; file.write_all(\u0026amp;file_content)?; Command::new(\u0026#34;ffmpeg\u0026#34;) .arg(\u0026#34;-i\u0026#34;) .arg(\u0026#34;tmp_out.ts\u0026#34;) .arg(\u0026#34;tmp_out.mp4\u0026#34;) .output() .expect(\u0026#34;Failed to execute command\u0026#34;); Ok(()) } C++ implementation code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 #include \u0026lt;iostream\u0026gt; #include \u0026lt;fstream\u0026gt; #include \u0026lt;string\u0026gt; #include \u0026lt;vector\u0026gt; #include \u0026lt;curl/curl.h\u0026gt; size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* s) { size_t newLength = size*nmemb; size_t oldLength = s-\u0026gt;size(); try { s-\u0026gt;resize(oldLength + newLength); } catch(std::bad_alloc \u0026amp;e) { return 0; } std::copy((char*)contents,(char*)contents+newLength,s-\u0026gt;begin()+oldLength); return size*nmemb; } std::string GetFile(const std::string\u0026amp; url) { CURL* curl; CURLcode res; std::string readBuffer; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, \u0026amp;readBuffer); res = curl_easy_perform(curl); if(res != CURLE_OK) fprintf(stderr, \u0026#34;curl_easy_perform() failed: %s\\n\u0026#34;, curl_easy_strerror(res)); curl_easy_cleanup(curl); } curl_global_cleanup(); return readBuffer; } int main() { std::string url = \u0026#34;https://******.m3u8?Expires=15853412145\u0026amp;OSSAccessKeyId=******\u0026amp;Signature=******\u0026#34;; std::string ts_content = GetFile(url); std::vector\u0026lt;std::string\u0026gt; ts_file; std::string delimiter = \u0026#34;,\u0026#34;; size_t pos = 0; std::string token; while ((pos = ts_content.find(delimiter)) != std::string::npos) { token = ts_content.substr(0, pos); ts_file.push_back(token.substr(0, token.find(\u0026#34;.ts\u0026#34;) + 3)); ts_content.erase(0, pos + delimiter.length()); } std::string url_prefix = url.substr(0, url.rfind(\u0026#39;/\u0026#39;) + 1); std::ofstream outfile (\u0026#34;tmp_out.ts\u0026#34;,std::ofstream::binary); for (auto \u0026amp;value : ts_file) { std::string file_content = GetFile(url_prefix + value); outfile.write(file_content.c_str(), file_content.size()); } outfile.close(); system(\u0026#34;ffmpeg -i tmp_out.ts tmp_out.mp4\u0026#34;); } NASM implementation code 1 I don\u0026#39;t know NODEJS implementation code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 const https = require(\u0026#39;https\u0026#39;); const fs = require(\u0026#39;fs\u0026#39;); const { exec } = require(\u0026#39;child_process\u0026#39;); const url = \u0026#39;https://******.m3u8?Expires=15853412145\u0026amp;OSSAccessKeyId=******\u0026amp;Signature=******\u0026#39;; https.get(url, (res) =\u0026gt; { let tsContent = \u0026#39;\u0026#39;; res.on(\u0026#39;data\u0026#39;, (chunk) =\u0026gt; { tsContent += chunk; }); res.on(\u0026#39;end\u0026#39;, () =\u0026gt; { const tsFile = tsContent.split(\u0026#39;,\u0026#39;).slice(1).map(value =\u0026gt; value.trim().split(\u0026#39;.ts\u0026#39;)[0] + \u0026#39;.ts\u0026#39;); const urlPrefix = url.split(\u0026#39;.m3u8\u0026#39;)[0]; let fileContent = \u0026#39;\u0026#39;; tsFile.forEach((value, i) =\u0026gt; { https.get(urlPrefix + value, (res) =\u0026gt; { let data = \u0026#39;\u0026#39;; res.on(\u0026#39;data\u0026#39;, (chunk) =\u0026gt; { data += chunk; }); res.on(\u0026#39;end\u0026#39;, () =\u0026gt; { fileContent += data; if (i === tsFile.length - 1) { fs.writeFile(\u0026#39;tmp_out.ts\u0026#39;, fileContent, (err) =\u0026gt; { if (err) throw err; exec(\u0026#39;ffmpeg -i tmp_out.ts tmp_out.mp4\u0026#39;, (err, stdout, stderr) =\u0026gt; { if (err) throw err; }); }); } }); }); }); }); }); Kotlin implementation code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 import java.io.*; import java.net.URL; import java.nio.file.*; import java.util.stream.*; public class Main { public static void main(String[] args) throws IOException { String url = \u0026#34;https://******.m3u8?Expires=15853412145\u0026amp;OSSAccessKeyId=******\u0026amp;Signature=******\u0026#34;; String tsContent = new String(Files.readAllBytes(Paths.get(url))); String[] tsFile = tsContent.split(\u0026#34;,\u0026#34;); String urlPrefix = url.substring(0, url.lastIndexOf(\u0026#39;/\u0026#39;) + 1); StringBuilder fileContent = new StringBuilder(); for (int i = 1; i \u0026lt; tsFile.length; i++) { String value = tsFile[i].trim(); fileContent.append(new String(Files.readAllBytes(Paths.get(urlPrefix + value.substring(0, value.indexOf(\u0026#34;.ts\u0026#34;) + 3))))); } Files.write(Paths.get(\u0026#34;tmp_out.ts\u0026#34;), fileContent.toString().getBytes()); try { ProcessBuilder pb = new ProcessBuilder(\u0026#34;ffmpeg\u0026#34;, \u0026#34;-i\u0026#34;, \u0026#34;tmp_out.ts\u0026#34;, \u0026#34;tmp_out.mp4\u0026#34;); Process p = pb.start(); p.waitFor(); } catch (Exception e) { e.printStackTrace(); } } } ","date":"2023-09-12T22:10:08+07:00","image":"/p/ffmepg-mp4-to-hls-haha/ffmpeg-cover.webp","permalink":"/en/p/ffmepg-mp4-to-hls-haha/","title":"MP4 to Streaming Video Conversion"},{"content":"Reverse engineering the source code of a PyInstaller-packaged exe file We all know that libraries can be used to compile .py files into .exe files for execution. We will start by compiling a script into a .exe and then decompiling the source code of the .exe to obtain the source file.\nIntroduction We all know that we can use the PyInstaller library to compile .py files into .exe files that can be run. This article will cover compiling scripts into .exe files and then decompiling the source code of the .exe file to extract the source files.\nEnvironment Tools Python 3.8.10: Download it yourself if you don\u0026rsquo;t have it\nPyinstaller library: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller==5.13.0\npyinstxtractor.py: Download address\nCompiling the Program Checking the Environment 1 python -V If the execution is successful, then it\u0026rsquo;s done.\nWriting the Script awa.py\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 # Function def test(): print(\u0026#34;====666====\u0026#34;) input_text = input(\u0026#34;I\u0026#39;m telling you the truth 1\u0026#34;) # Print the formatted time and the content entered by the user print(datetime.datetime.now().strftime(\u0026#34;%Y-%m-%d %H:%M:%S \u0026#34;) + input_text) if __name__ == \u0026#39;__main__\u0026#39;: test() Packaging Program First, install the library pyinstaller used by the packaging program. Here, we use the Tsinghua mirror and specify the 5.13.0 version library.\n1 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller==5.13.0 Locate the folder where the script is located. Mine is D:\\. cd to this path and enter the following packaging command:\n1 Pyinstaller -F awa.py After the command finishes executing, you will see the completed successfully. field, indicating that the .exe file was successfully generated in the dist folder.\nReverse Engineering Process First, we download the decompilation script pyinstxtractor.py and place it in the same working directory as the .exe file we want to decompile.\nThen, we continue by cding the dist folder in the command line, entering the following command and executing it:\n1 python pyinstxtractor.py awa.exe After execution, you will see the message Successfully, and a awa.exe_extracted folder will be generated.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 [+] Processing FDP Configuration Online Update 2.exe [+] Pyinstaller version: 2.1+ [+] Python version: 3.8 [+] Length of package: 32503973 bytes [+] Found 141 files in CArchive [+] Beginning extraction...please standby [+] Possible entry point: pyiboot01_bootstrap.pyc [+] Possible entry point: pyi_rth_pyqt5.pyc [+] Possible entry point: pyi_rth_pkgutil.pyc [+] Possible entry point: pyi_rth_inspect.pyc [+] Possible entry point: Download json.pyc [+] Found 225 files in PYZ archive [+] Successfully extracted pyinstaller archive: FDP configuration online update 2.exe You can now use a python decompiler on the pyc files within the extracted direct ory `` Enter this folder. Inside, you\u0026#39;ll find many files with the extensions `.dll` and `.pyd`, and a folder named `PYZ-00.pyz_extracted`. This folder contains the **dependency libraries** imported by the program. If you\u0026#39;ve imported other `.py` files, you can use a similar method to decompile those dependent `.py` files. In this directory, find `awa.pyc` and a file with the same name as your `awa.exe` file. ![Demo](pyinstaller.webp) Then you can take this `.pyc` file to any `.pyc` to `.py` file conversion website found on search engines to convert it. ","date":"2023-09-12T21:45:21+07:00","permalink":"/en/p/debug-pyinstaller-crack/","title":"A Method for Reverse Engineering a PyInstaller Packaged Program"},{"content":"question The bat batch processing script is as follows\n1 2 3 4 5 6 @echo off echo hello,world. echo haha pause When CMD executes the script, Chinese garbled characters appear.\nanalyze Garbled characters are all related to character encoding. .\nComputers can only process numbers. If text is encountered, it must be converted to a number before processing. This is where character encodings (character sets) come in. . If you use a certain character encoding for encoding, you must use the same character encoding for decoding. If different character encodings are used, garbled characters will appear. .\nsolve Convert the encoding of script files By default, in the bat script file, if the Chinese is not ANSI encoding, garbled characters will appear. Therefore, you can use the Notepad that comes with the Windows operating system platform to open the script file, click the menu [File] - [Save As], and select ANSI encoding to save.\nAfter converting the encoding and running it again, the Chinese garbled problem was solved.\nChange code Declare changes to the previous code in the original bat script file\n1 chcp 65001 other Common code page mapping code page mapped character set 936 GB2312 20127 US-ASCII 65001 UTF-8 ","date":"2023-09-12T21:13:11+07:00","permalink":"/en/p/batchfile-fix-lange-erorr/","title":"Batchfile batch script garbled solution"},{"content":"ffmpeg batch conversion to small videos Sometimes we need to batch compress the videos in the folder. At this time, we can use python to automatically control ffmpeg to realize batch conversion. This script has only been used on termux\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import os import subprocess import shlex script_dir = os.path.dirname(os.path.realpath(__file__)) video_dir = script_dir for root, dirs, files in os.walk(video_dir): for videos in files: if video.endswith(\u0026#39;.mp4\u0026#39;): filename, ext = os.path.splitext(video) out_file1 = filename + \u0026#39;_1\u0026#39; + ext cmd1 = f\u0026#39;ffmpeg -i {shlex.quote(os.path.join(root, video))} -g 90 -b:v 2000k -bufsize 2000k -maxrate 2500k {shlex.quote(os.path.join(root, out_file1))}\u0026#39; subprocess.run(cmd1, shell=True) out_file2 = filename + \u0026#39;_2\u0026#39; + ext cmd2 = f\u0026#39;ffmpeg -i {shlex.quote(os.path.join(root, out_file1))} -g 90 -r 30 {shlex.quote(os.path.join(root, out_file2))}\u0026#39; subprocess.run(cmd2, shell=True) os.remove(os.path.join(root, out_file1)) print(\u0026#39;Done!\u0026#39;) How to use Install ffmpeg and python3 and run\n","date":"2023-09-10T21:38:10+07:00","permalink":"/en/p/ffmpeg-python-video-allinsmall/","title":"ffmpeg batch compression conversion video to 30FPS"},{"content":"Preface When we use the official Ubuntu server image to install it on the server, we can only log in to the account that was originally installed and set and use sudo su command to elevate privileges, but there is no root account that can log in through SSH. This is because after the root account is created, a random password will be set each time the computer is turned on and SSH login will be disabled. Therefore, it is not convenient for us to change the passwords one by one using nano and vim.\nWindows All need to create a new .txt file and then change the suffix to .sh file and run it on Linux with ./root.sh\nlinux Just use nano or vim to create a root.sh and run it with ./\nubuntu exclusive Only for intranet ubuntu (no need for security, just convenience) ```Bash #!/bin/bash Enable root permissions sed -i \u0026rsquo;s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g\u0026rsquo; /etc/ssh/sshd_config\nSet root password echo \u0026ldquo;root:awa114514\u0026rdquo; | chpasswd\nRestart sshd service systemctl restart sshd.service\necho \u0026ldquo;SSH ROOT permissions have been enabled and the password has been changed to awa114514\u0026rdquo;\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 \u0026lt;/details\u0026gt; ## Script compatible with all Linux distributions \u0026gt; Written casually \u0026lt;details\u0026gt; \u0026lt;summary\u0026gt;Normal script compatible with all Linux distributions\u0026lt;/summary\u0026gt; ```Bash #!/bin/bash # Check if the root password meets security requirements if ! check_passwd; then echo \u0026#34;The root password is not secure, please reset the root password\u0026#34; exit 1 fi # Prompt the user to confirm the operation read -p \u0026#34;Are you sure to enable root permissions and set the root password? (y/n) \u0026#34; answer if [[ $answer != \u0026#34;y\u0026#34; ]]; then echo \u0026#34;The operation has been canceled\u0026#34; exit 1 fi # Check the system type type=$(uname | tr \u0026#39;[:upper:]\u0026#39; \u0026#39;[:lower:]\u0026#39;) # Enable root permissions case $type in linux) sed -i \u0026#39;s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g\u0026#39; /etc/ssh/sshd_config ;; *) echo \u0026#34;This script is only for Linux systems\u0026#34; exit 1 ;; esac # Set root password echo \u0026#34;root:$password\u0026#34; | chpasswd # Restart sshd service systemctl restart sshd.service echo \u0026#34;SSH ROOT permission is enabled and password has been changed to $password\u0026#34; Script compatible with CentOS, Ubuntu, Arch and Debian Written casually\nScript compatible with CentOS, Ubuntu, Arch and Debian ```Bash #!/bin/bash Check if the root password meets security requirements if ! check_passwd; then echo \u0026ldquo;The root password is not secure, please reset the root password\u0026rdquo; exit 1 fi\nPrompt the user to confirm the operation read -p \u0026ldquo;Are you sure you want to enable root permissions and set a root password? (y/n) \u0026quot; answer if [[ $answer != \u0026ldquo;y\u0026rdquo; ]]; then echo \u0026ldquo;The operation has been cancelled\u0026rdquo; exit 1 fi\nCheck the operating system os=$(cat /etc/os-release | grep \u0026ldquo;PRETTY_NAME\u0026rdquo; | cut -d \u0026lsquo;=\u0026rsquo; -f 2 | tr -d \u0026lsquo;\u0026rdquo;\u0026rsquo;)\nEnable root permissions case $os in \u0026ldquo;CentOS Linux\u0026rdquo;) sed -i \u0026rsquo;s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g\u0026rsquo; /etc/ssh/sshd_config ;; \u0026ldquo;Ubuntu\u0026rdquo;) sed -i \u0026rsquo;s/#PermitRootLogin no/PermitRootLogin yes/g\u0026rsquo; /etc/ssh/sshd_config ;; \u0026ldquo;Arch Linux\u0026rdquo;) sed -i \u0026rsquo;s/#PermitRootLogin no/PermitRootLogin yes/g\u0026rsquo; /etc/ssh/sshd_config ;; \u0026ldquo;Debian\u0026rdquo;) sed -i \u0026rsquo;s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g\u0026rsquo; /etc/ssh/sshd_config ;; esac\nSet root password echo \u0026ldquo;root:awa114514\u0026rdquo; | chpasswd\nRestart sshd service systemctl restart sshd.service\necho \u0026ldquo;SSH ROOT permission is enabled and password has been changed to awa114514\u0026rdquo;\n1 \u0026lt;/details\u0026gt; ","date":"2023-09-01T08:49:19+07:00","image":"/p/linux-ssh-root-shell/root-1200-1.webp","permalink":"/en/p/linux-ssh-root-shell/","title":"One-click script to set up SSH access for ROOT account"},{"content":"Introduction Because I originally built my blog using wordpress, I am very familiar with DDoS and CC attacks and have always paid close attention to them. Later on, I successively tried dynamic frameworks like typecho and Halo, then moved from jekyll to Hexo, before finally settling on Hugo, a static blog framework. After that, I stopped worrying about server and DDoS protection issues and remained in a completely worry-free state. That is, until a certain person recently launched a malicious 4-day attack on my website, which forced me to take DDoS and CC protection seriously again.\nHow It Started Around 11 PM, while I was scrolling through my phone, an email arrived telling me my website had already used 75GB of bandwidth. I thought to myself: what on earth used up so much bandwidth?\nThen I clicked in to take a look, and it literally gave me a jump scare.\nIf I ignored this, my site would definitely be forced to shut down. And once it\u0026rsquo;s shut down, I would lose all my search engine indexing.\nInterlude This attacker also stuffed a ton of gray-market (illicit) links into my URL shortening service. However, thanks to my HTML modifications to hide the input form, visiting https://l.xpdbk.com doesn\u0026rsquo;t allow anyone to add links; only I can add them from the backend. I originally intended to make the service available for public use, but because people like this exist, I had no choice but to make it private.\nTaking Action I quickly rushed to enable CF CDN. I hadn\u0026rsquo;t turned on the little orange cloud for Cloudflare CDN before because I wanted to accommodate loading speeds for users in China. Blocked by the WAF firewall, all of the attacker\u0026rsquo;s traffic was successfully mitigated.\nConclusion All the malicious traffic was completely neutralized.\nA word of advice for the attacker: In this world, you can\u0026rsquo;t get something for nothing.\n","date":"2023-08-29T13:58:11+07:00","permalink":"/en/p/ddos-blog-1/","title":"A Record of My Blog Being DDoS'ed and Illegally Attacked"},{"content":"How Build Your Own URL Shortener Service Using Cloudflare Workers A short link, also known as a short URL or short code, refers to a web address that is visually compact. It works by shortening a standard, lengthy URL into a new, much shorter one, making it easier to share and distribute.\nThe main application scenarios for short links are as follows:\nSMS Sending: Using short links in SMS messages can greatly reduce the character count. Nowadays, many marketing text messages utilize short URLs. Community Promotion: Many community platforms or social networking sites block long links. Due to character limits on microblogs (like Weibo) or keyword link restrictions on platforms like WeChat Official Accounts, short URLs can reduce characters and bypass these restrictions. WeChat Anti-Blocking: WeChat has various blocking mechanisms in place. Using short links helps avoid exposing the keywords of the original address, effectively bypassing the block. Dynamic QR Codes (Live Codes): The short URL is fixed, but you can change the destination address by modifying the original link mapped to it in the backend. You don\u0026rsquo;t need to change the fixed short URL itself, making it act as a middle layer. This is mainly used in situations where the cost of replacing a link is high, such as with pre-generated/printed QR codes. Setup This utilizes the service provided by Cloudflare Workers. The free tier allows up to 100,000 requests per day, which is more than enough for personal use.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 const html404 = `\u0026lt;!DOCTYPE html\u0026gt; \u0026lt;body\u0026gt; \u0026lt;h1\u0026gt;404 0.\u0026lt;/h1\u0026gt; \u0026lt;p\u0026gt;0.\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt;` // const statichtml = \u0026#34;https://raw.githubusercontent.com/1x000/zdzy/main/duanlnk/index.html\u0026#34; async function randomString (len) { len = len || 6 let $chars = \u0026#39;ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678\u0026#39; /****By default, confusing characters like oOLl, 9gq, Vv, Uu, I1 are removed****/ let maxPos = $chars.length let result = \u0026#39;\u0026#39; for (i = 0; i \u0026lt; len; i++) { result += $chars.charAt(Math.floor(Math.random() * maxPos)) } return result } async function checkURL (URL) { let str = URL let Expression = /http(s)?:\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- .\\/?%\u0026amp;=]*)?/ let objExp = new RegExp(Expression) return objExp.test(str) \u0026amp;\u0026amp; str[0] === \u0026#39;h\u0026#39; } async function save_url (URL, shortStr) { console.log(\u0026#34;shortStr:\u0026#34;, shortStr) let random_key if (!shortStr) { random_key = await randomString() } else { random_key = shortStr } let is_exist = await LINKS.get(random_key) console.log(is_exist) if (is_exist == null) { // Normal, put it in directly let stat = await LINKS.put(random_key, URL) if (typeof (stat) === \u0026#34;undefined\u0026#34;) return random_key else return stat } else if (!shortStr) { // The generated random_key is a duplicate, call recursively return save_url(URL, null) } else // The custom path already exists return -1 } async function handleRequest (request) { console.log(request) if (request.method === \u0026#34;POST\u0026#34;) { let req = await request.json() console.log(req[\u0026#34;url\u0026#34;]) if (!await checkURL(req[\u0026#34;url\u0026#34;])) return new Response(`{\u0026#34;msg\u0026#34;:\u0026#34;0\u0026#34;}`, { status: 400, headers: { \u0026#34;Content-Type\u0026#34;: \u0026#34;application/json\u0026#34; } }) let random_key = await save_url(req[\u0026#34;url\u0026#34;], req[\u0026#34;shortStr\u0026#34;]) console.log(random_key) // Successfully saved if (Object.prototype.toString.call(random_key) === \u0026#34;[object String]\u0026#34;) return new Response(`{\u0026#34;data\u0026#34;:{\u0026#34;shortUrl\u0026#34;:\u0026#34;${random_key}\u0026#34;}}`, { status: 200, headers: { \u0026#34;Content-Type\u0026#34;: \u0026#34;application/json\u0026#34; } }) // Custom path is duplicated else if (random_key === -1) return new Response(`{\u0026#34;msg\u0026#34;:\u0026#34;0\u0026#34;}`, { status: 400, headers: { \u0026#34;Content-Type\u0026#34;: \u0026#34;application/json\u0026#34; } }) // Didn\u0026#39;t test what happens when KV is full, assuming it returns an error on put (lazy guess) else return new Response(`{\u0026#34;msg\u0026#34;:\u0026#34;0\u0026#34;}`, { status: 500, headers: { \u0026#34;Content-Type\u0026#34;: \u0026#34;application/json\u0026#34; } }) } const requestURL = new URL(request.url) // todo Normalize the \u0026#39;/\u0026#39; in path const path = requestURL.pathname.toString().substring(1); console.log(path) if (!path) { const html = await fetch(statichtml) return new Response(await html.text(), { headers: { \u0026#34;content-type\u0026#34;: \u0026#34;text/html;charset=UTF-8\u0026#34;, }, }) } const value = await LINKS.get(path) console.log(value) const location = value if (location) { return Response.redirect(location, 302) } // If request not in kv, return 404 return new Response(html404, { headers: { \u0026#34;content-type\u0026#34;: \u0026#34;text/html;charset=UTF-8\u0026#34;, }, status: 404 }) } addEventListener(\u0026#34;fetch\u0026#34;, async event =\u0026gt; { event.respondWith(handleRequest(event.request)) }) Explanation This code is a script used to create a URL shortening service utilizing Cloudflare Workers and KV storage. It allows users to input a long URL and receive a short URL that redirects to the original address. It also supports custom paths for short URLs. Here is a tutorial on how to use this code:\nCreate a Cloudflare account and set up a Workers subscription. You can use the free plan, which allows up to 100,000 requests per day.\nIn the Workers dashboard, create a KV namespace and name it LINKS. This namespace will be used to store the mapping relationship between short URLs and long URLs.\nCreate a Worker in the Workers dashboard and paste this code into the editor. You can modify some variables in the code, such as html404 and statichtml, to customize the content of your 404 page and homepage.\nDeploy the Worker and assign it a domain name, such as example.workers.dev. This domain will serve as the base address for your URL shortening service.\nVisit your domain, and you should see a simple webpage featuring an input box and a button. You can paste a long URL into the input box, click the button, and you will get a short URL. You can also enter a custom path in the secondary input box (if provided by your static html) to specify the exact short URL you want. If the custom path is already taken, you will receive an error prompt.\nYou can copy the generated short URL and open it in a browser—it will seamlessly redirect to the original long URL. You can easily share this short URL with others to direct them to your intended webpage.\nWarning If you intend to use this publicly, you must remove the comment slashes from the statichtml variable line. If you want to keep the service private for yourself, please leave it commented out! There are always malicious actors who will inject illegal links into public shorteners, which can result in your domain getting blocked or penalized.\n","date":"2023-08-27T21:12:11Z","permalink":"/en/p/links-cloudflare-workers/","title":"How to Build Your Own URL Shortener Service Using Cloudflare Workers"},{"content":"Minecraft 1.8.9 Resource Pack and Sound Pack Recommendations The zip files for all the resource packs mentioned in this article can be found online, for example, on Bilibili and Bing.\n8x Resource Pack (The most normal resource pack) Comes with a square font and block placement sounds. Every block has been modified. If you need to record your screen or something, this one is quite suitable.\nOriginal Name: Rodrigo's+Pack+(1.8)\nBut it becomes totally different when paired with the sky overlay pack below.\nChitanda Eru Sky Overlay Pack Suitable for resource packs with no custom sky or very basic sky textures.\nNight\nDay\n16x Resource Pack (The most ordinary resource pack) Does not come with a square font or block placement sounds. Only a few specific blocks have been modified.\nOriginal Name: §fggmen §8[16x]\nShowcase 1\nShowcase 2\n256x Resource Pack (The best-looking resource pack) Does not come with a square font or block placement sounds. Only a few specific blocks have been modified.\nOriginal Name: ! §a§lEmerald Pack §7§l[256x]\n2\n1\n4 PvP Sound Packs Hu Tao Soundpack 2.1 (Hu Tao)\nHit Sound Glass (Broken glass sound)\nExhibition Soundpack (Iron clanking sound)\n§l§6PVP §l§cSound Resource Kit (More sounds)\n","date":"2023-08-24T22:16:17+07:00","image":"/p/caizhibao-1.8.9/2023-08-24_22.33.51.webp","permalink":"/en/p/caizhibao-1.8.9/","title":"Minecraft 1.8.9 Resource Pack and Sound Pack Recommendations"},{"content":" Firmware download is in the link below\nhttps://pvphack.lanzoup.com/iWHnN2rtvhxa Extraction password: hr29\nI have nothing to do, so I extracted a firmware, but I couldn\u0026rsquo;t extract it. It seems that there is only the theme in other places.\nFor those who want to study it, I found that this is a compressed file that can be opened with 7ZIP. . . But the kernel is Linux\n","date":"2023-08-17T17:31:31+07:00","image":"/p/laosat1-gujian/waiguan.webp","permalink":"/en/p/laosat1-gujian/","title":"LAOSAT set-top box firmware extraction backup and firmware structure research"},{"content":"Python batch converts images to webp Python 3.8.10 is required, I don\u0026rsquo;t want to use online conversion awa\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import os import sys from PIL import Image def convert_to_webp(input_file, output_file, quality=80): try: with Image.open(input_file) as im: im.save(output_file, \u0026#34;webp\u0026#34;, quality=quality) print(f\u0026#34;Converted: {input_file} =\u0026gt; {output_file}\u0026#34;) except Exception as e: print(f\u0026#34;Error converting file: {input_file}\u0026#34;) print(str(e)) def process_folder(folder_path): for root, dirs, files in os.walk(folder_path): for filename in files: if any(filename.lower().endswith(ext) for ext in [\u0026#39;.jpg\u0026#39;, \u0026#39;.jpeg\u0026#39;, \u0026#39;.png\u0026#39;]): input_file = os.path.join(root, filename) output_file = os.path.splitext(input_file)[0] + \u0026#34;.webp\u0026#34; convert_to_webp(input_file, output_file) if __name__ == \u0026#34;__main__\u0026#34;: folder_path = os.path.dirname(sys.argv[0]) process_folder(folder_path) Comment version This code is used to batch convert JPG, JPEG and PNG images in a folder to WEBP format.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import os # Process files and directories import sys # Get command line parameters from PIL import Image # Process images def convert_to_webp(input_file, output_file, quality=80): # Function used to convert an image file # input_file: input image file path # output_file: output webp file path # quality: webp file quality, value range 1-100, default value 80 try: # Open input image file with Image.open(input_file) as im: # Save in webp format im.save(output_file, \u0026#34;webp\u0026#34;, quality=quality) print(f\u0026#34;Converted: {input_file} =\u0026gt; {output_file}\u0026#34;) except Exception as e: # Catch exceptions print(f\u0026#34;Error converting file: {input_file}\u0026#34;) print(str(e)) def process_folder(folder_path): # Function used to process the entire folder # folder_path: folder path for root, dirs, files in os.walk(folder_path): for filename in files: # Check if the file suffix is ​​jpg/jpeg/png if any(filename.lower().endswith(ext) for ext in [\u0026#39;.jpg\u0026#39;, \u0026#39;.jpeg\u0026#39;, \u0026#39;.png\u0026#39;]): input_file = os.path.join(root, filename) output_file = os.path.splitext(input_file)[0] + \u0026#34;.webp\u0026#34; # Call the conversion function convert_to_webp(input_file, output_file) if __name__ == \u0026#34;__main__\u0026#34;: # Get the current script path folder_path = os.path.dirname(sys.argv[0]) process_folder(folder_path) Libraries to be installed Here are the steps to install the Pillow library:\nMake sure you have Python installed.\nOpen the command prompt (Windows) or terminal (Mac/Linux).\nEnter the following command to install Pillow:\n1 pip install Pillow After the installation is successful, you can import the Pillow library for image processing: 1 from PIL import Image If you encounter permission issues, you can use sudo or add administrator privileges to install: 1 sudo pip install Pillow 1 pip install Pillow --user In Windows, you sometimes need to upgrade pip using the pip install -U Pillow command to install Pillow.\nPillow has some dependencies, so you may also need to install these during installation.\nExample installation command:\nLinux system/Mac: pip install Pillow\nWindows: pip install Pillow or pip install Pillow --user\nThe main step is to use pip to install the Pillow library, and then you can import the PIL package in Python code and use Pillow.\nPostscript Perfectly achieve the requirements of converting webp\n","date":"2023-08-07T19:59:13+07:00","image":"/p/python-img-to-webp/images.webp","permalink":"/en/p/python-img-to-webp/","title":"Python converts images to webp"},{"content":"Preface Why should I downgrade? The new version of the APP is too slow\nThe new version is disgusting\nThe old version is simple and easy to use\nThe old version is functional\nWhy do I want to write this article I just need it and have tried it\nI want to integrate the articles of other guys and save them for myself\nThe main line of this series of tutorials This article is a series, which comes from the search engine. If you are interested, you can check out other tutorials in the main directory\nWrite the latest ultimate guide for iPhone 6 mobile phones and IOS12 systems (jailbreak + optimization + IPA reverse + APP downgrade + firmware flashing + full backup + IPA personal signature + jailbreak plug-in recommendation + precautions + resource download)\nTutorial Preparation Download this downgrade software (link at the end of the article) Step 1 Open this IOS downgrade software, agree to the firewall and administrator permissions\nStep 2 Download iTunes here\nIf you think it\u0026rsquo;s slow, you can download it from my Lanzou Cloud\nThe process of installing iTunes\nawa\nRecommended settings\nThis is more convenient\nInstallation interface\nSeeing such a retro page means you got it right\nOpen iTunes and agree to its agreement\n**Exit and don\u0026rsquo;t update! ! ! **\nPerform a login operation (turn off other packet capture software)\nIn actual testing, it is not possible to log in after opening the packet capture. Please turn off the software at the beginning\nAgree to log in on your iPhone and enter the 6-digit verification code\nSearch for the app you want in the upper right corner\nSelect the app after scrolling down (do not click to download)\nReopen the software at the beginning and enter the same keyword in the search APP\nAfter clicking Apply\nChoose any version number to enter this page\nYou can download after clicking Download in iTunes\nAfter clicking Download, remember to check if there is anything in the database\nOkay, we found the IPA file package by right-clicking and selecting Open in Windows Data Manager\nStep 3 Install Aisi Assistant and import IPA (there are a lot of tutorials on Baidu)\nVery simple\nProgram source article\nFrequently Asked Questions Q: Unable to log in to iTunes account Please close this tool first, and then log in to iTunes.\nAfter successful login, open this tool again.\nQuestion: When iTunes authorizes the computer, it fails to authorize and keeps trying to authorize Close this tool and then authorize again. Download address Lanzou: iOS old version app download v5.2.zip\niTunes v12.6.5.3 download 64-bit 32-bit\nPostscript Aisi Assistant also has the historical version of each APP, and you can choose to install it, but the historical version installed through Aisi Assistant cannot get updates through the App Store!\nThe iTunes used must be version 12.6.3.6 or below\nBlock updates: Change the suffix of the downloaded ipa file to .zip, and after opening it, delete the iTunesMetadata.plist file (Other files are protected by signatures, please do not modify them, otherwise you need to re-sign the ipa), and after completion, change the file suffix back to .ipa, and then use Aisi or install it online to not receive updates in the App Store!\n","date":"2023-08-07T12:38:43+07:00","image":"/p/ios-app-download-old/photo_2023-08-07_12-41-41.webp","permalink":"/en/p/ios-app-download-old/","title":"IOSApp Any Version Capture Package Downgrade Tutorial"},{"content":" Among the free VPS , some require credit card verification, and some do not. This tutorial will help you apply for a Linux One IPv4 VPS\nPrepare materials An email address (preferably a popular email address such as gmail or QQ) xiaopang@xpdbk.com This type of email address can also be registered) Application process If your account has just been blocked, please change a proxy or IP to register again, otherwise your email address will be blocked\nUse the local network to open the registration page and click Register Enter the email address and name, as well as the purpose of the application (try to be as real as possible), and then click the Request your trial button You can use your brain to think of the most unconventional name for the red circle\nThe circled blue circle must correspond to your location, otherwise the application will not be accepted\nThe reason for the black circle must be more real (~~ I use Linux to play games~~)\nIf the prompt in the picture appears, it means that the account application is successful Click the link in the email to activate the account After logging into the account, another email will remind you of the account expiration date. You can still use the same email to continue to register at that time Click and select in order After waiting for 1-4 minutes, the control panel will show the IP of the VPS and the login username Experience Very good configuration\nCommon reasons for account suspension Large traffic\nCPU usage is full for a long time (not counted)\nNetwork IO is occupied for too long\nSummary With IPV4, speed and configuration\nEasy to be suspended\n","date":"2023-08-01T22:15:20+07:00","image":"/p/ibm-linuxone-freevps/linux1.webp","permalink":"/en/p/ibm-linuxone-freevps/","title":"IBM LiuxOne Server Free"},{"content":"Yesterday, I was checking my Google Analytics data in my free time and spotted a referral from a domain I had never seen before. Initially, I thought it was just a scraper site or someone referencing my article, so I decided to take a look. However, upon opening the page, I saw my entire blog right there (completely unmodified).\nI wouldn\u0026rsquo;t just say the content was identical; even the page structure was exactly the same. I\u0026rsquo;ve seen scrapers and I\u0026rsquo;ve seen people referencing my work, but I\u0026rsquo;ve never seen an entire site being reverse-proxied like this before\u0026hellip;\nAt First At first, I thought they had just scraped and downloaded the site, and I wasn\u0026rsquo;t going to care. But later I realized they were directly reverse proxying it using Cloudflare Workers, and they had even modified the host header. Because of this, standard anti-hotlinking measures were basically useless\u0026hellip;\nAfter some Googling, I found out that this kind of situation can be handled using a JavaScript script.\nIn the beginning, I just used JS to verify if the window\u0026rsquo;s domain was correct. If it wasn\u0026rsquo;t, it would automatically redirect to the correct domain.\nThe code is as follows. Please put it inside the \u0026lt;head\u0026gt; tag:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 const validDomains =[ \u0026#39;blog.xpdbk.com\u0026#39;, \u0026#39;vlblog.xpdbk.com\u0026#39;, \u0026#39;lelfeng.netlify.app\u0026#39;, \u0026#39;cfblog.xpdbk.com\u0026#39;, \u0026#39;1x000.github.io\u0026#39;, \u0026#39;adaewfd321fg3.cachefly.net\u0026#39;, \u0026#39;127.0.0.1:1313\u0026#39;, \u0026#39;localhost:1313\u0026#39; ] try { if (validDomains.indexOf(document.location.hostname +\u0026#39;:\u0026#39;+ document.location.port) === -1) { window.location.href = \u0026#39;http://blog.xpdbk.com\u0026#39;; } } catch(e) {} However, this guy didn\u0026rsquo;t play by the rules. Through the reverse proxy, he replaced all the domains in the files with his own domain, which resulted in an infinite loop.\nLater, I used https://obfuscator.io/ to obfuscate the JS code. This successfully prevented the domains from being modified and replaced.\nThe obfuscated sample code is as follows:\n1 const _0x43eb42=_0x27a7;(function(_0xafca11,_0x40b2b8){const _0x35c55e=_0x27a7,_0x15b338=_0xafca11();while(!![]){try{const _0x517e5b=parseInt(_0x35c55e(0x188))/0x1*(parseInt(_0x35c55e(0x196))/0x2)+-parseInt(_0x35c55e(0x189))/0x3+-parseInt(_0x35c55e(0x18c))/0x4+parseInt(_0x35c55e(0x194))/0x5+parseInt(_0x35c55e(0x1a6))/0x6+-parseInt(_0x35c55e(0x19c))/0x7*(parseInt(_0x35c55e(0x1a3))/0x8)+-parseInt(_0x35c55e(0x19a))/0x9*(-parseInt(_0x35c55e(0x19d))/0xa);if(_0x517e5b===_0x40b2b8)break;else _0x15b338[\u0026#39;push\u0026#39;](_0x15b338[\u0026#39;shift\u0026#39;]());}catch(_0x6c5198){_0x15b338[\u0026#39;push\u0026#39;](_0x15b338[\u0026#39;shift\u0026#39;]());}}}(_0x17e0,0x5e4df));const _0x130d92=(function(){let _0x2e53a6=!![];return function(_0x323b74,_0x490435){const _0x1c497f=_0x2e53a6?function(){if(_0x490435){const _0x33bf80=_0x490435[\u0026#39;apply\u0026#39;](_0x323b74,arguments);return _0x490435=null,_0x33bf80;}}:function(){};return _0x2e53a6=![],_0x1c497f;};}()),_0x4b63bb=_0x130d92(this,function(){const _0x982257=_0x27a7;return _0x4b63bb[_0x982257(0x184)]()[_0x982257(0x192)](_0x982257(0x198))[_0x982257(0x184)]()[_0x982257(0x19f)](_0x4b63bb)[_0x982257(0x192)](_0x982257(0x198));});_0x4b63bb();const _0x3f0a06=(function(){let _0x2f2ee3=!![];return function(_0xf1a2dc,_0x12daa7){const _0x2c78dc=_0x2f2ee3?function(){if(_0x12daa7){const _0x1e1bbf=_0x12daa7[\u0026#39;apply\u0026#39;](_0xf1a2dc,arguments);return _0x12daa7=null,_0x1e1bbf;}}:function(){};return _0x2f2ee3=![],_0x2c78dc;};}()),_0x11b84d=_0x3f0a06(this,function(){const _0x5958bf=_0x27a7;let _0x1c1520;try{const _0x48284c=Function(_0x5958bf(0x18d)+_0x5958bf(0x18a)+\u0026#39;);\u0026#39;);_0x1c1520=_0x48284c();}catch(_0x560e71){_0x1c1520=window;}const _0x4777cb=_0x1c1520[\u0026#39;console\u0026#39;]=_0x1c1520[_0x5958bf(0x1a5)]||{},_0x10f092=[_0x5958bf(0x1a4),_0x5958bf(0x1a0),_0x5958bf(0x187),_0x5958bf(0x18b),_0x5958bf(0x19b),_0x5958bf(0x193),_0x5958bf(0x185)];for(let _0x41e094=0x0;_0x41e094\u0026lt;_0x10f092[_0x5958bf(0x190)];_0x41e094++){const _0xa11f57=_0x3f0a06[_0x5958bf(0x19f)][_0x5958bf(0x197)][\u0026#39;bind\u0026#39;](_0x3f0a06),_0x5853a5=_0x10f092[_0x41e094],_0x418439=_0x4777cb[_0x5853a5]||_0xa11f57;_0xa11f57[_0x5958bf(0x1a1)]=_0x3f0a06[\u0026#39;bind\u0026#39;](_0x3f0a06),_0xa11f57[_0x5958bf(0x184)]=_0x418439[_0x5958bf(0x184)][\u0026#39;bind\u0026#39;](_0x418439),_0x4777cb[_0x5853a5]=_0xa11f57;}});_0x11b84d();const validDomains=[_0x43eb42(0x191),_0x43eb42(0x195),_0x43eb42(0x18e),_0x43eb42(0x18f),_0x43eb42(0x19e),\u0026#39;adaewfd321fg3.cachefly.net\u0026#39;,_0x43eb42(0x186),\u0026#39;localhost:1313\u0026#39;];function _0x27a7(_0x30b2be,_0x27f11a){const _0x2f8ec1=_0x17e0();return _0x27a7=function(_0x11b84d,_0x3f0a06){_0x11b84d=_0x11b84d-0x183;let _0x2ded53=_0x2f8ec1[_0x11b84d];return _0x2ded53;},_0x27a7(_0x30b2be,_0x27f11a);}function _0x17e0(){const _0x30092e=[\u0026#39;__proto__\u0026#39;,\u0026#39;http://blog.xpdbk.com\u0026#39;,\u0026#39;248mjjPBK\u0026#39;,\u0026#39;log\u0026#39;,\u0026#39;console\u0026#39;,\u0026#39;2331390Rbmidg\u0026#39;,\u0026#39;location\u0026#39;,\u0026#39;toString\u0026#39;,\u0026#39;trace\u0026#39;,\u0026#39;127.0.0.1:1313\u0026#39;,\u0026#39;info\u0026#39;,\u0026#39;1hGmVnj\u0026#39;,\u0026#39;511494uNxHBt\u0026#39;,\u0026#39;{}.constructor(\\x22return\\x20this\\x22)(\\x20)\u0026#39;,\u0026#39;error\u0026#39;,\u0026#39;1689000vVCMXN\u0026#39;,\u0026#39;return\\x20(function()\\x20\u0026#39;,\u0026#39;lelfeng.netlify.app\u0026#39;,\u0026#39;cfblog.xpdbk.com\u0026#39;,\u0026#39;length\u0026#39;,\u0026#39;blog.xpdbk.com\u0026#39;,\u0026#39;search\u0026#39;,\u0026#39;table\u0026#39;,\u0026#39;2697315oyIMgb\u0026#39;,\u0026#39;vlblog.xpdbk.com\u0026#39;,\u0026#39;405444fEnPtY\u0026#39;,\u0026#39;prototype\u0026#39;,\u0026#39;(((.+)+)+)+$\u0026#39;,\u0026#39;hostname\u0026#39;,\u0026#39;422352iCyGvT\u0026#39;,\u0026#39;exception\u0026#39;,\u0026#39;119035WNGFBa\u0026#39;,\u0026#39;80LiPhiY\u0026#39;,\u0026#39;1x000.github.io\u0026#39;,\u0026#39;constructor\u0026#39;,\u0026#39;warn\u0026#39;];_0x17e0=function(){return _0x30092e;};return _0x17e0();}try{validDomains[\u0026#39;indexOf\u0026#39;](document[_0x43eb42(0x183)][_0x43eb42(0x199)]+\u0026#39;:\u0026#39;+document[_0x43eb42(0x183)][\u0026#39;port\u0026#39;])===-0x1\u0026amp;\u0026amp;(window[_0x43eb42(0x183)][\u0026#39;href\u0026#39;]=_0x43eb42(0x1a2));}catch(_0x573349){} By taking this encrypted code and randomly inserting it into one of the scripts referenced on your site, you\u0026rsquo;ll leave the trash running those mirror sites with no way to bypass it.\nWith this, the problem is basically solved. Let those jerks go cry about it.\n","date":"2023-07-27T10:11:14+07:00","image":"/p/web-fake-fandai/photo_2023-07-27_21-08-20.webp","permalink":"/en/p/web-fake-fandai/","title":"A Record of My Blog Being Reverse Proxied"},{"content":" Disclaimer: This article is for technical education and security awareness purposes only, aimed at helping readers understand wireless network vulnerabilities. Do not use these techniques in unauthorized environments or for illegal purposes. Unauthorized access or interference with networks is a violation of relevant laws and regulations.\nIn wireless communication, the 802.11 protocol defines management frames to maintain connection status. Among these, the Deauthentication (Deauth) frame is a vital control mechanism. However, due to historical protocol design limitations, it has often been used to analyze security weaknesses. This article provides a technical analysis of how it works and how to secure your personal network.\n1. What is a Deauthentication Frame? In the Wi-Fi standard, Deauthentication frames are a type of management frame. Their legitimate use is to inform a client or Access Point (AP) that a connection is being terminated (e.g., when a user logs out or an AP needs to reboot for maintenance).\nSecurity Vulnerability: Earlier Wi-Fi protocols (such as non-Management Frame Protection versions of 802.11b/g/n) do not require these management frames to be encrypted or authenticated. This means a third-party device can spoof the AP\u0026rsquo;s MAC address and send a Deauth request to a client, which will trust the request blindly and force a disconnection.\n2. Protocol Simulation Analysis (In Controlled Environments) To understand defensive mechanisms, researchers often use the Aircrack-ng suite in controlled environments (such as Kali Linux) to observe this process.\nLab Preparation: A wireless network card capable of Monitor Mode. An isolated experimental network with controlled test devices. Reconstruction Steps: Enter Monitor Mode: Enable the wireless card to capture ambient wireless packets.\n1 sudo airmon-ng start wlan0 Identify Target and Channel: Observe the operating channel and BSSID (MAC address) of the test AP.\n1 sudo airodump-ng wlan0mon Observe Data Interaction: By sending simulated Deauthentication frames, researchers can observe how clients respond to disconnections and subsequent reconnection attempts (the Handshake process).\n1 2 # Example command: Sending test frames to trigger disconnection logic sudo aireplay-ng --deauth 5 -a \u0026lt;AP_BSSID\u0026gt; -c \u0026lt;CLIENT_MAC\u0026gt; wlan0mon Experimental Log Reference: After sending the test frames, the client will disconnect immediately. Researchers can then analyze WPA/WPA2 handshake packets to evaluate encryption strength.\n3. Common Defenses and Hardening Recommendations To mitigate risks associated with Deauthentication vulnerabilities, users and administrators can implement the following:\nA. Enable 802.11w (Management Frame Protection - MFP) This is the most effective defense. The 802.11w protocol encrypts management frames, ensuring that spoofed disconnection frames fail validation.\nRecommendation: Set Management Frame Protection to \u0026ldquo;Required\u0026rdquo; or \u0026ldquo;Capable\u0026rdquo; in your router settings. B. Upgrade to WPA3 The WPA3 encryption protocol mandates Management Frame Protection. If your devices support WPA3, enable it to gain native immunity to protocol-level interference of this kind.\nC. Monitor for Attacks Use Wireless Intrusion Detection Systems (WIDS) to monitor for high volumes of Deauth frames within short intervals.\nD. Physical Layer Defense Reduce wireless signal leakage (by lowering transmit power or using directional antennas) to shrink the physical range available to potential interlopers.\nConclusion The Deauthentication mechanism is an essential part of wireless protocols, but it serves as a reminder that protocol security must evolve. Understanding these principles is not about exploiting vulnerabilities, but about better configuring our network environments to ensure robust and secure connectivity in an increasingly complex digital space.\nLearning Suggestion: We recommend studying the IEEE 802.11 standard documentation and regional cybersecurity laws to enhance your technical expertise within legal boundaries.\n","date":"2023-07-17T00:00:00Z","image":"/p/wifi-deauthentication-security-analysis/images.webp","permalink":"/en/p/wifi-deauthentication-security-analysis/","title":"Understanding Wireless Security: Deauthentication Frame Analysis and Defense"},{"content":"Blog Command Records Code Block Language Support Prefix Language A ABAP, ABNF, ActionScript, ActionScript 3, Ada, AL, Angular2, ANTLR, ApacheConf, APL, AppleScript, ArangoDB AQL, Arduino, ArmAsm, AutoHotkey, AutoIt, Awk B Ballerina, Bash, Bash Session, Batchfile, BibTeX, Bicep, BlitzBasic, BNF, BQN, Brainfuck C C, C#, C++, Caddyfile, Caddyfile Directives, Cap\u0026rsquo;n Proto, Cassandra CQL, Ceylon, CFEngine3, cfstatement, ChaiScript, Chapel, Cheetah, Clojure, CMake, COBOL, CoffeeScript, Common Lisp, Coq, Crystal, CSS, Cython D D, Dart, Diff, Django/Jinja, dns, Docker, DTD, Dylan E EBNF, Elixir, Elm, EmacsLisp, Erlang F Factor, Fennel, Fish, Forth, Fortran, FortranFixed, FSharp G GAS, GDScript, Genshi, Genshi HTML, Genshi Text, Gherkin, GLSL, Gnuplot, Go, Go HTML Template, Go Text Template, GraphQL, Groff, Groovy H Handlebars, Haskell, Haxe, HCL, Hexdump, HLB, HLSL, HolyC, HTML, HTTP, Hy I Idris, Igor, INI, Io, ISCdhcpd J J, Java, JavaScript, JSON, Julia, Jungle K Kotlin L Lighttpd configuration file, LLVM, Lua M Makefile, Mako, markdown, Mason, Mathematica, Matlab, mcfunction, Meson, Metal, MiniZinc, MLIR, Modula-2, MonkeyC, MorrowindScript, Myghty, MySQL N NASM, Natural, Newspeak, Nginx configuration file, Nim, Nix O Objective-C, OCaml, Octave, Odin, OnesEnterprise, OpenEdge ABL, OpenSCAD, Org Mode P PacmanConf, Perl, PHP, PHTML, Pig, PkgConfig, PL/pgSQL, plaintext, Plutus Core, Pony, PostgreSQL SQL dialect, PostScript, POVRay, PowerQuery, PowerShell, Prolog, PromQL, properties, Protocol Buffer, PSL, Puppet, Python, Python 2 Q QBasic, QML R R, Racket, Ragel, Raku, react, ReasonML, reg, reStructuredText, Rexx, Ruby, Rust S SAS, Sass, Scala, Scheme, Scilab, SCSS, Sed, Sieve, Smali, Smalltalk, Smarty, Snobol, Solidity, SourcePawn, SPARQL, SQL, SquidConf, Standard ML, stas, Stylus, Svelte, Swift, SYSTEMD, systemverilog T TableGen, Tal, TASM, Tcl, Tcsh, Termcap, Terminfo, Terraform, TeX, Thrift, TOML, TradingView, Transact-SQL, Turing, Turtle, Twig, TypeScript, TypoScript, TypoScriptCssData, TypoScriptHtmlData V V, V shell, Vala, VB.net, verilog, VHDL, VHS, VimL, vue W WDTE, WebGPU Shading Language, Whiley X XML, Xorg Y YAML, YANG Z Z80 Assembly, Zed, Zig Theme Related FrontMatter Field Meanings\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 title: Title description: Description date: Date (1111-11-11) image: Featured image to display comments: Show / hide comments section (T/F) license: Article license, input false to hide hidden: Hide article (Not shown on homepage, archives, etc., but can be accessed directly via link) math: Whether to load KaTeX script slug: Permalink draft: Whether it is a draft categories: - Categories tags: - Tags lastmod: Last modified time keywords: \u0026#34;Keywords\u0026#34; Markdown Related 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 # Heading 1 ## Heading 2 ### Heading 3 #### Heading 4 ##### Heading 5 ###### Heading 6 *Italic text* **Bold text** ***Bold italic text*** Use three or more asterisks *, dashes -, or underscores _ on a single line to create a horizontal rule ~~Strikethrough~~ \u0026lt;u\u0026gt;Underlined text\u0026lt;/u\u0026gt; Create a footnote format like this [^Footnote]. [^Footnote]: Content of the footnote List: - Item 1 - Item 2 - Item 3 Ordered list: 1. First item 2. Second item 3. Third item \u0026gt; Blockquote [Link text](URL) ![Image description](Image link) Table: | Header 1 | Header 2 | | ---- | ---- | | Cell 1 | Cell 2 | | Cell 3 | Cell 4 | Table alignment: | Left aligned | Right aligned | Center aligned | | :---- | ----: | :----: | | Content | Content | Content | Shortcodes Stack comes with a set of shortcodes, which you can use in your content.\nThis page only contains shortcodes specific to Stack. Hugo\u0026rsquo;s built-in shortcodes are documented here.\nBilibili Video Embed a Bilibili video.\n1 {\u0026lt; bilibili VIDEO_ID PART_NUMBER \u0026gt;} # To prevent loading, normally it should be {\u0026lt; content \u0026gt;} The Video_ID can be found in the video\u0026rsquo;s URL. For example, the video ID of https://www.bilibili.com/video/av12345678 is av12345678. Both AV and BV are supported.\nThe PART_NUMBER is optional. It can be used to specify the part of the video to play. For example, the part number for https://www.bilibili.com/video/av12345678?p=2 is 2.\nTencent Video Embed a Tencent Video video.\n1 {\u0026lt; tencent VIDEO_ID \u0026gt;} # To prevent loading, normally it should be {\u0026lt; content \u0026gt;} The Video_ID can be found in the video\u0026rsquo;s URL. For example, the video ID of https://v.qq.com/x/cover/hzgtnf6tbvfekfv/g0014r3khdw.html is g0014r3khdw.\nYouTube Video Embed a YouTube video.\n1 {\u0026lt; youtube VIDEO_ID \u0026gt;} # To prevent loading, normally it should be {\u0026lt; content \u0026gt;} The Video_ID can be found in the video\u0026rsquo;s URL. For example, the video ID of `\nGeneral Video File Embed a video file.\n1 2 3 Your browser doesn't support HTML5 video. Here is a link to the video instead. # To prevent loading, normally it should be {\u0026lt; content \u0026gt;} {\u0026lt; video src=\u0026#34;VIDEO_URL\u0026#34; autoplay=\u0026#34;true\u0026#34; poster=\u0026#34;./video-poster.webp\u0026#34; \u0026gt;} # To prevent loading, normally it should be {\u0026lt; content \u0026gt;} Video API Test (MP4) Your browser doesn't support HTML5 video. Here is a link to the video instead. 1 {\u0026lt; video src=\u0026#34;\u0026#34; autoplay=\u0026#34;false\u0026#34; poster=\u0026#34;./avatar.webp\u0026#34; \u0026gt;} # To prevent loading, normally it should be {\u0026lt; content \u0026gt;} The VIDEO_URL can be a URL or a path relative to the static directory. For example, src=\u0026quot;/video/my-video.mp4\u0026quot; will embed the video file located in your site\u0026rsquo;s static/video/my-video.mp4 folder.\nThe autoplay attribute is optional. It can be used to specify whether the video should play automatically. The poster attribute is optional. It can be used to specify a poster image for the video.\nGitLab Embed a GitLab snippet.\n1 {\u0026lt; gitlab SNIPPET_ID \u0026gt;} # To prevent loading, normally it should be {\u0026lt; content \u0026gt;} The SNIPPET_ID can be found in the snippet\u0026rsquo;s URL. For example, the snippet ID of https://gitlab.com/-/snippets/1234567 is 1234567.\nQuote 1 2 3 {\u0026lt; quote author=\u0026#34;A famous person\u0026#34; source=\u0026#34;The book they wrote\u0026#34; url=\u0026#34;https://en.wikipedia.org/wiki/Book\u0026#34;\u0026gt;} # To prevent loading, normally it should be {\u0026lt; content \u0026gt;} Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. {\u0026lt; /quote \u0026gt;} # To prevent loading, normally it should be {\u0026lt; content \u0026gt;} With the above organization, you can insert images into your content like this:\n1 2 3 --- content/post/my-first-post/index.md --- ![Image 1](image1.webp) ![Image 2](image2.webp) Insert Gallery To insert an image gallery, you need to create a page bundle for the gallery. For example:\n1 2 3 4 5 6 7 content └── gallery └── my-first-gallery ├── index.md ├── image1.webp ├── image2.webp └── image3.webp 1 2 3 --- content/gallery/my-first-gallery/index.md --- ![Image 1](image1.webp) ![Image 2](image2.webp) ![Image 1](image3.webp) It will render as two rows: the first row will have two images, and the second row will have one image.\n","date":"2023-07-16T00:00:00Z","permalink":"/en/p/blog-ml/","title":"Common Blog Commands (For Offline Use)"},{"content":"Win7 one-click login background change script Required\nWindows 7 Ultimate or Enterprise Edition\nRegistry\nGroup Policy Editor\nSeveral pictures\nRegistry script Lanzoue Cloud Access password: i0f5 A one-click package is provided below\nSource code\nDisable custom login background\n1 2 3 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI\\Background] \u0026#34;OEMBackground\u0026#34;=dword:00000000 Enable custom login background\n1 2 3 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI\\Background] \u0026#34;OEMBackground\u0026#34;=dword:00000001 If a new theme is selected, the registry value just set will be reset to 0. Because selecting a new theme will reload the configuration file of this theme. And because the registry key value in the configuration file may be 0, you can only run the .reg script again after selecting a new theme.\nReplace the login wallpaper file Bat script to change the login wallpaper source code\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @echo off set \u0026#34;source=%~dp0backgroundDefault.webp\u0026#34; set \u0026#34;destination=C:\\Windows\\System32\\oobe\\info\\backgrounds\u0026#34; if not exist \u0026#34;%source%\u0026#34; ( echo \u0026#34;Error: %source% does not exist.\u0026#34; pause exit /b ) if not exist \u0026#34;%destination%\u0026#34; ( mkdir \u0026#34;%destination%\u0026#34; ) xcopy /y /exclude:%~nx0 \u0026#34;%source%\u0026#34; \u0026#34;%destination%\u0026#34; echo \u0026#34;MoeGeek BLOG.XPDBK.COM!\u0026#34; pause Bat script to change back to the default wallpaper\n1 2 3 4 5 6 7 8 9 10 @echo off set folder=\u0026#34;C:\\Windows\\System32\\oobe\\info\u0026#34; if exist %folder% ( echo Deleting %folder%... rmdir /s /q %folder% echo Folder deleted. ) else ( echo %folder% does not exist. ) pause One-click image package (image suffix change and not very good image compressor) Image compression\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import os from PIL import Image def compress_image(input_path, output_path, max_size): with Image.open(input_path) as img: # Get the original image size width, height = img.size # Calculate the compression ratio ratio = (max_size * 1024) / os.path.getsize(input_path) # Calculate the compressed size compressed_width = int(width * ratio) compressed_height = int(height * ratio) # Compress the image and save it img.thumbnail((compressed_width, compressed_height)) img.save(output_path) # Define the target directory and maximum file size target_dir = \u0026#34;pop\u0026#34; max_file_size = 250 # Unit is KB for root, dirs, files in os.walk(target_dir): for filename in files: if filename.endswith(\u0026#34;.webp\u0026#34;) or filename.endswith(\u0026#34;.webp\u0026#34;) or filename.endswith(\u0026#34;.webp\u0026#34;): input_path = os.path.join(root, filename) output_path = os.path.join(root, \u0026#34;compressed_\u0026#34; + filename) compress_image(input_path, output_path, max_file_size) Image suffix conversion\n1 2 3 4 5 6 7 8 9 10 import os from PIL import Image directory = \u0026#34;./pop\u0026#34; for filename in os.listdir(directory): if filename.endswith(\u0026#34;.webp\u0026#34;) or filename.endswith(\u0026#34;.webp\u0026#34;) or filename.endswith(\u0026#34;.bmp\u0026#34;): img_path = os.path.join(directory, filename) with Image.open(img_path) as im: im.convert(\u0026#39;RGB\u0026#39;).save(os.path.splitext(img_path)[0] + \u0026#34;.webp\u0026#34;) Note: Create a picture named backgroundDefault. The background picture must be in JPG format and saved to the folder where the script is located. But the file size must be controlled within 250KB, otherwise the modified background picture of the login interface will not be displayed normally!\nAfter doing this, the system should take effect immediately (no need to restart), you can lock the current user or log out to test it. You can lock it with the logo key plus the L key (WinKey+L).\nIf you want to restore the original login background, just run One-click to change back to the default wallpaper.bat. When the custom picture cannot be found, Win7 will automatically use the default login background.\nDownload one-click package Lanzoue Cloud Access password: b6uq\nCompression password: TuPiangg114514\nIntegrity SHA-1 check code: fa60a42cb4754fecfc2a5a0760796229dc34512e\nEnglish version available\n","date":"2023-04-21T18:33:11+07:00","image":"/p/win7-login-reimg/1e80f0c8b131eca381f176ffa783d895.webp","permalink":"/en/p/win7-login-reimg/","title":"Windows7 login page photo change script"},{"content":"How to Quickly Unfollow UP Masters on Bilibili? When you engage in \u0026ldquo;follow-for-follow,\u0026rdquo; you might find your feed cluttered with unwanted videos. Or perhaps you accidentally followed a bunch of UP masters when registering a new account.\nYou then realize that Bilibili doesn\u0026rsquo;t have a batch unfollow feature, forcing you to click them one by one (how annoying!).\n1 2 3 4 5 6 7 8 9 10 11 12 13 var ms = 300; // Pause for 300 milliseconds var ii = 0; var xx = $(\u0026#34;.be-dropdown-item:contains(\u0026#39;取消关注\u0026#39;)\u0026#34;); console.log(\u0026#34;Following\u0026#34;, xx.length, \u0026#34;UP masters on this page!\u0026#34;); tt = setInterval(function(){ if (0 \u0026lt;= ii \u0026amp;\u0026amp; ii \u0026lt; xx.length) { xx[ii].click(); // Automatically click {Unfollow} } else { clearInterval(tt); // Stop operation console.log(\u0026#34;OK! No more UP masters on this page!\u0026#34;); } ii += 1; }, ms+ii*10); // Pause milliseconds before the next click, interval increases incrementally Using Chrome browser as an example:\nPress F12. Go to the Console tab. Paste the code above. Press Enter. This will quickly unfollow all 20 UP masters on the current page.\nPress F5 or Ctrl+R to refresh the page, then run the script again to continue unfollowing the rest.\n","date":"2023-04-09T00:00:00Z","permalink":"/en/p/bz-gzqc/","title":"Batch Delete Bilibili Following List"},{"content":" The methods in this article are prohibited from being abused.\nPlease read the video website TOS before use, and do not violate the video website discipline.\n24-hour live broadcast using Linux Materials:\nA mobile phone and an unlimited network\nIf you have any questions, please ask in the comment area\nInstall Ubuntu (required) 24-hour live broadcast on mobile phone Power saving and quietness are lower cost than cloud servers\nLinuxDeploy (root permission required) linux deploy When setting up the environment, I consulted a lot of information on the Internet and felt that the performance of the mobile phone as a Linux server was unsatisfactory. (But it is enough for live broadcast)\nIf you are a beginner in Linux, using a mobile phone as a server to learn is a good choice (encounter problems and then solve them). There are very few phones on the market that can be rooted (if your phone is OnePlus or Xiaomi, you can try rooting)\nRootable phones All Xiaomi Redmi models: Xiaomi Redmi phones have always supported the official unlock BL (usually unlocked in 7 days). After unlocking BL, you can flash the phone to get root operations, etc. Xiaomi\u0026rsquo;s unlock BL is also the most magical, supporting WeChat Alipay fingerprint payment, which is perfect.\nSamsung/OnePlus/Realme/Lenovo/Asus ROG models These 5 major models also support the official unlock BL. Generally, the official provides unlocking methods, which are the fastest and do not require waiting. Some are unlocked by unlocking commands, and some are unlocked by official unlocking tools. After unlocking BL, it still supports playing with the phone and flashing operations, but after the above models unlock BL, the system no longer supports WeChat fingerprint payment, and must rely on the mask fingerprint module, or lock BL\nNubia Red Magic/Meizu/Black Shark/LG models The above 5 models do not support official unlock BL, so unlocking BL and flashing the phone depends entirely on developers. Fortunately, the above models can basically be unlocked and flashed by the official BL, and then get perfect root, etc. Unofficial unlocking of BL may cause the phone to lose its warranty function. Friends who hope to get warranty need to flash back to the official system before warranty, and then re-lock BL. OPPO models that can be deeply tested. There are not many OPPO models that can be rooted at present, and they all need to pass the official deep test. There is currently no unlocking and rooting method for models that are not officially open for deep testing. It is known that only these models can apply for testing, and the application time is the 1st or 15th of each month. Users who need to unlock root should apply in time. Unlocking BL will cause data to be cleared. Please back up your data before flashing. Fingerprint payment will also become invalid, the same plus model\nSupport Find X/R17 Pro/Reno/Reno Ace/Find X2 series/Ace2/Reno3 series/R17 full network/K1/K3 /K5/R15x official version/Reno4, Reno4 Pro, Reno4 SE 5G/Reno5 Pro+, Reno5 Pro, Reno5\nRoot is not standardized and becomes bricked two lines of tears\nIssues and summary to pay attention to when using:\n~~ In the Linux Deploy settings, the BusyBox installation path needs to be set in Path (default /system/xbin)~~ BusyBox can\u0026rsquo;t be opened after installation\nWhen enabling the permission to mount resources on Android, pay attention to the mount point name. The name in the document is inconsistent with the name used by your own mobile phone (you can view it through the file management tool)\nDownload network speed is a hard flaw. When installing the system, the foreign server connected may time out for download\nDo not download apk from the app store, go directly to github and download the latest apk\nThe above problems may cause ssh and other services to fail to start and cannot be used normally.\nSD card mounting example\nUse environment Download Xshell\nA rooted mobile phone\nA computer\nUse ssh to access linux deploy\nFront-end server installation instructions Install BusyBox app on mobile phone https://github.com/meefik/busybox/releases\nApplication interface, select install (use default configuration/system/xbin) Please try it yourself. If it fails, reinstall Linux Deploy\nInstall linux deploy on mobile phone Releases · meefik/linuxdeploy · GitHub\nModify linux deploy configuration linux In the deploy interface, select the icon in the upper left corner - Configuration:\nProperties Configuration Screen always on Select Lock Wi-Fi Select CPU wake-up Select PATH variable Same as the configuration in BusyBox /system/xbin After modification, select \u0026ldquo;Update environment\u0026rdquo; and save the configuration.\nModify Linux installation properties Linux deploy interface, select the icon in the lower right corner:\nProperties Configuration Description Release version GNU/Linux Ubuntu Ubuntu is the easiest to install Architecture arm64 You can view the mobile phone CPU architecture through the icon-status in the upper right corner of Linux deploy Release version Default Image size 4096 Supports up to 4096MB File system ext4 Keep default User name root Used when logging in with ssh User password Set it yourself English uppercase and lowercase letters and numbers Localization zh_CN.UTF-8 Chinese package is enough Enable Allow the use of initialization system Disable Enable and allow resources on Android to be mounted Select Mount it yourself according to the above method Mount point list /mnt/sdcard:/mnt Source name: mount point name Note: The name may be different for different phones, you can view it through the MT file viewer Enable SSH server Select Default Install Ubuntu linux deploy icon in the upper right corner-install\nInstall dependencies 1 sudo apt install ffmpeg screen Just press Y\nTermux (universal method without root) Note in advance that this method has weaker performance\nRun FFmpeg on Android with Termux and Ubuntu 22. However, it requires setting up a lot of commands manually, be careful not to skip any steps. Note that this may take 10 to 20 minutes or more, depending on your technical knowledge level. Internet speed and CPU speed.\nInstallation Termux Warning\nThe Play Store version of Termux is outdated and unsupported, do not use it, use the Github one opens in a new window\nGo to the Termux Github latest version opens in a new window, download debug_universal.apk, unzip it and run it.\nTips\n**If your file manager does not allow you to run APK files, install and use MT File Manager and allow it to install third-party apps when requested. **\nIMPORTANT WARNING\n**Once you have Termux installed, open it, pull down the Android menu to notifications, in the Termux notification, drag down until you see the following option: Exit | Acquire wakelock, click Acquire wakelock and allow Termux to have battery optimization exclusion permissions when asked. If you don\u0026rsquo;t do this, your performance will be much worse and Termux may be killed by Android while running in the background! **\nInstall Ubuntu 22.04 For installing Ubuntu 22. In Termux, you will need wget and proot, we will install them in the next step.\nOnce you have Termux installed open and run the following commands (in order):\npkg update\npkg upgrade\npkg install proot wget\nTips\nIf you are asked to press Y/N during the update/upgrade command, just type Y and press Enter\nYou will then need to download the installation script using the following command:\n1 wget https://raw.githubusercontent.com/MFDGaming/ubuntu-in-termux/master/ubuntu.sh Once the script has downloaded run it:\n1 bash ubuntu.sh You will then be asked a question, type Y and press Enter.\nOnce the installation is complete, you can start Ubuntu with:\n1 ./startubuntu.sh Install dependencies First, we need to update the APT package manager repository and install dependencies.\nTo update the APT repository, runRun the following command:\n1 apt update -y \u0026amp;\u0026amp; apt upgrade -y After completion, we need to install the dependencies, the command is as follows:\n1 sudo apt install ffmpeg screen Introduction to FFmpeg FFmpeg is a very powerful command line utility that can run on Linux distributions, Windows, and macOS, and supports multiple architectures. FFmpeg is written in C and assembly language, with powerful performance and cross-platform support.\nFFmpeg Installation On Linux distributions such as Ubuntu, FFmpeg is relatively simple to install. Open the terminal and run the following command to install it.\nUbuntu and similar distributions 1 sudo apt install FFmpeg After FFmpeg is installed, you can enter the following command to check whether the installation is successful.\n1 ffmpeg --version File transfer This is very important for whether your live broadcast can be opened\nYou need to install Xftp\nThen you will find an Xftp button on the far right. Click it (you must connect to SSH to use it)\nlinuxdeploy The path is like this\n1 /root And Termux needs to install SSHD to use SFTP\n1 pkg install sshd Run after installation\n1 sshd Set password\n1 passwd Query the mobile phone ip, based on the actual mobile phone ip\n1 ifconfig Query the current user\n1 whoami Confirm the listening port of the ssh service\n1 netstat -ntlp | grep sshd The default SSH port is the 8022 port of this phone\nThe default path is here\n1 /data/data/com.termux/files/home/ubuntu-fs/root Preparation before starting the live broadcast Youtube preparation\nYou cannot broadcast copyrighted content on Youtube live broadcast (in simple terms, it means things that are popular on Youtube)\nFor example, the content of my live broadcast is Ding Zhen, so it’s okay\nThose who are capable can click on the link to watch Snow Leopard live broadcast doge\nI Got Smoke Ding Zhen Infinite Loop 24H*7Days - YouTube\nYoutube live broadcast is too difficult for you\nBilibili Live Account requires real name (18 years or older)\nIP address needs to be in mainland China\nThose not in mainland China can use Guiyan Accelerator (Search by yourself)\nhttps://live.bilibili.com/24595202\nIf you meet these conditions, please continue reading\nLive script Please encapsulate the following content into .sh format For example: 535ir.sh\nCreate a folder\n1 mkdir zhibo Enter the folder\n1 cd zhibo Add script\n1 nano zhibo.sh If you don\u0026rsquo;t have NANO, install it\n1 apt install nano Youtube live script 1 2 3 4 5 #!/bin/bash while true do ffmpeg -re -i \u0026#34;Video.mp4\u0026#34; -vcodec copy -acodec copy -f flv \u0026#34;Server address/live code\u0026#34; done Bilibili live script 1 2 3 4 5 #!/bin/bash while true do ffmpeg -re -i \u0026#34;Video.mp4\u0026#34; -vcodec copy -acodec copy -f flv \u0026#34;Server address/live code\u0026#34; done Run live Add a virtual terminal\n1 screen -S custom name 1 Run ./script name.sh Return to the virtual terminal\n1 screen -r the name you just customized Exit from the virtual terminal\n1 Press Ctrl+a d in the screen terminal If you encounter any problems, please search for related issues on Bing\nOr ask questions in the comment section\n","date":"2023-03-25T00:00:00Z","image":"/p/zhibo-24h/FEWF4.webp","permalink":"/en/p/zhibo-24h/","title":"24-hour live broadcast using Linux"},{"content":"Setting Up a Minecraft Server on a VPS (Linux) I. Why Set It Up? When playing Minecraft, we often want to play multiplayer. However, Minecraft Java natively only supports LAN multiplayer for local networks. This is when we need to set up a server so players from different regions can play online together.\nThe English version is currently in progress.\nII. Installation Environment Virtual Private Server (VPS) OS version: Ubuntu 22.04 64-bit Minecraft International Edition version: 1.12.2 Java Edition III. Setup Steps Connect to your server via SSH.\nEnter the following commands to install the JDK environment.\nIf you don\u0026rsquo;t know how to use SSH, you can search for a guide on Baidu or Bing.\nJDK Environment For 1.16 and earlier versions, you need to install JDK 8.\n1 sudo apt install openjdk-8-jdk For 1.17, you need to install JDK 16.\n1 sudo apt install openjdk-16-jdk For 1.18 and above, JDK 17 is required.\n1 sudo apt install openjdk-17-jdk Server Software Download Go to https://mcversions.net/ and find the server version you want to download.\nCopy the link for server.jar.\nFor example, on the following page:\n1.12.2\nEnter the following command to download the Minecraft server software:\n1 wget -N [paste your copied link here] Enter the following command to start the server:\n1 java -server -XX:+UseG1GC -Xmx2048M -Xms1024M -jar server.jar nogui Open eula.txt and change the part in the red box to eula=true.\nEdit the server.properties file and modify the following sections:\nview-distance=10 max-build-height=256 server-ip= level-seed= gamemode=0 # 1 is Creative, 2 is Spectator server-port=25565 # Server port, it is recommended to change this enable-command-block=false allow-nether=true enable-rcon=false op-permission-level=4 enable-query=false generator-settings= resource-pack= player-idle-timeout=0 level-name=world motd=A Minecraft Server # Server description (Message of the Day) announce-player-achievements=true force-gamemode=false hardcore=false white-list=false pvp=true spawn-npcs=true generate-structures=true spawn-animals=true snooper-enabled=true difficulty=1 network-compression-threshold=256 level-type=DEFAULT spawn-monsters=true max-tick-time=60000 max-players=20 # Maximum number of players the server can handle use-native-transport=true online-mode=true # Change to false to disable premium authentication (allow cracked accounts) allow-flight=false resource-pack-hash= max-world-size=29999984 Create a screen session, and then write a startup script.\nCreate the script file:\n1 nano start.sh Fill in the script content:\n1 2 3 4 5 6 #!/bin/sh for ((i=0; i\u0026lt;10; i ++)) do java -server -XX:+UseG1GC -Xms1024M -Xmx2048M -jar server.jar nogui -noverify -XX:+AggressiveOpts -XX:+UseCompressedOops done Press Ctrl+X to save.\nGrant execution permissions:\n1 chmod 777 start.sh 1 ./start.sh Note If you need to stop the server, please enter the screen session and type the /stop command to gracefully shut down the server program.\nYou can use the following command to check if screen is already installed on your server:\n1 screen -v 1 apt-get -y install screen How to start a screen session 1 screen -S name Replace \u0026ldquo;name\u0026rdquo; with a meaningful name for your session (e.g., mc).\nDetaching from a screen session To detach from the current screen session, you can press Ctrl-A followed by d. All screen sessions will remain active in the background, and you can reattach to them at any time later.\nReattaching to a screen session If you detached from a session, or if your connection was interrupted for some reason, you can reconnect using the following command:\n1 screen -r mc If you have multiple screen sessions, you can list them using the ls parameter.\n1 2 3 4 5 6 7 8 9 10 11 12 # Enter screen -ls # List sessions There are screens on # 114514 is the session ID 114514.session (Detached) 1919810.homo (Detached) 514441.session1 (Detached) 3 Sockets in /var/run/screen/S-root In our example, we have three active screen sessions. Therefore, if you want to restore a specific session, you can execute:\n1 screen -r 1919810 1 2 # Or use the session name screen -r -S homo Deleting a Screen While inside the current screen, press Ctrl+D to delete that screen.\nWhat it looks like after the server is up Press Ctrl+c to exit. Re-do the screen process mentioned above.\nThen, type in your server\u0026rsquo;s public IP in the game client (for some servers, you need to turn off the firewall or open the ports in your security group first).\nEnter the game and enjoy!\n","date":"2023-02-10T00:00:00Z","image":"/p/mc-server/game.webp","permalink":"/en/p/mc-server/","title":"How to Set Up a Vanilla Minecraft Java Server on a VPS"},{"content":"5B5T Base Coordinates Record DES: U2FsdGVkX1/Fez/+ozPEvfaKewD113NRTsNEJ3tJqJWf7kw4SmPYWLJ/+BFKdJTb\nFinal RSA Encryption: OpU0DYem5ccpMPNECxiOh0DtpWMsYHgQqxeDIth+qGvJZvms03wmR6B1zEVbBGY1pQ5X6EAOocAsDG4SCN254QLvitvW2eO8AUbc+xd4b7OGm5kHRmoZRK3FeeyCwljcXULjLb89I+Kvw02qsA544+8UzTyYfVc1EDSEvWfpuELrMBvY0OTT/yDz34QS1lF6750/cMbwehrNjy5QE614hrXCpR7yEUt6y9q62otaRuLBorCACXHbZVBwT+9j81yTuKLk5vT7W8NutU2c1OYvxN9UN973KnTfhd2fYwUfVHT0266z4GQBsQHn8DDFLnHbzCZNcxyc9N2wu6Dj3UsEG8gPG29EBttdecMCKB1B1r/ViEe6QwPd5r+y6BZW5dVkivCWH6FHs3NCrCsPNYRMZpkKOBPd7jVwqIHCcWkd3ichZsA9GSCROhRw554fWVHykNi53+CUxL4P2xoxDM1kauaqFsVfPjowlrskKJ1rK4HFI5JzlkUPb59DxC+CiB1JGsa35Y96ZSvl2VfdVYF1h7ASwKP0XNwzV2RNXYoym/QMKHCjk+OW2zyGemIO6auPd86KMF7XdjdwCoABrto1gcf7c8imkWDTdHAdhZ56lx9v/Oly9ZcG7ItR/2gmpvGSigL7TvgV5tBSWOFhqdUzfJE4ktHHZHVLXw/gL8OheTUeDa2fWVjWNUvbOXuNb5xAz8okRUAJx12oCV4Lb9ks5w6egII9FtDBbZ2RS6DtAu/XqmlMBSXRZyaKkTYXHSrC9WgWxZqESY9dPMJuVePRNWJ3aUMwBj6x3svOC2wi8D3CgxV3XG0+C2rhmwj4G2Ab7ljmk2bePPVDwY96NgRrBYPXHPrCIGyAJGhRXg+153ZeWJ2BfEWCQBTmgT6BfmCsW0hXSvSansGBEGJlHdGKypb2E8diDqRNuYgrH22mDR4UJJLH50DTsW3BtT99LYdvSFWAQL0pCIoDUlUWaVD9OMU165GAxvU731eiBN4oUs+Lc/FJb5JHIUx7RXt9aHpNE4Uwepzs16lmBKsLBMUh4eua7Flpx7002yRqAdPpZ/Xfzm27cppnNgLCDz39m57ZVfLpO/zyh8DGkKVCNYY+jOjGplKMdx7NpQ3Vk75QEktOYHq66qvDejvqYeYtf8MuNhN1hhouo8L1R80EI0wrp3L1RhQMm5g6ladADHYtFW59O5qehQfJB0JQLTV63RZ7/UzEyrle67LjIeFkjBNH4OcZA2JXtx9uHVgZVSapkn0/Cia59qBTcVUKPviK+0SQUeN2m+3wjaVqnDYSS2HI1TwotChL2FYu8uIMxhmkt9j8yAqA0Q69y0OHuJOWvheiBToLFmkCkHVf37bYwFfjNQ==\nPublic/Private Key Encryption Length: 4096\nType: RSA\nPublic Key: -----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAu7MgBFkZ6nxvzUR2JVSv ImGt8RKRKP8memL9R3MWcn6T/gocn6/kz6yR67ceekOMEhjJDsalwv/qxbMCbPSi D/WPB2PZvbe/y6Nrvab5RdcrbJlxlgaqEHYSDuGqJu3iMgjdpzqZjTfCv+kIw5mN 5GgO9VkslEIzUxCX7xoAkHGatwQrwcK3vcNSfa2hf9Neg0MqwMUYqgFIED7fwlZ3 r1MZ5oSlN5c3YUWostJH8fBWYO4v2xkBDN1fnGkry5SR95vLU9KqbzlkRNCPZhHe 9dNsDbJdlUo0N/ZniVxMiqtLt1X9GwT6umdbKGs4KEqwLeYULbxHcjrICnW3SW6Z E2+YoekcnmBfkgx1LcsDVbsPpYBeOFDV/fjRaxFcC+g5H+dI/p59nYKuV57Lz0bs Y+FFO2iZOiCmpvH6bvEHcQnSyK04CdFxIVo6i5yJPN/gguzbLBE4Uh0jPDNMmP/N UdhzXQsegJGJOWySg4PZhroTtzbzke2ka+GW/X6duC7kVHx+Bm1fB1DVkw4Bvitz xITqdBkg9pcqB6CBWfCEwJSn/VN6xpTGiJN+d9C6RzaBsj6o20dxMJmDg5venK1B 3qnuxlwAyOL+kJPFMg937ZxMdIY71q/1bW/IrBmMwkn0SmSfpxmOfrO+BF2XB6Y/ 6DrCsAYMz2Ur3G3e6yDGTbsCAwEAAQ== -----END PUBLIC KEY-----\nPrivate Key:\n-----BEGIN PRIVATE KEY----- MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQC7syAEWRnqfG/N RHYlVK8iYa3xEpEo/yZ6Yv1HcxZyfpP+Chyfr+TPrJHrtx56Q4wSGMkOxqXC/+rF swJs9KIP9Y8HY9m9t7/Lo2u9pvlF1ytsmXGWBqoQdhIO4aom7eIyCN2nOpmNN8K/ 6QjDmY3kaA71WSyUQjNTEJfvGgCQcZq3BCvBwre9w1J9raF/016DQyrAxRiqAUgQ Pt/CVnevUxnmhKU3lzdhRaiy0kfx8FZg7i/bGQEM3V+caSvLlJH3m8tT0qpvOWRE 0I9mEd7102wNsl2VSjQ39meJXEyKq0u3Vf0bBPq6Z1soazgoSrAt5hQtvEdyOsgK dbdJbpkTb5ih6RyeYF+SDHUtywNVuw+lgF44UNX9+NFrEVwL6Dkf50j+nn2dgq5X nsvPRuxj4UU7aJk6IKam8fpu8QdxCdLIrTgJ0XEhWjqLnIk83+CC7NssEThSHSM8 M0yY/81R2HNdCx6AkYk5bJKDg9mGuhO3NvOR7aRr4Zb9fp24LuRUfH4GbV8HUNWT DgG+K3PEhOp0GSD2lyoHoIFZ8ITAlKf9U3rGlMaIk3530LpHNoGyPqjbR3EwmYOD m96crUHeqe7GXADI4v6Qk8UyD3ftnEx0hjvWr/Vtb8isGYzCSfRKZJ+nGY5+s74E XZcHpj/oOsKwBgzPZSvcbd7rIMZNuwIDAQABAoICAGgJJ9ThIhkzMbDfonCcmJoA 9C1rsiO8ELLDTUmeA7IgcJzdM/JaxwNIznSNQgpYiDm7nS1gc546xQEhcFW93lnk LIvXD2g1gcw4X052TzIjykDeZ/PU68xF9UpkUDBVqAs9mMXJGDUK1BoU6zOnV9ti xe+9ppTigJoo113C1s84+J06ZZp29+rpaT6Zz6sPGBK/VuIUHNCV90Bx6QpJbPsz n2aC3SSL3zk+J/w9y3zRTr9ZJhNVr5xW01jZflnPlnxc0P08BhWyBN6TjvfvLdqp ffm1hGNsBreCDu82xoIR4dzTf3/LacGJ6h/kFfNXOoGmRkb3Vc59wETz7Ex6TcNh G4mkYnGCb7SSSp+oIqBYqdef6cZLM6SzX8DEabLDBRs3FiaAGc7aEDMnntUacxIq yYwOrxZ9yOFXknIzkgk7BVlcFomSSV0E00vS0Sibv2LZJpUAy6Uh6NX+zJG8u53Q P3gvvc/swiONPuvMzgB25k5KNi6OYO2kfZBY1C5V8TWrGY6nsqZxwvLZLMqbIFbV MPnB1TMbPX5dOXjtVwAOf0I7OoY1W9xepMm3/JtckrKMlqZhR5M/TnEY1aLMRpQA 1aZ+T8A2v9bH5F5Gf+97UJCeAbNB/aUbISiwlEWtMQGrNXvQcX2cYl3/jctkMyt9 VCkb0rkFpGAKbM14Yt3RAoIBAQDvyw4OnJ5Ob8PxyIJMxi/0pH1g2PEGWXk1wuYW aeleTLulqbqPOUuKzz3Bu4wFfItPA04MqyCzVW4EfnLuy+l3vSN4++YVAUjTuIsH vjzJPQQ75dwfgjq2I55Y4BDaEtKy1/Ao0RPXH6L4FT3XKRywc9dQGP0br61pJQyo ldJFHnk0/veHofqVnGiUQkHtplkKxiYvkoT6ypegvf3yHf+Fkae75/PLR5XxcEom +C4i8jXFhMOLmB/0/TtXDHsJq8W78zwlfMeCHN8N9Z82ioO+nt1PlllTKlGxKc0h dDNXC3QLLE//wNF1bIaYyd3vFJlc9bhh1RMInwDIz9BYoebjAoIBAQDIYr1JR2N3 +5wNjsgoLhOeYzSDq26fh2TAi2vMZNaufJh9r2+KdjsXz3JwCCyU9Jhc1u7t1xol kjwL6Ol3d0Ba+eWNNACMmVini1JPZX/aXlrWPlSJVymJ5dvU1p71PUJK9PJOOHtg Oa08onm8fbEI4QxnK9HBfVwDng8mzjEt8kljFeztPe0XnsIZ9gjPqieMuGhc5yhy oFVjxnHw4oMkq+Xmal4jTTHGZCCBzb64I9srFOQ5ZGWtsg0o27f0m8+Y/DptuVR8 ZtSy194JtzYg6Snf7MQg4/M5IA19zuVwfa5lS9peKXLghDPKtWucC+ZMn/dPc6P5 glMAnv5xSV1JAoIBAQCFXegplE4vzdWrShu+W5QcesgI71/OakER955E5Q8YlZDg KLBMLE+pmm38rDTKcGSCw5HLVfpQA7m24iVGTz9Ai3+JMIDdOeOpbcBVxCbGvhr2 vXdaRvIkj1bok2aMA2AQfC1kZjSkt0HKvPWyD3mXYjZkpCFSHrlR+3s44GscakB7 iztcwmg+gclgfCFy7cwkQ+TFHLa9TaRbkJAG80xEm6gwyGc9rkjlCdEUL4Bpi1EA 1EB2CVvsxFMWrShZTqIhUL0pFGdaJHiiqPOuQAfaIz1voG155dWdtWQTsS9EwGgA NtsfobxdlMiffdbjvA84NqogL4PwjY7AIWT9hr6FAoIBAGsPzkBDoxJs3RClU62c CKFcMaeTxXP4e80f8IVw7v6k1Th5rieVSbdL/8F5rJAdKvaXY2qxvWeLfQeD9pD8 pua0k3/g49Y67BIALwb6nNfIB9Jl1PbYGfpyVASgcqdmhm/T9U3zgX+E8VjvGgmq QhcTXnQVBmnRl4LbRQ8fpUj+JVWKVl7e8jjnep8yQ7zoFV9q+19/pa2wmk7HrQLd kuHZ8egstoU37jsoLfIMQjTR+3xGGjXLvUOTWNKWqe9H/B+py3HqTgh1THkNOrWI LKRizxuzvYoxIDdKN8sa6p0ymSXH5DDhBl6MY7uPOKJT/US9Rv4tM9PQXJZ9XEac wvkCggEBAM75/6UJMcXygCvdJYSYwL3ilEEBoTb/NSPRSngAfAeJWpE3zx1OYQ5E Zr0I+poglwJnsrNpkvhNsJMAbU71l1KK10jqQy0ISPQlcbAN1BTkUYW02qYl6VQb zjKPpvY94YVvlm7RKOafA8ihWfkNBhWSEkrNOqHjcBzkaDE9WUUp9bUaIHDEexd2 MYxvgIS5pl46E+gAl0kszhKgS28lOX4JBrrx/WuzjK5t5JW/WFZh56nqBk4Xm3on /ZFc/aDW/LAuID+7inbcdw2koO7mUW9Gmze9pyvX6IO9Ruz8jihJXvMbFgPoBHf0 rWIhIOVf49H66PICZwb2hhQ1HtCESsg= -----END PRIVATE KEY-----\nBlock: 117 Ultra-long Encryption\nPadding Type: OPENSSL_PKCS1_OAEP_PADDING\nProcess (from left to right): Plaintext DES - Base32 - Base64 - UrlEncode - Binary - RSA\nThis article is only for viewing the coordinate encryption method.\n","date":"2022-12-18T00:00:00Z","permalink":"/en/p/5b5t-haha/","title":"5B5T Base Coordinates Record"},{"content":"Delete apache Apache2 is installed by default. Now uninstall this service.\n1. Find web services Use the following command:\ndpkg -l | grep apache2\n2. Delete apache2 The deletion command is as follows:\napt-get --purge remove apache2\napt-get --purge remove apache2-doc\napt-get --purge remove apache2-utils\napt-get --purge remove apache2-bin\napt-get --purge remove apache2-data\n3. Delete redundant files After the above execution, execute the following command:\nfind /etc -name \u0026quot;apache\u0026quot; |xargs rm -rf\nrm -rf /var/www\nrm -rf /etc/libapache2-mod-jk\n4. Finally Port 80 is released, no problem.\n","date":"2022-11-11T00:00:00Z","image":"/p/web-hax/hax.webp","permalink":"/en/p/web-hax/","title":"Uninstall Apache Advanced Edition"}]