Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

はじめに

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

なのですが

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

1つ目

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

よし準備は万端だ

Slide 16

Slide 16 text

我々が想像するExcel

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

実際に要望されるExcel

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

想定するレイアウト

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

どうすべきか

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

StreamWriterの問題

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

2つ目

Slide 43

Slide 43 text

「データ出力」

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

UTF-8 -> Shit-JIS

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

https://teratail.com/questions/106106

Slide 51

Slide 51 text

とある日

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

あっ

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

解決策

Slide 59

Slide 59 text

● buffer sizeを指定する

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

● tranform.Transformerを自 作する

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

No content

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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