ここ数年で失敗した買い物・よかった買い物

最近、あまり買い物上手ではないことに気がついた。 何かを買う際にネットでよく調べてから買うのだけれど、それでもいまいちな結果になることが多い。

どうも、スペックと価格ばかりを気にしてしまうのが良くないらしい。 スペック上の数値が良くてもトータルの仕上がりは別物だったりするし、安い品にはやはり安い理由があるようだ。

ここ数年で失敗してしまった(自分には合わなかった)買い物と、そんな中でも買ってよかったものを紹介。

失敗した・自分には合わなかった 😢

失敗だった買い物。 商品が悪かったものもあるが、良く考えず買った結果自分には合わなかっただけのものもある。

有機ELのテレビ

2018年くらいに購入した某海外メーカーの有機ELテレビ。

とくべつ有機ELのテレビが欲しかったわけではないのだけれど、家電量販店のテレビコーナーで見比べたらやっぱり有機ELのものが綺麗に見えた。黒が、黒い。 有機ELは原理上ヤケ付きが起こるのは理解していたけど、製品として売ってるくらいだし短くても5年くらいは大丈夫だろーと思い購入。国内大手メーカーの液晶テレビと値段があまり変わらなかったのも後押しした。

使い出すと、二年もしないうちに焼け付きが目立つようになった。赤の画素子がすぐに劣化するようで、まずはブレワイの体力のハート、マイクラの体力のハートが常に見えるようになった。そのあとちょっとして左上にうっすら「スッキリ」の文字が見えるようになった。 それでも我慢して使っていたのだけれど、久しぶりに恋愛ドラマを見たら登場人物の唇がみな紫。笑えるシーンも泣けるシーンも酸欠状態で、さすがに我慢できず液晶テレビに買い替えた。

今はもっと焼け付きにくくなっていると家電量販店の店員さんは言っていたが、今後も有機ELテレビは敬遠してしまいそう。もっといろんな口コミを見ておけばよかった。

ノイズキャンセリングヘッドホン

これは商品はまるで悪くないし、悲しい事故という感じ。

家で仕事する時間が長くなったため、生活音をカットしようと思ってノイズキャンセリングヘッドホンを購入した。

製品自体はデザインも音質もよくて気に入っていた。 のだけれど、使用していると頭痛がしてくる気がする?ノイズキャンセリングを使うのが人生で初めてで知らなかったのだけれど、ノイズキャンセリングが合わない人というのがいるらしい。外音を打ち消す音波を出す仕組みなんだと思うけど、それがなんか影響しているんでしょうか。

自分は1時間以上使っていると少し車酔いっぽくなってしまって、その後の仕事に影響が出るので使うのを諦めた。マルチペアリングができて切り替えも簡単だし、改めて製品としてはよかったと思う。ノイキャンを完全にオフにできない点がネックといえばそうだけど、ノイキャン完全にオフにするならそもそも別の商品の方がよさそうだし。惜しみつつメルカリに出しました。

Rakuten Hand

手が小さいため、スマホも小さいものを好んで使っている。 とはいえ最近は大画面がトレンドなのか、小さい端末はどんどん少なくなっている。iPhone mini か iPhone SE なら許容サイズなのだけど、 Android の戻るボタンに慣れてしまっていて iOS には移行したくない。

楽天モバイルの店頭で手に取ってみて、うわーまさにこのサイズ感!と思って契約した。 サイズ・重量は申し分なし。どうしてももっさりとするけど、この端末でゲームとかするわけでもないし、出先でLINEとかネットとか地図みたりするには問題ない。 と思って使っていたのだけれど、通信性能が悪いのには耐えられなかった。当時の楽天モバイルの回線網がまだあんまりだったのか、この端末があんまりだったのかはわからないが、外食の際にPayPayに繋がらず支払いができなかったときには困った。その時は持っていたが、PayPay使えることがわかっている店に行くときには財布を持ち歩いていないときもある。危うく皿洗い、と思ったらちょっと使い続ける気にならず、もともと使っていた端末と回線に戻した。

楽天ポイントのキャッシュバックがあったから実質そんなに無駄遣いしたわけでもないけど、それでも回線を変更する手数料の往復分+αくらいは無駄にしてしまった。これも、使ってみるまではわからない部分があったので仕方がなかった部分はある。

Mini PC

これも商品はまるで悪くない。 Intel N100でメモリ16G、SSD 512G で2万5千円くらいで買った。 安いし十分な性能!と思って買ってしまったがその後特につかわず。。なんで買ったんだ、なんか欲しくなってしまったんや。。。

買ってよかった✨

失敗することも多いけど、よかったものもある

バーミキュラ ライスポット

それまで使っていた炊飯器が10年くらい経ってあまりご飯が美味しく炊けなくなった気がしたので購入した(単に米が古かったのかもしれない)

この製品は炊飯器というよりヒーター付き鋳物鍋なので、普通の炊飯器についている保温機能がない。 我が家はもともと炊飯器の保温機能は使っておらず、炊いたらその日に一食分ずつラップして冷凍するスタイルだったので保温できないことは問題でなかった。 いいところは低温調理ができること・無水カレーなどの料理が簡単にできること。冬は卓上に置いて鍋もできる。 特に牛もも肉を低温調理すると美味しいロースト(ローストしてないけど)ビーフを簡単に作ることができる。

防水 Android タブレット

8インチサイズで IPX68 の防水・防塵タブレット。 4年くらい前に中古ショップで2万円くらいで購入した。 IPX68なのでお風呂にも持ち込めるし、水跳ねが気になるキッチンでも使える。 300g強で比較的軽いのでKindleで漫画を読むのもよいし、YouTubeなど各種動画を見るのにもよい。

だいぶ前の機種で、そもそもスペックも低いのでさすがに動作はもっさりしてきている。Android 9で止まってしまっているし、ファーウェイ製という点も気になる人は気になるかもしれない

ただこのサイズ・重量でIPX68という製品がまぁ見つからない。dtab Compact の最新機種は防水性能がさがってしまってお風呂への持ち込みはできない。10インチでIPX68のものがいくつか見つかったが高価だったりする。IPX68でもお風呂(お湯・蒸気)環境では動作保証はないかもしれないことを考えると、安価に手に入る d-02k は唯一の選択肢かもしれない

HHKB Hybrid

静電容量無接点方式による極上のキータッチ。 もともと有線のものを10年近く使っていた。全然まだ使えたのだけれど、たしかコロナ禍に家のデスク環境を整えたときに購入した、はず。 有線のものは当時2万円ほどで購入して、10年使用したがメルカリで15000円ほどで売れた。高価なようでいて実はコスパもよいと言える。

いまお題が一生モノだけど、これも一生モノといえるだろうか。 人生であと一回か二回くらい買い替えるかもしれないけど、「HHKB」という製品は一生使う気がしている。

オープンイヤー型ワイヤレスイヤホン

これは最近買ったのでまだ十分に評価できていないかも。 上に書いたようにノイズキャンセリングが体に合わなかったため、手放したヘッドホンの代わりに購入。 まるでぜんぜん別ジャンルの商品じゃん?って思うけど仕方ない、ノイズキャンセリングがダメなので外音をカットすること自体を諦めた。外音ウェルカム。あとヘッドホンは夏は暑い。

自分は耳に突っ込むタイプのイヤホンは苦手なためオープンイヤー型が気になっていた。ただオープンイヤー型は耳に掛けるタイプなのでそれはそれで邪魔かなと思っていた迷っていた。 結果としては本体がとても軽くて全然気にならなかったし、メガネとも特に干渉するわけでもなく、耳の穴に突っ込まれず、ちゃんと音が聞こえる。 音質がいいかどうかはあんまりわからない人間なのでそこはコメントできないが、耳の穴に突っ込まれるのが苦手な人にはおすすめ。

まとめ

なんか欲しい、くらいのものは買わないようにする。スペックより口コミをよく読む。くらいの対策で買い物成功率が上がるとは思う。あとは家電をレンタルできるサービスを使って一週間くらい使ってみると「あんまり使わなかったな」という失敗は防げるかも。実際にRentioのキャンペーン中にポータブルプロジェクターをレンタルしてみて、使わないな・・・となったことがある。(ただ、キャンペーン中でもないとレンタル料はちょっと高いなと思ってしまう)そんなに必要じゃないものほどなんか欲しくなってしまう病なので多少は諦めるしかないかも。

はてなブックマークコメント閲覧専用の新しいFirefoxブラウザ拡張機能を公開しました

タイトルはオマージュです。 はてなブックマークのコメント(簡易)閲覧専用のFirefoxブラウザ拡張を公開しました。

gyazo.com

先日 公式な新しいはてなブックマーク拡張 が公開されました。その告知を読んでいて知ったのですが、Firefoxではブクマ拡張が新規インストールできなくなっているようです。 さっとブコメ見たいときってやっぱりあると思うので作ってみました。簡易版なので公式から閲覧用の拡張が公開されるまでのつなぎとしてご利用ください。

addons.mozilla.org

機能

情報の取得には はてなブックマークエントリー情報取得API を利用しています。

  • ブックマークの表示順は新着順のみ
  • ログイン機能なし
    • なのでマイブックマークからの検索などはないです
  • スターなし

のシンプルなものです。 あとタグの表示の実装を忘れていて今は表示できていないです。使う人がいれば追加するかも。スターは表示したかったのですが、HatenaStar.js を動的に読み込んだ内容に対して発火させるのが難しそうだったのとかなり動作が重たそうだったので、やるならAPIを使って実装する必要がありそうです。あ、あとアイコンとか作れないので設定していないです。

ちなみに全く同じコードが Google Chrome でも動作しますが Google Chrome 版の旧拡張はいまも利用可能なので特にストア登録はしていません。コードは Githubで公開している ので奇特な方はどうぞ。

リモートワークおひるごはん

コロナの影響で基本自宅勤務となり、お昼も家でつくって食べるようになった。買ってきてたべることもあるけど。 お昼休みという限られた時間の中で「作って」「食べて」「片付ける」までをやり、できるだけ満足感をたかめたい。欲をいえば20分くらいは休憩もしたい。

よかったメニュー、いまいちだったメニューの紹介

ステーキ

f:id:hatz48:20200401114325j:plain
ステーキ

スーパーで買ってきた100g 158円くらいのアメリカ牛。お昼休みになる1時間くらいまえに冷蔵庫から出しておくと吉。 昼休みに入ったらドリップを拭いて塩胡椒をし、フライパンで焼く。ステーキソースはモランボンの粗挽き黒胡椒が大変おすすめ

ステーキソース あらびき黒胡椒味 225g|商品情報|モランボン

会社の近くにいきなりステーキがあったが、300gで1500円くらい、こちらは300gで500円くらいである。味は大体同じなのでは・・・

モランボンのソースが優秀なのでとても美味しいし、時間もかからないので食後にゆっくりすることもできる。ニンニクの匂いがついてしまっても、zoomは匂いを伝えないので問題ない。ただし午後、部屋に牛肉の匂いが残る。

いわしの香草パン粉焼き

f:id:hatz48:20200406115524j:plain
いわしの香草パン粉焼き

小洒落たメニューがでてきた。この機会に初めてつくったけど、小洒落た外観のわりにとても簡単。パン粉にオリーブオイルやら塩やらバジルやらを混ぜて、かけてオーブントースターで焼く。いわしは捌いてあるやつを買ってこよう。 焼いている間に一息つくのもよいだろう。洗い物も面倒なものは特にない。

おすすめではあるけど、パン粉焼きをそんなに頻繁に食べたくならないかも。

ブリカマの塩焼き

f:id:hatz48:20200515160949p:plain
ブリカマ

ブリ美味しいよね・・・。これはカマの部分が150円で売っていたので焼いてみました。 塩をふってグリルにインするだけ。冷凍ご飯をチンしてインスタンスの汁物を用意すればブリカマの塩焼き定食。 楽にできて美味しい、まではいいんだけどグリルの片付けがとても面倒。面倒・・・。

グリルを使う時点でリモートワークおひるごはんには向いていなかった。カマではなくて切り身をかってきて、フライパンで焼けばたぶん満足度たかい。

パスタ

f:id:hatz48:20200515161656j:plain
カルボナーラ

この日は家族もいたので量が多いです。パスタは特にいうことなし、お昼にさっとつくって食べるのにむいています。

五目あんかけ焼きそば

f:id:hatz48:20200508121738j:plain

レシピは味の素のやつ

具だくさん!とろーりあんかけ焼きそばのレシピ・作り方 | 【味の素パーク】の料理・レシピサイト‐レシピ大百科 : 中華蒸しめんや白菜を使った料理

王将的な中華が食べなくなったのでチャレンジ。 麺をパリパリにするのに思ったより時間がかかったので、昼休みにはいったらまず麺を焼き始めるとよいでしょう。その横で野菜を切ってあんかけを作る。 これが素人料理のわりに美味しくできて、夜ご飯に作ってもいいなと思った。

ステーキ焼くだけ、とか適当なパスタを作るよりは時間がかかる。野菜の種類を減らすとちょっと楽になるかも知れない。あんを作るのと麺をやくのを同時にやるので洗うフライパンが複数になる。 野菜を切ったやつを事前に準備しておくといいのかもしれない。

まとめ

出社して外でお昼を食べるとするとだいたい500~1000円くらいはかかってしまう。リモートワークおひるごはんだとステーキでも700円しない(ライスとか含めても)し、魚の塩焼き定食なんか外で食べる金額の半額以下でたべられる。 自分は作るのは楽しめるので作るのに多少手間がかかってもいいけど、片付けにあんまり時間がかかるものは向かない。片付けするより休憩したくなってしまうので、うっかり片付け忘れると退勤後に汚れたキッチンを目にすることになる。とにかく魚焼きグリルは使うべからず。

GitHub の Issue リンクをリッチにする Chrome 拡張

どうもこんにちは、今日は便利な Chrome 拡張のご紹介です。

f:id:hatz48:20170323122302p:plain

これは GitHub 上の issue link (#666 とかっていうやつ)を情報量の多い、見やすいバッジに変換してくれる拡張です。 親イシューにいくつかイシューをまとめて管理したいときに、イシューの状態(open/close や assignee )が一目でわかってとても便利。

Chrome 拡張の permission の関係で GitHub 用と GitHub Enterprise 用の二つをご用意しております

使い方は簡単、上のリンクから使いたいほうの拡張をインストールして、設定を入力するのみ。

  • GitHub の public repository で利用する場合は、設定は不要です
  • GitHub の private repository で利用する場合は、GitHub 用の拡張をインストールしたのち、拡張機能のオプションで personal access token を入力して下さい
  • GItHub Enterprise で利用する場合は、GitHub Enterprise 用の拡張をインストールしたのち、拡張機能のオプションで origin と personal access token を入力して下さい

※ personal access token のスコープは repo のみで大丈夫です

これだけ。是非ご利用ください。

このバッジのデザインに見覚えのあるあなた、きっと id:motemen さんのファンですね。 原作はこちらになります。

motemen.hatenablog.com

TypeScript だけで Web アプリケーションを作る

はてなでアプリケーションエンジニアをしている id:hatz48 です。この記事は はてなデベロッパーアドベントカレンダー の 13 日目です。 昨日は id:dekokun による

dekotech.dekokun.info

でした。私は去年は

developer.hatenastaff.com こんな記事を書いていました。

今年は、はてなのサービス開発合宿で TypeScript のみを使ってアプリケーション開発をした話をします。

はてなのサービス開発合宿

はてなのサービス開発合宿については はてなスタッフアドベントカレンダー一日目で紹介されています。三日間、いつもとは違うチームで、通常業務から離れ、集中して開発するというものです。

開発自体は、実は三日間で完成はしなかったのでいまでも隙間の時間で開発を続けています。とある社内システムに、ちゃんとしたアクセス制御をいれて実装しなおそうとしています。再実装も一つの目標ですが、もう一つの目標は「TypeScript のみでアプリケーションを構築する」ことでした。

なぜ?

私は 2012 年にはてなに入社し、そこから三年間 Perl を使ってアプリケーション開発をしていました。そして今年の四月からは Scala をメインに、Perl も書いています。ちなみに Perl の前は Java を書いていました。

Scala を書いているうちに、やはり静的型による恩恵は大きいと再実感するようになりました。動的片付け言語にも良いところはたくさんあるのですが、例えば Perl で大きなコードのリファクタリングをするのは困難で、苦痛を伴います。 Scala の様に静的に型のついている言語であれば、たとえ影響範囲がアプリケーション全域にわたるようなリファクタリングでも IDE の支援を借りて比較的短時間で済ますことが出来ます。コンパイルが通り、テストが通ればだいたい OK です。

しかしすべての場面で厳格に静的型チェックを行う言語でコードを書くべきかというとそれは yes とは言いがたいです。 個人的には、まだ当たるかどうかわからない新規サービスをつくるのに Scala で書き始めるのはちょっとオーバーキルだなと感じます。

後述する async/await 機能が TypeScript で使えるようになったこともあり、現在 Perl を使っている場面において TypeScript を使うことはできないだろうかと考えるようになりました。

TypeScript

最初に言っておくと私は TypeScript が好きなのでこの記事では TypeScript に対して贔屓目に見ている部分があるかもしれません。また、サーバー上での実行環境は 現実的には node.js です。以下 「TypeScript は」という文脈で node.js の特徴をあげることがあるかもしれません。 TypeScript は型チェックをすることができ、さぼることもでき、ブラウザでも動く。Web アプリケーションを作るには実用的と感じています。

TypeScript ( node.js ) と Perl と比較してメリット/デメリットを想像してみます。

  • 言語
    • 型をつけることができる
    • 開発が活発である
  • 開発支援
    • Visual Studio Code などの IDE があり、型情報に基づいた支援が受けられる
    • IDE に組み込みのものや node-inspector などの debugger が利用できる
  • 処理系
  • その他
    • クライアントとコードを共有することができる
  • 学習

対して考えられるデメリットをあげます

  • 言語
    • 開発が速いため自分たちのコードが陳腐化するのがはやい
  • 開発・保守
  • 開発・運用
    • 例外時にまともな stack trace をとることができない
  • 運用
    • 例外をハンドルしそこなうとプロセスが終了してしまう

まだ運用知見のない状態ですので「いやいや○○が大変なんだよ」という意見があったら是非教えてください。

async/await によるコールバック地獄の解消

さて上に上げたデメリットですが、開発からみた一番大きな問題はノンブロッキング IO に起因するコードの複雑化ではないでしょうか。 いわゆるコールバック地獄が解決できないのであれば、上にあげた様々なメリットが得られるとしても採用するには抵抗があります。 node.js の採用事例を見ても WebSocket でクライアントとやりとりする部分や、シンプルだけど高速に動作する API サーバーのみといった用途が多いのではないでしょうか。

コールバック地獄を解消出来る仕組みとして、 Promise があります。シンプルなインターフェースでノンブロッキング IO を直列・並行に繋ぐことができます。これはとてもうまく動作するのですが、new Promise(function(resolve, reject) { ... } ) then(function(value) { ... }) といった boilerplate なコードがアプリケーション内に多く出てきてしまいます。またブロッキング IO なコードとは書き方も変わりますので学習コストも必要になります。

ありがたいことに、これについては async/await の機能によって解消することが出来ます。 async/await は TypeScript というより ECMAScript仕様策定中 の機能ですが、TypeScript や Babel などでは既に利用することができます。

今回 TypeScript を使おうと思ったきっかけでもありますので、コード例を紹介しようとおもいます。雰囲気をつかんでいただけたら幸いです。

Express っぽいもののコントローラーのコードだとおもってください。指定された id の情報を更新するために

  • 指定された id が存在するかを確かめる
  • 指定された id の情報を更新する
  • 更新後の情報を取得し直して返却する

これをコールバックスタイルで書くと

app.put('/something/:id', async (req, res) => {
    var id = req.params.id;
    var someData = req.body.someData;
    findSomething(id, (someThing) => {
        if (!someThing) { res.sendStatus(404); return; }
        updateSomething(id, someData, () => {
            findSomething(id, (updated) => {
                res.json({ somthing: updated });
            });
        });
    })
});

このように、IO の回数だけネストが深くなっていきます。someThing を更新するための権限管理のために DB アクセスが必要になったりするとさらに複雑になります。PerlRubyPython などで書くコードとだいぶ違いますね。

今度は async/await を使ってみましょう

app.put('/something/:id', async (req, res) => {
    var id = req.params.id;
    var someData = req.body.someData;
    var someThing = await findSomething(id);
    if (!someThing) { res.sendStatus(404); return; }

    await updateSomething(id, someData);

    var updated = await findSomething(id);

    res.json({ somthing: updated });
});

まるでブロッキング IO をしているかのよう!違うのは async function await というキーワードがあることくらいです。

今度は実際に Perl のコードを移植した例です。GitHub - hatena/Plack-Middleware-HatenaOAuth: Plack: :HatenaOAuth - provide a login endpoint for Hatena OAuth これははてなで公開している Perl モジュールです。Hatena OAuth で認証を行うエンドポイントをマウントしてくれるというものです。これを TypeScript で Express 用に書き直したのが GitHub - hatz48/express-oauth-hatena: express middleware for oauth with Hatena です。実際に見比べてみてほしいのは

ここです。 言語とインターフェースの違いはあるもののほぼ同様のコードなのがわかると思います。async/await はまだ正式な仕様が決定していませんが、今後の JavaScript での開発を大きく変える機能だと思います。

これで上のデメリットのうち、大きな一つが解消できそうです。(どうでしょう、 node.js で開発をするのがかなり現実的に思えてきませんか?)

やってみて

ここまでの内容を想定して実際に開発合宿に挑みました。 ここからは実際に TypeScript のみでサーバーアプリケーションを書いてみて、よかった点/キビシイ点/コネタ などを紹介していきます

(Good) 型が付けられる

やはり何と言ってもこれに尽きます。 これは私の場合ですが、動的言語を書くときは脳内で型を合わせながら書いています。自分にミスって型が合っていなければエラーになるわけですし、そのエラーがどこに起因するのかはコードを辿ってみなければわかりません。 静的な型が付いている場合「こういうロジック」というのをざっと書いていってあとはコンパイルエラーをとればだいたい動くので、動的片付け言語よりも結果的に速くコードを書くことが出来たと思います。

型をつけなくてもいい

これは Good とも Bad とも言えるのですが。 合宿は三日間で、実際に作業ができるのは二日間くらいのスケジュールでした。コンパイルを通すためにあまり時間をとられると、それだけで合宿が終わってしまいます。なので合宿期間中は「こまったら any」というスタンスでやっていました。上で「結果的に速く」できたのは any を許容したからだとも言えます。

ただ、とにかく動けばいい、そういう感じで動的言語で開発したアプリケーションはのちのち保守が難しくなっていきます。しかし TypeScript は後から型がつけられるのでその点は安心です。any と書いたところに合宿後にちょっとずつ型をつけていって「ここ無茶苦茶なんで直します」というようなフローが出来ます

(Tips) server/client でのコードの共有

モデル(というと人によって捉えるものが違も気しますが、いわゆるMVCアークテクチャにおけるModelのことです)クラスのコードを server/client で共有しています。モデルのフィールドの値から状態を計算する、と言ったメソッドが server/client で再実装する必要がなく、故に実装の乖離もないため便利です。しかし実装の共有以上に便利なのが、型を共有できることです。サーバー側で返した JSON をクライアントのコードで受け取るときは

// model
interface IUser { ... }
class User implements IUser { ... }

// server
app.get('...', async function(req, res) {
    ...
    const user: User = ...
    ...
    res.json({ user: user })
})

// client
axios.get('...').then(function(res) {
    const user: IUser = res.data.user
})

このようにすることでクライアント側でも実態と乖離なく型をつけることが出来ます。これは本当に便利です。

(Bad) await を書き忘れる

今回一緒に開発してくれたメンバーは JavaScript や TypeScript を書いてはいても、TypeScript でついこの間まで experimental であった async/await を使ったコードを書いたことがある人はいませんでした。そのため await を書き忘れて予期せぬ動作になったりということが何度かありました。ただ、型を確認すればすぐにわかるのであまり深くはまることはなかったと思います。あとそのうち慣れます。

逆に、ブロッキングIO のコードを書いたことがある人であれば async/await はスムーズに導入できる、と感じられました

(Bad) UUID を DB から取得・・・できない?

ID を生成するのに、MySQL の UUID_SHORT 関数を使おうとしていました。

SELECT UUID_SHORT();

よくやりますよね。これで取得した ID をレコードのプライマリキーとして使おうとしたら、なぜか Dupulication エラーが多発するという事態に見舞われました。不思議に思ってこの取得した ID をコード上で出力してみたところ、なんと同じ UUID が複数回表示されるではありませんか!なにが UUID だ!!! ・・・と思っていたのですが、チームのインフラ担当が調べてくれたところどうやら MySQL はちゃんと UUID を返している様子(そりゃそうですよね) わかってみれば初歩的なことだったのですが、 JavaScript の number 64bit double であり整数としては 53 bit までしか精度がでなく、取得した ID は number に変換された時点で丸め誤差が出ていた、ということでした。普段つかっている Perl では遭遇しない出来事だったため面食らいました。(これは TypeScript は関係ないですね)

これは mysql のモジュールに

supportBigNumbers: true,
bigNumberStrings: true

これらのオプションをつけ、数値に変換しないことで対応できそうでした。 ただこの時点で ID を number として扱うコードが書かれてしまっており、開発開始時に「ID は string じゃなくていいの」といわれ「number でいいんじゃん?」と答えてしまっていた私はこの件で最後まで詰られることに・・・

(Bad) エラーが貧弱

これは想定されるデメリットとして上にあげましたが、やはり厳しいという感想になりました。 基本的にスタックトレースがとれないので、エラーが起きていても直接どこが悪いのかを特定することが出来ません。

丁寧に例外をハンドルすることで擬似的に stack trace のようなものを出すことは出来そうです。

async function a () {
    try {
        await b()
    } catch(e) {
        throw new Error(e.stack);
    }
}
async function b () {
    try {
        await c()
    } catch(e) {
        throw new Error(e.stack);
    }
}
async function c () {
    throw new Error('I am C')
}
a().catch((e) => {
    console.log(e.stack)
})

このように自分で stack trace を継ぎ足してあげれば、見辛くはあるものの必要な情報を得ることができました。 もしうまい解決方法があるのなら教えていただきたいです。

まとめ

TypeScript / node.js の検証については、まだ「まとめ」ることは出来ていません。個人的にはかなり可能性を感じておりいつかは使いたいと思っていますが、stack trace の件は解決しなければならないし、開発は良くても運用面で問題があるかもしれません。ただ、(TypeScript に取り入れられる) ECMAScript / (実質的な実行環境である) node.js の界隈は非常に活発になってきていて、今ある問題も解決されるのでは、という希望が持てます。 また、今回の記事とは関係ありませんが JavaScript が動作する環境が多くなってきました。ブラウザ、サーバー、デスクトップ、スマートフォンアプリ、JS board・・・活用機会が多いという意味で JavaScript で書かれたコードは、いまやもっとも資産価値の高いコードと言えるかもしれません。

2009 年に node.js が出てきて世を賑わせていたとき「JavaScript はいいけどあんなコールバックだらけでやってはいけない」と感じた人、動的片付け言語のスピード感は好きだけど型がなくてつらくなってい人、今こそ TypeScript + node.js という環境を検討してみてはいかがでしょうか。

この記事のまとめ

  • 開発合宿で TypeScript の実用性を検証しました。一応断っておきますが「はてなでは TypeScript + node.js の本番導入を検討している」という話ではありません。
  • 今回はアプリケーション開発面をまとめました。オペレーション面についてはもし知見が得られれば書くかもしれません。むしろ知りたい。

おわりに

はてなでは慎重に技術検証を行いつつ、社内の次世代の標準を模索していけるエンジニアを募集しています

hatenacorp.jp

はてなデベロッパアドベントカレンダー、明日は id:nobuoka です。お楽しみに!