vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner
http://esr.ibiblio.org/?p=7421

Раймонд умный пост написал по поводу концепций, которые лежат под Unix way. Я эту мысль про семантическую локальность три дня думать буду.

Date: 2017-03-16 10:38 am (UTC)
livelight: (Default)
From: [personal profile] livelight
Мы говорим Unix Way - подразумеваем Unix Shell, говорим Unix Shell - подразумеваем Unix Way :)

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

Date: 2017-03-16 11:08 am (UTC)
From: [identity profile] amarao-san.livejournal.com
Я давно про это думал. Удивительно или нет, но мне кажется, что единственное решение тут - это монады. Мы передаём на вход утилиты, ожидающей Just data, вывод утилиты, выдающей Maybe Data, и получаем ошибку прям от шелла со словами, который говорит "нельзя". Мы ставим между ними в пайп, конвертор, который знает, что делать когда дата не "Just", и у нас всё работает точно. Наверное, под нужды шелла можно написать и более выразительные монады.

Date: 2017-03-16 07:23 pm (UTC)
From: [personal profile] anonim_legion
От слова "монада" перекосит тех, кто писал (и работает с) bash. Если у них уж скобки в if должны непременно отделяться пробелами, то какие уж тут монады...

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

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

Чего нет в типичных пайпах - так это общепринятых границ сообщений. Даже для потоковых данных может появиться смысл в передаче данных некими кусками, chunk'ами. В виндовых named pipes есть механизм передачи отдельных сообщений, в юниксах же, насколько мне известно, подобное есть только в d-bus. Самостоятельно сделать разбивку на сообщения несложно, но - каждый раз это все равно нужно делать, и всякий будет делать это по-своему.

Date: 2017-03-17 09:05 am (UTC)
slobin: (Default)
From: [personal profile] slobin
Чего-то задумался над мировоззренческим вопросом, что мешает плохому программисту. Ну, в смысле, по сравнению с танцором.

... Наше будущее лучезарно как никогда ...

Date: 2017-03-17 01:21 pm (UTC)
livelight: (Default)
From: [personal profile] livelight
Стек-трейсы придуманы для программистов команды поддержки и исходных разработчиков. Тех, кто показывает стек-трейс конечному пользователю без особой просьбы с его стороны, надо больно бить по рукам. Тех, кто сообщение для показывания пользователю выбирает от балды, - тоже.

Date: 2017-03-17 08:41 pm (UTC)
livelight: (Default)
From: [personal profile] livelight
У нормального исключения есть внятный текст исходной ошибки для любого пользователя, тип исключения для продвинутого пользователя и стек-трейс для баг-репортов. Самые умные могут текст (например: "Connection to 10.11.12.13:1415 refused") и другие известные им поля исходного исключения преобразовывать в высокоуровневую ошибку для пользователя же (например: "Cannot connect to backend server"), оставляя опять же для баг-репортов всю иерархию исключений.
А вот криворукие программисты могут и такое делать, как выше сказано, да.

Date: 2017-03-18 08:14 am (UTC)
From: [personal profile] inkelyad
Я так понял, проблема в том, что если из конструкции вида
foo[bar(..)]
нам прилетает какой-нибудь IndexOutOfBound, из за того, что внутри bar действительно ошибка есть(алгоритм неправильно написали), то мы не можем ничего разумного в текст написать, т.к. мы про этот факт не знаем и можем думать, что сами из foo неправильный индекс достать пытаемся.
А текст исходной ошибки в данном случае явно ничего умного не скажет.

Date: 2017-03-18 11:04 am (UTC)
livelight: (Default)
From: [personal profile] livelight
Такой IndexOutOfBound можно для конечного пользователя превратить только во что-нибудь типа "500 Internal server error" (со складыванием стек-трейса туда, где его сможет забрать команда поддержки). А вот вышеприведённые примеры с банкоматами говорят в том числе о том, что: 1) не проведена внятная валидация ввода; 2) после чего случившуюся в глубинах ошибку ещё и не привели во внятный вид. Как минимум два повода надавать по шее тем программистам.

Date: 2017-03-18 12:08 pm (UTC)
From: [personal profile] inkelyad
Имеется в виду, что foo[] и может быть той самой валидацией.
Из логики "индекса в массиве не нашлось, значит, пользователь неправильное значение ввел. Ловим исключение и по нему ругаемся."
А тут внезапно индекс не нашелся где-то глубже по вызовам и поэтому все сломалось.

Date: 2017-03-18 12:15 pm (UTC)
livelight: (Default)
From: [personal profile] livelight
По возрастающей степени дебилизма способы валидации такие:

1. Проверяем индекс ("индекса в массиве не нашлось, значит, пользователь неправильное значение ввел"), и если он плохой - внятно ругаемся
2. "Ловим исключение и по нему ругаемся" -- опять же внятно.
3. Прокидываем исключение выше, там пишут 500 Internal Server Error
4. Показываем пользователю кишки системы, а также кровь, распидарасило и стектрейс

Date: 2017-03-18 12:26 pm (UTC)
From: [personal profile] inkelyad
2. "Ловим исключение и по нему ругаемся" -- опять же внятно.
try
... = foo[bar()]
catch IndexOutOfBound
ShowMessage("У вас нет такого номера счета")

Мы вот решили поймать исключение при индексировании foo и внятно выругаться.
Семантика у foo такая, что если в нем чего-то нет, то пользователь не тот счет ввел
Вот только оказалось, что исключение прилетело не от нашего индексирования, а из глубин bar.
И все - при какой-то совершенно посторонней ошибке пользователю показывается "У вас нет такого счета".
А потом еще интефейс усовершенствовали, чтобы вводить ничего не надо, а надо выбрать из списка, но проверку оставили.

Date: 2017-03-18 01:13 pm (UTC)
livelight: (Default)
From: [personal profile] livelight
То есть, предлагаете присвоить такому способу третий уровень идиотизма, а не второй? :)

Date: 2017-03-18 01:36 pm (UTC)
From: [personal profile] inkelyad
А вот бы знать.
Это демонстрация того, как я понял утверждения хозяина журнала о потере контекста - что одно и то же исключение, которое бросилось тут и или там, нужно как-то различать , но это немного затруднительно.

(no subject)

From: [personal profile] livelight - Date: 2017-03-18 01:46 pm (UTC) - Expand

(no subject)

From: [personal profile] livelight - Date: 2017-03-18 06:32 pm (UTC) - Expand

(no subject)

From: [personal profile] yurikhan - Date: 2017-03-19 04:25 pm (UTC) - Expand

Date: 2017-03-17 04:56 am (UTC)
ext_646638: (Default)
From: [identity profile] rdia.livejournal.com
> Все попытки сделать "шелл лучше чем bourne shell" сводились к тому, чтобы напихать в скриптовый язык более низкоуровневых конструкций - объектов, методов, массивов.

Проблема в том, что люди вообще не понимают, что bash - это язык со встроенной ленивостью, с офигительной параллельностью (& явно легче написать даже чем Хаскеллевский par, а в ленивом вызове | вообще всё по-умолчанию выполняется параллельно). Ну и когда пытаются заменить bash питоном всё "немного предсказуемо".

------------------------
И, конечно, это правда насчёт общих контекстов и умолчаний. Я не хочу писать кавычки у каждого строкового параметра ls, не хочу писать .0 у каждого float'а, хочу сразу иметь неограниченные целые числа и любую точность вещественных.

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

Т.е. сделать язык, который имеет несколько режимов: мягкий, когда это почти Питон по раздолбайству и жёсткий, когда это ML (вернее Хаскель). Так, чтобы когда мы пишем скрипт на 1 раз, можно было допускать ошибки, а когда это часть системы запуска, проверки были дай боже.

b и p

Date: 2017-03-17 06:31 am (UTC)
phd_ru: (Default)
From: [personal profile] phd_ru
Я время от времени заменяю bash питоном, а то и сразу пишу на питоне. Потому что для каждого из этих скриптовых языков своя область применения. bash хорошо работает с программами и процессами, питон с файлами, структурами данных и сетевыми протоколами.

Баш на dash

Date: 2017-03-17 07:26 am (UTC)
phd_ru: (Default)
From: [personal profile] phd_ru
Я отчасти с тобой согласен и отчасти нет. Когда мне хватает возможностей урезанного /bin/sh, я именно его и использую. А когда не хватает, тогда думаю, что использовать вместо. Ну и бывает, что использую bash. Если в shell-скрипте — то с #! /usr/bin/env bash. Или, например, я точно знаю, что интерпретатором команд .travis.yml на Travis CI является bash, почему бы мне тогда не использовать его возможности, когда они нужны? Я и использую.

Date: 2017-03-17 08:07 am (UTC)
phd_ru: (Default)
From: [personal profile] phd_ru
Я частенько попадаю на FreeBSD, где bash в /usr/local/bin/

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

June 2025

S M T W T F S
1 23 4 56 7
89 1011 12 13 14
1516 17 18 192021
22232425262728
2930     

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 21st, 2025 03:22 pm
Powered by Dreamwidth Studios