Slide 1

Slide 1 text

j2hの紹介 G o言語 L T 大会! 「 最近、G o言語始めました」 の会 K agawa S hoichi(@kanga333)

Slide 2

Slide 2 text

自己紹介 香川翔一(@kanga333) インフラエンジニア@M icr o A d ネット広告の会社でインフラの構築やら運用やら G o歴:4ヶ月 G oの好きな所:ポー タビリティの高さ

Slide 3

Slide 3 text

今日話すこと j2hというツー ルを作った話 利用したgjs onというライブラリの紹介

Slide 4

Slide 4 text

j2h https://git hu b.com/kanga333/j2h JSON から H iv eの DDL を生成してくれるツー ル

Slide 5

Slide 5 text

H ive

Slide 6

Slide 6 text

ざっくりhiveとは H adoop や S 3の大量のデー タを SQL で見るためのミドルウェア A t henaのメタデー タ管理とかでも使われてるっぽい JSON を雑に突っ込んで見る機能がある

Slide 7

Slide 7 text

JSON を雑に突っ込む たとえばこういう JSON を突っ込む { " f o o " : " b a r " , " b a z " : 1 0 } 対応する DDL を書く( 抜粋) c r e a t e e x t e r n a l t a b l e t e s t j 2 h ( f o o s t r i n g , b a z i n t )

Slide 8

Slide 8 text

読める

Slide 9

Slide 9 text

エグい JSON の DDL 書くのツライ エグい JSON

Slide 10

Slide 10 text

エグい JSON の DDL 書くのツライ 対応するエグい DDL

Slide 11

Slide 11 text

人のやることではない

Slide 12

Slide 12 text

というわけでgoでtool化したのがj2h 例えばこういう JSON を { " n a m e " : { " f i r s t " : " S h o i c h i " , " l a s t " : " K a g a w a " } , " a g e " : 2 8 , " j o b " : " I n f r a " , " c h i l d " : n u l l , " h e a l t h " : t r u e , " f r i e n d s " : [ { " f i r s t " : " T a r o " , " l a s t " : " T a n n a k a " } , { " f i r s t " : " Y u t a " , " l a s t " : " Y a m a d a " } ] }

Slide 13

Slide 13 text

というわけでgoでtool化したのがj2h こんな感じに変換 $ j 2 h - p a t h t e s t . j s o n c r e a t e e x t e r n a l t a b l e j s o n _ d a t a ( n a m e s t r u c t < f i r s t : s t r i n g , l a s t : s t r i n g > , a g e i n t , j o b s t r i n g , c h i l d b i n a r y , h e a l t h b o o l e a n , f r i e n d s a r r a y < s t r u c t < f i r s t : s t r i n g , l a s t : s t r i n g > > )

Slide 14

Slide 14 text

G oで作ればどこでも動いて H appy ランタイムなくても動く M acでも動く L inux でも動く W indows でも( 多分) 動く そのうちブラウザ上でも動くようにしたい gop herJS

Slide 15

Slide 15 text

実装にあたって

Slide 16

Slide 16 text

JSON をゆるふわに読みたい 任意の JSON をパー スしたいので、 構造体に U nmar chalれない map[str ing]int er face{}をごにょるのはツラそう

Slide 17

Slide 17 text

gjsonを使う https://git hu b.com/t idw all/gjs on goで JSON を取り扱うライブラリの1つ JSON をパー スして 子要素を指定してとったり 子要素に対して反復処理したり

Slide 18

Slide 18 text

例えばこういうjsonに対して { " n a m e " : { " f i r s t " : " S h o i c h i " , " l a s t " : " K a g a w a " } , " a g e " : 2 8 , " j o b " : " I n f r a " , " c h i l d " : n u l l , " h e a l t h " : t r u e , " f r i e n d s " : [ { " f i r s t " : " T a r o " , " l a s t " : " T a n n a k a " } , { " f i r s t " : " Y u t a " , " l a s t " : " Y a m a d a " } ] }

Slide 19

Slide 19 text

指定して取る f i r s t : = g j s o n . G e t ( j s o n , " n a m e . f i r s t " ) l a s t : = g j s o n . G e t ( j s o n , " n a m e " ) . G e t ( " l a s t " ) n u m : = g j s o n . G e t ( j s o n , " f r i e n d s . # " ) f r i e n d s : = g j s o n . G e t ( j s o n , " f r i e n d s . # . f i r s t " ) f m t . P r i n t f ( " % s % s f r i e n d s ( % s ) % s \ n " , f i r s t , l a s t , n u m , f r i e n d s ) S h o i c h i K a g a w a f r i e n d s ( 2 ) [ " T a r o " , " Y u t a " ] gjs on.R esu lt 型が返される

Slide 20

Slide 20 text

JSON タイプを判別する(result.T ype) r : = g j s o n . G e t ( j s o n , " j o b " ) f m t . P r i n t f ( " % s ( % s ) \ n " , r , r . T y p e ) I n f r a ( S t r i n g )

Slide 21

Slide 21 text

JSON タイプはこんな感じに対応 子要素が 文字列: S t r i n g 数値: N u m b e r tru e: T r u e fals e: F a l s e nu ll: N u l l ネストした JSON または配列: J S O N

Slide 22

Slide 22 text

子要素に対して反復処理する(F orE ach) あんまり G oっぽく無い気がする r : = g j s o n . P a r s e ( j s o n ) r . F o r E a c h ( f u n c ( k e y , v a l u e g j s o n . R e s u l t ) b o o l { f m t . P r i n t f ( " % s \ t : % s ( % s ) \ n " , k e y , v a l u e , v a l u e . T y p e ) r e t u r n t r u e } ) 反復処理する関数を渡してやる R esu lt 型でkey とv alu eを受け取り、tru eを返すとルー プ続行

Slide 23

Slide 23 text

子要素に対して反復処理する(F orE ach) 結果 n a m e : { " f i r s t " : " S h o i c h i " , " l a s t " : " K a g a w a " } ( J S O N ) a g e : 2 8 ( N u m b e r ) j o b : I n f r a ( S t r i n g ) c h i l d : ( N u l l ) h e a l t h : t r u e ( T r u e ) f r i e n d s : [ { " f i r s t " : " T a r o " , " l a s t " : " T a n n a k a " } , { " f i r s t " : " Y u t a " , " l a s t " : " Y a m a d a " } ] ( J S O N )

Slide 24

Slide 24 text

そんなこんなで gjsonでゆるふわに JSON 扱える!

Slide 25

Slide 25 text

おわりに JSON から H iv eの DDL を作成するj2hという自作ツー ルを紹介 G oは簡単にどこでも動いて良い! JSON をゆるふわに取り扱うためのgjs onというライブラリを紹介 G o楽しい