-
Notifications
You must be signed in to change notification settings - Fork 0
/
content.json
1 lines (1 loc) ยท 52.3 KB
/
content.json
1
{"pages":[],"posts":[{"title":"Hello World","text":"Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick StartCreate a new post1$ hexo new \"My New Post\" More info: Writing Run server1$ hexo server More info: Server Generate static files1$ hexo generate More info: Generating Deploy to remote sites1$ hexo deploy More info: Deployment","link":"/2020/05/11/hello-world/"},{"title":"Hexo๋ฅผ ์ด์ฉํด์ github.io blog ๋ง๋ค๊ธฐ","text":"Hexo๋ฅผ ์ด์ฉํด์ github.io blog ๋ง๋ค๊ธฐ1234Hexo๋ ๋ฌด์์ธ๊ฐ์? (์ฐธ์กฐ https://hexo.io/ko/docs/)Hexo๋ ๋น ๋ฅด๊ณ ๊ฐ๋จํ๊ณ ํ์ํํ ๋ธ๋ก๊ทธ ํ๋ ์์ํฌ์
๋๋ค. Markdown(๋๋ ๋ค๋ฅธ ์ธ์ด)์ ์ฌ์ฉํ์ฌ ํฌ์คํธ๋ฅผ ์์ฑํ๋ฉด Hexo๋ ๊ธ์ธ ๋ฉ์ง ํ
๋ง๋ฅผ ๊ฐ๋ฏธํด์ ์ ์ ์ธ ํ์ผ์ ์์ฑํด ๋๋ฆฝ๋๋ค. ๊ตฌ๋ฆ ์ฌ์ดํธ ์ ์ ์ดํ ๊ณ์ ์ ์์ฑํ๋ค. (์ฐธ์กฐ https://ide.goorm.io/?plan=ZnJlZQ== ) ์๋ก์ด ์ปจํ
์ด๋๋ฅผ ์์ฑํด๋ฆญํ๋ค. ์ด๋ฆ, ์ค๋ช
์ ๋ฑ๋กํ๊ณ ์ํํธ์จ์ด ์คํ์ Node.js๋ฅผ ์ ํํ๋ค. ์ปจํ
์ด์ ์์ฑ์ ํด๋ฆญํ๋ค. ์๋ก์ด ์ปจํ
์ด๋๊ฐ ์์ฑ๋๋ฉด ์๋ก์ด ๊ตฌ๋ฆIDE์ ํ์ด์ง๊ฐ ์คํ๋๋ค. ๊ตฌ๋ฆIDE์ ์ข์ธก์ ํด๋๊ฐ ์๋ซ์ชฝ์ ํฐ๋ฏธ๋์ด ์คํ๋๋ค. ๊ตฌ๋ฆIDE์ ํฐ๋ฏธ๋์ Hexo๋ฅผ ์ค์นํ๊ธฐ ์ํด์ ์๋์ ๋ช
๋ น์ ์คํํ๋ค. -g global 1npm install hexo-cli -g Hexo๋ฅผ ์ด๊ธฐํํ๋ค. hexoblog๋ ๊ตฌ๋ฆIDE์ ์ข์ธก์ ์์ฑ๋๋ ํด๋์ด๋ฆ์ด๋ค. 1hexo init hexoblog ํ์ฌ ๋๋ ํ ๋ฆฌ ํ์ธ ์ดํ 4๋ฒ์์ ์์ฑํ ํด๋๋ก ์ด๋ํ๋ค. 1234root@goorm:/workspace/blog# pwd/workspace/blogroot@goorm:/workspace/blog# cd hexoblog/root@goorm:/workspace/blog/hexoblog# ํฐ๋ฏธ๋์ npm install์ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ค. 1npm install themes๋ฅผ ์ค์นํ๋ค. 12์ ๋นํ Themes์ ์ ๋ชฉ์ ํด๋ฆญํ๋ฉด github ํ์ด์ง๋ก ์ด๋ํ๋ค.Clone or Download๋ฅผ ํด๋ฆญํ๊ณ URL์ ๋ณต์ฌํ๋ค. ๊ตฌ๋ฆIDE์ ํฐ๋ฏธ๋์ ๋ณต์ฌํ clone ์ ๋ณด์์ โ.gitโ๋ฅผ ์ญ์ ํ๊ณ hexo-theme-icarus๋ hexoblog๋ก ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ค. 12git clone https://github.com/ppoffice/hexoblog npm install ์ข์ธก ํด๋์์ hexoblog/themes/_config.yml์ ํ์ผ์ ์ด๊ณ Extension์ผ๋ก ์ด๋ํด์ theme์ landscape๋ฅผ hexoblog๋ก ๋ณ๊ฒฝํ๋ค. 1theme: hexoblog hexo server์ port๋ฅผ openํ๋ค. port ํ์ธ์ ํ๋ก์ ํธ -> ์คํ URL๊ณผ ํฌํธ์์ ํ์ธ ๊ฐ๋ฅ 12root@goorm:/workspace/blog/hexoblog/themes# hexo server -p 3000 hexo plug-in 1Code Block","link":"/2020/05/11/blog/"},{"title":"github pages ํ์ฉํ๊ธฐ","text":"์๋ก์ด Repositories๋ฅผ ์์ฑํ๋ค. Repositories์ ์ด๋ฆ์ URL์ ์์ฑํ๋ ๊ธฐ์ค์ด๋ค. ์ฌ์ฉ์ID.github.io๋ฅผ ์ถ์ฒํ๋ค. (์ฐธ์กฐ csbcp.github.io) github์ url์ ๋ณต์ฌํ๊ณ _config.yml์ # Deployment๋ก ์ด๋ํ๋ค. type, repo, branch๋ฅผ ๋ฑ๋กํ๋ค. 1234deploy: type: git repo: https://github.com/csbcp/csbcp.github.io branch: master github์ deploy ์ด์ ์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํ๋ค. 1npm install hexo-deployer-git --save github์ ํ์ผ์ ์ฌ๋ฆด๋์๋ ์ ์ ํ์ผ ํํ๋ก deploy๋ฅผ ํด์ผํ๋ฏ๋ก generate๋ฅผ ์คํํ๋ค. 1hexo generate deploy์ ํ์ํ ์ ๋ณด๋ฅผ ์ค์ ํ๋ค. 123git config --global user.email \"charles\" global user.name \"charles\" git config --global user.email \"[email protected]\" github์ deploy ํ๋ค. 1root@goorm:/workspace/blog/hexoblog/themes# hexo deploy 12Tip์ผ์ ์๊ฐ hexo IDE๋ฅผ ์ด์ฉํ์ง ์์ผ๋ฉด ์ ์์ด ๋์ด์ง๋ค. ์ด๋ด๋๋ ํฐ๋ฏธ๋ํญ์ refresh ์ด๋ฏธ์ง๋ฅผ ํด๋ฆญํ๋ฉด ์ฌ์ ์๋๋ค.","link":"/2020/05/11/hexo-using/"},{"title":"Jasper Studio ๋ฉ๋ด์ผ (v0.1)","text":"Jasper Studio1. Jasper Studio ์ค์นJasperSoft ์ฌ์ดํธ์ ์ ์ํด์ ํ์ผ์ ๋ค์ด๋ก๋ํ๋ค.JasperSoft ์ฌ์ดํธ์์ User Guide๋ฅผ ์ ๊ณตํ๊ณ ์์ผ๋๊ถ๊ธํ ์ฌํญ์ ์ฐธ๊ณ ๋ฐ๋๋ค. 12$ ๊ธฐ๋ณธ ์ค์ ๋ฐฉ๋ฒJasperSoft Download (https://community.jaspersoft.com/project/jaspersoft-studio/releases) 2. Oracle ์ค์ JasperSoft์ ์ข์ธก๋ฉ๋ด์์ Data Adapters์ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ์ ํด๋ฆญํด์ Create Data Adapters๋ฅผ ํด๋ฆญํ๋ค. Database JDBC Connect์ ์ ํํ๊ณ Next๋ฅผ ํด๋ฆญํ๋ค. Oracle ์ ์์ ๋ณด๋ฅผ ๋ฑ๋กํ๋ค. JDBC Url, Username, Password๋ ์ ์ํ๋ ์ฌ์ดํธ์ ๋ง๊ฒ ์ค์ ํ๊ณ ํ๋จ์ Test๋ฅผ ํด๋ฆญํ๋ค. 123456$ ์ค๋ผํด ๊ธฐ๋ณธ ์ค์ ์ ๋ณดName:Charles DBJDBC Driver:oracle.jdbc.driver.OracleDriverJDBC Url:jdbc:oracle:thin:@//127.0.0.1:1521/CharlesUsername:charlesPassword:xxxxxx Data Adapter Wizard ํ๋จ์ Driver Classpath๋ก ์ด๋ํ๊ณ Add๋ฅผ ํด๋ฆญํด์ Oracle JDBC Driver ํ์ผ์ ์์น๋ฅผ ์ค์ ํ๋ค. Oracle JDBC Driver Download Successful ํ์
๋ฉ์์ง๊ฐ ๋ณด์ด๋ฉด Finish๋ฅผ ํด๋ฆญํด์ DB ์ ์์ ๋ง๋ฌด๋ฆฌํ๋ค. 3. Server ์ ์ ์ ๋ณด ์ค์ JasperSoft์ ์ข์ธก๋ฉ๋ด์์ Servers์ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ์ ํด๋ฆญํด์ Create JasperReports Server Connection๋ฅผ ํด๋ฆญํ๋ค. JasperReports Server ์ ์์ ๋ณด๋ฅผ ๋ฑ๋กํ๋ค TIBCO Jaspersoft Studio User Guide. Name, URL, User, Password๋ ์ ์ํ๋ ์๋ฒ์ ์ ๋ณด๋ฅผ ์
๋ ฅํ๊ณ ํ๋จ์ Test๋ฅผ ํด๋ฆญํ๋ค. 12345$ JasperReports Server ๊ธฐ๋ณธ ์ค์ ์ ๋ณดName:JasperReports Server ProURL:http://localhost:8080/jasperserver-pro/Username:charlesPassword:xxxxxx Successful ํ์
๋ฉ์์ง๊ฐ ๋ณด์ด๋ฉด Finish๋ฅผ ํด๋ฆญํด์ jasperReports Server ์ค์ ์ ๋ง๋ฌด๋ฆฌํ๋ค. 4. Repository ์์ฑSource๋ฅผ ์ ์ฅ ํ ํด๋๋ฅผ ์์ฑํ๋ค. ํ๋ก์ ํธ๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ ์์ค ๊ด๋ฆฌ๋ฅผ ์ํด์ git์ Repositories๋ฅผ ์์ฑํด์ ์งํํ๋๊ฒ์ ๊ถ๊ณ ํ๋ค. 123$ Source ํด๋ ์์ฑ$ git์ Repositories ์์ฑ$ Source ํด๋์์ git clone ์ํ Source Import ์งํ 1234JasperSoft -> File -> Import ํด๋ฆญGeneral -> Existing Project into Workspace ์ ํ ์ดํ Next ํด๋ฆญBrowe..๋ฅผ ํด๋ฆญํด์ ์์ฑํ Source ํด๋ ์ฐ๊ฒฐFinish ํด๋ฆญ","link":"/2020/05/11/jasper-studio/"},{"title":"jasper-coffee","text":"Jasper Report ์ค์ตJasperSoft studio๋ฅผ ์ด์ฉํด์ ๊ฐ๋จํ ์ํ ๋ณด๊ณ ์๋ฅผ ๋ง๋ ๋ค. 12$ file -> new -> jasper report -> Invoice๋ฅผ ์ ํ ์ดํ next ํด๋ฆญ$ ์๋ก์ด ๋ณด๊ณ ์๋ฅผ ์ ์ฅํ ํด๋ ๋ฐ ํ์ผ ์ด๋ฆ ์
๋ ฅ ์ดํ next ํด๋ฆญ ๋ณด๊ณ ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก Title, Column Header, Detail 1, Last Page Footer์ Band๋ก ๊ตฌ์ฑ๋๋ค. 1234$ Title : ๋ณด๊ณ ์์ ์ฒซํ์ด์ง์ ์ถ๋ ฅ๋๋ ๋ฐด๋์ด๋ค. (์:ํ์ฌ์ด๋ฆ, ํ์ฌ์ฃผ์, ์ถ๋ ฅ์ผ์, etc)$ Column Header : Detail 1์ ํ์๋๋ ๋ฐ์ดํฐ์ ์ด๋ฆ์ ๋ฐด๋์ด๋ค. (์:๊ณ ๊ฐ๋ช
, ๊ณ ๊ฐ์ ๋ณด, ๊ณ ๊ฐ์ฃผ์, etc)$ Detail 1 : ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ๋ฐด๋์ด๋ค. (์: ์ฒ ์, ๋จ์, ๋ํ๋ฏผ๊ตฐ, etc)$ Last Page Footer : ๋ณด๊ณ ์์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์ถ๋ ฅ๋๋ ๋ฐด๋์ด๋ค. (์: ์๋ด๋ฌธ๊ตฌ, ๋ณด๊ณ ์ํ์ด์ง, etc) ๊ธฐ๋ณธ์ ์ธ Title ๊ตฌ์ฑ ํ ํ ๋ณด๊ณ ์์ ์ถ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ DB์์ ์ถ์ถํ๋ค. 123$ ์ฐ์ธก์ Dataset_and_Query_Dialog ์์ด์ฝ์ ํด๋ฆญํ๋ค.$ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ SQL Query๋ฅผ ์์ฑํ๋ค. $ ๋ณ๋์ SQL Tool์ ์ด์ฉํ์ฌ 1์ฐจ Query์ ๋ํ ๊ฒ์ฆ์ ์๋ฃํ๊ณ ์งํํ๋๊ฒ์ ์ถ์ฒํ๋ค. Dataset and Query Diaglog๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ ์ถ์ถํ๊ธฐ 12345$ 1. ์ ์ํ DB๋ฅผ ์ ํํ๋ค.$ 2. SQL Query๋ฅผ ์์ฑํ๋ค.$ 3. Read Fields ๋ฒํผ์ ํด๋ฆญํ๋ค.$ 4. ๋ถํ์ํ ํ๋๋ฅผ ์ญ์ ํ๊ณ ์์๋ฅผ ์กฐ์ ํ๋ค.$ 5. Parameters ํญ์ ํด๋ฆญํ๋ค Query Parameters ์ถ๊ฐํ๊ธฐ 1234$ ์ข์ธก์ ```add``` ๋ฒํผ์ ํด๋ฆญํ๋ค.$ ์ถ๊ฐ๋ Parameter1์ ๋๋ธํด๋ฆญํ๋ฉด ํ๋ผ๋ฉํฐ ์ค์ ํ์
์ด ํ๋ฉด์ ํ์๋๋ค.$ Parameter Name์ ํฌํจํ์ฌ ํ์ํ ๊ฐ์ ์ ํ ๋๋ ์
๋ ฅํ๊ณ ```ok``` ๋ฒํผ์ ํด๋ฆญํ๋ค.$ Data preview๋ฅผ ์ ๊ณตํ๊ณ ์์ผ๋ฉฐ ```Refresh Preview Data``` ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ์ถ๋ ฅํ๋ค. ๋ณด๊ณ ์ ๋ฐ์ดํฐ ์ถ๋ ฅํ๊ธฐ 12345$ 1. Dataset and Query Diaglog์์ ์ถ์ถํ ์ปฌ๋ผ์ ๋ํ ์ ๋ณด๊ฐ ํ์๋๋ค.$ 2. ๋ณด๊ณ ์ ํ๋ฉด์ ์ถ๊ฐํ ์ ์๋ Object๊ฐ ํ์๋๋ค.$ 3. ๋ณด๊ณ ์ ํ๋ฉด์์ Object๋ฅผ ์ ํํ๋ฉด ํด๋น Object์ ๋ํ ์ ๋ณด๊ฐ ํ์๋๋ค.$ 4. ๋ณด๊ณ ์ ๋์์ธ ๊ณผ์ ๋๋ ๋ง๋ฌด๋ฆฌ ์ดํ์ ๋ณด๊ณ ์์ ๋ฐ์ดํฐ๋ฅผ ํ์ธ ํ ์ ์๋ Preview๋ฅผ ์ ๊ณตํ๋ค.$ ๋ณด๊ณ ์์ ๋ชจ๋ ์ ๋ณด๋ xml๋ก ์ ์ฅ๋๋ฉด ํ์ํ๋ค๋ฉด ์ง์ Source๋ฅผ ์์ ํ ์ ์๋ค. ๋ณด๊ณ ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ 12$ 1. ํ๋จ์ Previewํ๋ฉด์ ์ข์ธก์ ํ๋ผ๋ฉํฐ๋ฅผ ์
๋ ฅํ๋ ํ๋ฉด, ์ฐ์ธก์ ๋ณด๊ณ ์๊ฐ ํ๋ฉด์ผ๋ก ๊ตฌ์ฑ๋์ด์๋ค.$ 2. ํ๋ผ๋ฉํฐ๋ฅผ ์
๋ ฅํ๊ณ ์์ชฝ์ ์คํ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ณด๊ณ ์๊ฐ ํ๋ฉด์ ์ถ๋ ฅ๋๋ค.","link":"/2020/05/12/jasper-invoice/"},{"title":"Report File Publishing","text":"Jasper Report ํ์ผ ์๋ฒ์ ์
๋ก๋12์์ฑํ ๋ณด๊ณ ์๋ฅผ Openํฉ๋๋ค.๋ฉ๋ด(Project -> Public the file on JasperReports Server๋ฅผ ํด๋ฆญํ๊ฑฐ๋ ์ฐ์ธก ์๋จ์ [publish report button](publish-report-button.png)์ ํด๋ฆญํฉ๋๋ค. 12345์์ฑ๋ ์๋ฒ๋ฅผ ํด๋ฆญํ๊ณ Public์ผ๋ก ์ด๋ํ๋ค.๋ณด๊ณ ์ ํ์ผ์ ๊ด๋ฆฌํ ํด๋๋ฅผ ์ ํํ๊ณ ์ ๋นํ Unit Label, Name์ ์
๋ ฅํ๊ณ Next๋ฅผ ํด๋ฆญํ๋ค.Server์ Publishing๋ ์ ๋ณด๊ฐ ํ์๋๋ค. ์ฐธ๊ณ : [TIBCO Jaspersoft Studio User Guide](https://community.jaspersoft.com/documentation/tibco-jaspersoft-studio-user-guide/v611/publishing-report-jasperreports-server)","link":"/2020/05/14/jasper-upload/"},{"title":"Python ๊ฐ์ํ๊ฒฝ์์ ์ค๋ผํด ์ ์ํ๊ธฐ","text":"Python ๊ฐ์ํ๊ฒฝ์์ ์ค๋ผํด ์ ์ํ๊ธฐ ํฐ๋ฏธ๋์์ ๊ฐ์ํ๊ฒฝ์ ์์ฑํ๋ค.$ python3 -m venv p_oracle ๊ฐ์ํ๊ฒฝ์ ํ์ฑํํ๋ค.$ source p_oracle-env/bin/activate command์์ code๋ฅผ ์
๋ ฅํ๊ณ code์ ์คํํ๋ค.$ code cx_Oracle์ ์ค์นํ๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๋ถ๋ถ์ด python์ด ์๋๊ณ python3๋ก ์ค์น๋ฅผ ํด์ผํ๋ค.cx_Oracle(์ฐธ์กฐ : https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html#installing-cx-oracle-on-macos) ํ์ด์ง๋ฅผ ํ์ธํ๋ฉด โpython -m pip install cx_Oracle โupgradeโ์ ์คํํ๋ผ๊ณ ๋์ด ์์ผ๋ .py๋ฅผ ์คํํ๋ฉด ModuleNotFoundError: No module named โcx_Oracleโ ๋ฉ์์ง๊ฐ ๊ณ์ํด์ ์ถ๋ ฅ๋๋คโฆ ๊ทธ๋์ ํฐ๋ฏธ๋์์ python์ ์คํํ๊ณ import cx_Oracle์ ์คํํ๋ ์คํ์ด๋๊ณ ํฐ๋ฏธ๋์์ python3์ ์คํํ๊ณ import cx_Oracle์ ์คํํ์ง ๋ชจ๋์ ๋ชป ์ฐพ๋๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์ด ๊ฒฝ์ฐ ๊ธฐ์กด์ ์ค์น๋ cx_Oracle์ uninstall์ ์ํํ๊ณ ์๋์ ๊ฐ์ด ์คํํ๋ฉด๋๋ค. โsudo python -m pip uninstall cx_Oracleโ$ python3 -m pip install cx_Oracle ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์
๋ ฅํ๊ณ ์คํํ๋ค. 123456789 from __future__ import print_functionimport cx_Oracleimport db_configcon = cx_Oracle.connect(\"'cbsadm\", \"'uangel123\", \"10.0.125.9/MTCCBS\", encoding=\"UTF-8\")print(\"Database version:\", con.version) โcx_Oracle.DatabaseError: ORA-24454: client host name is not setโ ์์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด /etc/hosts์ ํธ์คํธ๊ฐ ๋ฑ๋ก๋์ด ์๋์ง ํ์ธํ๋ค. ๋ง์ฝ ๋ฑ๋ก๋์ด ์์ง ์๋ค๋ฉด ํธ์คํธ๋ฅผ ๋ฑ๋กํ๋ค. โsudo /bin/bash -c โecho โ127.0.1.1 ${HOSTNAME}โ >> /etc/hostsโ 1","link":"/2020/05/13/p_oracle/"},{"title":"์ค๋ผํด ์์ค ์ํธํํ๊ธฐ","text":"Oracle Wrap Utility๋ฅผ ์ด์ฉํด์ ์์ค ์ํธํํ๊ธฐ์ฐ์ ์์ค๋ฅด ์ํธํ ํ๋ ๊ฒฝ์ฐ ์๋ณธ์ ์ ๊ด๋ฆฌํด์ผํ๋ฉฐ ์๋ณธ์ด ๋ถ์ค ๋์์ ๊ฒฝ์ฐ ๋ณต๊ตฌ๋ ํ ์ ์์์ ์ ์ํด์ผ ํ๋ค.์์ค ์ํธํ๋ ์ค๋ผํด์์ ์ ๊ณตํ๋ Oracle Wrap Utility๋ฅผ ์ด์ฉํ๋ค. Connect Oracle Server /home/oracle/base/12.2.0/db/bin ๋๋ ํ ๋ฆฌ๋ก ์ด๋. ์ค๋ผํด ์ค์น ๋๋ ํ ๋ฆฌ๋ ์กฐ๊ธ ๋ค๋ฅผ ์ ์์ต๋๋ค. wrap iname=[file] oname=[file]์ฒซ๋ฒ์งธ ์ธ์๋ ์๋ณธ ํ์ผ ๋๋ฒ์งธ ์ธ์๋ฅผ ์์ฑํ ํ์ผ์ด๋ค. โwrap iname=CRYPTO.pks oname=CRYPTO.wrpโ 12345678 [oracle@/home/oracle/base/12.2.0/db/bin]$ wrap iname=CRYPTO.pks oname=CRYPTO.wrpPL/SQL Wrapper: Release 12.2.0.1.0- 64bit Production on Wed Jun 03 12:51:48 2020Copyright (c) 1993, 2009, Oracle. All rights reserved.Processing CRYPTO.pks to CRYPTO.wrp SQL Developer ๋๋ SQL ๊ด๋ฆฌํด์ ์ด์ฉํ์ฌ CRYPTO.wrp ํ์ผ์ ์คํํ๊ณ ์ปดํ์ผํ๋ค. ๊ฐ์ธ PC์์ wrap ํ์ผ์ ์์ฑ ํ ๊ฒฝ์ฐ ์ค๋ผํด ์ฌ์ดํธ์์ ์ค๋ผํด DB์ ์ค์นํ๋ฉด /bin ๋๋ ํ ๋ฆฌ์ wrap ํ์ผ์ด ์ค์น๋๋ค.(์ค๋ผํด ํด๋ผ์ด์ธํธ ์๋โฆ) 3๋ฒ๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌํ๋ค. Oracle DBMS_DDL ์ด์ฉํด์ ์์ค ์ํธํํ๊ธฐDBMS_DDL์ ์ด์ฉํด์ ์ํธํ ํ๋ ๊ฒฝ์ฐ๋ Dynamic Wrap์ ์ฌ์ฉํ๋ค. ์๋ก์ด Procedure๋ฅผ ์์ฑํ๋ค. l_source์ l_wrap์ ๋ณ์๋ฅผ ์ ์ธํ๋ค. l_source์ wrap ํ procedure๋ฅผ ๋ฃ์ต๋๋ค. SYS.DBMS_DDL.WRAP(ddl => l_source)๋ฅผ ์ด์ฉํด์ wrap์ผ๋ก ๋ณํํฉ๋๋ค. l_wrap๋ฅผ DBMS_OUTPUT์ผ๋ก ์ถ๋ ฅํ๊ณ ์ถ๋ ฅ๋ ๋ด์ฉ์ ์ปดํ์ผํฉ๋๋ค.123456789101112131415161718192021222324252627282930313233 CREATE OR REPLACE PROCEDURE sp_wrap IS/****************************************************************************** NAME: sp_wrap PURPOSE: REVISIONS: Ver Date Author Description --------- ---------- --------------- ------------------------------------ 1.0 2020/06/03 charles 1. Created this procedure. NOTES: Automatically available Auto Replace Keywords: Object Name: sp_wrap Sysdate: 2020/06/03 Date and Time: 2020/06/03, ์คํ 3:13:02, and 2020/06/03 ์คํ 3:13:02 Username: charles (set in TOAD Options, Procedure Editor) Table Name: (set in the \"New PL/SQL Object\" dialog)******************************************************************************/ l_source VARCHAR2(32767); l_wrap VARCHAR2(32767);BEGIN l_source := 'CREATE OR REPLACE FUNCTION get_date_string RETURN VARCHAR2 AS' || 'BEGIN ' || 'RETURN TO_CHAR(SYSDATE, ''DD-MON-YYYY''); ' || 'END get_date_string;'; l_wrap := SYS.DBMS_DDL.WRAP(ddl => l_source); DBMS_OUTPUT.put_line(l_wrap);END sp_wrap;/","link":"/2020/06/03/oracle_wrap/"},{"title":"1. Python ํ๊ฒฝ์ค์ ","text":"๊ฐ๋ฐ ๊ฐ์ ํ๊ฒฝ ์ค์ ํ
์คํธ ์ฝ๋๊ฐ๋ฐ ํ๊ฒฝ ์ค์ (MAC)์ผ๋จ Python์ ์ด์ฉํด์ ๊ฐ๋ฐ์ ์งํํ๊ธฐ ์ํด์ ํ์ํ ํ์ผ์ ์ค์นํ๊ฒ ์ต๋๋ค.์ด 5๊ฐ์ ํํธ๋ก ๊ตฌ๋ถํ์ผ๋ฉฐ ์ค์น๋ ๋ณ๋ก ์ด๋ ต์ง ์์ต๋๋ค.๊ฐ๋ฐ ํ๊ฒฝ์ MAC์ผ๋ก ์งํํ๊ฒ ์ต๋๋ค. 123451. Python ์ค์น2. Editor ์ค์น (Visual Studio Code)3. Virtual Environment ์ค์ (Venv)4. editor plug-in ์ค์น5. test package ์ค์น 1. Python ์ค์น123456789- ์ฐ์ Python ์ค์นํ์ผ์ (https://www.python.org/downloads/)ํ์ธ์. - ๋ค์ด๋ก๋ ํ ํจํค์ง ํ์ผ์ ์คํํด์ ์ค์นํ์๋ฉด ๋ฉ๋๋ค. ์ค์น๊ณผ์ ์ ์ด๋ ต์ง ์์์ ํจ์ค. - ์ด์ ์ ์์ ์ผ๋ก ์ค์น๊ฐ ์ ๋์๋์ง ํ์ธํ๊ฒ ์ต๋๋ค.- ์ฐ์ Terminal์ ์คํํ๊ณ Prompt์ python3์ ์
๋ ฅํ๊ณ ์คํํ์๋ ์๋์ ๊ฐ์ ๋ฉ์์ง๊ฐ ํ๋ฉด์ ๋ณด์ด๋ฉด OK. Python 3.7.3 (default, Apr 7 2020, 14:06:47)[Clang 11.0.3 (clang-1103.0.32.59)] on darwinType \"help\", \"copyright\", \"credits\" or \"license\" for more information.>>>- ์ฐธ๊ณ ๋ก python์ ์
๋ ฅํ๊ณ ์คํํ๋ฉด 2.xx ๋ฒ์ ์ด ์คํ๋๋ค. MAC์ ๊ธฐ๋ณธ์ ์ผ๋ก 2.xx๊ฐ ์ค์น๋์ด ์์ต๋๋ค.. 2. Editor ์ค์น (Visual Studio Code)1234- Python์ ๊ฐ๋ฐ์ ๋ณธ์ธ์ด ์ ํธํ๋ ํด์ ์ฌ์ฉํด๋ ๊ด์ฐฎ๊ณ ์ํ๋ Editor๋ฅผ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํฉ๋๋ค. (Atom, PyCharm, etc)- Visual Studio Code ์ค์น ํ์ผ [๋ค์ด๋ก๋](https://visualstudio.microsoft.com/ko/downloads/)ํ์ธ์. - ๋ค์ด๋ก๋ ํ ํจํค์ง ํ์ผ์ ์ค์นํ๋ค. ์ค์น๊ณผ์ ์ด ์ด๋ ต์ง ์์์ ์ถ๊ฐ ์ค๋ช
์ ํ์ง ์๋๋ค. - ์ ์์ ์ผ๋ก ์ค์น๊ฐ ๋์๋ค๋ฉด Terminal์ ์คํํ๊ณ Prompt์ code๋ฅผ ์
๋ ฅํ๋ฉด Visual Studio Code๊ฐ ์คํ๋๋ค 3. Virtual Environment ์ค์ (Venv)12345678- ๊ฐ์ํ๊ฒฝ์ ์ด์ฉํ๋ ์ด์ ๋ ์ฌ์ดํธ๋ง๋ค ๋ฒ์ ์ ๋ค๋ฅด๊ฒ ๊ฐ๋ฐํ์ ๊ฒฝ์ฐ ์ฌ์ดํธ์ ์ ์ง๋ณด์๊ฐ ํ๋ค๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ฉด ๊ฐ์ํ๊ฒฝ์ ๊ตฌ์ถํด์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํ๊ณ ๊ฐ๋ฐํ๋๊ฒ์ ๊ถ๊ณ ํ๋ค.- ํฐ๋ฏธ๋์ ์คํํ๊ณ ์์
๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์๋์ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ค. ์ฐธ๊ณ ๋ก ํ์ฌ ์์น์์ ๋ง๋ค์ด์ง๋ค. [์ฐธ๊ณ ](https://docs.python.org/3/tutorial/venv.html?highlight=virtual \"Python Doc\") $ python -m venu p_study- ์์ฑ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ํ์ธํ๊ณ ์๋ ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด์ ํ์ฑํํ๋ค. $ source ./bin/activate- Prompt๊ฐ ๊ฐ์ํ๊ฒฝ์ ๋ฐ๋๊ฒ์ ํ์ธํ ์ ์๋ค. \"$ (p_study) \" ์์
๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์์ฑ๋ ํด๋๋ฅผ ์ญ์ ํ๊ณ ๊ฐ์ํ๊ฒฝ์ ์ฌ์คํํ๋ค.- ๊ฐ์ํ๊ฒฝ์ด Active ๋ ์ดํ Prompt์ code๋ฅผ ์
๋ ฅํด์ Editor๋ฅผ ์คํํ๋ค. 4. editor plug-in ์ค์น12345678910- ๊ฐ์ํ๊ฒฝ์ด ์ค์น๋ ์์น์์ pin list๋ฅผ ์คํํ๋ฉด ํ์ฌ ์ค์น๋ pip ๋ชฉ๋ก์ ํ์ธํ ์ ์๋ค. ๊ฐ์ํ๊ฒฝ์ ๊ตฌ์ถํด์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํ๊ณ ๊ฐ๋ฐํ๋๊ฒ์ ๊ถ๊ณ ํ๋ค.- ํฐ๋ฏธ๋์ ์คํํ๊ณ ์์
๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์๋์ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ค. ์ฐธ๊ณ ๋ก ํ์ฌ ์์น์์ ๋ง๋ค์ด์ง๋ค. [์ฐธ๊ณ ](https://docs.python.org/3/tutorial/venv.html?highlight=virtual \"Python Doc\") $ python3 -m venv tutorial-env- ์์ฑ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ํ์ธํ๊ณ ์๋ ๋ช
๋ น์ด๋ฅผ ์ด์ฉํด์ ํ์ฑํํ๋ค. $ source ./bin/activate- Prompt๊ฐ ๊ฐ์ํ๊ฒฝ์ ๋ฐ๋๊ฒ์ ํ์ธํ ์ ์๋ค. \"$ (tutorial-env) \" ์์
๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์์ฑ๋ ํด๋๋ฅผ ์ญ์ ํ๊ณ ๊ฐ์ํ๊ฒฝ์ ์ฌ์คํํ๋ค. $ (tutorial-env) - ๊ฐ์ํ๊ฒฝ์ด Active๋ ์ดํ Prompt์ \"code\"๋ฅผ ์
๋ ฅํด์ Editor๋ฅผ ์คํํ๋ค. To be continuedโฆ pip install pendulumpip install pytest","link":"/2020/05/13/python_ch_01/"},{"title":"3. Python Class & Method","text":"Python์ ๊ฐ๋ฐ ๋ฐ ์ดํด๋ฅผ ๋๊ธฐ ์ํด์ ์ฝ๋๋ฅผ ์๊ฐํํ๊ณ ์ค์๊ฐ ๋์๋ง ์ป์ ์ ์๋ Site๊ฐ ์๋ค.Python Tutor (created by Philip Guo)๋ ์ฌ๋๋ค์ด ํ๋ก๊ทธ๋๋ฐ ํ์ต์ ๋ํ ๊ทผ๋ณธ์ ์ธ ์ฅ๋ฒฝ์ ๊ทน๋ณตํ๋๋ก ๋์์ค๋๋ค.์ปดํจํฐ๊ฐ ๊ฐ ์ฝ๋์ ์ค์ ์คํํ ๋ ๋ฐ์ํ๋ ์ํฉ์ ์ดํด ํ ์ ์๋๋ก ์๊ฐํํด์ ํ์ํฉ๋๋ค. Class ๊ธฐ๋ฐ ๊ฐ๋ฐ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์ ์ฅ์ ์ ์ฝ๋์ ์ฌ์ฌ์ฉ, ์ฝ๋ ์ค๋ณต ๋ฐฉ์ง ๋ฑ์ ์ฅ์ ์ด ์๋ค.๊ณผ๊ฑฐ ๊ท๋ชจ๊ฐ ํฐ ํ๋ก์ ํธ(ํ๋ก๊ทธ๋จ)์ ํจ์์ ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ์ด ๋์์ผ๋ฉฐ ํจ์ ์ค์ฌ์ ๊ฐ๋ฐ์ ์งํํ๋ค๋ณด๋ ๋ฐ์ดํฐ๊ฐ ๋ฐฉ๋ํด์ง๋ฉด์ ๋ณต์กํด์ก๋ค.๊ทธ๋์ ํด๋์ค ์ค์ฌ์ผ๋ก ๋ณํ๊ฐ ๋๋ฉด์ ํจ์ ์ค์ฌ์ด ์๋๊ณ ๋ฐ์ดํฐ ์ค์ฌ์ผ๋ก ๊ตฌ์ฑ์์๋ค์ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ค.๋ฌผ๋ก ์ ๋ต์ ์์ผ๋ฉฐ ํ๋ก์ ํธ์ ์ํฉ์ ๋ฐ๋ผ์ ๊ฐ์ฒด์งํฅ ๋๋ ํด๋์ค ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ์ ์งํํ๋ฉด ๋๋ค. ์ผ๋ฐ์ ์ธ ์ฝ๋ฉ 12345678910111213141516171819202122์ฐจ๋ 1, 2, 3car_company_1 = 'Ferrari'car_detail_1 = [ {'color' : 'White'}, {'hoursepower' : 4000}, {'price' : 8000}]car_company_2 = 'BMW'car_detail_2 = [ {'color' : 'Black'}, {'hoursepower' : 270}, {'price' : 5000}]car_company_3 = 'Audi'car_detail_3 = [ {'color' : 'Silver'}, {'hoursepower' : 300}, {'price' : 6000}] ๋ฆฌ์คํธ ๊ตฌ์กฐ ํฌ๊ธฐ๊ฐ ๊ฐ๋ณ์ ์ด๊ณ , ์ด๋ค ์์ ํ์
์ด๋ ์ ์ฅํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ผ๋ ๊ด๋ฆฌ๊ฐ ๋ถํธํ๊ณ ์ธ๋ฑ์ค๋ก ์ ๊ทผ ์ ์ค์ ๊ฐ๋ฅ์ฑ ์ฆ๊ฐํ๋ฉฐ ์ญ์ ๊ฐ ๋ถํธํ๋ค. ๋ํ ๋ง์ ๋ฆฌ์์ค๋ฅผ ํ์๋ก ํ๋ค.๋ฆฌ์คํธ๋ฅผ ๋ง๋ค ๋๋ ๋๊ดํธ([ ])๋ก ๊ฐ์ธ ์ฃผ๊ณ ๊ฐ Value๋ ์ผํ(,)๋ก ๊ตฌ๋ถํด ์ค๋ค. 123456car_company_list = ['Ferrari', 'BMW', 'Audi']car_detail_list = [ {'color' : 'White', 'hoursepower' : 4000, 'price' : 8000}, {'color' : 'Black', 'hoursepower' : 270, 'price' : 5000}, {'color' : 'Silver', 'hoursepower' : 300, 'price' : 6000}] ์๋์ฐจ ํ์ฌ ์ญ์ clear() , pop() and remove()๋ list์ methods์ด๋ค.del์ ์ฌ์ฉํด์ ์์๋ฅผ ์ญ์ ํ ์ ์์ผ๋ฉฐ index๋ฅผ ์ด์ฉํด์ ํน์ ์์๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค. 12del car_company_list[1]del car_detail_list[1] ๋์
๋๋ฆฌ ๊ตฌ์กฐ๋ฆฌ์คํธ๋ ํํ์ฒ๋ผ ์์ฐจ์ ์ผ๋ก(sequential) ํด๋น Value๋ฅผ ๊ตฌํ์ง ์๊ณ Key๋ฅผ ํตํด Value์ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋๋ฉฐ์ฝ๋์ ๋ฐ๋ณต ์ง์ ๋ฐ ์ค์ฒฉ ๋ฌธ์ ๊ทธ๋ฆฌ๊ณ ํค ์กฐํ ์์ธ ์ฒ๋ฆฌ๋ฑ์ด ๊ฐ๋ฅํ๋ค.๋์
๋๋ฆฌ๋ { }(์ค๊ดํธ)์์ ํค: ๊ฐ ํ์์ผ๋ก ์ ์ฅํ๋ฉฐ ๊ฐ ํค์ Value๋ ,(์ฝค๋ง)๋ก ๊ตฌ๋ถ๋๋ค 12345cars_dicts = [ {'car_company':'Ferrari', 'car_detail': {'color' : 'White', 'hoursepower' : 4000, 'price' : 8000}}, {'car_company':'BMW', 'car_detail': {'color' : 'Black', 'hoursepower' : 270, 'price' : 5000}}, {'car_company':'Audi', 'car_detail': {'color' : 'Silver', 'hoursepower' : 300, 'price' : 6000}}] pop(โkeyโ, โdefaultโ)pop()์ ๋งจ ๋ง์ง๋ง ์์๋ฅผ ๋๋ ค์ฃผ๊ณ pop(x)๋ ๋ฆฌ์คํธ์ x๋ฒ์งธ ์์๋ฅผ ๋๋ ค์ฃผ๊ณ ๊ทธ ์์๋ ์ญ์ ํ๋ค. 12345678cars_dicts.pop()print(cars_dicts)cars_dicts.pop(1)print(cars_dicts)del cars_dicts[1]print(cars_dicts) ํด๋์ค ๊ตฌ์กฐํด๋์ค๋ ์ผ์์ ๋ง๋๋ ์ผ์ํ(Class)๊ณผ ๊ทธ๊ฒ์ ์ด์ฉํด์ ๋ง๋ ์ผ์(Object)์ด๋ค.ํด๋์ค๋ ๋๊ฐ์ ๋ฌด์์ธ๊ฐ๋ฅผ ๊ณ์ํด์ ๋ง๋ค์ด ๋ผ ์ ์๋ ์ค๊ณ ๋๋ฉด์ด๊ณ (์ผ์ํ), ๊ฐ์ฒด(object)๋ ํด๋์ค๋ก ๋ง๋ ํผ์กฐ๋ฌผ(์ผ์)์ ๋ปํ๋ค.ํด๋์ค๋ก ๋ง๋ ๊ฐ์ฒด๋ ๊ณ ์ ํ ์ฑ๊ฒฉ์ ๊ฐ์ง๋ฉฐ ์ผ์ํ๋ก ๋ง๋ ์ผ์์ด ๊นจ์ง๋๋ผ๊ณ ๋ค๋ฅธ ์ผ์์๋ ์๋ฌด ์ํฅ์ด ์๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ผํ ํด๋์ค๋ก ๋ง๋ ๊ฐ์ฒด๋ค์ ์๋ก ์ ํ ์ํฅ์ ์ฃผ์ง ์๋๋ค.ํด๋์ค๋ ๊ตฌ์กฐ ์ค๊ณ ํ ์ฌ์ฌ์ฉ์ฑ ์ฆ๊ฐํ๊ณ ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์ต์ํํ๋ฉฐ ๋ฉ์๋๋ฅผ ํ์ฉํ ์ ์๋ค. 12345678910111213141516171819202122232425262728293031323334353637383940class Car(): \"\"\" Car class Author : Charles Date : 2020.05.07 \"\"\" # self ์๋ฏธ : Instance Method def __init__(self, company, details): self._company = company self._details = details # This method returns the string representation of the object def __str__(self): return 'str : {} - {}'.format(self._company, self._details) # ๊ฐ๋ฐ์ ๋ ๋ฒจ์์ ์๊ฒฉํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ์ ํ ๊ฒฝ์ฐ def __repr__(self): return 'repr : {} - {}'.format(self._company, self._details) def __reduce__(self): pass # @Class Method (Cls = Car) # @Class ๋ณ์๋ฅผ ํธ๋ค๋ง ํ๋ ๊ฒฝ์ฐ @classmethod๋ฅผ ์ด์ฉํ๋๊ฒ์ ๊ถ์ฅ. @classmethod def raise_price(cls, per): if per <= 1: print('Price enter 1 or more') return cls.price_per_raise = per print('Succeed! Price increased') # @Static Method # @Static Method๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์๋ฅผ ๋ฐ์ง ์๋๋ค. ์ ์ฐํ Method๋ฅผ ์ ์ํ ๋์ ์ฌ์ฉํ๋ค. @staticmethod def is_bmw(inst): if inst._company == 'BMW': return 'OK! This car is {}'.format(inst._company) return 'Sorry! This car is not {}'.format(inst._company) Difference between str and repr? 12345678__repr__ is for developers, __str__ is for customers.>>> import datetime >>> today = datetime.datetime.now() >>> str(today) '2012-03-14 09:21:58.130922' >>> repr(today) 'datetime.datetime(2012, 3, 14, 9, 21, 58, 130922)' 3๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ฐ์ฒด์ ๋ํ ์ ๋ณด๋ฅผ ํ์ธํ๋ค. 1234567891011121314car1 = Car('Ferrari', {'color' : 'White', 'hoursepower' : 4000, 'price' : 8000}) car2 = Car('BMW', {'color' : 'Black', 'hoursepower' : 270, 'price' : 5000}) car3 = Car('Audi', {'color' : 'Silver', 'hoursepower' : 300, 'price' : 6000}) print(car1) print(car2) print(car3)$ ๋ชจ๋ ๋ชจ๋์ ํน๋ณํ ์์ฑ์ __dict__์
๋๋ค.print(car1.__dict__) print(car2.__dict__) print(car3.__dict__) print(dir(car1)) ๊ฐ๊ฐ์ ๊ฐ์ฒด๋ ๊ณ ์ ํ ID๊ฐ ์กด์ฌํ๋ค. print(id(car1))print(id(car2))print(id(car3)) print(car1._company == car2._company) # Comapare Valueprint(car1._company is car2._company) # Instance ๋น๊ต (ID) dir & dict ํ์ธ. dir์ ํฌ๊ด์ ์ธ ์ ๋ณด๋ฅผ ํ์ 123456789101112131415161718print(dir(car1))print(dir(car2))print(car1.__doc__)car1.detail_info()print(Car.detail_info(car1))car2.detail_info()print(Car.detail_info(car2))print(car1.__class__, car2.__class__)print(id(car1.__class__), id(car2.__class__)) # ๋ถ๋ชจ๋ ๊ฐ๋ค.print(car1.get_price())print(Car.get_price(car1))print(car1.get_price_culc())print(Car.get_price_culc(car1)) ๊ฐ๊ฒฉ ์ธ์(ํด๋์ค ๋ฉ์๋ ์ฌ์ฉ) 1Car.raise_price(1.86) ๊ฐ๊ฒฉ์ ๋ณด(์ธ์ํ) 12345print(car1.get_price_culc())print(car2.get_price_culc())print(Car.is_bmw(car1))print(Car.is_bmw(car2))","link":"/2020/05/15/python_ch_03/"},{"title":"5. Python Sequence","text":"Python SequencePython Sequence๋ ์๋ก ๋ค๋ฅธ ์๋ฃํ๊ณผ ๋จ์ผ ์๋ฃํ์ผ๋ก ๊ตฌ๋ถ ํ ์ ์๋ค. ์๋ก ๋ค๋ฅธ ์๋ฃํ : Container[list, tuple, collections, deque]๋จ์ผ ์๋ฃํ : flat[str, bytes, bytearray, array, memorryview]๋ํ ๊ฐ๋ณํ๊ณผ ๋ถ๋ณํ์ผ๋ก๋ ๊ตฌ๋ถ ํ ์ ์๋ค.๊ฐ๋ณํ : list, bytearray, array, memorryview, deque๋ถ๋ณํ : tuple, str, bytes ์ง๋ฅํ ๋ฆฌ์คํธ(Comprehending Lists)12345678910111213141516chars = '+_)(*&%$#@!) code_list1 = []for s in chars: #์ ๋์ฝ๋ ๋ฆฌ์คํธ code_list1.append(ord(s))print(code_lists1)$ [43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33, 126, 41]code_list2 = [ord(s) for s in chars]print(code_lists2)$ [43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33, 126, 41] Comprehending Lists + Map, Filtermap(f, iterable)์ ํจ์(f)์ ๋ฐ๋ณต ๊ฐ๋ฅํ(iterable) ์๋ฃํ์ ์
๋ ฅ์ผ๋ก ๋ฐ๋๋ค. map์ ์
๋ ฅ๋ฐ์ ์๋ฃํ์ ๊ฐ ์์๋ฅผ ํจ์ f๊ฐ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ๋ฌถ์ด์ ๋๋ ค์ฃผ๋ ํจ์์ด๋ค. filter ํจ์๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ํจ์ ์ด๋ฆ์, ๋ ๋ฒ์งธ ์ธ์๋ก ๊ทธ ํจ์์ ์ฐจ๋ก๋ก ๋ค์ด๊ฐ ๋ฐ๋ณต ๊ฐ๋ฅํ ์๋ฃํ์ ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ ์ธ์์ธ ๋ฐ๋ณต ๊ฐ๋ฅํ ์๋ฃํ ์์๊ฐ ์ฒซ ๋ฒ์งธ ์ธ์์ธ ํจ์์ ์
๋ ฅ๋์์ ๋ ๋ฐํ ๊ฐ์ด ์ฐธ์ธ ๊ฒ๋ง ๋ฌถ์ด์(๊ฑธ๋ฌ ๋ด์) ๋๋ ค์ค๋ค. ์๋ ์ฝ๊ฐ ์ฐ์ธ1234567code_list3 = [ord(s) for s in chars if ord(s) > 40]code_list4 = list(filter(lambda x : x > 40, map(ord, chars)))print(code_list3)print(code_list4)print([chr(s) for s in code_list1]) Generator ์์ฑ1import array Generator : ํ ๋ฒ์ ํ ๊ฐ์ ํญ๋ชฉ์ ์์ฑ(๋ฉ๋ชจ๋ฆฌ ์ ์งX)1tuple_g = (ord(s) for s in chars) Array123456array_g = array.array('I', (ord(s) for s in chars))print(type(tuple_g))print(next(tuple_g))print(type(array_g))print(array_g.tolist())","link":"/2020/05/18/python_ch_05/"},{"title":"4. Sepcial Method","text":"Special Method(Magic Method)Python์ ๊ฐ์ฅ ํต์ฌ์ ์์(Sequence), ๋ฐ๋ณต(Iterator), ํจ์(Function), ํด๋์ค(Class)์ด๋ค.Special Method๋ Class์์ ์ ์ํ ์ ์๋ ํน๋ณํ(Built in) Method์ด๋ค. In Python, special methods are a set of predefined methods you can use to enrich your classes. They are easy to recognize because they start and end with double underscores, for example init or str. To Be Continuedโฆ 1","link":"/2020/05/15/python_ch_04/"},{"title":"5-2. Hash Table","text":"Hash TableHash Table์ Key์ Value๋ฅผ ์ ์ฅํ๋ ๊ตฌ์กฐ์
๋๋ค.Index Value๊ฐ Data์ Key Value ์ญํ์ ํ๋ฏ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ค ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.๋ํ Key Value์ ์ฐ์ฐ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ์ง์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ์
๋๋ค. Dict ๊ตฌ์กฐDict ์์๋ฅผ ์ ๊ทผํ๋ ค๋ฉด ๋๊ดํธ์ ํค์ ํจ๊ป ์ฌ์ฉํ์ฌ ๊ฐ์ ์ป์ ์ ์์ต๋๋ค. 1dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} Key๋ฅผ ์ด์ฉํ์ฌ dictionary์ ์ ๊ทผํด ๋ณด๊ฒ ์ต๋๋ค. 12print (\"dict['Name']: \", dict['Name'])print (\"dict['Age']: \", dict['Age']) ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค. 12$ dict['Name']: Zara$ dict['Age']: 7 setdefault()Dict์ Key์ Value ์ ์ฅํ๊ธฐ 123456789source = (('k1', 'val1'), ('k1', 'val2'), ('k2', 'val3'), ('k2', 'val4'), ('k2', 'val5'), )new_dict1 = {}new_dict2 = {} Not use setdefault() 12345for k, v in source: if k in new_dict1: new_dict1[k].append(v) else: new_dict1[k] = [v] Use setdefault() 12for k, v in source: new_dict2.setdefault(k, []).append(v) ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธ ํ ์ ์์ต๋๋ค. 12$ new_dict1 : {'k1': ['val1', 'val2'], 'k2': ['val3', 'val4', 'val5']}$$ new_dict2 : {'k1': ['val1', 'val2'], 'k2': ['val3', 'val4', 'val5']}","link":"/2020/05/27/python_ch_05_2/"},{"title":"6-1. ์ผ๊ธ ํจ์ (์ผ๊ธ ๊ฐ์ฒด)","text":"๊ธฐ๋ณธ ํน์ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์์ผ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ์ ๋จ์ถํ ์ ์์ผ๋ฉฐ, ์์ํจ์๋ฅผ ์งํฅํ๋ฉฐ ๋์์ ์ฌ๋ฌ ์ค๋ ๋์์ ๋ฌธ์ ์์ด ๋์ํ๋ ํ๋ก๊ทธ๋จ์ ์ฝ๊ฒ ์์ฑํ๋ค. ๋ฐํ์ ์ด๊ธฐํ ๋ณ์ ํ ๋น ๊ฐ๋ฅ ๋ณ์ ์ธ์ ์ ๋ฌ ๊ฐ๋ฅ ํจ์ ๊ฒฐ๊ณผ ๋ฐํ ๊ฐ๋ฅ(return) Immutableํ์ด์ฌ์ ๋ชจ๋ ๊ฒ์ ๊ฐ์ฒด์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด์ฌ์ ์ฒ์ ์ ํ๋ ๋ชจ๋ ์ฌ๋๋ค์ด ๋นจ๋ฆฌ ๋ฐฐ์์ผํ๋ ๊ฒ์ ํ์ด์ฌ์ ๋ชจ๋ ๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ ํ๊ฑฐ๋ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ ํ๋ค๋ ๊ฒ ์
๋๋ค. ํ์ด์ฌ์ ๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด์ด๋ฏ๋ก ๋ชจ๋ ๋ณ์๋ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ๋ณด์ ํฉ๋๋ค. ๊ฐ์ฒด๊ฐ ์์๋๋ฉด ๊ณ ์ ํ ๊ฐ์ฒด ID๊ฐ ํ ๋น๋ฉ๋๋ค. ์ ํ์ ๋ฐํ์์ ์ ์๋๋ฉฐ ์ผ๋จ ์ค์ ๋ ํ์๋ ๋ณ๊ฒฝํ ์ ์์ง๋ง ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ฐ๋จํ ๋งํด์, ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ ์์ฑ ๋ ํ์ ๋ณ๊ฒฝ ๋ ์ ์์ผ๋ฉฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด ๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. (int, float, bool, str, tuple, unicode)์ ๊ฐ์ ๋ด์ฅ ์ ํ์ ๊ฐ์ฒด๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. (list, set, dict)์ ๊ฐ์ ๋ด์ฅ ์ ํ์ ๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค. ์ปค์คํ
ํด๋์ค๋ ์ผ๋ฐ์ ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค. ํด๋์ค์์ ๋ถ๋ณ์ฑ์ ์๋ฎฌ๋ ์ด์
ํ๋ ค๋ฉด ์์ฑ ์ค์ ๋ฐ ์ญ์ ๋ฅผ ์ฌ์ ์ํ์ฌ ์์ธ๋ฅผ ๋ฐ์์์ผ์ผํฉ๋๋ค. ์ฐธ๊ณ ์ ๊ทธ๋ผ mutable๊ณผ immutable์ ์ด๋ป๊ฒ ๊ตฌ๋ถํ ๊น์?์ฐ๋ฆฌ๋ โIDโ์ โTYPEโ์ผ๋ก ํ์ธ ํ ์ ์์ต๋๋ค. ID & Typebuilt-in ํจ์์ธ id()๋ ๊ฐ์ฒด์ ID๋ฅผ ์ ์๋ก ๋ฐํํฉ๋๋ค. ๋ฌผ๋ก ID๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ํด๋นํ์ง๋ง ํ์ด์ฌ์ ๋ฒ์ ๋ฐ ํ๋ซํผ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ๊ฐ์ ํํํฉ๋๋ค. ์ฐ๋ฆฌ๋ โisโ๋ฅผ ์ด์ฉํด์ ํ์ธ ํ ์ ์์ต๋๋ค. 1234567891011121314151617181920# Example 1 x = \"Holberton\" y = \"Holberton\" print(id(x)) print(id(y)) $ 140135852055856 $ 140135852055856# comparing the types print(x is y) $ True # Example 2 a = 50 print(type(a)) $ <class: โintโ> b = \"Holberton\" print(type(b)) $ <class: 'string'> ๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ์ ํ์ ๊ฐ์ฒด๊ฐ ๋ณ์์ ์ฐ๊ฒฐ๋๋ ๋ฐฉ์๊ณผ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ํ์ธํ ์ ์์ต๋๋ค. Mutable and Immutable Objects์์์ ์ค๋ช
ํ ๊ฒ์ฒ๋ผ ๊ฐ๋ณ ๊ฐ์ฒด๋ ์ํ๋ ๋ด์ฉ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ ๋ถ๋ณ ๊ฐ์ฒด๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. Immutable Dict12345678910111213141516# ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.d = {'key':'value'}# Read/Write# ๊ฐ์ฒด์ ๊ฐ์ ์ถ๊ฐํ๋ฉด ์ ์์ ์ผ๋ก ๊ฐ์ด ์ถ๊ฐ๋๋๊ฒ์ ํ์ธ ํ ์ ์๋ค.d['key2'] = 'value2'print(d)$ {'key': 'value', 'key2': 'value2'}# Read Only# MappingProxyType์ ์ด์ฉํด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๊ฒ์ ํ์ธ ํ ์ ์๋ค. ๋ง์ ๊ฐ๋ฐ์๋ค์ ํต์์ ์ผ๋ก \"frozen\"์ด๋ผ๋ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ๊ณ ๊ทธ ๋ณ์๋ ๊ฐ์ ๋ณ๊ฒฝ ํ ์ ์๋ immutable์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.d_frozen = MappingProxyType(d)d_frozen['Key2'] = 'value2'# TypeError: 'mappingproxy' object does not support item assignment","link":"/2020/06/02/python_ch_05_3/"},{"title":"5-1. sort vs sorted","text":"Sort vs SortedSorted : ๋ฐ์ดํฐ ์ ๋ ฌ ํ ์๋ก์ด ๋ฆฌ์คํธ๋ก ๋ฐํํฉ๋๋ค. ์ด๋ ์ฌ๋ฌ ๋ฒ ์ ๋ ฌํ ๋ ์ ์ฉํฉ๋๋ค (์๋ฅผ ๋ค์ด, ๋ถ์๋ณ๋ก ์ ๋ ฌํ ํ์ ๊ธ์ฌ ๋ฑ๊ธ๋ณ๋ก ์ ๋ ฌํ๊ธฐ).Sort : ๋ฐ์ดํฐ ์ ๋ ฌ ํ ๊ฐ์ฒด๋ฅผ ๋ณํํ๋ค. ์ค์ต์ ์ํ List ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ฒ ์ต๋๋ค. 1f_list = ['orange', 'apple', 'mango', 'papaya', 'lemon', 'strawberry', 'coconut'] Sorted1234567891011121314151617181920์ ๋ ฌ๋ ๋ฆฌ์คํธ์ ์๋ณธ์ ๋น๊ตํ๋ ค๋ฉด f_list๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ์ฝ๊ฒ ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค.์ ๋ ฌ๋ ๋ฆฌ์คํธ ๋ฐ์ดํฐ๋ฅผ ํ์ธ ํ ์ ์์ผ๋ฉฐ ์๋ณธ ๋ฐ์ดํฐ๋ ๋ณํ๊ฐ ์์์ ํ์ธ ํ ์ ์์ต๋๋ค.print('sorted - ', sorted(f_list), f_list)$ sorted - ['apple', 'coconut', 'lemon', 'mango', 'orange', 'papaya', 'strawberry'] ['orange', 'apple', 'mango', 'papaya', 'lemon', 'strawberry', 'coconut']์ ๋ ฌ ์ดํ reverse๋ฅผ ํ ๊ฒฝ์ฐ \"reverse=True\"๋ก ์ ์ํ๋ค. reverse์ ๊ธฐ๋ณธ๊ฐ์ False์ด๋ค.print('sorted_reverse -', sorted(f_list, reverse=True))$ sorted_reverse - ['strawberry', 'papaya', 'orange', 'mango', 'lemon', 'coconut', 'apple']๋ฐ์ดํฐ ๊ธธ์ด๋ก๋ ์ ๋ ฌํ ์ ์๋ค.print('sorted_len -', sorted(f_list, key=len))$ sorted_len - ['apple', 'mango', 'lemon', 'orange', 'papaya', 'coconut', 'strawberry']lambda๋ ์ด์ฉํ ์ ์์ผ๋ฉฐ key=lambda x: x[-1]๋ -1์ด๋ฏ๋ก ๋ง์ง๋ง ๊ธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋๋ค.print('sorted_lambda -', sorted(f_list, key=lambda x: x[-1]))$ sorted_lambda - ['papaya', 'orange', 'apple', 'lemon', 'mango', 'coconut', 'strawberry']๋ง์ง๋ง ๊ธ์๋ฅผ reverse ํ ์๋ ์๋ค.print('sorted_lambda_reverse -', sorted(f_list, key=lambda x: x[-1], reverse=True))$ sorted_lambda_reverse - ['strawberry', 'coconut', 'mango', 'lemon', 'orange', 'apple', 'papaya'] Sort12345678910111213141516171819๋ฐ์ดํฐ ์ ๋ ฌ ํ ์๋ณธ ๊ฐ์ฒด์ ๋ณํ๋ฅผ ํ์ธํ๊ฒ ์ต๋๋ค. sort๋ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ฐํ ํ ๊ฐ์ฒด๊ฐ ์๊ธฐ๋๋ฌธ์ none์ด ํ์๋๊ณ ์๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธ ํ ์ ์์ต๋๋ค.print('sort -', f_list.sort(), f_list)$ sort - None ['apple', 'coconut', 'lemon', 'mango', 'orange', 'papaya', 'strawberry']print('sort_reverse -', f_list.sort(reverse=True), f_list)$ sort_reverse - None ['strawberry', 'papaya', 'orange', 'mango', 'lemon', 'coconut', 'apprint('sort_len -', f_list.sort(key=len), f_list)sort_len - None ['mango', 'lemon', 'apple', 'papaya', 'orange', 'coconut', 'strawberry']print('sort_lambda -', f_list.sort(key=lambda x: x[-1]), f_list)sort_lambda - None ['papaya', 'apple', 'orange', 'lemon', 'mango', 'coconut', 'strawberry']print('sort_lambda_reverse -', f_list.sort(key=lambda x: x[-1], reverse=True), f_list)ple']sort_lambda_reverse - None ['strawberry', 'coconut', 'mango', 'lemon', 'apple', 'orange', 'papaya']","link":"/2020/05/26/python_ch_05_1/"},{"title":"5-3. Immutable Dict ์์ฑ","text":"์ฐธ๊ณ Immutableํ์ด์ฌ์ ๋ชจ๋ ๊ฒ์ ๊ฐ์ฒด์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด์ฌ์ ์ฒ์ ์ ํ๋ ๋ชจ๋ ์ฌ๋๋ค์ด ๋นจ๋ฆฌ ๋ฐฐ์์ผํ๋ ๊ฒ์ ํ์ด์ฌ์ ๋ชจ๋ ๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ ํ๊ฑฐ๋ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ ํ๋ค๋ ๊ฒ ์
๋๋ค. ํ์ด์ฌ์ ๋ชจ๋ ๊ฒ์ด ๊ฐ์ฒด์ด๋ฏ๋ก ๋ชจ๋ ๋ณ์๋ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ๋ณด์ ํฉ๋๋ค. ๊ฐ์ฒด๊ฐ ์์๋๋ฉด ๊ณ ์ ํ ๊ฐ์ฒด ID๊ฐ ํ ๋น๋ฉ๋๋ค. ์ ํ์ ๋ฐํ์์ ์ ์๋๋ฉฐ ์ผ๋จ ์ค์ ๋ ํ์๋ ๋ณ๊ฒฝํ ์ ์์ง๋ง ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ๊ฐ๋จํ ๋งํด์, ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ ์์ฑ ๋ ํ์ ๋ณ๊ฒฝ ๋ ์ ์์ผ๋ฉฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด ๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. (int, float, bool, str, tuple, unicode)์ ๊ฐ์ ๋ด์ฅ ์ ํ์ ๊ฐ์ฒด๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. (list, set, dict)์ ๊ฐ์ ๋ด์ฅ ์ ํ์ ๊ฐ์ฒด๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค. ์ปค์คํ
ํด๋์ค๋ ์ผ๋ฐ์ ์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค. ํด๋์ค์์ ๋ถ๋ณ์ฑ์ ์๋ฎฌ๋ ์ด์
ํ๋ ค๋ฉด ์์ฑ ์ค์ ๋ฐ ์ญ์ ๋ฅผ ์ฌ์ ์ํ์ฌ ์์ธ๋ฅผ ๋ฐ์์์ผ์ผํฉ๋๋ค. ์ฐธ๊ณ ์ ๊ทธ๋ผ mutable๊ณผ immutable์ ์ด๋ป๊ฒ ๊ตฌ๋ถํ ๊น์?์ฐ๋ฆฌ๋ โIDโ์ โTYPEโ์ผ๋ก ํ์ธ ํ ์ ์์ต๋๋ค. ID & Typebuilt-in ํจ์์ธ id()๋ ๊ฐ์ฒด์ ID๋ฅผ ์ ์๋ก ๋ฐํํฉ๋๋ค. ๋ฌผ๋ก ID๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ํด๋นํ์ง๋ง ํ์ด์ฌ์ ๋ฒ์ ๋ฐ ํ๋ซํผ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ๊ฐ์ ํํํฉ๋๋ค. ์ฐ๋ฆฌ๋ โisโ๋ฅผ ์ด์ฉํด์ ํ์ธ ํ ์ ์์ต๋๋ค. 1234567891011121314151617181920# Example 1 x = \"Holberton\" y = \"Holberton\" print(id(x)) print(id(y)) $ 140135852055856 $ 140135852055856# comparing the types print(x is y) $ True # Example 2 a = 50 print(type(a)) $ <class: โintโ> b = \"Holberton\" print(type(b)) $ <class: 'string'> ๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ์ ํ์ ๊ฐ์ฒด๊ฐ ๋ณ์์ ์ฐ๊ฒฐ๋๋ ๋ฐฉ์๊ณผ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ํ์ธํ ์ ์์ต๋๋ค. Mutable and Immutable Objects์์์ ์ค๋ช
ํ ๊ฒ์ฒ๋ผ ๊ฐ๋ณ ๊ฐ์ฒด๋ ์ํ๋ ๋ด์ฉ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ ๋ถ๋ณ ๊ฐ์ฒด๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. Immutable Dict12345678910111213141516# ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.d = {'key':'value'}# Read/Write# ๊ฐ์ฒด์ ๊ฐ์ ์ถ๊ฐํ๋ฉด ์ ์์ ์ผ๋ก ๊ฐ์ด ์ถ๊ฐ๋๋๊ฒ์ ํ์ธ ํ ์ ์๋ค.d['key2'] = 'value2'print(d)$ {'key': 'value', 'key2': 'value2'}# Read Only# MappingProxyType์ ์ด์ฉํด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ํ ๋นํ๊ณ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๊ฒ์ ํ์ธ ํ ์ ์๋ค. ๋ง์ ๊ฐ๋ฐ์๋ค์ ํต์์ ์ผ๋ก \"frozen\"์ด๋ผ๋ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ๊ณ ๊ทธ ๋ณ์๋ ๊ฐ์ ๋ณ๊ฒฝ ํ ์ ์๋ immutable์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.d_frozen = MappingProxyType(d)d_frozen['Key2'] = 'value2'# TypeError: 'mappingproxy' object does not support item assignment","link":"/2020/05/28/python_ch_05_01/"},{"title":"2. Python ๊ฐ์ํ๊ฒฝ ํ
์คํธ","text":"๊ฐ์ ํ๊ฒฝ ํ
์คํธ1. ๊ฐ์ํ๊ฒฝ์์ โcodeโ ์คํ1234567891011121314151617181920๊ฐ์ํ๊ฒฝ์ด Active ์ํ์์ \"pip list\"๋ฅผ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฌด๊ฒ๋ ์ค์น๋์ด ์์ง ์๋ค. Package Version ---------- ------- pip 19.0.3 setuptools 40.8.0 You are using pip version 19.0.3, however version 20.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command.pip install --upgrade pip๋ฅผ ์คํํ๋ค.Python์ด ์ ์์ ์ผ๋ก ์ค์น๊ฐ ๋์๋์ง ํ์ธํ๊ธฐ ์ํด์ ๋ช๊ฐ์ง ํ์ธ์์
์ ์งํํ๋ค.Terminal์์ pip install pendulum์ ์คํํ๋ค. (Python์ ์๊ฐ๊ณผ ๋ ์ง๋ฅผ ์ฝ๊ฒ ๋ง๋ค๋๋ก ํด ์ค๋ค)\"pip list\"๋ฅผ ๋ช
๋ น์ด๋ฅผ ์คํํด์ ์ ์์ ์ผ๋ก ํจํค์ง๊ฐ ์ค์น๋์๋์ง ํ์ธํ๋ค. Package Version --------------- ------- pendulum 2.1.0 pip 20.1 python-dateutil 2.8.1 pytzdata 2019.3 setuptools 40.8.0 six 1.14.0๊ฐ์ํ๊ฒฝ์ด Active๋ ์ดํ Prompt์ \"code\"๋ฅผ ์
๋ ฅํด์ Editor๋ฅผ ์คํํ๋ค. 2. ๊ฐ์ ํ๊ฒฝ ์ค์ ํ
์คํธ Editor์์ ์๋์ ์ฝ๋๋ฅผ ์
๋ ฅํ๊ณ ์ฝ๋๋ฅผ ์คํํ๋ค. pendulum ํจํค์ง ํ์ธ ์ฐธ์กฐ 123456789101112131415import pendulumfrom datetime import datetimepst = pendulum.timezone('America/Los_Angeles')ist = pendulum.timezone('Asia/Seoul')# ํ์
ํ์ธprint(type(pst))# ํ์์กด ์๊ฐ ์ถ๋ ฅprint('Current Date Time in PST =', datetime.now(pst))print('Current Date Time in IST =', datetime.now(ist))# ํ์
ํ์ธprint(type(ist)) Result 1234<class 'pendulum.tz.timezone.Timezone'>Current Date Time in PST = 2020-05-14 01:32:57.837594-07:00Current Date Time in IST = 2020-05-14 17:32:57.837676+09:00<class 'pendulum.tz.timezone.Timezone'>","link":"/2020/05/15/python_ch_02/"},{"title":"1. javascript [Variable]","text":"123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124// Whole-script strict mode syntax// JavaScript is very fiexible// flexible == dangerous// added ECAMAScript 5// 1. Use strict// added in ES 5// use this for Valina Javascript.'use strict';// 2. Variable (๋ณ์)// let (added in ES6)let globalName = 'global name';{ let name = 'charles'; console.log(name); name = 'hello'; console.log(name); console.log(globalName);}console.log(name);console.log(globalName);// block scope// block ๋ฐ์์๋ ์์ ๋ด์ฉ์ ๋ณผ ์ ์๋ค.// global ๋ณ์๋ ์ดํ๋ฆฌ์ผ์ด์
์ด ์คํํ ๋๋ถํฐ ์ข
๋ฃ๋ ๋๊น์ง ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผํ๋ค.// \"var\" (don't ever use this!)// var hoisting (move declaration from bottom to top)// ๋ณ์๋ฅผ ์ด๋์ ์ ์ธํ๋์ง์ ์๊ด์์ด ํญ์ ์ ์ผ์๋ก ์ ์ธ์ผ๋ก ๋์ด์ฌ๋ ค์ค๋ค.// ๊ทธ๋ฆฌ๊ณ block๋ฅผ ๋ฌด์ํ๋ค. has no block scope// 3.contants// ๊ฐ์ ํ ๋นํ๋ฉด ์ ๋ ๊ฐ์ด ๋ฐ๋์ง ์๋ ๊ฒ// favor immutable data type always for a few reasons:// -- security// -- thread safety// -- reduce human mistakes// Mutable Type : let, Immutable Type : constconst daysInWeek = 7;const maxNumber = 5;// 4. variable type// primitive, single item: number, string, boolean, null, undefined, symbol// object, box container// function, first-class functionconst count = 17; // integerconst size = 17.1; // decimal numberconsole.log(`value: ${count}, type: ${typeof count}`);console.log(`value: ${size}, type: ${typeof size}`);// number - speicla numberic values: infinity, -infinity, Nanconst infinity = 1 / 0; // ์ซ์๋ฅผ 0์ผ๋ก ๋๋๋๊ฒ์ ๋ฌดํ๋์ ์ซ์๊ฐ ์์ฑ๋๊ณ ์ด๊ฒ์ infinity๋ผ๊ณ ํ๋ค.const negativeInfinity = -1 / 0;const nAn = 'not a number' / 2; // ๋ฌธ์๋ฅผ ์ซ์๋ก ๋๋๋ฉด NaN ๊ฐ์ด ์ถ๋ ฅ๋๋ค.console.log(infinity);console.log(negativeInfinity);console.log(nAn);// bigInt (fairly new, don't use it yet)const bigInt = 123456789012345678901234567890n; // over(-2**53) ~ 2**53 console.log(`value : ${bigInt}, type ${typeof bigInt}`);// stringconst char = 'C';console.log(`value: ${char}, type: ${typeof char}`);const brendan = 'brendan';const greeting = 'Hello' + brendan;console.log(`value: ${greeting}, type: ${typeof greeting}`);const helloBob = `hi ${greeting}!`; // template literals (string)console.log(`value: ${helloBob}, type: ${typeof helloBob}`)// boolean// false: 0, null, undefined, NaN, ''// true: any other valueconst canRead = true;const test = 3 < 1; // falseconsole.log(`value: ${canRead}, type: ${typeof canRead}`);console.log(`value: ${test}, thpe, ${typeof test}`);// nullconst nothing = null;console.log(`value: ${nothing}, type: ${typeof nothing}`)// undefinedlet x;console.log(`value: ${x}, type: ${typeof x}`);// symbol, create unique identifirs of object// ๋์ผํ string์ ์์ฑํ์ด๋ ๋ค๋ฅธ symbol๋ก ๋ง๋ค์ด์ง๊ธฐ ์ฃผ์ด์ง๋ string์ ์๊ด์์ด // ๊ณ ์ ํ ์๋ณ์๋ฅผ ๋ง๋ค๋ ์ฌ์ฉํ๋ค.const symbol1 = Symbol('id');const symbol2 = Symbol('id');console.log(symbol1 == symbol2)// string์ด ๋๊ฐ๊ณ ๋์ผํ symbol์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด .for๋ฅผ ์ด์ฉํ๋ค.const gsymbol1 = Symbol.for('id');const gsymbol2 = Symbol.for('id');console.log(gsymbol1 == gsymbol2); //trueconsole.log(`value: ${symbol1.description}, type: ${typeof symbol1}`);console.log(`value: ${gsymbol1.description}, type: ${typeof gsymbol1}`); //symbol์ .description์ ์ด์ฉํด์ string์ผ๋ก ๋ณํํด์ ์ถ๋ ฅํ๋ค.// object, real-life object, data structure// ellie object๋ const๋ก ์ ์๋์ด์ ํ ๋น์ด ๋ถ๊ฐํ์ง๋ง, ellie.name = 'none'์ผ๋ก๋ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.const ellie = {name: 'ellie', aga: '20'};ellie.name = 'none';console.log(`value: ${ellie.name}, type: ${typeof ellie.name}`)// 5. Dynamic typing: dynamically typed language// javascript๋ ํ์
์ ๋ฏธ๋ฆฌ ์ ์ธํ์ง ์๊ณ runtime์์ ํ ๋น๋ ๊ฐ์ ๋ฐ๋ผ์ type์ด ๋ณ๊ฒฝ๋ ์ ์๋ค.let text = 'hello'console.log(text.charAt(0)); // hconsole.log(`value: ${text}, type:${typeof text}`);text = 1;console.log(`value: ${text}, type:${typeof text}`);text = '7' + 5console.log(`value: ${text}, type:${typeof text}`);text = '8' / '2' console.log(`value: ${text}, type:${typeof text}`);// console.log(text.charAt(0)); // runtime์์ type์ด ์ ํด์ง๋ฏ๋ก Uncaught TypeError ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ์ด ๊ฐ์ (ES5+): ๊ฐ์ด ๋
ธํธ๋ฅผ ์์ฑํ๋ฉฐ ๋ฐฐ์์ ๐๋๋ฆผ์ฝ๋ฉ by ์๋ฆฌ","link":"/2020/05/13/javascript_3/"},{"title":"1. javascript [Operator, if, for loop]","text":"123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204/********************************************************** ์๋ฐ์คํฌ๋ฆฝํธ 4. ์ฝ๋ฉ์ ๊ธฐ๋ณธ operator, if, for loop ์ฝ๋๋ฆฌ๋ทฐ ํ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์
๋ฌธํธ (JavaScript ES6) [https://youtu.be/YBjufjBaxHo] **********************************************************/// 1. String concatenationconsole.log('my' + 'cat');console.log('1' + 2);console.log(`string literals: 1 + 2 = ${1 + 2}`);// 2. Numeric operatorsconsole.log(1 + 1); // addconsole.log(1 - 1); // substractconsole.log(1 * 1); // multiplyconsole.log(1 / 1); // divideconsole.log(5 % 2); // remainderconsole.log(2 ** 3); // exponentiation// 3. Increment and decrement operatorslet counter = 2;const preIncrement = ++counter;// counter = counter + 1;// preIncrement = counter console.log(`preIncrement: ${preIncrement}, counter: ${counter}`);const postIncrement = counter++;// postIncreement = counter;// counter = counter + 1;console.log(`postIncrement: ${postIncrement}, counter: ${counter}`);const preDecrement = --counter;console.log(`preDecrement: ${postIncrement}, counter: ${counter}`);const postDecrement = counter--;console.log(`postDecrement: ${postIncrement}, counter: ${counter}`);// 4. Assignment operstorslet x = 3;let y = 6;x += y; // x = x + y;x -= y;x *= y;x /= y;// 5.Comparison operatorsconsole.log(10 < 6); // less thanconsole.log(10 <= 6); // less than or equalconsole.log(10 > 6); // greater thanconsole.log(10 <= 6); // greater than or equal// 6. Logical operators: || (or), && (and), ! (not)const value1 = false;const value2 = 4 < 2;// || (or), finds the first truthy value// value1 < value2 < check()// expresion์ด๋ function์ ํธ์ถํ๋ ๊ฒฝ์ฐ๋ ์ ์ผ๋ค์ ๋ฐฐ์นํ๋๊ฒ์ด ํจ์จ์ ์ด๋ค.console.log(`or: ${value1 || value2 || check()}`);function check() { for (let i = 0; i < 10; i++) { // wasting time console.log('๐ฑ'); } return true;}// && (and), finds the first truthy value// heavyํ operation์ ๊ฒฝ์ฐ ์ ์ผ๋ค์ ๋ฐฐ์นํ๋๊ฒ์ด ํจ์จ์ ์ด๋ค.console.log(`or: ${value1 && value2 && check()}`);// often used to compress long if-statement// nullableObject && nullableObject.something// if (nullableObject != null) {// nullableObject.something;// }function check() { for (let i = 0; i < 10; i++) { // wasting time console.log('๐ฑ'); } return true;}// ! (not), finds the first truthy value// heavyํ operation์ ๊ฒฝ์ฐ ์ ์ผ๋ค์ ๋ฐฐ์นํ๋๊ฒ์ด ํจ์จ์ ์ด๋ค.console.log(!value1);// 7. Equalityconst stringFive = '5';const numberFive = 5;// == loose equality, with type conversionconsole.log(stringFive == numberFive);console.log(stringFive != numberFive);// === strict equality, no type conversionconsole.log(stringFive === numberFive); console.log(stringFive !== numberFive);// object equality by reference// ellie1๊ณผ ellie2์ value๋ ๊ฐ์ง๋ง ๊ฐ๊ธฐ ๋ค๋ฅธ reference๋ฅผ ์ฐธ์กฐํ๋ค.const ellie1 = {name: 'ellie'}; const ellie2 = {name: 'ellie'};// ellie3๋ ellie1์ ์ฐธ์กฐํ๊ณ ์์ผ๋ฏ๋ก ๊ฐ์ reference๋ฅผ ๊ฐ์ง๊ณ ์๋ค.const ellie3 = ellie1; console.log(ellie1 == ellie2);console.log(ellie1 === ellie2);console.log(ellie1 === ellie3);// equlity - puzzlerconsole.log(0 == false); console.log(0 === false); console.log('' == false);console.log('' === false);console.log(null == undefined);console.log(null === undefined);// 0, null and empty string์ false๋ก ๊ฐ์ฃผ๋ ์ ์๋ค.// 8. conditional operators: if// if, else if, elseconst name = 'ellie';if (name === 'ellie') { console.log(`welcome, ${name}!`);} else if (name === 'coder') { console.log('You\\'re amazing coder');} else { console.log('unknown');}// 9. Ternary operator: ?// condition ? value1 : value2;console.log(name === 'ellie' ? 'yes' : 'no');// 10. Switch statement// use for muliple if checks// use for enum-like value check// use for multiple type checks is TSconst brower = 'IE';switch (brower) { case 'IE': console.log('go away!'); break; case 'Chrome': case 'Firefox': console.log('love you!'); break; default: console.log('same all')}// 11. Loops// while loop, while the condition is truthy,// body code is executed.let i = 3;while (i > 0) { console.log(`while: ${i}`); i--;}// do while loop, body code is executed first,// then check the condition.do { console.log(`do while: ${i}`); i--;} while (i > 0);// for loop, for(begin; condition; step)// begin์ ์ฒ์์ ํ๋ฒ๋ง ํธ์ถํ๊ณ condition๊ณผ step์ ๋ฐ๋ณตํ๋ค.for (i = 3; i > 0; i--) { console.log(`for: ${i}`);}for (let i = 3; i > 0; i = i - 2) { // inline valiable declaration console.log(`inline variable for: ${i}`);}// nested loopsfor (let i = 0; i < 10; i++) { for (let j = 0; j < 10; j++) { console.log(`i: ${i}, j:${j}`); }}// break, continue// Q1. iterate from 0 to 10 and print only even numbers (use condition)for (i = 0; i < 11; i++) { if (i % 2 === 0) { console.log(`even numbers value: ${i}`); }}// Q2. iterate from 0 to 10 and print only even numbers until reaching 8 (use break)for (i = 0; i < 11; i++) { if (i > 8) { console.log('reaching 8'); break; } else { console.log(`value: ${i}`); }} ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ์ด ๊ฐ์ (ES5+): ๊ฐ์ด ๋
ธํธ๋ฅผ ์์ฑํ๋ฉฐ ๋ฐฐ์์ ๐๋๋ฆผ์ฝ๋ฉ by ์๋ฆฌ","link":"/2020/05/13/javascript_4/"}],"tags":[{"name":"Jasper","slug":"Jasper","link":"/tags/Jasper/"},{"name":"Report","slug":"Report","link":"/tags/Report/"},{"name":"Python","slug":"Python","link":"/tags/Python/"},{"name":"Hexo","slug":"Hexo","link":"/tags/Hexo/"},{"name":"Server","slug":"Server","link":"/tags/Server/"},{"name":"Sequence","slug":"Sequence","link":"/tags/Sequence/"},{"name":"Sort","slug":"Sort","link":"/tags/Sort/"},{"name":"Sorted","slug":"Sorted","link":"/tags/Sorted/"},{"name":"Immutable","slug":"Immutable","link":"/tags/Immutable/"},{"name":"Oracle","slug":"Oracle","link":"/tags/Oracle/"},{"name":"์ผ๊ธํจ์","slug":"์ผ๊ธํจ์","link":"/tags/%EC%9D%BC%EA%B8%89%ED%95%A8%EC%88%98/"},{"name":"first-class","slug":"first-class","link":"/tags/first-class/"},{"name":"javascript","slug":"javascript","link":"/tags/javascript/"}],"categories":[{"name":"JasperSoft","slug":"JasperSoft","link":"/categories/JasperSoft/"},{"name":"Python","slug":"Python","link":"/categories/Python/"},{"name":"Hexo","slug":"Hexo","link":"/categories/Hexo/"},{"name":"github.io blog","slug":"Hexo/github-io-blog","link":"/categories/Hexo/github-io-blog/"},{"name":"github pages ํ์ฉํ๊ธฐ","slug":"Hexo/github-pages-ํ์ฉํ๊ธฐ","link":"/categories/Hexo/github-pages-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0/"},{"name":"Jasper Studio ์ค์น","slug":"JasperSoft/Jasper-Studio-์ค์น","link":"/categories/JasperSoft/Jasper-Studio-%EC%84%A4%EC%B9%98/"},{"name":"Jasper Report ์ค์ต","slug":"JasperSoft/Jasper-Report-์ค์ต","link":"/categories/JasperSoft/Jasper-Report-%EC%8B%A4%EC%8A%B5/"},{"name":"Report ํ์ผ ์๋ฒ์ ์ฌ๋ฆฌ๊ธฐ","slug":"JasperSoft/Report-ํ์ผ-์๋ฒ์-์ฌ๋ฆฌ๊ธฐ","link":"/categories/JasperSoft/Report-%ED%8C%8C%EC%9D%BC-%EC%84%9C%EB%B2%84%EC%97%90-%EC%98%AC%EB%A6%AC%EA%B8%B0/"},{"name":"1. Python ํ๊ฒฝ์ค์ ","slug":"Python/1-Python-ํ๊ฒฝ์ค์ ","link":"/categories/Python/1-Python-%ED%99%98%EA%B2%BD%EC%84%A4%EC%A0%95/"},{"name":"2. Python ๊ฐ์ํ๊ฒฝ ํ
์คํธ","slug":"Python/2-Python-๊ฐ์ํ๊ฒฝ-ํ
์คํธ","link":"/categories/Python/2-Python-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD-%ED%85%8C%EC%8A%A4%ED%8A%B8/"},{"name":"3. Python Python Class & Method","slug":"Python/3-Python-Python-Class-Method","link":"/categories/Python/3-Python-Python-Class-Method/"},{"name":"๊ฐ์ํ๊ฒฝ์์ ์ค๋ผํด ์ ์ํ๊ธฐ","slug":"Python/๊ฐ์ํ๊ฒฝ์์-์ค๋ผํด-์ ์ํ๊ธฐ","link":"/categories/Python/%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%EC%98%A4%EB%9D%BC%ED%81%B4-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0/"},{"name":"5. Python Sequence","slug":"Python/5-Python-Sequence","link":"/categories/Python/5-Python-Sequence/"},{"name":"4. Special Method(Magic Method)","slug":"Python/4-Special-Method-Magic-Method","link":"/categories/Python/4-Special-Method-Magic-Method/"},{"name":"sort vs sorted","slug":"Python/5-Python-Sequence/sort-vs-sorted","link":"/categories/Python/5-Python-Sequence/sort-vs-sorted/"},{"name":"Hash Table","slug":"Python/5-Python-Sequence/Hash-Table","link":"/categories/Python/5-Python-Sequence/Hash-Table/"},{"name":"Immutable Dict","slug":"Python/5-Python-Sequence/Immutable-Dict","link":"/categories/Python/5-Python-Sequence/Immutable-Dict/"},{"name":"Oracle","slug":"Oracle","link":"/categories/Oracle/"},{"name":"์์ค ์ํธํ ํ๊ธฐ","slug":"Oracle/์์ค-์ํธํ-ํ๊ธฐ","link":"/categories/Oracle/%EC%86%8C%EC%8A%A4-%EC%95%94%ED%98%B8%ED%99%94-%ED%95%98%EA%B8%B0/"},{"name":"5. Python Function","slug":"Python/5-Python-Function","link":"/categories/Python/5-Python-Function/"},{"name":"๊ธฐ๋ณธ ํน์ง","slug":"Python/5-Python-Function/๊ธฐ๋ณธ-ํน์ง","link":"/categories/Python/5-Python-Function/%EA%B8%B0%EB%B3%B8-%ED%8A%B9%EC%A7%95/"},{"name":"javascript","slug":"javascript","link":"/categories/javascript/"},{"name":"Variable","slug":"javascript/Variable","link":"/categories/javascript/Variable/"},{"name":"Operator","slug":"javascript/Operator","link":"/categories/javascript/Operator/"}]}