Streamlitã§ã¢ããªéçºãè¡ããããã®ã®ã
ã»ä»ã®Webãã¬ã¼ã ã¯ã¼ã¯ã¨ã®éããåãããªãâ¦ã
ã»æ©è½ãä½¿ãæ¹ãç¥ãããâ¦ã
ã¨ããæ¹ãå¤ãã®ã§ã¯ãªãã§ãããããããã§ãã®è¨äºã§ã¯ã
ã»Streamlitã®ç¹å¾´ã主ãªç¨é
ã»ã¤ã³ã¹ãã¼ã«ãåºæ¬çãªæ©è½ã®ä½¿ãæ¹
ã«ã¤ãã¦ãç´¹ä»ãã¾ãã
Streamlitã®å©ç¨ãåãã¦ã®æ¹ã§ãããã®è¨äºãèªãã°ãã¢ããªã®ä½ææ¹æ³ããã¼ã¿ãå¯è¦åããæ¹æ³ããããã¾ãã
å ¬éæ¥ï¼2022å¹´7æ29æ¥
ï¼¼æåããåç»ã§å¦ã³ããããªãã¸ï¼
Udemyã§è¬åº§ãæ¢ã ï¼
ç£ä¿®
å°éé åï¼AIããã¼ã¿ãµã¤ã¨ã³ã¹ããã¸ã¿ã«ãã¼ã±ãã£ã³ã°ãããã°ã©ãã³ã°
ã¦ããã ï¼ä¸éä½é¦¬ï¼
ããã¼ã¿ãµã¤ã¨ã³ã¹ãAIã®åã§ã¤ã¾ããªãéå¹çãæ¸ãããããããéå¹çãå¢ãããããã¸ã§ã³ã®WW inc.ã®ä»£è¡¨åç· å½¹ç¤¾é·ãæ¥ç³»å¤§æâå¤è³ç³»âAIã¹ã¿ã¼ãã¢ããã§ãã¼ã¿åæããã¸ã¿ã«ãã¼ã±ãã£ã³ã°ãçµé¨ãå¤ãã®äººã«ãã£ã¨ãã¼ã¿ãµã¤ã¨ã³ã¹ã身è¿ã«æãã¦ãããã¹ãæã«10ä¸äººã訪ãããã¹ã¿ãã¸ãã¨ããã¡ãã¤ã¢ã§ãã¼ã¿ãµã¤ã¨ã³ã¹ã®é¢ç½ããçºä¿¡ä¸ãèæ¸ã«ããã¼ã¿ãµã¤ã¨ã³ã¹å¤§å ¨ããæ¼«ç»ã§ããããã¸ã¿ã«ãã¼ã±ãã£ã³ã°Ããã¼ã¿åæããªã©ã
â¦ç¶ããèªãINDEX
- Pythonã®ã¿ã§ã¢ããªéçºã§ããStreamlitã¨ã¯ï¼
- Streamlitã®ç¹å¾´ã¨å©ç¨ç¨é
- Streamlitã®ã¤ã³ã¹ãã¼ã«ã¨ã¢ããªã®ä½ææ¹æ³
- Streamlitã®åºæ¬çãªæ©è½ã®ä½¿ãæ¹ãç´¹ä»ï¼
- Streamlitã§ã°ã©ãã使ã£ã¦ãã¼ã¿ãå¯è¦åãããï¼
- Streamlitã使ã£ã¦Webã¢ããªãæ§ç¯ãã¦ã¿ãã
Pythonã®ã¿ã§ã¢ããªéçºã§ããStreamlitã¨ã¯ï¼
Streamlitã¨ã¯ãPythonã§Webã¢ããªã±ã¼ã·ã§ã³ã使ããããã®ãã¬ã¼ã ã¯ã¼ã¯ã§ãã
ãã¼ã¿ãµã¤ã¨ã³ãã£ã¹ããAIã¨ã³ã¸ãã¢åãã«éçºããã¦ãããããã¯ã¨ã³ãéçºã®ç¥èããªãã¦ãPythonã®ã³ã¼ããæ°è¡æ¸ãã ãã§ãæ°è»½ã«ãã¢ç¨ã®ã¢ããªã使ãããã¨ãã§ããã®ãç¹å¾´ã§ãã

ã
ï¼¼æåããåç»ã§å¦ã³ããããªãã¸ï¼
Udemyã§è¬åº§ãæ¢ã ï¼Streamlitã®ç¹å¾´ã¨å©ç¨ç¨é
Streamlitã®ä¸çªã®ç¹å¾´ã¯æè»½ã«éçºã§ãããããæçä¸è¡ã®ã³ã¼ãã§Webã¢ããªãéçºã§ãã¦ãã¢ããªã®ãããã¤ã容æã«è¡ãã¾ããè¤éãªã³ã¼ããçè§£ã§ããªãæ¹ã§ãStreamlitã®ã³ã¼ãã§ããã°ç´æçã«çè§£ããªããéçºãããã¨ãã§ãã¾ãã
WebUIãç°¡åã«ä½æã§ãããããã¢ããªãã²ã¨ã¾ãåããã©ãããç´ æ©ã確èªãããå ´åã«é©ãã¦ãã¾ãã
ã¾ããStreamlitã¯HTMLãCSSãªã©ã®ç¥èãè¦ãããã¨ãªããã¼ã¿ã®å¯è¦åãå¯è½ã§ã主ã«ãã¼ã¿ãµã¤ã¨ã³ã¹é åãªã©ãå¤ãåçã«å¤æ´ããWebã¢ããªã«ç¨ãããããã¨ãå¤ãã§ãã
ä»ã«ããå®è¡ä¾ãå¼ã³åºãã³ãã³ããæºåããã¦ããããå ¬å¼ããã¥ã¡ã³ããå å®ãã¦ãããããã®ã§ã¨ã¦ãå¦ç¿ããããã®ãç¹å¾´ã§ãã

ä»ã®Webãã¬ã¼ã ã¯ã¼ã¯ã¨ã®éã
Pythonã®Webãã¬ã¼ã ã¯ã¼ã¯ã«ã¯ãStreamlit以å¤ã«ãDjangoãFlaskãªã©ãããã¾ãã
Djangoã¯ããã¼ã¿ãã¼ã¹æä½ããã©ã¼ã ã®ç®¡çãªã©ãå¹ åºãæ©è½ãåãããã¬ã¼ã ã¯ã¼ã¯ã§ããå¤§è¦æ¨¡ãªWebã¢ããªãéçºããéã«ãDjangoãå½¹ç«ã¡ã¾ããFlaskã¯æå°éã®æ©è½ãåãããã¬ã¼ã ã¯ã¼ã¯ã§ãåä½ã®è»½ããæ¡å¼µã®æè»æ§ãç¹å¾´ã§ãã
ãããã®Webãã¬ã¼ã ã¯ã¼ã¯ã¨Streamlitã®éãã¨ãã¦ããã¼ã¿ãµã¤ã¨ã³ã¹ãæ©æ¢°å¦ç¿ã«ç¹åãã¦ãããã¨ãæãããã¾ããã¾ããStreamlitã§ã¯ä»ã®Webãã¬ã¼ã ã¯ã¼ã¯ãããã·ã³ãã«ãªã³ã¼ãã§ã¢ããªãå®è£ ã§ãã¾ãã
ãã ããStreamlitã¯ç°¡æçãªæ©è½ã«éããããããå¤§è¦æ¨¡ãªWebã¢ããªãéçºãããå ´åã¯Djangoãªã©ã®å¥ã®ãã¬ã¼ã ã¯ã¼ã¯ã使ç¨ãã¾ãããã
| Streamlit | Django | Flask | |
| ã³ã¹ã | ä½ã | é«ã | ä¸ |
| æ©è½ | ç°¡æçãªæ©è½ | å¹ åºãæ©è½ | æå°éã®æ©è½ |
| Python/JavaScriptç¥è | ä¸è¦ | å¿ è¦ | å¿ è¦ |
| HTML/CSSç¥è | ä¸è¦ | å¿ è¦ | å¿ è¦ |
| 徿é å | ã¹ãã¼ãéè¦ã®Webã¢ããªéçºããã¼ã¿ãµã¤ã¨ã³ã¹ã»æ©æ¢°å¦ç¿ | å¤§è¦æ¨¡ã§æ¬æ ¼çãªWebã¢ããªéçº | å°è¦æ¨¡ã§ç°¡åãªWebã¢ããªéçº |
Djangoã«ã¤ãã¦ã¯ãDjango(ã¸ã£ã³ã´)ã¨ã¯ï¼Pythonã®ãã¬ã¼ã ã¯ã¼ã¯ãæ´»ç¨ããWebéçºã«å½¹ç«ã¦ãããã§è©³ãã解説ãã¦ãã¾ãã
ã
Streamlitã®ã¤ã³ã¹ãã¼ã«ã¨ã¢ããªã®ä½ææ¹æ³
ããããã¯ãStreamlitã®åºæ¬çãªæä½ã確èªãã¦ããã¾ãããæ¬è¨äºã§ã¯Pythonãã¤ã³ã¹ãã¼ã«ãããç°å¢ãåæã¨ãã¦èª¬æãã¦ããã¾ãã
ç°å¢æ§ç¯ã«ã¤ãã¦ã¯ãPythonã®éçºç°å¢ã¯ã©ãããã°ããï¼çµ±åéçºç°å¢ãã¾ã¨ãã¦è§£èª¬ï¼ãã§è©³ãã解説ãã¦ãã¾ãã
ã¾ããVSCodeã®ã¿ã¼ããã«ãéã以ä¸ã®ã³ãã³ããå®è¡ãã¦ã¤ã³ã¹ãã¼ã«ãè¡ãã¾ãã
|
1 |
pip install streamlit |
以ä¸ã¯ã¤ã³ã¹ãã¼ã«ãå®äºããæã®ç»é¢ã§ãã

anacondaã§ä»®æ³ç°å¢ãæ§ç¯ãã¦ããã¤ã³ã¹ãã¼ã«ããå ´åã¯ä»¥ä¸ã®ã³ãã³ããå®è¡ãã¾ãã
|
1 |
conda install -c conda-forge streamlit -y |

次ã«ãµã³ãã«ã¢ããªãå®è¡ãã¦ã¿ã¾ãã
以ä¸ã®ã³ãã³ããå®è¡ãããã¢ç°å¢ãç«ã¡ä¸ãã¾ãã
|
1 |
streamlit hello |
å®è¡ããã¨ä»¥ä¸ã®ããã«è¡¨ç¤ºãããã©ã¦ã¶ãç«ã¡ä¸ããã¾ãã

ãã©ã¦ã¶ãéãã¨ä»¥ä¸ã®ç»é¢ã表示ããã¾ãã

ç»é¢å·¦ã®Select a demo aboveããæ§ã ãªãµã³ãã«ã¢ããªã確èªã§ãã¾ãã
æå¾ã«ã¢ããªãä½ã£ã¦ã¿ã¾ããã¾ãã¯ãå ¬å¼ããã¥ã¡ã³ãã確èªãã¦ã¿ã¾ãããã

ä¸è¨ç»åã赤æ ã®Componentsã§Streamlitã®æ¡å¼µæ©è½ã確èªã§ãã¾ãããµã¼ããã¼ãã£ã®ã¢ã¸ã¥ã¼ã«ãå©ç¨ãããã¨ã§ããå¹ççã«Webã¢ããªã使ã§ããã®ã§ãã²å©ç¨ãã¦ããã¾ãããã
äºåæºåã¨ãã¦app.pyã¨ãããã¡ã¤ã«ã使ãã¦ãã ããã使å¾ã以ä¸ã®ã½ã¼ã¹ã³ã¼ããè¨è¿°ãã¾ãããã
2è¡ã®ç°¡åãªã³ã¼ãã§ãã
|
1 2 3 |
import streamlit as st st.title("hello") |
ã³ã¼ãã®ä½æãå®äºãããã¿ã¼ããã«ã§ä»¥ä¸ã®ã³ãã³ããå®è¡ãã¾ãããã
|
1 |
streamlit run app.py |
å®è¡ããã¨ã覧ã®ãã¼ã¸ã表示ããã¾ãã

ã
Streamlitã®åºæ¬çãªæ©è½ã®ä½¿ãæ¹ãç´¹ä»ï¼
Streamlitã§ã¯ããã¿ã³ãããã¹ãå ¥åãã©ã¼ã ãªã©ãWebã¢ããªã«å¿ è¦ãªæ©è½ãç°¡åãªã³ã¼ãã§å®è£ ã§ãã¾ããããã§ã¯ã以ä¸ã®Streamlitã®åºæ¬çãªæ©è½ã®ä½¿ãæ¹ãè¦ã¦ããã¾ãããã
âã¿ã¤ãã«ã»ãããã¼ã»ããã¹ã
âãã¿ã³ã»ã©ã¸ãªãã¿ã³
âãã§ãã¯ããã¯ã¹ã»ã»ã¬ã¯ãããã¯ã¹
âããã¹ãå
¥åãã©ã¼ã
âã¡ãã¥ã¼ãªã¹ã
ã¿ã¤ãã«ã»ãããã¼ã»ããã¹ã
ã¿ã¤ãã«ããããã¼ãããã¹ãã表示ããã«ã¯ãä¸è¨ã®ãããªã³ã¼ããè¨è¿°ãã¾ãã
|
1 2 3 4 5 |
ã import streamlit as st st.title("ããã«ã¿ã¤ãã«ãå
¥å") st.header("ããã«ãããã¼ãå
¥å") st.text("ããã«ããã¹ããããã¹ã") |
ã³ã¼ããå®è¡ããã¨ãã¿ã¤ãã«ã¨ãããã¼ãããã¹ãã表示ããã¾ãã

ãã¿ã³ã»ã©ã¸ãªãã¿ã³
ãã¿ã³ã表示ããã¯ãªãã¯ãããæã«ä½ããã®ã¢ã¯ã·ã§ã³ãè¡ãã³ã¼ãã®ä¾ã¯æ¬¡ã®éãã§ãã
|
1 2 3 4 5 |
ã import streamlit as st if st.button('ãã¿ã³'): st.write("ãã¿ã³ãã¯ãªãã¯ããã¾ããã") |
ãã®ã³ã¼ãã§ã¯ããã¿ã³ãã¯ãªãã¯ããæã«ããã¹ãã表示ããã¾ãã

ã©ã¸ãªãã¿ã³ã表示ããã³ã¼ãä¾ã¯æ¬¡ã®éãã§ãã
|
1 2 3 4 5 6 7 8 9 10 |
ã import streamlit as st stock = st.radio(label='ããããé
ç®ã鏿ãã¦ãã ãã', options=('ã¿ãã', 'ã¬ã¢ã³', 'æ¡'), index=0, horizontal=True, ) st.write(stock+"ã鏿ããã¾ããã") |
ä¸è¨ã®ã³ã¼ãã§ã¯ãã¯ãªãã¯ããã©ã¸ãªãã¿ã³ã«å¿ãã¦ã表示ããããã¹ããåãæ¿ããã¾ãã

ãã§ãã¯ããã¯ã¹ã»ã»ã¬ã¯ãããã¯ã¹
ãã§ãã¯ããã¯ã¹ãå®è£ ããã³ã¼ãä¾ã¯æ¬¡ã®éãã§ãã
|
1 2 3 4 5 |
ã import streamlit as st if st.checkbox('ããã¹ãã表示'): st.write("ãã§ãã¯ãå
¥ã£ã¦ãã¾ãã") |
ãã®ã³ã¼ãã§ã¯ããã§ãã¯ãå ¥ã£ã¦ããæã ãããã¹ãã表示ããã¾ãã

è¤æ°ã®é ç®ãã鏿ã§ããã»ã¬ã¯ãããã¯ã¹ã®ã³ã¼ãä¾ã¯æ¬¡ã®éãã§ãã
|
1 2 3 4 5 6 7 8 9 |
ã import streamlit as st fruit = st.selectbox( 'ãããªæç©ã¯ï¼', ['ã¿ãã', 'ãªã³ã´', '梨'] ) 'ç§ã®å¥½ããªæç©ã¯', fruit, 'ã§ãã' |
鏿ããé ç®ã«å¿ãã¦ããã¹ãã®å 容ãå¤åãã¾ãã


ããã¹ãå ¥åãã©ã¼ã
ããã¹ãå ¥åãã©ã¼ã ãå®è£ ããã³ã¼ãä¾ã¯æ¬¡ã®éãã§ãã
|
1 2 3 4 5 |
ã import streamlit as st sampletext = st.text_input('å
¥åé
ç®', max_chars=12, help='12æå以å
ã§å
¥åãã¦ãã ããã') st.write('ããªãã¯ã'+sampletext+'ãã¨å
¥åãã¾ããã') |
ä¸è¨ã®ã³ã¼ããå®è¡ããã¨ããã©ã¼ã ã«å ¥åããæååãä¸é¨ã«è¡¨ç¤ºããã¾ãã

ã¡ãã¥ã¼ãªã¹ã
è¤æ°é¸æãå¯è½ãªã¡ãã¥ã¼ãªã¹ãã使ããã³ã¼ãä¾ã¯æ¬¡ã®éãã§ãã
|
1 2 3 4 5 6 7 8 |
ã import streamlit as st foods = ['ã¾ãã', 'ãã', 'ããã', 'å³åæ±', 'è¶ç¢è¸ã'] order = st.multiselect('ã¡ãã¥ã¼ãé¸ãã§ãã ãã',foods) st.write(f'ãæ³¨æã®ååã¯{order}ã§ãã') |
ã³ã¼ãå ã®ãst.write()ãã®åé ã«ãããfãã¯ãPythonã®ãã©ã¼ãããæååã使ç¨ããããã®ã³ãã³ãã§ããããã§ã¯ã夿°ãorderãã{}ã§å²ããã¨ã§ãã¡ãã¥ã¼ãªã¹ããã鏿ãããé ç®ãããã¹ãå ã«åãè¾¼ãã§ãã¾ãã

ã
Streamlitã§ã°ã©ãã使ã£ã¦ãã¼ã¿ãå¯è¦åãããï¼
ããã§ã¯Streamlitã§ã°ã©ããæç»ããæ¹æ³ããç´¹ä»ãã¾ãã
ç°¡åãªè¡¨ãã°ã©ãã表示ãã
表ãã°ã©ãã表示ããéã¯Streamlitã«å ãã¦ã次ã®ãããªã³ã¼ãã§ãnumpyãããpandasããªã©ã®ã©ã¤ãã©ãªãã¤ã³ãã¼ããã¾ãããã
|
1 2 3 4 |
ã import streamlit as st import numpy as np import pandas as pd |
表ã使ããã³ã¼ãä¾ã¯æ¬¡ã®éãã§ããããã§ã¯ãã製åã®é·ããéãã表ã«ããããã®ã³ã¼ããç´¹ä»ãã¾ãã
|
1 2 3 4 5 6 7 8 9 10 |
ã import streamlit as st import numpy as np import pandas as pd df = pd.DataFrame({ 'é·ã': [100, 200, 300, 400], 'éã': [150, 300, 450, 600], }) st.write(df) |
表ã«å«ãããã¼ã¿ã¯ãã³ã¼ãã¨ãã¦è¿½å ã§ãã¾ãã

æ£ã°ã©ãã表示ããã³ã¼ãä¾ã¯æ¬¡ã®éãã§ããããã§ã¯ãã«ããã®å£²ãä¸ããæ£ã°ã©ãã§è¡¨ç¤ºããã®ã³ã¼ããç´¹ä»ãã¾ãã
|
1 2 3 4 5 6 7 8 9 10 |
ã import streamlit as st import pandas as pd data = pd.DataFrame({ 'åå': ['ãã', 'ããã', 'ããã'], '売ä¸': [35, 23, 57] }) st.bar_chart(data.set_index('åå')) |

æãç·ã°ã©ãã¯ã次ã®ãããªã³ã¼ãã§è¡¨ç¤ºã§ãã¾ããããã§ã¯ããæéã®å£²ãä¸ããæãç·ã°ã©ãã§è¡¨ç¤ºããããã®ã³ã¼ããç´¹ä»ãã¾ãã
|
1 2 3 4 5 6 7 8 9 10 11 |
ã import streamlit as st import pandas as pd import numpy as np data = pd.DataFrame({ 'æ¥ä»': pd.date_range(start='2024-05-01', end='2024-05-06'), '売ä¸': [100, 120, 130, 80, 100, 150] }) st.line_chart(data.set_index('æ¥ä»')) |

ãããã®ã»ãã«æ£å¸å³ãªã©ã®ã°ã©ãã使ã§ãã¾ãã
Matplotlibã§ããåã£ãã°ã©ãã表示ãã
ããèªç±åº¦ã®é«ãã°ã©ãã使ãã¦è¡¨ç¤ºãããå ´åã¯Matplotlibãç¨ãã¦ã°ã©ãã使ãã¾ãããã
以ä¸ã®ã³ãã³ããå®è¡ããMatplotlibãã¤ã³ãã¼ããã¾ãã
|
1 |
import matplotlib.pyplot as plt |
Matplotlibã«ã¦ã°ã©ãã®è©³ç´°ãè¨å®ããst.pyplot()ã¨ãã颿°ã®å¼æ°ã«ä½æããã°ã©ããä¸ããã°ã°ã©ãã表示ããã¾ããMatplotlibã使ã£ã¦æãç·ã°ã©ãã表示ããã³ã¼ãä¾ã¯æ¬¡ã®éãã§ãã
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
ã import streamlit as st import matplotlib.pyplot as plt import pandas as pd dates = pd.date_range(start="2024-05-01", end="2024-05-06") sales = [100, 120, 130, 180, 100, 150] fig, ax = plt.subplots() ax.plot(dates, sales, marker='o') # ã°ã©ãã®ã¿ã¤ãã«ã¨ã©ãã«ãè¨å® ax.set_title("Profits") ax.set_xlabel("date") ax.set_ylabel("profit") # Xè»¸ã®æ¥ä»ã®å½¢å¼ãèª¿æ´ ax.xaxis.set_major_formatter(plt.FixedFormatter(dates.strftime('%Y-%m-%d'))) # X軸ã®ã©ãã«ã®åããèª¿æ´ plt.xticks(rotation=45) # Streamlitã使ã£ã¦ã°ã©ãã表示 st.pyplot(fig) |

Matplotlibãæ´»ç¨ããã¨ãã°ã©ãå
ã«ãã¼ã¿ã®åç§°ã軸ã®ååãªã©ãåããããã表示ã§ãã¾ãã
Matplotlibã®ä½¿ãæ¹ã«ã¤ãã¦è©³ããã¯ãPythonã§ã°ã©ãæç»ããæ¹æ³ã解説ãMatplotlibã使ãã°ç°¡åï¼ããã覧ãã ããã
ã
Streamlitã使ã£ã¦Webã¢ããªãæ§ç¯ãã¦ã¿ãã
ãã®è¨äºã§ã¯Pythonã®ã¿ã§Webã¢ããªéçºãã§ããStreamlitã«ã¤ãã¦ãç¹å¾´ãä½¿ãæ¹ããç´¹ä»ãã¾ããã
Streamlitãæ´»ç¨ããã¨ãç°¡åãªã³ã¼ããè¨è¿°ããã ãã§ã表ãã°ã©ãã使ã£ããã¼ã¿ã®å¯è¦åãã§ãã¾ãã
Streamlitã使ã£ãã¢ããªéçºã«ã¤ãã¦è©³ããå¦ã³ããæ¹ã«ã¯ãä¸è¨ã®è¬åº§ãããããã§ãã
Webã¢ããªã®éçºãå¹çåãããæ¹ã¯ããã²Streamlitãæ´»ç¨ãã¾ãããã
ãåå¿è åããPythonã®Streamlitã®åºç¤ãå¦ãã§å¯è¦åããã·ã¥ãã¼ããæ©æ¢°å¦ç¿Webã¢ããªãä½ã£ã¦ã¿ããï¼

å ¨ã¦ãPythonã§å®çµããé常ã«ä¾¿å©ãªStreamlitã®åºæ¬çãªä½¿ãæ¹ãå¦ãã§è²ããªãªããã·ã¥ãã¼ããWebã¢ããªãä½ã£ã¦ã¿ããï¼
ï¼¼ç¡æã§ãã¬ãã¥ã¼ããã§ãã¯ï¼ï¼
è¬åº§ãè¦ã¦ã¿ãè©ä¾¡ï¼â
â
â
â
â
å
¨ä½çã«é£æåº¦ãä½ãã§åãçµã¿ãããã³ã¼ã¹ãæ±ºå®æ¨ã®èª¬æãããããããããããè¦ãã ãã§ã価å¤ãããã
è©ä¾¡ï¼â
â
â
â
â
èãåãããããä¸ããã®é çªèª¬æãããã










ææ°æ å ±ã»ãã£ã³ãã¼ã³æ å ±çºä¿¡ä¸