Daisenji ga Kedaranayosa
Olá, sou um incompetente.
Recentemente, pensei que se eu fosse mexer com Go, talvez fosse melhor aprender C? E, inversamente, comecei a aprender sobre o gerenciamento de memória que não preciso pensar muito em Go e Rust, a partir de fracassos passados. De repente, enquanto olhava o código-fonte de mscp, a versão paralela do SCP, me perguntei por que ele retorna -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; \
Pensando bem, não me lembro de ter visto um valor de retorno de dois dígitos no resultado da execução,
e encontrei uma resposta no Yahoo! Chiebukuro por volta de 2008 que explicava o motivo de usar -1, mas não era uma resposta muito decente, e só encontrei algo semelhante no produto de servidor de aplicativos e middleware da Hitachi chamado uCosminexus Interschema.
Definição da função de saída da linguagem C
3 -1 Falha na conversão O código de caracteres da string passada para a função embutida do usuário É a string passada para a função embutida do usuário com um NULL de terminação anexado.
Então, se eu der return -1 no final e verificar o valor de retorno, ele se torna 255.
alleycat:[haturatu]:~/git/cmem$ ./a
格納した文字列 : Hi, My sweet hearts
alleycat:[haturatu]:~/git/cmem$ echo $?
255
No caso do Go
Isso foi o mesmo mesmo quando eu dei os.Exit(-1) em Go, mas havia um padrão em que se tornava 254, e eu me perguntei por quê.
Será que, como valor de retorno, ele retorna 0, 1, 2, e para todo o resto, retorna -1, tratando-o como um erro de exceção que não causa problemas em outras operações, retornando um código de erro dinamicamente com -1?
Há relativamente pouca informação desse tipo, e se considerarmos uma tecnologia que está sendo desenvolvida agressivamente na vanguarda com a linguagem Go, eu diria que é Go-Ethereum, mas se olharmos de perto,
:~/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
Se olharmos de perto, a maioria é chamada dentro de bibliotecas, e apenas o que está acima em um código tão vasto. Parece que é um código de implementação de criptografia de chave pública que provavelmente veio de algum lugar, então, na prática, não parece ser código do Go-Ethereum.
Outro que tem sido desenvolvido há muito tempo é o 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
Vamos ver o caso do bash escrito em C
E como o bash retorna valores de retorno diferentes de 0, 1, etc., que são fáceis de entender, vamos dar uma olhada no código-fonte do bash.
alleycat:[haturatu]:~/git/bash$ echo $?
130
alleycat:[haturatu]:~/git/bash$ a
bash: a: Comando não encontrado
alleycat:[haturatu]:~/git/bash$ echo $?
127
Nesse caso, parece que haveria algo como return 130, mas
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;
Não havia. Estritamente falando, grep -r "return " | grep -oP "return.*" | sort | uniq | grep "[0-9]" extrairia mais, mas era muito longo, então, por favor, me perdoe pelo que está acima.
Nesse caso, parece que ele está gerando códigos de erro dinamicamente.
Estou pesquisando coisas tão triviais porque o ambiente de depuração parece que vai virar um inferno, então quero pesquisar de antemão, e parece que, mesmo que Go seja uma linguagem que se tornou mais fácil, não há como escapar da linguagem C.
Daisenji ga Kedaranayosa
Depois de muito tempo, estava ouvindo um álbum de Kazuhiko Kato e o título da música だいせんじがけだらなよさ me chamou a atenção. Pesquisei e parece ser um cover de Carmen Maki.
E a fonte original parece ser Shuji Terayama.
『Se a despedida é tudo na vida』 e 『Daisenji ga Kedaranayosa』 Poesia: Shuji Terayama Canção: Carmen Maki 1969
Se a despedida é tudo na vida, o que será a primavera que virá novamente?
O que serão os lírios selvagens florescendo nos confins distantes da terra?
Se a despedida é tudo na vida, o que será o dia em que nos reencontraremos?
O que serão o pôr do sol gentil e o amor de nós dois?
Se a despedida é tudo na vida, o que será o lar que construímos?
O que será a luz que acendemos na planície solitária?
Se a despedida é tudo na vida, não preciso de vida alguma.
Shuji Terayama 『Se a despedida é tudo na vida』
Quando me sinto sozinho, eu digo: um feitiço para a solidão
Um feitiço para esquecer as lembranças da pessoa que partiu
Daisenji ga kedaranayosa Daisenji ga kedaranayosa
Lendo ao contrário, torna-se a canção que aquela pessoa me ensinou
A despedida é tudo na vida
A despedida é tudo na vida
Shuji Terayama 『Daisenji ga Kedaranayosa』
Essa sensação de pequenez adiciona ainda mais melancolia.
Talvez The Folk Crusaders de Kazuhiko Kato, de onde ele veio, existissem por causa dessa literatura japonesa.