だいせんじがけだらなよさ

16 min

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

Hola, soy un inútil.
Últimamente, si voy a usar Go, ¿no sería mejor aprender C? Pensando en eso, he empezado a aprender sobre la gestión de memoria que no es necesario pensar mucho en Go y Rust, basándome en fracasos pasados. De repente, mientras revisaba el código fuente de mscp, la versión de procesamiento paralelo de SCP, me pregunté por qué devuelve -1 como valor de retorno.

$ 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; \

Pensándolo bien, no recuerdo haber visto un valor de retorno de dos dígitos en los resultados de ejecución.
Encontré una respuesta de Yahoo! Chiebukuro de alrededor de 2008 que explicaba por qué se usa -1, pero no era una respuesta muy seria. Solo pude encontrar información en productos como el servidor de aplicaciones y middleware uCosminexus Interschema de Hitachi.
Definición de funciones de salida en C

3 -1 Fallo en la conversión El código de caracteres de la cadena pasada a la función integrada del usuario Es la cadena pasada a la función integrada del usuario con un NULL de terminación añadido.

Y, si se le da return -1 al final y se verifica el valor de retorno, se obtiene 255.

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

En el caso de Go

Esto fue lo mismo al usar os.Exit(-1) en Go, pero hubo patrones en los que se obtenía 254, y me pregunté por qué. Me pregunto si se trata como un error de excepción que no causa problemas en otras operaciones, devolviendo 0, 1, 2 como valores de retorno, y para todo lo demás, devolviendo -1 y generando dinámicamente un código de error con -1.
Hay poca información de este tipo. Si hablamos de tecnología que está a la vanguardia del desarrollo en Go, creo que es Go-Ethereum, pero si se mira de cerca, también...

:~/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

Si se mira de cerca, la mayoría de las llamadas están dentro de las librerías, y solo lo anterior se encuentra en el vasto código. Sospecho que es código traído de alguna implementación de criptografía de clave pública, por lo que, en la práctica, no parece ser código de Go-Ethereum.

Otro proyecto que ha estado en desarrollo desde hace tiempo es 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

Veamos el caso de bash, escrito en C

Y como bash devuelve valores de retorno distintos de 0, 1, etc., que son fáciles de entender, veamos el código fuente de bash.

alleycat:[haturatu]:~/git/bash$ echo $?
130
alleycat:[haturatu]:~/git/bash$ a
bash: a: Comando no encontrado
alleycat:[haturatu]:~/git/bash$ echo $?
127

En este caso, parecería que habría un return 130 o similar, pero...

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;

No lo encontré. Estrictamente hablando, grep -r "return " | grep -oP "return.*" | sort | uniq | grep "[0-9]" probablemente extraerá más, pero era demasiado largo, así que por favor, disculpen lo anterior.
En ese caso, parece que los códigos de error se generan dinámicamente.

La razón por la que estoy investigando algo tan trivial es para investigar de antemano, ya que la depuración podría volverse un infierno, y parece que, aunque Go sea un lenguaje más fácil, no se puede escapar del lenguaje C.

だいせんじがけだらなよさ

Hace mucho tiempo, mientras escuchaba un álbum de Kazuhiko Kato, me llamó la atención el título de la canción だいせんじがけだらなよさ y al investigar, parece ser una versión de Carmen Maki.
Y la fuente original parece ser Shuji Terayama.
『Si solo la despedida fuera la vida』 y 『だいせんじがけだらなよさ』 Poema: Shuji Terayama Canción: Carmen Maki 1969

Si solo la despedida fuera la vida, ¿qué sería la primavera que vuelve?
¿Qué serían los lirios silvestres que florecen en los confines lejanos de la tierra?
Si solo la despedida fuera la vida, ¿qué sería el día en que nos volvamos a encontrar?
¿Qué serían el dulce y tierno atardecer y el amor de los dos?
Si solo la despedida fuera la vida, ¿qué sería el hogar que construimos?
¿Qué sería la luz que encendemos en la triste y solitaria llanura?
Si solo la despedida fuera la vida, entonces no necesito la vida.
Shuji Terayama 『Si solo la despedida fuera la vida』

Cuando me siento solo, lo digo, un hechizo para la soledad.
Un hechizo para olvidar los recuerdos de la persona que se fue.
だいせんじがけだらなよさ だいせんじがけだらなよさ
Si lo lees al revés, se convierte en la canción que esa persona me enseñó.
Solo la despedida es la vida
Solo la despedida es la vida
Shuji Terayama 『だいせんじがけだらなよさ』

Esta sensación de pequeñez añade aún más melancolía.
Quizás The Folk Crusaders de Kazuhiko Kato, de donde él venía, existieron gracias a esta literatura japonesa.

Related Posts