Меню

Как пишется слово гораздо или гараздо

Изобретение якоря
Адмиралтейский якорь с деревянным штоком, фото: wikimedia.org

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

Первые якоря были каменными

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

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

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

Как пишется слово гораздо или гараздо
Каменный якорь, обнаруженный в Израиле, его возраст оценивается в 3400 лет, фото: imj.org.il

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

Каменные якоря активно использовали все мореходы древности – граждане Финикии, Вавилона, Карфагена, Рима и Греции. В знаменитом произведении Гомера «Одиссея» указывается, что якорь на корабле «Арго» также был выполнен из камня. Максимально простой якорь до сих пор можно встретить на маленьких рыбацких лодках и катерах, особенно в тех районах, где присутствует каменистое или плоское дно и якорь с лапами просто не нужен.

Деревянные якоря

Считается, что уже в III тысячелетия до н. э в регионе Юго-Восточной Азии мог быть изобретён якорь, по своему внешнему виду близкий к современным – это был двурогий якорь со штоком и перекладиной. Его изобретателями могли быть предки китайцев или малайцев. В средиземноморье якоря такой конструкции появились гораздо позднее, считается, что они оказались здесь в районе VIII века до н. э.

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

Как пишется слово гораздо или гараздо
Деревянный древнеримский якорь, найденный в Италии в начале 1930-х годов, фото: museumanapa.ru

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

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

Появление железного якоря

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

Римский писатель Плиний Младший (62-114 года) утверждал, что конструктором железного корабельного якоря был грек, которого звали Евлампий. Одновременно с этим изобретение железного якоря, рога которого имели на своих концах лапы, Плиний приписывал древним жителям Этрурии.

Как пишется слово гораздо или гараздо
Русские названия частей якоря (в данном случае — адмиралтейского), изображение: wikimedia.org

Ещё одно свидетельство, дошедшее до наших дней, оставил древнегреческий историк и географ Страбон (64 год до н. э.). По его утверждениям, первым изобретателем железного якоря со штоком являлся греческий учёный Анахарисис, имевший скифское происхождение и ещё в VII веке до н. э. перебравшийся в Грецию. Так или иначе, во многих источниках сегодня можно встретить информацию о том, что именно древние греки подарили нам якоря той формы и вида, к которым мы привыкли.

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

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

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

Как пишется слово гораздо или гараздо
Древнеримский деревянный якорь со свинцовым штоком, фото: wikimedia.org

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

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

8 декабря 2021 года на Конгрессе молодых ученых в Сочи — одном из самых заметных событий Года науки и технологий в России — состоялась дискуссия «Знания — это модно, доступно, нужно. Какие знания востребованы новым поколением и как их получить?». В обсуждении, организатором которого выступило Российское общество «Знание», столкнулись два непримиримых мнения: не пора ли на законодательном уровне запретить детям и молодежи безграничное потребление «легкого», развлекательного контента или все же научиться «переупаковывать» полезные и важные знания и прийти с ними туда, где их заметит молодая аудитория.

В дискуссии приняли участие ученые, специалисты медиаиндустрии, издательской деятельности и сферы просвещения. Организаторами Конгресса молодых ученых, который проходит сейчас на территории Парка науки и искусств «Сириус», выступают Министерство науки и высшего образования РФ, Координационный совет по делам молодежи в научной и образовательной сферах Совета при Президенте РФ по науке и образованию, Фонд Росконгресс. Оператор проведения Года науки и технологий в Российской Федерации — АНО «Национальные приоритеты».

О том, как непросто совмещать занятия наукой и собственный бизнес, даже если они находятся в одной сфере интересов, рассказал кандидат медицинских наук, врач — челюстно-лицевой хирург и директор ООО «Гистографт» Илья Бозо:

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

Его компания «Гистографт» разработала уникальный ген-активированный материал для костной пластики, обладающий ангиогенным эффектом для роста сосудов.

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

О том, что воспитывать интерес к знаниям нужно уже с детского сада, заявила руководитель Фонда «Талант и успех», член Совета при Президенте РФ по науке и образованию Елена Шмелёва:

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

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

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

— отметил он.

Главный редактор МИА «Россия сегодня» Маргарита Симоньян высказала другое мнение по поводу контента в социальных сетях:

Сегодня мы сталкиваемся с деградацией культуры и образования. В угоду современным течениям за рубежом закрываются целые гуманитарные факультеты, пересматриваются классические театральные постановки и переписываются книги. Современные дети уже перестают писать, общаясь только голосовыми сообщениями и эмоджи. Мы устроены так, чтобы потреблять то, что проще. А это — развлекательный контент, часто к тому же еще и аддитивный, то есть вызывающий зависимость. Наверно, 90 % «Тик-Тока» — это вредный и аддитивный контент. Мне кажется, человечество скоро придет к тому, чтобы в какой-то момент законодательно ограничить доступ детей к такого рода развлечениям определенным объемом в день. Это обширная и тяжелая тема, о которой пора задуматься на серьезном государственном уровне.

С политикой ограничений не согласен генеральный директор Российского общества «Знание» Максим Древаль. Он считает, что задача просветителей не оставаться там, где они теряют аудиторию, а идти и адаптировать свой контент под те площадки, на которых эта молодая аудитория сегодня находится. В том числе и в «Тик-Ток».

Хочу отметить, что недостаточно просто запретить развлекательный контент. Как недостаточно и просто нести молодежи знания — их уже много везде и в любом качестве. Важно мотивировать аудиторию на потребление этих знаний и вдохновлять ее на развитие. И в этом я вижу одну из основных задач Российского общества „Знание“,

— отметил он. 

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

Отдельное внимание «Знание» уделяет работе с просветителями, подчеркнул Максим Древаль:

Мы работаем с лекторами, отбирая лучших для нашего Общества с помощью проекта «Лига Лекторов», а апогеем общественного признания стала наша премия «Знание» за заслуги в области просветительских проектов. Просветительство — это очень важная, сложная и нужная работа, которая сегодня недооценена. И наша задача — вывести этих удивительно талантливых людей на новый, федеральный уровень. Мы специально для этого строим Центр знаний на горе Машук, который будет сосредоточен именно на работе с просветителями.

С идеей поддерживать просветителей, сколько бы лет им ни было, согласился и актер Игорь Петренко:

Мне недавно задал вопрос один школьник о том, как монетизировать свои таланты. Эта тема очень заботит школьников сегодня, особенно в плане создания и развития своих личных блогерских проектов. У нашего, более старшего поколения, слово «блогер», к сожалению, давно стало нарицательным и несёт совсем не позитивную оценку. 
Несмотря на это мы должны понимать, что молодому поколению, гораздо понятнее эти площадки (социальные сети) для общения и познавания мира. Поэтому хотелось бы, чтобы блогеры создавали созидательный и просветительский контент, делая знание — модным, рассказывая о науке и технологиях живым и доступным языком. Подобные молодежные инициативы надо поддерживать, как общественно полезные.

Полная трансляция дискуссии доступна на странице социальной сети Российского общества «Знание» «ВКонтакте».

Добрый вечер…))) не знаю с чего и начать…))).

Сегодня я пришёл как гость, на мне маска гостя,

но все кто читал мои комментарии с легкостью узнают меня и в маске…)))? Ребята, маски не нужны, человек рождается и умирает без маски…)))?! Расскажу Вам одну историю из своего опыта, часто бывает так, что сразу и не заметишь, где скрывается истина…)))?! Был, надеюсь и есть у меня давний знакомый…))). Мы с ним познакомились летом на одном сайте…))). Я тогда только начал знакомиться с «паутиной», а он знал её намного лучше меня…)))?! Мы с Ним долго спорили, и он терпеливо слушал меня, пытался научить, а я как упрямый малыш не слушал, что он мне говорил, в какой-то момент, я совершенно перестал читать, что он пишет мне, так как был увлечён, тем, что он написал ранее…)))?! А так как написал он очень много, как показалось мне на тот момент, я начал отвечать на то, что он уже изложил, не читая новых его комментариев…)))?! Писал я на одном дыхании, не отрываясь, почти не исправляя, слова ложились словно осенние листья на землю…, плавно кружась и обретая смысл, стихи сами лились как горный ручей, без малейшего усилия, слова рифмовались, складывались в четверостишия, я был словно окрылён…)))! Рано утром, пока все спали я выходил во двор, смотрел на самое пожалуй красивейшее из зрелищ подаренных природой человеку — восход Солнца,чтобы накормить кур, прочитать комментарий и написать ответ…)))?!

Хоть и писал я на одном дыхании, не замечая времени, иногда ответ занимал несколько часов, которые пролетали словно одно мгновение, будто миг…)))?! Неудивительно, что дома моё поведение не осталось незамеченным, к тому же все мои мысли были поглощены творческим процессом и в результате этот процесс начал сказываться на делах по дому…)))?! Погреб не смотря на отдельные успешные попытки и заливки бетоном так и не доделан…))) А так же дымоход и лестница…)))?! Интернет опутывает словно сеть, стирая грань между виртуальной и реальной действительностью…)))!

Я писал как одержимый, столкнувшись с тем, что комментарии написанные на одном дыхании не отправляются, а то и просто исчезают в темноте «паутины» её дальних, едва различимых уголках ( по причине отсутствия скоростного интернета ) …)))?! В такие моменты, а они происходили давольно часто, весь текст набранный в окне «ответить» длиной порою больше чем тот что написан выше этих строк, вдруг исчезал в никуда, и достать оттуда я его уже не мог…)))?! Но я не сдавался, рукописи ведь не горят…)))?! Включалось второе дыхание, я писал по памяти улучшая даже первоначальный вариант, пока не догадался писать в заметках, потом копируя и перенося текст в окно «ответить»…)))?! Слишком длинные тексты не хотели отправляться, приходилось их копировать и отправлять частями, части иногда отправлялись, а иногда нет, допустим из дома отправил часть текста, вторую от магазина, третью от «Волги», нет не ГАЗ — 24, и даже не ГАЗ — 66, Лето, жара, река, дети…)))?! хотели загорать и купаться…)))?! Привозил дочь и её молодого человека на пляж, а сам в телефон, процесс написания захватил меня полностью..)))?! Так все и было, собеседник несмотря на своеобразное письмо, вернее стиль письма, отличался недюжинной логикой и живостью ума, впрочем он был остроумен и непредсказуем, как река «Хуанхэ», что протекает в Китае и имеет такое же изворотливое русло как и речь его…)))?! Каждое утро я смотрел написал ли он, если да то я садился на веранде или писал стоя, рядом с уличной розеткой, так-как даже телефон разряжался и нагревался от желания писать, мы спорили, на его сказку я отвечал своей, вернее он начинал, а я подхватывал и продолжал сюжет его сказки по своему, на его стих я отвечал своим, на его мысль своей…)))?! И так до тех пор, пока он не разместил столько текста, количество которого я не смог бы обработать и ответить на него сразу, тогда я решил взять за основу «Марлезонский» балет — последнее что вышло из под его пера и далее писать исходя из его текста не отвлекаясь на другие его новые комментарии…)))?!

Так читая его комментарий и отвечая по пунктам, я дошёл до 8 «акта», я писал, писал от души, так как считал правильным…)))?! Разговор вращался в основном вокруг отношений между людьми и импортом, роли импорта и экспорта в становлении экономики и государства…)))?! Большое внимание было уделено наркотикам, до сих пор считаю их злом, а распространение последних величайшим преступлением против человечества наравне с фашизмом…! Атомная энергия, химия, физика, мы беседовали обо всем, вернее беседовал уже я один с последним комментарием моего визави…)))?! Я обнаглел, расположился у него, открыл офис, поставил стол, кресло, ксерокс, установил камин и мусорную корзину, и я намерен был «трудиться» пока «хозяин» готов был «сдавать» офис в аренду…)))? Я предложил в случае если общение начнёт быть в тягость удалить коммент или написать, что дальнейшее общение неинтересно, так как я не читал что мне пишут после «Марлезонского» балета, потому и не увидел его слов…)))? «Достаточно» и в результате три моих комментария, в которые я вложил часть себя, а иначе я не могу, были удалены…)))? Я понял, что остальные комментарии которые я напишу постигнет та же участь…)))? Я ушёл, глупо стучать в закрытую дверь, глупее только танцевать парный «балет» в одиночку…)))?!

Некоторое время я бродил по сайту оставляя следы в виде комментариев, в которых выражал свою позицию по разным вопросам, но всегда честно, на место первого знакомства я долго не возвращался, так как попробовав заглянуть в личный аккаунт своего приятеля понял, что он покинул сайт, выбыл из «матрицы» обезличенные «аватары» это удел тех кто пишет в темную «сеть» паутины…)))?! Меня же все не покидала надежда, закончить начатое, и я изредка возвращался, туда, на место наших бесед, нет никогда у меня не было ненависти к тому, кто писал мне, кто спорил и говорил со мной, да не всегда я был с ним согласен, да я и сейчас думаю, что душа в человеке главное, а щедрость исчисляештся не тем сколько дал, а тем сколько осталось…)))?! Но в чем я согласен сам с собой и возможно с этим согласитесь и Вы что мало взять и накормить рыбой, гораздо важнее научить ловить рыбу…)))! Так говорил мой отец, а это память рода, уверен так же говорили и мой дед и прадед…)))! Иногда начинаешь делать, что-то первый раз, и все идёт как по наитию, ты точно знаешь как надо сделать, сколько отпилить, как закрепить, как будто невидимая рука или или тихий голос в голове ведёт тебя и все получается и как по волшебству приобретает форму, получается все за что бы не взялся, это я думаю и есть память рода, память предков заложенная на генетическом уровне…)))?! Беда в том, что многие утратили эту связь…)))?! Я понял, что есть только два пути это путь света и путь тьмы и от того какой путь Вы выберете и будет зависть бушующее…)))?! Так получилось, что мне помогли, но не с выбором, никогда не сомневался в том какой путь мне выбрать, а с осознанием, того что делать и как идти…)))?! А в этом немалая заслуга людей встретившихся мне на пути и да, память рода, без моих предков — без памяти рода, возможно я так и блуждал бы по паутине в бескрайних просторах матрицы окончательно заблудившись в её лабиринтах…)))?!

Я наивно полагал, что здесь в интернете есть ответы на многие вопросы, есть коллективное мышление и многое другое…)))?! В результате я пришёл к выводу, что все ответы у нас уже есть, просто мы не желаем их видеть…)))?! Мы спрятались за масками, Мы выплескиваем свои эмоции в пустоту, мы боремся с пустотой, мы живем в пустоте, мы разучились читать Книги,

Мы разучились общаться, «гаджеты»

заменили нам все, вдумайтесь в само название «Гад — же — ты» не думали об этом…)))?! То что со мной произошло иначе как чудо я не могу назвать…)))?! Справедливо выражение, что для того, чтобы сделать решительный шаг вперёд надо получить хороший пинок под зад…)))?! Так вот я его получил и прочувствовал, а результатом явилось полное осознание и переоценка жизненных принципов…)))?! Человек и есть мощнейший генератор когда либо созданный на земле именно он и генерирует окружающую действительность и все что находится вокруг…)))?! От того что он создаст вокруг себя и будет зависеть бушующее…)))!

Как пишется слово гораздо или гараздо

Читайте также


Израиль – небольшая средиземноморская страна, которая не только считается одной из самых здоровых в мире,…


29.12.2021, 01:05

2 244

просмотрa

Подробнее


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


12.12.2021, 14:10

34

просмотрa

Подробнее


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


19.10.2021, 08:09

51

просмотр

Подробнее


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


10.09.2021, 13:13

477

просмотров

Подробнее


Эксперты озвучили новые даты прекращения пандемии в РоссииПандемия в 2022 году, видимо, будет проблемой № 1.


позавчера, 22:07

121

просмотр

Подробнее


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


08.01.2022, 10:58

155

просмотров

Подробнее


Массовые протесты в Казахстане начались 3 января 2022 года, спустя день после …


07.01.2022, 00:41

11 164

просмотрa

Подробнее


Как научить своих детей искренне просить прощения? И как научиться этому самим? Почему …


02.01.2022, 19:51

24

просмотрa

Подробнее


Новогоднее поздравление президента России Владимира Путина начинается 31 декабря …


31.12.2021, 10:10

1 469

просмотров

Подробнее


Магнитная буря 29 декабря 2021Сегодня, 29 декабря 2021 года, продолжается магнитная …


29.12.2021, 08:06

3 913

просмотров

Подробнее


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


27.12.2021, 17:32

87

просмотров

Подробнее


Приветствую, уважаемые друзья!У многих из нас появляется вполне объяснимое …


24.12.2021, 12:45

2 053

просмотрa

Подробнее


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


24.12.2021, 09:29

397

просмотров

Подробнее


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


23.12.2021, 06:31

567

просмотров

Подробнее


Москва. 21 декабря. INTERFAX.RU — Госдума РФ приняла в первом чтении законопроект (1248305-7)


21.12.2021, 18:12

14

просмотров

Подробнее

Как составить техническое задание?

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

Что такое техническое задание?

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

Зачем нужно ТЗ

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

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

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

Каким должно быть ТЗ

На самом деле, соблюдение четких правил при составлении ТЗ не требуется. Разные компании и предприниматели оформляют задания по-разному. Вопрос в преследуемых целях. 

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

Нужно написать небольшой текст на тему «Душевые кабины». Текст должен быть для людей. Без переспама.

А кто-то описывает все в деталях и структурирует каждый аспект:

Нужно написать текст на тему «Душевые кабины» объемом 3500 знаков. Уровень спама – до 55%, уровень воды не более 18%, уникальность – от 90%. Слово «душевые» использовать не более 15 раз. Избегать стоп-слов (и, или, но, а).

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

Технические характеристики

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

Макет веб-сайта

В случае с текстами сюда можно отнести:

  • количество знаков на абзац,

  • тип и размер шрифта,

  • количество используемых ключевых слов,

  • правила структурирования текста с помощью подзаголовков,

  • необходимые форматы данных (таблицы, списки, цитаты и т.п.).

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

  • выбор системы управления данными (WordPress, Joomla и т.п.),

  • выбор фреймворков (React, Angular и т.п.),

  • количество всплывающих окон,

  • ширину контентной части страницы,

  • расположение форм обратной связи в приложении,

  • дополнительные функции. 

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

Маркетинговые характеристики

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

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

План действий по разработке продукта

Заказчик рассказывает о целевой аудитории и ее особенностях. Задача исполнителя – воспользоваться этой информацией и сделать итоговый проект/текст наиболее привлекательным для указанной ЦА.

Этапы работы

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

  1. Этап разработки идей и дополнение существующего плана действий. 

  2. Демонстрация первого прототипа. 

  3. Приемка первой тестовой версии продукта.

  4. Тестирование функциональности.

  5. Разработки дизайна. 

  6. А/Б-тестирование визуальных компонентов и CTA-элементов. 

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

Другие аспекты

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

Структура приложения на интеллект-карте

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

Срок выполнения работы тоже приписывается заранее, как и общий бюджет проекта. 

Примеры ТЗ

Рассмотрим два абстрактных примера технического задания в том виде, в котором они часто встречаются.

Для разработчиков

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

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

Текст ТЗ может содержать более конкретную информацию об имеющихся функциях:

  • На сайте должна быть форма для загрузки файлов (только в форматах JPG, PNG).

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

  • Если пользователь долго бездействует (более 20 секунд), должен появляться робот-помощник (его функциональность описана ниже).

  • Под каждым материалом на сайте должна быть секциями с комментариями. 

Также в ТЗ можно внести требования к дизайну и оформлению кода:

  • Цвет подзаголовков берем из макета (#CD6326).

  • Списки должны быть оформлены в формате ul > li > a.

  • Блочные структуры должны быть реализованы с помощью свойства селекторов flex.

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

  • Работа должна быть доступна в репозитории my-new-project.

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

  • В качестве базы данных используется технология MongoDB.

Для копирайтеров

Текст на тему «Стоит ли использовать WordPress в 2020 году?».

Общие требования к тексту:

  1. Статья должна быть поделена на части. Каждый подзаголовок отделяет один логический блок. 

  2. В тексте необходимо использовать одну таблицу и минимум один список.

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

  4. В тексте должны быть подзаголовки второго уровня, минимальный промежуток между подзаголовками – 750 символов, максимальный – 900 символов.

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

  6. Ключевые фразы должны быть равномерно распределены по тексту. Расстояние между ключевыми фразами не менее 1000 знаков. Первое ключевое слово должно использоваться в первом абзаце.

Объем текста: от 10 000 знаков.

Примерная структура текста:

  1. Что такое WordPress.
  2. Основные преимущества WordPress.
  3. Сравнение WordPress с другими CMS.

Ключевые фразы:

  • WordPress (8)
  • Темы для ВордПресс (1)
  • CMS WordPress (2)
  • Для разработчиков (1)
  • Для новичков (2)
  • Как установить на сайт WordPress (1)
  • Joomla (2)
  • Drupal (1)

Вместо заключения 

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

Как пишется слово гораздо или гараздо

Как думаете — сработает такая команда?

bash% echo $(( .1 + .2 ))
bash: .1 + .2 : syntax error: operand expected (error token is ".1 + .2 ")

Как видите, bash выполнять её не хочет, а вот в zsh она обрабатывается совершенно нормально:

zsh% echo $(( .1 + .2 ))
0.30000000000000004      # Ну, "работает" в той мере, в какой работает IEEE-754.

В bash просто нельзя выполнять вычисления с дробными числами, не прибегая при этом к bc, dc или к каким-нибудь хакам. В сравнении с возможностью просто воспользоваться конструкцией вида a + b всё это кажется некрасивым, медленным и сложным.

aiiftk8 fjumr6latzhw8h5naac

В bash имеются и другие неприятные пробелы. Например — прекрасное свойство игнорирования NULL-байтов:

zsh% x=$(printf 'Nx00L'); printf $x | xxd -g1 -c3
00000000: 4e 00 4c  N.L

bash% x=$(printf 'Nx00L'); printf $x | xxd -g1 -c3
bash: warning: command substitution: ignored null byte in input
00000000: 4e 4c     NL

Возникает такое ощущение, что это предупреждение в bash добавили сравнительно недавно (4.4-patch 2); оно очень меня «порадовало» несколько лет назад. Тогда NULL-байты просто тихо, без выдачи предупреждения, игнорировались. Я полагаю, что предупреждение — это своего рода «улучшение» (а вот если бы этот недостаток bash, и правда, исправили бы, это было бы настоящее улучшение). Полагаю, что выполнить подобное улучшение bash не так-то просто, иначе его уже выполнили бы. Причина этой особенности bash кроется в наследии C-строк, завершающихся символом NULL. Но, честно говоря, такие вещи не должны выходить на поверхность в высокоуровневых языках вроде языка командной оболочки Linux. В этом, кроме того, есть доля иронии, так как одной из первоначальных целей Стивена Борна, разрабатывавшего bash, было избавление от необоснованных ограничений на размеры строк. Подобные ограничения были в то время распространённым явлением.

Надо сказать, что NULL-байты — это не такое уж и редкое явление. Возьмём, например, такую команду: find -print0, xargs -0 или что-то, похожее на неё. Всё это работает совершенно нормально, но лишь до тех пор, пока мы не попытаемся присвоить нечто подобное переменной. NULL-байты, правда, можно использовать при присваивании значений массивам, но только если удастся вызвать правильное заклинание:

bash% read -rad arr < <(find . -type f -print0)

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

zsh% arr=(**/*(.))

zsh% IFS='x00' arr=($(find . -type f -print0)) # Если нужно использовать find (это нужно нечасто)

zsh% arr=( "${(0)$(find . -type f -print0)}" )

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

И даже не думайте сделать нечто вроде следующего:

img=$(curl https://example.com/image.png)
if [[ $cond ]]; then
    optpng <<<"$img" > out.png
else
    cat <<<"$img" > out.png
fi

Конечно, этот код можно отрефакторить — чтобы избежать использования переменной (и пример это, надо признать, несколько надуманный), но такой код просто должен работать. Однажды я написал скрипт для импорта электронной почты из Mailgun API. Работал он хорошо, но иногда изображения оказывались искажёнными, а я не мог понять причину происходящего. Оказалось, что Mailgun, стремясь мне «помочь», декодирует вложения (то есть — избавляется от кодировки Base64) и отправляет бинарные данные, которые bash (в то время) просто по-тихому выбрасывал. Мне, для того чтобы в этом разобраться, понадобилось очень много времени. Я забыл уже — почему так было, но мне было сложно избежать хранения ответа в переменной. В итоге я переписал скрипт на Python, что, честно говоря, было пустой тратой времени. Этот конкретный случай сильно отбил у меня желание пользоваться bash и привёл к появлению статьи о ловушке написания скриптов для командной оболочки. Но, как бы там ни было, zsh решает многие из перечисленных здесь проблем, в том числе — эту.

***

Zsh, кроме того, решает большинство проблем с кавычками:

zsh% for f in *; ls -l $f
-rw-rw-r-- 1 martin martin 0 Oct 19 06:51 asd.txt
-rw-rw-r-- 1 martin martin 0 Oct 19 06:51 with space.txt

bash% for f in *; do ls -l $f; done
-rw-rw-r-- 1 martin martin 0 Oct 19 06:51 asd.txt
ls: cannot access 'with': No such file or directory
ls: cannot access 'space.txt': No such file or directory

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

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

zsh% for i in *; ls -l $=i
-rw-rw-r-- 1 martin martin 0 Oct 19 06:51 asd.txt
ls: cannot access 'with': No such file or directory
ls: cannot access 'space.txt': No such file or directory

Конструкция [[ должна исправить проблемы [, но и для неё характерны странности при работе с кавычками:

zsh% a=foo; b=*;
zsh% if [[ $a = $b ]]; then
       print 'Equal!'
     else
       print 'Nope!'
     fi
Nope!

bash% a=foo; b=*
bash% if [[ $a = $b ]]; then
        echo 'Equal!'
      else
        echo 'Nope!'
      fi
Equal!

Тут мы получаем результат Equal! из-за того, что без кавычек правая часть выражения интерпретируется как шаблон. В zsh нужно использовать $~var для того чтобы в явном виде включить режим сопоставления с шаблоном. Это — гораздо более удачная модель работы, чем такая, при использовании которой необходимо помнить о том, когда нужно, а когда не нужно заключать что-то в кавычки. Иногда функционал сопоставления с шаблоном необходим, в таком случае кавычки не нужны. Но не всегда сразу ясно, будет ли выражение if [[ ... корректным при отсутствии кавычек.

Кто-то скажет, что я — недобросовестный рассказчик, так как кавычки нужно применять всегда. Знаете, я мог бы обеспечить себе безбедное существование, если бы мне платили за то, что я добавляю кавычки в чужие скрипты командной оболочки. Я уже 40 лет говорю людям о том, что им надо «всегда заключать строки в кавычки», но неоспоримые эмпирические данные показали, что этот подход попросту не работает.

Большинство людей не являются виртуозами разработки скриптов командной оболочки. Они зарабатывают на жизнь написанием программ на Python, C, Go или PHP, или, может, они являются системными администраторами, или учеными. И ещё они время от времени пишут скрипты командной оболочки. Они просто видят некий работоспособный фрагмент кода и полагают, что этот код ведёт себя адекватно, не понимая при этом тонких различий между $@, $* и «$@». И я полагаю, что это, на самом деле, вполне приемлемо, так как поведение подобных конструкций может быть странным, удивительным и запутанным.

И это — гораздо сложнее, чем простое «заключение переменных в кавычки», особенно — если пользоваться конструкцией $(..), так как подстановка команды часто тоже нуждается в кавычках, равно как и любые переменные внутри неё. Не успеешь оглянуться — и у тебя уже два, три или большее количество уровней вложенных кавычек, а если забыть об одном из их наборов — жди неприятностей.

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

И «всегда заключайте всё в кавычки», это совет, который даже нельзя назвать правильным, так как кавычки нужно использовать всегда, кроме тех случаев, когда их использовать не нужно:

zsh% a=foo; b=.*;
zsh% if [[ "$a" =~ "$b" ]]; then
       print 'Equal!'
     else
       print 'Nope!'
     fi
Equal!

bash% a=foo; b=.*
bash% if [[ "$a" =~ "$b" ]]; then
        echo 'Equal!'
      else
        echo 'Nope!'
      fi
Nope!

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

Ещё одна знаменитая «ловушка кавычек» скрывается в непонимании особенностей и различий конструкций $@, «$@», $* и «$*»:

zsh% cat args
echo "unquoted @:"
for a in $@; do echo "  => $a"; done

echo "quoted @:"
for a in "$@"; do echo "  => $a"; done

echo "quoted *:"
for a in $*; do echo "  => $a"; done

echo "quoted *:"
for a in "$*"; do echo "  => $a"; done
bash% bash args
unquoted @:
  => hello
  => world
  => test
  => space
  => Guust1129.jpg
  => IEEESTD.2019.8766229.pdf
  [.. rest of my $HOME ..]
quoted @:
  => hello
  => world
  => test space
  => *
unquoted *:
  => hello
  => world
  => test
  => space
  => Guust1129.jpg
  => IEEESTD.2019.8766229.pdf
  [.. rest of my $HOME ..]
quoted *:
  => hello world test space *

Опытный автор скриптов командной оболочки знает, что ему (почти) всегда нужно использовать «$@». Но как часто приходится видеть, что подобной конструкцией пользуются неправильно. И дело не в том, что так поступают люди, которые совершенно ничего не знают о скриптах. Если некто узнал о кавычках и о разделении слов, то использование $@ без кавычек — это совершенно логичное решение. Ведь можно ожидать, что «$@» будет восприниматься как единственный аргумент (как «$*»). И получается, что говоришь всем о том, чтобы они всегда использовали кавычки для предотвращения разделения слов, а потом добавляешь, что есть один особый случай, когда добавление кавычек вызывает особый механизм разделения слов, и этот механизм не следует ни одному из тех правил, о которых им рассказывали.

В zsh $@ и $*$argv) — это массивы (предназначенные только для чтения), и все они работают одинаково, ведут себя так, как можно от них ожидать, и не преподносят нам никаких сюрпризов:

unquoted @:
  => hello
  => world
  => test space
  => *
quoted @:
  => hello
  => world
  => test space
  => *
unquoted *:
  => hello
  => world
  => test space
  => *
quoted *:
  => hello world test space *

В bash, на самом деле, можно воспользоваться командой argv=(»$@»), после чего в нашем распоряжении будет массив. И, если честно, так оболочка bash и должна работать по умолчанию.

Этот массив нужно обходить в цикле:

bash% for a in "${argv[@]}"; do
        echo "=> $a"
      done

А в zsh достаточно просто воспользоваться конструкцией for a in $argv. И, если отвлечься от никчёмного [@], подумаем о том, зачем заниматься разделением слов при работе с каждым элементом массива? Конечно, у такого подхода, вероятно, где-то есть какое-то применение, но нужно это крайне редко. Лучше просто всем этим не пользоваться, за исключением случаев явного применения = и/или ~.

А вот — ещё один интересный нюанс:

zsh% n=3; for i in {1..$n}; print $i
1
2
3

bash% n=3; for i in {1..$n}; do echo "$i"; done
{1..3}

bash% n=3; for i in {1..3}; do echo "$i"; done
1
2
3

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

***

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

zsh% arr=(123 5 1 9)
zsh% echo ${(o)arr}     # Лексический порядок
1 123 5 9
zsh% echo ${(on)arr}    # Числовой порядок
1 5 9 123

bash% IFS=$'n'; echo "$(sort <<<"${arr[*]}")"; unset IFS
1 123 5 9
bash% IFS=$'n'; echo "$(sort -n <<<"${arr[*]}")"; unset IFS
1 5 9 123

Мне пришлось порыться в интернете для того чтобы выяснить, как это делается в bash. Нужный мне ответ на Stack Overflow начинался так: «вам, на самом деле, не нужно так много кода». Ну не смешно ли это? Полагаю, что этот ответ был комментарием к другому ответу, в котором была приведена ужасно сложная конструкция, в которой были реализованы алгоритмы сортировки и прочее подобное на «чистом bash». Полагаю, что то, что я тут привёл, это как раз и есть пример «не такого уж большого кода». И, конечно, вся эта конструкция представляет собой настоящее минное поле в том случае, если её решено будет расширить. Для того чтобы нажить проблемы, достаточно забыть пару вложенных кавычек.

Работа с массивами в bash, в целом, выглядит достаточно неуклюже:

bash% arr=(first second third fourth)

bash% echo ${arr[0]}
first
bash% echo ${arr[@]::2}
first second

Это всё, конечно, работает, да и кода тут не так много, но зачем мне этот [@]? Может — это используется по каким-то (историческим) причинам, но в zsh то же самое реализуется в гораздо более читабельном и простом виде:

zsh% arr=(first second third fourth)

zsh% print ${arr[1]}        # Да, нумерация элементов начинается с 1. С этим придётся смириться.
first
zsh% print ${arr[1,2]}
first second

Синтаксис работы с массивами bash скопирован из ksh. Поэтому, полагаю, нам нужно винить во всём Дэвида Корна (zsh тоже такое поддерживает, если нужно пользоваться именно такими конструкциями). Но обычная работа с индексами выглядит гораздо проще.

А вот — ещё некоторые полезные возможности:

zsh% ls *.go
format.go  format_test.go  gen.go  old.go  uni.go  uni_test.go

zsh% ls *.go~*_test.go
format.go  gen.go  old.go  uni.go

zsh% ls *.go~*_test.go~f*
gen.go  old.go  uni.go

Конструкция *.go разворачивается и фильтрует шаблон после ~. В данном случае — *_test.go. На первый взгляд всё это выглядит несколько таинственно, но работать с bash-шаблонами стиля ksh гораздо сложнее:

bash% ls !(*_test).go
format.go  gen.go  old.go  uni.go

bash% ls !(*_test|f*).go
gen.go  old.go  uni.go

Конструкция !(..) означает «выбрать всё кроме шаблона». Здесь подразумевается наличие знака * (zsh поддерживает !(..) если установить ksh_glob). Хотя это и работоспособная конструкция, модель шаблон~фильтр~фильтр гораздо проще. Она, кроме того, гораздо гибче, так как её не нужно начинать с поиска всех совпадений.

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

zsh% ls **/*(.)
LICENSE         go.sum           unidata/gen.go             wasm/make*
README.md       old.go           unidata/gen_codepoints.go  wasm/srv*
[..]

А вот так можно вывести сведения о директориях:

zsh% ls -d /etc/**/*(/)
/etc/OpenCL/                      /etc/runit/runsvdir/default/dnscrypt-proxy/log/
/etc/OpenCL/vendors/              /etc/runit/runsvdir/default/ntpd/log/
/etc/X11/                         /etc/runit/runsvdir/default/postgresql/supervise/
[..]

Или — сведения о файлах, изменённых за последнюю неделю

zsh% ls -l /etc/***(.m-7)    # *** - это сокращение для **/*; для его использования нужно включить GLOB_STAR_SHORT
-rw-r--r-- 1 root root 28099 Oct 13 03:47 /etc/dnscrypt-proxy.toml.new-2.1.1_1
-rw-r--r-- 1 root root    97 Oct 13 03:47 /etc/environment
-rw-r--r-- 1 root root 37109 Oct 17 10:34 /etc/ld.so.cache
-rw-r--r-- 1 root root 77941 Oct 19 01:01 /etc/public-resolvers.md
-rw-r--r-- 1 root root  6011 Oct 19 01:01 /etc/relays.md
-rw-r--r-- 1 root root   142 Oct 19 07:57 /etc/shells

Их даже можно упорядочить по дате модификации, воспользовавшись om (***(.m-7om)), хотя особого смысла в этом нет, так как ls снова их переупорядочит. Но если осуществляется обход файлов в цикле — это может пригодиться.

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

bash% find /etc -type f -mtime 7 -exec ls -l {} +
find: ‘/etc/sv/docker/supervise’: Permission denied
find: ‘/etc/sv/docker/log/supervise’: Permission denied
find: ‘/etc/sv/bluetoothd/log/supervise’: Permission denied
find: ‘/etc/sv/postgresql/supervise’: Permission denied
find: ‘/etc/sv/runsvdir-martin/supervise’: Permission denied
find: ‘/etc/wpa_supplicant/supervise’: Permission denied
find: ‘/etc/lvm/cache’: Permission denied
-rw-rw-r-- 1 root root  167 Oct 12 22:17 /etc/default/postgresql
-rw-r--r-- 1 root root  817 Oct 12 09:11 /etc/fstab
-rw-r--r-- 1 root root 1398 Oct 12 22:19 /etc/passwd
-rw-r--r-- 1 root root 1397 Oct 12 22:19 /etc/passwd.OLD
-rw-r--r-- 1 root root  307 Oct 12 23:10 /etc/public-resolvers.md.minisig
-rw-r--r-- 1 root root  297 Oct 12 23:10 /etc/relays.md.minisig
-r-------- 1 root root  932 Oct 12 09:57 /etc/shadow
-rwxrwxr-x 1 root root  397 Oct 12 22:23 /etc/sv/postgresql/run

Не знаю точно, как заставить bash игнорировать эти ошибки, не выполняя перенаправления в stderr (больше кода!). А если вы думаете, что добавление одиночных букв в (..) после шаблона — это сложно, тогда попытайтесь разобраться со странным синтаксисом find. Шаблоны поиска — это очень здорово.

Замещение параметров в стиле csh — это весьма полезный механизм:

zsh% for f in ~/photos/*.png; convert $f ${f:t:r}.jpeg

Конструкция :t позволяет получить имя файла, конструкция :r позволяет получить директорию и имя файла (без расширения). В csh это было возможно ещё до моего рождения, но bash этого не умеет (в bash возможна подстановка истории, но не переменных). В FAQ по bash говорится, что «В Posix описан более мощный, хотя и, в какой-то степени, более сложный для понимания механизм, взятый из ksh». Интересное заявление — особенно учитывая то, что вышеприведённый пример, переписанный в bash, выглядит так:

bash% for f in ~/photos/*.png; do convert "$f" "$(basename "${f%%.*}")"; done

С технической точки зрения это «мощнее», в том смысле, что с помощью этой конструкции можно решать и другие задачи, но я не сказал бы, что она «удачнее подходит для выполнения распространённых операций» (в zsh, конечно, реализованы и %, и #).

Обратите внимание на то, что в bash нельзя строить вложенные конструкции из ${..}. То есть, например, попытка воспользоваться «${${f%%.*}##*/}» приведёт к сообщению об ошибке:

zsh% f=~/asd.png; print "${${f%%.*}##*/}"
asd

bash% f=~/a.png; echo "${${f%%.*}##*/}"
bash: ${${f%%.*}##*/}: bad substitution

Хотя применение подобного может быстро привести к появлению весьма странной ASCII-мешанины, иногда это может и пригодиться, если пользоваться этим осторожно и с умом. А если у экранов нет детей — то можете развернуть следующий раздел и посмотреть на более продвинутый пример, который демонстрирует вывод самого длинного элемента массива. Я нашёл это в руководстве пользователя zsh.

Смотреть с осторожностью и без детей!

print ${array[(r)${(l.${#${(O@)array//?/X}[1]}..?.)}]}

***

Я долго ещё могу говорить о bash и zsh, но на том, что уже сказано, я решил остановиться. Проблемы bash не новы — большинству из них (если не всем) уже лет по 20, а может и больше. Я не знаю, почему оболочка bash стала стандартом де-факто, не знаю и о том, почему люди тратят время на создание сложных решений, направленных на обход проблем bash, когда в zsh они уже решены. Полагаю, это так из-за того, что в Linux использовалось много всего, связанного с GNU, и bash поставлялся с Linux, а GNU-утилиты использовали (и используют) bash. Не очень хорошая причина особенно — когда прошло уже 30 лет.

В zsh, конечно, есть много ограничений. Для начала, синтаксис там такой, что кое-кого он может и перепугать, да и многое другое там далеко от идеала. Но, несмотря ни на что, zsh, бесспорно, лучше bash. Я, на самом деле, не могу найти ни одной задачи, которую bash решает лучше zsh. На стороне bash лишь то, что эта оболочка уже установлена на огромном количестве систем.

Но распространённость bash — сомнительное, переоцениваемое преимущество. У zsh нет зависимостей помимо libc и curses, а размер zsh на моей системе составляет всего 970 Кб. Существуют дистрибутивы zsh практически для любых систем. (Полная установка zsh — это около 8 Мб, которые представляют собой, в основном, необязательные вспомогательные функции, с которой поставляется оболочка. А размер bash, кстати, составляет около 1,3 Мб).

Zsh, в сравнении с большинством интерпретаторов, система весьма компактная. Меньше неё лишь Lua (275 Кб). Совет придерживаться Posix sh ради совместимости хорошо звучал в 1990-е, когда встречались системы SunOS с sun-sh и ничего другого на них поставить было нельзя. Но эти дни давно прошли, и хотя кое-кто ещё работает на таких системах (иногда даже с csh!), высока вероятность того, что они не соберутся пробовать запускать у себя скрипты Docker или Arch Linux или что-нибудь ещё.

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

Использование zsh, кроме того, облегчает работу в разных системах. Дело в том, что zsh позволяет уйти от использования различных командных оболочек, сталкиваясь при этом с (потенциальными) проблемами совместимости. Явным образом устанавливая zsh в роли интерпретатора можно положиться на поведение zsh, а не надеяться на то, что /bin/sh в $некоей_системе будет вести себя так же (даже dash обладает некоторыми расширениями для POSIX sh вроде local).

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

#!/usr/bin/env zsh
[ "${ZSH_VERSION:-}" = "" ] && echo >&2 "Only works with zsh" && exit 1

Это позволяет обеспечить запуск скрипта (./script.zsh) с помощью zsh, а если попытаться запустить его как sh script.zsh или bash script.zsh — будет выдана ошибка. Сделано так на тот случай, если кому-то, для того, чтобы понять, чем запускать этот скрипт, подсказки в виде расширения .zsh недостаточно.

В общем, желаю всем s/bash/zsh/g. Тогда всё у вас будет чуть лучше, чем прежде.

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

Пользуетесь ли вы zsh?

oug5kh6sjydt9llengsiebnp40w

Adblock
detector