新人エンジニアによるはじめての機能拡張
目次
こんにちは、入社1年目のカズシです。昨年の10月、Confitチームに配属後初めて開発者として機能拡張に携わりました。今回はそこで開発した「参加証ダウンロード機能」について、開発するうえでの苦労や工夫も交えてお話ししたいと思います。
参加証ダウンロード機能とは?
参加者がマイページから下の画像のような参加証と名札がセットになったPDFをダウンロードできる機能です。オンライン開催の大会では参加証を手渡しできなくなり、オンラインで発行できる需要が高まったという背景があります。詳しくはConfitスタッフブログの記事をご覧ください。
配置した文字の座標計算
この機能では画像に合わせて文字を配置するのではなく、出力する文字の場所に合わせてデザイナーが画像をデザインすることになります。そのため、どの範囲に文字を出力するのかという情報、つまり文字の座標を仕様として決定しなければいけません。座標の計算にはPDF上の座標から画像上の座標を計算し、インチとpixelを変換する処理が必要です。とても頭の中では処理できないので、紙に書いて状況を整理しながら、出力した文字の四隅の座標を計算するメソッドを作りました。このメソッドのおかげで、後で出力する文字の位置調整が生じても自力で再計算する必要がなくなりました。またこの段階でライブラリの仕様を深く理解できたため、その後の開発がスムーズに進みました。
フォントの二段構え
PDFの作成にはApache PDFBox (以下PDFBox)というJavaのライブラリを使用しました。PDFBoxでは出力する文字のフォントを指定できるのですが、難しい漢字などフォントが対応していない文字があるとエラーになってしまいます。そこで日本語に対応しているオープンソースのフォントとしてIPAフォントとNoToフォントが候補に挙がりました。見た目はIPAフォントの方が良いのですが、対応文字はNoToフォントの方が多いので、迷った挙句、両方のフォントのいいとこ取りをしようという結論になりました。以下のコードのように二重でtry文を書くことで、まずIPAフォントで出力して、エラーになったらNoToフォントで出力するようにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public String ipaFont = “xxx/xxx/xxx.ttf”; //IPAフォントファイル public String notoFont = “xxx/xxx/xxx.ttf”; //NoToフォントファイル public void createPDF() throws LogicException { try { create(ipaFont); //指定したフォントでPDFを作成するメソッド } catch (IllegalArgumentException ex) { try { create(notoFont); } catch (Exception e) { throw new LogicException(e.getMessage()); } } catch (Exception e) { throw new LogicException(e.getMessage()); } } |
フィードバックを受けて改善
拡張した機能は開発チーム内での機能試験だけでなく、セールス・導入コンサルティングのメンバーにも実際に使用してもらい、フィードバックを貰います。今回の拡張では、「実際に印刷したときにどこまでが参加証かわからない」という意見から、デザイン画像にキリトリ線を追加したり、「参加証が縦に長い大会もある」という意見から文字の位置が画像の縦幅に依存しないように修正して、画像デザインの自由度を高くしました。このように多くの人、目線からのフィードバックは改善点や潜在的な不具合の発見に繋がり、結果としてリリース時のクオリティが高まります。
おわりに
先輩方の手厚いサポートもあり、なんとか機能を完成させ無事にリリースすることができました。私の作業状況を見守る先輩方の脳裏には「はじめてのおつ○い」でおなじみのあのメロディが流れていたことでしょう。今回はじめて機能拡張に携わることにより、1つの機能にも多くの人が関わって作り上げていくものだという事を実感できました。また、自分1人で作り上げたわけではないですが、システムに「この機能は自分が作った!」と言える部分があることは嬉しいですね。今後もConfitと共にエンジニアとして成長していきたいと思います。