For the past week or so, I have been working on a means of obtaining real-time information related to Yokohama City Transportation Bureau buses and a viewer that uses this information.
But even I was surprised, as I did not expect this to be completed in just one day(In most cases, the estimated cost will be 3 to 10 times the estimated cost until completion).
どうして、こんなミラクルができたのか?
How was this miracle possible?
―― 過去の私が助けてくれたから
"Because my past helped me"
です。
-----
私、2020年5月に、自分のホームページのプラットフォームをWordPressに置き替えました。
I, in May 2020, replaced my website platform with WordPress.
And there I have been writing notes all over the place, ignoring genres, and publishing them in an uncontrolled manner -- as I'm sure you are well aware.
Of course, the notes are 'only for me to know', and all the prerequisites, construction environment, and directories to be specified are left undocumented.
正直『私以外の他人が読んでも、まったく分からんだろう』と思います。
I honestly think, 'If someone else other than me reads it, they won't understand it at all.
しかし、書いてきた私にだけには『分かる』。
But only I, who have been writing, 'get it'.
これ、結構、重要です。
This is pretty important.
-----
このようなメモであれば、別にブログで公開しなくても良いと思いますよね。
If it is a memo like this, it doesn't needs to be published on a blog.
When I centralize my notes in WordPress, no matter where I am (office, parents' house, university, etc.), I can find my past notes with a single keyword shot.
(For more information on my writing style, please click here.)
翻訳エンジンがあるからできることです。
This is possible because of the translation engine.
-----
私、一度、英文チェックの外注を通してから論文を学会に投げたら、学会のレビューアーから、
Once I pitched a paper to a conference after going through an outsourced English language check, from a reviewer at the conference, I was given the following message.
『英文がなっていない』
"Your English sentence is not good enough"
というレビューが返ってきたことがあります。
その件を、外注先にクレームとして報告したら、慌てて担当者を交代させてきました。
When I reported the matter to the subcontractor as a complaint, they rushed to replace the person in charge.
This subcontractor, who always comes back with the lowest rating on the quality of my English (even though they don't have to do that (maybe my company is asking them to do it)). Anyway I had felt happy for long time.
しかし、その後、私は、外注チェックの依頼をしなくなりました。
After that, however, I stopped asking for outsourced checks.
So, here we assume an alternate world where 'the universal language is Japanese, and in the world of academia, Japanese is the common language of research fields' -- although there does not seem to be an element of fantasy.
As a worker, when I see elderly craftsmen working hard at road and building construction sites, I want to rub shoulders with them, sing with them, and have a drink with them -- really. (I am currently in my fourth year of sobriety).
-----
私の今の仕事を端的にいうと、「(有)江端ソフトウェア開発」という会社の個人事業者です。
To put my current job in a nutshell, I am the sole proprietor of a company called "Ebata Software Development, Inc."
(*)新会社法施行後「有限会社」は消滅していますが、ここでは、『有限責任』の概念として使用します。
However, at this company, (1) I make the order specifications myself, (2) I decide the delivery date myself, and (3) maintenance after completion depends on my own mood. From the perspective of other software outsourcing companies, this is the kind of work that would make them "furious.
まあ、だから「(有)江端ソフトウェア開発」であって、「(株)江端ソフトウェア開発」ではないのです。
Therefore, the company is not ordinary one.
-----
この状況は、深刻な人手不足がもたらしているのかもしれません。
This situation may be brought about by a severe shortage of labor.
This is because a large number of engineers are sent in at the new hire stage, who can talk about "upstream processes" and "concepts," but have no experience in creating things.
However, when we open the lid, we find that not only construction sites and system development, but also the whole of Japan is relying on "seniors" (a disastrous situation).
-----
まあ、これ「彼ら」が悪いというよりも、「雇用主(会社)」が悪い。
Well, this is not so much "their (the newcomer's)" fault, but rather "the employer's (the company's)" fault.
It doesn't matter if it's a hobby, study, or part-time job, I still don't know how a guy who has never put together a system on his own can build things.However the application guidelines certainly say that.
『プログラミング経験は、採用の要件ではない』、と。
Programming experience is not a requirement for employment."
Well, it is true that it is no good if one can only program, but I highly doubt that a person without even programming experience can talk about systems.
I detest excessive fieldwork, but it is very difficult for me to accept a person who has never built a system (or even a web page) from scratch by themselves as a member of the manufacturing community.
-----
では、江端は入社時にプログラミングができていたのか?
So, was Ebata able to program when he joined the company?
The company was asked to create a 20-page presentation in an hour, write a research report in a day, crush a software subcontractor's program malfunction, present at a conference, calculate budgets, place various orders, take university classes, give lectures, and so on. --
それでも、
Howeve, it is
―― 『動かせ』と言われたら、"No"と言わない(言えない)会社
"The company that does't or cannot say "No", whenever asked to move something"
Now, this coding "getting stuck" issue is one that I get really pissed off to deal with. In the worst case, it can take up two or three full days of my time, with zero results.
このコーディングの沼から抜け出すためには、「打ち切る」という勇気が必要です。
To get out of this coding quagmire, we need to have the courage to "abort" it.
What is that relationship of trust? When that person asks me a question, I have to 'disclose all the knowledge I have in the fastest and unconditional way possible".
これを、日常的に行っていなければなりません。
This must be done on a daily basis.
これを「人脈」といいます。
This is called "human networking".
名刺を交換することは、「人脈」とは言いません。
Exchanging business cards is not "networking".
人脈には、ちゃんと情報交換と信頼関係という「血液」を流し続けなければならないのです。
We must keep the "blood" of proper exchange of information and trust flowing through our connections.
syntax = "proto3";
option go_package="./;main"; // 理由は分からないけど、この1行で、以下のエラーが消えた
//$ protoc --go_out=. *.proto
//protoc-gen-go: unable to determine Go import path for "person.proto"
//Please specify either:
// • a "go_package" option in the .proto source file, or
// • a "M" argument on the command line.
//See https://developers.google.com/protocol-buffers/docs/reference/go-generated#p
//ackage for more information.
//--go_out: protoc-gen-go: Plugin failed with status code 1.
package main;
message Person{
string name = 1;
int32 age = 2;
}
この結果、以下のようなperson.pb.goが生成されました。
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.26.0
// protoc v4.22.2
// source: person.proto
package main
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type Person struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
Age int32 `protobuf:"varint,2,opt,name=age,proto3" json:"age,omitempty"`
}
func (x *Person) Reset() {
*x = Person{}
if protoimpl.UnsafeEnabled {
mi := &file_person_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Person) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Person) ProtoMessage() {}
func (x *Person) ProtoReflect() protoreflect.Message {
mi := &file_person_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Person.ProtoReflect.Descriptor instead.
func (*Person) Descriptor() ([]byte, []int) {
return file_person_proto_rawDescGZIP(), []int{0}
}
func (x *Person) GetName() string {
if x != nil {
return x.Name
}
return ""
}
func (x *Person) GetAge() int32 {
if x != nil {
return x.Age
}
return 0
}
var File_person_proto protoreflect.FileDescriptor
var file_person_proto_rawDesc = []byte{
0x0a, 0x0c, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04,
0x6d, 0x61, 0x69, 0x6e, 0x22, 0x2e, 0x0a, 0x06, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x12,
0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
0x03, 0x61, 0x67, 0x65, 0x42, 0x09, 0x5a, 0x07, 0x2e, 0x2f, 0x3b, 0x6d, 0x61, 0x69, 0x6e, 0x62,
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
file_person_proto_rawDescOnce sync.Once
file_person_proto_rawDescData = file_person_proto_rawDesc
)
func file_person_proto_rawDescGZIP() []byte {
file_person_proto_rawDescOnce.Do(func() {
file_person_proto_rawDescData = protoimpl.X.CompressGZIP(file_person_proto_rawDescData)
})
return file_person_proto_rawDescData
}
var file_person_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_person_proto_goTypes = []interface{}{
(*Person)(nil), // 0: main.Person
}
var file_person_proto_depIdxs = []int32{
0, // [0:0] is the sub-list for method output_type
0, // [0:0] is the sub-list for method input_type
0, // [0:0] is the sub-list for extension type_name
0, // [0:0] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name
}
func init() { file_person_proto_init() }
func file_person_proto_init() {
if File_person_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_person_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Person); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_person_proto_rawDesc,
NumEnums: 0,
NumMessages: 1,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_person_proto_goTypes,
DependencyIndexes: file_person_proto_depIdxs,
MessageInfos: file_person_proto_msgTypes,
}.Build()
File_person_proto = out.File
file_person_proto_rawDesc = nil
file_person_proto_goTypes = nil
file_person_proto_depIdxs = nil
}
main.go:7:2: no required module provides package google.golang.org/protobuf/prot
o: go.mod file not found in current directory or any parent directory; see 'go h
elp modules'
person.pb.go:10:2: no required module provides package google.golang.org/protobu
f/reflect/protoreflect: go.mod file not found in current directory or any parent
directory; see 'go help modules'
person.pb.go:11:2: no required module provides package google.golang.org/protobu
f/runtime/protoimpl: go.mod file not found in current directory or any parent di
rectory; see 'go help modules'
というエラーがでてくるので、
$go mod init m
$ go get google.golang.org/protobuf/reflect/protoreflect
$ go get google.golang.org/protobuf/proto
$ go get google.golang.org/protobuf/runtime/protoimpl
$go mod init m
$ go get google.golang.org/protobuf/reflect/protoreflect
$ go get google.golang.org/protobuf/proto
$ go get google.golang.org/protobuf/runtime/protoimpl
で、
こちらの環境でも、上記と同じ手続で、gtfs-realtime.pb.goを作り、
$ go run main.go gtfs-realtime.pb.go
を実施してみましたところ、
main.go:11:2: no required module provides package github.com/MobilityData/gtfs-realtime-bindings/golang/gtfs; to
add it:
go get github.com/MobilityData/gtfs-realtime-bindings/golang/gtfs
main.go:12:2: missing go.sum entry for module providing package github.com/golang/protobuf/proto; to add:
go mod download github.com/golang/protobuf
Just after everyone looked like, "What is he talking about?, they asked me "What is this 'talk'?" immidately. However, Smiling at them and I left soon.
今後は、節目の行事すら、呼ばれなくなるかもしれません。
In the future, I might not be called even milestone events.