From 5522f51d6bffbfb3445167cf709c0d47c5a14cd6 Mon Sep 17 00:00:00 2001 From: c-bata Date: Sat, 19 Mar 2022 23:27:46 +0900 Subject: [PATCH 1/2] Set favicon.ico --- optuna_dashboard/_app.py | 83 +++-------------------------------- optuna_dashboard/favicon.ico | Bin 0 -> 15406 bytes optuna_dashboard/index.html | 75 +++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 78 deletions(-) create mode 100644 optuna_dashboard/favicon.ico create mode 100644 optuna_dashboard/index.html diff --git a/optuna_dashboard/_app.py b/optuna_dashboard/_app.py index ba5d2bd5..f1772dc9 100644 --- a/optuna_dashboard/_app.py +++ b/optuna_dashboard/_app.py @@ -50,82 +50,6 @@ logger = logging.getLogger(__name__) BASE_DIR = os.path.dirname(os.path.abspath(__file__)) STATIC_DIR = os.path.join(BASE_DIR, "public") -INDEX_HTML = """ - - - Optuna Dashboard - - - - - - -
- - - - - - - -

NOW LOADING

-
-
- - -""" # noqa:E501 # In-memory trials cache trials_cache_lock = threading.Lock() trials_cache: Dict[int, List[FrozenTrial]] = {} @@ -191,8 +115,7 @@ def create_app(storage: BaseStorage) -> Bottle: # Accept any following paths for client-side routing @app.get("/dashboard<:re:(/.*)?>") def dashboard() -> BottleViewReturn: - response.content_type = "text/html" - return INDEX_HTML + return static_file("index.html", BASE_DIR, mimetype="text/html") @app.get("/api/studies") @json_api_view @@ -324,6 +247,10 @@ def create_app(storage: BaseStorage) -> Bottle: response.status = 204 # No content return {} + @app.get("/favicon.ico") + def favicon() -> BottleViewReturn: + return static_file("favicon.ico", BASE_DIR) + @app.get("/static/") def send_static(filename: str) -> BottleViewReturn: return static_file(filename, root=STATIC_DIR) diff --git a/optuna_dashboard/favicon.ico b/optuna_dashboard/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3b07f07386e19f3f4b13a4659227e9785ec60d79 GIT binary patch literal 15406 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 + + + Optuna Dashboard + + + + + + +
+ + + + + + + +

NOW LOADING

+
+
+ + \ No newline at end of file From 2902a87fe6a5aae11e1f72597200c6a4350880fb Mon Sep 17 00:00:00 2001 From: c-bata Date: Sun, 20 Mar 2022 00:09:11 +0900 Subject: [PATCH 2/2] Gzip favicon.ico --- optuna_dashboard/_app.py | 5 ++++- optuna_dashboard/{ => img}/favicon.ico | Bin optuna_dashboard/img/favicon.ico.gz | Bin 0 -> 7670 bytes setup.cfg | 5 ++++- 4 files changed, 8 insertions(+), 2 deletions(-) rename optuna_dashboard/{ => img}/favicon.ico (100%) create mode 100644 optuna_dashboard/img/favicon.ico.gz diff --git a/optuna_dashboard/_app.py b/optuna_dashboard/_app.py index f1772dc9..2920b815 100644 --- a/optuna_dashboard/_app.py +++ b/optuna_dashboard/_app.py @@ -49,6 +49,7 @@ logger = logging.getLogger(__name__) BASE_DIR = os.path.dirname(os.path.abspath(__file__)) STATIC_DIR = os.path.join(BASE_DIR, "public") +IMG_DIR = os.path.join(BASE_DIR, "img") # In-memory trials cache trials_cache_lock = threading.Lock() @@ -249,7 +250,9 @@ def create_app(storage: BaseStorage) -> Bottle: @app.get("/favicon.ico") def favicon() -> BottleViewReturn: - return static_file("favicon.ico", BASE_DIR) + use_gzip = "gzip" in request.headers["Accept-Encoding"] + filename = "favicon.ico.gz" if use_gzip else "favicon.ico" + return static_file(filename, IMG_DIR) @app.get("/static/") def send_static(filename: str) -> BottleViewReturn: diff --git a/optuna_dashboard/favicon.ico b/optuna_dashboard/img/favicon.ico similarity index 100% rename from optuna_dashboard/favicon.ico rename to optuna_dashboard/img/favicon.ico diff --git a/optuna_dashboard/img/favicon.ico.gz b/optuna_dashboard/img/favicon.ico.gz new file mode 100644 index 0000000000000000000000000000000000000000..3a2591908eeeae18e9f5397ce2f17b75e8f728e7 GIT binary patch literal 7670 zcmV| zXp%`Gflwj=0wI*pl+{HcWfCTo^j?6;q(H#JWJ)qKASKAIAbhT3K~{>D4$?#*2}x$= z`<*-Q8-|DrmfgSheV+Tw%zMk}=bm%!9ikR=AGx~|KKs!8`-z?;qCR~bzdbq-mExV3 zm()LiXkQm14~%i=apZV^uTQ2wd1nXErko%;j@FP9Of_hqWRIa0*?#okFU?CEP2DkX zE9U%=8$zm_3G_tHSn8G&N)Hu|C;$8qD$X5C7qiAtRP(u6FH%py{TBV^wV~8g6G@9p z=g|JLIdrykF8x?KoBmZCNr`!(^km*R`Y1DyRPtPW`BSDJy^pz;;u-W9#vWQfmy$L_ z(L>y?4W;|uTtFk%N6|*~9bY?*p264;fNKc%XZX+r&~~99j7ApEqBCXl$p5Wamu~vy zU9yddy}mFc_B^atbzY;7ZTH~%c{IBul1{59)8m+PP&Jy`WGbi?LhXl>L?p>CLe7(7^-8$|PqrjrgbI;4wk^Qckv;1P3*$0c*xupD#hkT*<8{kI!b z-OgyETlXuOLn`oZTed&oD`-3T*D))QJ}C^Pex;H0-G&A9PVsB59gPWHmsGCk^{yeY z*L!+Zmn4=cbm{q$nRIdOWEuk6^%)9UD0BdF$PFf)I)eH_NA_))Pal`hqrkjZs5SSO zEu`*{Z31|79C$ttd?PXEWV(V}WIfCdq~&>IX;)qd^(~o2sh|^d~-X%8dIQ~Ct)ia3ntP_XoJ^=P#=7b%pXUuL1(@Iy~oq;Fjs!^ z0?0KdkQQU?duW%?tkBgf(3RbpzO=|0=Re|MKhpkt0C%JKouM`5Se zz?VkQREysy@O=k96Lb9O2^DPrcLT&@2kOwJAi&%$U@#PTU9Wg#ubK;SK(Odw=R@C^Cpl_ z!3260?<>)Njq%|*z~fWk@#L?Co$f=Cp!qsoW zyS2j~HNqEM+%S*6g>O5JR)=?X?!y=x{P2hB8T10r1$+hCCB^|hG3J+GXZzAK(6xHl zq=3C<40T|iS`<#N!*ASxpRobnUih&H!0yR?^4zLf)E++iIlRxom`jWY_AIL=g0k7K zv#tP#AFy^Ka0qM;8@{1+x-Wgnx&~i$7W6-q6-sS2Ge`^AOz#g^car@s{NrcM0_spc zpRzE%f#()QkdfDiES|#JH(g$d2AW< ztwQNO0ejXO!}3ns_3@o|VQ<=CP_~cUq#{>&9C#6gx!0fJuOzdf|T-nE7wdzsP_&dKt--U|U z_H#($6ZVQ=tkGD4JzNt`GgRfgcrd?Mo3q*s4}OVmGA>s>lAf$DB5#1fOqPQiptPPWBLe#>8$mecS`tvaGO1 zA@(ji);tg1xq}B!GAzJM<9_)5BM!fpJonqV>$4enrRfx?*MBzrichZt%FVxYadiWOU`ixm+ZmvP^g^kE|rmozfJFn1-tLww=KGJp=) z)KkbKD~NgmrWLSbfkPepNOdr^L+n)so3kS>xW+Qq#!wesY}*FbEmMj|nM~)-V&C%W zVm~|Db-=zNz9Sy9+a2;UCk@e?vG4| zuv^6Jyf)~6gMS0&9?<>~;-#PP{S>bY{%@7w*J55fZ8VLL;Y07%$n*o=eulTR#BZX& zN2B=#I{=mpJHR*0vzm? zjK{WZ$?)>kW>-zmk^Ar%eZ1>JqpDjS`+8H72k;nTM;>y+oIdmf zzF#pX544GWK-JY&5$jSS`ziPy1;+$f)5^J#1b;pIe8gEV@$WQm@`pay;1^T)ckwie z5P2W=@$v=qG34OJ@85}cAC5i70^Mq;T=_8eoktuEzR{@aVaJ~Ml|I&GDoK8ueJ|EH z&in-L*Ymr~anxJl{f%VA7_v=+A3Gp}THb>M4%2BR;wl@*H5(Tq=SHq0^RqIpZEvHh zLpXA&72tJ>A)(`I+PLy9ZhB{2sQpk$DgJ8=ZBB<9qm|pOEJq z$q1&-j1zLlXy{D?;{ZOK+PHv1?j;7qP>#4}Fg~ywBa_CusJgm%y(p z&<8u`5{2U_T8_u>_OR?Q@2_abIi41H>Y5!1)^5M^ep4=s4S#Xu-{z{C*5_e)tc}*#lio z&Kg5Lsu9%gzkxW%lCXhku)+Pn_lk(`q}oxQY`Y=CpNLivBK&>RZ|)Og#yaM(|HL{M z;0LzlDCjxPS^pDwbDl2h5PnpRJ%H<2f|tVIgit;F@DK2DU%a4m;eUSHcjzRJ!(X#~;=?&1jRj#Y?n%V5z1I2m6#8(0wwcy|L;JdR-?j%vT2YiTnn1T6<~!{51% zhwqp9>;UZoVv1vkT`Y((VlnY8{%Wiu(Z-UP3lX2&DAlq-yM$7(z`BprG zrULIz!OLqLJ91uye2jCOx(y5HG}>oq`|D#Pf;-2b;QQK4t~~?_+}Zzq!*xpTXCAGaO8o(EBXpu(%11ZBlKz+cyObMh6uW#38yHA z%ds)=PXjLXIgT220p|{P;t6n1CkX>bwT) zR@KtZ?X^m`M+{0=e|?z8g{VIAu8|OAzuk2KANa*^VF|k`c=lxut5)I!C%ez^*4y}*xVA3hw=5C0& zRcjYIHIKZR2DS(IG&^7(QBQN^!g)dTBxG<-DV)i!f73RjaBFkY?bZQ8J#-53(uLF;di0?z1Ne>Vwb&B__d<7q z=``yazgJHo9oI!!?_sm2(Vl4HeN3C@^~(0&b1jqkZb}+pH>C{TUX?y%*ddkY9dit}AiaK~2##$5|tv1t2~;iI}Dy zc*k&@inwyMli%5s^%S*T6HWtRJGJmTvff){{|-1EwXtoDhWHLPV`4AXnMUBQ|5)AQ zUUQHZ<}|NB&~T3Jg6$i6R96w}5+m0ZH@!?l0rR*xTZj;KHXYjl%Yg69Fs{JgAavh{ z-eukAGhO6KiGuf2DIRjOOS)r+&CZp9S1h}4oG$KxYkc;>HAYkNz`e#~k3P-_?k*eM zW=D~)SM@qS|6Rq3=XT`#_Gs=iO=-iXz*a6)LHD?ht&ej#AfL-HudpW=n(R27u5b;S z`(U4(f7;&KoM)8yov+sT9onT)L^ECTxb5k~TuiBhHIRXo*V4tg z)>p)|njrTB|5;^o96SX6HpDHWuW%go2Cr`d=US0d`O;PB6YEah+VRx2B#e5jn?heR z{;Yq9Q7#uQbi{vEvDB?1x>b!np`)z#Crl}xO?8|tg`>Lz=Y7%{5VxCXwYy6EY}~3f z{-$kezot7`m>a<7SL~0lFYviksoV!&+7C8RFY2_@#rcdl7i1lR4>~H<$>+iM)Mq(- z&uQKl)=j42!2eXyj3)d~+9m#Km)`GN5!2ePPv|Ua)8>>xpKew4Yl_czXndyt-=D-8 zPO;w)yGj(xw`&xO`CgGYO94Ijo-Eb($(%8uGj!-6uceRgWUq*BeNc{Z+1Ek#=LG(a z^DTo)ir=6=Cia)mom?mUzhpfq45Oz(>$yAOzd42?Dq`F4c`oqp!{@F0cbD~P(utiK zzgM9zHznR1_pBMy!LCyM33P>no~wc`jpFc5wU5}p86NbnlGoxjD`MMTP^)gmH+&yR z#veBM5Bc5*d{BXef2D{w9r%CFHm;dWqk#X}Cj6sr>Cfh66z;&ki;VxFZCRcjWq8%= zyeC&nc!G|d)f#UR)4wOqwG`(B{zZzb+e-YJ_Fc%ZM8+Tcz?Jg!TlGxfzuyV}eX%f5S$}e&1e3PqY3QB>gcZ4?1f~9X3jaw`=W- zJ>hTmHl2ZL6lr`PuDVE32pg`G_|4m6AdZ9lFoq&Iv@3l_3L(@5h1ONBr z`z%iQe~xC7_TF<`Ps0& z6XXZ`e4KG~(4eTt=Y?Ci`&q&NqV44h!DBvmhW&nKl|M)th-J28%A3B zTq0`><%_cx#@~+;h5rvi{vSZS*nZZAky-ZtjQ_^@R3V??=%QPy;XiHc^QsV=SyBf7 zi(>_HdbSmh?g!kp)g|Km_eV*m&houLS@#)F_CJV+E*e!2!vDM4-dWo6Re24~9O}jA zz2b~2T<~8d_rZS}B>%GqEl|E6lRMrK*R2bq`PhG(_AmJ2@4*X!qb{c9NbFx{#JvUV zJ?0b-ni&X`gBfJ>mO^lXe#Qy|i27Gs@Zjv)zFAo1r^aai$vQazeMP zRTCfhZlk>a0v8+nkFU@<$R#I`{>3o^pR=dENPR)eciE16CIvjEG?Kbt&V{DRo_}Eey~FK z*YMf8&_mb-?C$L*{NWF|Mk92`aYvy};IE)$wGX+0|2iq>Jt&>g5o{o(h+}8T1|WkE z<-A27*XCheT>B4gYHMLzX9)UXj6DyeEt~^!knidHnyA7hc{X>yuPqxK32Rn z!)qyMnq$cr9%acG7K^;#E%>Yxrlfv?Zq`Aavi&Kk@(o z=mYO7GadL}LF_N;BCz8je9u$Vyn-QKA^t$e>QjU-+!_I`nd)%nPH+y^kT@ z?QP@ot_|!%ILG1~1$Jq-qz$$q7vTFuHKL_>HgL?$V|c6scei8MPrU6;a@sJL1_0Kv z;#m&f^SOQMScmQ)MjHYAPfEJ~Px*d044Y-JR??v}JWlB86zU8a?Bsh=k{vJ&$2TmZ zr(`*lzfLX{O7|tkrOF4fAIdGbmn;#Iuq8+SMZ(I1=#`O z4u3<=IEq$D@sh~n9d#?&maT{nk8M~eYFkZfuuL|oI=bpr9ee3kbR4XYbAQgDa(hu9 z*Kw3V)qa3h)ulUfl%Lg$HccZ}_?vvJT`T3iR?RfZkn>fx4e+%P`eBvM$q#al-h3TC zTZ9a@unh9X(RscjD(eZ`5M=s^TzlhMX8A(8ynYcaek;mxub}yQcYD~zkXQG|S_bC3 zz&(QM!24qPUIY7Vale4;R}S7=f2khIbfyQ;i+pbxb8OfT4)9%WxgYj42>xh&G1qM8 zO7+?WR0CO9(5CTSjC;8U!90=hUWRr=s(~`@KfzycouIos4tnDa+`p52Cg0EahiuPx zT$}R){+~jCxVvM^3!$U=V{hp?-&p~iNWeQO*UF{3^G~qt&mfaz(DL-AS47?ZHvQDj zrjFPL{V-MoefgI4rPNVR=Q|aLVXtH5I|=+`kEcPo{9lv+_Sb@K}&srPL>45G*R&I`u{nGW3R@VPwi9?z9nMp=QhlI!o%8Nlg+3AB>)PkD@} zjY6k1vuF|Ud6WM)Q#PBf|LhE7j$;pO!g&^b3q3T#FE0V#hdJ-l?DsfFhwQ(W?^wWI zZNU9a{?E_7;4VLW?g2eof_SN3oF9eI&HM@UN#O*V#1{pfT*g!!-g9rqSmNOxAg&6V$q zjHi0Y;@$j-mLLRC4lPHw`f08%tXLftr!@9y}M0}r&@7qEz)#98am>P4&G~JD1+|Tfx z|JB|<_w&E;X~Fl}GW=-@;2f6fMe>=u6|`IhEho?pfF2{?~0rYMu z#^j*ig!Vb+oW}g?d^X5<3!Xc2@