Задать вопрос
  • О чем говорят эти параметры top?

    @kbool
    Посмотрите atop, его вывод подробнее.
    Ответ написан
    Комментировать
  • Откуда взялись странные разноцветные значки в браузере?

    @Fixid
    Это unicode символы которые автоматически заменяются внутри браузера на картинки
    ✌✌✌✳️✳️✳️
    emojipedia.org/victory-hand
    emojipedia.org/eight-spoked-asterisk
    Ответ написан
    9 комментариев
  • Как автоматизировать установку программ на баше?

    Zoro
    @Zoro
    Не обязательно писать несколько apt-get install, достаточно одного, хотя если вам так удобнее....
    Ответ написан
    Комментировать
  • Как восстановить windows 7 из образа на новый винчестер?

    @AtaZ
    кто знает, тот поймет
    Огорчу, но уже восстановить скорей не получится. Это поломанная технология и мелкософт от неё отказался. Из моих опытов ни один раз таким образом что-то восстановить не удалось. Там такая фишка, что это работает только при восстановлении на саму себя с самой себя, но никак на новое место, вероятно это связано с глюками/багами/хитростями лицензирования.
    Ответ написан
    1 комментарий
  • Какую субд выбрать для больших объемов данных (десятки гигабайт - сотня гигабайт)?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    postgers добавлена быстрая поддержка изменения таблиц + нету проблем таких как в mysql
    удаляешь данные а файлик бд не схлопывается...

    ну а так решаю таким способом
    создаем таблицу
    create table new_post like post;
    добавляем новые поля ( сразу создаем индексы (потом это будет не реально) )
    далее выставляем авто инкремент с запасом на 100к+ выше.
    далее делаем скрипт копирования
    $limit = 10000;
            $count = 0;
            $lastId = 1;  // последний id можно менять ручками ( если скрипт зависнит)
            $endId = 70170509;  // максимальный ид в таблице, докуда копируем
    
    $sqlTemplate = "insert into new_post ( select id, user_id, text)
    from post where id > :lastId: and id < {$endId} order by id ASC limit {$limit})";
    
      $sql = str_replace(':lastId:', $lastId, $sqlTemplate);
            while ($res = $connection->createCommand($sql)->execute()) {
                $lastId = $connection->createCommand('SELECT id FROM new_post ORDER BY id DESC limit 1')->queryScalar();  // получаем ласт запись в новой таблице
    
                $count += $limit;
    
                file_put_contents($file,
                    "processed " . number_format($count, 0, '.', ' ') . " rows\nlast id " . $lastId . "\n\n", FILE_APPEND);
    
                $sql = str_replace(':lastId:', $lastId, $sqlTemplate);
            }
            file_put_contents($file, "--done---\n\n", FILE_APPEND);


    далее делаем меняем названия таблицы это операция быстрая.
    30 гигов перегоняет за 20 минут.
    смотрим разницу и до копируем оставшиеся

    это аля аналог инструмента из percona-tool только не тормозит))

    UPD
    Запускаем скрипт из консоли, лучше всего вызвать
    `screen` и сделать это фоново на случаи того если терминал зависит или интерент упадет.

    Выбирайте БД под задачу у меня таблица была 120гигов статистики я выбрал аналитическую БД и бед не знаю.
    Ответ написан
    5 комментариев
  • Как устроена архитектура современного front-end приложения?

    @timda
    asp.net веб-разработчик
    Так сразу не ответишь. Почитайте Интернет, много всего. ITDVN на ютубе посмотреть можно. На хабре много интересных статей. Например, свежий, "легкий" пост https://habrahabr.ru/post/321844/

    По сути архитектура не менялась с появления скриптов в браузере. Три уровня операций в архитектуре:
    1) Верстка. Раньше были таблицы, потом стали дивы. Все писали свои библиотеки. Затем библиотеки стали выкладывать в общий доступ - появились CSS-фреймворки Bootstrap, Foundation и так далее. Стало слышно о предпроцессорах CSS - less, sass. В 2014 году Гугол выпустил свой подход к дизайну Material Design. На базе него есть масса CSS-фреймворков. Сейчас переходим на флексы, приятная вещь.
    1.2) Лет пять назад начался бум мобильного трафика со смартфонов. Поэтому появились медиа-запросы и адаптивная верстка. Я сам года полтора назад взял ксиаоми 5.5 дюймов - первое время в деревне балдел :) Важный элемент.
    2) DOM. Операции по работе с DOM. Парсинг HTML дерева. Раньше писали большие библиотеки для разных браузеров (в основном на Javascript). Модно было менять картинки в меню по наводке мыши. Потом появился jQuery, он во многом снял вопросы о кросс-браузерности. Сейчас это все переросло в JS-фреймворки. Самые популярные, насколько понимаю - Angular, React. Их много.
    3) Запросы на сервер. Когда то давно это называлось XmlHttpRequest в виде COM-объекта в IE. Потом модное слово Web 2.0. Далее - мода на Ajax. Потом появился jQuery - это правда очень хороший и качественный продукт. И опять же JS-фреймворки.
    ---
    Эти операции за последние лет 15 обросли кучей терминов и технологий. Каждый считает, что он сможет написать лучше - и делает свою систему, технологию, подход, фреймворк и так далее. Не говорю, что это плохо - может и хорошо, но бардак аццкий.

    И в серверных технологиях много нового, хотя гиганты вроде Явы, Майкрософта, Оракла - удержались. Вокруг конечно создали много всего, но ИМХО - как был PHP и ASP в Интернете, так и остались. Хотя, такие штуки как REDIS весьма полезны :)

    ЗЫ: я лично смотрю в сторону Angular 2 или React (скорее всего буду пробовать обоих) и Bootstrap 4 с флексами. Если бутстрап до апреля не забЭтится - выкину и напишу свои небольшие библиотеки, мне много не надо :) Хотя мне пока что и на ASP.NET Forms и ASP.NET MVC неплохо живется, ну jQuery конечно, Yandex MAP API, бустрапа в меру. Но у всех свои мнения :)
    Ответ написан
    2 комментария
  • Как устроена архитектура современного front-end приложения?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. Логика работы SPA - грузится сразу на клиент при первом обращении.
    2. По событиям (читай "кликам") - подгружается только разметка блоков и/или JSON-данные по ajax (или данные непрерывно поступают через websocket).
    3. Если функционал страницы специфический (сильно отличается от обычных): то также загружаются дополнительные JS-модули через AJAX.

    Обычно используется 3 основных составляющих:
    1. Роутер - передача управления нужному модулю на основе URI-строки.
    2. Application - код основного приложения
    3. Шаблонизатор - для вставки полученных через AJAX значений в разметку.

    Для подгрузки блоков через AJAX: https://github.com/xmoonlight/includeHTML
    Для шаблонизации данных: https://sitecoder.blogspot.ru/2017/01/rex-tiny-tem...
    Ответ написан
    4 комментария
  • Как теперь получить ссылку на mp3 при парсинге vk.com (Вконтакте)?

    @ImIeee
    Обновление.
    Выложил все файлы на Github — алгоритм шифровки, расшифровки, пример использования токена. Здесь будет только последняя версия кода расшифровки на PHP, в соответствии с вопросом.
    Обновление 2.
    Создал репозиторий с кодом получение токена VK, подходящего для Audio API, по GMS ID и GMS токену.
    Обновление 23.11.17
    Теперь адрес аудиозаписи, похоже, привязан к идентификатору пользователя ВКонтакте. Нужно указать его в коде.
    <?php
    
    define('VK_ID', ID_пользователя_в_виде_числа);
    
    function decode($str){
      $vals = explode("#", explode("?extra=", $str)[1]);
      $tstr = vk_o($vals[0]);
      $ops = vk_o($vals[1]);
      $ops_arr = explode(chr(9), $ops);
      $len = sizeof($ops_arr);
      for($i = $len - 1; $i >= 0; $i--){
        $args_arr = explode(chr(11), $ops_arr[$i]);
        $op_ind = array_shift($args_arr);
        switch($op_ind){
          case "v": $tstr = vk_v($tstr); break;
          case "r": $tstr = vk_r($tstr, $args_arr[0]); break;
          case "x": $tstr = vk_x($tstr, $args_arr[0]); break;
          case "s": $tstr = vk_s($tstr, $args_arr[0]); break;
          case "i": $tstr = vk_i($tstr, $args_arr[0]); break;
        }
      }
      return $tstr;
    }
    
    $vk_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN0PQRSTUVWXYZO123456789+/=";
    
    function vk_o($str){
      global $vk_str;
      $len = strlen($str);
      $result = "";
      for($s = 0, $index2 = 0; $s < $len; $s++){
        $sym_index = strpos($vk_str, $str[$s]);
        if($sym_index !== false){
          $i = (($index2 % 4) !== 0) ? ( ($i<<6) + $sym_index) : $sym_index;
          if(($index2%4) != 0){
            $index2++;
            $shift = -2 * $index2 & 6;
            $result .= chr(0xFF & ($i >> $shift));
          } else {
            $index2++;
          }
        }
      }
      return $result;
    }
    
    function vk_s($str, $start){
      $len = strlen($str);
      if($len > 0){
        $cur = abs($start);
        $shuffle_pos = array();
        for($i = $len - 1; $i >= 0; $i--){
          $cur = (($len * ($i + 1)) ^ $cur + $i) % $len;
          $shuffle_pos[$i] = $cur;
        }
        for($i = 1; $i < $len; $i++){
          $offset = $shuffle_pos[$len - $i - 1];
          $prev = $str[$i];
          $str[$i] = $str[$offset];
          $str[$offset] = $prev;
        }
      }
      return $str;
    }
    
    function vk_i($str, $i){
      return vk_s($str, $i ^ (int) VK_ID);
    }
    
    function vk_v($str){
      return strrev($str);
    }
    
    function vk_r($str, $i){
      global $vk_str;
      $vk_str2 = $vk_str . $vk_str;
      $vk_str2_len = strlen($vk_str2);
      $len = strlen($str);
      $result = "";
      for($s = 0; $s < $len; $s++){
        $index = strpos($vk_str2, $str[$s]);
        if($index !== false){
          $offset = ($index - $i);
          if($offset < 0){
            $offset += $vk_str2_len;
          }
          $result .= $vk_str2[$offset];
        } else {
          $result .= $str[$s];
        }
      }
      return $result;
    }
    
    function vk_x($str, $i){
      $xor_val = ord($i[0]);
      $str_len = strlen($str);
      $result = "";
      for($i = 0; $i < $str_len; $i++){
        $result .= chr(ord($str[$i]) ^ $xor_val);
      }
      return $result;
    }
    
    echo decode($argv[1]);
    ?>
    Ответ написан
    93 комментария
  • Как заставить работать хуки в git?

    orlov0562
    @orlov0562
    I'm cool!
    убедись что хук отрабатывает, добавь в самое начало, что-то вроде touch /tmp/1.txt, если работает, тогда логируй выполнение каждой команды и смотри что идет не так и где именно проблема.
    Ответ написан
    3 комментария
  • Все ли в порядке с SSD?

    Jump
    @Jump Куратор тега Твердотельные накопители
    Системный администратор со стажем.
    Все ли в порядке с SSD?
    Да.

    Сделал smart ssd диска на сервере, подскажите, долго будет работать?
    Ну долгую работу предсказать трудно - мало ли что может случится, сегодня он работает, а завтра его кто нибудь уронит вместе с сервером на бетонный пол, и он уже работать не будет.

    Но никаких тревожных признаков нет. SMART проходит, все параметры в прекрасном состоянии. Диск практически новый.
    Год он у вас уже отработал, если будете эксплуатировать и дальше в таком же режиме он еще не меньше двадцати лет протянет. Хотя думаю лет через пять вам его придется менять - он морально устареет, и вам станет стыдно такое старье держать на сервере :)
    Ответ написан
    Комментировать
  • Как парсить тексты песен с сайта Вконтакте vk.com без использования api на php не используя phantomjs и подобное?

    Sanasol
    @Sanasol Куратор тега PHP
    нельзя просто так взять и загуглить ошибку
    Первый запрос на al_audio возвращает все необходимые данные для запроса лирики, ищите лучше.

    Как парсить тексты песен с сайта Вконтакте vk.com без использования api на php не используя phantomjs и подобное?

    Да и вообще так чтоб интернетом не пользоваться xD

    Почему бы не спарсить тексты с какой-нибудь базы текстов? Зачем так извращаться с ВК?
    Может где-то даже АПИ есть.

    Почему API VK не подходит? Так и поиск музыки и получение текстов.
    Ответ написан
  • Существует ли "карта программиста"? Что и за чем учить?

    iCoderXXI
    @iCoderXXI
    React.JS/FrontEnd engineer
    Нет одинаково эффективного пути для всех и каждого.

    Я учился на конкретных задачах. Обучение практически всегда начиналось с состояния хочу сделать вот это (четко осознаваемый конечный результат), но вообще понятия не имею как это делать, и даже с какой стороны подойти и за что хвататься...

    Тут главное - настолько сильно хотеть достичь результата, чтобы любые препятствия только добавляли азарта. Чтобы ночами спать не мог и думал о задаче. Это ключевой момент обучения. Все остальное - декорации, способы, инструменты...

    Второй этап - осознание, что слона целиком заглотить невозможно в принципе, придется делить на части, т.е. декомпозиция. Причем задачу делить нужно неоднократно, до тех пор, пока решение конкретного участка задачи не начнет укладываться в пару страниц кода - модуль.

    Каждый модуль запиливаешь и тестируешь до умопомрачения, пока он не станет идеальным. Тут мнения могут расходиться, но я считаю на этапе обучения необходимо выработать рефлексы, иначе в дальнейшем говнокод неизбежен.

    Далее из модулей, как из кубиков лего пытаешься собрать функциональные блоки. Тут важно понимать, что чем более автономные модули и блоки у тебя получаются, тем лучше, особенно для целей тестирования. Если ты забиваешь болт на тестирование, то тебе нечего делать в разработке.

    На первых порах, тестирование будет занимать до 99% времени и сил. Заодно подтягивается синтаксис используемых языков (вообще не важно каких), вырабатывается внимательность, концентрация, тренируется память и пр.

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

    С этим не рождаются, это выкристаллизовывается за сотни и тысячи часов жесткого баттхерта от неспособности найти, где ты забыл поставить запятую... Когда код из 10 строк прочитан сотни раз вдоль, поперек и наискосок...

    Только так, только жесткий хардкор! Если ты не прошел эту фазу, то ты либо родился гением, либо тебе нечего делать в профессии... Это как детские болезни - ими нужно переболеть в детстве.

    Обрати внимание, самое главное качество во всем этом многабукафф - упорство на грани фантастики. Любой, кто не дойдет до конца, не треснет себя по лбу в соты раз с воплем, так вот же она где, эта запятая, пропущена - сломается в самый неподходящий момент на боевом проекте...

    А какими инструментами ты решаешь задачу - дело десятое и в каждом проекте, число которым миллионы, будет свой набор блэкджека с барышнями, так-что загодя готовиться особо смысла нет. Нужно хорошо владеть азами, а остальное осваивать на лету.

    Ах да, обложись справочниками по любому инструменту и научись быстро вникать и подхватывать необходимый минимум. Обычно достаточно на 20% владеть инструментом, чтобы решать 80% задач.

    В любом случае я за критерий истины держу платежеспособный спрос.
    Ответ написан
    3 комментария
  • Как залить mysql бекап большой таблицы?

    @Tabletko
    никого не трогаю, починяю примус
    Делаете tmux. Далее запускаете свою команду. Далее ctrl+b, d. И закрываете putty.
    Ответ написан
    4 комментария
  • Как подружить git и denwer?

    @DenJel
    создайте файл .gitignore в корне, напишите там правило: игнорить все, кроме www. Что-то типо:
    **
    !www


    Гуглите glob gitignore
    Ответ написан
    1 комментарий
  • Как сделать резервную копию большой БД mysql с таблицами innodb (85ГБ), если места на диске осталось 7ГБ?

    mxms
    @mxms
    IT voodoo
    Как-то так можно попробовать.
    mysqldump -uname -ppass db | ssh -C user@host 'cat > /path/db.sql'

    Или вариант с компрессией, чтоб сэкономить трафик и дисковое пространство в месте назначения.
    mysqldump -uname -ppass db | gzip -c | ssh login@host 'cat > /path/db.gz'


    UPD. Вариант с FTP (требует наличия набора утилит ncftp).
    mysqldump -uname -ppass db | gzip -c | ncftpput -u login -p pass -c host /db.gz
    Ответ написан
    3 комментария
  • Как сделать резервную копию большой БД mysql с таблицами innodb (85ГБ), если места на диске осталось 7ГБ?

    kiberspy
    @kiberspy
    "Господа - вы звери, господа!" (с) "Жестокий романс"
    Лить куда-то в realtime бекап с сервера БД на другой хост - это извращение высочайшего уровня! (...и балансирует на грани нищебродства)
    Либо уж если так делаете - нужно будет добавлять проверку на то, что бекап валидный (типо пробовать после создания развернуть из бекапа базу...)
    Простой пример: в момент создания бекапа кратковременно пропадает сетевой коннект (а возможно и многократно... величина исчезновения связи между хостами - от нескольких миллисекунд до 1-3 секунд...). Есть вероятность, что программа бекапирования не успеет "среагировать" на такие коллизии и по завершению процесса выдаст что бекап успешно создан! Хотя такую бекап-копию - сразу на помойку...
    Ибо уже кровью не одного поколения админов выписан разумный алгоритм: создаётся "локальная" бекап-копия и потом выливается уже на необходимый хост... При нынешних ценах на SATA-винты (десяток на ведро!) - разумнее купить и поставить самый дешёвый SATA-винт, чем заниматься извращениями, ИМХО...
    Ответ написан
    Комментировать
  • Как сделать резервную копию большой БД mysql с таблицами innodb (85ГБ), если места на диске осталось 7ГБ?

    Ernillew
    @Ernillew
    Администрирую *nix-системы с 1997 года
    Провешиваете на свой локальный комп порт 3306/tcp через ssh с сервера и обращаетесь со своей машины, как к локальному мускулю, бэкапите сразу к себе на машину.
    Ответ написан
    2 комментария
  • Как в 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 комментария