三十路プログラマーぶろぐ

プログラマー、英語初級、三十路

shはコマンドがなくてもPermission deniedというエラーを吐く

shは、そもそもコマンドがない場合にも、エラーメッセージとしてPermission deniedを出力する。これにハマった。bashの場合はコマンドがなければcommand not foundというメッセージを出力する。

普段はshを使っている人は少ない気がするのでハマらないかもしれないが、OSSなど他者が作ったソフトウェア内でshが使われている場合がある。"sh: 1: hoge: Permission denied"みたいなメッセージが出たら、権限ももちろんだが、hogeに相当するコマンドがそもそもあるか確認したほうがよい。

自分の場合はNuxtというフレームワークを触るのにnpmというコマンドを使っている時にハマった。普段JavaScriptとは無縁なため、npmでプロジェクトのディレクトリを作ったあと、npm installをするという基本的なことを忘れていた、というか知らんかった。

チュートリアルにしたがってnpm run devを実行しても、Permission deniedが出るので、見当がつかずstraceまで動員して、ようやくコマンド自体が無いことに気がついた。

AtCoderやLeetCodeのおかげで実装が早くなった

 しばしば競プロは実務に役立たないと言われるが、個人的には全くそんなことはなく、実装が安定して早くなっている。

普段の仕事だと、グルーコードなどと言われるらしいが、すでにあるライブラリやAPIの組み合わせで対処することが多い。このような処理ばかり書いていると、境界値やエッジケースの細かいところまで考察が必要な処理に出くわした際に、明らかにコーディング速度が遅くなり、また脳のスタミナを急速に消耗する。

これ対して、競プロ等のデータ構造やアルゴリズムに関するプログラムを日頃から書いていると、前述のような面倒な処理に直面してもコーディングの効率が落ちない。つまり、競プロ的なプログラミングは、プログラミングの基礎トレみたいな効果がある。

特にこの効果は、仕事のコードよりも、OSSのコードを書いているときに顕著だ。最近はMQTTというネットワークプロトコルOSSにパッチをよく送っているのだが、このような処理の中では境界値の扱いや、マルチスレッド間の取り合いなどに気をつける必要がある。そのあたりにあまり疲れず気が回る気がしている。

というわけで、引き続き1日1問LeetCodeを続けていく。

【Golang】他のスレッドが読み取りしている最中にRWMutex.Lock()をかけても待機しない

表題のとおりだが、goroutineでマルチスレッド処理する場合、スレッドセーフではない値に読み書きする場合はRWMutex等を使って排他制御 (ロック) する必要がある。この際、Aスレッドが読み取り専用でBスレッドが書き込み専用だとすると、Aスレッドではロックが必要なのか確認したかった。結論から言うと必要。

これはつまり、他のスレッドが排他制御をかけずに読取している最中に、他のスレッドが読書排他制御を掛けた場合、読み取りの終わりを待ってから排他制御をかけるのか、あるいは即座に排他制御をかけて書き込み始めるのかに帰結する。これは後者、つまり読み取りの終わりを待たないことがわかった

パニックする

package main

import (
  "time"
  "sync"
  "fmt"
)

type st struct {
  sync.RWMutex
  m map[string]string
}

func main() {
  s := st{m:map[string]string{}}
  go func() {
    for {
      time.Sleep(1)
      s.Lock()
      s.m["a"] = "string"
      s.Unlock()
    }
  }()
  for {
    time.Sleep(1)
    fmt.Println(s.m["a"])
  }
}

パニックしない

package main

import (
  "time"
  "sync"
  "fmt"
)

type st struct {
  sync.RWMutex
  m map[string]string
}

func main() {
  s := st{m:map[string]string{}}
  go func() {
    for {
      time.Sleep(1)
      s.Lock()
      s.m["a"] = "string"
      s.Unlock()
    }
  }()
  for {
    time.Sleep(1)
    s.RLock()
    fmt.Println(s.m["a"])
    s.RUnlock()
  }
}

AtCoderのコンテスト3回目ではじめてD問題が解けた

 最近、AtCoderのビギナーコンテストに参加しており、毎回ABCの3完で終わっているのだが、昨日のABC306ではDまで解いて4完だった。atcoder-replayというサイトで見る限り、緑パフォだったらしい。これはなかなか嬉しい出来だ。今回はDDOSがあったせいでランキングに反映されないのだが…。

とはいえ、過去問を解く限り、問題慣れすれば緑までは問題なく行けるなという気がしている。ABCを間違えることはほぼ無いし、Dも過去問では時間を要しつつも割と解けている。

しかし、DDOSでランキング反映されない状況がしんどいのと、おおよそ自分のポテンシャルみたいなものがわかったので、AtCoderは今後それほど参加しないつもりだ。もともと海外企業のコーディング試験に備えて始めたことだからだ。それに、土曜の21時というのはしんどい。ちょうどくつろいでいる時間帯だ。昼間なら良いのだが。まあ結局、毎回我慢できず、酒飲んでから参加しているのだが…。

今後はLeetCodeという、海外企業コーディング試験対策サイトの問題を解いていく。

いやはや、目標は近いようで遠い

 俺は某欧州国でのプログラマー移住を希望している。昨日、Glassdoorという、海外の企業口コミサイトを見ていた。俺の海外での第1希望に考えている会社も口コミがあったのだが、書いてあったのは、とにかく他と比較しても採用プロセスが長く難しいということだった。もちろんプロセスは全て英語だ。スキルセット的に合わない訳では無いが、これはなかなか大変かもしれないと思う。

俺はGoやPythonがまぁまぁ書けて、第1希望の会社はその要件に当てはまっている。しかし、同じ国の他の求人を見ると、なかなかちょうどよいポジションがない。Javaか、JavaScriptまたはTypeScriptの求人が圧倒的に多い。どちらも全く得意ではない。

はてさて、どういった戦略で海外に行くのか悩ましいところである。十中八九、第1希望は落ちるだろう。そういうものだ。その場合、どうやってあっちで職を得るか。企業や職種を選ばなければ、とりあえずエンジニアとして何処かには入れそうな気はする(いま時点の英語力では無理だが将来的に)。そのあと現地でJavaなり勉強して希望する企業や職種に再転職するか。

諸々の都合を踏まえると、何とか来年には渡航したい。今は英語を重点的に勉強しているので、Javaなどの勉強に時間を費やすのは結構きつい。両方とも来年までで形にするというのは結構シビアな気がする。そう思うと、随分目標が遠のいた気がして、しんどい気持ちになった。

ただまあ思い直したのだ。そう、ぶっちゃけ今回の計画が全くうまく行かない可能性すら十分にある。来年はおろか再来年も無理かもしれない。人間には色々期限があるし。子供とかできて永遠に頓挫する可能性もある。

何はともあれ、今をクソ真面目に頑張り、楽しむしかない。それしか無いなと思った。引き続きちゃんと勉強するし、ちゃんと仕事もするし、ちゃんと家族と過ごす。目標は遠くにおいて、目の前に集中する。結果は後からついてくるというやつだ。

あとは運を天に任せるのみ。

キャリアを妄想する

 ここ最近になって、本当に海外でプログラマーとして働くイメージができてきている。スキル面もそうだし、英語もまだまだとはいえ上達し始めており、面接で喋るネタも溜まってきているからだ。来年には達成したいと思う。

正直、俺は真面目にキャリアとかを考えていない。俺が海外でプログラマーをやるというのは、それ自体が目的であって、その先に何かあるわけではない。海外で生活して、その文化や自然を楽しむ。ただそれが目的だ。

もちろん、仕事は選ぶ。オープンソース関連か、ネットワーク関連をやりたいので、そこに的を絞る。本当は組み込みも興味があるのだが、海外初挑戦かつ新しい分野というのはちょっと無理し過ぎな気がしているので、今回は除外。

俺は難しいことは分からないが、あと十年もすれば、プログラミングにはAIが相当に介入してくると思っている。生産性は上がるだろうが、仕事のプログラミングは大して面白いものじゃなくなっている気がする。そうしたら俺はもうプログラマーとしては引退でいい。一方で、プログラミング自体は面白くなくなっているだろうが、色々な技術が発展して、今以上に使いやすくなっていることだろう。

第1次産業向けのITというのは、今のところ実験的な部分が多く、現実と剥離している部分がある気がする。しかし、少し待てば、もっと現実的に使えるものになっているんじゃないだろうか。そうしたら、また大学で専攻した農学方面に戻ることもありうる。できればその中でも森林環境方面に行きたいが、環境というのは金にならんのでいい具合の仕事がないものだ。

はてさて、どうなることやら。

Atcoderに参加し始めて

 表題の通り、AtCoderに参加し始めた。今のところ灰色だ。コンテストに2回参加してみた結果は、650, 450 パフォだった。要はABCのABCはほぼ毎回解けるという感じ。過去問をやった感じでも同じような具合だった。とりあえずD問題をそこそこ解けるようにするのが直近の目標だ。

昨日のABC305もDを解くためのアルゴリズム自体は早い段階で分かったのだが、コーナーの処理が煩雑になってしまって通すことができなかった。いったん休憩して解き直したところ、問題なくAC。大体、条件分岐が増えすぎたら何かコーナーでミスってるということが最近わかってきた。

対策としてはD問題を解きまくって、慣れるしかないかなと言う感じ。普段のプログラミングはライブラリを繋ぎ合わせるような実装が多いので、コーナーをそれほど意識させられるようなことがあまりなく、単純に慣れが足りないかなと思う。

ググった感じ、なかなかすぐに色変できるものでもないらしく、とにかくコンテストに出なければ駄目らしい。毎週コンテストに参加したいところだが、土曜の夜は意識しないとなかなか空かないもので、来週はさっそく参加不可。

まあ、点数とか色とか意識しすぎるとストレス溜まりそうだし、あんまり急がずやったほうがいいな。