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

Блог компании ruvds.com

Три задачи из геномики, которые решают биоинформатики в СПбГУ

21.11.2020 12:09:13 | Автор: admin

Недавно на нашем ютуб-канале выступила Ольга Кунявская, младший научный сотрудник лаборатории Центр биоинформатики и алгоритмической биотехнологии СПбГУ.
Оля в науке уже 4 года и сейчас учится на втором курсе магистратуры НИУ ВШЭ Санкт-Петербург по направлению Software Engineering. Закончила Академический университет по направлению биоинформатика.

Делимся записью эфира и расшифровкой.

Меня зовут Ольга Кунявская, я работаю в лаборатории, которая называется Центр биоинформатики и алгоритмической биотехнологии. Сначала я расскажу предысторию того, как я попала в биоинформатику, какой у меня был бэкграунд; потом расскажу общие факты про нашу лабораторию, а потом расскажу про три проекта, которыми я сейчас занимаюсь.
Я из Москвы, родилась и выросла Москве. Начала учить программирование в 8 классе, в школе активно занималась олимпиадами, в том числе в 11 классе стала призером Всероссийской олимпиады по информатике. После этого я поступила в Академический университет Санкт-Петербурга; мне кажется, это было правильным решением. Там была сильная программа по математике и программированию, и мне очень нравилось учиться. Я действительно много училась; была тем безумным человеком, который делал домашки в тот же день, когда их выдают, и получает все зачеты до зачетной недели. У нас реально классное образование.

Хотя в школе все было иначе; я была достаточно хорошо подкована в алгоритмах и математике, но у меня была тройка по биологии, английский язык в 10 классе примерно на уровне elementary (после 11 pre-intermediate), и у меня в принципе не получалось писать связные тексты и выражать свои мысли. И еще я дислексик, читаю примерно в два раза медленнее, чем среднестатистический человек; когда я пишу, у меня в абзаце текста обычно бывает куча ошибок за диктанты мне обычно ставили двойку после прочтения первого абзаца. По окончанию школы у меня были не слишком развиты soft skills просто потому, что в школе они не особо требуются, чтобы продвигаться. Умеешь решать задачи хорошо, ты занимаешь высокие места, поступаешь в университет, который хочешь, и soft skills, чтобы чего-то достичь, не нужны.

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

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

В общем, не поняла я тогда, что биоинформатика мне не нравится. Это было 4 или 5 лет назад, и за это время многое изменилось. У меня откуда-то взялась тяга к знаниям по биологии хотя я до этого никогда не учила ее специально. Может быть, потому, что я теперь в этом постоянно нахожусь. И английский я выучила.

Q: Что значит: читаю в два раза медленнее, чем другие? Научные тексты нагружены информацией, и часто для понимания их приходится перечитывать несколько раз. Это же не приключенческие романы.


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

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

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

Лаборатория появилась в СПБАУ в 2010 году. Поскольку это было до того, как я начала заниматься биоинформатикой, для меня это равносильно тому, как если бы она существовала всегда. Потом она переехала в СПБГУ уже давно, я не помню когда именно и при мне она всегда была там.

Q: Моё восхищение. А сколько вам лет? Возможно, я прослушал


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

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

Q: как относитесь к популяризатору и биоинформатику же Александру Панчину?


Нормально отношусь. Я читала его книги по биоинформатике, они мне понравились; я вообще люблю научно-популярную литературу, ничего против нее не имею. Мне кажется, он толково пишет.

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

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

Давайте считать, что геном это очень длинная строка, составленная из 4 букв. Мы хотим получить её целиком, но изначально она у нас есть в виде мелких подстрок. Их очень много, в них встречаются ошибки. Сборкой единой строки и занимается геномный сборщик. Обычно Павел Певзнер во время рассказа про SPAdes использует метафору про газеты; я ее слышала уже слишком много раз, но вот: пусть у нас будет куча копий какого-нибудь одного выпуска газеты. Эту кучу вдруг разорвало на огромное количество маленьких обрывков, и теперь нам надо восстановить единственную и неповторимую изначальную копию, чтобы узнать, что там было написано.

Для меня этот проект про разработку; то есть, мне биологическую легенду даже знать необязательно. Это большой проект, и я не разрабатываю основные алгоритмы SPAdes. SPAdes уже написан, и у него есть куча подпроектов, ответвлений: metaSPAdes собирает метагеномы, plasmidSPAdes собирает плазмиды, coronaSPAdes (по-моему, неофициальное название) собирает, как ни странно, ретровирусы (могу пояснить, что такое ретровирусы). Есть сотрудники, которые в этих алгоритмах разбираются, работают с ними, понимают, в чем их специфика, знают, как их собирать, разрабатывают их. Моя задача в проекте непосредственная оптимизация: поскольку SPAdes очень популярен, им много кто пользуется, и ему приходится работать с очень большими данными, его надо очень круто оптимизировать. Истории типа а давайте хранить в этой структуре не int64, а в случае, если в графе мало ребер и их количество помещается в int32, хранить int32. Алгоритмы тут тоже есть, но они связаны не с биологией, а с тем, как лучше все оптимизировать, как сделать такой код, чтобы программа занимала меньше памяти, работала быстрее, была лучше распараллелена. В мои задачи в этом проекте еще входит тестирование, поддержка кода; хотя именно сейчас я не очень много времени уделяю этому проекту. Если, например, пользователь пишет, что в каком-то случае что-то не запускается, то надо сидеть и разбираться, что пошло не так и как этот баг исправить. Разработка разработкой. Один из моих руководителей (у меня четыре разных руководителя) занимается этим проектом гораздо более плотно, каждую неделю делает много патчей.

На самом деле, разработка в этом проекте подразумевает некоторые тонкости. У меня есть много друзей-программистов, и, когда я с ними общаюсь, я часто слышу фразы типа ой, программа столько работает 30 секунд, ее невозможно дебажить, надоело. Когда я начала работать над этим проектом, оказалось, что по меркам биоинформатиков быстрая обработка данных (для маленьких наборов тестовых данных например, мне рекомендовали использовать маленький геном кишечной палочки) это 10 минут. Особенно сложно, когда тестируешь на кластере, потому что к этим 10 минутам еще и добавляется очередь непонятно, когда твой код запустится. Конечно, есть OpenMPI для локальной эмуляции кластера, но иногда на локальном кластере может работать, а на реальном падать, и тогда надо разбираться, почему. Я уточняла у моих коллег, как они с этим живут; мне рассказывали мудрую мысль: думать, прежде чем запускать (много думать, много читать логику, понимать, что пойдет не так, исправлять, потом запускать). Здесь еще спасают логи, потому что у SPAdes очень хорошее логирование всего; это очень важно: когда мы сами пишем программу, нам нужно смотреть на логи в случае падения и восстанавливать, в чем была ошибка, без перезапуска. А еще мы должны уметь понимать по присланным логам, что именно упало у пользователя при том, что пользователь мог обрабатывать очень большие данные, и программа могла упасть после недели работы (такое бывает при работе с метагеномами).

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

Еще одна важная вещь мультизадачность. Мои коллеги реально умеют переключать контекст; я не понимаю, как они это делают. Они могут дописать код, запустить программу на 10 минут, эти 10 минут заниматься совершенно другим делом (переводить диссертацию, читать статьи, отвечать на письма), потом посмотреть, как отработало, поправить, запустить снова и так далее.

Q: а какие языки основные используются?


C++ и Python. SPAdes это проект на С++ с оболочкой на Python. Я в том числе занималась тем, что переписывала эту оболочку там было около десяти тысяч строк кода, и надо было разделить legacy-код, инкапсулировать отдельно составление pipeline и запуски, чтобы запускать на кластере. То есть, на Python тоже довольно много работы, хотя и проект на С++.

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

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

Давайте вспомним основы как появляются белки. У нас есть ДНК, и из нее мы получаем РНК; можно представить, что ДНК это большая библиотека, а РНК это небольшая статья, которую мы скопировали и дальше будем работать. Как будто мы пришли в библиотеку и запросили эту статью, но библиотека сами статьи не выдает они слишком ценные, а выдает только копии. И дальше мы с этими копиями работаем; можем выкидывать, можем что угодно делать. После получения РНК получается непосредственно белок; у нас есть рибосома, которая по этой РНК ползет и считывает (синтезирует) белок. Она считывает по три буквы, которые есть в РНК: алфавит примерно такой же, как в ДНК, копирование почти 1 в 1. По этим трем буквам определяется, какая должна быть аминокислота; а аминокислоты это уже алфавит, из которого состоит белок. Появляется цепочка аминокислот, и она сворачивается в белок.

Но это не единственный механизм синтеза; нерибосомные пептиды получаются по-другому, и как раз ими я занимаюсь. Прикол в том, что про другие способы синтеза белков никто не рассказывает. Я уже на спор рассказываю, чем я занимаюсь: иногда бывает, что новый биолог, закончивший биофак МГУ или СПБГУ, даже по направлению биоинформатики или молекулярной биологии, не знаком с нерибосомными пептидами.

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

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

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

А еще этот проект кладезь моего разностороннего развития. Тут важна биологическая легенда то есть, знать биологию действительно надо; надо понимать на некотором уровне органическую химию, чтобы понимать, как образуются связи. У меня была история про придумывание алгоритмов, потом история о том, что пора изучать теорвер и матстатистику; потом неожиданно понадобилась веб-разработка, потому что этим инструментом пользуются биологи а они не хотят работать через командную строку, им нужен нормальный интерфейс (и мне тоже). А я программирование всего 10 лет изучаю! Потом я разбиралась, как настроить NGINX, чтобы сервис заработал.

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

Сейчас еще существует история про Machine Learning (ML). У нас есть ребята из etBrains Research, которые в этом проекте занимаются ML почему-то там постоянно появляются люди, которые хотят заниматься этим проектом. Они пытаются применять Hidden Markov Model, чтобы решать эту задачу. Кстати, когда я рассказывала нашим коллегам из JetBrains про задачу просто про то, как она устроена, какие важные места надо учитывать моя собеседница сказала: наверно, ты в лаборатории биолог? Видимо, я теперь могу производить впечатление настоящего биолога.
Перейду на третий проект центромеры. Я начала заниматься им совсем недавно, в сентябре помню, как обрадовалась, когда мне предложили заниматься им.

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

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

Центромера этот тот регион хромосомы, который до недавнего времени (буквально до этого года) не был собран. Он достаточно сложен. Сейчас появились новые способы секвенирования генома более длинные риды (те самые кусочки газет из метафоры), более качественные, возможность гораздо лучше собирать геном. Есть T2T Consortium это сообщество ученых, которые хотят собрать геном от теломеры до теломеры. Теломера это такой участок хромосомы, который показывает возраст клетки; каждый раз, когда клетка делится, от теломеры отрезается часть, и поэтому количество возможных делений клетки ограничено. Сейчас уже создана первая чистая версия генома человека, в которой собраны все участки. Возможно, если вы интересуетесь научно-популярной биоинформатикой, вы слышали, что в 90-х годах был Проект генома человека, и в начале 00-х он как бы завершился; об этом писали большие статьи в журналах якобы, мы теперь все знаем о жизни. На самом деле, та версия совсем не была полной. Там было множество участков типа здесь слишком сложно, пока мы его оставим, когда-нибудь потом дособираем. Сейчас именно это и было сделано; центромера это как раз очень сложный для сборки участок. С точки зрения строки это история про тандемные повторы. То есть, у нас есть коротенькая строчка, которая повторяется очень много раз на этом участке. Причем повторяется не полностью: различные повторения могут отличаться на пару нуклеотидов. Но мы хотим все это восстановить. Обычно используется X-хромосома: её собирать и изучать удобнее всего, потому что она у мальчиков только одна; если хромосом две все усложняется.

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

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

Q: Циклы C++


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

Чем мне этото проект очень нравится так это тем, что это первый проект, в которым я работаю с крупными учеными. Им активно занимается Павел Певзнер очень крутой алгоритмист, и у него есть такой очень крутой скилл: переводить непонятную биологическую задачу в строгую математическую. Он умеет построить и сформулировать модель для этого, что очень сложно и очень важно. Формулировка задачи это значительная часть работы, сформулированная задача уже наполовину решена. Еще я работаю с Иваном Александровым это человек, который очень много занимался центромерами. С ним комфортно общаться, я периодически приношу ему новые данные и мы их совместно разбираем. Он активно интересуется тем, что я делаю, дает рекомендации. На последней встрече был забавный эпизод: я рассказывала ему про мономеры, которые я делаю, а Иван рассказывал мне про классификацию данных повторов в центромере. Я спросила, где можно про это прочитать, и он предложил мне большую обзорную статью по классификации данных в центромере, которую он сам написал в 2001 году. Он писал большие обзорные статьи, когда я еще читать не умела! И, когда я читала эту статью, я нашла ссылки на другие статьи Ивана по центромерам одну из них он написал в 1986 году! То, что у меня есть возможность работать с этими людьми и учиться у них это очень ценно для меня, мне действительно интересно быть здесь и получать здесь опыт.

Q: Как к вам в лабораторию попали люди с несоответствующим образованием?


Я не очень знаю, как попадать к нам. Условно, простой способ выглядит так: если вы студент, например, института биоинформатики или каких-нибудь программистских университетов СПБГУ, питерской вышки и так далее то у нас есть проекты. Можно, как сделала я на втором курсе, приходить, брать проекты, работать с нами. Какие-то люди нам нравятся, приживаются у нас, после этого мы берем их к себе работать. Еще у нас есть летняя стажировка; каждый год она набирается по-разному, в мой год было 10 человек. В лабораторию набирают стажеров, смотрят, кто нравится, кто не нравится, кто как приживается. При этом я начинала свою карьеру в биоинформатике, не зная о биологии почти ничего, и прижилась.
Насчет несоответствия я не очень поняла. Оно как раз соответствует.

Реклама! Приходите к нам работать в СПБГУ. Есть еще питерская вышка; я закончила АУ, это очень классное место, я очень довольна, что туда поступила. Сейчас наша образовательная программа переехала в питерскую вышку, все люди, которые делают нашу программу, переехали туда. Там очень сильное программистское образование, если вы думаете, куда поступать рекомендую ее.
В статье на Хабре я дам ссылку на свой телеграм-канал.

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

Q: как переключаетесь между проектами?


Ну, один день один проект, другой день другой проект.

Cсылки:


Сайт нашей лабы.
Группа лабы в ВК.
Мой блог в телеграмме.
Образовательная бакалаврская программа в Питерской Вышке.
Моя статья про SE магу в Питерской Вышке.
Хорошая преподавательница английского по скайпу: skype: evgeniya.prischepova



Что было ранее


  1. Илона Папава, Senior Software Engineer в Facebook как попасть на стажировку, получить оффер и все о работе в компании
  2. Борис Янгель, ML-инженер Яндекса как не пополнить ряды стремных специалистов, если ты Data Scientist
  3. Александр Калошин, СEO LastBackend как запустить стартап, выйти на рынок Китая и получить 15 млн инвестиций.
  4. Наталья Теплухина, Vue.js core team member, GoogleDevExpret как пройти собеседование в GitLab, попасть в команду разработчиков Vue и стать Staff-engineer.
  5. Ашот Оганесян, основатель и технический директор компании DeviceLock кто ворует и зарабатывает на ваших персональных данных.
  6. Сания Галимова, маркетолог RUVDS как жить и работать с психиатрическим диагнозом. Часть 1. Часть 2.
  7. Илья Кашлаков, руководитель фронтенд-отдела Яндекс.Денег как стать тимлидом фронтендеров и как жить после этого.
  8. Влада Рау, Senior Digital Analyst в McKinsey Digital Labs как попасть на стажировку в Google, уйти в консалтинг и переехать в Лондон.
  9. Ричард Левелорд Грей, создатель игр Duke Nukem 3D, SiN, Blood про личную жизнь, любимые игры и о Москве.
  10. Вячеслав Дреер, гейм-дизайнер и продюсер игр с 12-летним стажем про игры, их жизненный цикл и монетизацию
  11. Андрей, технический директор GameAcademy как видеоигры помогают прокачивать реальные навыки и найти работу мечты.
  12. Александр Высоцкий, ведущий PHP-разработчик Badoo как создаются Highload проекты на PHP в Badoo.
  13. Андрей Евсюков, заместитель CTO в Delivery Club про найм 50 синьоров за 43 дня и о том, как оптимизировать фреймворк найма
  14. Джон Ромеро, создатель игр Doom, Quake и Wolfenstein 3D байки о том, как создавался DOOM
  15. Паша Жовнер, создатель тамагочи для хакеров Flipper Zero о своем проекте и другой деятельности
  16. Татьяна Ландо, лингвист-аналитик в Google как научить Google-ассистента человеческому поведению
  17. Путь от джуна до исполнительного директора в Сбербанке. Интервью с Алексеем Левановым
  18. Как Data Science продает вам рекламу? Интервью с инженером Unity
  19. Как я переехал в Лондон c Revolut
  20. Завтрак с легендарным геймдизайнером Американом МакГи: о новой Алисе, России и депрессии
  21. Как организовать IT-конференцию и не сойти с ума
  22. Чем биоинформатика отличается от вычислительной биологии краткое введение
  23. Профессия системный аналитик: развитие сообществ, популяризация профессии и подготовка




Подробнее..

Анонс как писать статьи в IT-журналы и блоги

22.11.2020 20:18:28 | Автор: admin


Завтра, 23 ноября, в 20:00 в наших соцсетях выступит Андрей Письменный, главный редактор Xakep.ru.

Андрей начал карьеру в ИТ-журналистике в 2006 году, когда параллельно с учебой в техническом вузе начал писать для Компьюленты одного из первых онлайн-СМИ в России. Вскоре занял должность редактора в Компьютерре, где работал над онлайновой версией журнала.

Андрей успел посотрудничать как автор и редактор со многими российскими ИТ-изданиями: Mobi, Nomobile, Ferra.ru, Игромания, Железо и другими. С 2013 года список пополнил журнал Хакер, а в 2015 году Андрей стал его шеф-редактором. Перед командой тогда стояла задача превратить культовый журнал для компьютерных хулиганов в успешное цифровое издание с подписной моделью. Планы удалось реализовать.

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

В этом выступлении он поделится с вами опытом и приемами, которые пригодятся в работе с текстом о технологиях.




О чем расскажет Андрей


  • Вступление: вкратце про меня и про Хакер
  • Почему технарь должен уметь писать
  • Как найти, выбрать и сформулировать интересную тему
  • Как победить чистый лист
  • Как писать лучше: простые советы для тех, кто не хочет читать учебник
  • Как заставить себя дописать статью
  • Разбор примеров текста


Кроме того вы можете задать вопрос Андрею здесь в комментариях или в инстаграме и он ответит на них в прямом эфире.



Как не пропустить эфир?


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


До встречи в эфире!

Подробнее..

Linux в режиме реального времени

23.11.2020 14:22:47 | Автор: admin


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

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

Возможности ядра в реальном времени существует уже более десяти лет в экосистеме программ с открытым исходным кодом. Столько же времени доступна поддержка Red Hat Enterprise Linux (RHEL) для ядра реального времени. Тем не менее многие системные администраторы неверно истолковывают его основные концепции и фактическое рабочее поведение. В этой статье я опишу некоторые из его основных функций, отличия от стандартного ядра и шаги по установке.

Планировщик ЦП в реальном времени


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

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

  • Задержка прерывания относится к периоду времени от поступления прерывания в CPU до запуска процедуры обработки. Когда происходит событие, ОС должна сначала завершить выполняемую инструкцию и определить тип возникшего прерывания. Затем он должен сохранить состояние текущего процесса до обработки прерывания с помощью специальной процедуры, interrupt service routine (ISR).


    Рис. 1 Задержка прерывания.
  • Время, необходимое диспетчеру планирования для остановки одного процесса и запуска другого, называется задержкой диспетчеризации. Предоставление задач реального времени с немедленным доступом к процессору требует, чтобы ОС реального времени минимизировали также и эту задержку. Наиболее эффективным методом поддержания низкой задержки отправки является предоставление ядер с приоритетным прерыванием.


    Рис. 2 Задержка диспетчеризации.


Планировщик с учетом приоритетности процессов


Наиболее важной особенностью ОС реального времени немедленно реагировать на критический процесс, требующий доступ к ресурсам CPU. В результате планировщик для операционной системы реального времени должен поддерживать алгоритм приоритетного прерывания. Такие алгоритмы назначают каждому процессу приоритет в зависимости от его степени важности. Если планировщик также поддерживает приоритетное прерывание, текущий процесс на CPU по запросу будет вытеснен в пользу более приоритетного процесса.


Рис. 3 Классификация планировщиков.

Существует несколько алгоритмов для планировщика в реальном времени.

  • Rate-Monotonic Scheduling алгоритм со статическим приоритетом класса планирования. Статические приоритеты назначаются в соответствии с продолжительностью цикла задачи, вследствие чего более короткие циклы имеют более высокий приоритет исполнения. В худшем случае КПД загрузки центрального процессора ограничен следующей величиной.


    При числе процессов n, стремящемся к бесконечности ряд будет сходиться к ln2 0.693147.
  • Earliest-deadline-first (EDF) Scheduling динамически назначает приоритеты в соответствии с крайним сроком. Чем раньше крайний срок, тем выше приоритет и чем позже крайний срок, тем ниже приоритет. В отличие от RMS, планировщик EDF не требует, чтобы процессы были периодическими и постоянно запрашивали одно и то же количество процессорного времени на пакет. Единственное требование состоит в том, чтобы процесс объявлял свой крайний срок планировщику, когда он готов к запуску.


    Рис. 4 Планировщик EDF.

    На рисунке видим общий принцип работы планировщика. На точке 4 был замещён T1 и его место занял T2 так как его крайний срок наступал раньше, чем у T2. После отработки T3 планировщик вернулся к T1, который завершился на отметке 21.
  • POSIX real-time-scheduling. Стандарт POSIX.4 определяет три политики планирования. Каждый процесс имеет атрибут планирования, который может быть выставлен в одну из трех вариантов политики.

    • SCHED_FIFO политика упреждающего планирования с постоянным приоритетом, при которой процессы с одинаковым приоритетом обрабатываются в порядке первым пришел первым обслужен (FIFO). Данная политика иметь не менее 32 уровней приоритета.
    • SCHED_RR политика аналогична SCHED_FIFO, но использует метод временного среза (циклический перебор) для планирования процессов с одинаковыми приоритетами. Он также имеет 32 уровня приоритета.
    • SCHED_OTHER политика не определена и зависит от системы; может вести себя по-разному в разных реализация.


Установка и использование RHEL Real Time


Для начала следует подключить репозиторий Red Hat Enterprise Linux для Real Time, и установить группу пакетов RT.

[root@server ~]# subscription-manager repos --enable rhel-8-for-x86_64-rt-rpms[root@server ~]# yum groupinstall RT

В составе RT идут эти компоненты:

  • kernel-rt ядро с функционалом реального времени;
  • rt-setup установка окружения Red Hat Enterprise Linux Real Time;
  • rt-tests утилиты тестирования функций RT;
  • rt-eval для оценки возможности применять RT на данной системе;

После установки RT и перезагрузки нужно убедиться, что загружено ядро kernel-rt.

[root@server ~]# uname -aLinux rt-server.example.com 4.18.0-80.rt9.138.el8.x86_64 

Посмотрим на некоторые отличия kernel-rt от стандартного ядра.

  • При высокой нагрузке происходит проверка приоритета задачи (1-99).
  • Высокоприоритетным (99) задачам отдается предпочтение при доступе к ресурсам центрального процессора.
  • Не задействует политику Completely Fair Scheduling (CFS).
  • Использует политику SCHED_FIFO, либо же SCHED_RR.


Рис. 5 Сравнение kernet_rt со стандартным ядром.


На графике показан замер времени отклика из миллиона повторений для систем, использующих ядра RHEL Linux 7 и RHEL Real Time соответственно. Синие точки на этом графике представляют время отклика (в микросекундах) систем со стандартным ядром RHEL 7, а зеленые RHEL 7 Real Time. Из графика видно, что особенность kernel-rt в гораздо меньшей дисперсии и, соответственно, в большей предсказуемости времени отклика системы.

Настройка и тестирование


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

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

[root@server ~]#  hwlatdetect --duration=60shwlatdetect:  test duration 60 secondsdetector: tracerparameters:Latency threshold: 10usSample window:     1000000usSample width:      500000usNon-sampling period:  500000usOutput File:       NoneStarting testtest finishedMax Latency: Below thresholdSamples recorded: 0Samples exceeding threshold: 0

В данном примере parameters указывает на задержку и способ обнаружения. Порог задержки по умолчанию был выставлен на 10 микросекунд (10 s).

RT имеет также утилиту rteval для тестирования производительности системы в реальном времени под нагрузкой. Программа создаёт большую нагрузку на систему, используя планировщик SCHED_OTHER, а затем измеряет отклик в реальном времени на каждом из активных CPU. Цель в том, чтобы постоянно выполнялись различные задачи, такие как выделение / освобождение памяти, дисковый I/O, вычисления, копирование памяти и другие.

Каждый поток измерений берет временную метку, бездействует в течение некоторого интервала, а затем принимает другую временную метку после пробуждения. Задержка по результатам измерения равна t1 - (t0 + i), где

  • t1 фактическое время измерения;
  • t0 теоретическое время пробуждения первой временной метки;
  • i интервал ожидания.

Отчет утилиты rteval выглядит так.

System:Statistics:Samples:           1440463955Mean:              4.40624790712usMedian:            0.0usMode:              4usRange:             54usMin:               2usMax:               56usMean Absolute Dev: 1.0776661507usStd.dev:           1.81821060672usCPU core 0       Priority: 95Statistics:Samples:           36011847Mean:              5.46434910711usMedian:            4usMode:              4usRange:             38usMin:               2usMax:               40usMean Absolute Dev: 2.13785341159usStd.dev:           3.50155558554us

Использованные материалы





Подробнее..

Перевод Raspberry Pi и RetroPie делаем консоль для ретро-игр

23.11.2020 16:15:20 | Автор: admin
Для того чтобы создать собственную консоль для ретро-игр, которую можно будет подключить к любому телевизору или монитору, поддерживающему HDMI, понадобится примерно $50 и немного времени. В этом материале представлено полное пошаговое руководство по сборке и настройке игровой системы, основанной на одноплатном компьютере Raspberry Pi и на операционной системе RetroPie. RetroPie это замечательный проект, созданный специально для тех, кто хочет превратить Raspberry Pi или другие устройства в эмулятор для старых игр.


Подробности о RetroPie


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

В RetroPie используется EmulationStation система, поддерживающая все основные эмуляторы ретро-игр. Это позволяет играть на Raspberry Pi в игры, рассчитанные на платформы NES, SNES, Genesis, Atari и на многие другие. Меня всегда интересовал вопрос о том, почему проект RetroPie назван именно так, а не RetroPi, но я, похоже, отклоняюсь от основной темы. Поэтому продолжим разговор о нашей консоли.

Какой именно Raspberry Pi стоит использовать для запуска RetroPie?


RetroPie можно запустить на любом Raspberry Pi, но я порекомендовал бы использовать Raspberry Pi 4. Эта плата превосходит другие по быстродействию видеоядра, процессора, у неё больше памяти. А это расширяет диапазон игр, в которые можно будет комфортно играть. Рекомендую обратить внимание на Raspberry Pi 4 с 2 Гб оперативной памяти. Дело в том, что объём памяти, после достижения им определённого предела, не играет особой роли в деле эмуляции ретро-игр. Другими словами, если имеется достаточно памяти, возможности эмуляции ограничивают лишь мощность CPU и GPU.

Материалы и инструменты


Вот перечень материалов и инструментов, использованных в этом проекте.


1. Установка Raspberry Pi в корпус



Тут показан прозрачный корпус, а не корпус Flirc из перечня материалов

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

Если вы используете Raspberry Pi 3 или 4 советую выбрать корпус с радиатором. В частности, могу порекомендовать корпус Flirc. В нём есть пассивная система охлаждения для Raspberry Pi. В сущности, весь корпус это огромный радиатор, охлаждающий плату. Существуют версии этого корпуса для Raspberry Pi 3 и для Raspberry Pi 4.

Если вы планируете использовать корпус, не играющий ещё и роль пассивного радиатора, вам стоит подобрать такой корпус, в комплект которого входят радиаторы. А если вы создаёте игровую систему на базе Raspberry Pi Zero, то в качестве корпуса для платы можно использовать даже NES-картридж.

Обратите внимание на то, что ваша плата Raspberry Pi может выглядеть не так, как та, что показана на фотографиях. Тут, на самом деле, показан компьютер Raspberry Pi 3. А это руководство рассчитано на Raspberry Pi 4.

2. Загрузка образа RetroPie, предназначенного для записи на SD-карту



RetroPie

RetroPie это операционная система, основанная на Linux-дистрибутиве Raspbian OS. В ней имеется большой набор инструментов, позволяющих запускать на Raspberry Pi игры, созданные для самых разных платформ, представленные в виде ROM-файлов, используемых в различных эмуляторах.

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

В Raspberry Pi нет жёсткого диска. Для хранения данных используется microSD-карта. Там будут размещены файлы операционной системы и другие данные.

Для того чтобы приступить к процессу установки RetroPie, нужно скачать свежий образ. Существует три версии таких образов:

  • Для Raspberry Pi Zero, Zero W, A, B, A+ и B+
  • Для Raspberry Pi 2 и Raspberry Pi 3
  • Для Raspberry Pi 4

Вам нужно лишь выбрать образ, который подходит для вашего Raspberry Pi.

В Raspberry Pi A и B используются полноразмерные SD-карты. В Raspberry Pi B+, 2, 3 и Zero microSD-карты. Рекомендую использовать карту объёмом 32 Гб, что даст вам много места для ROM-файлов с играми, но подойдёт и карта меньшей ёмкости. Обратите внимание на то, что Raspberry Pi для работы требуется, как минимум, карта размером 4 Гб.

3. Подготовка SD-карты к работе с Raspberry Pi



Форматирование карты

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

Выбор формата карты


Если размер вашей карты 32 Гб или меньше её можно отформатировать с использованием файловой системы MS-DOS (FAT). Для карт размером от 64 Гб подойдёт файловая система ExFAT.

Форматирование в Windows


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

Форматирование в macOS


Тем, кто пользуется macOS, нужно запустить Дисковую утилиту (Приложения > Утилиты > Дисковая утилита). В левой панели надо выбрать SD-карту, нажать на кнопку Стереть, выбрать желаемый формат карты, задать ей имя и запустить форматирование. В OS X Yosemite и в более старых версиях системы нужно сначала перейти на вкладку Стереть.

Обратите внимание на то, что при форматировании карты все данные, хранящиеся на ней, будут уничтожены.

4. Запись образа RetroPie на карту



Работа с Etcher

Для установки RetroPie мы будем пользоваться утилитой Etcher. Она работает и на Windows, и на Mac.

Загрузим её, установим, запустим, выберем SD-карту и загруженный образ, а после этого запишем образ на карту.

5. Подключение карты и периферии к Raspberry Pi



Подключение различных устройств к Raspberry Pi

Безопасно извлечём карту из кардридера и вставим её в Raspberry Pi.

Теперь подключим к Raspberry Pi игровой контроллер и телевизор или монитор. Подключим к плате питание. Рекомендуется всегда подключать к Raspberry Pi питание после подключения периферии. Благодаря этому плата сможет правильно распознать подключённые к ней устройства при загрузке.

Теперь Raspberry Pi готов к загрузке!

Если у вас есть USB-клавиатура можете подключить к плате и её. Ей можно пользоваться в процессе настройки системы (подробнее об этом ниже).

6. Подключение Raspberry Pi к интернету



Wi-Fi-меню RetroPie

Рекомендую подключить Raspberry Pi к интернету это облегчит добавление в систему игровых ROM-файлов и позволит узнавать дополнительные сведения об играх, вроде их рейтингов и описаний. Кроме того, подключение Raspberry Pi к домашней сети позволит удалённо работать с платой через SSH. Это пригодится для настройки системы без использования клавиатуры.

Если вы пользуетесь Raspberry Pi Zero W, 3 или 4, это значит, что в вашем распоряжении уже имеется Wi-Fi-адаптер, встроенный в плату.

Для подключения Raspberry Pi к сети достаточно войти в меню RetroPie и выбрать там пункт WIFI.

Потом можно подключиться к Raspberry Pi по SSH, открыв терминал (в Mac) или командную строку (в Windows) и выполнив следующую команду:

ssh pi@retropie# по умолчанию используется пароль raspberry

Если вы используете достаточно старый вариант Raspberry Pi, или если в вашей плате нет встроенного Wi-Fi-адаптера ROM-файлы можно переносить на устройство с использованием USB-диска. Но если вы хотите оснастить ваше устройство интернет-функционалом подключите его к сети по Ethernet или воспользуйтесь Wi-Fi-адаптером с интерфейсом USB.

7. Настройка SD-карты для использования всего доступного на ней объёма памяти



Настройка SD-карты на Raspberry Pi

Если размер вашей SD-карты превышает 4 ГБ, вы должны её особым образом настроить, иначе Raspberry Pi не сможет пользоваться всем её пространством. Для этого нужно запустить средство конфигурирования Raspberry Pi paspi-config.

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

Затем нужно выбрать пункт Expand Filesystem или expand_rootfs (то, как именно будет называться соответствующая команда, зависит от используемого дистрибутива RetroPie). После этого нужно перезагрузить Raspberry Pi. Тут вы можете обнаружить отсутствие на Raspberry Pi кнопки перезагрузки (если только вы не оснастили устройство такой кнопкой).

8. Подключение к Raspberry Pi


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

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

Есть разные способы подключения к Raspberry Pi с компьютера. Мне больше всего нравится подключение по SSH/SFTP с использованием FTP-клиента. Среди бесплатных FTP-клиентов я посоветовал бы FileZilla. Он отлично документирован, его хорошо поддерживают, есть его версии и для Mac, и для Windows.

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

Обратите внимание на то, что, так как в свежих версиях Raspbian Jessie SSH, по умолчанию, в целях повышения безопасности, отключён, вам, для подключения к Raspberry Pi по SSH, нужно будет SSH на плате включить. Но это очень просто.

Используйте следующие учётные данные для подключения к Raspberry Pi. По умолчанию используются имя pi и пароль raspberry.

Host: <IP-адрес платы> (смотрите ниже)Username: piPassword: raspberryPort: 22

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

Для того чтобы выяснить IP-адрес Raspberry Pi, выполните (в терминале на Mac-компьютере, или в командной строке в Windows) следующую команду:

ping retropie

Если вы используете не самую свежую версию RetroPie примените такую команду:

ping raspberrypi

Эта команда проверяет доступность устройства, попутно давая сведения о его IP-адресе. Опрос Raspberry Pi может занять некоторое время. Но если вы, в итоге, увидели сообщение Request timeout, это значит, что успешно выполнить команду вам не удалось. Если у вас под рукой есть USB-клавиатура можно подключить её к Raspberry Pi, загрузиться, нажать F4 для получения доступа к командной оболочке и выполнить следующую команду:

ifconfig

Эта команда немедленно выведет сведения об IP-адресе платы (inet addr: в разделе eth0).

9. Настройка игрового контроллера



Настройка игрового контроллера в RetroPie

Теперь пришло время настроить игровой контроллер. Рекомендую Buffalo Classic USB Gamepad. Это недорогое устройство, которое хорошо стыкуется с Raspberry Pi и продаётся в приятной упаковке.

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

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

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

10. Поиск ROM-файлов с играми



Duke Nukem 3D

ROM-файлы содержат всё необходимое для запуска игр. В RetroPie установлена система EmulationStation, которая, с одной стороны, даёт пользовательский интерфейс нашей ретро-консоли, а с другой, помогает работать с ROM-файлами. В RetroPie имеется несколько предустановленных игр Quake, Duke Nukem 3D, Cave Story. Правда, в эти игры лучше играть, пользуясь клавиатурой, а не контроллером, так как у контроллера просто не хватает кнопок для игр, которые создавались для ПК. С помощью эмуляторов, встроенных в RetroPie, можно играть практически в любые консольные игры.

Правовое примечание


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

Хотя ROM-файлы для RetroPie можно найти на любом торрент-трекере, не стоит загружать файлы, размещённые там с нарушением авторских прав.

ROM-файлы, которыми можно пользоваться совершенно законно


К нашему счастью, в мире существуют и ROM-файлы с играми, которыми можно пользоваться, не нарушая чьих-либо прав. Например, множество таких файлов можно найти на MAMEdev.org. В следующих примерах мы будем пользоваться именно такими файлами. Это Gridlee и Super Tank.

11. Копирование игровых ROM-файлов



Копирование ROM-файлов через SFTP

Установить игровые ROM-файлы на нашу консоль можно через SSH/SFTP (то есть по сети), или воспользовавшись USB-диском. Есть и другие методы работы с такими файлами.

Вот моё руководство по работе с ROM-файлами с использованием USB-диска. Если ваш Raspberry Pi подключён к сети вы можете воспользоваться нижеприведёнными инструкциями.

Подключитесь к Raspberry Pi с помощью FileZilla и откройте папку /home/pi/RetroPie/roms.

Распакуйте ROM-файлы и скопируйте соответствующие папки в системные папки, предназначенные для игр с той платформы, на которую рассчитаны ваши ROM-файлы. Например, если вы хотите установить на консоль ROM-файл игры Super Mario Bros 3, то папку с игрой нужно поместить в директорию nes.

Игры Gridlee и Super Tank нужно скопировать в директорию mame, так как именно MAME поддерживает эмуляторы аркадных автоматов, которые не относятся к домашним игровым системам вроде NES, SNES или Atari.

После того, как копирование файлов завершено, Raspberry Pi надо перезагрузить.

12. Пришло время поиграть!



Игра Cave Story

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

13. Выход из игры


Для того чтобы выйти из игры, достаточно одновременно нажать на кнопки START и SELECT. После этого вы вернётесь в главное меню RetroPie.

14. Сохранение игр


Вот мой материал, посвящённый тому, как сохранять и загружать игры в RetroPie

15. Создание резервной копии SD-карты Raspberry Pi


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

Итоги


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

В какие игры вы поиграли бы на ретро-консоли?



Подробнее..

Перевод Кунг-фу стиля Linux наблюдение за файлами

24.11.2020 12:18:29 | Автор: admin
Linux или Unix приятно отличаются от многих других операционных систем тем, что Linux-программы часто выдают сообщения, которые записываются в какой-нибудь журнал. А многие команды даже можно настроить так, чтобы они генерировали бы больше сообщений, чем обычно. Я знаю о том, что в Windows есть средство для просмотра событий, но множество программ не особенно охотно делятся сведениями о своей работе. Это усложняет поиск источников проблем в тех случаях, когда что-то идёт не так, как ожидалось.



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

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

Давайте рассмотрим пример анализа файла, который можно назвать матерью всех логов. Это /var/log/syslog. Попробуйте вывести его на экран с помощью команды cat или less (я, в своих системах, всегда создаю псевдоним more для команды less, поэтому если я вдруг упомяну команду more знайте, что я имею в виду less). Этот файл, вероятнее всего, будет очень большим, его размеры будут постоянно расти. В обычной настольной системе он ведёт себя довольно спокойно, но в некоторых старых системах и на серверах в нём можно увидеть последствия бурной деятельности разных программ. В любом случае, за исключением тех ситуаций, когда система только что загружена, в нём будут многие страницы данных.


Хакерский подход к анализу логов

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

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

Команда tail


Традиционный подход к наблюдению за файлами, постоянно пополняемыми информацией, заключается в использовании команды tail. Она берёт большой файл и возвращает лишь некоторое количество его последних строк. Эту команду можно вызвать с опцией -f. Тогда она будет ждать появления в файле новых данных и выводить их. Эта опция весьма полезна для наблюдения за файлами, в которые постоянно добавляется что-то новое. Опция -F приводит к практически такому же эффекту, но благодаря ей tail, если не может сразу открыть файл, будет продолжать пытаться открыть его. С помощью опции -m можно задавать количество выводимых последних строк файла, а с помощью опции -c количество байтов. Опция -s позволяет задавать частоту проверки изменений файла.

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

tail -f /var/log/syslog

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

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

Меньше значит больше: полезные возможности команды less


У команды less есть опция +F, которая превращает эту команду в хорошую замену команды tail. На самом деле, если вы испытаете команду, приведённую ниже, вас может посетить мысль о том, что результаты её работы не очень-то и отличаются от результатов работы tail. Вот эта команда:

less +F /var/log/syslog

Вот как вывод этой команды выглядит на моём компьютере.


Результаты работы команды less

Обратите внимание на то, что в нижней части экрана имеется надпись Waiting for data. В данный момент утилита less работает практически так же, как и tail. Но если нажать CTRL+C произойдёт кое-что интересное. Ну что-то, возможно, и произойдёт. Попробуйте. Если less переходит в командный режим значит всё в порядке. Теперь можно заниматься всем тем, чем обычно занимаются, просматривая файлы с помощью less. Если же по нажатию CTRL+C работа less прекратится, это будет означать, что ваш Linux-дистрибутив помог вам, установив некоторые стандартные опции less с использованием переменной окружения LESS. Попробуйте такую команду:

set | grep LESS

Если вы увидите, что в списке опций имеется --quit-on-intr, это будет значить, что проблема заключается именно в данной строке. Её надо убрать. После этого переключиться в командный режим можно с использованием CTRL+C. Это, кроме того, означает, что вам нужно запомнить, что для выхода из less используется команда q. Если вы вышли из режима наблюдения за файлом и хотите снова в него вернуться просто нажмите F.

Если вы пользуетесь less в обычном режиме (то есть не использовали при запуске утилиты опцию +F), вы можете нажать клавишу F на клавиатуре для перехода в tail-режим. А ещё интереснее то, что, нажав ESC-F можно в этом режиме что-то искать, при этом, если в поступающих данных найдётся совпадение с тем, что вас интересует, система вам об этом сообщит.

Команду less можно ещё использовать с ключом --follow-name. Это позволит добиться того же эффекта, что и использование опции -F команды tail.

Наблюдение за файлами с помощью команды watch


Иногда файл, за которым нужно наблюдать, не пополняется новыми данными, добавляемыми в его конец, а просто иногда меняется. Например, это файл /proc/loadavg или многие другие файлы из директории /proc. Использование команд tail или less не особенно хорошо подходит для наблюдения за такими файлами. Тут нам на помощь придёт команда watch:

watch -n 5 cat /proc/loadavg


Результат выполнения команды watch

Эта команда вызывает cat каждые 5 секунд и аккуратно выводит результат. Команда watch поддерживает множество полезных опций. Например, опция -d позволяет выделять отличия, а -p позволяет задействовать высокоточный таймер. Опция -c включает поддержку цвета.

Использование текстового редактора для наблюдения за файлами


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

Если вы не ищете лёгких путей, то вам, возможно, подойдёт инструмент наподобие lnav, который сделан специально для просмотра логов. Просмотрщики журналов имеются, кроме того, в KDE и Gnome.

Итоги


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

Те команды, о которых мы говорили, могут пригодиться и тем, кто пользуется настольным дистрибутивом Linux, и тем, кто работает с серверами или с Raspberry Pi.

Как вы наблюдаете за постоянно изменяющимися файлами в Linux?



Подробнее..

Быстрое разворачивание Minecraft-сервера

24.11.2020 18:14:36 | Автор: admin


Играя в Minecraft в одиночку, всегда настаёт тот момент, когда хочется добавить к себе друзей в свой мир. Построить с ними вместе различные строения, отправиться в путешествие, вместе убить дракона или открыть новые миры. И тогда встаёт логичный вопрос: как создать свой сервер? До сего момента для игрищ использовал только сервера linux. А тут решил попробовать готовый сервер из Маркетплейса на Windows без графического интерфейса (чистый PowerShell). Мне кажется были собраны все грабли, которые только можно, но из битвы с Windows Server я вышел победителем.

Разворачиваем сервер


У меня есть некоторый опыт создания серверов Minecraft под linux, да и вообще администрирования linux, но совершенно не представлял как же быть с Windows. Возможно даже расскажу некоторые капитанские вещи, но для меня они были открытием. Самое большое откровение для меня был PowerShell. Даже не могу передать всех эмоций, использования Windows в консольном режиме. Microsoft сделало максимально неудобным всё. Почему нельзя было взять лучшее у *nix систем, внедрить у себя и улучшить? Почему нельзя сделать поддержку ssh, posix-совместимую систему команд, для чего этот велосипед?
Но спустя некоторое время даже начал получать некоторое удовольствие от интерфейса, и видеть даже какую-то логику. В общем, перейти с Windows на linux было сильно проще, чем сделать это обратно.
Итак, сервер я создавал в нашем :



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



Моя практика создания серверов показала, что для Minecraft-сервера необходимо не менее двух ядер, лучше больше 4-х ГБ ОЗУ. В целом, всё может работать на одном ядре, даже с 2 ГБ ОЗУ, но при большом количестве объектов, могут быть тормоза и пропуски хода.
Лично я такое наблюдал на куриной ферме, когда количество куриц у меня было более нескольких сотен. Тогда сервер реально начинал тормозить.


Корпус для аккумулятора

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



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

Подключение к удалённому серверу из Windows


В Windows всё просто. Жмём Пуск->Выполнить и вводим mstsc. Вводим параметры нашего сервера.



Если мы хотим копировать данные на сервер и с сервера (а я хочу), то идём во вкладку Локальные ресурсы, и там нажимаем клавишу Подробнее.



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



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



Содержимое диска C: нашего компьютера будет доступно в сетевой папке:

\\TSCLIENT\c



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

Подключение к удалённому серверу из Linux


Вот подключение из Linux немного коварнее и сложнее, а главное работает не очень стабильно (особенно монтирование удалённых дисков). Но деваться некуда, поэтому будем использовать его. Для того, чтобы подключаться к удалённому рабочему столу машины с Windows, нам нужно установить программу Remmina.

sudo apt-get updatesudo apt-get install libfreerdp-plugins-standard remmina remmina-plugin-rdp

После установки запускаем remmina, и конфигурируем подключение к удалённому серверу.



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

\\TSCLIENT\rdpfiles



Стартуем ванильный сервер


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

Approve-MinecraftEULA



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

Start-Minecraft

И всё, ваш сервер готов к работе, он создаёт новый мир и идёт загрузка, но дьявол кроется в мелочах. Сам сервер очень старый, версии 1.15.2 (тогда как на момент написания этой статьи была версия Minecraft 1.16.4).



Но, продемонстрирую, что сервер в действительности работает. Надо только в лаунчере поставить запуск старой версии (1.15.2), и указать при сетевом подключении IP-адресс нашего сервера.


Подключение успешно состоялось.

Как же обновить сервер, спросите вы? Оказывается очень просто. Последняя версия сервера у. Там нужно будет скопировать ссылку на данный файл.
Все файлы этого Minecraft-сервера (кроме стартовых скриптов) обитают в папке C:\Minecraft\ . Поэтому переходим в неё, и все процедуры делаем в ней.

cd C:\Minecraft\#удаляем старый серверrm C:\Minecraft\server.jar

Для того, чтобы скачать файл, в PowerShell есть аналог wget.

Invoke-WebRequest -Uri "http://www.contoso.com" -OutFile "C:\path\file"

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

Invoke-WebRequest -Uri "https://launcher.mojang.com/v1/objects/35139deedbd5182953cf1caa23835da59ca3d7cd/server.jar" -OutFile "./server.jar"

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

Start-Minecraft

И видим, что у нас обновлённая версия сервера вполне себе работает.



Устанавливаем моды


Эта часть попила у меня чудовищное количество крови, и я с ней очень долго бодался, пытаясь понять что же не так. Для того, чтобы работали моды, необходимо установить дополнение Forge. Не смотря на то, что скрипт запуска Forge есть на данном сервере, сам Forge не установлен! И это главная беда.
Обращаю ваше внимание, что для каждого мода требуется своя версия Forge! Поэтому ищите детальное описание на вашу модификацию, и подбирайте совместимость версии Forge и версии мода. Поскольку у меня не хватило терпения на этот квест подбора соответствующих модулей, то рассказываю основной принцип. Нет, forge с модулями завёлся, но не совсем так как от него ожидалось.
Нам необходимо скачать (выбирайте подходящую версию под ваш мод). Для этого создадим временую папку C:\tmp:

mkdir c:\tmp cd c:\tmp#скачиваем forgeInvoke-WebRequest -Uri "https://files.minecraftforge.net/maven/net/minecraftforge/forge/1.16.3-34.1.0/forge-1.16.3-34.1.0-launcher.jar" -OutFile "forge-1.16.3-34.1.0-launcher.jar"#запускаем инсталятор.\forge-installer.jar


Выбираем Install server и выбираем папку куда ставить (C:\Minecraft) жмём ОК. И дожидаемся загрузки.



После окончания установки, будет выведено такое окно.



Успешность установки, можно проверить командой.

Start-Minecraft -Type Forge -LogFile "C:\Minecraft\stdout.txt" -MinecraftPath "C:\Minecraft"


Если всё запускается без ошибок, всё, ваш сервер готов к запуску модов. Дальше вы можете моды скопировать в вашу сетевую папку, в моём случае rdpfiles и затем скопировать все моды в папку C:\Minecraft\mods\ (предварительно её создав).

mkdir C:\Minecraft\mods\cd \\TSCLIENT\rdpfilescp *.jar C:\Minecraft\mods\

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

rm C:\Minecraft\world\ 

Соглашаемся со всем, нажимая букву А на латинской клавиатуре. Всё, можем стартовать новый мир с модами.

Start-Minecraft -Type Forge -LogFile "C:\Minecraft\stdout.txt" -MinecraftPath "C:\Minecraft"

Удалять моды можно точно так же удаляя файлы в папке C:\Minecraft\mods\.

Белые списки и другие настройки сервера


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

whitelist on



Можно даже попробовать зайти на сервер и убедиться, что никто теперь на него не зайдёт.



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

whitelist add dlinyj 



Всё, теперь я могу заходить на данный сервер.

Для того, чтобы конфигурировать сервер, нужно править файл server.properties. Завершить работу сервера можно комбинацией ctrl-c. Далее можно открыть этот файл обычным блокнотом.

.\notepad.exe C:\Minecraft\server.properties



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

Выводы


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

Restart-Computer 

Если случайно закрыть окно PowerShell, то запустить его можно комбинацией Ctrl-Shift-Esc. Затем там выполнить PowerShell.





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



Подробнее..

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

25.11.2020 12:06:49 | Автор: admin
Большинство компьютеров загружаются с встроенного накопителя. Это может быть обычный жёсткий диск или SSD. Иногда они загружают ОС из сети, или, в крайнем случае, если загружаться больше неоткуда, с USB-флешки или с DVD. Как по мне так всё это скука смертная. Как насчёт загрузки ОС с виниловой пластинки?


10-дюймовая пластинка, время проигрывания которой составляет 6 минут 10 секунд при скорости 45 оборотов в минуту это загрузочный диск DOS размером 64512 байт

Для проведения этого необычного эксперимента персональный компьютер (а точнее IBM PC) подключён к проигрывателю виниловых пластинок через усилитель. Тут имеется маленький ROM-загрузчик, управляющий встроенным кассетным интерфейсом PC (который, пожалуй, никогда и никем не используется). Этот загрузчик вызывается BIOS в том случае, если все остальные способы загрузки не сработали (то есть загрузка с дискеты и с жёсткого диска). Проигрыватель воспроизводит аналоговую запись содержимого небольшого RAM-диска, предназначенную только для чтения, размер которой составляет 64 Кб. В этой записи имеется ядро FreeDOS, модифицированное мной так, чтобы его размер уложился бы в существующие ограничения. Здесь же есть компактный вариант COMMAND.COM и пропатченная версия INTERLNK, которая позволяет передавать файлы по принтерному кабелю и переделана так, чтобы она работала бы в FreeDOS. Загрузчик читает образ диска с пластинки через кассетный модем, записывает образ в память и загружает с его использованием ОС. Полагаю, не так уж всё это и сложно.


Виниловый загрузчик в ROM (он ещё может быть записан на жёсткий диск или на дискету, но это уже будет нечестно)

Если немного углубиться в технические детали, то окажется, что перед нами некий симбиоз BootLPT/86 и 5150CAXX без поддержки порта принтера. Он тоже хранится в ROM, в слоте расширения BIOS, но это необязательно. Для подключения усилителя к компьютеру используется кабель, аналогичный тому, что применяется в 5150CAXX, но тут не используется передача данных от компьютера к подключённому к нему устройству.

Кассетный интерфейс это всего лишь выход, представленный каналом 2 таймера динамика PC и вход, который представлен 4 каналом порта C 8255A-5 PPI (PC4, I/O-порт 62h, бит 4). Для программной (де)модуляции используются возможности BIOS INT 15h.

Загрузочный образ это тот же 64-килобайтный образ RAM-диска BOOTDISK.IMG, ссылку на загрузку которого можно найти здесь. Данные образа, с использованием 5150CAXX, преобразуются в вид, совместимый с протоколом IBM cassette tape, а получаемый аудиосигнал уходит прямо в систему записи виниловых пластинок.

Запись осуществляется с использованием кривой выравнивания RIAA, которую предварительный усилитель обычно обращает в процессе воспроизведения звука. Но делает он это не идеально. А значит на усилителе нужно выполнить коррекцию сигнала. Именно поэтому я и воспользовался усилителем, так как мне не удалось получить нужный сигнал, подав звук на компьютер сразу от предусилителя. В моём случае, используя винтажный усилитель Harman&Kardon 6300 и интегрированный предусилитель MM Phono, мне пришлось убавить высокие частоты (-10дБ/10кГц), поднять басы (+6дБ/50Гц) и уменьшить уровень громкости до получения пиков примерно в 0,7 вольта, что позволило предотвратить искажения звука. Всё это делалось, конечно, при отключённой коррекции фазы и громкости.

Безусловно, кассетному модему совершенно наплевать на то, откуда именно приходит сигнал. При этом, конечно, важно, чтобы запись была бы чистой, не содержала бы щелчков и треска (винил) или недостатков, связанных с модуляцией или частотой сигнала (магнитная лента). Всё это может прервать поток данных. Правда, звук вполне может немного плавать, скорость воспроизведения может варьироваться в пределах 2-3%. Это не мешает правильной передаче данных.


EPROM-модуль с загрузчиком

Итоги



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

Вот и всё! Если кому-то нужен загрузчик, сделанный для чипа 2364 (через адаптер можно использовать и чипы 2764), то его код можно найти здесь. Он рассчитан на работу с IBM 5150 с монохромным дисплеем и с как минимум 512 Кб RAM, что (вот уж совпадение) напоминает компьютер, с которым экспериментирую я. Ссылку на образ загрузочного диска можно найти в этом материале. А вот тот же образ, но уже в звуковом виде.

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



Подробнее..

Заметки Датасатаниста что делать, если перед вами оказалась NP-полная задача

25.11.2020 16:04:07 | Автор: admin


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

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

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

Убедиться, что перед вам действительно она


Как понять, что перед вами оказалась NP-полная задача? Во-первых, самая простая эвристика на обнаружение поиск по уже известным NP-полным задачам с целью определить что-то похожее, таких списков немало например.
Второе, рассмотреть следующие свойства задач:
  • Нужно выбрать решение, в котором n элементов из пространства exp(n)
  • Если у вас уже есть решение длины n из этого пространства оно легко (полиномиально) проверяется
  • Выбор одного из элементов решения (может) влияет на выбор всех остальных (не обязательно всех).
  • В худшем случае варианты всегда можно перебрать, рассмотрев все экспоненциальное пространство простым перебором.
  • Параметры n длина решения или само пространство не имеют фиксированного значения, то есть речь не идет о всегда фиксированной шахматной доске 8 на 8, а об общем виде задачи N-на-N.

Подробнее про свойства NP-полных задач тут и тут.

Пример работы по данному списку


Приведем простой пример на задаче, которую недавно утвердили как NP-полную!

По материалам статьи. Нужно расставить N ферзей на доске размера N на N, при условии, что уже K <= N расставлены на доске (картинка из оригинальной научной статьи)



Во-первых, заметим, что очень похожая задача с частично заставленным латинским квадратов NP полна.
А далее идем по списку:
  • Нужно найти N ферзей на из пространства exp(N) (=N^2 * (N^2-1) *....).
  • Решение из N ферзей тривиально проверяется для каждого ферзя надо проверить диагонали, вертикали и горизонтали.
  • Постановка одного делает выбор ряда других невалидным т.е. есть зависимости между элементами решения (нельзя расставить ферзей независимо).
  • Здесь можно решить задачу перебором для произвольно выбранной доски за exp(N) ставим первого в первого на (i,j) позицию, второго на любую другую незанятую, и тд. Перебор с возвратом гарантированно найдет решение.
  • Задача не имеет фиксированных параметров то есть сформулирована в общем виде и по мере роста N растет и сложность.

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

И более того, это условный практический подход эвристика по обнаружению NP-полных задач (со всеми плюсами и минусами).

Сведение



Источник

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

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


Не опускать руки!


Самое важное это оценить размеры-параметры и реалистичные сценарии!


xkcd.com/287

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

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

Распределение входных данных


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

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



Вот пример, того как оценивалось решение для очень специализированной задачи NP-полной tiling против общего метода моделирования целого класса таких задач с помощью методов логического программирования:


(из статьи Relational Data Factorization (Paramonov, Sergey; van Leeuwen, Matthijs; De Raedt, Luc: Relational data factorization, Machine Learning, volume 106))

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

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

Эвристики и аппроксимация




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



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

% domainrow(1..n).column(1..n).% alldifferent: guess a solution1 { queen(X,Y) : column(Y) } 1 :- row(X).1 { queen(X,Y) : row(X)    } 1 :- column(Y).% remove conflicting answers: check this solution:- queen(X1,Y1), queen(X2,Y2), X1 < X2, Y1 == Y2.:- queen(X1,Y1), queen(X2,Y2), X1 < X2, Y1 + X1 == Y2 + X2.:- queen(X1,Y1), queen(X2,Y2), X1 < X2, Y1 - X1 == Y2 - X2.

Проведя простой эксперимент по поиску решений для разного количества ферзей N мы получим следующее: по оси Х ферзи, по Y время в секунда по поиску решения:



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

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

Выводы



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

  • Определить, что перед вами действительно NP задача.
  • Понять какие реалистичные значения параметров и распределение данных.
  • Попробовать написать (порядок зависит от разработчика и/или задачи):
    • Точное решение на эвристиках (на основе нашего анализа) будет ли достаточно быстро?
    • Приближенное решение на эвристиках будет ли достаточно точно?
    • Точное общее решение с помощью систем моделирования NP-задач будет ли удовлетворять ресурсам системы и задачи? Потребление памяти, CPU и время работы? Часто они очень прожорливы.
  • Провести эксперименты и сравнить решения: качество, время и корректность найденных решений.
  • Тестирование на реальной системе эксперименты экспериментами, а как будут вести себя библиотеки и системы разработанные в университетах в боевых условиях еще та загадка. Надо проверять!

Другие заметки Дата Сатаниста:


  1. Что может пойти не так с Data Science? Сбор данных
  2. Заметки Дата Сайентиста: как измерить время забега марафона лежа на диване
  3. Заметки Дата Сайентиста: маленькие утилиты большая польза
  4. Заметки Дата Сайентиста: персональный обзор языков запросов к данным
  5. Заметки Дата Сайентиста: на что обратить внимание при выборе модели машинного обучения персональный топ-10
  6. Заметки Дата Сайентиста: с чего начать и нужно ли оно?
  7. Заметки Дата Сатаниста: честность модели



Подробнее..

Личная файлопомойка. Как я настраивал файлообменник на VPS

26.11.2020 12:17:06 | Автор: admin


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

Зачем, Холмс?


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

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

Безусловно, за $9.99 в месяц можно купить 2 терабайта в облаке у Dropbox, но там нет возможности многопользовательской работы. При нынешнем курсе доллара аренда виртуального сервера с дисковым объемом 40 Гб, но без ограничений на количество подключений, выйдет примерно в ту же сумму, а если выбрать конфигурацию попроще с одним ядром то даже дешевле. Определенная часть этого дискового пространства будет занята операционной системой, но для хранения файлов останется минимум 20 Гбайт, чего для моих целей вполне достаточно.

При этом файловое хранилище на VPS имеет целый ряд других неоспоримых преимуществ:
можно публиковать веб-сайты прямо из общей папки;
можно организовать доступ к нему с использованием SFTP;
можно настроить торрент-клиент для загрузки и выгрузки контента;
в том же контейнере можно смонтировать сервер NFS или SMB для использования VPN.

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

Матчасть


Virtual Private Server (VPS) чаще всего покупают для хостинга сайтов, но в отличие от обычного хостинга, он позволяет изолированно запускать несколько приложений в одном и том же контейнере. В целом, VPS вполне можно использовать для организации личного файлового хранилища, поскольку:
средства виртуализации VPS обеспечивают достаточный уровень безопасности, в связи с чем такое хранилище можно считать относительно надежным;
как правило, провайдер самостоятельно организует резервное копирование собственных контейнеров, либо предоставляет средства автоматизации этого процесса, поэтому о бекапах можно особенно не беспокоиться;
виртуальный сервер более дешев по сравнению с выделенным сервером при схожем уровне безопасности и в целом подходит для выбранной цели.

Для реализации своей задумки я выбрал виртуальный сервер в следующей конфигурации:
Windows Server 2019
2 ядра (Intel Xeon);
2 Гб RAM;
40Гб HDD.



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

Настройка сервера


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



В окне Мастера добавления ролей и компонентов нажимаем Далее, затем, выбрав вариант Установка ролей и компонентов, снова жмем Далее. Выбираем в списке наш сервер (собственно, он и будет там представлен в единственном экземпляре), и очередным нажатием на кнопку Далее переходим к настройке ролей.



Нас интересует раздел Файловые службы и службы хранилища. Эта роль установлена на сервере по умолчанию. Установите флажок Файловые службы и службы SCSI и разверните расположенный под ним список. Здесь следует дополнительно установить следующие флажки:
Файловый сервер;
Рабочие папки;
Диспетчер ресурсов файлового сервера (в открывшемся окне нажмите Добавить компоненты).

Теперь дважды нажмем Далее и завершим настройку ролей сервера щелчком мыши на кнопке Установить.

Создание нового раздела


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



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



Я решил эту проблему, создав отдельный логический том, отличный от того, на котором установлена Windows там мы сможем развлекаться, как нашей душе угодно. Для этого:
В окне Диспетчера серверов откройте расположенное в верхней части меню Средстива, а в нем Управление компьютером.
В открывшемся окне выберите в левой панели оснастку Управление дисками. Вы увидите единственный диск, на котором расположена операционная система.
Щелкните на диске правой клавишей мыши и выберите Сжать том. При общем объеме диска в 40 Гбайт в поле Размер сжимаемого пространства, Мб я прописал значение 25 000, посчитав, что для работы винде хватит 15 Гбайт дискового пространства.
Щелкните мышью на кнопке Сжать, и дожидитесь, пока Windows освободит место на диске.



После того как в Диспетчере дисков появится неразмеченное свободное пространство, необходимо проделать следующие шаги:
Щелкните правой клавишей мыши в нераспределенной области, и в контекстном меню выберите пункт Создать простой том;
В окне Мастера создания простого тома нажмите Далее, убедитесь, что размер тома соответствует объему неразмеченной области, снова нажмите Далее.
Введите букву диска (по умолчанию D:) и опять нажмите Далее.
Выберите в качестве файловой системы NTFS, размер кластера по умолчанию, установите флажок Быстрое форматирование. Остальные параметры можно оставить без изменений. Нажмите Далее. Затем щелкните мышью на кнопке Готово.



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

Создаем шару


В Проводнике на удаленном сервере создадим новую папку на только что подготовленном нами диске и назовем ее, например, Share. Снова откроем окно Диспетчера серверов. В левой панели расположена надпись Файловые службы и службы хранилища. Щелкнем на ней мышью, чтобы перейти к настройкам.



Откроется одноименное окно, в котором демонстрируются следующие оснастки:
Серверы содержит список серверов (в нашем случае один) и журнал событий;
Тома данные о логических томах, общих ресурсах, сведения о диске;
Диски данные о зарегистрированных в системе дисковых накопителях;
Пулы носителей список доступных пулов хранения, по умолчанию пустой;
Общие ресурсы сведения обо всех настроенных на сервере общих ресурсах (шарах);
iSCSI сведения о виртуальных дисках iSCSI;
Рабочие папки данные о настроенных на сервере синхронизируемых Рабочих папках

Перейдем в раздел Общие ресурсы, и в расположенном сверху меню Задачи выберем пункт Новый общий ресурс.



Запустится Мастер создания общих ресурсов. В первую очередь нужно выбрать из списка подходящий профиль общей папки. Нам подойдет вариант Общий ресурс SMB быстрый профиль, поскольку он позволяет предоставлять доступ к файлам на компьютерах с Windows и не требует настройки дополнительных параметров.



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



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



По нажатию Далее система продемонстрирует стандартный для Windows Server список разрешений на доступ к папке, согласно которому полные права на чтение и запись имеет только пользователь с правами Администратора. Нажмите в окне Мастера на кнопку Настройка разрешений, затем Добавить -> Выберите субъект, в нижнем поле введите Все (без кавычек), нажмите Ок и установите флажок Полный доступ. Нажмите Применить, затем Ок.

Осталось только нажать в окне Мастера создания общих ресурсов кнопку Далее и Создать. Выбранная нами папка появится в панели общие ресурсы.



Траблшутинг


Теперь, казалось бы, мы можем обращаться к этой папке прямо из Проводника. Для этого набираем в адресной строке \\ip-адрес-нашего-сервера, вводим имя и пароль Администратора, и видим нашу расшаренную папку с тем именем, которое мы задали ей на этапе настройки. Можно пользоваться шарой? Хренушки. Отказано в доступе. Винда не была бы виндой, если бы все было так просто. Самый простой способ избавиться от этой ошибки такой.

Вновь подключаемся к серверу по RDP, щелкаем правой кнопкой мыши на значке подключения к сети в трее и выбираем в контекстном меню Открыть Параметры сети и интернет.
В открывшемся окне проматываем содержимое вниз и жмем на надпись Центр управления сетями и общим доступом.
В расположенной слева панели жмем на надпись Изменить дополнительные параметры общего доступа.
Устанавливаем переключатель в положение Включить сетевое обнаружение.
Переходим в раздел Все сети чуть ниже, устанавливаем переключатель в положение Включить общий доступ, чтобы сетевые пользователи могли читать и записывать файлы в общих папках.
Жмем Сохранить изменения.



Если сетевое обнаружение никак не хочет включаться, делаем следующее: в панели поиска набираем без кавычек Службы или services.msc, и принудительно запускаем следующие службы (если они еще не запущены):
DNS-клиент (DNS Client)
Обнаружение SSDP (SSDP Discovery)
Публикация ресурсов обнаружения функции (Function Discovery Resource Publication)
Узел универсальных PNP-устройств (UPnP Device Host)

Для каждой из этих служб настоятельно рекомендую включить автоматический запуск. Все? Теперь-то мы можем использовать общую папку? Нет!

Запускаем на сервере Проводник, находим в нем нашу расшаренную папку. Щелкаем на ней правой клавишей мыши, в контекстном меню выбираем пункт Свойства и открываем вкладку Безопасность. Выбираем щелчком мыши пользователя Все и нажимаем на кнопку Изменить. Устанавливаем флажок Полный доступ, жмем Применить и Ок.



Это еще не конец наших мучений! Открываем вкладку Доступ, нажимаем на кнопку Расширенная настройка, затем Разрешения. В появившемся окне нужно установить флажок Полный доступ, затем нажать Применить и Ок.



Неужели квест закончен и мы можем пользоваться нашей шарой? Как бы ни так! Ведь это операционная система Windows Server 2019, в которой безопасность стоит на первом месте. Поэтому при попытке обратиться к серверу из Проводника на локальном компьютере мы, скорее всего, увидим ошибку Вход в систему не произведен: выбранный режим входа для данного пользователя на этом компьютере не предусмотрен.



На этом этапе кое-кто отчаивается и идет покупать платный аккаунт в Dropbox за $9.99. Но мы сильны духом, любим секс, а потому продолжаем эксперименты. Вновь открываем Удаленный рабочий стол на сервере, вводим в поисковую строку слово Администрирование (без кавычек) и нажимаем Enter. В окне Администрирование выбираем Локальная политика безопасности -> Локальные политики -> Назначение прав пользователя -> Отказать в доступе этому компьютеру из сети Гость. Дважды щелкаем на этой строке мышью и удаляем Гостя из списка.



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

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



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

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

Квотирование и Рабочие папки


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



Подробнее..

Перевод Кунг-фу стиля Linux удобный доступ к справке при работе с bash

26.11.2020 16:14:32 | Автор: admin
В наши дни редакторы кода часто предлагают программистам помощь или справочные сведения, относящиеся к тому, что вводится с клавиатуры. Это может быть всё что угодно от списка коротких вариантов автозавершения ввода до шаблонов для ввода больших фрагментов кода. Если вы уже написали миллион программных строк на некоем языке, то такая вот помощь может вам мешать. Но если вы пишете программы лишь от случая к случаю, вам это может очень пригодиться. Я пользуюсь Linux уже много лет, но понимаю, что есть люди, которые не работают в этой ОС ежедневно. А учитывая растущую популярность Raspberry Pi, учитывая распространённость Linux-серверов, и то, что в Windows 10 появилась возможность работать с bash, оказывается, что всё больше и больше людей пользуются командной оболочкой Linux лишь время от времени. Можно ли как-то облегчить жизнь таким людям? Полагаю, что можно. Специально для этого я написал небольшой скрипт, который называется bashelp.



На самом деле, в сфере справочной информации по Linux-командам есть кое-что хорошее и кое-что плохое. Хорошо здесь то, что в Linux уже давно имеется встроенная команда, позволяющая получать справочные сведения. Это man (сокращение для manual руководство). Если говорить о плохом, то можно отметить, что для получения справки нужно оставить текущее дело и выполнить команду man.

Существуют графические интерфейсы для man, вроде yelp, показанного на следующем рисунке.


Графический интерфейс для man

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

При создании подобной справочной системы нужно, как и в случае с настройкой автозавершения ввода по нажатию клавиши Tab, учитывать две вещи: во-первых нужна функция, выводящая справочные сведения, во-вторых нужно некое средство, заставляющее readline в нужный момент вызвать эту функцию. Моя система представлена скриптом bashelp.sh, который решает обе вышеописанные задачи. Но он работает только тогда, когда задано значение переменной $DISPLAY, что указывает на то, что в настоящий момент используется графический терминал. В Mac, кстати, работа с графическим интерфейсом устроена не так. Поэтому если вы хотите пользоваться этим скриптом на Mac-компьютере, вам понадобится внести в скрипт некоторые изменения. Если вы сделаете это, и то, что у вас получится, заработает, я с удовольствием взгляну на ваш PR в репозиторий проекта или на форк проекта.

Скрипт позволяет задать клавиатурную команду, вызывающую справку. Я выбрал сочетание клавиш CTRL+Y. Команда bind, используемая в скрипте, полагает, что это сочетание клавиш выглядит как \C-Y. Найти эту команду можно в верхней части кода скрипта. Вы можете выбрать другое сочетание клавиш. Там есть и ещё некоторые настройки. Например, man-справку можно открыть в отдельном окне терминала, или можно запустить графический вариант man. Подробности о настройке скрипта ищите в файле readme.

Сама функция вывода справки устроена очень просто. Если у вас нет графической системы X она работать не будет (опять же обратите внимание на $DISPLAY). Она ожидает, что данные от readline будут в $READLINE_LINE и $READLINE_POINT. Если данных нет скрипт завершает работу. После этого функция берёт первое слово из строки до пробела, а после этого обрабатывает все опции, что позволяет ей открыть справку в том виде, в котором нужно пользователю.

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

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

Применяете ли вы какие-нибудь особые приёмы при работе со справочными материалами по командам Linux?



Подробнее..

Идеальный клавиатурный КПК Jornada 720

27.11.2020 12:11:35 | Автор: admin

Linux на Psion 5mx, Jornada 720, NEC MobilePro 900c

Этой статьёй хочу завершить цикл статей о КПК. Через мои руки прошло громадное количество различных карманных персональных компьютеров, но, IMHO, самый интересный и лучший среди них это Jornada 720. Это безупречный КПК для своего времени, впитавший лучшее что было на тот момент на рынке, и фактически стал полноценным настоящим карманным ноутбуком, который мог решать вполне себе взрослые задачи, хотя и работал на процессоре ARM 200 МГц. А после того, как на него энтузиасты портировали на него Linux эта вещица стала просто пределом мечтаний каждого уважающего гика. Обо всех моих экспериментах с этим КПК, а также пару слов о NEC читайте в этой статье.

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

С чего всё началось и первые проблемы


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


Чтобы не смотреть всё видео, расскажу о характеристиках КПК (информация взята с вики ):

Клавиатурный КПК (handheld PC) Jornada 720 был представлен в 2000 году. В отличие от предыдущих моделей он был основан на процессоре Intel StrongARM (как Jornada 820) с частотой 206 МГц. Устройство работало под управлением операционной системы Microsoft Handheld PC 2000 (Windows CE 3.0). Из других аппаратных характеристик можно отметить 32 МБ ПЗУ и 32 МБ ОЗУ, порт USB 1.1 и разъём для смарт-карт. К мелким улучшениям относится появление поддержки стереозвука и разъёма 3,5 мм для наушников. Экран и прочие характеристики (разъёмы PCMCIA и Compact Flash, инфракрасный и последовательный порты), включая размеры и вес, остались аналогичными модели Jornada 690.

Клавиатурник, ARM, поддержка Linux, usb, звук, PCMCIA, Compact Flash ну просто мякотка. И тогда понял, да, оно, хочу! Полез на известный западный интернет-аукцион, и оказалось, что предложений не так уж и много по теме, а ценник весьма негуманный. Но тем не менее, я вписался в один аукцион и выиграл эту красотку. Стала она мне по тем деньгам, около двух тысяч рублей (что очень дёшево).


Фото сразу после покупки.

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


На клавиатуре дата ремонта 7(или 1?).04.14. Под замалёванным читается написанное от руки типа Tested.

Судя по всему, мой экземпляр был сделан чисто чтобы продать, и явно клавиатура не создана чтобы прожить долго. В результате на том же аукционе была найдена клавиатура всего за 160 рублей + доставка была 500 рублей.
Любопытно было другое, что клавиатуры оказались разные.


Клава с ебея.


Моя клавиатура.

Найди десять отличий? Пять раз я пересчитывал количество клавиш в разных рядах Наверное я что-то не понимаю в этой жизни, но оно РАЗНОЕ!
В результате было принято волевое решение и куплена эта клавиатура.
Так же в Германии, с помощью моего хорошего товарища aterentiev был найден аккумулятор для этого устройства. За что ему огромное спасибо. Он заказал на себя, потом уже переслал мне по почте. Это большой труд и человеку поясной поклон! В результате Jornada 720 приобрела автономность.



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


Новая клавиатура на Джорнаде, старая снята.

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

Стилус создаватус или лечение запоев по фотографии


Выше уже говорил, что у моего экземпляра КПК не было стилуса. Поискал, где его купить, понял, что за разумные деньги его взять невозможно. Поэтому решил сделать его сам. Изначально попробовал сделать слепок из карандаша. Для начала замерял диаметр отверстия (7мм), затем оценил глубину и попробовал сделать муляж из карандаша, зажал в дрель и обточил до такого диаметра. Самое сложное это правильная форма хвостовика. Его попробовал вылепить из гипса. В результате получилось что-то типа этого:



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


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

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


Снимаем сглаз, порчу размеры с фотографии

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



Стиулс создавал в онлайн чертилке на сайте www.tinkercad.com. К сожалению, я работаю в linux, и ничего внятного и простого для черчения моделек под linux на тот мне найти не удалось. Либо оно не работает, либо работает через одно место, либо оооочень сложно в изучении. А для таких простых целей она подошла идеально.


Прототип стилуса.

После всяких изысков и экспериментов, я остановился на следующей модели стилуса.



На тот момент на работе у меня был доступ к 3D-принтеру, и это был мой первый опыт взаимодействия с данным аппаратом. Принтер печатал, прямо скажем, ужасно. Но всё же мне удалось на нём сделать несколько моделей.



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





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


Все варианты стилусов.

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





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

Остальные аппаратные дополнения, которые докупались после


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

Wifi-карта


Для начала, мне очень хотелось вывести в интернеты данный КПК. ИК-порт это не наш метод. Поэтому я начал искать различные 16-ти битные PCMCIA карточки. Оказалось, что это весьма редкие звери (обычно все 32-х битные и не работают в этом КПК). Мне удалось найти модемы, сетевые карты под Ethernet и т.п. У меня такой прям ящик карточек был, но работало с данным аппаратом небольшое их количество. Мне удалось в результате найти Wifi-карты, которые работали именно на этом КПК (да, только со старыми системами шифрования).


Карточки.

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


Wifi работает.

Док станция для USB и COM-порта


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


Внешний вид дока без КПК.

КПК снимается нажатием на треугольную кнопку справа. Самое ценное это подпружиненные контакты, которые ведут к низу КПК. Изначально даже думал сделать самодельную док-станцию, но в результате удалось выловить родной.
На попе у него три разъёма: питание, USB и СОМ. Последний, к сожалению, точно такой же как на самой Джорнаде, и для него нужен такой же шнурок. USB с СОМ закрываются поочерёдно шторкой.


USB и питание.


СОМ-порт и питание.

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



Что интересно, стилус занял своё почётное место, что говорит о том, что сделан он весьма точно.

Бумажная макулатура и СОМ-проводок


Под конец я решил упороться, как тру коллекционер и докупил ту самую макулатуру, которую клали в коробку к этой Jornada. И там же шёл в комплекте COM-портовый шнурок, который мне был ценен.


Буклеты, документация, а главное кабель!

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


Описание, как синхронизироваться с компьютером.

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


Батарейка и инструкция по установке.

Не могу испортить вещь, очень уж аутентично всё. Когда читатели моего ЖЖ увидели, как я упоролся в подходе сборки Jornada 720, они сказали что я постепенно превращаюсь в Сергея Фролова sfrolov.

Из любопытного


Есть то железо, которое мне не удалось достать это платка ОЗУ и ПЗУ прошивки. В целом, в этом ПЗУ можно сразу упихать линукс, и он должен работать.



Отличие Jornada 720 от 728 только в этой плате. И были в продаже такие платы, которые расширяли ОЗУ до 64-х МБ и позволяли получить более крутой КПК.

Из любопытного


По линуксу не буду много рассказывать. Наиболее полно осветил тематику работы с Linux Кирилл Лейфер aka BOOtak в своём видео. И с него предлагаю начать эту главу.


Вся информация по разработке, установке linux и всё-всё-всё жило на чудесном сайте jlime.com. К сожалению всё мертво Но, к счастью, есть его зеркало, в котором ещё можно найти очень много нужного и полезного.

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


В наличие есть даже бекап репозитория, так что ещё можно работать! Ну и есть какое-то полезное вики по теме, тоже рекомендую к ознакомлению.
Кратко процитирую процедуру установки, которую я описывал у себя в ЖЖ.

Делаем всё по инструкции с официального сайта Всё, кроме ядра! Размечаем флешку, распаковываем rootfs, переписываем программы, но ядро и модули берём другие! Для качаем два файла: hp7xx-2.6.25-stable (ядро) и hp7xx-modules-2.6.25-stable.tar.gz (модули). После распаковки rootfs там же распаковать папочку модулей командой tar xvfz //hp7xx-modules-2.6.25-stable.tar.gz и после переписать в фатовский раздел ядро с именем zImage. После этой неочевидной процедуры (которая нигде не указанна), у меня всё завелось.

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

Но по-настоящему круто себя почувствовал тогда, когда всё же поставил Linux на эту крошку, нашёл аккумулятор, заменил клавиатуру, с большим трудом сконфигурировал Duke Nukem 3D. Одной из большим проблем было корректно выставить разрешение экрана.


Проблемы с разрешением.

Ну как обычно, после длительного RTFM мне удалось написать подходящий конфиг и получить работающий Duke Nukem под Linux на arm КПК Jornada 720. Я даже передать не могу, как же круто было ехать в метро, достать из широких штанин КПК, на котором стоит linux, и в командном режиме запустить Duke.


Duke Nukem 3D в метро. Это реально очень круто!

Это была прямо мечта детства так сделать, вот в метро сыграть в Duke Nukem на мелком КПК.

Два слова о NEC MobilePro 900c


На сайте jlime.com я узнал о таком кпк, как NEC MobilePro 900c. По сути, более переработанная версия Jornada, и он больше похож на обычный ноутбук. В комплекте у меня был чехол, запасной аккумулятор, а потом ещё и Wifi-карта. Помню, что linux на него поставить было как-то особенно сложно, но не буду вдаваться в технические детали (вряд ли кто-то будет это повторять, а если будут, найдут у меня в ЖЖ). Но почему-то меня этот аппарат так не впечатлил как Jornada, он всё же не был по настоящему карманным.



Чем кончилось дело


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

В качестве итога


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

Перевод Низкоуровневое программирование STM32 от включения питания до Hello, World

27.11.2020 16:12:57 | Автор: admin
В этом материале я хочу рассказать о том, как писать программы для микроконтроллеров (Microcontroller Unit, MCU) Cortex-M, вроде STM32, используя лишь набор инструментов ARM и документацию, подготовленную STMicroelectronics. У некоторых читателей может появиться вопрос о том, почему кому-то это может понадобиться. Если вам эта идея, на первый взгляд, не показалась очень уж страшной, то, возможно, вам будет интересно то, о чём пойдёт речь в этом материале. И, кстати, подумаем о том, кому и зачем это может пригодиться.

Конечно, разрабатывать программы для MCU STM32 можно с помощью существующих фреймворков. Это может быть ST HAL, обычный CMSIS, или даже что-то, более близкое к Arduino. Но что тут увлекательного? Ведь, в итоге, тот, кто пользуется каким-то фреймворком, полностью зависим от документации к нему и от его разработчиков. И, с другой стороны, если документация к STM32 кажется кому-то, работающему с этой платформой, так сказать, бредом сивой кобылы, то можно ли говорить о том, что этот человек по-настоящему понимает данную платформу?



Поэтому давайте поговорим о низкоуровневом программировании STM32 и доберёмся от включения питания STM32 до Hello, World.

STM32 очень похож на компьютер


На низком уровне микроконтроллер не особенно сильно отличается от полнофункционального компьютера, основанного на процессоре от Intel или AMD. Тут имеется как минимум одно процессорное ядро, инициализирующееся после подачи и стабилизации внешнего питания. В этот момент производится считывание загрузчика, код которого находится по адресу, заранее известному микроконтроллеру. А в обычных компьютерах подобную роль играет BIOS. В случае с MCU это код, находящийся по определённому смещению в (обычно) интегрированной памяти, предназначенной только для чтения. То, что происходит потом, полностью зависит от этого кода.

В целом, этот код решает основные задачи по подготовке системы к работе. Например, задаёт таблицу векторов прерываний и записывает определённые данные в некие регистры. Очень важной задачей, кроме того, является инициализация указателя стека (Stack Pointer, SP). В начале работы системы некоторые данные из ROM копируются в RAM. В итоге вызывается функция main(), что похоже на запуск операционной системы обычного компьютера, выполняемый после завершения подготовки системы к работе средствами BIOS.

Пример Pushy


Возможно, аналогом Hello, World для STM32 можно назвать пример из моего фреймворка для STM32 Nodate, который я ласково называю Pushy. Он ещё проще, чем традиционный пример Blinky, так как он использует лишь регистры управления тактированием и сбросом (Reset & Clock Control, RCC) и базовые возможности интерфейса ввода/вывода общего назначения (General-Purpose Input/Output, GPIO). Код этого примера считывает входной регистр GPIO-пина и подстраивает значение на выходном пине в соответствии с входным. Благодаря этому можно, с помощью кнопки, включать и выключать светодиод. Вот код этого примера:

#include <gpio.h>int main () {//const uint8_t led_pin = 3; // Nucleo-f042k6: Port B, pin 3.//const GPIO_ports led_port = GPIO_PORT_B;//const uint8_t led_pin = 13; // STM32F4-Discovery: Port D, pin 13 (оранжевый)//const GPIO_ports led_port = GPIO_PORT_D;//const uint8_t led_pin = 7; // Nucleo-F746ZG: Port B, pin 7 (синий)//const GPIO_ports led_port = GPIO_PORT_B;const uint8_t led_pin = 13; // Blue Pill: Port C, pin 13.const GPIO_ports led_port = GPIO_PORT_C;//const uint8_t button_pin = 1; // Nucleo-f042k6 (PB1)//const GPIO_ports button_port = GPIO_PORT_B;//const uint8_t button_pin = 0; // STM32F4-Discovery (PA0)//const GPIO_ports button_port = GPIO_PORT_A;//const uint8_t button_pin = 13; // Nucleo-F746ZG (PC13)//const GPIO_ports button_port = GPIO_PORT_C;const uint8_t button_pin = 10; // Blue Pillconst GPIO_ports button_port = GPIO_PORT_B;// Установить режим вывода на пине, к которому подключён светодиодGPIO::set_output(led_port, led_pin, GPIO_PULL_UP);GPIO::write(led_port, led_pin, GPIO_LEVEL_LOW);// Установить режим ввода на пине, к которому подключена кнопкаGPIO::set_input(button_port, button_pin, GPIO_FLOATING);// Если кнопка нажата (переход от высокого состояния к низкому), то 'button_down' будет в низком состоянии в том случае, если кнопка будет нажата.// Если кнопка не нажата (переход от низкого состояния к высокому, к Vdd), то 'button_down' будет в высоком состоянии в том случае, если кнопка будет нажата.uint8_t button_down;while (1) {button_down = GPIO::read(button_port, button_pin);if (button_down == 1) {GPIO::write(led_port, led_pin, GPIO_LEVEL_HIGH);}else {GPIO::write(led_port, led_pin, GPIO_LEVEL_LOW);}}return 0;}

Тут можно сразу обратить внимание на два самых заметных элемента. Первый это функция main(), которую вызывает система. Второй это подключения модуля GPIO. Этот модуль содержит статический C++-класс, возможности которого используются для записи данных в GPIO-выход, к которому подключён светодиод. Его же возможности применяются и при чтении данных с входа, к которому подключена кнопка. Тут можно видеть ещё и упоминание имён пинов платы Blue Pill (STM32F103C8), но в примере имеются предустановки и для других плат, которые можно активировать, раскомментировав соответствующие строки.

Где именно в этом примере используются регистры группы RCC? В названии этих регистров содержится намёк на то, что они позволяют управлять тактовой частотой MCU. Их можно сравнить с переключателями, которые могут пребывать в двух состояниях включено или выключено, включая и отключая соответствующие возможности MCU. Если посмотреть, например, на описание регистра RCC_AHBENR в разделе 6.4 руководства по STM32F0xx, то мы увидим бит, маркированный как IOPAEN (Input/Output Port A ENable, включение порта ввода/вывода A), который управляет частотой для периферии, подключённой к GPIO A. То же касается и других портов.


Раздел 6.4.6 руководства по STM32F0xx, описание регистра RCC_AHBENR

Как можно видеть на вышеприведённой иллюстрации, RCC_AHBENR это регистр, отвечающий за включение AHB. Это одна из шин внутри MCU, к которой подключены процессорное ядро, SRAM, ROM и периферийные устройства.

Шины AHB (Advanced High-performance Bus) и APB (Advanced Peripheral Bus) описаны в спецификации AMBA фирмы Arm.


Раздел 2.1 руководства по STM32F0xx, архитектура STM32F0xx

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

Низкоуровневое программирование


Как уже было сказано, первым при включении STM32 запускается код загрузчика. В случае с MCU STM32F042x6 универсальный код загрузчика, написанный на ассемблере Thumb, можно найти здесь. Это обычный код, предоставляемый STMicroelectronics (например, для STM32F0xx) вместе с CMSIS-пакетом. Он инициализирует MCU и вызывает функцию SystemInit(), объявленную в низкоуровневом C-коде CMSIS (вот пример для STM32F0xx).

Функция SystemInit() сбрасывает системные регистры, отвечающие за частоту, что приводит к использованию стандартной частоты HSI (High Speed Internal oscillator, высокоскоростной внутренний генератор). После выполнения процедур настройки libc (в данном случае используется Newlib вспомогательная C/C++-библиотека) она, наконец, вызывает функцию main() следующей командой:

bl main

Эта инструкция, название которой расшифровывается как Branch with Link (переход с сохранением адреса возврата), приводит к переходу к заданной метке. В этот момент мы оказываемся в функции main() нашего примера Pushy. После этого в дело вступают возможности класса GPIO.

Класс GPIO


Первый вызываемый нами метод класса это GPIO::set_output(). Он позволяет сделать указанный пин (с подключённым к нему повышающим резистором) выходным. Именно здесь мы встречаемся с первым различием между семействами MCU STM32. Дело в том, что более старые MCU, основанные на Cortex-M3 F1, имеют GPIO-периферию, очень сильно отличающуюся от той, которая используется в их более новых собратьях семейств F0, F4 и F7. Это выражается в том, что при работе с пинами STM32F1xx нужно записывать в единственный регистр множество опций:

// Управление вводом/выводом распределено между двумя комбинированными регистрами (CRL, CRH).if (pin < 8) {// Установим регистр CRL (CNF & MODE).uint8_t pinmode = pin * 4;uint8_t pincnf = pinmode + 2;if (speed == GPIO_LOW) {  instance.regs->CRL |= (0x2 << pinmode); }else if (speed == GPIO_MID) { instance.regs->CRL |= (0x1 << pinmode); }else if (speed == GPIO_HIGH) { instance.regs->CRL |= (0x3 << pinmode); }if (type == GPIO_PUSH_PULL) {  instance.regs->CRL &= ~(0x1 << pincnf); }else if (type == GPIO_OPEN_DRAIN) { instance.regs->CRL |= (0x1 << pincnf); }}else {// Установим регистр CRH.uint8_t pinmode = (pin - 8) * 4;uint8_t pincnf = pinmode + 2;if (speed == GPIO_LOW) {  instance.regs->CRH |= (0x2 << pinmode); }else if (speed == GPIO_MID) { instance.regs->CRH |= (0x1 << pinmode); }else if (speed == GPIO_HIGH) { instance.regs->CRH |= (0x3 << pinmode); }if (type == GPIO_PUSH_PULL) {  instance.regs->CRH &= ~(0x1 << pincnf); }else if (type == GPIO_OPEN_DRAIN) { instance.regs->CRH |= (0x1 << pincnf); }}

А в других упомянутых семействах MCU имеются отдельные регистры для каждой опции (режим, скорость, повышающий или понижающий резистор, тип):

uint8_t pin2 = pin * 2;instance.regs->MODER &= ~(0x3 << pin2);instance.regs->MODER |= (0x1 << pin2);instance.regs->PUPDR &= ~(0x3 << pin2);if (pupd == GPIO_PULL_UP) {instance.regs->PUPDR |= (0x1 << pin2);}else if (pupd == GPIO_PULL_DOWN) {instance.regs->PUPDR |= (0x2 << pin2);}if (type == GPIO_PUSH_PULL) {instance.regs->OTYPER &= ~(0x1 << pin);}else if (type == GPIO_OPEN_DRAIN) {instance.regs->OTYPER |= (0x1 << pin);}if (speed == GPIO_LOW) {instance.regs->OSPEEDR &= ~(0x3 << pin2);}else if (speed == GPIO_MID) {instance.regs->OSPEEDR &= ~(0x3 << pin2);instance.regs->OSPEEDR |= (0x1 << pin2);}else if (speed == GPIO_HIGH) {instance.regs->OSPEEDR &= ~(0x3 << pin2);instance.regs->OSPEEDR |= (0x3 << pin2);}

Запись опций в регистры выполняется с помощью побитовых операций, используемых для записи значений с применением битовых масок. Имена регистров обычно хорошо описывают их предназначение. Например PUPDR расшифровывается как Pull-Up Pull-Down Register регистр управления подтяжкой к плюсу питания или к земле.

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

uint8_t pin2 = pin * 2;instance.regs->MODER &= ~(0x3 << pin2);instance.regs->PUPDR &= ~(0x3 << pin2);if (pupd == GPIO_PULL_UP) {instance.regs->PUPDR |= (0x1 << pin2);}else {instance.regs->PUPDR |= (0x2 << pin2);}

Для чтения данных с входного пина мы пользуемся IDR (Input Data Register, регистр входных данных) для банка GPIO, с которым работаем:

uint32_t idr = instance.regs->IDR;out = (idr >> pin) & 1U; // Прочитать нужный бит.

Аналогично выглядит и использование ODR (Output Data Register, регистр выходных данных), с помощью которого осуществляется вывод данных на пин:

if (level == GPIO_LEVEL_LOW) {instance.regs->ODR &= ~(0x1 << pin);}else if (level == GPIO_LEVEL_HIGH) {instance.regs->ODR |= (0x1 << pin);}

И, наконец, в вышеприведённом коде имеется сущность instance, которая представляет собой ссылку на запись в структуре std::vector. Она была статически создана в ходе запуска MCU. В ней зарегистрированы свойства периферии:

std::vector<GPIO_instance>* GPIO_instances() {GPIO_instance instance;static std::vector<GPIO_instance>* instancesStatic = new std::vector<GPIO_instance>(12, instance);#if defined RCC_AHBENR_GPIOAEN || defined RCC_AHB1ENR_GPIOAEN || defined RCC_APB2ENR_IOPAEN((*instancesStatic))[GPIO_PORT_A].regs = GPIOA;#endif#if defined RCC_AHBENR_GPIOBEN || defined RCC_AHB1ENR_GPIOBEN || defined RCC_APB2ENR_IOPBEN((*instancesStatic))[GPIO_PORT_B].regs = GPIOB;#endif[..]return instancesStatic;}static std::vector<GPIO_instance>* instancesStatic = GPIO_instances();

Если периферийное устройство существует (то есть имеется в CMSIS-заголовке для конкретного MCU, например, для STM32F042), то в структуре GPIO_instance создаётся запись, указывающая на память, соответствующую регистрам этого устройства (regs). К этим записям, равно как и к мета-информации, содержащейся в них, потом можно обращаться. Например, можно узнать о состоянии устройства:

GPIO_instance &instance = (*instancesStatic)[port];// Проверяем, является ли порт активным. Если это не так - активируем его.if (!instance.active) {if (Rcc::enablePort((RccPort) port)) {instance.active = true;}else {return false;}}

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

Класс RCC


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

bool Rcc::enable(RccPeripheral peripheral) {uint8_t perNum = (uint8_t) peripheral;RccPeripheralHandle &ph = (*perHandlesStatic)[perNum];if (ph.exists == false) {return false;}// Проверка состояния текущего периферийного устройства.if (ph.count > 0) {if (ph.count >= handle_max) {return false;}// Увеличение количества обработчиков на 1.ph.count++;}else {// Активация периферийного устройства.ph.count = 1;*(ph.enr) |= (1 << ph.enable);}return true;}

В дополнение к изменению значения соответствующего бита (ph.enable) мы подсчитываем ссылки. Это делается для того чтобы случайно не выключить периферийное устройство, которое используется в другом месте кода.

Запуск примера


После того, как мы разобрались с вышеприведённым материалом, у нас должно появиться некоторое понимание того, как пример Pushy работает на низком уровне. Теперь мы можем его собрать и запустить. Для этого нам понадобится, как уже было сказано, набор инструментов ARM и фреймворк Nodate. Первый можно установить с помощью используемого вами менеджера пакетов (речь идёт о пакете arm-none-eabi-gcc) или загрузив его с сайта Arm. Фреймворк Nodate можно установить с GitHub. После этого путь к корневой папке фреймворка нужно записать в глобальную системную переменную NODATE_HOME.

После того, как эти задачи решены, нужно перейти в папку Nodate, а потом в подпапку examples/stm32/pushy. В ней надо открыть файл Makefile и указать предустановки, рассчитанные на используемую плату (там сейчас есть предустановки для Blue Pill, Nucleo-F042K6, STM32F4-Discovery, Nucleo-746ZG). Далее, надо открыть файл src/pushy.cpp и раскомментировать строки, имеющие отношение к целевой плате.

Далее, в папке, в которой находится Makefile, нужно собрать проект командой make. Целевая плата должна быть подключена к компьютеру с использованием ST-Link, на компьютере должна быть установлена программа OpenOCD. Если это так MCU можно прошить командой make flash. После этого соответствующий образ будет записан в память устройства.

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

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

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

Какие инструменты вы используете при написании программ для STM32?



Подробнее..

Как писать статьи в IT-журналы и блоги

28.11.2020 14:04:43 | Автор: admin

Недавно на нашем ютуб-канале выступил Андрей Письменный, главный редактор Xakep.ru.

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

В этом выступлении он поделится с вами опытом и приемами, которые пригодятся в работе с текстом о технологиях.

Делимся записью эфира и расшифровкой.

Меня зовут Андрей Письменный, я работаю главным редактором в журнале XAKEP. Думаю, никому не нужно рассказывать, что такое XAKEP. Я работаю в индустрии уже 14 лет, успел поработать, наверно, во всех крупных издательских домах с тематикой IT ТехноМир (он же ИгроМир), Компьютерра.

Присоединился к журналу XAKEP я только в 2015 году, поэтому его историю я хорошо знаю только за последние пять лет. Те легенды, которые людям, наверно, интересно было бы услышать (и о которых меня просили в комментариях на Хабре), для меня тоже легенды. Сегодня я, в основном, буду рассказывать о том, в чем разбираюсь лучше всего: в приемах, которые помогают писать технические статьи и делать их лучше. Про работу в XAKEPе я тоже рад рассказывать, но это, скорее, будет в ответах на вопросы.

Я начинал конкретно в Компьюленте это такой новостной сайт при журнале Компьютерра: писал там первые полгода крошечные новости, по 500 знаков. Для меня это был лучший опыт. Не говорю, что именно так все должны начинать, но опыт прочтения статей и новостей на английском языке и сжатый раз в десять (обычно приблизительно с 5000 знаков) их пересказ это то, что помогает научиться писать лучше с нуля, отсекая все лишнее. Ну, и английский язык я подтянул, конечно сегодня это необходимо всем, кому нужно работать с источниками. Не с Google Translate же работать. В Комьютерре я проработал в сумме примерно 10 лет, на недолгое время уходил в ТехноМир работать над журналом Mobi. В 2013 году у меня был опыт фриланса, чуть меньше года, когда я писал для различных изданий. Среди них оказался и XAKEP! Мы как-то сразу друг друга нашли, и я начал периодически писать туда. В 2015 году я работал в Ferra.ru, и меня пригласили в XAKEP редактором. Два года назад я стал главным редактором.

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

Скажу по секрету: хакеры пишут ужасающе! Работа редактором в журнале XAKEP это для меня классный челлендж, я таких текстов раньше не встречал. Я не говорю это кому-то в обиду. Дело в том, что хакер это такой технарь, который не строит, а с помощью своей интуиции понимает, как работают сложные системы. У него, в отличие от инженера, часто в голове бывает прекрасный хаос, который помогает находить интуитивные решения. Ну, и пишет он соответствующим образом а мы помогаем все это вытягивать на тот уровень, когда человек может зайти и прочитать текст, и это не будет слишком затруднительно.

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

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

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

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

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

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

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

Я рекомендую делать так, чтобы в заголовке был глагол. Если он есть это значит, что статья описывает действие. Если статья называется, например, протокол TCP/IP скорее всего, это довольно скучная статья, которая просто описывает какую-то существующую вещь. В такой статье автор будет смотреть на эту вещь, и ничего не будет происходить. А вот если статья называется как использовать TCP/IP для какой-то цели, то она гораздо лучше очерчивается и обещает быть веселее, потому что в ней мы что-то делаем, а не описываем что-то.
Часто люди сталкиваются с проблемой чистого листа когда ты садишься и думаешь, о чем же писать. Для таких случаев существует очень действенный совет из народного творчества (уберите детей от экранов): начинайте со слов Так, бля, короче! И дальше текст начинает идти сам собой. Потом, конечно, вступление можно убрать. Такая полу-шутка, но, на самом деле, правда: если начинать в неформальном ключе, то дальше будет легче начинать говорить о какой бы то ни было теме.

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

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

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

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

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

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

Еще одна вещь я такие случаи называю словом вещание. В устной речи или по радио часто объявляют, что сейчас будет что-то. Это нормально, но в статье перед читателем уже находится весь текст. Он сам прекрасно видит, что будет дальше и что было до этого не нужно ничего объявлять. Авторы еще очень любят слова как было сказано выше, напомню, поясню после них они либо повторяют то, что уже было сказано, либо подтверждают, что это уже было сказано. Людям совершенно не нужны подобные напоминания. Если действительно нужно упомянуть какой-то факт снова, то можно просто упомянуть его снова, не обговаривая, или упомянуть как-то по-другому в новом контексте. Я часто выкидываю слова напомню и поясню вместо них можно просто напоминать и пояснять. В английских учебниках это правило называется show, dont tell не говори, а показывай. Не нужно объявлять, что ты сейчас что-то сделаешь, нужно просто делать. Все поймут.

По поводу вещания: часто люди путают статью и радиопередачу. В XAKEPе это почему-то прижилось, и я очень часто вижу тексты, которые начинаются со слова Привет! и заканчиваются До свидания, Stay tuned и так далее. Может быть, это какая-то авторская фишка, и кому-то это прикольно, но для меня это странно. Вроде как человек пытается изображать ди-джея текстом. Обычно мы убираем такие вещи.

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

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

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

Бывают еще разные проблемы например, тавтология, но это понятно: этому в школе учат.
Распространенная ошибка в неотредактированных текстах компания совершает действие. Это уже более тонкая вещь, и, в принципе, по первому разу можно не обращать на это внимания и писать, как получится. Редактор сделает. Суть в том, что компания это люди. Только люди совершают действия, а не компании. Еще иногда компанию называют во множественном числе. Microsoft решили, Facebook сделало. Вместо этого можно уточнить, написать инженеры Microsoft или руководство Facebook так будет звучать намного грамотнее.

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

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

Мессенджеры, твиттер, подписки ютюба, кто-то пишет письма постоянно особенно, если работаешь удаленно. Я очень рекомендую таймеры помодоро (метод помидора) это обычный кухонный таймер. Можно использовать одну из миллиона программ-таймеров из интернета. Многие, кто говорит о продуктивности, рекомендуют простой алгоритм: 15-25 минут напряженной работы, 5-10 минут отдыха. Он настраивается по личным предпочтениям и в зависимости от поставленных задач. Например, писать довольно тяжело, и себе я обычно ставлю всего 15 минут, а потом 5 отдыха. Главное пока эти 15 минут не пройдут, ни на что не отвлекаться. Редко бывают такие сообщения в телеграме, которые не подождут 15 минут.

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

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

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

Еще одна вещь, которую я люблю это чистый инбокс. Это очень полезно. Знаю, что у людей бывает в почте заброшенная помойка с 700 непрочитанных сообщений, но инбокс это не только электронная почта. Это дела, которые могут копиться в разных местах. Я стараюсь все разгребать, делать так, чтобы ни почтовый клиент, ни другие места не забивались. Надо просто решать быстро, будешь или не будешь ты что-то делать. Если надо кому-то срочно ответить, то можно сделать это в стиле большого начальства, двумя словами часто лучше получить от вас два слова, чем не получить ничего. Это важно для того, чтобы писать: всегда лучше иметь чистую голову, без списка нависающих задач. По Getting Things Done все эти дела нужно выписывать и возвращаться к ним, когда будет время, возможность или контекст, чтобы их сделать.

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

Что еще можно сделать, чтобы улучшить свои навыки письма? Надо читать. Причем читать не только социальные СМИ типа Хабра, где тексты разного качества, но и профессиональные какой-нибудь Коммерсант, Ведомости, Esquire. Хотя Esquire это скорее литературные материалы, на него равняться в технических текстах необязательно. Конечно, чтение само по себе не поможет научиться писать для этого нужно все-таки писать. Хоть как-то. Нужно не стесняться: в следующий раз получится лучше. Без практики здесь никак. Как редактор, я, конечно, рекомендую поработать с редактором, если есть такая возможность. Я сам очень благодарен и главным, и литературным редакторам: пусть они ругались, смеялись, обижали иногда, в некоторых случаях молча правили. Всегда нужно смотреть, почему что-то было исправлено. Если ты понимаешь, почему это было исправлено, то велика вероятность, что ты в следующий раз не допустишь ошибку.

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

Из того, что можно почитать, все рекомендуют Пиши, сокращай Ильяхова. Хорошая книжка. Я не читал целиком, но смотрел, и со всем, что увидел, был согласен. Рад, что кто-то тоже об этом пишет. Есть еще книжка Интернет-журналистика Амзина это бывший редактор раздела Технологии Ленты.ру. Многим нравится книга Слово живое и мертвое Норы Галь, хотя я к ней отношусь с осторожностью там язык не вполне актуальный. Почитать про подходы можно, конечно.



Что было ранее


  1. Илона Папава, Senior Software Engineer в Facebook как попасть на стажировку, получить оффер и все о работе в компании
  2. Борис Янгель, ML-инженер Яндекса как не пополнить ряды стремных специалистов, если ты Data Scientist
  3. Александр Калошин, СEO LastBackend как запустить стартап, выйти на рынок Китая и получить 15 млн инвестиций.
  4. Наталья Теплухина, Vue.js core team member, GoogleDevExpret как пройти собеседование в GitLab, попасть в команду разработчиков Vue и стать Staff-engineer.
  5. Ашот Оганесян, основатель и технический директор компании DeviceLock кто ворует и зарабатывает на ваших персональных данных.
  6. Сания Галимова, маркетолог RUVDS как жить и работать с психиатрическим диагнозом. Часть 1. Часть 2.
  7. Илья Кашлаков, руководитель фронтенд-отдела Яндекс.Денег как стать тимлидом фронтендеров и как жить после этого.
  8. Влада Рау, Senior Digital Analyst в McKinsey Digital Labs как попасть на стажировку в Google, уйти в консалтинг и переехать в Лондон.
  9. Ричард Левелорд Грей, создатель игр Duke Nukem 3D, SiN, Blood про личную жизнь, любимые игры и о Москве.
  10. Вячеслав Дреер, гейм-дизайнер и продюсер игр с 12-летним стажем про игры, их жизненный цикл и монетизацию
  11. Андрей, технический директор GameAcademy как видеоигры помогают прокачивать реальные навыки и найти работу мечты.
  12. Александр Высоцкий, ведущий PHP-разработчик Badoo как создаются Highload проекты на PHP в Badoo.
  13. Андрей Евсюков, заместитель CTO в Delivery Club про найм 50 синьоров за 43 дня и о том, как оптимизировать фреймворк найма
  14. Джон Ромеро, создатель игр Doom, Quake и Wolfenstein 3D байки о том, как создавался DOOM
  15. Паша Жовнер, создатель тамагочи для хакеров Flipper Zero о своем проекте и другой деятельности
  16. Татьяна Ландо, лингвист-аналитик в Google как научить Google-ассистента человеческому поведению
  17. Путь от джуна до исполнительного директора в Сбербанке. Интервью с Алексеем Левановым
  18. Как Data Science продает вам рекламу? Интервью с инженером Unity
  19. Как я переехал в Лондон c Revolut
  20. Завтрак с легендарным геймдизайнером Американом МакГи: о новой Алисе, России и депрессии
  21. Как организовать IT-конференцию и не сойти с ума
  22. Чем биоинформатика отличается от вычислительной биологии краткое введение
  23. Профессия системный аналитик: развитие сообществ, популяризация профессии и подготовка
  24. Три задачи из геномики, которые решают биоинформатики в СПбГУ



Подробнее..

Перевод Реставрация легендарной 37-летней IBM Model F

28.11.2020 16:23:21 | Автор: admin


Мне захотелось поделиться своим опытом возвращения механической клавиатуре IBM Model F XT 1983 года ее былого шика. Я от и до расскажу вам весь процесс, включая описание шагов, ошибок и дополнительного оборудования, которое мне потребовалось для подключения этого раритета к современному ПК. Данная статья посвящается моему отцу, который познакомил меня с миром компьютеров.

Приобретение


Несколько месяцев назад отец спросил, не интересует ли меня его старый ПК IBM model 5150, на что я без промедлений уверенно ответил Да!. Первым делом я решил восстановить эту самую механическую клавиатуру. Если рассмотреть ситуацию с сентиментальной позиции преемничества, то получалось, что отец передает инструменты своего дела для продолжения семейной линии компьютерного хобби, от чего я не мог отказаться.



Предыстория Model F


Если вы незнакомы с этой серией клавиатур, то modelfkeyboards.com приводит неплохое общее описание:

В производстве клавиатур IBM Model F использовались не только наилучшие переключатели, но и серьезный объем материалов, которые включали в себя около 2кг стали и других металлов, что предполагало сохранение идеальной работоспособности в течение ни одного поколения. Проблема же в том, что больше их в таком виде не выпускают. IBM Model F была снята с производства в 80-х. Если вам удастся найти такую клавиатуру, то она, скорее всего, будет грязной, сломанной и потребует долгих часов кропотливого труда для возвращения работоспособного состояния.

Этот клавиатурный танк весит почти три килограмма, звучит так, и, судя по этому обзору, в 1982 году продавался в розницу за $300-400 (на современные деньги это примерно $800-1000),
На восстановление у меня действительно ушло несколько часов и, к счастью, обошлось без паяльника и замены электрических/механических компонентов, потому что все итак было в прекрасной формеистинное свидетельство долговечного дизайна! А еще круче то, что данную статью я набираю именно на этой восстановленной клавиатуре Model F.

Переходник с XT на USB


Прежде чем приступить к процессу, я нашел сайт ClickyKeyboards, специализирующийся на реставрации и коллекционировании клавиатур Model M последователей Model F. На этом сайте есть раздел, посвященный переходникам и конвертерам, которые могут потребоваться для адаптирования старых клавиатур с 5-контактным DIN-разъемом к современным USB-портам. Среди прочих на ClickyKeyboards упоминается компания Hagstrom Electronics, которая продает энкодеры и конвертеры протоколов. Особо не разглядывая другие товары, я поспешил купить KE18-XTAT-PS/2, который преобразует XT клавиатуру в клавиатуру PS/2. Стоило это устройство $55. Я очень обрадовался, найдя переходник на PS/2, потому что далее мне не представляло трудностей найти конвертер из PS/2 в USB.

После получения KE18-XTAT-PS/2 я с нетерпением запустил старинный отцовский системный блок (да, он работал на Windows 2000!) с входом PS/2 на материнской плате, после чего сразу приступил к проверке всех клавиш и убедился, что они по-прежнему работают. Получив подтверждение работоспособности клавиатуры, я был готов переходить к ее реставрации.



Глубокая чистка




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



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

Удаление ржавчины


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





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



Goo Gone в помощь




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



Купание клавиш


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



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

Апгрейд из XT в USB


После успешного тестирования клавиатуры и практически полного завершения ее реставрации пришло время поиска кабеля-переходника PS/2 USB. Между делом я снова забрел на сайт Hagstrom Electronics и заметил, что у них в продаже уже есть небольшой блок KE-XTUSB для преобразования XT в USB, который продавался по той же цене, что и прежний. В итоге они любезно позволили мне вернуть ранее купленный KE18-XTAT-PS/2 в обмен на это устройство. Спустя несколько дней конвертер поступил на почту, и я с нетерпением подключил его уже к своему текущему компьютеру.



Итог


Все заработало прекрасно за исключением двух клавиш. Пружинный механизм s либо не обнаруживал нажатия клавиши, либо застревал в нажатом положении, выводя бесконечную череду sssssssssssssssssssssssssss на экране. Путем нехитрых манипуляций я добился правильного положения колпачка клавиши, и теперь она работает отлично. Второй проблемной клавишей оказался бухгалтерский "+" рядом с блоком дополнительных клавиш. В этом случае я обнаружил выскочившую каким-то образом пружинку, которую решил зафиксировать супер клеем. Тем не менее проблему это не устранило, потому что нажатия этой клавиши не регистрируются. Не большая потеря, так как "+" можно напечатать и другой клавишей.
В общем и целом, я очень впечатлен внешним видом клавиатуры, и если сравнивать с этим видео, в котором распаковывается новехонькая Model F, то выглядит она почти так же!



Если у вас есть вопросы или комментарии обращайтесь в Twitter @opsdisk



Подробнее..

Перевод Подробности об использовании CSS-функции minmax() в Grid-макетах

29.11.2020 12:04:16 | Автор: admin
Существует множество руководств, в которых рассматриваются общие вопросы работы с CSS Grid, с механизмом, позволяющим создавать сеточные макеты. Я и сам немало об этом писал. Но я обратил внимание на то, что у многих разработчиков возникают сложности с использованием CSS-функции minmax(). Пожалуй, дело тут в том, что большинство существующих публикаций на эту тему либо не вдаются в детали, либо не включают в себя достаточного количества пояснений и примеров из реального мира. А minmax() это очень мощная и полезная функция. Именно по этой причине я и решил написать данную статью. Это нечто вроде полного руководства по minmax(), задача которого дать читателям то, чего не дают им другие публикации на эту тему.



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

Общие вопросы использования minmax() в Grid-макетах


В спецификации CSS о функции minmax(min, max) сказано, что она определяет диапазон размеров, которые больше или равны min и меньше или равны max.

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

.o-grid {display: grid;grid-template-columns: minmax(200px, 500px) 1fr 1fr;grid-gap: 1rem;}

Вот как это будет выглядеть на схеме.


Результат применения функции minmax() при создании Grid-макета

Проанализируем этот макет:

  1. Здесь имеется сетка с тремя столбцами.
  2. Ширина первого столбца задана как minmax(200px, 500px). Минимальная ширина этого столбца составляет 200px, максимальная 500px.
  3. Два других столбца имеют ширину 1fr. Это означает, что они займут оставшееся свободное пространство.

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


Горизонтальная полоса прокрутки

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

Проверка правильности использования функции minmax()


Если значение min, переданное функции minmax(min, max), больше значения max, то значение max будет проигнорировано. В результате в конструкции minmax(min, max) реально использоваться будет лишь минимальное значение.


Если значение min больше значения max значение max игнорируется

Кроме того, важно помнить о том, что значение вроде 1fr нельзя использовать в качестве значения min. Оно может быть использовано только в роли значения max. При этом подобная ситуация хуже, чем та, когда min больше, чем max! Система проигнорирует всю конструкцию, содержащую подобное объявление.


Нельзя использовать 1fr в качестве значения min

Использование нуля в качестве значения min функции minmax()


Что произойдёт в том случае, если попытаться воспользоваться конструкцией вида minmax(0, 500px)? Пожалуй, вы уже знаете ответ на этот вопрос. Ширина столбца будет, как минимум, нулевой, и при этом она не превысит 500px. То есть ширина столбца будет меняться в достаточно широких пределах.


Ширина столбца может изменяться в диапазоне от 0 до 500px

Простой сеточный макет


Представим, что нам надо создать сеточный макет, состоящий из 3 колонок. Мы поступим так:

.o-grid {display: grid;grid-template-columns: minmax(200px, 1fr) minmax(200px, 1fr) minmax(200px, 1fr);grid-gap: 1rem;}

Колонки будут иметь минимальную ширину в 200px. Вот как они будут выглядеть.


Макет, минимальная ширина столбцов которого равна 200px

Избежать троекратного повторения конструкции minmax(200px, 1fr) можно, воспользовавшись функцией repeat():

.o-grid {display: grid;grid-template-columns: repeat(3, minmax(200px, 1fr));grid-gap: 1rem;}

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

Ручное изменение количества столбцов


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

Проблема появления горизонтальной полосы прокрутки


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


Горизонтальная полоса прокрутки

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

При разработке Flexbox-макетов это делается путём добавления свойства flex-wrap: wrap к родительскому элементу макета:

.parent {display: flex;flex-wrap: wrap;}


Flexbox-макет, в котором используется свойство flex-wrap: wrap, и макет, в котором это свойство не используется

При проектировании Grid-макетов для достижения подобного эффекта можно воспользоваться ключевыми словами auto-fill и auto-fit.


Сеточный макет, в котором применяются auto-fit/auto-fill, и макет, в котором эти ключевые слова не применяются

Использование ключевых слов auto-fit и auto-fill


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

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


Результаты применения ключевых слов auto-fill и auto-fit

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

Вот видеозапись, в которой показано поведение макетов, созданных, соответственно, с использованием auto-fill и auto-fit.


Исследование поведения макетов, созданных с использованием ключевых слов auto-fill и auto-fit

Распределение свободного пространства между столбцами auto-fit-макета


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


Распределение свободного пространства между столбцами auto-fit-макета

Распределение свободного пространства между столбцами auto-fill-макета


Если говорить о применении ключевого слова auto-fill, то тут браузер поступает со свободным пространством иначе. А именно, при увеличении ширины области просмотра ширина элементов не увеличивается. При этом размер свободного пространства (оно, в этом видео, выделено пунктиром) растёт.


Распределение свободного пространства между столбцами auto-fill-макета

Сценарии использования и практические примеры


Карточки, основанные на сеточном макете



Карточки

Полагаю, что функцию minmax() чаще всего используют для оформления карточек, применяя её при создании элемента-контейнера.

.wrapper {display: grid;grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));grid-gap: 1rem;}

Когда я начал изучать технологию Grid, я неуютно чувствовал себя, глядя на свойство grid-template-columns, использованное в этом примере. Тут важно обратить внимание на то, как поведёт себя страница в областях просмотра, ширина которых меньше 250px. Дело в том, что в таких ситуациях на экране появится вертикальная полоса прокрутки.


Появление вертикальной полосы прокрутки в области просмотра, ширина которой меньше 250px

Решить эту проблему можно двумя способами. Первый заключается в использовании медиа-запросов. В основе этого способа лежит идея, в соответствии с которой grid-template-columns устанавливается в 1fr. А когда ширина области просмотра достаточно велика применяется minmax():

.wrapper {display: grid;grid-template-columns: 1fr;grid-gap: 1rem;}@media (min-width: 300px) {.wrapper {grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));}}

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

.wrapper {display: grid;grid-template-columns: repeat(auto-fill, minmax(min(100%, 250px), 1fr));grid-gap: 1rem;}

Я использовал тут, в качестве первого значения функции minmax(), функцию сравнения min(). Вот что здесь происходит:

  • Если ширина области просмотра меньше, чем 250px, первым значением, передаваемым minmax(), будет 100% ширины родительского элемента.
  • Если ширина области просмотра будет больше, чем 250px, тогда первым значением minmax() будет 250px.

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

Использование единицы измерения ch при настройке элемента-контейнера


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

.wrapper {display: grid;grid-template-columns: minmax(1rem, 1fr) minmax(auto, 70ch) minmax(1rem, 1fr);grid-gap: 1rem;}

Первый и последний столбцы играют вспомогательную роль, управляя свободным пространством. Нас тут интересует центральный столбец. Обратите внимание на то, что при его настройке использована конструкция вида minmax(auto, 70ch). Это означает, что максимальной шириной данного столбца является ширина, которую занимают 70 символов, выстроенных в одну строку. Это идеальное количество символов на строку, обеспечивающее комфортное чтение текста.


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

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


Статья на экране мобильного устройства

Проблема, возникающая при необдуманном использовании ключевого слова auto-fit


У того, кто впервые узнал о ключевом слове auto-fit, может возникнуть желание использовать его повсюду. Но тут есть одна проблема, которая проявляется тогда, когда содержимое сетки (например количество карточек) меняется, а разработчик не контролирует это содержимое.

.wrapper {display: grid;grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));grid-gap: 1rem;}

Тут описана сетка, используемая для вывода карточек. Когда имеется 4 карточки макет выглядит замечательно. Но если карточка всего одна она растянется на всё свободное пространство.


Проблема необдуманного использования auto-fit

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


Вывод карточки с изображением

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

Пользуетесь ли вы CSS-функцией minmax() в Grid-макетах?



Подробнее..

Перевод Кунг-фу стиля Linux великая сила make

29.11.2020 16:21:40 | Автор: admin
Со временем Linux (точнее операционная система, которую обычно называют Linux, представляющая собой ядро Linux и GNU-инструменты) стала гораздо сложнее, чем Unix ОС, стоящая у истоков Linux. Это, конечно, неизбежно. Но это означает, что тем, кто пользуется Linux уже давно, нужно было постепенно расширять свои знания и навыки, осваивая новые возможности. А вот на тех, кто начинает работу в Linux в наши дни, сваливается необходимость освоить систему, так сказать, за один присест. Эту ситуацию хорошо иллюстрирует пример того, как в Linux обычно осуществляется сборка программ. Практически во всех проектах используется make утилита, которая, запуская процессы компиляции кода, пытается делать только то, что нужно. Это было особенно важно в те времена, когда компьютеру с процессором, работающим на частоте в 100 МГц, и с медленным жёстким диском, нужно было потратить целый день на то, чтобы собрать какой-нибудь серьёзный проект. Программа make, судя по всему, устроена очень просто. Но сегодня у того, кто почитает типичный файл Makefile, может закружиться голова. А во многих проектах используются дополнительные абстракции, которые ещё сильнее всё запутывают.



В этом материале я хочу продемонстрировать вам то, насколько простым может быть файл Makefile. Если вы способны создать простой Makefile, это значит, что вы сможете найти гораздо больше способов применения утилиты make, чем может показаться на первый взгляд. Примеры, которые я будут тут показывать, основаны на языке C, но дело тут не в самом языке, а в его распространённости и широкой известности. С помощью make можно, средствами командной строки Linux, собрать практически всё что угодно.

Если есть IDE, собирающая проекты, то Makefile не нужен?


Кто-то может усмехнуться и сказать, что Makefile ему не нужен. Используемая им IDE (Integrated Development Environment, интегрированная среда разработки) сама собирает его проекты. Это, может, и так, но в недрах множества IDE, на самом деле, используются файлы Makefile. Даже в тех, в которых не предусмотрены механизмы экспорта таких файлов. Умение обращаться с файлами Makefile упрощает написание сборочных скриптов и работу с CI/CD-инструментами, которые обычно ожидают наличия таких файлов.

Единственным исключением является Java. В Java-разработке имеются собственные инструменты для сборки проектов, утилита make в этой среде распространена не так сильно, как в других. Но make можно использовать и тем, кто пишет на Java вместе с инструментами командной строки вроде javac или gcj.

Простейший Makefile


Вот пример простейшего Makefile:

hello: hello.c

Вот и всё. Тут имеется правило, в котором сказано, что имеется файл hello, зависящий от файла hello.c. Если hello.c новее чем hello, то hello надо собрать. Так, а тут притормозим. Откуда программа знает о том, что ей делать? Обычно в Makefile включают инструкции по сборке целей (hello в нашем случае) на основе зависимостей. Но существуют и правила, применяемые по умолчанию.

Если создать вышеописанный файл Makefile в директории, в которой уже есть файл hello.c, и выполнить в этой директории команду make, можно будет увидеть, что выполнится такая команда:

cc hello.c -o hello

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

make: 'hello' is up to date.

Для того чтобы снова собрать проект, нужно либо внести в hello.c изменения, либо обработать hello.c командой touch, либо удалить файл hello. Между прочим, если запустить make с опцией -n, то программа сообщит о том, что собирается делать, но при этом ничего делать не будет. Это может пригодиться в тех случаях, когда нужно разобраться с тем, к выполнению каких команд приведёт обработка некоего Makefile.

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

CC=gccCFLAGS=-ghello : hello.c

При использовании такого Makefile вызов make приведёт к выполнению такой команды:

gcc -g hello.c -o hello

В сложных файлах Makefile можно настраивать уже применяемые опции, можно добавлять комментарии (начинающиеся со знака #):

CC=gccCFLAGS=-g# Закомментируйте следующую строку для отключения оптимизацииCFLAGS+=-Ohello : hello.c

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

$(CC) $(CFLAGS) $(CPPFLAGS) hello.c -o hello

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

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


Возможно, правила, используемые по умолчанию, вас не устраивают. Это не проблема. Утилита make, правда, весьма внимательно относится к формату файлов Makefile. Так, если начать строку с символа Tab (не с нескольких пробелов, а именно с настоящего Tab), тогда то, что находится в строке, будет восприниматься как команда запуска некоего скрипта, а не как правило. И хотя то, что показано ниже, возможно, выглядит не особенно аккуратно, это пример вполне работоспособного Makefile:

hello : hello.cgcc -g -O hello.c

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

% : %.c$(CC) $(CPPFLAGS) $(CFLAGS) $< -o $@

Тут представлено правило, которое, в целом, соответствует правилу, применяемому по умолчанию. Символ % это универсальный местозаполнитель, соответствующий любой последовательности символов. В переменную $< попадает имя первого (и, в данном случае, единственного) реквизита, которым является hello.c. Переменная $@ даёт нам имя цели (в данном примере hello). Есть и многие другие особые переменные, но для начала вам достаточно знать об этих двух.

В Makefile могут быть многострочные скрипты (обрабатываемые системной командной оболочкой, используемой по умолчанию, хотя это можно и изменить). Главное требование строки должны начинаться с Tab. В файле можно описывать множество реквизитов. Например:

hello : hello.c hello.h mylocallib.h

Правда, подобный код довольно тяжело поддерживать. При использовании C и C++ большинство компиляторов (включая gcc) могут создавать .d-файлы, которые способны автоматически сообщать make о том, от каких именно файлов зависит объект. Это, правда, выходит за рамки данного материала. Если вас это заинтересовало взгляните на справку по gcc, и, в частности, на описание опции -MMD.

Объектные файлы


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

hello : hello.o mylib.ohello.o : hello.c hello.h mylib.hmylib.o : mylib.c mylib.h

Благодаря правилам, применяемым по умолчанию, это всё, что вам нужно. Утилита make достаточно интеллектуальна для того чтобы понять, что ей нужен файл hello.o, поэтому она найдёт правило для него. Конечно, после каждого из этих правил можно добавить строку (или строки) со скриптом, сделав это в том случае, если нужно контролировать то, что происходит в процессе сборки проекта.

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

all : hello libtest config-editor

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

.PHONY: all

К фиктивным целям можно прикреплять действия. Например, в Makefile часто можно увидеть примерно такую конструкцию:

.PHONY: cleanclean:rm *.o

Благодаря этому можно выполнить команду make clean для того чтобы удалить все объектные файлы. Возможно, подобную цель не будут делать первой, а такую команду не будут прикреплять к чему-то вроде цели all. Ещё одним распространённым приёмом является создание фиктивной цели, код, связанный с которой, прошивает программу на микроконтроллер. В результате, например, выполнив команду вроде make program можно записать программу на некое устройство.

Необычные способы использование make


Обычно make используют для сборки программ. Но, как и в случаях с любыми другими Unix/Linux-инструментами, находятся люди, которые используют make для решения самых разных задач. Например, совсем несложно написать Makefile, использующий pandoc для преобразования документа в разные форматы, выполняемого при изменении документа.

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

Итоги


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

Используете ли вы make для решения каких-то особенных задач?



Подробнее..

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

30.11.2020 12:14:44 | Автор: admin


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

Сегодня мы будем его разворачивать. Я не буду давать полной пошаговой инструкции, но постараюсь упомянуть про ключевые моменты архитектуры, на которые стоит обратить внимание. В частности, разберем балансировку нагрузки, репликацию БД и регламентное обслуживание без прерывания сервиса.
Деплоить будем в отказоустойчивом варианте для небольшой компании в 150-1000 пользователей, но для домашних пользователей тоже пригодится.

Что нужно компаниям?


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

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

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

  1. Киллер-фича с предоставлением доступа вовне в рамках федерации. Можно интегрироваться с аналогичным продуктом у коллег и другой компании.
  2. Предоставление доступов вовне по прямой ссылке. Очень помогает, если вы, например, работаете в полиграфии и надо обмениваться с клиентами большими объемами тяжелых данных.
  3. Редактор документов Collabora, который выполняется на стороне сервера и работает как фронтенд к LibreOffice.
  4. Чаты и видеозвонки. Немного спорная, не совсем стабильная функция, но она есть и работает. В последней версии ее уже стабилизировали.

Строим архитектуру


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


Типовой вариант для домашнего использования и единичных инсталляций.

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


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

Основные компоненты системы:

  • 1 Балансировщик. Можете взять HAproxy или Nginx. Я рассмотрю вариант с Nginx.
  • 2-4 штуки Application server (web-server). Сама инсталляция Nextcloud с основным кодом на php.
  • 2 БД. В стандартной рекомендованной конфигурации это MariaDB.
  • NFS-хранилище.
  • Redis для кеширования запросов к БД

Балансировщик


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

Обратите внимание, что балансировщик также является точкой терминирования SSL/TLS для ваших клиентов, а общение с бэкендом может идти как по HTTP для доверенных внутренних сетей, так и с дополнительным HTTPS, если трафик до application-сервера идет по общим недоверенным каналам.

База данных


Типовое решение MySQL/MariaDB в кластерном исполнении в master-slave репликации. При этом у вас активна только одна БД, а вторая работает в режиме горячего резерва на случай аварийного отказа основной или при проведении плановых работ. Можно рассмотреть и вариант с балансировкой нагрузки, но она технически сложнее. При использовании MariaDB Galera Cluster с вариантом master-master репликации нужно использовать нечетное количество нод, но не менее трех. Таким образом минимизируется риск split-brain ситуаций, при рассечении связности между нодами.

Storage


Любое оптимальное для вас решение, которое предоставляет NFS-протокол. В случае высоких нагрузок можно рассмотреть IBM Elastic Storage или Ceph. Также возможно использование S3-совместимого объектного хранилища, но это скорее вариант для особо крупных инсталляций.

HDD или SSD


В принципе, для средних по размеру инсталляций вполне достаточно использования только HDD. Узким участком тут будут iops при чтении из БД, что сильно сказывается на отзывчивости системы, но, при наличии Redis, который кеширует все в RAM, это не будет особой проблемой. Так же часть кеша будет лежать в memcached на application-серверах. Тем не менее, я бы рекомендовал, по возможности, размещать application-сервера на SSD. Веб-интерфейс становится намного отзывчивее по ощущениям. При этом та же синхронизация файлов на десктопных клиентах будет работать примерно так же, как и при использовании HDD для этих узлов.

Скорость синхронизации и отдачи файлов будет определяться уже производительностью вашего NFS-хранилища.

Конфигурируем балансировщик


В качестве примера я приведу простой в базовой конфигурации и эффективный nginx. Да, различные дополнительные failover-плюшки у него доступны только в платной версии, но даже в базовом варианте он отлично выполняет свою задачу. Учтите, что балансировка типа round robin или random нам не подходит, так как application-сервера хранят кеши для конкретных клиентов.
К счастью, это решается использованием метода ip_hash. В таком случае сессии пользователя будут закреплены за конкретным бэкендом, к которому будут направляться все запросы со стороны пользователя. Этот момент описан в документации:
Задаёт для группы метод балансировки нагрузки, при котором запросы распределяются по серверам на основе IP-адресов клиентов. В качестве ключа для хэширования используются первые три октета IPv4-адреса клиента или IPv6-адрес клиента целиком. Метод гарантирует, что запросы одного и того же клиента будут всегда передаваться на один и тот же сервер. Если же этот сервер будет считаться недоступным, то запросы этого клиента будут передаваться на другой сервер. С большой долей вероятности это также будет один и тот же сервер.

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

В конфигурационном файле nginx это описывается следующим образом:

upstream backend {    ip_hash;    server backend1_nextcloud.example.com;    server backend2_nextcloud.example.com;    server backend3_nextcloud.example.com;    server backend4_nextcloud.example.com;}

В этом случае нагрузка будет по возможности равномерно распределяться между application-cерверами, хотя из-за привязки клиента к конкретной сессии могут возникать перекосы нагрузки. Для небольших и средних инсталляций этим можно пренебречь. Если у вас бэкенды разные по мощности, то можно задать вес каждого из них. Тогда балансировщик будет стараться распределять нагрузку пропорционально заданным весам:

upstream backend {    ip_hash;    server backend1_nextcloud.example.com weight=3;    server backend2_nextcloud.example.com;    server backend3_nextcloud.example.com;}

В приведенном примере из 5 пришедших запросов 3 уйдут на backend1, 1 на backend2 и 1 на backend3.

В случае, если один из application-серверов откажет, nginx попробует переадресовать запрос следующему серверу из списка бэкендов.

Конфигурируем БД


Подробно Master-Slave конфигурацию можно посмотреть в основной документации.

Разберем несколько ключевых моментов. Для начала создаем пользователя для репликации данных:

create user 'replicant'@'%' identified by 'replicant_password';grant replication slave on *.* to replicant;flush privileges;

Затем правим конфиг мастера:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf 

В районе блока Logging and Replication вносим нужные правки:

[mysqld]log-bin         = /var/log/mysql/master-binlog-bin-index   = /var/log/mysql/master-bin.indexbinlog_format   = mixedserver-id       = 01replicate-do-db = nextcloudbind-address = 192.168.0.6

На Slave конфигурируем конфиг:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf 

В районе блока Logging and Replication вносим нужные правки:

    [mysqld]    server-id       = 02    relay-log-index = /var/log/mysql/slave-relay-bin.index    relay-log       = /var/log/mysql/slave-relay-bin    replicate-do-db = nextcloud    read-only = 1    bind-address    = 192.168.0.7

Перезапускаем оба сервера:

sudo systemctl restart mariadb

Далее надо будет скопировать БД на Slave.
На Master выполняем для начала выполняем блокировку таблиц:

flush tables with read lock;

А затем смотрим статус:

    MariaDB [(none)]> show master status;    +-------------------+----------+--------------+------------------+    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |    +-------------------+----------+--------------+------------------+    | master-bin.000001 |      772 |              |                  |    +-------------------+----------+--------------+------------------+    1 row in set (0.000 sec)

Не выходим из консоли БД, иначе блокировки снимутся!
Нам понадобится отсюда master_log_file и master_log_pos для конфигурации Slave.
Делаем дамп и снимаем блокировки:

sudo mysqldump -u root nextcloud > nextcloud.sql

    > unlock tables;    > exit;

Затем на Slave импортируем дамп и рестартуем демон:

sudo mysqldump -u root nextcloud < nextcloud.sqlsudo systemctl restart mariadb

После этого в консоли настраиваем репликацию:

    MariaDB [(none)]> change master 'master01' to         master_host='192.168.0.6',         master_user='replicant',         master_password='replicant_password',         master_port=3306,         master_log_file='master-bin.000001',         master_log_pos=772,         master_connect_retry=10,         master_use_gtid=slave_pos;

Запускаем и проверяем:

> start slave 'master01';show slave 'master01' status\G;

В ответе не должно быть ошибок и два пункта укажут на успешность процедуры:

Slave_IO_Running: YesSlave_SQL_Running: Yes

Деплоим Application ноды


Есть несколько вариантов деплоя:

  1. snap
  2. docker-image
  3. ручное обновление

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

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

Docker-image хороший вариант, особенно, если у вас часть инфраструктуры крутится уже на Kubernetes. Та же нода Redis, скорее всего уедет в кластер следом за application-серверами.

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

Не забудьте, что на application-сервера вам потребуется установить веб-сервер для обработки входящих запросов. Я бы рекомендовал связку из nginx + php-fpm7.4. С последними версиями php-fmp ощутимо выросло быстродействие и отзывчивость.

онфигурирование SSL/TLS


Однозначно стоит рассчитывать на TLS 1.3, если вы делаете новую инсталляцию и нет проблем с пакетами nginx, которые зависят от свежести системного openssl. В частности, 0-RTT и другие плюшки позволяют временами ощутимо ускорить повторное подключение клиентов за счет кеширования. Безопасность также выше за счет выпиливания устаревших протоколов.

Приведу актуальный конфиг для nginx application-сервера, который находится общается с балансировщиком по TLS:
Конфиг nginx
upstream php-handler { server unix:/var/run/php/php7.4-fpm.sock;}server {    listen 80;    server_name backend1_nextcloud.example.com;    # enforce https    root /var/www/nextcloud/;    return 301 https://$server_name$request_uri;}server {    listen 443 ssl http2;    ssl_early_data on;#    listen [::]:443 ssl http2;    server_name backend1_nextcloud.example.com;    # Path to the root of your installation    root /var/www/nextcloud/;    # Log path    access_log /var/log/nginx/nextcloud.nginx-access.log;    error_log /var/log/nginx/nextcloud.nginx-error.log;    ### SSL CONFIGURATION ###        ssl_certificate /etc/letsencrypt/live/backend1_nextcloud.example.com/fullchain.pem;        ssl_certificate_key /etc/letsencrypt/live/backend1_nextcloud.example.com/privkey.pem;        ssl_trusted_certificate /etc/letsencrypt/live/backend1_nextcloud.example.com/fullchain.pem;        ssl_dhparam /etc/ssl/certs/dhparam.pem;        ssl_protocols TLSv1.2 TLSv1.3;        ssl_prefer_server_ciphers on;        #ssl_ciphers "EECDH+AESGCM:EECDH+CHACHA20:EECDH+AES256:!AES128";        ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POL>        ssl_session_cache shared:SSL:50m;        ssl_session_timeout 5m;        ssl_stapling on;        ssl_stapling_verify on;        resolver 8.8.4.4 8.8.8.8;        add_header Strict-Transport-Security 'max-age=63072000; includeSubDomains; preload' always;### КОНЕЦ КОНФИГУРАЦИИ SSL ###    # Add headers to serve security related headers    # Before enabling Strict-Transport-Security headers please read into this    # topic first.    # add_header Strict-Transport-Security "max-age=15768000;    # includeSubDomains; preload;";    #    # WARNING: Only add the preload option once you read about    # the consequences in https://hstspreload.org/. This option    # will add the domain to a hardcoded list that is shipped    # in all major browsers and getting removed from this list    # could take several months.    add_header Referrer-Policy "no-referrer" always;    add_header X-Content-Type-Options "nosniff" always;    add_header X-Download-Options "noopen" always;    add_header X-Frame-Options "SAMEORIGIN" always;    add_header X-Permitted-Cross-Domain-Policies "none" always;    add_header X-Robots-Tag "none" always;    add_header X-XSS-Protection "1; mode=block" always;    # Remove X-Powered-By, which is an information leak    fastcgi_hide_header X-Powered-By;    location = /robots.txt {        allow all;        log_not_found off;        access_log off;    }    # The following 2 rules are only needed for the user_webfinger app.    # Uncomment it if you're planning to use this app.    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json    # last;    location = /.well-known/carddav {      return 301 $scheme://$host/remote.php/dav;    }    location = /.well-known/caldav {      return 301 $scheme://$host/remote.php/dav;    }    # set max upload size    client_max_body_size 512M;    fastcgi_buffers 64 4K;    # Enable gzip but do not remove ETag headers    gzip on;    gzip_vary on;    gzip_comp_level 4;    gzip_min_length 256;    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fon>    # Uncomment if your server is build with the ngx_pagespeed module    # This module is currently not supported.    #pagespeed off;    location / {        rewrite ^ /index.php;    }    location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {        deny all;    }location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {        deny all;    }    location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {        fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;        set $path_info $fastcgi_path_info;        try_files $fastcgi_script_name =404;        include fastcgi_params;        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;        fastcgi_param PATH_INFO $path_info;        fastcgi_param HTTPS on;        # Avoid sending the security headers twice        fastcgi_param modHeadersAvailable true;        # Enable pretty urls        fastcgi_param front_controller_active true;        fastcgi_pass php-handler;        fastcgi_intercept_errors on;        fastcgi_request_buffering off;    }    location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {        try_files $uri/ =404;        index index.php;    }    # Adding the cache control header for js, css and map files    # Make sure it is BELOW the PHP block    location ~ \.(?:css|js|woff2?|svg|gif|map)$ {        try_files $uri /index.php$request_uri;        add_header Cache-Control "public, max-age=15778463";        # Add headers to serve security related headers (It is intended to        # have those duplicated to the ones above)        # Before enabling Strict-Transport-Security headers please read into        # this topic first.        #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;        #        # WARNING: Only add the preload option once you read about        # the consequences in https://hstspreload.org/. This option        # will add the domain to a hardcoded list that is shipped        # in all major browsers and getting removed from this list        # could take several months.        add_header Referrer-Policy "no-referrer" always;        add_header X-Content-Type-Options "nosniff" always;        add_header X-Download-Options "noopen" always;        add_header X-Frame-Options "SAMEORIGIN" always;        add_header X-Permitted-Cross-Domain-Policies "none" always;        add_header X-Robots-Tag "none" always;        add_header X-XSS-Protection "1; mode=block" always;        # Optional: Don't log access to assets        access_log off;    }    location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {        try_files $uri /index.php$request_uri;        # Optional: Don't log access to other assets        access_log off;    }}

Регламентное обслуживание


Не забудьте, что в промышленном окружении требуется обеспечить минимальный и нулевой простой сервиса при обновлении или тем более резервном копировании. Ключевая сложность тут зависимость состояния метаданных в БД и самих файлов, которые доступны через NFS или объектное хранилище.
При обновлении application-серверов на новую минорную версию особых проблем не возникает. Но кластер все равно надо переводить в mainenance mode для обновления структуры БД.
Выключаем балансировщик в момент наименьшей нагрузки и приступаем к обновлению.

После этого выполняем на нем процесс ручного обновления из скачанного tar.gz, с сохранением конфигурационного файла config.php. Обновление через веб на крупных инсталляциях очень плохая идея!
Выполняем обновление через командную строку:

sudo -u www-data php /var/www/nextcloud/occ upgrade

После этого включаем балансировщик и подаем трафик на обновленный сервер. Для этого выводим все необновленные application-сервера из балансировки:

upstream backend {    ip_hash;    server backend1_nextcloud.example.com;    server backend2_nextcloud.example.com down;    server backend3_nextcloud.example.com down;    server backend4_nextcloud.example.com down;}

Остальные ноды постепенно обновляем и вводим в строй. При этом occ upgrade уже выполнять не нужно! Нужно только заменить php-файлы и сохранить конфигурацию.

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



Подробнее..

Перевод Кунг-фу стиля Linux устранение неполадок в работе incron

30.11.2020 18:20:43 | Автор: admin
Возможно, вам знакома утилита cron, которая позволяет планировать запуск различных задач в заданное время. Мы, кроме того, уже говорили о программе incron, которая реагирует не на события, связанные со временем, а на изменения в файловой системе. Возможно, вам когда-нибудь надо было написать программу, которая, например, обнаруживает изменения в файле и автоматически прошивает какой-нибудь контроллер, или делает резервную копию файла, или отправляет файл по электронной почте. Для решения подобных задач вполне можно воспользоваться incron. Мы обсуждали основы incron, но надо сказать, что в работе этой утилиты есть некоторые особенности, которые сильно усложняют поиск и устранение неполадок, возникающих при её применении. Здесь я хочу рассказать о некоторых приёмах, которыми я пользовался для того чтобы привести в рабочее состояние проекты, основанные на incron.

В моём случае речь идёт о разработке простой системы для работы с документами, хранящимися в директории, находящейся под контролем git. А именно, при изменении Markdown-файла с расширением .md, находящегося в этой директории, генерируются эквивалентные ему .docx- и .pdf-документы. Аналогично при измерении .docx-документа воссоздаются .md- и .pdf-файлы.



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

Настройка incron


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

Но, правда, одной только установки для обеспечения нормальной работы incron недостаточно. Так, ваше имя пользователя должно присутствовать в файле /etc/incron.allow (и его не должно быть в файле /etc/incron.deny). После того, как всё готово, пользоваться incron очень просто. По крайней мере до тех пор, пока не возникнут какие-нибудь проблемы. Справочные сведения по программе можно узнать, воспользовавшись командой man 5 incrontab.


Вывод сведений о таблице событий, за которыми наблюдает incron

У каждого пользователя есть своя таблица событий, за которыми наблюдает incron. Для редактирования таблицы можно воспользоваться такой командой:

incrontab -e

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

В поле, описывающем команду, можно использовать специальные символы. Так, например, последовательность символов $@ даёт имя директории, $# имя файла, $% тип события в виде строки, $& числовой код события. Если в поле с командой требуется обычный знак $ нужно воспользоваться конструкцией $$.

События это то, что описывается строками вроде IN_CREATE, IN_DELETE, IN_MODIFY. В записях таблиц можно использовать любое количество событий, записывая их через запятую. Подробнее об этом я расскажу ниже. В таблице, кроме того, применяются опции наподобие IN_DONT_FOLLOW, которая предотвращает разыменовывание символических ссылок. Ещё можно воспользоваться опцией recursive=false, отключив тем самым мониторинг поддиректорий. Ещё одна опция, loopable=true, предназначена для решения одной распространённой проблемы (отключение мониторинга событий до обработки текущего события), но решает она эту проблему не всегда.

В интернете иногда попадается устаревшая документация по incrontab. В настоящее время работа над проектом ведётся на GitHub, но главный разработчик оставил проект в 2012 году, а работа над ним продолжилась лишь через 2 года, когда некто взялся за исправление ошибок. Иногда полезно бывает почитать исходный код используемой версии incron для того чтобы разобраться в том, что именно происходит при работе программы.

Главная проблема incron


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

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

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

Совет: работая над командами, применяемыми в incrontab-файле, тщательно исследуйте их, используя логирование


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

Пусть у нас имеется следующий скрипт, который мы назовём echoarg.sh:

#!/bin/bashfn="$1"shiftecho "$@" >>"$fn"

Скрипт это до крайности простой, но нас он вполне устраивает. Вот запись incrontab-таблицы, в которой он используется:

/home/user/tmp/itest IN_ALL_EVENTS /bin/bash echoarg.sh /home/user/tmp/echoarg.log $% - $@/$#

Конечно, в именах файлов нужны кавычки, но так как мы всего лишь их выводим, особого значения это не имеет. Тут надо обратить внимание на одну вещь: в некоторых системах incron запрещено выполнять операции записи в папках наподобие /tmp, а, возможно, даже запрещено мониторить файлы в подобных папках. Лучше всего экспериментировать с директориями, владельцем которых точно являетесь вы (в данном случае это /home/user/tmp). Вот результат выполнения команды touch foo в директории ~/tmp/itest:

IN_ATTRIB - /home/user/tmp/itest/fooIN_CREATE - /home/user/tmp/itest/fooIN_OPEN - /home/user/tmp/itest/fooIN_CLOSE_WRITE - /home/user/tmp/itest/foo

Ещё некоторые проблемы


В каждом дистрибутиве всё может быть устроено не так, как в других. Поэтому вам, возможно, придётся почитать документацию. Например, в системах, основанных на Debian, то немногое, что логирует incron, попадает в system.log. А в каких-то других распространённых дистрибутивах данные могут попадать в файл cron.log.

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

Если говорить о командной оболочке, то можно отметить, что утилита incron весьма разборчива в плане поиска оболочки и в плане настройки переменных окружения. Ваша версия incron может вести себя не так, как моя, но я полагаю, что лучше всего будет для всего, что применяется в incrontab, указывать полные пути. Стоит и явным образом указывать используемую командную оболочку. Если вам нужно что-то особенное в PATH или в других переменных среды, выполните соответствующие настройки в скрипте. Если даже вы запускаете бинарный файл имеет смысл написать небольшую обёртку, позволяющую настроить всё именно так, как нужно. Как минимум, проводя испытания, залогируйте переменные среды во временный файл. Благодаря этому не случится так, что вы неожиданно столкнётесь с отсутствием множества нужных вам переменных.

Использование команд вроде $(date) обречено на неудачу. Дело в том, что incron съест знак $. Возможно, если такая команда вам нужна, вам повезёт с конструкцией $$(date).

Наш грандиозный проект


После того, как вы разобрались с тем, какие именно события вам нужно обрабатывать, вам нужно написать скрипт и как можно тщательнее его протестировать без использования incron. В моём случае это был скрипт autopandoc.sh, .pdf-функционал которого я решил реализовать позже:

#!/bin/bashif [ -z "$1" ]thenexit 1fiif [ ! -f "$1" ]thenexit 2fidir=$(dirname "$1")ffilename=$(basename -- "$1")ext="${ffilename##*.}"filename="${ffilename%.*}"case "$ext" indoc*) newext="md";;md) newext="docx";;*) exit 3esacif [ ! -f "$dir/generated" ]thenmkdir "$dir/generated"fiexec pandoc "$1" -o "$dir/generated/$filename.$newext"

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

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

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

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

Анализ файла журнала incron


Как я уже говорил, incron может логировать данные в различные файлы. В деле анализа логов тем, кто пользуется KDE, пригодится приложение для просмотра системных журналов KSystemLog. Эта утилита позволяет фильтровать и выводить записи о событиях по мере их появления. Журналы, конечно, можно анализировать и с помощью команды tail -f. Но чтобы избавиться от информационного шума вам, при таком подходе, может понадобиться прибегнуть к grep.

Если вы пользуетесь systemd, вы можете попробовать такую команду:

journalctl -f -u incron.service

Это нечто вроде tail -f для лог-файла incron. Наблюдение за тем, как incron постоянно вызывает события для /my_dir/subdir/subdir/subdir многое расскажет вам о том, что происходит в вашем скрипте.

Дополнительные советы: запускайте демон сами, используйте strace, увеличьте max_user_watches


Сначала остановите демон incron. Сделать это можно любым удобным для вас способом (например с помощью команды systemctl stop incron). После этого выполните команду incrond с использованием опции -n. Это позволит вам наблюдать за действиями программы. Учитывайте то, что программу надо запускать с root-правами.

Ещё один вариант исследования работы incron заключается в использовании strace для запуска программы. Это позволит узнать обо всех системных вызовах, выполняемых incron. Поэтому, если вас интересует то, какие именно файлы открывает incron, и то, к чему это приводит, вам стоит попробовать такую команду:

sudo strace incrond -n

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

Если вы приступили к реальной работе с incron, вы можете обнаружить, что не укладываетесь в системный лимит файлов, которые может отслеживать один пользователь. Лимит задаётся с помощью max_user_watches. Если это произошло попробуйте такую команду:

sysctl fs.inotify.max_user_watches

Временно изменить лимит можно так:

sysctl -w fs.inotify.max_user_watches=1000000

Изменить его насовсем можно, отредактировав /etc/sysctl.conf или добавив файл в /etc/sysctl.d.

Итоги


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

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

Сталкивались ли вы с проблемами incron, подобными тем, о которых рассказывает автор материала?



Подробнее..

Что не рассказывает про полиграф и почему его нельзя автоматизировать

01.12.2020 14:07:50 | Автор: admin


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

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

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

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

На что смотреть?


Вот примерно так выглядит нормальный график:





Вас интересует в первую очередь гиперстресс на датчике КГР:



Вот детальнее:



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

Задача полиграфолога привести человека в такое состояние, когда он будет максимально эмоционально напряжён, но при этом не будет бояться. То есть вся подготовка направлена на то, чтобы амплитуда реакций КГР была максимальной.

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

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



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



Вот здесь обратите внимание на рассогласование показаний датчиков. Это вибрация или тремор:



Вопросы распределяются в тесте таким образом, чтобы каждый прозвучал несколько раз в различных формулировках. Базовая методика предполагает три типа вопросов: для калибровки (Сегодня четверг?, Вас зовут Иван?, Вы верите в существование собак?), часть для отвлечения внимания и снятия последствий после прошлых вопросов (Как зовут коллегу за соседним столом?, Что вы ели на завтрак?), а часть значимые входит в тест. Значимые вопросы обычно предъявляются не подряд, поскольку нельзя истощать психику испытуемого слишком сильно, иначе КГР будет изменяться меньше. К стрессу можно адаптироваться, и люди это успешно делают со временем. Либо устают. Время от времени повторяются проверочные вопросы, ответ на которые известен это проверка калибровки устройства и отсутствия внешних стимулов, искажающих результаты.

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

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

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

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

После этого можно подключать датчики.


Внешний вид полиграфа




Полиграф с подключенными датчиками

Что за вопросы?


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

Примеры значимых вопросов:
  • Вы живёте в России?
  • Вы на прошлой работе делали фальшивые записи в отчётных документах?
  • Вы в течение последнего года серьёзно конфликтовали со своим руководством?
  • Вы часто обманываете коллег по работе?
  • Вам приходилось покрывать кого-нибудь из коллег, заранее зная об их виновности?
  • Вы поступали когда-нибудь нечестно на работе?
  • У вас есть серьёзные заболевания, которые могут мешать работе?

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

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

И насколько этот шаманизм достоверен?


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

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

Есть исследование относительно тестов в государственной системе США. Основные выводы:
CONCLUSION: Polygraph testing yields an unacceptable choice for DOE employee security screening between too many loyal employees falsely judged deceptive and too many major security threats left undetected. Its accuracy in distinguishing actual or potential security violators from innocent test takers is insufficient to justify reliance on its use in employee security screening in federal agencies.

Polygraph screening may be useful for achieving such objectives as deterring security violations, increasing the frequency of admissions of such violations, deterring employment applications from potentially poor security risks, and increasing public confidence in national security organizations.

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

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

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

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

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

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

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

Ещё одна проблема оценки точности неверная интерпретация результата. Испытуемый почему-то волнуется. Почему? Вряд ли он это ответит.

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

Что будет, если отказаться от ответа?


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

Есть ли датчик пульса?


Частота сердцебиения не измеряется. Обычно стандартный набор датчиков включает дыхательную активность (но её также видно и глазами), КГР (основной показатель), датчик движения, электрическую активность мозга (без детализации), фотоплетизмограмму или пьезоплетизмограмму (реакция сосудов, поток крови). Раньше ставили датчик артериального давления вместо фотоплетизмограммы, но они взаимозаменяемы. ФПГ же ставится на безымянный или средний палец и не создаёт такого дискомфорта, как манжета.

Пример артефакта на вопросе про украденного кота:



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



На среднем пальце прикреплен датчик ФПГ/Фотоплетизмограммы (измерение плотности ткани). Датчик КГР/Потоотделение на указательном и безымянныом

Как быстро видно стресс на КГР?


Речь про секунды или доли секунды.

Стрессовая реакция свидетельствует о лжи?


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

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

Можно пример такого вопроса?


Люди чаще всего врут или недоговаривают про противоправные или сомнительные события, совершённые в последние несколько лет. Даже если они понимают, что полиграфолог раскроет их ложь, сознаваться в той же подделке документов (Ставили ли вы когда-нибудь подпись за своего руководителя в документах?) незнакомому человеку не очень умная идея. Пример: страховая компания, одни из руководителей департамента ведёт договоры с корпоративными клиентами. Учредитель обвинил его в сговоре с конкретным клиентом. Его работа подразумевает переговоры, и как он их проводит никто не знает. Может, в гольф играет. Может, проституток заказывает. Может, клиента бьёт телефонным справочником. Это не важно. Важно, получает ли откат. Человек на всех этих вопросах напрягался: давал гиперстресс, но в формате артефактов. То есть не совсем сразу. Как потом выяснилось, он докручивал прошлый рабочий процесс в другой компании. Там было взаимодействие с кладовщиком, они что-то подворовывали.

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

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

Ок, ок, я готов пробовать!


Тогда дожидайтесь 14:15 и кликайте по вот этой кнопке.



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

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

Краткий FAQ по игре:


Как набирать баллы


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

Я получу меньше баллов, если присоединился в середине?


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

Игра продлится с 14:15 до 22:00.

Как задать свой вопрос


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

  1. Зарегистрируйтесь у нас на сайте ruvds.com.
  2. Выберите образ LieDetector в маркетплейсе.
  3. Закажите сервер на тестовый период это бесплатно. Чтобы не платить за сервер, переключите синий тумблер Использовать тестовый период.
  4. Дождитесь создания сервера это займёт порядка 5-7 минут.
  5. Подключитесь к вашему новому серверу по SSH.
  6. Введите команду ask-online в командой строке.
  7. Если ваш вопрос прошёл модерацию, вы получите ответ принято.


Какие вопросы можно задавать?


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

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

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

Дерзайте! И удачи вам в игре.





Подробнее..

Перевод Кунг-фу стиля Linux синхронизация настроек

01.12.2020 16:10:27 | Автор: admin
Одним из лучших качеств Linux и похожих на неё операционных систем является возможность их глубокой настройки. Если вам что-то не нравится высоки шансы того, что вы легко сможете это изменить, подправив какой-нибудь файл. Например, рассмотрим bash командную оболочку, по любым меркам, весьма популярную. Если вам нужно поменять приглашение командной строки это вполне осуществимо. Если нужно, чтобы клавиша Tab позволяла бы автоматически дополнять имена файлов без учёта регистра это тоже не проблема. Обычно подобные настройки выполняются в одном из так называемых файлов профиля, вроде .bashrc, находящихся в домашней директории пользователя.



Если некто работает за единственным компьютером, то никаких проблем с настройками у него не возникает. Он вносит в файл .bashrc, и в другие подобные файлы, необходимые изменения, настраивает систему под себя, и работает в той среде, которая ведёт себя так, как ему того хочется. Проблемы появляются тогда, когда кому-то приходится пользоваться несколькими компьютерами. Возможно, речь идёт о веб-сервере, о настольном компьютере, о машине, играющей роль файрвола, и о нескольких десятках Raspberry Pi. Как настроить все эти системы одинаково? И как, после того, как они все одинаково настроены, поддерживать настройки в актуальном состоянии?

Несколько вариантов синхронизации настроек


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

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

Возможности chezmoi


В соответствии с данными из репозитория проекта, chezmoi предлагает пользователю следующие возможности:

  • Декларативное описание желаемого состояния файлов домашней директории.
  • Использование шаблонов для создания файлов.
  • Безопасность работы обеспечивается интеграцией с Bitwarden, с LastPass и с некоторыми программами для локального хранения ключей.
  • Поддержка атомарной обработки обновлений. Это защищает систему от попадания в промежуточное состояние.
  • Поддержка нескольких операционных систем.
  • Пользователю сообщается о действиях, которые планируется выполнить, поддерживается режим пробного запуска.
  • Высокая скорость работы, возможность выбора используемой совместно с chezmoi системы контроля версий.

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

Использование chezmoi


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

  • add добавление файла в состав файлов, которыми управляет система.
  • edit редактирование файла.
  • diff выяснение того, какие изменения, если таковые имеются, ожидают включения в рабочую версию файла.
  • apply включение изменений, ожидающих одобрения, в рабочую версию файла.

Когда в систему добавляют новый файл, его копия помещается в директорию ~/.local/share/chezmoi. Для обеспечения совместимости с системами контроля версий chezmoi игнорирует файлы, находящиеся в этой директории, имя которых начинается с точки. Поэтому, если в систему добавить, например, файл .bashrc, он будет автоматически переименован в dot_bashrc.

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

Поддержка особенных настроек


Представим, что на настольном компьютере вам нужно использовать особенное приглашение командной строки. А на сервере, на файрволе и на Raspberry Pi-компьютерах вас устроит обычное приглашение. Это значит, что на каждом из компьютеров, в файле .bashrc, должно присутствовать особое значение параметра PS1.

Сделать это можно, добавив соответствующие записи в раздел data файла chezmoi.yaml. На самом деле, тут можно использовать различные форматы, в частности JSON и TOML. Этот файл уникален для каждого компьютера. Он позволяет вносить изменения в шаблонные файлы. Например, chezmoi.yaml настольного компьютера может содержать запись о PS1String, описывающую сложные настройки приглашения командной строки, а в таком же файле для Raspberry Pi похожая запись будет уже устроена гораздо проще.

Для того чтобы добавить в систему некий файл, который будет использоваться в качестве шаблона (например файл .bashrc), нужно воспользоваться опцией -T команды add. Файл шаблона, основанного на .bashrc будет иметь имя dot_bashrc.tmpl. Благодаря стандартным механизмам шаблонизации Go в распоряжении пользователя chezmoi имеется множество опций. Кроме того, chezmoi позволяет пользоваться переменными, которые, например, позволяют работать с именем компьютера и с именем пользователя, с идентификаторами ОС и архитектуры.

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

# общие настройкиexport EDITOR=vi# настройки, зависящие от имени компьютера{{- if eq .chezmoi.hostname "work-laptop" }}# это попадёт лишь в ~/<code>.bashrc</code> компьютера work-laptop{{- end }}

Безопасность


Chezmoi распознаёт приватные файлы и соответствующим образом их обрабатывает. Так, приватной является директория chezmoi, система использует префикс private_ при назначении имён приватным файлам (например, имя такого файла может выглядеть как private_dot_bashrc).

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

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

Предположим, в вашем конфигурационном файле имеется такая запись:

hackaday:password: 0xdeadbeef

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

password = {{ .hackaday.password }}

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

Система контроля версий


Если говорить о системах контроля версий, то в chezmoi имеются команды для отправки материалов в поддерживаемые системы контроля версий и, соответственно, команды для загрузки данных. По умолчанию используется git, но есть и другие варианты, вроде hg. Соответствующие настройки выполняются в конфигурационном файле.

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

Итоги


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

Уникальный файл с настройками chezmoi сложно обрабатывать с помощью системы контроля версий. Да пользователи обычно и не стремятся этого делать. Если репозиторий, используемый для хранения настроек, является приватным, или если приватную информацию не включают в конфигурационные файлы, можно поместить в эту систему и варианты файла с настройками chezmoi (скажем, там может быть вариант этого файла для Raspberry Pi и для обычных компьютеров). Затем, при первоначальной настройке компьютера, можно переименовать подходящий файл. Но более вероятно то, что файл с настройками системы будут просто копировать. У подхода, в соответствии с которым конфигурационный файл chezmoi не обрабатывают средствами системы контроля версий, есть преимущество, заключающееся в том, что, если всё правильно настроить, то для хранения данных можно безопасно использовать общедоступный репозиторий.

А для работы моей системы очень важно применение именно приватного репозитория если только того, кто ей пользуется, не волнует попадание его конфигурационных файлов в общий доступ. Но при этом все файлы обрабатываются с помощью системы контроля версий. Система позволяет быть в курсе всех изменений без необходимости использования шаблонов, на освоение которых нужно определённое время. Достаточно лишь расположить настройки в соответствующих файлах. Единственная возможность, которую я вполне могу добавить в свою систему, вдохновившись chezmoi, это возможность добавления в неё новых файлов, за которыми осуществляется наблюдение. Хотя моя система и позволяет синхронизировать настройки, сейчас файлы в неё надо добавлять вручную. Файл перемещают в особую директорию, после чего добавляют записи о файле в систему и создают символическую ссылку.

Но этим и хороша Linux. Тут имеется множество способов решения одной и той же задачи. Если не нравится что-то одно можно найти что-то другое. А если ничего не нравится можно без особых сложностей создать что-то своё. Это же, правда, создаёт определённые проблемы при использовании Linux многими обычными людьми, которые не привыкли к подобному. Они не стремятся выбирать из множества вариантов, им нужно простое и понятное рабочее решение. А в сообществе, сложившемся вокруг Linux, наоборот, принято постоянно всё со всем сравнивать и с жаром спорить о том, что лучше emacs или vi, C или Python.

Как вы синхронизируете настройки на разных Linux-машинах?



Подробнее..

Категории

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

© 2006-2020, personeltest.ru