avatar
stevehe
利用ImageMagick命令行批量转换图片格式(webp转jpg、png转ico、heic转jpg)
准备条件: 系统需安装 ImageMagick 软件包,Linux、Cygwin/WSL下均可使用;Windows未经测试; 注:HEIC为苹果系统专有的图像格式,Windows系统上要转换需安装第三方工具HeicFileConsole,ImageMagick转换heic格式经本人测试无效(提示缺少相关的编解码器); HeicFileConsole下载地址:https://heicfile.com/command-line.html 简单命令示例: 1)、转换webp图片为JPG图片: magick input.webp output.jpg 或 convert input.webp output.jpg 2)、批量转换当前目录webp图片为JPG图片: magick mogrify -format JPEG *.webp 3)、指定源文件路径批量转换: magick mogrify…
avatar
电子芥末
tempbk.py 临时备份文件到 Cloudflare R2
本软件通过终端输入命令上传文件到 Cloudflare R2 进行临时(短期)备份. Cloudflare R2 的优点: 10GB 免费容量, 流量免费. 本软件专门针对小文件的临时(短期)备份, 因此 10GB 免费容量够用了. 不加密版 与 加密版 本软件有两个版本, 一个加密, 一个不加密, 各有各的好处. (我比较喜欢加密版) 加密版 可以防止云端分析文件 一旦丢失密钥就无法解密 加密后文件体积会增加33% 不加密版 不能防止云端分析文件, 有一定法律风险…
avatar
xfyuan
Vite化的Rails
本文已获得原作者(Vladimir Dementyev)和 Evil Martians 授权许可进行翻译。原文介绍了使用 Vite- Ruby 实现热重载(live reload)和热替换(hot replacement)的 Vite 化 Rails 的故事 原文链接:Vite-lizing Rails: get live reload and hot replacement with Vite Ruby 作者:Vladimir Dementyev 站点:Evil Martians ——位于纽约和俄罗斯的 Ruby on Rails 开发人员博客。 它发布了许多优秀的文章,并且是不少 gem 的赞助商。 【正文如下】 最近,我把自己的 AnyCable demo 应用升级到了 Ruby 3 和 Rails 7,用上了后者…
avatar
鱼翅
前端条件竞态乱谈——可能被我误解的函数防抖
前言 故事发生的时间距离今天其实已经快一个月了,由于一些特(tuo)殊(yan)的原因,今天终于动笔开始写(shui)下了这篇博文, 再不写都™明年了 。 ChatGPT 想必是过去的一个月里相当火热的话题了,抱着一些好奇心,我也注册并尝试了搜索了一些内容。让我觉得相当惊艳的是它可以通过不断的反问来验证自己对于一些概念理解的正确性,十分 nice。 今天要聊的这部分内容也是在使用 ChatGPT 过程…
avatar
过纯中
以Rails应用为例谈谈如何做好软件系统的依赖项目管理
现代软件体系 现代软件是人类合作的结晶,以homeland这个以Rails开发的小型论坛为例,Ruby 语言的依赖项有211项,Javascript 依赖项目更是达到了1811项,这无疑会遇到应用依赖的组件管理困难。例如,组件的许可证变动引发巨量修改,JS 组件中发生故意投毒事件,所以很多真正非常非常关心软件正确性的公司,基本的软件组件采用策略是 0 依赖。例如 37 signals,基本他们从来不用不是自己开发的组件(其他人会依赖他们组件,他们从来不…
avatar
过纯中
Some Pro user MacOS settings
Lock the fix area of the Dock. defaults write com.apple.dock contents-immutable -bool yes defaults write com.apple.dock size-immutable -bool yes defaults write com.apple.dock position-immutable -bool yes killall Dock Setting recent application number, default is 3. defaults write com.apple.dock show-recent-count -int 5; killall Dock More modern macOS can not stop upgrade from setting, but still can clean the red dot. defaults write com.apple.systempreferences AttentionPrefBundleIDs 0
avatar
Rei
Tailwind CSS,从入坑到退坑
Tailwind CSS 是一个实用类优先的 CSS 框架。跟其他 CSS 框架的主要不同是它不提供组件层面的样式,而是全部都是实用类。我之前写过一个简单的介绍:Tailwind CSS 浅析。 纸上得来终觉浅,绝知此事要躬行。看完文档我也很难评价 Tailwind 的理念是否可行,所以我在一个新建的小项目上尝试只用 Tailwind 开发。经过一个多月,我觉得可以总结一下使用 Tailwind 的经验。 优点 避免命名 编写样式时,我首先会在纸上画…
avatar
计算机天才
Windows ExCreateCallback多驱动间通信
//sender #include <ntifs.h> #define CALLBACKNAME L"\\Callback\\driverStart" VOID UnloadDriver(PDRIVER_OBJECT driver); VOID MyThread(PVOID context); BOOLEAN gbSuccess = 0; //线程句柄 HANDLE ghThread = NULL; //回调指针 PCALLBACK_OBJECT gpObjCallback = NULL; KEVENT gEvent; extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING registry) { UNREFERENCED_PARAMETER(registry); NTSTATUS status; OBJECT_ATTRIBUTES objAttri; driver->DriverUnload = UnloadDriver; //初始化通知事件 KeInitializeEvent(&gEvent, SynchronizationEvent, FALSE); UNICODE_STRING uniCallbackName = RTL_CONSTANT_STRING(CALLBACKNAME); //这里必须指定OBJ_PERMANENT属性,否则会失败 InitializeObjectAttributes(&objAttri, &uniCallbackName, OBJ_CASE_INSENSITIVE | OBJ_PERMANENT, NULL, NULL…
avatar
计算机天才
std::for_each代替std::find
这代码是当初写的错误代码 留下来只是记录for_each的用法 std::for_each(kExcludeDir.begin(), kExcludeDir.end(), [&](const std::wstring& dir) { // 命中排除名录 if (findStringIC(file_full_path, dir)) { Exclude = true; return true; } else return false; }); C++20之后写法
avatar
计算机天才
C++ 读取文件到vector
inline bool open_binary_file(const std::string& file, std::vector<uint8_t>& data) { std::ifstream fstr(file, std::ios::binary); if (!fstr.is_open()) return false; fstr.unsetf(std::ios::skipws); fstr.seekg(0, std::ios::end); const auto file_size = fstr.tellg(); fstr.seekg(NULL, std::ios::beg); data.reserve(static_cast<uint32_t>(file_size)); data.insert(data.begin(), std::istream_iterator<uint8_t>(fstr), std::istream_iterator<uint8_t>()); return true; }
avatar
计算机天才
RtlInitUnicodeString实现
VOID RtlInitUnicodeString( OUT PUNICODE_STRING DestinationString, IN PCWSTR SourceString OPTIONAL //一般是常量字符串 ) { ULONG Length; DestinationString->Buffer = (PWSTR)SourceString; if (ARGUMENT_PRESENT( SourceString )) { // 不包含空字符的字节数 Length = wcslen( SourceString ) * sizeof( WCHAR ); DestinationString->Length = (USHORT)Length; // 上面的字节数+2 DestinationString->MaximumLength = (USHORT)(Length + sizeof(UNICODE_NULL)); } else { DestinationString->MaximumLength = 0; DestinationString->Length = 0; } }
avatar
计算机天才
windows内核驱动开发实用函数
//https://git.back.engineering/_xeroxz/kutils/src/branch/main/kutils.hpp /* * HEADER ONLY KERNEL UTIL LIBRARY - NO IMPORTS - NO STRINGS */ #pragma once #include <intrin.h> #include <ntifs.h> using u64 = unsigned long long; using u32 = unsigned long; using u16 = unsigned short; using u8 = unsigned char; namespace hashstr { template <unsigned... pack> struct idx_list_t {}; template <typename idx_list_t, unsigned right> struct append_t; template <unsigned... left, unsigned right> struct append_t<idx_list_t<left...>, right> { typedef idx_list_t&lt…
avatar
计算机天才
minifilter InstanceSetup函数测试
#include"minifilter.h" namespace minifilter { // minifilter加载的时候会给每个卷都挂载上 NTSTATUS InstanceSetup(_In_ PCFLT_RELATED_OBJECTS FltObjects, _In_ FLT_INSTANCE_SETUP_FLAGS Flags, _In_ DEVICE_TYPE VolumeDeviceType, _In_ FLT_FILESYSTEM_TYPE VolumeFilesystemType) { PAGED_CODE(); NTSTATUS Status; ULONG SizeOfBuffer; // https://github.com/189569400/adversary_emulation_library/blob/997419bb0b8cd61ba69086a35a91a3d073d41d05/wizard_spider/Resources/Mimikatz/mimikatz/mimidrv/kkll_m_filters.c PFILTER_FULL_INFORMATION myFilterFullInformation; PINSTANCE_BASIC_INFORMATION myInstanceBasicInformation; dbg::print("------------------Start-----------------\n"); if (FltObjects->FileObject) dbg::print("[FltObjects->FileObject]%wZ\n", FltObjects->FileObject->FileName); else dbg::print("[FltObjects->FileObject] NULL\n"); UNICODE…
avatar
计算机天才
WUDFPlatform.dll中检测内核调试器函数实现
__int64 __fastcall _WudfIsKernelDebuggerPresent() { unsigned int v0; // ebx char SystemInformation; // [rsp+30h] [rbp+8h] BYREF char v3; // [rsp+31h] [rbp+9h] v0 = 0; if ( NtQuerySystemInformation(SystemKernelDebuggerInformation, &SystemInformation, 2u, 0i64) >= 0 && SystemInformation == 1 && !v3 ) { return 1; } return v0; }
avatar
计算机天才
Zydis反汇编引擎v4版本测试代码
这版本直接以.h .c文件提供,可以直接加入工程,方便了不少 ZydisDisassembledInstruction insn; ZydisDisassembleIntel(ZYDIS_MACHINE_MODE_LONG_COMPAT_32, (ZyanU64)ip, ip, 15, &insn); ZyanU64 ResultAddress; if (insn.info.mnemonic == ZYDIS_MNEMONIC_CALL) { ZydisCalcAbsoluteAddress(&insn.info, insn.operands, (ZyanU64)ip, &ResultAddress); TraceFile << hex << "ip : ResultAddress " << ip << "\t" << ResultAddress << endl; if (ResultAddress > NtdllModule->start_ && ResultAddress < NtdllModule->end_) { auto it = kSymbolInfo[NtdllModuleIndex].begin(); it = kSymbolInfo[NtdllModuleIndex].find(ResultAddress); if (it != kSymbolInfo[NtdllModuleIndex…
avatar
计算机天才
python unicorn引擎模拟执行部分代码
import unicorn import pefile import capstone # 要分析的样本路径 sample_file_path = 'C:\\Users\\asdf\\Desktop\\a9542676ee9a25c64a9fec1466664511f6059b51d8192025f95855b02ffe9620\\' \ 'a9542676ee9a25c64a9fec1466664511f6059b51d8192025f95855b02ffe9620.malware' # 初始化unicorn uc = unicorn.Uc(unicorn.UC_ARCH_X86, unicorn.UC_MODE_32) # 初始化pe pe = pefile.PE(sample_file_path) address = 0x400000 # 32位PE文件起始地址 stack = 0x2000 # 初始rsp或者esp可以设置为0x10000 analyse_address = 0x422154 # 要分析的起始地址 analyse_address_end = 0x42219E # 尾地址 assert(pe.OPTIONAL_HEADER.ImageBase == address) uc.mem_map(address, 1024*1024*10) # 10MB uc.mem_map…
avatar
计算机天才
测量 win api和c++标准库的字符集转换性能 (win的API性能好一倍多)
#include <benchmark/benchmark.h> #include <iostream> #include <codecvt> #include <windows.h> #pragma comment(lib,"Shlwapi.lib") wchar_t *Curl_convert_UTF8_to_wchar(const char *str_utf8) { wchar_t *str_w = NULL; if (str_utf8) { int str_w_len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str_utf8, -1, NULL, 0); if (str_w_len > 0) { str_w = (wchar_t*)malloc(str_w_len * sizeof(wchar_t)); if (str_w) { if (MultiByteToWideChar(CP_UTF8, 0, str_utf8, -1, str_w, str_w_len) == 0) { free(str_w…
avatar
计算机天才
Rust 函数模板使用例子
最基本的模板语法 fn template_fn<F>(mut num: F) -> F{ num } fn main() { println!("{}",template_fn(2)); println!("{}",template_fn(2.0)); println!("{}",template_fn("123")); println!("{}",template_fn(std::string::String::from("456"))); } 稍微加点操作 fn template_fn<F:std::ops::Add<Output=F> + std::convert::From<i32> >(mut num: F) -> F{ num = num + 2.into(); num } fn main() { println!("{}",template_fn(2)); println!("{}",template_fn(2.0)); }
avatar
计算机天才
Cloud Studio中安装Rust开发环境
主要记录一下rust-analyzer这个插件的安装使用,rust基本的工具链安装不是问题,随便一查都有。 直接在vscode的插件栏搜索rust-annalyzer然后安装是不行的。我的建议是到https://github.com/rust-lang/rust-analyzer/releases ,直接下载.vsix的release,然后vscode手动安装。 然后这个插件有时候无法正常使用的问题,一般出现在cargo.toml与.vscode文件夹不是同一路径。如下图所示。 此时如果cargo new rust_test, 此时这个cargo.toml的路径是/root/rust_test/Cargo.toml…
avatar
计算机天才
c++ std::chrono库的使用
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <chrono> #include <windows.h> using namespace std; int main(int ac, char* av[]) { auto start = chrono::steady_clock::now(); for (int i = 0; i < 100;i++) { string s("1234567"); } auto end = chrono::steady_clock::now(); chrono::duration<double> spend = end - start; // 计算间隔时间 cout << spend.count() << endl; // 输出当前时间 auto time = chrono::system_clock::to_time_t(chrono::system_clock::now()); cout << ctime(&time) << endl; return 0; }