Slide 1

Slide 1 text

Th e G o go pher was des igned by Renée French . P o s t g r e S Q L ™ c _ ë i j g o t e s t ° … ™ B † f Jü_KSü_“ü / @o taka kot 202 6 . 02.21 Go Con feren ce mini 2 0 26

Slide 2

Slide 2 text

# s e n d a i g o SQ L êá B−~Y K˜

Slide 3

Slide 3 text

# s e n d a i g o ORM nˇ Õ−ágMf ~YK˜

Slide 4

Slide 4 text

# s e n d a i g o Áo êá LB− ~ [fi.. .

Slide 5

Slide 5 text

# s e n d a i g o go t e st g Po s t g r e SQL ™D _D. ..!! !

Slide 6

Slide 6 text

g o t e s t g P o s t g r e S Q L ™ ) ( Y ‰  d n ¹ Õ # s e n d a i g o

Slide 7

Slide 7 text

# s e n d a i g o ¹⁄—kÆ ¹ È ™ LW_ D.. . !!!

Slide 8

Slide 8 text

P o s t g r e S Q L ™ c _ g o t e s t ™ &  L ï ý k Y ‰  d n ¹ Õ # s e n d a i g o

Slide 9

Slide 9 text

Kotaro Ota ka Jü_K S ü_ “ü / @o takakot # s e n d a i g o Web En gi ne er °R e> Hello Gola ng! Web En gi ne er * ˆ >ÓÃÈ ü 20 20 .04 20 21 .04 20 22 .11 Gophe r Go t˜

Slide 10

Slide 10 text

# s e n d a i g o MÐ

Slide 11

Slide 11 text

# s e n d a i g o µó ×ë³ü ÉnÅk dDf

Slide 12

Slide 12 text

# s e n d a i g o É é ¤ Ð ü n Å k ) ( l i b / p q o þ ( ‰ z L ‹ u — ˇ Œ n d a t a b a s e / s q l ì ê n A P I ™ Ð ł

Slide 13

Slide 13 text

# s e n d a i g o ORM é¤Öéêo)( WjD

Slide 14

Slide 14 text

# s e n d a i g o g o t e s t g P o s t g r e S Q L ™ ) ( Y ‰  d n ¹ Õ

Slide 15

Slide 15 text

# s e n d a i g o Ìo P o s t g r e S Q L n Ë ⁄ ™ ˝ < W _ D ł k D B x h ¢ ¯ » ¹ W _ D

Slide 16

Slide 16 text

# s e n d a i g o go tes t g P ostgreSQL ™) (Y ‰¹ Õ 外部起動の PostgreSQL の利用 Testcontainers の利用 embedded-postgres の利用 RamSQL の利

Slide 17

Slide 17 text

# s e n d a i g o ÔY‰³¹ 起動 ~ 接続まで マイグレーション PostgreSQL のバージョン管理 CI 環

Slide 18

Slide 18 text

# s e n d a i g o 外部起動の PostgreSQL の利

Slide 19

Slide 19 text

# s e n d a i g o Æ ¹ È  g B › K X † w Õ û - ı U „ _ µ ü Ð ü k ¥ ı Y ‰  Å L · ó × ë g í ü « ë g n L ˜ ¦ L ˜ D K Õ

Slide 20

Slide 20 text

# s e n d a i g o co nne ct close te st Postg r e SQL go te s t L L

Slide 21

Slide 21 text

# s e n d a i g o ; GitHub oßéüêݸÈê ª ü × ó ½ ü ¹ n R D B M S í ü « ë o ³ ó Æ Ê g w Õ Y ‰ n L , — ˜ ˇ Œ S Q L x n Œ à ¦ L Ø D

Slide 22

Slide 22 text

co nne ct close te st Postg r e SQL go te s t L L # s e n d a i g o wÕ ~ ¥ ı ~g ° … p j i g - ı W _ P o s t g r e S Q L n Å 1 ™ ! Y ` Q

Slide 23

Slide 23 text

# s e n d a i g o wÕ ~ ¥ı~gn Å

Slide 24

Slide 24 text

co nne ct close te st Postg r e SQL go te s t L L # s e n d a i g o Þ¤° ìü·ç ó ° … Ë É B k ½  D o c k e r g B „ p d o c k e r - e n t r y p o i n t - i n i t d b . d ™ ) ( ï ý

Slide 25

Slide 25 text

co nne ct close te st Postg r e SQL go te s t L »ÃÈ¢Ã× # s e n d a i g o Postg re SQL nÐü¸çó¡  D o c k e r C o m p o s e ™ ) ( W f D ‰ 4  o ( c o m p o s e . y a m l Õ ¡ ¤ ë g  ı ï ý

Slide 26

Slide 26 text

co nne ct close te st Postg r e SQL go te s t L »ÃÈ¢Ã× # s e n d a i g o Postg re SQL nÐü¸çó¡  P o s t g r e S Q L n ê ê ü ¹ µ ¤ ¯ ë k Ü X f ( ° n Ð ü ¸ ç ó L ) ( ï ý

Slide 27

Slide 27 text

Gi tHu b Ac ti ons co nne ct close te st Postg r e SQL go te s t # s e n d a i g o CI °… »ÃÈ¢Ã× P o s t g r e S Q L n w Õ J ‹ s Þ ¤ ° ì ü · ç ó ™ ‰ M k ½

Slide 28

Slide 28 text

# s e n d a i g o CI °…

Slide 29

Slide 29 text

# s e n d a i g o Testcontainers の利

Slide 30

Slide 30 text

# s e n d a i g o G o ³ ü É K › D o c k e r ³ ó Æ Ê ™ ô ¥ 6 ¡ W  ° … k Ñ D „ h j ™ Û ' h ê Õ ¯ ê ü ó ¢ Ã × ™ þ Y ‰ K Õ

Slide 31

Slide 31 text

# s e n d a i g o cloud co nne ct star t im age pu ll clea nup Postg r e SQL cont ainer go te s t L mi grati on close te st

Slide 32

Slide 32 text

# s e n d a i g o D o c k e r ³ ó Æ Ê ™ G o g 6 ¡ D o c k e r D e s k t o p , O r b S t a c k e t c . . . , i n ³ ó Æ Ê ™ ) ( ï ý

Slide 33

Slide 33 text

wÕ ~ ¥ ı ~g # s e n d a i g o cloud co nne ct star t im age pu ll clea nup Postg r e SQL cont ainer go te s t L mi grati on close te st P o s t g r e S Q L ™ w Õ Y ‰ _ † n A P I L (  U „ f D ‰ n g ] „ ™ ) ( postgres.Run() 関数で起 接続情報をConnectionString() メソッ

Slide 34

Slide 34 text

# s e n d a i g o wÕ ~ ¥ı~gn Å

Slide 35

Slide 35 text

# s e n d a i g o wÕ ~ ¥ı~gn Å

Slide 36

Slide 36 text

# s e n d a i g o wÕ ~ ¥ı~gn Å

Slide 37

Slide 37 text

# s e n d a i g o wÕ ~ ¥ı~gn Å

Slide 38

Slide 38 text

Þ¤° ìü·ç ó # s e n d a i g o cloud co nne ct star t im age pu ll clea nup Postg r e SQL cont ainer go te s t L mig rati on close te st W i t h I n i t S c r i p t s ( ) ¢ p k ( D D L Õ ¡ ¤ ë x n Ñ ¹ ™ ! W L

Slide 39

Slide 39 text

# s e n d a i g o Þ¤° ìü·ç ó

Slide 40

Slide 40 text

# s e n d a i g o cloud co nne ct star t im age pu ll clea nup Postg r e SQL cont ainer go te s t L mig rati on close te st Postg re SQL nÐü¸çó¡  ³ ó Æ Ê L  ı g M ‰ n g P o s t g r e S Q L n ê ê ü ¹ µ ¤ ¯ ë k Ü X f ° n Ð ü ¸ ç ó L ) ( ï ý

Slide 41

Slide 41 text

# s e n d a i g o cloud co nne ct star t im age pu ll clea nup Postg r e SQL cont ainer go te s t mig rati on close te st CI °… Æ ¹ È ³ ü É g w Õ U „ ‰ _ † ‰ M Œ Ž † Gi tHu b Ac tions

Slide 42

Slide 42 text

# s e n d a i g o embedded-postgres の利

Slide 43

Slide 43 text

# s e n d a i g o L B k P o s t g r e S Q L n Ð ¤ Ê ê ™ ê Õ g À ¦ ó í ü É û w Õ Y ‰ _ †  D o c k e r é ó ¿ ¤ à L j D ° … g ‡ D B Æ ¹ È L g M ‰ K Õ

Slide 44

Slide 44 text

# s e n d a i g o Postg r e SQL bi na ry go te s t L co nne ct star t clea nup mi grati on close te st cloud b i n a r y d o w n l o a d

Slide 45

Slide 45 text

# s e n d a i g o , i n P o s t g r e S Q L ™  è š X j W g w Õ G o å  n ° … t Ž L † ý Ï j P o s t g r e S Q L Ð ¤ Ê ê ™ ) (

Slide 46

Slide 46 text

# s e n d a i g o ý Ï j P o s t g r e S Q L Ð ¤ Ê ê M  J a v a I n Æ ¹ È L k ‡ ) ( U „ f D ‰  1 0 M B ¦ ~ g µ ¤ º ™ ' .

Slide 47

Slide 47 text

# s e n d a i g o Postg r e SQL bi na ry go te s t L co nne ct star t clea nup mi grati on close te st cloud b i n a r y d o w n l o a d wÕ ~ ¥ ı ~g P o s t g r e S Q L ™ w Õ Y ‰ _ † k A P I L (  U „ f D ‰ n g ] „ ™ ) ( ¥ıÅ1 ™ Co nfig K›ÖŠ

Slide 48

Slide 48 text

# s e n d a i g o wÕ ~ ¥ı~gn Å

Slide 49

Slide 49 text

# s e n d a i g o wÕ ~ ¥ı~gn Å

Slide 50

Slide 50 text

# s e n d a i g o wÕ ~ ¥ı~gn Å

Slide 51

Slide 51 text

# s e n d a i g o Þ¤° ìü·ç ó Postg r e SQL bi na ry go te s t L co nne ct star t clea nup mi grati on close te st cloud b i n a r y d o w n l o a d é ¤ Ö é ê h W f n _ ý Ð ł o j D n g ê M g Õ D ™ (  Y ‰ Å † B −

Slide 52

Slide 52 text

# s e n d a i g o Þ¤° ìü·ç ó

Slide 53

Slide 53 text

# s e n d a i g o Postg r e SQL bi na ry go te s t L co nne ct star t clea nup mi grati on close te st cloud b i n a r y d o w n l o a d Ð ü ¸ ç ó L Ï ü É ³ ü É U „ f D ‰ á ¸ ã ü Ð ü ¸ ç ó o x ž ï ý ` L Þ ¤ Ê ü — Ñ Ã Á Ð ü ¸ ç ó o  ı ï Postg re SQL nÐü¸çó¡ 

Slide 54

Slide 54 text

# s e n d a i g o Postg re SQL nÐü¸çó¡  emb edded - p os t gres / conf ig .g o

Slide 55

Slide 55 text

# s e n d a i g o Postg re SQL nÐü¸çó¡ 

Slide 56

Slide 56 text

# s e n d a i g o Postg r e SQL bi na ry go te s t co nne ct star t clea nup mi grati on close te st cloud b i n a r y d o w n l o a d CI °… Æ ¹ È ³ ü É g w Õ U „ ‰ _ † ‰ M Œ Ž † Gi tHu b Ac ti ons

Slide 57

Slide 57 text

# s e n d a i g o RamSQL の利

Slide 58

Slide 58 text

# s e n d a i g o ¤ ó á â ê g Õ \ Y ‰ P o s t g r e S Q L ™ Û n S Q L ¨ ó ¸ ó ™ ) ( W   è š X ™ ™ d W f u † f Ø ˜ k Æ ¹ È ™ L g M ‰ K Õ

Slide 59

Slide 59 text

# s e n d a i g o go test In Me m o ry L star t co nne ct mi gr ati on test close

Slide 60

Slide 60 text

# s e n d a i g o Æ ¹ È ¹ ¤ ü È  ( k -  þ ( ‡ ‰ z - ³ − j D _ ý ‡ . . . d a t a b a s e / s q l k Œ à W _ É é ¤ Ð ü

Slide 61

Slide 61 text

# s e n d a i g o wÕ ~ ¥ ı ~g go test In Me m o ry L star t co nne ct mi gr ati on test close Öéó¯¤óÝüÈkf¥ı

Slide 62

Slide 62 text

# s e n d a i g o wÕ ~ ¥ı~gn Å

Slide 63

Slide 63 text

# s e n d a i g o Þ¤° ìü·ç ó go test In Me m o ry L star t co nne ct mi gr ati on test close é ¤ Ö é ê h W f n _ ý Ð ł o j D n g ê M g Õ D ™ (  Y ‰ Å † B −

Slide 64

Slide 64 text

# s e n d a i g o Postg re SQL nÐü¸çó¡  go test In Me m o ry L star t co nne ct mi gr ati on test close Post greS QL nÐü¸ çóµÝüÈjW

Slide 65

Slide 65 text

# s e n d a i g o CI °… go test In Me m o ry star t co nne ct mi gr ati on test close ƹ ȳ üÉgw Õ U„‰_†‰ MŒŽ † Gi tHu b Ac ti ons

Slide 66

Slide 66 text

# s e n d a i g o PostgreSQL )(Ô ~h†

Slide 67

Slide 67 text

# s e n d a i g o Ñ¿üó y´ èw Õ Æ¹ ȳüÉ L‡c h‡· ó×ë Testc onta in ers ³óÆ Ê n)( k‹− Æ¹È g„P emb edd ed-po st g res Ð¤Ê ê n)( k‹− Æ¹È g„P ramsql ‡ch ‡ ؘ` L„h ™Ûg ojD

Slide 68

Slide 68 text

# s e n d a i g o PostgreSQL )(Ô J~Q

Slide 69

Slide 69 text

# s e n d a i g o Â$ ˆÑ Õ ©üÞó¹Ô テスト開始 PostgreSQL 起動 PostgreSQL 接続 テスト終

Slide 70

Slide 70 text

# s e n d a i g o í ü « ë L ˜ ¦ ˆ A p p l e M 1 M a c g o t e s t ‰ Ë K › B ƒ ; C o r e s : 8 ( 4 p e r f o r m a n c e a n d 4 e f f i c i e n c y ) ( ; M e m o r y : 1 6 G B e m b e d d e d - p o s t g r e s ~ 12 s Test c o n t ai n ers ~ 4 s èwÕ ~ 0. 4 s ra msql ~ 0. 3 s Rosett a 2 nqÿ ? ?

Slide 71

Slide 71 text

# s e n d a i g o C I L ˜ ¦ ˆ u b u n t u - 2 4 . 0 4 ( 4 C P U 1 6 G B ) G i t H u b A c t i o n s ‰ Ë K › B ƒ èwÕ ~ 39 s Test c o n t ai n ers ~ 27 s e m b e d d e d - p o s t g r e s ~ 20 s ra msql ~ 15 s

Slide 72

Slide 72 text

# s e n d a i g o P o s t g r e S Q L ™ c _ g o t e s t ™ &  L ï ý k Y ‰  d n ¹ Õ

Slide 73

Slide 73 text

# s e n d a i g o Ìo Æ ¹ È n Ø ˜  ™ î  W &   Æ ¹ È ± ü ¹ L r W Õ ê ü ü

Slide 74

Slide 74 text

# s e n d a i g o ‰Hp. .. データの作成 データの取得 データの削

Slide 75

Slide 75 text

# s e n d a i g o ‰Hp. .. テストデータリセットによる対象の消失 テストデータ過多による比較の失

Slide 76

Slide 76 text

# s e n d a i g o &Lïý kY‰¹ Õ 並列実行は諦める 複数 PostgreSQL の利用 複数データベースの利用 トランザクションの利

Slide 77

Slide 77 text

# s e n d a i g o ÔY‰³¹ テストコード Pros Con

Slide 78

Slide 78 text

# s e n d a i g o 並列実行は諦め

Slide 79

Slide 79 text

# s e n d a i g o t . P a r a l l e l ( ) ™ ( [ Z   Æ ¹ È n M „ g Æ ü Ö ë ™ h J d W f  j k L Y ‰ ‡ · ó × ë j K Õ

Slide 80

Slide 80 text

# s e n d a i g o TR UN CA TE TRUNC ATE TRU NCATE Postg r e SQL go test A go t est B go te st C

Slide 81

Slide 81 text

# s e n d a i g o TR UN CA TE TRUNC ATE TRU NCATE Postg r e SQL go test A go t est B go te st C èg Pos tgreS QL ™ wÕW fJ O Æ ¹ È L B fi L  k j › j D n g B „ p S n Ñ ¿ ü ó g A  ‡†

Slide 82

Slide 82 text

# s e n d a i g o ƹȳüÉ t.Paral lel ( ) o‘jD t . C l e a n u p g T R U N C T A T E ™ L

Slide 83

Slide 83 text

# s e n d a i g o TR UN CA TE TRUNC ATE TRU NCATE Postg r e SQL go test A go t est B go te st C Æ ¹ È ( k (  Y ‰ Õ D L Ç ü ¿ ê » Ã È n Å L·ó ×ë Pr os

Slide 84

Slide 84 text

# s e n d a i g o TR UN CA TE TRUNC ATE TRU NCATE Postg r e SQL go test A go t est B go te st C Co ns ƹ Èpk Ô‰Wf LBfiLŠ€.. .

Slide 85

Slide 85 text

# s e n d a i g o 複数 PostgreSQL の利

Slide 86

Slide 86 text

# s e n d a i g o T e s t c o n t a i n e r s I ™ ( D f Æ ¹ È ± ü ¹ T h k % n P o s t g r e S Q L ™ w Õ W  „ h k fl â U „ _ ° … ™ Ë É Y ‰ K Õ

Slide 87

Slide 87 text

# s e n d a i g o Postg r e SQL Postg r e SQL Postg r e SQL go t est B go t est C go test A C r e a t e P o s t g r e s D e l e t e P o s t g r e s

Slide 88

Slide 88 text

# s e n d a i g o Postg r e SQL Postg r e SQL Postg r e SQL go t est B go t est C go test A C r e a t e P o s t g r e s D e l e t e P o s t g r e s ‡† T e s t c o n t a i n e r s — e m b e d d e d - p o s t g r e s ™ c f ( P o s t g r e S Q L ™ Æ ¹ È T h k w Õ

Slide 89

Slide 89 text

# s e n d a i g o ƹȳüÉ Testc onta ine rs ™)( ³óÆ ÊTh4Ä

Slide 90

Slide 90 text

# s e n d a i g o Postg r e SQL Postg r e SQL Postg r e SQL go t est B go t est C go test A C r e a t e P o s t g r e s D e l e t e P o s t g r e s Pr os Æ ¹ È ° … ™ „ h k  â Y ‰ S h g { K n Æ ¹ È n q ÿ ™ „ h k n

Slide 91

Slide 91 text

# s e n d a i g o Postg r e SQL Postg r e SQL Postg r e SQL go t est B go t est C go test A C r e a t e P o s t g r e s D e l e t e P o s t g r e s ª ü Ð ü Ø Ã É L ' M O Æ ¹ È ¹ ¤ ü È h S n L ‡ w O j ‰ ï ý ' ‡ . . . Co ns

Slide 92

Slide 92 text

# s e n d a i g o 複数データベースの利

Slide 93

Slide 93 text

# s e n d a i g o n P o s t g r e S Q L ¤ ó ¹ ¿ ó ¹ – g  Æ ¹ È T h k C R E A T E D A T A B A S E g ì Ë W _ Ç ü ¿ Ù ü ¹ ™ \  W ¥ ı H ™  â

Slide 94

Slide 94 text

# s e n d a i g o Po st gr eSQ L go te st B go te st C go te st A C R E A T E D A T A B A S E D R O P D A T A B A S E

Slide 95

Slide 95 text

# s e n d a i g o Po st gr eSQ L go te st B go te st C go te st A C R E A T E D A T A B A S E D R O P D A T A B A S E ‡† èg Pos tgreS QL ™ wÕW fJ O Æ ¹ È T h k  j M g C R E A T E D A T A B A S E ™ L Æ ¹ È „ o D R O P D A T A B A S E g 4 Ä

Slide 96

Slide 96 text

# s e n d a i g o ƹȳüÉ CR EATE DA TAB ASE DR OP DAT AB ASE

Slide 97

Slide 97 text

# s e n d a i g o Po st gr eSQ L go te st B go te st C go te st A C R E A T E D A T A B A S E D R O P D A T A B A S E Pr os Æ ¹ È Ç ü ¿ n ê » Ã È ™ Ç ü ¿ Ù ü ¹ n 4 Ä g L ï ý

Slide 98

Slide 98 text

# s e n d a i g o Po st gr eSQ L go te st B go te st C go te st A C R E A T E D A T A B A S E D R O P D A T A B A S E Co ns Æ ¹ È ( k C R E A T E D A T A B A S E / Þ ¤ ° ì ü · ç ó D R O P D A T A B A S E n Õ D L Å † k j ‰

Slide 99

Slide 99 text

# s e n d a i g o トランザクションの利

Slide 100

Slide 100 text

# s e n d a i g o  Æ ¹ È ™ È é ó ¶ ¯ · ç ó – g L W f B ƒ B k í ü ë Ð Ã ¯ Y ‰ S h g Ç ü ¿ ™ ê » Ã È W f r ™ 2 P K Õ

Slide 101

Slide 101 text

# s e n d a i g o Po stg re SQL go tes t B go tes t C go test A RO LLB AC K BEGI N

Slide 102

Slide 102 text

# s e n d a i g o Po stg re SQL go tes t B go tes t C go test A RO LLB AC K BEGI N ‡† èg Pos tgreS QL ™ wÕW fJ O Æ ¹ È · Ê ê ª ™ B E G I N g ‰ Ë Æ ¹ È „ o R O L L B A C K g 4 Ä

Slide 103

Slide 103 text

# s e n d a i g o ƹȳüÉ Èéó¶ ¯·çó™ ‰Ë ROL LBA CK gê »ÃÈ

Slide 104

Slide 104 text

# s e n d a i g o RO LLB AC K Po stg re SQL go test B go test C go test A BEGI N Pr os Æ ¹ È Ç ü ¿ n ê » Ã È ™ í ü ë Ð Ã ¯ æ  g L ï ý

Slide 105

Slide 105 text

Po stg re SQL go test B go test C go test A BEGI N # s e n d a i g o ¢ × ê ± ü · ç ó ³ ü É n Å ! , g o È é ó ¶ ¯ · ç ó ™ ) ( Y ‰ _ † k Æ ¹ È ³ ü É g å + L Å † Co ns

Slide 106

Slide 106 text

# s e n d a i g o & ÅÔ ~h†

Slide 107

Slide 107 text

# s e n d a i g o Ñ¿üó y´ ô L ‡c h‡·ó×ëj Å Pos tgr eSQL & „hkflâW_°…™ËÉ Çü¿ Ùü¹ & ìËW_Çü¿Ùü¹™ËÉ Èéó¶ ¯·ç ó) ( ACID y ' ™)(W_â

Slide 108

Slide 108 text

# s e n d a i g o ~h†

Slide 109

Slide 109 text

# s e n d a i g o Po st greSQ L ) (Ô

Slide 110

Slide 110 text

# s e n d a i g o Ñ¿üó y´ èw Õ Æ¹ ȳüÉ L‡c h‡· ó×ë Testc onta in ers ³óÆ Ê n)( k‹− Æ¹È g„P emb edd ed-po st g res Ð¤Ê ê n)( k‹− Æ¹È g„P ramsql ‡c h‡Ø˜ `L™ Û'L OWD

Slide 111

Slide 111 text

# s e n d a i g o & ÅÔ

Slide 112

Slide 112 text

# s e n d a i g o Ñ¿üó y´ ô L ‡c h‡·ó×ëj Å Pos tgr eSQL & „hkflâW_°…™ËÉ Çü¿ Ùü¹ & ìËW_Çü¿Ùü¹™ËÉ Èéó¶ ¯·ç ó) ( ACID y ' ™)(W_â

Slide 113

Slide 113 text

# s e n d a i g o S „ › n Ñ ¿ ü ó ™ D  ‘ [ f ë i j Æ ¹ È ˜ ; ™

Slide 114

Slide 114 text

# s e n d a i g o JKjD ‘[ èwÕ Ç ü ¿ Ù ü ¹  r

Slide 115

Slide 115 text

# s e n d a i g o ‘!g·ó ×ëj Å RamSQL ô L

Slide 116

Slide 116 text

# s e n d a i g o Doc ker †g C I ™·ó×ëk e m b e d d e d - p o s t g r e s Èéó¶ ¯ · çó

Slide 117

Slide 117 text

J‘− ~ _ i S K g J ˆ D W ~ W ⁄ F