• Куда свитчнуться из автоматизации, если понял что я не вытяну программирование и иже с ним более высокого уровня?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Свичнуться можно куда угодно. Главное, чтобы вам нравилось.

    что то совсем новое, более связаное с креативом чем с хард скиллами

    Ну если потянуло на творчество, то UX / UI дизайн неплохая, интересная и прибыльная область.

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

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

    Можно еще попробовать себя в роли android разработчика. Не знаю насколько актуально это для вас.
    Ответ написан
    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 комментария
  • Объясните что такое полиморфизм простыми словами ?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Да ладно, парни. Ну хватит уже, к чему такие сложности? Берём и читаем. Вообще совсем не обязательно читать про архитектуру и абстракции именно по своему языку, хотя javascript в этом плане родился уродом.

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

    Собственно, представим себе рядом стакан, кружку, чайник, кофемашину, велосипед и скейт. Что между ними всеми общего? Ну как минимум то, что они есть. То есть это - объекты, которые были созданы. Но как они были созданы? Скорее всего на заводе производителя по чертежам. Ок, чертежём назовём конструктор. Ну а класс? А что это такое? А его нет в нашей вселенной - эта сущность есть абстракция, что живёт лишь в наших мыслях. В реальном мире её нет и никогда не будет, такова уж физика - ей по барабану, что птицы и млекопитающие имеют дальних родственников - она лишь обеспечивает возможность естесственного отбора. А уж родственников друг другу находим мы, люди.

    С объектами и классами разобрались, а что же там с нашими стаканами и велосипедами. Мы уже поняли, что всё это объект, то есть грубо можно все объекты наследовать от какого-нибудь суперпредка, суперкласса, что и реализовано в некоторых языках. Но что другого общего между скейтом и стаканом, например? Конечно, можно углубляться и считать, что они все из молекул, и они все из твёрдых веществ. Однако это всё бред и СПГС, так что ответ прост - да ничего. То есть это совершенно разные объекты с совершенно разным функционалом. Более того - естесственно компьютерные модели и иерархии будут сильно отличатся от физик и химий. И это нормально, вопрос об адекватностях моделей ставиться лишь когда модель неадекватна, а до тех пор пилить можно что угодно, лишь бы работало.

    Вот. У нас есть супер-предок Object, от которого дефолтно наследуются все объекты. Допустим, то что объекты состоят из атомов и есть то, что наследуют все объекты. Но все дополнения и правки - полиморфизм. Так, из атомов мы слепили колёса и приделали на доску - ок, это скейт. На него можно встать и катиться, а сильно извернувшись и полетать в трёх метрах над землёй, прямо таки излучая своё яркое эго. В то время как стакан - это мы слепили из атомов плотную ёмкость, из которой вода не выливается под действием силы тяжести. И прямое применение стакана - налив воды опрокинуть его над ртом, чтобы вода вытекла прямо в желудок. Так делают настоящие пацаны, не заботясь об икоте или страхе утонуть, так что вот - полиморфизм.

    Однако что с остальным? У нас ещё абстракция, инкапсуляция и наследование. Ок, начнём с наследования, так оно наиболее близко. Вот что у нас общего между стаканом и кружкой? Ну в оба можно налить воду, но у кружки есть ручка чтобы держаться. То есть можно придумать некий общий класс - ёмкость. Однако что это за класс? Можно например за этот класс взять стакан, тогда все ёмкости по дефолту стаканы, а всё остальное - видоизменённые стаканы. Но кому-то больше нравяться кувшины, например некоторые чики насят их на голове, считая что это удобно. Ну и пусть носят, но как-то же решить надо, что главнее и идеальнее. Так вот - недостяжимый идеал и есть главный - это называется абстрактный класс. То есть ёмкость, что невозможно создать, для которого нет полного чертежа. А все чертежи, что дополнили до полного - есть наследованные классы от класса ёмкость.

    Тут мы подошли к абстракции. Вот такое иерархическое наследование приводит нас к, возможно главной, идее ООП. Вот мы взяли и выделили всё, куда можно налить воду в отдельный класс, нарисовали общий чертёж, но специально не доделали его, оставив зазор для будущих творцов, и назвали чертёж - ёмкость. Тысячи лет изобретатили всех миров создают свои ёмкости, одна лучше другой. Для разных людей - по разному, конечно. Но каждый раз группировать молекулы стекла определённым образом - непростая задача. Поэтому ремесленники пошли на хитрость, они создали тайный совет ремесленников мира и решили делиться друг с другом своими наработками. То есть создавать мелкие чертежи и объявлять классом, например, извлистой ручки в форме ленты Мёбиуса, например. Возможно такая ручка удобно только инопланетным существам, но чертёж создан и к нему можно ссылаться при создании своего чертежа. Таким образом мы абстрагируемся от низкоуровневой задачи "формирования ёмкостей посредством перемещения молекул" к "конструированию ёмкости посредством совмещения деталей, элементов". Это и есть абстракция.

    Но мы подошли к последнему пункту - инкапсуляция. Она неразрывна с абстракцией, и по сути благодаря ей она и работает. Инкапсуляция - это своеборазный клей (или синяя изолента), которым склеивают разные чертежи в один. То есть совмещение деталей для создания своей - это и есть инкапсуляция. Причём при совмещении мы можем не описывать детали этого совмещения (то есть члены класса могут быть приватными), таким образом помогая абстрагироваться тем, кто этот чертёж использует. Вот посмотрим на чайник - что это такое? Это стакан (или кружка) к которому снизу (а может внутри по середине?) приклеен нагревательный элемент. Пустив по нему ток, согласно инкапсулированному в нагревательный элемент закону Ома, будет выделяться тепло и нагреваться вода. А кофемашина? Это куда более сложное устройство, с множеством насосов, ёмкостей, шлюзов, измельчителей и чайников. И всё склееное клеем. А может синей изолентой. Это снова инкапсуляция.

    Таким образом, абстракция невозможна без инкапсуляции и наследовании, как невозможен полиморфизм без, собственно, наследования. Ну а полиморфизм невозможен ещё и без инкапсуляции, которая банально бесполезна без наследования и полиморфизма. Вот такие тут треугольники с пирогами. Жаль только про пирог наврали. И про день рожденье.
    Ответ написан
    3 комментария