Обновить

Dcnfk yt c njq yjub& Yt ,tlf! :vb СфзыДщсл и не придётся перепечатывать текст заново.

Ставим AutoHotKey - фреймворк для клавиатурных утилит. Потом пишем скрипт ruen.ahk:

#Requires AutoHotkey v2.0
#SingleInstance Force

; пробегаемся по всем клавишам, удаляем одинаковые в разных раскладках, экраниуем через `
en := "QWERTYUIOP{}|ASDFGHJKL:`"ZXCVBNM<>?~@#$^&qwertyuiop[]asdfghjkl;'zxcvbnm,./``"
ru := "ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё`"№;:?йцукенгшщзхъфывапролджэячсмитьбю.ё"

; собираем карты переключения в обе стороны
en2ru := Map()
for ch in StrSplit(en)
    en2ru[ ch ] := SubStr( ru, A_Index, 1 )
ru2en := Map()
for ch in StrSplit(ru)
    ru2en[ ch ] := SubStr( en, A_Index, 1 )

; общий код для всех хоткеев
Correct() {
    
    backup := ClipboardAll() ; сохраняем буфер, потом восстановим
    
    A_Clipboard := "" ; чистим буфер
    Send "#{Space}^c" ; Жмём Win+Space и Ctrl+C
    ClipWait 0.5 ; дожидаемся копирования в буфер
    
    if A_Clipboard { ; буфер не пустой
        
        result := ""
        mode := "en" ; по дефолту переводим в английский
        
        Loop Parse A_Clipboard { ; для каждого символа из буфера
            
            ; ищем варианты переключений для текущего симовола
            ru := en2ru.Get( A_LoopField, "" )
            en := ru2en.Get( A_LoopField, "" )
            
            if en && ru { ; возможны оба варианта - выбираем прошлый
                result .= mode = "en" ? en : ru
            } else if en {
                result .= en
                mode := "en"
            } else if ru {
                result .= ru
                mode := "ru"
            } else { ; оставляем как есть
                result .= A_LoopField
            }
            
        }
        
        A_Clipboard := result ; пишем в буфер
        Send "^v" ; жмём Ctrl+V
        Sleep 100 ; ждём пока данные заберут
        
    }
    
    A_Clipboard := backup ; восстанавливаем буфер
    
}

; CapsLock - хоткей коррекци выделения
CapsLock:: {
    Correct()
}

; Shift + CapsLock - хоткей коррекции последнего слова
+CapsLock:: {
    Send "^+{Left}" ; Жмём Ctrl+Shift+Left
    Correct()
}

; Ctrl + CapsLock - хоткей коррекции до конца строки
^CapsLock:: {
    Send "+{End}" ; Жмём Shift+End
    Correct()
}

; Ctrl + Shift + CapsLock - хоткей коррекции с начала строки
^+CapsLock:: {
    Send "+{Home}" ; Жмём Shift+Home
    Correct()
}

Даблкликаем по нему, и получаем:

  • переключение раскладки выделенного текста по CapsLock

  • последнего слова - по Shift + CapsLock

  • до конца строки - по Ctrl + CapsLock

  • от начала строки - по Ctrl + Shift + CapsLock

При желании его можно скомпилировать в exe-шник. Интерфейс самого AHK так и сделан.

Из уникальных фичей: переключает одновременно и раскладку введённого текста, и текущую раскладку клавиатуры.

Известные альтернативы:

  • Punto Switcher - 100 метровый звездолёт против 12 у AHK. Автопереключение часто не к месту, а горячую клавишу Break пойди найти на ноуте. Про интеграцию вашего буфра обмена с сервисами Яндекса я даже не заикаюсь.

  • Caramba Switcher - 60 метров и никаких настроек. Переключения по шифту - тот ещё глюкодром, с которым борятся через самообучение.

  • Mahou - поди найти клавиши Scroll и Pause.

  • Остальные лень ковырять - расскажите в комментах кому не влом.

Теги:
Всего голосов 8: ↑8 и ↓0+8
Комментарии2

Как мы запустили Qwen3.8–27B целиком на RTX 5060 8 GB и получили ~30 токенов/с

Наш проект называется ExVRAM Lab. Это открытая исследовательская лаборатория, в которой мы проверяем, насколько большие локальные LLM можно запускать на обычных видеокартах с ограниченным объёмом VRAM, если использовать ultra‑low‑bit quantization, полное размещение весов на GPU и существующие open‑source inference‑технологии.

ExVRAM расшифровывается как Exchange Compute for VRAM. Основная идея проекта — в ряде сценариев выгоднее потратить часть свободной вычислительной мощности GPU на работу с более компактным представлением весов, чем хранить часть модели в оперативной памяти и постоянно передавать данные через PCIe.

Когда мы начинали проект, исходный вопрос был достаточно простой: можно ли запустить dense‑модель примерно на 27 миллиардов параметров на видеокарте всего с 8 ГБ VRAM так, чтобы она не просто «запустилась», а работала полностью на GPU, поддерживала длинный контекст и обеспечивала нормальную интерактивную скорость генерации.

В качестве основной тестовой системы мы используем NVIDIA GeForce RTX 5060 8 GB на архитектуре Blackwell. Основная модель в текущих экспериментах — Qwen3.8–27B.

Сначала результат выглядел не слишком впечатляюще. Модель запускалась, но значительная часть весов оставалась в системной памяти. Около 5,7 GiB весов находилось на GPU, ещё примерно 2,5 GiB — на CPU. Скорость генерации составляла порядка 3,8–5,5 токена в секунду.

При этом сама видеокарта была загружена далеко не полностью.

Это стало одним из первых важных наблюдений проекта. Проблема заключалась не столько в нехватке вычислительной мощности RTX 5060, сколько в том, что часть decoder weights находилась в RAM. Во время autoregressive generation данные приходилось постоянно передавать между CPU и GPU через PCIe.

Как мы запустили Qwen3.8–27B целиком на RTX 5060 8 GB и получили ~30 токенов/с

Публикации