Задать вопрос
  • Как в Google Chrome убрать уведомление "отключение расширений в режиме разработчика"?

    @wOxxOm
    Батник-патчер, убирающий это принудительное предупреждение:

    1. Скопируйте код ниже и сохраните в любом текстовом редакторе как, например, DevWarningPatch.bat на рабочем столе

    2. Закройте хром вручную, чтобы не потерять незаконченное письмо, например, батник сам завершит оставшиеся спрятанные процессы хрома принудительно.

    3. Нажмите правой кнопкой мыши на сохраненном файле и запустите его от имени администратора, чтобы пропатчить все установленные версии хрома (поиск осуществляется посредством реестра или в текущей папке).

    Также можно просто перетянуть chrome.dll из папки портабельного хрома на иконку батника.

    <# :
    @echo off
    copy/b "%~f0" "%temp%\%~n0.ps1" >nul
    powershell -Version 2 -ExecutionPolicy bypass -noprofile "%temp%\%~n0.ps1" "%cd% " "%~1"
    del "%temp%\%~n0.ps1"
    pause
    exit /b
    #>
    param([string]$cwd='.', [string]$dll)
    
    function main {
        "Chrome 'developer mode extensions' warning disabler v1.0.10.20170114`n"
        $pathsDone = @{}
        if ($dll -and (gi -literal $dll)) {
            doPatch "DRAG'n'DROPPED" ((gi -literal $dll).directoryName + '\')
            exit
        }
        doPatch CURRENT ((gi -literal $cwd).fullName + '\')
        ('HKLM', 'HKCU') | %{ $hive = $_
            ('', '\Wow6432Node') | %{
                $key = "${hive}:\SOFTWARE$_\Google\Update\Clients"
                gci -ea silentlycontinue $key -r | gp | ?{ $_.CommandLine } | %{
                    $path = $_.CommandLine -replace '"(.+?\\\d+\.\d+\.\d+\.\d+\\).+', '$1'
                    doPatch REGISTRY $path
                }
            }
        }
    }
    
    function doPatch([string]$pathLabel, [string]$path) {
        if ($pathsDone[$path.toLower()]) { return }
    
        $dll = $path + "chrome.dll"
        if (!(test-path -literal $dll)) {
            return
        }
        "======================="
        "$pathLabel PATH $((gi -literal $dll).DirectoryName)"
    
        "`tREADING Chrome.dll..."
        $bytes = [IO.File]::ReadAllBytes($dll)
    
        # process PE headers
        $BC = [BitConverter]
        $coff = $BC::ToUInt32($bytes,0x3C) + 4
        $is64 = $BC::ToUInt16($bytes,$coff) -eq 0x8664
        $opthdr = $coff+20
        $codesize = $BC::ToUInt32($bytes,$opthdr+4)
        $imagebase32 = $BC::ToUInt32($bytes,$opthdr+28)
    
        # patch the flag in data section
        $data = $BC::ToString($bytes,$codesize)
        $flag = "ExtensionDeveloperModeWarning"
        $stroffs = $data.IndexOf($BC::ToString($flag[1..99]))/3 - 1
        if ($stroffs -lt 0) {
            write-host -f red "`t$flag not found"
            return
        }
        $stroffs += $codesize
        if ($bytes[$stroffs] -eq 0) {
            write-host -f darkgreen "`tALREADY PATCHED"
            return
        }
    
        $exe = join-path (split-path $path) chrome.exe
        $EA = $ErrorActionPreference
        $ErrorActionPreference = 'silentlyContinue'
        while ((get-process chrome -module | ?{ $_.FileName -eq $exe })) {
            forEach ($timeout in 15..0) {
                write-host -n -b yellow -f black `
                    "`rChrome is running and will be terminated in $timeout sec. "
                write-host -n -b yellow -f darkyellow "Press ENTER to do it now. "
                if ([console]::KeyAvailable) {
                    $key = $Host.UI.RawUI.ReadKey("AllowCtrlC,IncludeKeyDown,NoEcho")
                    if ($key.virtualKeyCode -eq 13) { break }
                    if ($key.virtualKeyCode -eq 27) { write-host; exit }
                }
                sleep 1
            }
            write-host
            get-process chrome | ?{
                $_.MainWindowHandle.toInt64() -and ($_ | gps -file).FileName -eq $exe
            } | %{
                "`tTrying to exit gracefully..."
                if ($_.CloseMainWindow()) {
                    sleep 1
                }
            }
            $killLabelShown = 0
            get-process chrome | ?{
                ($_ | gps -file | select -expand FileName) -eq $exe
            } | %{
                if (!$killLabelShown++) {
                    "`tTerminating background chrome processes..."
                }
                stop-process $_ -force
            }
            sleep -milliseconds 200
        }
        $ErrorActionPreference = $EA
    
        $bytes[$stroffs] = 0
        "`tPATCHED $flag flag"
    
        # patch the channel restriction code for stable/beta
        $code = $BC::ToString($bytes,0,$codesize)
        $rxChannel = '83-F8-(?:03-7D|02-7F)'
        # old code: cmp eax,3; jge ...
        # new code: cmp eax,2; jg ...
        $chanpos = 0
        try {
            if ($is64) {
                $pos = 0
                $rx = [regex]"$rxChannel-.{1,100}-48-8D"
                do {
                    $m = $rx.match($code,$pos)
                    if (!$m.success) { break }
                    $chanpos = $m.index/3 + 2
                    $pos = $m.index + $m.length + 1
                    $offs = $BC::ToUInt32($bytes,$pos/3+1)
                    $diff = $pos/3+5+$offs - $stroffs
                } until ($diff -ge 0 -and $diff -le 4096 -and $diff % 256 -eq 0)
                if (!$m.success) {
                    $rx = [regex]"84-C0.{18,48}($rxChannel)-.{30,60}84-C0"
                    $m = $rx.matches($code)
                    if ($m.count -ne 1) { throw }
                    $chanpos = $m[0].groups[1].index/3 + 2
                }
            } else {
                $flagOffs = [uint32]$stroffs + [uint32]$imagebase32
                $flagOffsStr = $BC::ToString($BC::GetBytes($flagOffs))
                $variants = "(?<channel>$rxChannel-.{1,100})-68-(?<flag>`$1-.{6}`$2)",
                        "68-(?<flag>`$1-.{6}`$2).{300,500}E8.{12,32}(?<channel>$rxChannel)",
                        "E8.{12,32}(?<channel>$rxChannel).{300,500}68-(?<flag>`$1-.{6}`$2)"
                forEach ($variant in $variants) {
                    $pattern = $flagOffsStr -replace '^(..)-.{6}(..)', $variant
                    "`tLooking for $($pattern -replace '\?<.+?>', '')..."
                    $minDiff = 65536
                    foreach ($m in [regex]::matches($code, $pattern)) {
                        $maybeFlagOffs = $BC::toUInt32($bytes, $m.groups['flag'].index/3)
                        $diff = [Math]::abs($maybeFlagOffs - $flagOffs)
                        if ($diff % 256 -eq 0 -and $diff -lt $minDiff) {
                            $minDiff = $diff
                            $chanpos = $m.groups['channel'].index/3 + 2
                        }
                    }
                }
                if (!$chanpos) { throw }
            }
        } catch {
            write-host -f red "`tUnable to find the channel code, try updating me"
            write-host -f red "`thttp://stackoverflow.com/a/30361260"
            return
        }
        $bytes[$chanpos] = 9
        "`tPATCHED Chrome release channel restriction"
    
        "`tWriting to a temporary dll..."
        [IO.File]::WriteAllBytes("$dll.new",$bytes)
    
        "`tBacking up the original dll..."
        move -literal $dll "$dll.bak" -force
    
        "`tRenaming the temporary dll as the original dll..."
        move -literal "$dll.new" $dll -force
    
        $pathsDone[$path.toLower()] = $true
        write-host -f green "`tDONE.`n"
        [GC]::Collect()
    }
    
    main
    Ответ написан
    24 комментария
  • Какой из существующих методов изменения яркости изображения (HTML5 Canvas) быстрее?

    Fesor
    @Fesor Автор вопроса
    Full-stack developer (Symfony, Angular)
    Короче ресерчил ресерчил... решил побаловаться со смешиванием цветов. Итог:
    jsfiddle.net/2MHPh/2
    Правда ускорение тут есть только для повышения яркости. Методов вычитания цвета нету, а что бы добиться понижения яркости сложением нужно два раза инвертировать изображение (исходник, можно инвертировать перед операциями заранее, и результат). В этом случае производительность будет явно такой же.

    jsperf.com/imagedata-manipulatioons - сравнение производительности. Каждый тест-кейс по сути представляет собой обработчик события изменения значения яркости.

    Update:
    Сделал инверсию через мод смешивания "difference".
    jsfiddle.net/sjGcA/2
    теперь это полноценная реализация. Разницу стоит смотреть на мобильных девайсах.
    Ответ написан