$30 off During Our Annual Pro Sale. View Details »

細かすぎて伝わらないGo小ネタ集

 細かすぎて伝わらないGo小ネタ集

\非公式/ Go Conference 2022 Spring スポンサー企業4社 アフタートーク
登壇資料
https://andpad.connpass.com/event/243953/

細かすぎて伝わらないGo小ネタ集
アンドパッド tomoki harada

ANDPAD inc

April 28, 2022
Tweet

More Decks by ANDPAD inc

Other Decks in Technology

Transcript

  1. The original author of Go gopher is Renée French.
    This Gopher was made by tomoki harada.

    View Slide

  2. はじめに

    View Slide

  3. これから発表する内容は
    個人の見解であり
    所属する組織の公式見解で
    はありません

    View Slide

  4. 細かすぎて伝わらない
    Go小ネタ集
    ANDPAD inc.
    tomoki.harada (tomtwinkle)

    View Slide

  5. View Slide

  6. 建設業界などの
    ホワイトボード
    を置き換える

    View Slide

  7. なのですが

    View Slide

  8. 理想:SaaSを使って業務を
    DX、データはSaaSで完結
    現実:既存の業態でも扱えるよ
    うにカスタマイズ

    View Slide

  9. よくある要望
    「Excelで出力」

    View Slide

  10. 1つ目

    View Slide

  11. View Slide

  12. https://xuri.me/excelize/ja/

    View Slide

  13. https://github.com/qax-os/excelize

    View Slide

  14. Intex値からExcelカラム名
    に変換するhelperを用意

    View Slide

  15. よし準備は万端だ

    View Slide

  16. 我々が想像するExcel

    View Slide

  17. View Slide

  18. 実際に要望されるExcel

    View Slide

  19. View Slide

  20. 背景の罫線は消して
    欲しい
    セル結合
    レコードのgroup毎に
    columnを表示する
    columnが途中か
    ら縦で現れる
    案件毎に背景色
    を変えたい
    セル結合
    列ごとに変わる幅
    出力したい表現が1次元
    増えてる!!
    セル結合
    外枠の罫線の太さ
    を変えたい

    View Slide

  21. Excelのレイアウトと値の出
    力を分けて考える

    View Slide

  22. View Slide

  23. View Slide

  24. それぞれのパーツを整理し
    て個別にレンダリング処理
    を実装しよう

    View Slide

  25. group header component
    group records component item
    header
    compo
    nent
    item records component
    calendar header component
    outer frame component

    View Slide

  26. 実は2つ注意点があります

    View Slide

  27. 1つは外枠の罫線について
    の注意点

    View Slide

  28. View Slide

  29. 出来上がったレイアウトがこ
    ちら

    View Slide

  30. View Slide

  31. View Slide

  32. 想定するレイアウト

    View Slide

  33. View Slide

  34. どうすべきか

    View Slide

  35. View Slide

  36. StreamWriterの問題

    View Slide

  37. https://xuri.me/excelize/ja/stream.html

    View Slide

  38. https://xuri.me/excelize/ja/performance.html

    View Slide

  39. レイアウトと値の書き込み
    分離したのも
    StreamWriterを使用した
    かったからですが……

    View Slide

  40. Styleが複雑すぎる場合
    StreamWriterで値が書き
    込めません。
    2020/09/14時点の情報です。最新版では未確認。

    View Slide

  41. 詳しいExcelizelianの人教
    えて下さい><

    View Slide

  42. 2つ目

    View Slide

  43. 「データ出力」

    View Slide

  44. View Slide

  45. encoding/csv
    あるし
    CSV出力は余裕でしょ

    View Slide

  46. 「CSVはExcelで読みたい
    のでShift-JISで出力お願
    い!」

    View Slide

  47. x/text/transform#Transformer
    で、簡単に行けるな……?

    View Slide

  48. UTF-8 -> Shit-JIS

    View Slide

  49. https://go.dev/play/p/4KBqmrB_qdD

    View Slide

  50. https://teratail.com/questions/106106

    View Slide

  51. とある日

    View Slide

  52. 「極々稀にコケるFlaky
    Testあるので直そう」

    View Slide

  53. どうも4096byte付近で文
    字化けが発生しているらし

    View Slide

  54. あっ

    View Slide

  55. https://cs.opensource.google/go/go/+/master:src/bufio/bufio.go;l=19

    View Slide

  56. ● csv writerはbufioに依存
    ● default buffer size = 4096
    ● rune writerに渡されるbyte
    配列は4096byteで途切れる

    View Slide

  57. マルチバイト文字が分断さ
    れた場合に変換可能かどう
    か判断出来ない

    View Slide

  58. 解決策

    View Slide

  59. ● buffer sizeを指定する

    View Slide

  60. https://cs.opensource.google/go/go/+/master:src/encoding/csv/writer.go;l=37
    buffer sizeを指定で
    きない

    View Slide

  61. ● csvに変換してからShift-JIS
    に変換する

    View Slide

  62. https://github.com/golang/go/issues/51746

    View Slide

  63. ● tranform.Transformerを自
    作する

    View Slide

  64. 作りました
    https://github.com/tomtwinkle/garbledreplacer

    View Slide

  65. View Slide

  66. View Slide

  67. 学び
    x/text/transform便利
    だけどかなり癖つよ

    View Slide

  68. View Slide

  69. 群雄割拠のSaaS
    No1であり続けるために
    泥臭いきめ細かな対応
    を心がけていきたい所存です

    View Slide

  70. ご清聴
    ありがとうございました

    View Slide