দাইসেঞ্জিগা কেদারানায়োসা

15 min

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

হ্যালো, আমি অযোগ্য।
সম্প্রতি, আমি ভাবছিলাম যে যদি আমি Go ব্যবহার করি, তবে C শেখা ভালো হবে কিনা? এবং এর বিপরীতে, 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 ব্যবহারের কারণ খুঁজে পেয়েছি, কিন্তু এটি খুব একটা নির্ভরযোগ্য উত্তর ছিল না। আমি কেবল হিটাচির 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-এর ক্ষেত্রে

এটি Go-তে os.Exit(-1) দিলেও একই ছিল, তবে কিছু ক্ষেত্রে এটি 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

C-তে লেখা bash-এর ক্ষেত্রে দেখা যাক

এবং, যেহেতু 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

যদি বিদায়ই জীবন হয়, তবে আবার যে বসন্ত আসে তা কী?
দূর দূরান্তের পৃথিবীর প্রান্তে ফোটা বুনো লিলি কী?
যদি বিদায়ই জীবন হয়, তবে আবার দেখা হওয়ার দিনটি কী?
কোমল কোমল সূর্যাস্ত এবং দুজনের ভালোবাসা কী?
যদি বিদায়ই জীবন হয়, তবে যে বাড়ি তৈরি করেছি তা কী?
একাকী একাকী সমভূমিতে যে আলো জ্বলে তা কী?
যদি বিদায়ই জীবন হয়, তবে আমার জীবনই চাই না।
তেরায়ামা শুজি 『যদি বিদায়ই জীবন হয়』

যখন একাকী লাগে, তখন বলি একাকীত্বের মন্ত্র
বিচ্ছিন্ন মানুষের স্মৃতি ভুলে যাওয়ার মন্ত্র
দাইসেঞ্জিগা কেদারানায়োসা দাইসেঞ্জিগা কেদারানায়োসা
উল্টো করে পড়লে সেই মানুষটি শেখানো গান হয়ে যায়
বিদায়ই জীবন
বিদায়ই জীবন
তেরায়ামা শুজি 『দাইসেঞ্জিগা কেদারানায়োসা』

এই ক্ষুদ্র অনুভূতি আরও বিষণ্ণতা নিয়ে আসে।
কাতো কাজুহিকোর মূল ব্যান্ড দ্য ফোক ক্রুসেডার্স সম্ভবত এই জাপানি সাহিত্যের কারণেই ছিল।

Related Posts