むむむと思ったAPI制作

ここ二週間くらいなんやかんやでブログ書いてなかったんですが、久しぶりに書きます。最近はお仕事で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を考えてみる。