Русский
Русский
English
Статистика
Реклама

Лайфхак

Притворяемся что пишем на C, но только на Powershell

05.08.2020 12:20:05 | Автор: admin

Powershell удобная API построенная на .net. Powershell позволяет пользователям писать скрипты, не упираясь в программирование, при этом получая схожие результаты. Что происходит на КДВП, автор объяснит позже по тексту. Сейчас нам срочно нужно притвориться, что мы программируем на C#.

TL;DR: Postman не нужен, если есть Powershell. Но сперва нужно зайти издалека.

Делаем простой класс


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

class ClassName {     [string] Sum ($A, $B) {               $Result = $A + $B        return $Result    }}

Вот наш класс ClassName и его метод Start. Экземпляр класса можно вызвать ровно так же, как в настоящих языках программирования.

$NewClass = [ClassName]::new()$NewClass.Sum(1, 1)

Создаем новый экземпляр класса и вызываем метод, всё просто.

Есть ли Void в Powershell


При написании сложных скриптов этот же вопрос вставал у автора. Как сделать функцию, которая будет Void?

Говорят, что можно сделать так:

Get-Date | Out-Null

Однако, | Out-Null так же глушит весь Verbose, ErrorAction и не работает с Invoke-Command.

Если вам нужна функция с [Void] делайте новый класс, другого выхода нет.

class ClassName {     #Конструктов класса    [void] Start () {        #Создаем экземпляр класса прямо внутри этого же класса.        $q = [ClassName]::new()        $q.GetDate()    }     #Своего рода метод внутри класса    [void] GetDate () {        #А вот тут вызываем еще один метод из .Net  #Просто так, потому что можем        $Result = [DateTime]::UtcNow.ToString()        Write-Host $Result    }}

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

Вот так мы добились того, что не заглушили Verbose, при этом сделали функцию с Void.

Список методов класса


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

Перечислить все методы интересующего класса можно так:

#Делаем любовь, а не класс$Love = [ClassName]::new() #Выбираем члены интересующего нас класса и записываем в массив.foreach ($i in $Love | Get-Member -MemberType Method | Select-Object name) {    [array]$array += $i.Name} #Вызываем члены класса, если нужно.$Array | ForEach-Object {    $Love.$_()}

Отправляем HTTP запросы скриптом (оправдываем КДПВ)


Классами мы можем представлять данные и эти данные конвертировать в разные форматы. К примеру, нам нужно отправить POST запрос на веб сайт в формате JSON.

Сначала мы делаем модель данных и заполним данные в новый экземпляр.

#В качестве модели данных делаем новый классclass DataModel {    $Data    $TimeStamp} #Создаем экземляр класса$i = [DataModel]::new() #Заполняем данные$i.Data = "My Message in string"$i.TimeStamp = Get-Date

Так выглядит экземпляр класса после заполнения:

PS C:\> $i Data                 TimeStamp----                 ---------My Message in string 30.07.2020 5:51:56

Потом этот экземпляр можно конвертировать в XML или JSON или даже SQL запрос. Остановимся на JSON:

#Конвертируем данные в JSON$Request = $i | ConvertTo-Json

Так выглядит JSON после его конвертации:

PS C:\> $Request{  "Data": "My Message in string",  "TimeStamp": "2020-07-30T05:51:56.6588729+03:00"}

И отправляем:

#Отправляем JSONInvoke-WebRequest localhost -Body $Request -Method Post -UseBasicParsing

В случае если нужно отправлять один и тот же JSON файл 24/7, можно сохранить его как файл и отправлять уже из файла. К примеру, возьмем этот же самый $Request.

#Сохраняем данные конвертированные ранее в JSON в файл$Request | Set-Content C:\Users\User\Desktop\YourRequest.json #Отправляем ранее сохраненный в файл JSONInvoke-WebRequest localhost -Body (Get-Content C:\Users\User\Desktop\YourRequest.json) -Method Post -UseBasicParsing

Получаем HTTP запросы скриптом (оправдываем КДПВ 2)


Автор терпеть не может Postman, зачем кому-либо нужен Postman, когда есть руки и PowerShell? (Автор предвзято относится к этой программе и его нелюбовь ничем не обоснована.)
Делать свою альтернативу мы будем это с помощью System.Net.HttpListener, то есть мы сейчас запустим настоящий веб сервер из скрипта.

#Создаем новый экземпляр класса$http = [System.Net.HttpListener]::new() #Добавляем HTTP префиксы. Их может быть сколько угодно$http.Prefixes.Add("http:/localhost/")$http.Prefixes.Add("http://127.0.0.1/") #Запускаем хттп листенер$http.Start()  $http.Close()

Так проходит запуск класса.

Экземпляр класса был создан и его процесс запустился, мы можем слушать от него вывод. Вывод представлен как System.Net.HttpListener.GetContext. В это примере мы принимаем и конвертируем только POST запрос.

while ($http.IsListening) {     #GetContext нужен для получения сырых данных из HttpListener    $context = $http.GetContext()     #Определяем тип запроса с помощью Request.HttpMethod     if ($context.Request.HttpMethod -eq 'POST') {         #Читаем сырые данные из GetContext        #Для каждого отдельного запроса создаем свой конвейер        [System.IO.StreamReader]::new($context.Request.InputStream).ReadToEnd() | ForEach-Object {                        #С помощью System.Web.HttpUtility делаем urlDecore, иначе кириллица превращается в руны            $DecodedContent = [System.Web.HttpUtility]::UrlDecode($_)             #Конвертируем прилетевшие данные в нужный нам формат            $ConvertedForm = $DecodedContent | ConvertFrom-Json -ErrorAction SilentlyContinue             #Cконвертированные данные отображаем таблицой            $ConvertedForm | Format-Table                   }    }} 

Готовый скрипт


С помощью этого скрипта можно принимать запросы:

#Создаем новый экземпляр класса$http = [System.Net.HttpListener]::new() #Добавляем HTTP префиксы. Их может быть сколько угодно$http.Prefixes.Add("http://localhost/")$http.Prefixes.Add("http://127.0.0.1/")#Запускаем веб листенер$http.Start() if ($http.IsListening) {    Write-Host "Скрипт запущен"} while ($http.IsListening) {     #GetContext нужен для получения сырых данных из HttpListener    $context = $http.GetContext()     #Определяем тип запроса с помощью Request.HttpMethod     if ($context.Request.HttpMethod -eq 'POST') {         #Читаем сырые данные из GetContext        #Для каждого отдельного запроса создаем свой конвейер        [System.IO.StreamReader]::new($context.Request.InputStream).ReadToEnd() | ForEach-Object {                        #С помощью System.Web.HttpUtility делаем urlDecore, иначе кириллица превращается в руны            $DecodedContent = [System.Web.HttpUtility]::UrlDecode($_)             #Конвертируем прилетевшие данные в нужный нам формат            $ConvertedForm = $DecodedContent | ConvertFrom-Json -ErrorAction SilentlyContinue             #Cконвертированные данные отображаем таблицей            $ConvertedForm | Format-Table                   }         #Отвечаем клиенту 200 OK и закрываем стрим.        $context.Response.Headers.Add("Content-Type", "text/plain")        $context.Response.StatusCode = 200        $ResponseBuffer = [System.Text.Encoding]::UTF8.GetBytes("")        $context.Response.ContentLength64 = $ResponseBuffer.Length        $context.Response.OutputStream.Write($ResponseBuffer, 0, $ResponseBuffer.Length)        $context.Response.Close()     }    #Cконвертированные данные отображаем таблицей    $http.Close()    break}


Данные будут автоматичеки конвертироваться из JSON и выводиться в терминал.

Автор надеется, что вы выбросите Postman, так же, как и GIT с GUI.

Подробнее..

Перевод Вопросы, которые вам следует задать рекрутеру, чтобы успешно пройти телефонное собеседование

19.04.2021 18:14:05 | Автор: admin

В преддверии старта курса "IT-Recruiter" подготовили перевод материала, который содержит рекомендации по подготовке к первичному собеседованию.

Приглашаем также всех желающих на открытое демо-занятие Как из человека сделать IT-рекрутера. На вебинаре участники вместе с экспертом обсудят, как апгрейдить обычного рекрутера до IT и поделятся полезными ресурсами для развития:
- топ познавательных, обучающих и развлекательных блогов и подкастов про IT и IT-рекрутинг;
- конференции, митапы, мастер-классы и просто интересные ивенты для IT-рекрутеров;
- интересные книжки про IT и людей в индустрии;
- зачем и как IT-рекрутеру читать Habr.


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

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

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

Вам это кажется знакомым?

Ваш отклик на вакансию прошел этап отбора резюме (поздравляю!). Рекрутер отправляет вам электронное письмо с предложением договориться о вашем первом телефонном собеседовании.

Вы сразу же с головой ныряете в подготовку. Это неправильно!

Я все время замечаю за своими друзьями такое поведение. Как только они получают электронное письмо от рекрутера с просьбой назначить собеседование, они сразу же начинают бурную деятельность:

Мне нужно выписать КАЖДЙ факт о работе, которой я занимался, и мне нужно ЗАПОМНИТЬ все это!

Мне нужно выучить JAVASCRIPT за ОДНУ НЕДЕЛЮ!

Мне нужно КУПИТЬ НОВЙ ТЕЛЕФОН, чтобы мой голос звучал лучше!

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

Рекрутеры ваши союзники, которые могут предоставить полезную информацию.

Команда по подбору персонала с радостью поможет вам сориентироваться в процессе собеседования. Это означает, что вы можете (и должны!) задавать им вопросы о предстоящем интервью.

Выясните, что вам нужно подготовить

  • Кто будет вас собеседовать по телефону? Это hr? Это коллега из команды, к которой вы хотите присоединиться?

  • Какого рода собеседование у вас будет? Это поведенческое интервью? Это кейс-интервью?

  • Какова основная цель этого собеседования? Оно будет сосредоточено на вашем опыте? Или основное внимание будет уделено вашим аналитическим способностям?

  • К каким дополнительным вещам вам следует подготовиться? Стоит ли вам сосредоточиться на новых продуктах, выпущенных компанией? Стоит ли вам узнать больше о финансовых показателях компании?

Знание ответов на эти вопросы сэкономит вам время, снимет душевное беспокойство и, что наиболее важно, даст вам больше шансов пройти это телефонное собеседование.

Вы можете задать рекрутеру следующие вопросы.

4 вопроса, которые можно задать рекрутеру перед телефонным собеседованием

1. С кем я буду общаться?

Если ваш рекрутер еще не сказал вам это, задайте этот вопрос. Вы узнаете имя интервьюера и, скорее всего, его должность. Это поможет вам поставить себя на место интервьюера.

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

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

2. Какого типа собеседование мне следует ожидать?

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

Если это аналитика или кейс-интервью, вам могут задать такие вопросы, как как вы оцениваете, сколько бронирований обрабатывает Airbnb за один год? или как бы вы улучшили монетизацию Snapchat?

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

Знание типа собеседования поможет вам определить, какой области следует уделить особое внимание при подготовке.

3. На чем конкретно будет сосредоточено это собеседование?

Этот вопрос связан с предыдущим вопросом, но вы можете использовать его, чтобы конкретизировать для себя, как интервьюер будет вас оценивать. Каждое интервью преследует определенную цель. Здесь может быть что угодно, например: есть ли у вас соответствующий опыт? Хорошая ли у вас интуиция в своей области?

Опять же, этот вопрос поможет вам сузить круг тем, которые нужно подготовить. Время ограничено, не тратьте время на подготовку к тому, по чему вас не будут оценивать.

4. Стоит ли мне подготовить какую-либо конкретику?

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

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

или

Мы хотим знать, насколько хорошо вы работаете с командой разработки и насколько хорошо вы работаете над техническими проектами.

Рекрутер может помочь вам проявить себя наилучшим образом, это часть его работы!

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

Перевод:

Брэндон:Привет, ###! Меня устраивает! Какого типа собеседование мне следует ожидать? Что конкретно я должен подготовить? Спасибо!

Рекрутер: Привет, ###! Ожидайте, что это будет похоже на разговор с ###. Внимание будет сосредоточено на прошлом опыте и, в данном случае, могут быть вопросы по стратегии и/или анализу. Дайте мне знать, если у вас возникнут дополнительные вопросы, ###.

Обратите внимание рекрутер подсказал Брэндону, что именно следует подготовить. Все, что нужно было сделать Брэндону, это задать два вопроса в коротком письме.

Не распыляйтесь, готовясь к собеседованию. Сосредоточьтесь

Убедитесь, что вы готовитесь к правильным вещам. Не пытайтесь подготовиться ко всем возможным сценариям телефонного собеседования, изматывая себя. Выясните, на чем будет сосредоточено собеседование, буквально спросив: На чем будет сосредоточено собеседование?

Просто спросите!


Узнать подробнее о курсе "IT-Recruiter".

Смотреть вебинар Как из человека сделать IT-рекрутера.

Подробнее..

Как создать и у всех на виду хранить пароли, очень стойкие и очень длинные, не запоминая их

22.12.2020 20:16:02 | Автор: admin

Приветствую читателей!

Меня зовут Андреас, давно веду видеоблог (SunAndreas) на темы гражданской информационной безопасности, а сегодня решил в текстовом варианте поделиться со всеми полезными идеями, которые могут быть полезными даже для далёких от ИТ людей. Расскажите об этом старшему поколению, таки они смогут хранить пароли довольно безопасно, в том числе на работе, не используя дополнительные программы, менеджеры паролей.

Моим способом можно создавать очень сложные и труднозапоминаемые пароли, которые при этом не нужно будет вам хранить в своей голове. А кроме того, вы можете таким образом хранить сколько угодно паролей от скольки угодно сервисов, аккаунов. Предлагаемую мной форму хранения можно реализовывать как в цифровом виде, так и в реальном, например на бумаге, а лучше для надёжности комбинировать: хранить и виртуально, и на бумаге.

Способ 1

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

Для удобства набор символов, таблица, желательно чтобы была равносторонней, то есть или 10х10, или 25х25, или 100х100, или иной вариант который вы пожелаете, но не обязательно, и желательно чтобы в итоге ваш пароль в итоге был не менее 20 символов. Чем больше различных букв, цифр, символов в таблице, тем безопаснее. Хорошо не забывать и про использование как строчных, так и заглавных букв в своём наборе, что усложнит попытки подбора пароля злоумышленникам. Таблицы можно легко удобно создавать в LibreOffice Calc или если вы сидите на мелко-мягкой проприетарщине, то MS Excel.

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

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

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

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

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

Так мы убиваем сразу нескольких зайцев. Не надо особо прятать пароль от посторонних глаз, можно создавать сверх сложные пароли и не надо их постоянно помнить. Если таблицы вы храните на компьютере, то можете менять расширения файлов, например, с jpg на txt. Иногда это может быть дополнительной защитой от посторонних глаз.

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

Способ 2

Под конец ещё один простой способ иметь сложные пароли, но не запоминать их. Вы можете на компьютере создать пустой файл, виндусоводы могут создать простой текстовый файл (txt), и записать в нём малыми буквами, например, одно слово.

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

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

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

А для расчёта хеш-сумм можно использовать разные утилиты. Для GNU/Linux систем можете установить GTKHash.

Для которой существуют удобные плагины для обычных файловых менеджеров. После установки плагинов вы сможете просто: 1. правой клавишей мыши нажать на файл, 2. выбрать свойcтва, 3. и на вкладке Дайджесты выбрать для рассчёта нужные вам хеш-суммы.

Минус второго способа в том, что он не подходит для дешифровки полнодискового шифрования, когда ещё не загружена ОС и нельзя воспользоваться программой для расчёта хеш-суммы.

Заключение

Озвученные мной идеи, можно развивать, это своего рода opensource. Я описал лишь фундамент. Надеюсь, что это вам пригодиться, а если не пригодиться, то это хотя бы немного разовьёт вашу смекалку. Успехов.

Подробнее..

Как выучить иностранный язык алгоритм

17.02.2021 14:23:34 | Автор: admin

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


Когда надоели продавцы обещаний

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

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

Чего ждать от этого метода?

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

Метод не требует от вас особых способностей к языкам у меня, например, их нет вообще. Единственное, надо уметь концентрироваться на одной задаче и работать над ней самостоятельно час-два. Думаю, для аудитории Хабра это не станет проблемой.

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

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

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

Я, естественно, сам применял этот метод на практике. В первый раз так выучил испанский язык, причем настолько хорошо, что могу хоть завтра переехать в Испанию. А желание написать эту статью побудило меня проверить этот алгоритм на немецком чтобы точнее описать процесс и возникающие в ходе обучения трудности. Начал я в апреле 2020-го, и вот уже 10 месяцев все идет по плану. Хотя немецкий оказался сложнее, чем я думал.

На данный момент я могу читать статьи на немецком и книги (уровня Степного волка Гессе, например) почти без словаря и понимаю на слух процентов 80 из аудиокниг. На самом деле, это весьма посредственный результат люди с минимальными способностями к языкам добились бы за это время большего.

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

Проблемы стандартных методов изучения

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

Допустим, Вася решает выучить язык и полон энтузиазма. Он записывается на курсы, покупает самоучитель или просто начинается семестр/четверть в школе. Вася не пропускает занятия, честно выполняет упражнения и выписывает слова. Дело это невероятно скучное, и энтузиазм постепенно убывает. Тем не менее определенный прогресс есть.

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

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

Усугубляет ситуацию то, что на первых порах человек почти не чувствует прогресса. У него нет фактически никаких способов оценить свои знания, кроме номера страницы в учебнике. Первый год, а то и два при столкновении с настоящим живым языком Вася будет понимать, что он ноль, ему еще учиться и учиться. А вот свой регресс он будет ощущать предельно четко: достаточно открыть предыдущую страницу учебника и обнаружить, что ты забыл половину слов и правил.

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

Итак, основные проблемы, которые мешают выучить язык

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

  2. У ученика мало положительных стимулов и много негативных, он постоянно все забывает, путает, ошибается, настоящий живой язык вообще не понимает.

Казалось бы, человек без особых способностей или железной воли обречен. Но есть нюанс.

В чем состоит феномен полиглотов

Есть люди, которые язык не забывают, даже если им не пользуются. Например, полиглоты могут знать десятки языков. Очевидно, что они не используют их все каждый день и не в состоянии тратить время на их поддержание. Любой человек, который хорошо выучил какой-то язык, уже никогда не откатится на уровень начинающего. Факт существования некоего объема, после которого знания сохраняются, возьмем за аксиому.

Итак, с одной стороны, есть люди, которые после длительного перерыва забывают 90% выученного (начинающие), а с другой люди, теряющие лишь несколько процентов (знатоки). В математике есть теорема Больцано Коши, которая утверждает, что, если есть непрерывная функция, которая в начале отрезка меньше нуля, а в конце больше, то есть точка этого отрезка, в которой функция равна нулю. В нашем случае это означает, что человек при обучении в какой-то момент времени неизбежно окажется в состоянии, когда он еще не выучил язык до конца, но уже знает достаточно, чтобы забывать в случае перерыва не более, скажем, 10%.

Может показаться, что это какое-то глупое жонглирование цифрами, но на практике для ученика это превращается в новую реальность. Если вы мало забываете, то изучение языка из подвига, сравнимого с подвигом Геракла, превращается в простую рутину. Ваша функция обучения становится фактически не убывающей: чем больше времени потратили, тем лучше знаете. Надоело или нет времени прекратили учить, а через год начали снова почти с того же места. Я воспользуюсь физической аналогией и буду называть это преодолением потенциального барьера.

Итак, сумма знаний это произведение скорости получения знаний на время. Одна переменная, время, у нас строго ограничена. Есть буквально пара месяцев, максимум полгода, чтобы преодолеть этот барьер. Количество необходимых знаний уменьшить нельзя. Остается только скорость обучения. Мы должны увеличить ее настолько, чтобы успеть преодолеть потенциальный барьер за несколько месяцев.

Почему взять барьер не проблема

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

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

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

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

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

Суть метода

Метод основан на подходе знаменитого археолога Генриха Шлимана, владевшего как минимум 14 языками. Когда он хотел выучить какой-то новый язык, то брал книгу на этом языке, находил ее перевод и читал их параллельно. Поскольку словарем в те времена пользоваться было затруднительно, то читал он книгу несколько раз, чтобы запомнить все слова.

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

Мы, конечно, не Шлиманы, но и времена нынче другие. Сейчас нет необходимости сопоставлять параллельные тексты: любой отрывок вполне пристойно может перевести электронный переводчик. Также нет необходимости читать много раз одно и то же, потому что посмотреть значение слова в электронном словаре не составляет труда. Да и с аудированием текстов нет проблем, когда есть электронные книги, видео на Youtube и озвучка слов в словарях.

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

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

Вообще, есть возможность упростить себе первые шаги. Я рекомендую посетить сайт franklang.ru Ильи Франка и познакомиться с его методом чтения, а также прочитать его статьи по изучению языков. Франк предлагает начинающим специально обработанные (а не адаптированные, т.е. упрощенные это важно) популярные книги, где весь текст снабжен буквальным переводом и комментариями.

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

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

Далее я опишу алгоритм, которого можно придерживаться. Он, конечно, не отлит в граните, и вы можете вносить в него свои правки. Главное, не нарушить основной принцип: выучить как можно больше первоначальным наскоком.

Атака на язык. Алгоритм

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

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

  3. Первый этап. Необходимо выбрать время так, чтобы вы месяца два могли заниматься без помех по часу-два в день (очень желательно два). Важна именно регулярность. На этом этапе знания быстро забываются, поэтому нужно подкреплять их каждый день. Выберите интересные вам не слишком длинные книги разных авторов. Можете попытаться выбрать книгу полегче для первого раза. Следует отдавать предпочтение оригиналам, а не переводам, и серьезным авторам, а не бульварному чтиву из соображений качества языка. Также книги должны быть средней длины, чтобы вы, с одной стороны, успели привыкнуть к стилю и словарю автора, а с другой побыстрее переходили к следующей и тем самым увеличивали разнообразие тем и слов.

  4. Начинайте читать. Первые пару-тройку недель будет очень тяжело, прогресс будет не очень заметен. Каждая новая тема будет вызывать у вас ощущение, как будто вы начинаете с нуля и ничего не получается. На этом этапе требуется проявить максимальную силу воли. К счастью, именно вначале ее проявить проще всего. Не обращайте внимания на то, что половину текста не понимаете, это нормально. Если есть желание разобраться, можно переводить отдельные куски автоматическим переводчиком. Также не обращайте внимания на то, что забываете значения слов, это тоже нормально. Вы их в итоге все равно выучите. Не обязательно также смотреть в словаре значения всех слов: если видите, что отрывок сложный, то просто пропустите его. Не нужно ни перенапрягаться, ни стремиться к совершенству. Как правильно отмечает Франк, изучение языка это марафон.

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

  6. Ориентировочно в конце второго месяца обучения вы уже достигнете уровня достаточно свободного чтения, хоть и со словарем. Срок сильно зависит от ваших личных способностей, языка и других факторов, но два месяца оценка скорее консервативная. В любом случае на этом этапе для вас будет очевидным, что потенциальный барьер вы преодолели, и дальнейшее дело техники. С этого момента вы можете позволить себе отдохнуть или снизить интенсивность занятий. Полученные знания уже никогда не забудутся. Однако это не значит, что вы уже хорошо знаете язык. Ориентировочно вам нужно знать хотя бы 10 000 слов, чтобы иметь солидный словарный запас, и за два месяца их не выучить. Также ваше понимание грамматики все еще слишком слабое. Потребуется еще пара аналогичных подходов, чтобы углубить знания.

  7. Когда вы почувствуете, что дело идет (приблизительно через два месяца), можно думать о том, чтобы переходить к изучению других проявлений языка: аудирование, грамматика, разговорная речь.Хотя торопиться смысла нет. Метод чтения все еще чрезвычайно эффективен, и инвестированное в него время сильно облегчит обучение в дальнейшем.

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

Что делать с грамматикой

Многие считают, что язык надо учить как научную теорию. Начинать с основ, с базовых определений. Затем переходить к более сложным вещам и т.д. И только в конце обучения, сдав экзамен, вы получаете право пользоваться языком на законных основаниях.

Грамматика в таком подходе занимает центральное место. По непонятным причинам одни грамматические конструкции считаются сложнее других и изучаются позже. Будущее время, например, могут ввести на несколько месяцев позже настоящего. В реальности, конечно, никакого смысла в таком искусственном порядке нет. Можно изучать что угодно когда угодно. Язык это не физика, многое, что нужно знать о его грамматике, содержится в нем самом и может быть выучено естественным путем. Особенно хорошо так запоминаются самые скучные вещи типа неправильных глаголов, правил спряжения и склонения.

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

Доламываем языковой барьер

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

На деле же вы не можете ничего сказать, как правило, потому что:

  • у вас мало практики.

  • вы не владеете чисто техническими навыками трансформации слов (по временам, падежам, склонениям) и составления предложений из них.

  • у вас маленький активный словарный запас.

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

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

Соответственно, если вы хотите научиться говорить, то нужно практиковаться в этом с живым человеком. Помните только, что одно дело, когда вы пытаетесь разговаривать, зная 500 слов и 10% грамматики, и другое, когда вы знаете 10 000 слов и всю грамматику (хоть и пассивно). Во втором случае обучение становится скорее развлечением, также можно сильно сэкономить на индивидуальных занятиях их потребуется гораздо меньше.

Мой опыт

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

Я начал с Процесса Кафки, что может показаться странным, но в результате выяснилось, что это не самая сложная книга по меркам немецкой литературы. На него ушло две с половиной недели, после чего я прочитал Зюскинда Парфюмер. Это обычная книга, написанная умеренно сложно, как и подобает приличному писателю.

Как и ожидалось, первые три дня было крайне сложно, потом процесс пошел. На Зюскинда ушло тоже примерно две с половиной недели. После него я прочитал Ремарка Три товарища. У Ремарка очень образный и живой язык, много идиом и разговорных конструкций. Такие книги наглядно показывают, почему учебники бесполезны для изучения языка. К середине книги я освоился и местами мог читать его даже без словаря. Собственно, в тот момент я и преодолел потенциальный барьер (через примерно полтора месяца). Всего на Ремарка ушел примерно месяц, а в сумме получается два месяца занятий.

В дальнейшем я еще прочитал Гессе Игра в бисер и Томаса Манна Волшебная гора. Но я бы не рекомендовал эти книги: они слишком сложные. Если с Гессе и так все понятно, то Манн стал неожиданностью. Как сказал один шведский критик, эта книга неотделима от немецкого языка, и ее бессмысленно переводить. И правда, это какой-то Эверест немецкой литературы. Советую держаться от Манна подальше.

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

Подробнее..

Ловушка знаний или как ускорить обучение в несколько раз

08.03.2021 18:14:03 | Автор: admin

Дисклеймер

В этой статье я рассмотрю только один параметр, влияющий на освоение чего либо - внимание. Конечно, существуют и другие, но это вопрос других статей. Прошу в критике и комментариях учесть это.

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

Есть три уровня освоения:

  1. Знание. Когда мы что то узнали, нам объяснили. Практики мало. Уровень концентрации внимания при применении самый высокий. Примем за 90%. Конечно есть разброс, в зависимости от материала, который осваиваешь. В своих примерах я исходил из того, что ученик(или же преподаватель) захочет использовать свои возможности по максимуму.

  2. Умение. Нам объяснили и мы довольно долго практиковали. Есть серьезный опыт. Но все еще нужно контролировать процесс применения. Уровень концентрации внимания 50%.

  3. Навык. Мы узнали или нам объяснили что-то. Количество практики очень большое. Практически не концентрируемся при применении. Уровень концентрации внимания 10%.

Совершенно очевидно, что чем больше осознанной практики, тем меньше нужно концентрироваться при применении.

Для примера возьмем 3 последовательно осваиваемые темы. Окружность с цифрой внутри - это тема с соответствующим номером.

Базовые положения:

  1. Последующие темы основываются на предыдущих(включают их). Поэтому окружности нарисованы внутри друг друга. Не все и не всегда. Но в целом принцип соблюдается.

  2. Освоение идет от простого к сложному. Концентрация внимания в каждой следующей теме повышается на 10%.

Последствия приоритета знания в обучении.

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

При таком подходе текущие микронавыки не тестируются. У упражнений нет количественной оценки(например время выполнения). Программа не корректируется в зависимости от уровня выполнения упражнений.

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

Что и видно в теме 3 - 110% концентрации. Вряд ли кто то может сконцентрироваться на 110%. Это значит - тотальное непонимание. С этого момента начинается заучивание материала без его осмысления. Что вскоре вообще перерастает в привычку.

Память ненадежна и невозможно удержать в ней весь материал без его понимания. А значит даже такое кривое освоение материала становится чудовищно медленным.

Отдельный момент, это понимание того, что такое тест(замер). С моей точки зрения текущий элемент, материал, упражнение - и есть тест. Что бы мы не делали - это либо значимый элемент, а значит надо развивать его выполнение до уровня навык. Или это не значимый элемент - а тогда нафига его делать?

Общие выводы для освоения через знания.

Освоение через знания дает выигрыш по времени, но только в начале процесса. Через некоторое время мы неизбежно начинаем тупить и скорость освоения скатывается почти в ноль. Чем дальше учимся тем сложнее и сложнее, пока не попадем в тупик. Из которого без посторонней помощи выбраться уже сложно. Такова школьная и вузовская система.

Приоритет навыка в обучении.

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

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

Если же мы осваиваем материал на уровне навыка, то получается очень интересный парадокс.

С одной стороны да, на самых базовых темах(в данном примере это тема 1) придется проделать большую работу. Чтобы дойти до уровня навыка в базовых темах придется изрядно попотеть. Но это окупится сторицей. Как только мы доведем базу до уровня навыка, сразу получим следующие преимущества:

  • Следующая тема сразу же окажется почти на уровне навыка - 20% концентрации внимания. Т.е. сходу будет элементарной. Сравните со 110% концентрацией в случае работы через знания.

  • Дельта при доведении всех последующих тем до уровня навыка всего 10%. А в реальности будет еще меньше. Потому что в реальности чем дальше мы двигаемся в предмете, тем меньше принципиально нового материала встречаем.

Ключевые моменты

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

  2. Тщательно подходить к самой технологии замера, тестирования. Внутри каждого упражнения уже должны содержаться критерии выполнения его на уровне навыка. Остается только фиксировать достижение этих критериев. При таком подходе замеры вообще не отнимают дополнительного времени.

  3. Соединение навыков - отдельный навык! Пример из грамматики. Если ты хорошо делаешь группу конструкций Simple и Continuous по отдельности, это не значит, что ты хорошо будешь делать их вместе. Особенно если на скорость и вариативно.

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

Общие выводы для освоения через навык.

Освоение через навыки на начальных этапах требует очень большого расхода времени. Будет казаться, что безнадежно отстаешь. Все уже 10 тем прошли, а ты еще на первой-второй топчешься. Но в более долговременной перспективе дает просто нереальное ускорение! И несравненно более высокий уровень компетентности.

Проиллюстрировать разницу в скорости освоения в начале и в середине обучения с использованием такого подхода можно таким мемом:

Пример из личной практики.

Шёл 1997 год, март месяц. Я поступаю в вуз, хожу на курсы. Но из за того, что был по уши влюблен, на курсы забивал. Результат средняя оценка между 2 и 3 по физике и математике. Конкурс тогда был очень серьёзный.

Результат применения этой технологии в течении двух с половиной месяцев по 1,5 часа в день:

  1. Решил по нескольку раз оба рекомендуемых решебника. По математике - Сканави, по физике - Израилевич.

  2. На экзамене я не решал - я писал сочинение. Настолько элементарны были для меня задачи.

  3. Результат сдачи - 10 баллов(5+ по пятибальной) по математике и 9 баллов(5 по пятибальной) по физике. Поступил на лучшую специальность в ВУЗе.

Как конкретно я делал в случае с физикой и математикой:

  • Отсек все лишнее, писал только вычисления и расчеты.

  • Создавал позитивное подкрепление. Фигачил под свой любимый хард рок.

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

  • Засекал время, решал 20 задач, и пока не добивался такой скорости - не двигался дальше. Иной раз приходилось один и тот же блок в 20 задач решать по 4-5 раз, чтобы получить нужную скорость. Но эффект того стоил!

А что сейчас?

Сейчас я использую этот принцип(но не только его) при разработке своих марафонов по обучению английскому.

А еще у меня есть канал в телеграме.

Подробнее..

Взлом английского. Как стать избранным

19.03.2021 18:12:20 | Автор: admin

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

Система, описанная в статье, перевернет ваше представление об изучении языков. Я на это надеюсь. Но это случиться только если не спешить, читать внимательно и вдумчиво и связывать все тезисы между собой. Используйте систему 2 на полную катушку.

Дисклеймер

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

Очень, очень большая просьба - при критике указывать конкретные тезисы и адресуйте один комментарий одному тезису. Так проще отвечать на аргументацию. И так мы быстрее найдем корень разногласия.

История

Сентябрь 2004 года. Я молодой программист. Ровно в этот момент открывается саратовский офис компании Epam. И меня в него взяли. Вообще это отправная точка сразу для нескольких историй, но сегодня я расскажу именно про английский.

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

Я старался как мог. Со словарём. Но всё равно одно из заданий было понято неправильно (что неудивительно, с моим тогдашним английским). И, как назло, это было частью какого-то важного билда, у которого горели сроки. Короче, я всех подвёл.

И вот я уже на ковре у директора получаю первое и последнее предупреждение. Замотивировали по самое небалуйся. И вот я уже на курсах английского. Это вдобавок к тем курсам, которые запустили в самом Епаме.

Как это обычно бывает, сильное давление обстоятельств заставляет быстро отсеивать зёрна от плевел. И я обнаружил следующее. В группе где-то 10 человек. Препод опрашивает нас по очереди. Получается из часа занятий на каждого 6 минут. И это в лучшем случае. А ведь есть еще объяснения и т.д. и т.п. В общем, получается минуты 3 разговорной речи.

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

Тогда я начал искать. В основном в интернете. Пробовать различные методики. Но везде было плюс-минус одно и то же в разной обертке. Грамматика через правила + заучивание слов.

И тут один мой товарищ с работы, прослышав о моих поисках, подкинул мне диск - Языковой мост. Мотивация заставила меня вникнуть в указания внимательнейшим образом. И я начал практиковать.

Через 3 недели ежедневных занятий по часу у меня запустился внутренний диалог на английском. О чём я сразу и сказал преподавателю епамовских курсов. Убелённый сединами педагог авторитетно мне прояснила, что это невозможно, и что я страдаю ерундой.

Ну а я продолжил страдать ерундой. Через 4 недели на проспекте я встретил иностранца. Тогда в много миссионеров бродило по Руси-матушке. И решил не упускать этот шанс. Не скажу, что было просто, но я преодолел себя, познакомился, договорился о встрече.

На встрече у меня было полное ощущение, что я говорю по-русски. Фантастика. Но самое поразительное было дальше. После того, как я час проговорил с американцем, я отправился на встречу уже с русскоязычным другом. И здесь меня ждало новое открытие.

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

Фото примерно из тех времен.

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

Позже я целенаправленно начал заниматься разложением этого принципа на детали и проверкой работы этих деталей на практике. Проще говоря - открыл центр английского языка. И вот уже 11 лет занимаюсь шлифовкой и разносторонним тестированием системы обучения мышлению на языке.

Дальше я изложу модель работы языка, к которой пришёл за эти 11 лет.

Вступление

Первые тезисы будут довольно очевидными и простыми. Но, чем дальше мы будем двигаться, тем более интересными будут тезисы, и совсем необычным будет вывод из них.

Я специально сделал каждый шаг элементарным. И преследовал тут две цели:

  1. Показать все звенья цепи рассуждений. Сделать их максимально ясными. Не оставлять места туману войны.

  2. Создать возможность для точной адресации обратной связи.


Тезис 1

Язык - описание наблюдаемой и ощущаемой реальности.

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

Например, что язык определяется правилами. Но это не так. Язык описывается правилами. И это не одно и то же.

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

Это как с силой тяготения. Сила тяготения не определяется формулой всемирного тяготения. Эта формула ее лишь описывает. Не она причина. Классическая дилемма законов и причин.

Также эту тему подробно освещает Юдковский в цепочке "загадочные ответы".

Именно реальность является причиной структур и конструкций языка. И именно к ней, а не к правилам, надо обращаться как к источнику решений. О том, как это сделать, дальше.


Тезис 2

В реальности можно выделять вниманием разные аспекты.

И каждый такой выделенный аспект - отдельная сущность. При этом эта сущность субъективно существует в нашем внимании, в наших ощущениях.

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

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


Тезис 3

Разные языки акцентируют разные свойства реальности

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

Английский акцентировано выделяет четыре свойства действия: факт, процесс в моменте, завершённость и длительность.

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

Я плыву vs Я плаваю.

В случае факта(регулярности) будет я плаваю в бассейне регулярно.

В случае процесса в моменте будет я плыву по дорожке сейчас.

PS В русском, кстати, выделяется направленность и ненаправленность действия, чего нет в английском. И изучающим русский англичанам неплохо бы потренироваться визуализировать эту направленность/ненаправленность в жизни, без привязки к языку. Глядишь, и русский будет даваться легче)))


Тезис 4

Базовая привязка языка к реальности.

Если и со стороны реальности, и со стороны языка дробить структуры до мельчайших частей, то мы придём к базовому блоку. Блоку, деление которого дальше не имеет практического смысла.

Этот базовый блок таков:

аспект реальности - слово

Со стороны реальности это выделенный вниманием аспект реальности. Будь то предмет, явление, действие или их свойства.

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

Важно не забывать что тезис 1 работает и здесь. И именно реальность определяет слово, а не наоборот.

Вижу красный - говорю красный))

Тезис 5

Как работает слово. Слово = смысл+звук.

Слово состоит из двух очевидных частей. Первая - это набор звуков (или букв, то есть фактически записи звуков).

Вторая, более интересная часть - это смысл. Если спросить случайного человека, что такое смысл, то вместо чёткой адресации в реальном мире мы, скорее всего, получим замену одного термина другим. Например такую: смысл - это идея, значение.

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

Пресквю Джима Керри в Лжец лжец))).

Фишка здесь в том, что слова нет, но мы хорошо ощущаем, что хотим сказать. Вот этот комплекс ощущений и есть смысл. И когда я буду говорить про смысл, я буду иметь ввиду именно этот набор ощущений.

Теперь рассмотрим подробно связку смысл-звук. И с этой связкой всё очень непросто.

Во-первых

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

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

Если бы у нас был прямой доступ к текстово-звуковой части слова, то, при словарном запасе в 50 тысяч слов у носителя языка, эта игра потеряла бы всякий смысл.

Во-вторых

Очень интересно, как слово связывается со смыслом. Не через запоминание. Через физическое действие - выражение. Когда, как при пресквю, вызываешь ощущение смысла и тут же выражаешь, обозначаешь его звуком.

В простом случае ты просто тыкаешь пальцем в предмет и даешь ему имя. Как если бы до этого у него вообще не было никакого названия.

Слово как бы пропитывается смыслом, как губка. И в итоге сливается со смыслом так, что невозможно разделить.

Нюанс в том, что процесс выражения не терпит вмешательства. Если туда засунуть что-то еще, например прокладку в виде русского слова, то всё перестанет работать. Ибо весь смысловой посыл наталкивается на русское слово, которое смыслом уже напитано.

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

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

В-третьих

Смыслы мгновенно сочетаются и сливаются в один объект или одно описание.

Возьмём цвет красный. Представим. Ну цвет и цвет.

Возьмем объект яблоко. Представим.

Теперь поставим их рядом.

Красное яблоко.

Смыслы - именно смыслы(а не звуки их выражающие) мгновенно соединяются, образуя новый объект.

Или же не соединяются. Например красивая он завтра бегали.

Вся круть здесь в том, что, если слово пропитано смыслом, то это сочетание происходит мгновенно. Скорость абсолютно сумасшедшая. Затраты по контролю - околонулевые. Именно так носители (и мы с вами) контролируют грамматику. Именно так язык описывает реальность.

На этом фоне механизм контроля через запоминание правил выглядит абсолютно смехотворно.

В-четвертых

С точки зрения связки смысл-звук стирается разница между языками. Нет простых и сложных языков. Все одинаковые. Все языки это набор связок смысл-звуки.

А смыслы, как это ни странно, легко сочетаются по смыслу.


Тезис 6

Чтобы был смысл, нужно свойство (аспект реальности).

То есть если мы возьмём конструкции (времена) и начнём разматывать их по моей схеме в обратную сторону, то что мы получим.

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

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


Тезис 7

Уточненная схема работы языка

Главная схема взаимодействия реальности и языка такова:

аспект реальности -- смыслы -- звуки

Главным в языке является то, какой мы видим реальность, какие аспекты и свойства в ней выделяем. То есть это не что-то подразумеваемое, а либо непосредственное видение через глаза, либо представление в уме в виде образов.

Выделяя свойства и объекты реальности, мы выражаем их через смысл. А произносимые слова - просто реакция на смыслы.

схема работы любого языкасхема работы любого языка

Тезис 8

Мы описываем реальность не звуками, а смыслами.

Всё, что мы произносим, будь то предложение или отдельная фраза, мы создаем через смыслы. Мы не управляем словами напрямую.

Это похоже на настольный футбол. Мы двигаем не футболистов, а рукоятки управления. Футболисты к ним лишь прикреплены.

Рукоятками двигать удобно. Они для этого предназначены. А вот самими футболистами - очень неудобно. То же самое и в языке.

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


Тезис 9

Правила взаимодействия свойств(объектов) определяются реальностью, а не языком.

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

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

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

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


Тезис 10

Всё, что правильно в реальности, правильно и в языке. И наоборот. Откуда идут 99% ошибок.

Реальность одинакова вокруг нас всех. И мы в ней прекрасно разбираемся. Знаем, что возможно, а что нет.

В случае, если конструкции языка жёстко по смыслу связаны с аспектами реальности, то:

  1. Вы не можете ошибиться в словах, из которых состоит конструкция, потому что это сразу же меняет смысл, а он ощущается напрямую.

  2. Вы не можете ошибиться в самой конструкции, потому что всё, что правильно в реальности, правильно и в языке.

Грубо говоря, если у вас выстроена жёсткая связь смысл слов -- смысл конструкции -- аспект реальности, то ошибиться становится просто невозможно. Но! Связь должна быть выстроена через смысл, а не через запоминание. Дальше в тексте будет проверка этого утверждения.

И обратное верно. Как максимально затруднить изучение языка?

  1. Убрать смысл слов, и заменить их абстрактными третьими и четвертыми формами и всякими герундиями.

  2. Как следствие разрывается всякая связь с реальностью.

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


Тезис 11

Понимание - соединение смыслов слов в смысл всего предложения.

Здесь надо вспомнить третье свойство смысла.

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

Если же нет - то, даже если воспринять все звуки правильно, декодировать через память и логику просто не успеешь.

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

И вообще очень странно, что классическая практика языка имеет целью ощущение смысла речи, но при этом не работает напрямую с ощущением смысла мельчайших частей языка - слов.


Тезис 12

Ключевое действие

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

В языке же ключевое действие - это соотнесение реальность -- смыслы -- звуки.

  • То есть сначала мы прорабатываем визуализацию свойств реальности так, как их визуализирует носитель

  • Вторым шагом связываем их со смыслом.

  • Третьим связываем смыслы и звуки слов.

Классический подход фэйлит на всех трёх этапах.

  • проработки визуализации вообще нет

  • вместо смыслов - абстрактные третьи, четвертые формы глагола и непереводимые вспомогательные глаголы

  • вместо связки смысл-звуки связка смысл-родное слово-иностранное слово.

  • нет конкретных технологий на всех трех этапах. Только абстрактные полушаманские рекомендации смотрите больше фильмов в оригинале и всё придет свыше.


Тезис 13

Нужно тренировать видение свойств так, как это принято в изучаемом языке.

Здесь есть несколько важных моментов.

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

Это в корне неверно.

Есть действие. У любого действия есть 4 свойства. Еще раз. У любого действия есть эти свойства. Эти свойства есть в реальности и их не надо как-то специально понимать и в них разбираться.

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

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

Как хочешь, так и говори. Правил нет.

Свойства действия

Разбирать будем на примере простого действия. Пусть утром с 8 до 9 я гулял с собакой. Представим это на линии времени:

1. Факт

Было или не было действие. Я вообще его делал? Я вообще его делаю? Я вообще его буду делать?

Тут есть одна фишка. В настоящем факт превращается в регулярность. Я вообще это делаю. Факт в настоящем - это не то, что происходит сейчас. Потому что если оно происходит сейчас, то это процесс.

В нашем случае действие было в прошлом. Вот такой простой факт.

Визуализация - просто статичная картинка, фотография действия.

2. Процесс в моменте

Если ткнуть в любую точку(момент) с 8 до 9, допустим в 8:10, то там я был в процессе действия. До начала и после конца - соответственно не был. Будет очень понятно если просто методично с шагом в 5 минут перечислить все точки с полвосьмого до полдесятого и про каждую сказать, были вы там в процессе действия или нет.

Визуализация - слоумо в конкретный момент времени. Длиться где то секунду-две. То есть вы как бы заглядываете в этот момент времени и видите там слоумо.

3. Завершённость

Здесь еще проще. Завершённость очевидно возникает только когда действие завершено. И никуда не девается. Такая вот очевидность.

Маленький лайфхак. Формулируйте завершённость сразу с глаголом иметь. Точно также пробегитесь по точкам с шагом в 5 мин как в предыдущем примере, только говорите имеете вы в этой точке завершённость или нет.

Соответственно в 7:30 я не имел завершённость. В 8:30 тоже не имел. А в 9:00 имел завершённость, и в 9:30 имел. И сейчас я имею завершённость.

Визуализация - статическая картинка результата действия либо его последней секунды.

4. Длительность

Здесь тоже просто. Лучше делать тоже сразу через глагол иметь. Сколько времени от действия прошло в какой либо точке.

В какую точку не ткни до 8 утра - я там не имел никакой длительности. В 8:10 имел 10 минут длительности действия. В 8:20 - 20 минут. В 9:00 - имел 1 час длительности действия. В 9:30 тоже имел 1 час длительности действия. А сейчас имею 1 час длительности действия.

Визуализация - быстрая промотка от начала действия до выбранной точки.


Тезис 14

Проверка связи свойств и смыслов.

Здесь мы возьмем дословный перевод английских времен и устроим несколько проверок.

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

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

1. Факт

Формулировка: Я делал/делаю/буду делать.

Эта конструкция звучит и формулируется по русски, поэтому ошибиться возможно только если с русским не очень. Но есть ньюанс и он в том, что у русской конструкции значительно больше смыслов.

Поэтому надо настойчиво визуализировать фактологичиность, отсекая все остальное, что навешано на эту конструкцию в русском языке.

Лайфхак. Если добавлять слово вообще то нужные ощущения создать легче. Потом можно слово вообще убрать, но его подразумевать.

2. Процесс в моменте

Формулировка: Я являюсь делающим.

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

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

Можно ли заменить в этой конструкции являться на иметь? Нет. Иметь - это про результат. А нам надо описать состояние, нахождение в процессе действия.

Можно ли заменить делающий на сделанный? Нет, смысл изменится коренным образом. Очень хорошо это видно на следующем примере. Представим что я варю суп. Тогда у нас 2 варианта

  1. Я являюсь варящим - описывает процесс. Я варю что-то(суп).

  2. Я являюсь сваренным - тут сварили уже меня. Никакого процесса нет. Не подходит ))

3. Завершенность

Формулировка: "Я имею сделанным".

Визуализируем. Проверяем соответствие по смыслу. Если я имею что то сделанным, то я это очевидно сделал, то есть действие завершено. Соотнесение 100%.

Попробуем заменить слова. Исходное предложение "Я имею сваренным суп". Заменяем имею на являюсь. Получается "Я являюсь сваренным суп". То есть меня сварили а слово "суп" вообще выпадает. Смысл нарушился.

Теперь меняем "сваренным" на "варящим". Получаем "я имею варящим". Выражает завершенность по смыслу? Нет.

Получается если осознаешь смысл, то ошибиться нельзя.

4. Длительность

Формулировка: Я имею (себя) пробывшим делающим.

Визуализируем. Проверяем соответствие по смыслу.

Имею пробывшим = пробыл. Поскольку имею сделанным = сделал.

Делающий = в процессе действия.

Получается я пробыл в процессе действия. Если добавить в течение часа, то вообще все встанет на свои места. Соответствие по смыслу свойству длительность 100%.

Попробуем изменить слова конструкции и посмотреть возникнет ли несоответствие по смыслу. Можно ли заменить в этой конструкции иметь на являться ? Нет. Являться - это про состояние, процесс, а нам нужен результат.

А если заменить делающим на сделанным? Возьмем наш пример с супом опять - я имею бывшим варящим. Получим я имею (себя) бывшим сваренным. Чтобы был еще виднее что получилось, уберем на секунду бывшим. Получится я имею себя сваренным. Совсем не похоже на идею пребывания в процессе варки в течение какого то времени.

Итого получается и в этой формулировке ошибиться нельзя. Если делать по смыслу конечно.


Тезис 16

Отрабатываем все до навыка.

Каждый элементы системы должен быть отработан до навыка с постоянным мониторингом критериев достижения уровня навыка.

В этой отработке есть несколько ключевых моментов, без которых ничего не работает. Я подробно рассказывал об этом в своей статье.

Важно все время проверять все свои действия на соответствие цели - склейка тренировкой подводящих навыков в навык владения языком. А именно:

  • навык видения реальности как у носителя

  • навык соотнесения этого видения со смыслами как у носителя

  • навык склейки смыслов и звуков

Здесь мы используем тринадцатую добродетель рационалиста у которой нет имени.

Про похожий подход к постоянному мониторингу критериев можно почитать у Сергея Абдульманова в статье про футбольные школы.

Вывод

Что есть сейчас?

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

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

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

А как можно?

  • можно без правил опираться на реальность как мы это делаем в родном языке.

  • можно воспринимать времена английского также. как мы воспринимаем склонения и падежи, напрямую, по смыслу.

  • можно быстро научиться думать на языке. Ведь это самый естественный способ его изучения

PS

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

Кстати, у меня есть телеграм канал.

Подробнее..

Перевод Как я сделал кнопку выхода из Zoom

17.03.2021 16:04:48 | Автор: admin

2020 год однозначно можно назвать годом Zoom. Такого количества онлайн-встреч, кажется, не было никогда. И в начале 2021 пока изменений не видно. Но есть способы разнообразить это и заодно немного повеселиться. Эта кнопка аварийного выхода из Zoom позволяет мгновенно выйти из конференции. Она проста в изготовлении и требует очень небольшого опыта работы с электроникой. Я сделал её, потому что я всегда искал кнопку выхода в нижней части экрана и, казалось, всегда был тем человеком, который уходил с каждого собрания последним. Теперь, когда я сделал кнопку аварийного выхода, я могу уйти с любого собрания Zoom как чемпион. Я бы сказал, что качество моей жизни улучшилось на 357 % (плюс-минус).


Запчасти:

(X1) Блок аварийной кнопки.

(X1) Контроллер Adafruit Trinket M0.

(X1) Микро-USB кабель.

(X2) 22AWG M4 Вилочная клемма.

(X2) 6-дюймовые многожильные провода.

(X1) Кнопка мгновенного действия (опционально).

Инструменты:

(X1) Паяльник.

(X1) Инструмент для зачистки проводов.

(X1) Отвёртка.

(X1) Канцелярский нож.

Шаг 1. Установите программное обеспечение

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

Прежде всего загрузите Arduino IDE, если вы ещё это не сделали.

Затем вам нужно будет добавить Adafruit Trinket M0 в Arduino IDE. Самый простой способ сделать это следовать инструкциям по установке на странице Adafruit.

Наконец, настройте плату следующим образом

Tools > Board > Adafruit Trinket M0.

Tools > Port > /dev/cu.usbmodem (или похожие).

Шаг 2. Запрограммируйте контроллер

Загрузите в контроллер следующий код:

// ******************************************************// //            Code for quitting Zoom quickly////           Designed for Adafruit Trinket M0//                   by Randy Sarafan////               For more info check out://  https://www.instructables.com/Easy-Zoom-Quit-Button///// ******************************************************// Add the keyboard library#include <Keyboard.h>void setup() {     // Configure Pin 2 as input switch.    // Triggered when connected to ground.     pinMode(2, INPUT_PULLUP);    // Start running the board as a virtual computer keyboard    Keyboard.begin();  }void loop() {      // Check for a button press event    if (digitalRead(2) == LOW) {           // Press command w and wait 1/10 second        Keyboard.press(KEY_LEFT_GUI);        Keyboard.press('w');        delay(100);            // Release all keyboard keys        Keyboard.releaseAll();        // Press the return key and wait 1/10 second        Keyboard.press(KEY_RETURN);        delay(100);            // Release all keyboard keys        Keyboard.releaseAll();        // Wait for the pushbutton to be released before resuming        while (digitalRead(2) == LOW){           delay(1000);        }     }}

Шаг 3. Присоедините разъёмы

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

Зачистите один конец каждого провода и обожмите клеммы вилки на концах каждого из них.

Шаг 4. Припаяйте провода.

Припаяйте чёрный провод к земле.

Другой провод припаяйте к контакту 2.

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

Шаг 5. Вставьте USB

Найдите резиновую втулку корпуса.

С помощью лезвия бритвы сделайте небольшую прорезь, чтобы пропустить через неё конец USB-кабеля, а затем сделайте это.

Шаг 6. Подключите USB

Установите резиновую втулку в корпус, а затем подключите кабель USB к контроллеру Trinket M0.

Шаг 7. Замените кнопку (необязательно)

Блок аварийного выключателя поставляется с блокирующим выключателем. Это означает, что, когда вы нажимаете на него, кнопка фиксируется на месте и остается там, пока вы её не повернёте и не отпустите.

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

Для этого я просто разобрал фиксирующую кнопку и вынул её из корпуса. Затем я разобрал и вместо этого установил кнопку мгновенного действия.

Шаг 8. Подключите коммутатор

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

Обычно эти соединения маркированы. В моём переключателе этого не было, но корпус был чистым, и я мог видеть, какое соединение было тем, которое обычно не подключается к клеммам.

Я прикрепил плоские клеммы на печатной плате к этим двум клеммам с помощью крепёжных винтов.

Примечание: не беспокойтесь, если вы ошибётесь. Просто подключите провода к другому набору клемм.

Шаг 9. Закройте корпус

Установите крышку на корпус и закрепите её крепёжными винтами.

Шаг 10. Закройте Zoom!

Чтобы использовать это, просто подключите его к USB-порту.

Когда вы будете готовы выйти с собрания в Zoom, просто нажмите кнопку.

Вот и всё.

Такая кнопка пригодится и на наших вебинарах, которые мы на регулярной основе проводим для наших студентов на всех курсах. На них менторы разбирают со студентами особо сложные темы, попутно отвечая на вопросы. Неважно, какое направление вы выберете Этичный хакинг, Data Science илиMachine Learning на каждом из них вы найдёте современную программу и внимательную службу поддержки.

Узнайте, как прокачаться в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Перевод Оптимизация рабочего процесса при помощи fzf

05.04.2021 12:20:40 | Автор: admin

Работа в оболочке включает в себя выполнение одних и тех же команд снова и снова; что меняется, так это порядок выполнения команд и их параметры. Один из способов упростить рабочий процесс найти паттерны выполнения команд с аргументами и обернуть их в небольшие скрипты. Такой подход часто оказывается полезным, сильно упрощая работу; другой способ оптимизации рабочего процесса понять, как добавляются параметры, и попробовать упростить сам ввод. В этом посте я расскажу о втором подходе.


Обычные параметры моего рабочего процесса имена файлов и ветвей git: если посмотреть на мою историю команд, окажется, что git я ввожу чаще всего; ручной ввод команд git сопряжен с трудностями и часто приводит к ошибкам, поэтому я не ввожу команды руками везде, где это возможно. В зависимости от команды может подойти автозамена по табуляции, и она может оказаться очень полезной, но удобна она не всегда. В этом посте я покажу, как в качестве альтернативы использовать fzf.

Базовая функциональность fzf очень проста: он читает строки из стандартного потока ввода и даёт пользователю интерфейс, чтобы можно было выбрать одну или несколько строк и вписать их в стандартный поток вывода. Вики-страницы этого инструмента содержат массу примеров эффективного применения fzf. Это прекрасный ресурс, я взял несколько функций оттуда в свой репертуар и пользуюсь этими функциями почти каждый день, но в своей работе вы можете обнаружить очень специфические процессы, которых нет в вики, тогда как автоматизировать их было бы полезно.

Чтобы показать, как я подхожу к процессам подобного рода, я расскажу о 4 задачах, с которыми обычно сталкиваюсь. Затем напишу функцию оболочки с fzf, которая сделает работу удобнее. Кроме того, я расположу эти функции в порядке возрастания сложности:

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

Последние версии функций, включая варианты для fish, вы найдёте на Github.

Активация виртуальных сред python

Переменные моих виртуальных сред python содержится в файле ~/.venv. Вот, что я обычно делаю, чтобы активировать одну из сред:

  • начинаю ввод source ~/.venv/;

  • чтобы запустить автозавершение, нажимаю <tab>;

  • выбираю среду по желанию;

  • добавляю bin/activate и нажимаю <enter>.

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

function activate-venv() {  source "$HOME/.venv/$(ls ~/.venv/ | fzf)/bin/activate"}

activate-venv-simple.bash(download)

Активировать эту функцию можно с помощью команды:

source activate-venv-simple.bash

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

В окне выбора fzf показывает несколько виртуальных сред; среда активируется, когда строка выбрана.

Меньшая проблема то, что, если выйти из fzf нажатием ctrl-d, скрипт упадет с такой ошибкой:

bash: /home/crepels/.venv//bin/activate: No such file or directory

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

function activate-venv() {  local selected_env  selected_env=$(ls ~/.venv/ | fzf)  if [ -n "$selected_env" ]; then    source "$HOME/.venv/$selected_env/bin/activate"  fi}

Удаление веток git

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

  • я начинаю ввод git branch -D;

  • нажимаю табуляцию, чтобы вызвать автозавершение;

  • выбираю ветку, которую, как мне кажется, можно удалить.

Иногда я не уверен в том, какую ветку действительно можно удалить. Сначала мне нужно запустить команду git log в этой ветке, чтобы увидеть, что она содержит, и затем удалить её, как показано выше. Затем процесс повторяется до тех пор, пока я не удалю все залежавшиеся ветки.

Этот рабочий процесс хороший пример того, как сильно fzf упрощает работу. В этот раз мы воспользуемся опцией fzf --multi, которая позволяет по нажатию табуляции выбрать несколько записей.

function delete-branches() {  local branches_to_delete  branches_to_delete=$(git branch | fzf --multi)  if [ -n "$branches_to_delete" ]; then     git branch --delete --force $branches_to_delete  fi}

После выполнения source delete-branches-simple.bash мы можем использовать этот код следующим образом.

 Удаление веток при помощи fzf Удаление веток при помощи fzf

Код в основном работает, но реализовать эту функциональность можно по-разному. Первый вариант git branch показывает все ветки, включая ту, в которой мы находимся, она отмечена звёздочкой (*). Поскольку нельзя удалить ветку, в которой мы находимся, то и показывать её смысла нет, так что мы можем опустить эту ветку, предоставив вывод git branch команде grep --invert-match

Ещё один способ: мы можем пропустить переменным $branches_to_delete без кавычек в git branch -D. Сделать это нужно потому, что git каждая ветка нужна как отдельный аргумент. Если вы пользуетесь линтером вроде shallcheck, эта строка ему не понравится, поскольку переменные без кавычек могут вызвать глоббинг и разделение слов. В нашем случае срабатывание будет ложным: ветка не может содержать символов глоббинга; тем не менее я думаю, что избегать переменных без кавычек, где это возможно, хорошая практика, и один из способов сделать это пропустить вывод fzf через xargs прямо в git branch -D, а не хранить этот вывод в переменной. Если в xargs добавить опцию --no-run-if-empty, git будет вызываться только в том случае, если была выбрана хотя бы одна ветка.

Наконец, я упоминал, что, чтобы увидеть выбранную ветку, полезно посмотреть на вывод git log. Сделать это можно при помощи опции --preview: значением этой опции может быть какая-нибудь команда, которая будет выполняться всякий раз, когда в fzf будет выбрана новая строка, и вывод будет показан в окне предварительного просмотра. Фигурные скобки в этой команде работают как плейсхолдер, то есть заменяются на текущую выбранную строку.

function delete-branches() {  git branch |    grep --invert-match '\*' |    cut -c 3- |    fzf --multi --preview="git log {} --" |    xargs --no-run-if-empty git branch --delete --force}

Также обратите внимание на то, что вывод git branch пропускается через cut -с -3, которая из каждой строки удаляет 2 пробела. Если посмотреть на вывод git branch, видно, что каждая ветка, за исключением текущей, имеет префикс в 2 пробела. Если их не удалить, команда в --preview будет такой: git log ' branch-name', что приведёт к жалобам git на лишние начальные пробелы. В качестве альтернативы используйте команду git log {..}, которая тоже удалит пробелы из выбранной строки.

Вот пример: мы удаляем те же три ветки, что и выше, но при этом получаем больше информации.

Поток fzf для удаления ветвей в окне предварительного просмотра. Показаны ветки и вывод git log. Ударение ветвей с помощью fzf улучшенная версия.

Локально заходим в пул-реквест

Когда делается код-ревью, полезно бывает переключиться в ветку кода, который вы просматриваете . Интерфейс командной строки от гитхаба упрощает эту задачу: можно просто выполнить в репозитории команду пр pr-checkout. Так вы окажетесь в ветке соответствующего пул-реквеста и уже локально. Но как узнать номер пул-реквеста? Вот что я обычно делал:

  • открывал пул-реквест в браузере;

  • читал номер в URL;

  • переключался на окно терминала и вводил gh pr checkout, а затем номер.

Этот подход работает, когда мы имеем дело с пул-реквестом в 1 или 2 цифры, но, даже когда цифры всего 3, иногда я переключаюсь на браузер, чтобы убедиться, что запомнил номер правильно.

В моём прошлом посте я уже рассказывал, как при помощи gh автоматически опрашивал api Github, чтобы узнать номер пул-реквеста. Вы можете воспользоваться запросом к api, который я показываю ниже:

gh api 'repos/:owner/:repo/pulls'

Этот запрос возвращает массив JSON-объектов по одному объекту на каждый пул-реквест. Нам нужно конвертировать этот массив в подходящий fzf формат по строке на пул-реквест. Если говорить о данных, которые нам нужны, первое это номер пул-реквеста, который мы хотим пропустить через gh checkout. Также нам нужен способ идентифицировать интересный нам пул-реквест, в этом смысле лучший кандидат его заголовок. Чтобы извлечь эту информацию из JSON, мы можем воспользоваться интерполяцией строки в jq.

gh api 'repos/:owner/:repo/pulls' |    jq --raw-output '.[] | "#\(.number) - \(.title)"'

Вот опция сырого вывода --raw-output, которая определяет строку JSON; без неё каждая строка данных будет окружена кавычками. К примеру, если я выполню команду pr checkout https://github.com/junegunn/fzf, она выведет эти строки:

#2368 - ansi: speed up parsing by roughly 7.5x#2349 - Vim plugin fix for Cygwin 3.1.7 and above#2348 - [completion] Default behaviour to use fd if present else use find.#2302 - Leading double-quote for exact match + case sensitive search#2197 - Action accept-1 to accept a single match#2183 - Fix quality issues#2172 - Draft: Introduce --print-selected-count#2131 - #2130 allow sudo -E env fzf completion#2112 - Add arglist support to fzf.vim#2107 - Add instructions on command for installing fzf with Guix and/or Guix System#2077 - Use fzf-redraw-prompt in history widget#2004 - Milis Linux support#1964 - Use tmux shell-command#1900 - Prompt generally signals that the shell is ready#1867 - add {r}aw flag to disable quoting in templates#1802 - [zsh completion] Expand aliases recursively#1705 - Option to select line index of input feed and to output cursor line index#1667 - $(...) calls should be quoted: \"$(...)\"#1664 - Add information about installing using Vundle#1616 - Use the vim-specific shell instead of the environment variable#1581 - add pre / post completion 'hooks'#1439 - Suppress the zsh autocomplete line number output#1299 - zsh completion: Add support for per-command completion triggers.#1245 - Respect switchbuf option#1177 - [zsh] let key bindings be customized through zstyle#1154 - Improve kill completion.#1115 - _fzf_complete_ssh: support Include in ssh configs#559 - [vim] use a window-local variable to find the previous window#489 - Bash: Key bindings fixes

Пропустив их через fzf, мы сможем выбрать какие-то из этих строк и записать их стандартный поток вывода. Нам интересен только номер запятой, так что извлечём его при помощи команды set регулярного выражения с захватом группы. 1-я работающая версия выглядит так:

function pr-checkout() {  local pr_number  pr_number=$(    gh api 'repos/:owner/:repo/pulls' |    jq --raw-output '.[] | "#\(.number) \(.title)"' |    fzf |    sed 's/^#\([0-9]\+\).*/\1/'  )  if [ -n "$pr_number" ]; then    gh pr checkout "$pr_number"  fi}

Попробуем его на репозитории fzf.

Поток fzf в окне выбора показывает заголовки пул-реквестов. Выбирая строку, мы попадаем на соответствующий пул-реквест.

В большинстве случаев этого, вероятно, достаточно. В блоге на гитхабе скрипт даже проще: он работает с выводом gh напрямую, но, чтобы определить нужный нам пул-реквест, заголовка может быть недостаточно. Нам поможет дополнительная информация. Например, в окне предпросмотра мы можем показывать описание пул-реквеста и иную информацию, которую мы можем получить с помощью запроса к api.

В этой функции мы удаляем ветки выше и заполняем окно предварительного просмотра с помощью вызова git log в выбранной ветви. Первой идеей может быть попытка попробовать то, что я уже показывал, то есть сделать запрос к api, чтобы получить информацию о выбранном реквесте. Но если мы выбираем разные ветви, то задержка запроса к api может начать нас раздражать, затрудняя работу. К счастью, запросы api нам больше не понадобятся: все нужные данные у нас уже есть: мы получили их, когда сделали первый запрос. Что нам нужно это дописать шаблон строки jq, чтобы извлечь всю нужную информацию и затем воспользоваться функцией fzf, которая позволяет спрятать информацию входящих строк в окне выбора и показать её в окне предпросмотра.

fzf рассматривает каждую строку как массив полей. По умолчанию поля разделяются последовательностями пробелов (табуляциями и пробелами), но мы можем управлять разделителем с помощью опции --delimiter. Например, если мы зададим --delimiter=',' и передадим строку first,second,third в fzf, то поля будут first,, second и third. Само по себе это бесполезно. Но с помощью опции --with-nth мы можем управлять полями в окне выбора. Например, fzf --with-nth=1,2 будет отображать только первое и второе поля каждой строки. Кроме того, мы видели выше, что можно написать {} в качестве плейсхолдера в команде предварительного просмотра и fzf заменит его текущей выбранной строкой. Но {} это простейшая форма плейсхолдера. Можно указать индексы полей в фигурных скобках, и fzf заменит плейсхолдер этими полями.

Вот пример, где мы используем как --with-nth, так и --preview, а <tab> играет роль разделителя.

echo -e 'first line\tfirst preview\nsecond line\tsecond preview' |    fzf --delimiter='\t' --with-nth=1 --preview='echo {2}'

fzf разбивает каждую строку по символу табуляции; опция --with-nth=1 указывает fzf показать первую часть в окне выбора; {2} в команде предварительного просмотра будет заменена второй частью, и так как она передаётся в echo, то просто отобразится.

Пример работы с полями в fzfПример работы с полями в fzf

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

function pr-checkout() {  local jq_template pr_number  jq_template='"'\'#\(.number) - \(.title)'\'\t'\'Author: \(.user.login)\n'\'Created: \(.created_at)\n'\'Updated: \(.updated_at)\n\n'\'\(.body)'\'"'  pr_number=$(    gh api 'repos/:owner/:repo/pulls' |    jq ".[] | $jq_template" |    sed -e 's/"\(.*\)"/\1/' -e 's/\\t/\t/' |    fzf \      --with-nth=1 \      --delimiter='\t' \      --preview='echo -e {2}' \      --preview-window=top:wrap |    sed 's/^#\([0-9]\+\).*/\1/'  )  if [ -n "$pr_number" ]; then    gh pr checkout "$pr_number"  fi}

Мы немного изменили эту простую функцию. Извлекли шаблон строки jq в переменную, а затем дополнили её информацией об авторе, времени создания пул-реквеста, времени его последнего обновления, а также его описанием . Всю эту информацию мы получили в объекте JSON. Ответьте на этот запрос к api гитхаба: gh api 'repos/:owner/:repo/pulls'.

Обратите внимание, что мы отделили новую информацию номер и заголовок символом табуляции \t. Символ табуляции используется также в качестве разделителя в fzf, затем мы показываем номер пул-реквеста и заголовок в окне выбора (при помощи --with-nth=1), а оставшуюся информацию показываем в окне предварительного просмотра (при помощи --preview='echo -e {2}').

Обратите внимание также, что на этот раз в jq мы не используем опцию --raw-output. Причина немного неочевидна. Строки, которые мы создаём с помощью jq, содержат экранированные символы новой строки. Если мы передадим опцию --raw-output в jq, она будет интерпретировать все экранированные символы, и, в частности, вместо \n отобразится именно новая строка. Вот пример, сравните выходные данные этой команды:

echo '{}' | jq --raw-output '"first\nsecond"'

и команды

echo '{}' | jq '"first\nsecond"'

первая выведет

firstsecond

А вторая вот такую строку:

"first\nsecond"

Первая версия проблематична. Помните, что fzf работает со строками, делает список строк, позволяя пользователю выбрать одну или несколько строк и вывести их. Это означает, что без опции сырого вывода каждый пул-реквест в fzf будет показан как множество строк. И это определённо не то, чего мы хотим. Поэтому позволим jq вывести escape-версию, чтобы гарантировать, что каждый пул-реквест это одна строка.

Однако такой подход вводит новые проблемы, первая мы по-прежнему хотим настоящие символы новой строки, а не символы \n. Эта проблема решается командой echo -e, которая включает интерпретацию escape-символов. Вторая проблема в том, что без опции сырого вывода jq в начале и в конце строки показывает символы кавычек и распечатывает наш разделитель, то есть табуляцию, как символ в escape. Эту проблему мы решим удалением кавычек в ручном режиме и заменой первого escape-символа \t на настоящую табуляцию. Именно это делается в sed после jq.

Наконец, обратите внимание, что мы определили опцию --preview-window=top:wrap, чтобы fzf оборачивал строки в окне предпросмотра и отображал их верхней части экрана, а не справа.

И вот как это выглядит в действии:

Создание веток для фич из проблем (issues) в JIRA

Мы видели выше, как использовать fzf для удаления ветвей git. Теперь давайте посмотрим на противоположную задачу создание новых ветвей. На работе для отслеживания проблем мы используем JIRA. Каждая ветвь функции обычно соответствует какой-то проблеме JIRA. Чтобы поддерживать эту взаимосвязь, я использую схему именования ветвей git, о которой расскажу ниже. Предположим, что проект JIRA называется BLOG, и сейчас я работаю над проблемой BLOG-1232 с названием Добавить в сценарий запуска флаг вывода подробностей. Я называю свою ветку BLOG-1232/add-a-verbose-flag-to-the-startup-script; описание обычно даёт достаточно информации, чтобы определить функцию, которой соответствует ветвь, а часть BLOG-1232 позволяет мне перейти к тикету JIRA, когда я ищу подробности о проблеме.

Вполне понятно, как выглядит рабочий процесс создания этих веток:

  • вы открываете issue из JIRA в браузере;

  • копируете номер проблемы или запоминаете его;

  • переключаетесь на терминал, начинаете вводить git checkout -b BLOG-1232/;

  • переключаетесь на браузер и смотрите на название;

  • переключаетесь на терминал и добавляете похожее на название в JIRA описание в kebab-cased.

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

И это ещё один рабочий процесс, который можно полностью автоматизировать. С проблемами в Jira можно работать так же, как мы работали с пул-реквестами, через API JIRA. Функция, которую мы напишем, подобна pr-checkout, но будет иметь несколько заметных отличий от неё.

Во-первых, от жира нет удобного инструмента, подобного gh, чтобы общаться с её api. Во-вторых, сервер (по крайней мере сервер, с которым работаю я) не разрешает создавать токены доступа, что заставляет меня при доступе к api использовать простые имя пользователя и пароль. Мне не хочется сохранить мой пароль в скрипте оболочки, а точнее, не хочется делать это в незашифрованном файле, поэтому, чтобы пароль хранился безопаснее, воспользуемся secret-tool. Наконец, создание имени ветки требует большего, чем простое извлечение текста; воспользуемся комбинаций cut, sed, и awk.

Давайте сначала посмотрим на скрипт, а потом попробуем понять, как он работает.

function create-branch() {  # The function expectes that username and password are stored using secret-tool.  # To store these, use  # secret-tool store --label="JIRA username" jira username  # secret-tool store --label="JIRA password" jira password  local jq_template query username password branch_name  jq_template='"'\'\(.key). \(.fields.summary)'\'\t'\'Reporter: \(.fields.reporter.displayName)\n'\'Created: \(.fields.created)\n'\'Updated: \(.fields.updated)\n\n'\'\(.fields.description)'\'"'  query='project=BLOG AND status="In Progress" AND assignee=currentUser()'  username=$(secret-tool lookup jira username)  password=$(secret-tool lookup jira password)  branch_name=$(    curl \      --data-urlencode "jql=$query" \      --get \      --user "$username:$password" \      --silent \      --compressed \      'https://jira.example.com/rest/api/2/search' |    jq ".issues[] | $jq_template" |    sed -e 's/"\(.*\)"/\1/' -e 's/\\t/\t/' |    fzf \      --with-nth=1 \      --delimiter='\t' \      --preview='echo -e {2}' \      --preview-window=top:wrap |    cut -f1 |    sed -e 's/\. /\t/' -e 's/[^a-zA-Z0-9\t]/-/g' |    awk '{printf "%s/%s", $1, tolower($2)}'  )  if [ -n "$branch_name" ]; then    git checkout -b "$branch_name"  fi}

В скрипте мы видим три части. Первая часть это команда curl, её переменные. Через них скрипт общается с API JIRA. Затем вывод api конвертируется строки формата, удобного для fzf; это часть скрипта такая же, как у pr-checkout. Наконец, вывод fzf конвертируется формат имени ветки.

Самые существенные изменения в сравнении с pr-checkout эта команда curl. Мы воспользовались конечной точкой поиска JIRA, которая в качестве параметра URL ожидает запрос на языке JQL. В моём случае меня интересуют все проблемы проекта BLOG, которые закреплены за мной, и те, что отмечены строкой In Progress. Строка запроса JQL содержит пробелы, знаки и скобки. Все они недопустимы в url, поэтому их нужно закодировать. Опция curl --data-urlencode автоматически закодирует эти символы. Поскольку в этой опции по умолчанию применяется запрос POST, чтобы переключиться на get, мы должны добавить опцию --get. Также воспользуемся опцией --user, чтобы сообщить curl, что нужно добавить заголовок базовой аутентификации. И последнее: добавим опцию --silent, чтобы опустить информацию о прогрессе выполнения и --compressed, чтобы сэкономить на пропускную способность.

Затем, чтобы конвертировать записи массива в JSON ответе в одну строку, воспользуемся той же техничкой, что и выше, разделив строку поиска в окне предпросмотра по символу табуляции и пропустив вывод через fzf, чтобы позволить пользователю выбрать запись. Вывод fzf будет строкой вроде BLOG-1232. Add a verbose flag to the startup script{...preview part}, чтобы удалить часть предварительного просмотра строки, воспользуемся командой cut. По умолчанию cut в качестве разделителя использует символ табуляции, а опция -f1 сообщает cut, что нужно вывести первое поле. Результат выполнения команды будет таким: BLOG-1232. Add-a-verbose-flag-to-the-startup-scrip. Затем команда sed заменит первую точку на символ табуляции, а все нечисловые и неалфавитные символы на -, сохранив при этом наши табуляции. И вот результат: BLOG-1232<tab>Add-a-verbose-flag-to-the-startup-script. Наконец, awk возьмёт строку, разделит её по табуляции, преобразует её вторую часть в нижний регистр и вернёт обе части символом косой черты в качестве разделителя.

 Создание новой ветки из проблем в JIRA Создание новой ветки из проблем в JIRA

Заключение

Я представил четыре типичных рабочих процесса оболочки и показал, как с помощью fzf их можно упростить. Полученные функции варьируются от простого однострочника до более сложных функций с вызовами API и нетривиальной логикой, но все они сокращают несколько шагов рабочего процесса до одной команды без параметров.

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

Узнайте, как прокачаться в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

Мнимая значимость

13.02.2021 22:06:51 | Автор: admin

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

Несмотря на то, что это искажение восприятия успешно эксплуатируется большую часть человеческой истории, широкая публика обратила на него внимание после суда над О. Джей Симпсоном, известным в России по роли в культовой комедии Голый Пистолет. На КДПВ он сбоку.

Во время этого процесса, адвокат убийцы, некий Джонни Кокран использовал приём, позднее названный Защитой Чубакки он заморочил головы присяжным, засыпав их множеством утверждений, вопросов и выводов, совершенно отвлечённых и не имеющих отношения к рассматриваемому делу.

Как это сработало?

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

Фактически Кокран загнал присяжных в тупик они не могли ни понять его, ни признаться, что не понимают. В результате, после короткого обсуждения, О. Джей был признан невиновным. И это-то при наличии совершенно неопровержимых улик.

После такой блистательной демонстрации, примененная Кокраном тактика защиты стала предметом общественной дискуссии, получив название Защита Чубакки взятого из посвященного Кокрану 214того эпизода мультсериала Южный Парк:

Чубакка это вуки с планеты Кашиик, но Чубакка живёт на планете Эндор. Подумайте об этом, в этом нет смысла! С чего бы вуки ростом два с половиной метра жить в Эндоре с 60-сантиметровыми эвоками? В этом нет смысла!

Но что ещё более важно, вы должны спросить себя, а при чём тут данное дело? Да ни при чём, леди и джентльмены, это не имеет никакого отношения к данному делу. В этом нет никакого смысла!

Взгляните на меня, я адвокат, защищающий крупную звукозаписывающую компанию, и я веду речь о Чубакке. Какой в этом смысл? Леди и джентльмены, я несу бессмыслицу, во всём этом вообще нет смысла!

Итак, запомните, когда вы, сидя в этой комнате, взвешиваете и сопрягаете Декларацию независимости, есть ли в этом смысл? Нет, в этом нет смысла!

Итак, леди и джентльмены, если Чубакка живёт на Эндоре, вы обязаны вынести оправдательный приговор. Спасибо, ваша честь, я закончил.

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

Всё непонятное на самом деле логично делает вывод школьник. И успокаивается.

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

Именно поэтому Защита Чубакки настолько эффективна: достаточно уверенным голосом сказать что-то непонятное, и большинство слушателей решит, что ты прав как толковый словарь. Увы и ах.

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

Пользуясь этим нехитрым приёмом Даша прослыла в школе без малого юным гением, завоевав признательность и любовь учителей. Она ездила на олимпиады, слеты, конференции совершенно не имея профильных знаний. Брала интервью, беседовала с учеными и писателями, которые не замечали подвоха, искренне хваля Дашу за бойкость ума.

Окрыленная этим успехом, Дарья перепорхнула в универ, где этот приём не работал. Вот вообще там преподавали зубры, кушавшие подобных гениев на завтрак. Весь первый год Дарья рыдала до, во время, и по итогам сессий. Потом как-то выровнялось.


Узнав про Защиту Чубакки, я начал видеть её во всем в речах политиков, в научных статьях, в художественной литературе

Особенно в художественно литературе. Рассмотрим последнее чуть подробнее: мне, как литератору это близко. Вот например, читая роман канадского писателя-фантаста Питера Уоттса Ложная слепота (англ. Blindsight) я был весьма удивлен культовый статус этого романа в России никак не соответствовал его популярности на родине.

Конечно, такое уже бывало раньше: Гор Видал, помнится, как-то заметил что Романы Курта Воннегута сильно проигрывают в оригинале... намекая на то, что переводчица Курта, блистательная Рита Райт-Ковалева, владеет русским заметно лучше, чем сам автор английским.

Конечно, здесь присутствует известная доля шутки Воннегут и без Риты хорош. Но, только доля известны довольно слабые, проходные романы, ставшие лучше, за счет перевода, сделанного мастерами слова. Самый известный пример переведенные братьями Стругацким Саргассы в космосе средняя, в общем-то, повесть бабушки Нортон и сейчас читается с удовольствием.

Но в случае Питера это объяснение не проходило перевод Даниэля Смушковича, особенно его первая редакция, был просто ужасен, напоминая, порой, перегруженный научными терминами бессвязный набор слов.

Именно это, по-моему, сыграло главную роль в обретении популярности массовый читатель ничего не понял, но на всякий случай восхитился. Так автор студеного вакуума стал в России научным фантастом 1. Иган с Тедом Чаном нервно курят в сторонке.

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

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


Что сказать в заключение? С Защитой Чубакки очень сложно бороться. Действенное, аргументированное возражение всегда базируется на оспариваемом высказывании. Поэтому держите лайфак: Никто не сможет вам логично возразить, если в ваших словах не будет логики.

Но, не всё так безнадежно: столкнувшись с Защитой Чубакки смело используйте против Тактику Гризли!.

Как известно, медведи гризли самые опасные хищники в канадских лесах. От них просто нет спасения. Если вы побежите, гризли побежит ещё быстрее. Если вы броситесь в воду, гризли бросится в воду вслед за вами. Если залезете на дерево, гризли полезет вслед за вами... И самое страшное: от гризли невозможно спрятаться. Если он заметит, что вы спрятались, то он тоже спрячется!

Поэтому смело повышайте градус абсурда дискуссии! Если вас уверяют, что американцы никогда не было на Луне начинайте с пылом утверждать что Луны не существует! Не надо себя ограничивать рамками логики и здравого смысла. Всё равно, большая часть слушателей не следит за доводами, делая выводы о правоте по блеску в глазах и уверенности речи. Потренироваться в этом вы сможете в следующую субботу, которая будет посвящена Лунному Заговору.

Сцена после титров

Сцены после титров, увы, не будет. Будет просьба у меня в "Прыжках через огонь" герой учится в Чапел-Хильском Университете Северной Каролины и я был бы признателен за ссылки на книги или блоги, рассказывающие о бытности американских студентов как организован процесс обучения, проживания и прочего.

Подробнее..

Почему я провожу асинхронные собеседования (в чате)

01.07.2020 12:12:44 | Автор: admin
Конечно, не все, только первые собеседования и только с программистами (в свой стартап). С теми, кто прошел интервью в чате успешно, обязательно устраиваю живой разговор. Но первое интервью в чате это оказался такой простой и полезный лайфхак, что грех не рассказать подробно.

Асинхронные собеседования в чате

Немного контекста. У меня два проекта: Kotlin в компании JetBrains и наш с Олей Китаиной стартап Alter. Оба требуют внимания, времени реально не хватает. Чтобы времени стало больше, надо найти в Alter лид-девелопера, чтобы постепенно передать ему/ей команду и всю разработку. Но времени-то уже нет :) Так что собеседования были серьезной проблемой, пока я пытался проводить их как делал всегда раньше созваниваясь по видео, то есть синхронно. Со временем была главная сложность, но она, конечно, не единственная при синхронном собеседовании.

Проблемы синхронных собеседований


Важно понимать, что я не против проведения собеседований вживую или по видео. Я просто хочу рассказать о том, какие с этим есть проблемы:
  1. Я должен выделить 30-45-60 минут времени заранее.
  2. Собеседование приходится откладывать до той даты, когда у нас обоих совпадет свободное время.
  3. Все время собеседования я должен следить за мыслью кандидата, но надо прерываться, пока кандидат думает.
  4. Если на пятой минуте становится понятно, что кандидат не подходит, неудобно так вот резко заканчивать разговор (особенно, если кандидат потратил время, чтобы приехать в офис).
  5. Кандидаты, как правило, нервничают, и надо делать какие-то поправки в духе ну, это он сказал, потому что волновался или ну, ей просто неудобно было долго молчать, раздумывая, вот она и сказала то, что быстрее придумала.
  6. Кандидат сильно ограничен по времени решения задачи, потому что нам надо все успеть за 30-45-60 минут.

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

Не надо выделять время заранее


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

Не надо откладывать собеседование


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

Не надо напряженно следить за развитием мысли кандидата


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

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

Нет проблемы закончить быстро


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

Кандидаты меньше нервничают


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

И мне не надо делать поправок вроде ну, это из-за стресса ошибка, ну или по крайней мере мне кажется, что такой стресс уже сравним со стрессом я только что уронил_а продакшен, надо срочно починить! то есть с более-менее нормальной рабочей ситуацией :)

Кандидату не надо торопиться


На асинхронном интервью я не ставлю ограничения по времени на решение задачи. Если кандидат придет через неделю, это будет странно, и я спрошу, в чем дело, но в целом мне это не важно. Я в целом не особо верю в решение задач на скорость. Смысл первого интервью быстро отсеять тех, кто не подходит по базовым знаниям.

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

Недостатки интервью в чате


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

Из очевидного:
  • Не понятно, каково с человеком будет общаться на работе,
  • Строго говоря, не известно, кто пишет ответы (я могу себе представить, что кто-то реально будет спрашивать совета у друзей на таком интервью, хотя это чистой воды трата времени своего и моего),
  • Далеко не любые задачи можно дать и далеко не все навыки/знания проверить.

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

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

Заключение


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

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

HR-автоматизация за один день как экономить 8 часов в неделю на рекрутинге

15.12.2020 18:16:33 | Автор: admin
Привет, Хабр. Меня зовут Шагане Мирзоян, я отвечаю за продуктовую аналитику в СберМаркете. Мы с командой следим за тем, что происходит с нашим пользователем на сайте и в приложении, и ищем в этом процессе точки роста. Сегодня я расскажу, как мы пережили рост сервиса в 15 раз за 2020 год, а рост команды с 6 до 29 человек за 6 месяцев.

Процесс найма аналитиков исторически отличается от других отделов. Например, собеседование с HR у нас финальный шаг. При передаче кандидатов на этот этап я регулярно отдаю список консернов, которые остались у меня по итогам предыдущих встреч. Этот этап, как и сбор рекомендаций, полезен долгосрочно. Насте комфортнее работать в режиме небольшой гонки, а для Наташи критично соблюдать личные границы это вы можете узнать не по итогам нескольких недель и ошибок, а услышать от предыдущего руководителя или профессионального HR.

Почему у нас нет стартового собеседования с рекрутером? Обычно такие нужны при поиске ребят младших позиций и призваны для того, чтобы отобрать самых классных. Мы решаем эту задачу иначе и отбираем самых мотивированных ребят тестовым заданием, которое помогает экономить время HR и ускорять подбор. Так ни нам, ни кандидату не придется ожидать свободного слота в календаре менеджера по персоналу.

Если все так классно, то к чему вообще это статья? Когда ты быстро растешь, то рискуешь так же быстро терять отклики из-за плохо отлаженных процессов. Это случилось и с нами. Под катом рассказываю, как мы решили эту проблему с помощью простой автоматизации.





Раньше процесс подбора новичков был устроен просто. Отклики летели на нашу общую почту команды. На первый взгляд это отличное решение:

  • Все в одном месте.
  • Любой член команды аналитики может просмотреть CV и дать фидбек.
  • Push-уведомления при новых откликах мы всегда в курсе, что происходит.
  • Когда в команду требуется 2-3 новых члена в год, это очень удобно. Но если количество коллег растет по экспоненте (в какой-то момент мы стали получать по 1000 писем в неделю), общая почта сплошной бардак
  • Отклики на разные вакансии перемешиваются (теперь все в одном месте не такой уж и плюс).
  • Google очевидно завидует вашему кратному росту и ругается, когда в аккаунт пытаются зайти с десятка разных устройств. В итоге получение доступа к почте становится квестом.
  • Кто-то может случайно открыть чужое письмо и отклик потерян, а по ту сторону экрана грустит расстроенный кандидат.




Просуммирую: так историю изменений непросто найти, а кандидатов легко потерять. Хочется, конечно, наоборот.

Автоматизация на коленке


Решить проблему нам помогли два облачных сервиса: конструктор баз данных Airtable и Zapier, клей для наших костылей. Если вы зерокодер, то вы наверняка про них слышали.

В Airtable можно создать view по определенным условиям, например, показать только те записи, которые были созданы вчера. Zapier умеет в качестве триггера принимать появление новой записи в отдельном view. Таким образом, мы можем построить цепочку Если произошло событие Х, то нужно сделать действие Y.
Кастомизировать эти истории под себя можно сколько угодно этим мы и занялись. Теперь у нас появилась своя CRM-ка с кандидатами. Соискатели и их тестовые задания лежат в одном месте с привязкой к вакансии и статусу. Отклики приходят не на почту в Google, а в таблицу, как и любят все аналитики :). Бонусом буквально в пару кликов с помощью такого же принципа можно настроить пуши в Slack. Это помогает нам следить за прогрессом и вовремя отвечать соискателям. Бот тэгает только ownerа вакансии и не отвлекает остальных членов команды.

Airtable стал рабочей средой, в которой мы управляем наймом: держим все тестовые задания, контакты и имена, ведем резерв кандидатов и видим открытые вакансии. Zapier помог с переадресацией писем и автоматической отправкой заранее написанных ответов. Их, кстати, можно персонализировать, но об этом ниже.



Как это выглядит на примере воронки джуна



  1. Общая форма для всех вакансий. Кандидат выбирает, на что хочет откликнуться, пишет короткое сопроводительное письмо, прикрепляет CV.
  2. Ответ после отклика уходит автоматически это красивое сверстанное письмо с приветствием, ссылкой на тестовое и кнопкой отправить работу. Ссылка на задание вставляется динамически и может отличаться для разных вакансий. Кнопка с сабмитом тоже хитрая, об этом ниже.
  3. В Airtable появляется карточка со всеми данными по отклику.
  4. В наш канал в Slack падает уведомление о новом кандидате и тегом owner-а вакансии (я знаю, что вы уже догадались, что тег тоже подтягивается динамически). В один клик мы можем получить об отклике всю доступную информацию.




Фронт и бэк откликов :)

5. После того, как кандидат сделал тестовое, он отправляет его через форму из письма. Тестовые задания лежат в другой таблице, но мы научились связывать их с помощью prefill_ тегов в URL, которые заботливо добавляем кандидатам в адрес формы на шаге 2.



Для каждого отклика у нас есть SLA-отбивка. Например, мы обещаем вернуться с фидбеком на тестовое задание в течение трех рабочих дней. Мы создаем ожидания у кандидатов и должны им соответствовать, поэтому в тот же Slack приходят автоматизированные алерты для ownerа вакансии, если тот опаздывает с ответом Оговорюсь, что иногда мы все-таки факапим: теряем кандидатов или отвечаем позже обещанного срока. Здесь всегда есть человеческий фактор, но автоматизация позволила значительно его снизить и ошибаться реже.

Оговорюсь, что иногда мы все-таки факапим: теряем кандидатов или отвечаем позже обещанного срока. Здесь всегда есть человеческий фактор, но автоматизация позволила значительно его снизить и ошибаться реже.



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



Результат 8 свободных часов в неделю



Это достаточно усредненная цифра. Она зависит от вашего количество откликов, но оценить его просто. Минимум 5 минут с каждого отклика уходит на переключение контекстов и интерфейсов (со вкладки с тестовым кодом в gmail, с отвеченного письма на неотвеченное и так далее). Когда у тебя 100 тестовых заданий, эти минуты превращаются в часы.

Сама автоматизация заняла у нас часов пять. Если вы никогда не работали с Airtable и Zapier, знакомство с функционалом займет у вас еще день или два. В общем, у вас есть все вводные, чтобы оценить возврат инвестиций от этой затеи и принять решение о том, нужна ли вам такая автоматизация.

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



Для этого поста мне даже не пришлось считать воронку. Все можно сделать силами того же Airtable

P.S.
А ещё мы продолжаем расширять команду Data & Growth СберМаркета и ищем новых коллег! Наши вакансии:

Middle Product Analyst
Middle/Senior DS на персонализацию сервиса
Marketplace Efficiency Analyst
Junior Finance Analyst
Middle Finance Analyst
Подробнее..

Устанавливаем кастомную раскладку на klava.org

15.01.2021 22:23:38 | Автор: admin

Что будет рассказано?

  • Очевидная проблема при изучении своих клавиатурных раскладок

  • Немного о нашем пациенте: klava.org

  • То, как получилось решить данную проблему (спасибо F12)

  • Как правильно настраивать клавиши (при нажатии Shift или AltGr)

  • Автоматизация ручного труда с помощью расширения User JS and CSS

То, с чего всё началось

Когда мы изучаем десятипальцевый метод, для ускорения обучения мы используем различные тренажёры: typingStudy, klava.org, ratatype, rapidTyping и другие. Однако, когда встаёт вопрос об освоении своей особенной, кастомной, раскладки, то "оказывается", что ни один сайт, ни одна программа не предусматривает их существование:

  • В списке поддерживающихся раскладок, своей "конечно же" нет

  • В настройках свою добавить невозможно

  • Самому писать тренажёр - трындец полный

В качестве пациента я выбрал сайт klava.org: неплохой визуал, клавиатура на экране есть, пальцы показываются, разные режимы, ОК. Изначально на сайте есть весьма неплохой список раскладок для русского и английского языков, но нет кучи других, не менее интересных раскладок (да и разработчиков сайта нет смысла судить: раскладок куча, плюсом завтра может появиться новая -> всем не угодить).

Откапываем словарь с раскладками

Как многие из вас знают, есть нажать F12, то выскочит "волшебная" панель с HTML-кодом, CSS, JS, файлами, которые можно без проблем редактировать, и многим другим функционалом, необходимым для разработчиков. Если немного порассуждать, то можно прийти к следующему предположению:

Если сайт писали хорошие ребята, то скорее всего абсолютно всё: расположение символов на экране, автоматическая подсветка нужной буквы/клавиши, отрисовка, будет зависеть только от одного источника: словаря/массива/списка, соответственно, нужно найти тот самый словарь и расположить всё по-своему!

И, да, заветный словарь был найден! В JS этот "словарик" описан одной переменной keyboards. Там ооочень много кода и он, как назло, весь минимизирован, но разобраться можно. Найти этот код достаточно просто:

  1. Жмём F12

  2. Прожимаем Ctrl+F (появится поле для ввода)

  3. Вводим "var keyboards"

  4. Копируем словарик в блокнот (слово var удалите, оно нам больше не понадобится)

  5. Словарь полностью в нашем расположении!!!

Ставим кастомную раскладку вместо ненужной

Теперь нужно подобрать "жертву" - ненужную раскладку, которую будем редактировать. После этого её нужно отыскать (берём название из сайта и не забываем про Ctrl+F). В итоге, получаем массив строк, который нужно обработать: машинописть например выглядит так:

//название раскладки в процессе редактирования менять нельзя!!!'машинопись': ['|<sup>+</sup>', '<sup>1</sup>', '-<sup>2</sup>', '/<sup>3</sup>', '"<sup>4</sup>', ':<sup>5</sup>', ',<sup>6</sup>', '.<sup>7</sup>', '_<sup>8</sup>', '?<sup>9</sup>', '%<sup>0</sup>', '!<sup>=</sup>', ';<sup>\\</sup>', 'Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Х', 'Ъ', ')<sup>(</sup>', 'Ф', '', 'В', 'А', 'П', 'Р', 'О', 'Л', 'Д', 'Ж', 'Э', 'Я', 'Ч', 'С', 'М', 'И', 'Т', 'Ь', 'Б', 'Ю', 'Ё']

Теперь поясню, что здесь происходит:

Строки, где находятся только заглавные буквы, это обычные символы, система с ними всё сама сделает (просто нажали - прописная буква, нажали Shift - заглавная). В остальных местах присутствуют знакомые HTML-теги: в такой строке следующие правила.

  1. Самый первый символ, символ, который вводится без Shift или AltGr, то есть, просто нажатие

  2. Внутри тегов <sup></sup> находятся символы, которые вводятся при нажатом Shift; символы отрисовываются сверху

  3. Внутри тегов <sub></sub> находятся символы, которые вводятся при нажатом AltGr; символы отрисовываются снизу

'S'       //просто буква, и так всё понятно'(<sup>{</sup><sub>[</sub>' //нажатие ->  (                            //+ Shift ->  {                            //+ AltGr ->  ['ь<sup>ъ</sup>'   //разные буквы тоже можно

Отредактировали? Заменили? Теперь осталось протестировать.

  1. Отрываем сайт

  2. Жмём F12

  3. Открываем Console

  4. Вставляем наш "модифицированный код" (надеюсь var удалить не забыли)

  5. Жмём Enter

  6. Если всё сделано правильно, то сообщений об ошибке не будет

После этого закрываем панельку, выбираем нашу "жертву" и ЧУДО!!! кастомная раскладка работает (вот, что у меня получилось):

Автоматизация

Всё-таки при каждом входе на сайт не хочется каждый раз вручную вставлять этот код. Для решения этой проблемы было создано расширение под названием User Javascript and CSS. Ставим расширение. После уставновки открываем наш сайт, жмём на иконку расширения и жмём Add new. Перед вами откроется 2 поля: JS и CSS, теперь остаётся вставить наш код в поле JS, сохраниться, проверить флажок и кайфануть, что всё работает "само".

Ура!!!! Вы установили свою кастомную раскладку на сайт klava.org. Теперь тренить свою раскладку будет проще, быстрее и (наверное) интереснее.

Подробнее..

80 бизнеса построено на обмане под названием Личный бренд

12.01.2021 14:15:46 | Автор: admin

А знаете, Стив Джобс начал свой грандиозный бизнес,имея только паяльник и гараж! Ну, у нас так многие начинали... Да, и утюг еще.

Анекдот из 2000-х

Источник: pexels.comИсточник: pexels.com

Маньяки которые всегда рядом

  • Почему о психологии маньяков больше книг, чем о психологии бизнесмена?

  • Что психиатры находят общего в психологии бизнесмена и маньяка?

  • Как критично оценить себя и какие экспресс методы существуют?

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

Не сплетничаю, не ищу недостатки в миллионерах, чтобы поднять самооценку, но расскажу о моем старом знакомом ну о-о-очень богатый человек. Невозможно отрицать, что он талантище со стратегическим видением, но при этом редчайший @@дон. Все его бизнес-партнеры умерли или были убиты. Жену взорвали направленным взрывом. Разумеется, все случайно и ничего не доказано. Сегодня же этот бизнес @#асна вершине славы. Он не только считает себя очень приличным человеком и душкой, он просто убежден в этом.

Да, не убий! Убьёшь везде найду, мол.В. Высоцкий

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

В 500 м от моего офиса есть старинная тюрьма Белый лебедь, где отбывают пожизненное заключение самые опасные преступники. Без исключений, они все считают себя очень приличными людьми. Например маньяк Каспарс Петров (38 жертв), душил старушек и сегодня уверен, что действовал во благо. Другой рижский маньяк Станислав Роголев (10 жертв) имеет аналогичное мышление.

Даугавпилс. Тюрьма "Белый лебедь". Источник: www.rus.tvnet.lvДаугавпилс. Тюрьма "Белый лебедь". Источник: www.rus.tvnet.lv

Даже самый известный миру маньякАндрей Чикатило(32 жертвы) был уверен в своей большой порядочности. Послушать его последнее слово или письма почитать да это же ангел во плоти! Однако Чикатило не только насиловал детей, но и ел их плоть. При этом стоит отметить, что эти и другие маньяки признаны психически здоровыми.

Психология маньяка это большая тема для рассуждений. Диссертации изданы, научных книг написано множество, не говоря уже о фильмах. В классическом триллере профессор и маньякГаннибал Лектер, в исполнении Энтони Хопкинса, ест части тела жертвы и угощает еще живую жертву этим блюдом. После этого вышло множество фильмов о других маньяках.

Иркутский маньяк-рекордсмен Михаил Попков (минимум 81 жертва). Как и у других маньяков, с фото смотрит дядя с очень добрыми глазами.

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

Тест: маньяк или бизнесмен

Давайте проведем небольшой тест. Уверен на 100%, многие знают имя этого приличного одного из самых известных в мире людей.Сможете ли вы угадать его имя с трех нот.

Источник: www.habr.comИсточник: www.habr.com
  • Он из семьи безграмотного сирийского беженца и вырос у приемных родителей.

  • Он принимал ЛСД и называл этот наркотик одной из двух или трёх самых важных вещей, которые он совершал в своей жизни до принятия духовного сана.

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

  • Этот человек обманул своего ближайшего друга и уволил его. Воровал чужие идеи не только у конкурентов, но и у своих коллег. Сначала идея отвергалась им, а через некоторое время якобы рождалась в его голове и уже казалась ему гениальной.

  • Он кричит на подчиненных и часто плачет, если что-то не получилось. Он фанат iPhone и увольняет подчиненных за то, что они неправильно держат телефон в руке. Он угрожает своим подчиненным за попытку уволиться. Иногда, гуляя по офису, увольняет сотрудников в случайном порядке. Его работников избивали и пытали. Только на одном объекте два десятка сотрудников покончили жизнь самоубийством в течение года.

  • Всегда занимал на парковке места для инвалидов.

  • Отказался признавать свою дочь, несмотря на доказательный анализ ДНК.

  • Он получал зарплату 1$, но де факто являлся преступником, подлежащим тюремному наказанию за вывод на свои счета денег задним числом из фирмы. Также он всеми способами уклонялся от уплаты налогов и выводил деньги из страны в офшорные зоны.

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

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

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

Если ты не узнал этого милого парня даже по фотографиям, то еще пару штрихов и ты точно угадаешь этого гения:

  • Он сказал врачу-пульманологу, который надел на него маску, спасая его от смерти, что тот урод и защитная маска у него с плохим дизайном.

  • Позже он устроил кастинг из 70 санитарок и медсестёр для вытирания его царственной задницы.

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

  • Он считал себя самым умным и поэтому отказался от лечения и начал заниматься самолечением и альтернативной медициной, что ускорило его кончину в возрасте 56 лет.

Скажите, как его зовут? Бу

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

Стиву Джобсу всегда нравились яблоки. Источник: www.liberoinvest.comСтиву Джобсу всегда нравились яблоки. Источник: www.liberoinvest.com

Советую к просмотру документальный фильм Steve Jobs: The Man In The Machine.Трезвый взгляд и развенчание гениальности Калигулы. Тиран и придурок такой вердикт о герое нашего времени устами его друзей и коллег.

Особо впечатляет эпизод, в котором незадолго до смерти, пойманный на незаконных операциях гений, дает показания. Он нервно ёрзает на стуле, куксится и бросает злобные взгляды на судей. Дальше оправдывается как обиженный ребенок: Дело было не совсем в деньгах. Просто всем хочется быть признанными коллегами. А мне казалось, что ничего подобного со стороны совета директоров я не получаю.

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

Яблофаг

Кажется, мак-наци так называют фаната яблочной продукции. Тот факт, что ты яблофаг, может говорить о многом. Я тоже давно возлюбил MаcBook Air и iPhone. В моей семье этот вирус передался буквально всем. Поэтому в первую очередь эта история-расследование обращена на меня же и не имеет пагубных целей.

Да, психология айфониста отличается от психологии андроидоведа. Они/мы думаем несколько иначе и имеем разную мотивацию в своих поступках. Например, мы больше склонны делать внутренние покупки в аппликациях. Мы больше (иногда в разы) тратим денег в App Store, чем наши коллеги спускают в Google Play. Знаю это не понаслышке: запускал свои собственные аппликации и в iPhone и в Android. Это дико интересно и полезно узнать, особенно при планировании рекламных кампаний. Чуть позже поделюсь этими сакральными знаниями.

Источник: www.yablyk.comИсточник: www.yablyk.com

Однако я вернусь к прерванному повествованию и задам себе еще несколько вопросов. Смог бы человек без высшего образования создать, например, теорию относительности или периодическую систему элементов? Почему я не знаю таких примеров в мировой истории?

Какой тип управленца мог сформироваться из человека, который вместо книг по маркетингу и менеджменту читал труды восточных философов, вместо семинаров и лекций посещал Гималаи, вместо студенческого кампуса проживал в коммуне хиппи, а вместо преподавательских лекций выслушивал наставления дзен-гуру? Кто бы доверил такому кришнаиту управление своей фирмой? Я бы не доверил. Думаю, что ты тоже.

Образование? Эмм, никакого, но ведь и Джобс построил империю с нифига! А че нет? Коллеги, у нас новый директор! Мы произведем фурор!

Никто в трезвом уме не доверил бы управление даже отделом HR типу, задающему свои любимые извращенные вопросы: Принимали ли Вы когда-нибудь ЛСД? Когда Вы потеряли невинность?. Ларчик открывается просто:каждый компьютер, разработанный Джобсом, был провалом. Так говорил Стив Возняк, партнер гения по бизнесу. Не раз фирма переживала не лучшие времена и была на волоске от гибели. И в этой фантасмагории нашелся бизнес-ангел с образованием и деньгами, кто взялся богадельню привести к благоденствию. Звали этого дядюМайкл Марккула. Он также договорился о сотрудничестве с другими опытными специалистами. При желании вы можете найти этому подтверждениездесь.

Однако как компании удалось достичь такого уровня продаж? О классических рекламных яблочных трюках можно написать бестселлер. Доходило до жуткого абсурда, когда после IPO Apple Рокфеллер пригласил к себе на вечеринку топ-менеджеров Apple. В следующем году попрошу не клеить свои логотипы на зеркала в туалете, сказал на следующий день Рокфеллер. Партизанские методы и стратегия нагнетания всеобщей истерии обеспечивает более высокие продажи, чем спокойная и размеренная работа отдела продаж. Яблофаги умело раздувают искусственный ажиотаж вокруг своих гаджетов, вводя покупателей в заблуждение и нагло обманывая их.

Тайна за семью печатью

Как истинный#$@еб в 2011 году (год Его смерти) я в Нью Джерси стоял в очереди в Apple Store в Garden State Molls за новой моделью телефона. Однако новые телефоны на мне закончились. Поэтому я, дурилка картонный, купил телефон с рук с переплатой. На следующее утро я увидел в очереди в тот же Apple Store все тех же людей! Подставные, подумал я, и не ошибся.

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

Мое знакомство с Garden State Molls. Автор - Олег ГущинМое знакомство с Garden State Molls. Автор - Олег Гущин

Этому спектаклю для развода лохов 2,5 тыс. лет. Так делали клакёры еще в древнегреческом театре.Клакерство(не путать с клоакой) это настоящий институт и обычная практика обмана публики. В труппе шекспировского театра клакёров было больше, чем артистов. И сегодня в Большом театре действует труппа разводящих на смех, слезы, любовь, аплодисменты, овации поспециальному тарифу.

Разумеется, такой же цирк с конями триумф с овациями, со слезами на глазах состоялся недавно на премьере оперы The (R)evolution of Steve Jobs о жизни Стива Джобса. Прошла премьера в крупнейшем мировом зале Santa Fe Opera. Как водится, спрос был настолько высок, что люди стояли в очередях за билетами и покупали их у перекупщиков. Смотреть, слушать, любоваться и наслаждаться оперой можнотут.Писакам и блогерам, кто говорит про постановочный ажиотаж и Клакерство, быстрозатыкают рты.

Ничего личного, просто бизнес! К сожалению, именно так создаются империи на обмане простаков. И поэтому надкусанное яблоко сегодня это самый дорогой бренд в мире, а компания входит в ТОП-3 самых дорогих фирм мира. Акции продолжают рост (300% за последние пять лет, в том числе за счет полу-мошеннической схемы обратного выкупа акций). Финансовой гений Уоррен Баффетвложился в акции Apple аккурат в разгар пандемии в 3-м квартале 2020 года. Стоимостьпакета акций Баффетавыросла с $89 до $109 (разумеется, миллиардов).

Ну скажите на милость, каким х@#$пандемия не прошла бесследно ни для одной компании мира. Однако продажи Apple продолжали расти в течение всех пандемических кварталов. Рождество, новый год, начало 2021 да этопросто праздник какой-тодля Apple! Тут, грешным делом, поверишь в оккультизм и масонство Стива (2) Возняка, о чем прямо в английской Wiki писали.

Уоррен Баффет. Крупнейший в мире инвестор. Автор неизвестенУоррен Баффет. Крупнейший в мире инвестор. Автор неизвестен

Двуликий Баффет это отдельная история, о которой я расскажу обязательно. И про укулеле Уоррена, и про легенду для медиа. Также есть чему научиться у этого дедули из высшего ТОП миллиардеров (91 год пошел ему).

Стива давно возвели в ранг бога. Магазины часто напоминают церкви, и это отнюдь неспроста. Он назначен пророком созданной религии. Он протягивает надкусанное яблоко и говорит: Верь мне!. И я ем и верю, и люблю свой айфон.

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

Уровень Личного Бренда Джобса был и остается на столько сильным, что он мог говорить все, что угодно в университетах, в интервью, на собраниях, его слушали как загипнотизированные. На создание имиджа Великого Гения Современности ушли десятилетия, а люди по сей день привержены к продуктам Apple не только потому, что это хорошие и стильные вещи, но и потому, что хотят прикоснуться к (уже ушедней) Легенде и вроде как стать ее частью.

ЗАКЛЮЧЕНИЕ

  • Верить в наше время нельзя никому, даже себе. Мне можно! Когда ты видишь миллиардера/миллионера, ведущего видеоблог о бизнесе не верь. Половина брехня, вторая половина самолюбование. Намедни любовался на видео 3-х таких наших красавцев. Потом слушал реальные отзывы простых работников завода о лютом @#деце,который там в реальном времени творится. Знай, чем больше у него ху@#ардов,тем больше лапши в своем видео он принесет тебе и собьет с пути истинного фак(т). Поэтому самым важным навыком для каждого человека является умение критически мыслить, анализировать и сравнивать информацию, чтобы докопаться до истины.

  • Стоит отметить и тот факт, что в основном почитатели продукции старины Джобса, например я, думают не так, как думают почитатели других марок. Исходя из этой разницы в мышлении, маркетинг создается совсем иного толка, вида и плана. В чем эта разница ты без труда найдешь на просторах интернета или я чуть позже расскажу.

  • Самый главный вывод, который вы можете вынести из данной статьи осознание того, что люди в большинстве своем не критичны к себе. Будь то серийный маньяк или миллиардер, учитель или психолог, полицейский или спортсмен Если бы они знали, как выглядят со стороны, они бы @#!@лись (некоторые перевернулись бы в гробу). Проблематично оценить себя самостоятельно, так же как не простоМюнхгаузенувытащить себя самому из болота за волосы. Мюнхгаузен справился с той задачей, и вытащил не только себя, но и коня своего: Мыслящий человек просто обязан время от времени это делать!.

Чтобы о себе узнать правду, существуют специальные агентства, например, контрольная закупка. Нечто похожее для владельцев фирм разработано в методикеDMS-2025, которую я сам проходил. По этой методике я не джокер и даже не туз в коммуникативном плане. Да уж, не совсем таким я себе казался, и теперь понимаю с чем мне предстоит поработать.Благодарю тебя, дружище, что смог дочитать. Повышенная благодарность за несогласие со мной. До встречи!

P. S.

Этот материал я бы хотел закончить дисклеймером: если я ссылаюсь на чьи-то доводы и предположения, это не означает, что я плохо думаю о продукции Apple или его основателях. Весь этот цикл это попытка скомпилировать загадки и тайны, которые связаны с компанией Apple, и призвать учиться проверять любую информацию в, как минимум, 3-х источниках, и быть критичным к себе. Конечно же, я не могу ручаться за достоверность ни одного из приведенных в фильме фактов. Я отвечаю только за то, что видел своими глазами и то, что мой iPhone смог запечатлеть и сохранить.

P. S. S. Анекдот

Pixar же тоже детище Джобса. Вообще-то, Лукаса. Я так смотрю, скоро окажется, что и Белку со Стрелкой в космос тоже Джобс запускал.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru