ここ二週間くらいなんやかんやでブログ書いてなかったんですが、久しぶりに書きます。最近はお仕事でAPIを作っていて、その作業中に不思議なバグに出会ったので記録します。
問題
APIを作成中、GETリクエストの処理を書いていた。ざっくり作業内容を説明すると、GETリクエストのパラメータを引数にして filter()
でリクエストされたデータをDBから取り出して返す。というよくあるパターンのやつでした。「これならイメージがつくし、すぐに実装できるかも!」と浮かれ気味にコードを書きました。
たとえば Entry
というモデルがあり、Entry.author
がkaiのデータだけを取ってきたい。として、kaiが代入されているauthor
を使って次のような処理を書きました entries = Entry.objects.filter(author=author)
なんの変哲もない普通のDjangoのコードですが、なんとentries
が空っぽのままレスポンスを返ってきました。むむむ。ちゃんとEntry.author
がkaiのデータはDBにあるし、author
の中身もkaiになってるぞ。。。このコード。。なにかがおかしい。。。。
原因
調子に乗ってコードを書いていたらまさかのハマりでビビり、原因の究明が急がれました。愚直にprint
してみるとしっかりkaiが入っていました。むむむのむ。型がどっかでやられちまったかと思って、type()
で型を調べる。結果はstr
。むむむのむ。良さそう。プログラミングをする以上、何も信用ならないので、疑り深くauthor=='kai'
をしてみる。するとFalse
が返ってきた。そんなバカなと思って三回やった。三回Falseがでた。むむむのむ。なんとなく気まぐれでprint(f'12345{author}12345')
とやってみた。すると1234kai12345
と出力された。なぜ5が消えたし!
どうやらauthor
の中身はkaiだが、'kai'
とは違うものらしい。ここらへんで先輩に相談しました。「どこまでauthor
のデータがちゃんと保持されてるか確かめてみよう」と言われた。なるほど確かに。ここまでの過程でdata.get('author')
でkaiを取得してただ引数にして持ってきただけだったので、何もいじってない。が、もしかしたらどこかで予期せぬ処理が挟まれていたのか!?と思い、author
を取得しているviewsのメソッドでまずauthor
を出力してみた。すると表示はkai, 型はstr
, author=='kai'
はFalseと同じ結果が。なるほど、データをうまく保持できていないというより、最初からどうやらデータがおかしそうだぞとなりました。
その後、パラメータが入っているdata
を出力してみると{author: 'x\08kai'}
という不穏な値が。。。x\08
はバックスペースだそうです。バックスペースが紛れ込んでいたから、print
だけしても一見普通に表示はされるが、kai==author
はFalseになるのか。と納得。では、このバックスペースはどこから来たのか。どうやらElectronの仕業らしい。僕のAPI開発環境はVScodeにPostmanとElectronまみれだったので、どっちかの中で紛れ込んだんでしょう。厄介な話です。
どうしよう
VScodeは以下のリンクが参考になりました。
Visual Studio Code の日本語問題まとめ - Qiita
今回はPostmanが原因の可能性もありますが、はっきりどっちのツールが原因なのかはわかりません。僕の予想だとPostmanかなぁと思います。結構致命的なバグなのでなんとかならないかなぁ。とりあえず、現状何かおかしかったらURLをチェックしてます。
おわりに
ツールといえど、人が作るものなのでバグが紛れ込むのは仕方ないですよね。だからといってバグのあるツールを甘んじて使う必要はないですが笑
問題はバグに直面した時に、どう対処するかだなぁと実感しました。ちゃんと原因をパパっと突き止められる大人になります。今回はドハマリしなかったので何よりでした。脱Electronを考えてみる。