Дайсендзи га кедаранаёса

16 min

language: ja bn en es hi pt ru zh-cn zh-tw

Здравствуйте, я бездарь.
В последнее время я начал задумываться, не лучше ли изучить C, если в конечном итоге я все равно буду работать с Go? И наоборот, я начал изучать обработку памяти, о которой не нужно особо задумываться в Go и Rust, вспоминая прошлые неудачи. Внезапно, просматривая исходный код параллельной версии SCP, mscp, я задумался, почему он возвращает -1 в качестве возвращаемого значения.

$ grep -r 'return \-1' ./* | sort | uniq
grep: warning: stray \ before -
./libssh/doc/guided_tour.dox:                return -1;
./libssh/doc/guided_tour.dox:            return -1;
./libssh/doc/guided_tour.dox:        return -1;
./libssh/examples/keygen.c:     return -1;
./libssh/examples/knownhosts.c:                return -1;
./libssh/examples/knownhosts.c:            return -1;
./libssh/examples/knownhosts.c:        return -1;
./libssh/examples/libssh_scp.c:                    return -1;
./libssh/examples/libssh_scp.c:                return -1;
./libssh/examples/libssh_scp.c:            return -1;
./libssh/examples/libssh_scp.c:        return -1;
./libssh/examples/libssh_scp.c:    return -1;
./libssh/examples/samplesftp.c:            return -1;
./libssh/examples/samplesftp.c:        return -1;
./libssh/examples/scp_download.c:                         return -1;
./libssh/examples/scp_download.c:                 return -1;
./libssh/examples/scp_download.c:         return -1;
./libssh/examples/scp_download.c:        return -1;
./libssh/examples/ssh_X11_client.c:                     return -1;
./libssh/examples/ssh_X11_client.c:             return -1;
./libssh/examples/ssh_X11_client.c:     return -1;
./libssh/examples/ssh_client.c:            return -1;
./libssh/examples/ssh_client.c:        return -1;
./libssh/examples/ssh_server.c:        return -1;
./libssh/examples/sshd_direct-tcpip.c:        return -1;
./libssh/examples/sshnetcat.c:          return -1;
./libssh/examples/sshnetcat.c:      return -1;
./libssh/examples/sshnetcat.c:    return -1;
./libssh/src/agent.c:      return -1;
./libssh/src/agent.c:    return -1;
./libssh/src/agent.c:  return -1;
./libssh/src/auth.c:            return -1;
./libssh/src/auth.c:        return -1;
./libssh/src/base64.c:                             if(!ptr) return -1; \

Если подумать, я, кажется, никогда не видел двузначных возвращаемых значений в результатах выполнения,
и хотя я нашел объяснение использования -1 в ответе на Yahoo! Answers примерно 2008 года, это был не очень адекватный ответ, и я нашел только этот продукт Hitachi, uCosminexus Interschema, который является сервером приложений и промежуточным ПО.
Определение выходных функций в языке C

3 -1 Преобразование не удалось Кодировка символов строки, переданной встроенной функции пользователя Это строка, переданная встроенной функции пользователя, с добавленным завершающим NULL.

Итак, если в конце дать return -1 и проверить возвращаемое значение, оно будет 255.

alleycat:[haturatu]:~/git/cmem$ ./a
格納した文字列 : Hi, My sweet hearts
alleycat:[haturatu]:~/git/cmem$ echo $?
255

В случае Go

Это было то же самое, даже если я давал os.Exit(-1) в Go, но были случаи, когда оно становилось 254, и я задался вопросом, почему. Возможно, оно обрабатывается как исключительная ошибка, которая не вызывает проблем с другими операциями, возвращая 0, 1, 2 в качестве возвращаемых значений, а для всего остального возвращая -1 и динамически возвращая код ошибки с помощью -1?
Информации такого рода довольно мало, и если говорить о технологии, которая активно развивается на Go, то это, вероятно, Go-Ethereum, но если присмотреться, то и там...

:~/git/go-ethereum$ grep -r "return \-1"
grep: warning: stray \ before -
crypto/secp256k1/libsecp256k1/src/java/org/bitcoin/Secp256k1Context.java:     if(!enabled) return -1; //sanity check
crypto/secp256k1/libsecp256k1/src/num_gmp_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/field_10x26_impl.h:            return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:        return -1;
crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h:            return -1;
crypto/secp256k1/libsecp256k1/src/field_5x52_impl.h:            return -1;
crypto/secp256k1/libsecp256k1/src/gen_context.c:        return -1;
crypto/signify/signify_fuzz.go:         return -1
trie/iterator.go:               return -1
trie/iterator.go:               return -1
event/event.go: return -1
event/feed.go:  return -1
common/prque/lazyqueue.go:      return -1
triedb/pathdb/database_test.go: return -1
cmd/devp2p/nodesetcmd.go:                               return -1, errors.New("-limit requires an argument")
cmd/devp2p/nodesetcmd.go:                               return -1, fmt.Errorf("invalid -limit %q", args[i+1])
cmd/devp2p/nodeset.go:                  return -1
cmd/devp2p/dns_route53.go:                      return -1
accounts/abi/bind/bind.go:                              return -1
core/state/snapshot/iterator_fast.go:           return -1
core/state/snapshot/iterator_fast.go:           return -1
p2p/protocol.go:                        return -1
p2p/enode/node.go:                      return -1

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

Еще один проект, который давно развивается, это Hugo.

:~/git/hugo$ grep -r "return \-1"
grep: warning: stray \ before -
compare/compare_strings.go:             return -1
htesting/test_helpers.go:                       return -1
htesting/test_helpers.go:       return -1
hugolib/filesystems/basefs_test.go:             return -1, nil, err
common/hreflect/helpers.go:             return -1
common/herrors/error_locator_test.go:           return -1
common/herrors/error_locator_test.go:           return -1
common/herrors/error_locator_test.go:           return -1
common/herrors/error_locator_test.go:           return -1
common/herrors/error_locator.go:        return -1
common/herrors/error_locator.go:        return -1
common/herrors/error_locator.go:                return -1
common/herrors/file_error.go:                   return -1
common/herrors/file_error.go:           return -1, ""
common/herrors/file_error.go:   return -1, -1
common/hugo/version.go:                 return -1
common/hugo/version.go:                 return -1
common/hugo/version.go:                 return -1
common/hugo/version.go:                 return -1
common/hugo/version.go:                 return -1
common/hugo/version.go:         return -1
common/hugo/version.go: return -1
common/paths/pathparser.go:             return -1
identity/finder.go:     return -1
resources/page/permalinks.go:                                   return -1
resources/page/pages_sort.go:           return -1, -1
resources/page/pages_sort.go:           return -1, -1
resources/page/pages_sort.go:           return -1, -1
resources/page/pages_sort.go:           return -1, -1
resources/page/pages_sort_search.go:    return -1
resources/page/pages_sort_search.go:            return -1
resources/page/pagination.go:           return -1, errors.New("too many arguments, 'pager size' is currently the only option")
resources/page/pagination.go:           return -1, errors.New(("'pager size' must be a positive integer"))
resources/images/image.go:              return -1
tpl/collections/where.go:       return -1, errors.New("unable to convert value to float")
tpl/collections/where.go:       return -1, errors.New("unable to convert value to int")
tpl/transform/transform.go:             return -1
tpl/internal/go_templates/htmltemplate/transition.go:   return -1
tpl/internal/go_templates/htmltemplate/transition.go:                   return -1, errorf(ErrBadHTML, nil, 0, "%q in attribute name: %.32q", s[j:j+1], s)
tpl/internal/go_templates/fmtsort/sort.go:              return -1 // No good answer possible, but don't return 0: they're not equal.
tpl/internal/go_templates/fmtsort/sort.go:                      return -1
tpl/internal/go_templates/fmtsort/sort.go:              return -1, true
tpl/tplimpl/template.go:                                return -1
tpl/tplimpl/template.go:                        return -1
tpl/tplimpl/shortcodes.go:      return -1
parser/pageparser/pagelexer.go:         return -1
parser/pageparser/pagelexer.go:         return -1
parser/pageparser/pagelexer.go:                                 return -1
parser/pageparser/pagelexer.go:         return -1
parser/pageparser/pagelexer.go:         return -1
parser/pageparser/pagelexer.go: return -1

Давайте посмотрим на случай bash, написанного на C

И поскольку bash возвращает значения, отличные от очевидных 0, 1 и т.д., давайте посмотрим на исходный код bash.

alleycat:[haturatu]:~/git/bash$ echo $?
130
alleycat:[haturatu]:~/git/bash$ a
bash: a: Команда не найдена
alleycat:[haturatu]:~/git/bash$ echo $?
127

В таком случае, можно было бы ожидать return 130 или что-то подобное, но...

alleycat:[haturatu]:~/git/bash$ grep -r "return [0-9]" | awk '{print $2" " $3}' | sort | uniq | grep ^r
grep: .git/objects/pack/pack-715759b749131276aa4809bba44f79c13feb23ec.pack: binary file matches
return 0
return 0,
return 0.
return 0.0;
return 0;
return 0L;
return 1
return 1,
return 1-no_line_editing;
return 1.
return 10;
return 11;
return 12;
return 13;
return 14;
return 16
return 1;
return 2
return 2;
return 2;;
return 3
return 3;
return 4
return 42
return 4;
return 5
return 5;
return 6;
return 7
return 7;
return 8;
return 99999;
return 9;
alleycat:[haturatu]:~/git/bash$ grep -r "return -[0-9]" | awk '{print $2" " $3}' | sort | uniq | grep ^r
return -1
return -1.
return -1/EINVAL
return -1;
return -25
return -2;

Не нашлось. Строго говоря, grep -r "return " | grep -oP "return.*" | sort | uniq | grep "[0-9]" мог бы извлечь больше, но это было слишком длинно, поэтому, пожалуйста, простите меня за вышеизложенное.
В таком случае, это все равно выглядит так, будто коды ошибок генерируются динамически.

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

Дайсендзи га кедаранаёса

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

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

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

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

Related Posts