๐Ÿ”ฅ Surge in Web Server Attacks Targeting .env, .aws, and .git โ€” API Keys & Database Passwords Exposed

Web servers worldwide are experiencing a surge in automated attacks targeting hidden folders such as .env, .aws, and .git. These attacks aim to steal sensitive data including API keys, database passwords, and cloud credentials, often due to misconfigured servers or careless deployment.


๐Ÿšจ What Attackers Are Trying to Access

Automated attack bots scrape servers for sensitive files like:

GET /.env
GET /.aws/credentials
GET /.git/config
GET /.vscode/settings.json
GET /.npmrc
GET /config/database.yml
  • Database login information
  • AWS access keys
  • Git repository endpoints
  • Package publishing tokens

One exposed file is enough to compromise an entire system.


๐Ÿ’ฃ Real-World Security Impact

  • .env leak โ†’ DB credentials stolen โ†’ full data dump
  • .aws/credentials leak โ†’ unauthorized access to S3 / Lambda / CloudWatch
  • .git exposure โ†’ source code, internal endpoints, and tokens leaked
  • .npmrc leak โ†’ malicious package uploads under your identity

๐Ÿ”’ How to Protect Your Server Immediately

1๏ธโƒฃ Move hidden folders outside the web root

/var/www/html/.env
/var/www/html/.aws/
/var/www/html/.git/

2๏ธโƒฃ Block dotfiles in Nginx / Apache

Nginx:

location ~ /\. {
    deny all;
    return 404;
}

Apache:

<FilesMatch "^\.">
    Require all denied
</FilesMatch>

3๏ธโƒฃ Never commit .env files

Use environment variables, Docker Secrets, or CI/CD Secrets.

4๏ธโƒฃ Monitor logs for suspicious access attempts

/.env
/.git
/.aws/credentials

Block repeated offenders and consider adding automated alerts.


โš ๏ธ Final Warning

If a sensitive file is accessible from the web, assume it is already leaked.

Attackers check hidden folders before anything else. Protect .env, .aws, .git, and all dotfiles immediately.


PC/Mac CapCut ํ•ด์™ธ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ…์ŠคํŠธ ์Œ์„ฑ๋ณ€ํ™˜์— ํ•œ๊ตญ์–ด ์•ˆ๋ณด์ด๋ฉด?

Mac ์ด๋‚˜ PC ์—์„œ CapCut ์„ ์“ฐ๋‹ค๊ฐ€ ๋ณด๋ฉด ์œ ํŠญ ์„ค๋ช… ์˜์ƒ์—์„œ๋Š” ํ…์ŠคํŠธ๋ฅผ ์Œ์„ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์—์„œ ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํ•œ๊ตญ์–ด๊ฐ€ ๋ณด์ด๋Š”๋ฐ ์‹ค์ œ๋กœ ๋ณด๋ฉด ์˜์–ด๋ฅผ ํฌํ•จํ•ด ๋ถˆ์–ด, ์ŠคํŽ˜์ธ์–ด, ์ค‘๊ตญ์–ด๋Š” ๋ณด์ด๋Š”๋ฐ ํ•œ๊ตญ์–ด๊ฐ€ ์•ˆ๋ณด๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์ถฉ ์›์ธ์€ ๊ฐ์ด ์™”์ง€๋งŒ ์ €๋Š” Vrew ์—์„œ ์Œ์„ฑ์„ ๋งŒ๋“ค์–ด ์ผ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์น˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์–ด์ œ ์ œ๊ฐ€ ์ถ”์ธกํ•œ ๋ฌธ์ œ๊ฐ€ ๋งž๋Š”์ง€ ์‹คํ—˜์„ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ํ•œ๊ตญ IP ๋ฅผ ์–ป์„์ˆ˜ ์žˆ๋Š” VPN ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด๋ฃŒ๋กœ๋Š” SoftEther VPN ์ด ์žˆ๊ณ  ๊ทธ์™ธ ์œ ๋ฃŒ VPN ์„ ์จ๋„ ๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์œ ๋ฃŒ๋ฅผ CyberGhost ๋ฅผ ์”๋‹ˆ๋‹ค. (์ถ”์ฒœ ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋Š” ๋”ฐ๋กœ ๋ฌผ์–ด๋ณด์„ธ์š”) ์ฒ˜์Œ์—๋Š” ์›๋ž˜ ์“ฐ๋˜ CapCut ์„ ๊ทธ๋ƒฅ๋‘๊ณ  VPN ์„ ํ†ตํ•ด ํ•œ๊ตญ IP ๋งŒ ์—ฐ๊ฒฐํ•ด ์ฃผ๊ณ  ์บก์ปท์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ํ•œ๊ตญ์–ด๊ฐ€ ๋ณด์ผ์ค„ ์•Œ์•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ์บก์ปท์„ ์ง€์›๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  VPN ์œผ๋กœ ํ•œ๊ตญ IP  ์— ์ ‘์†ํ•˜๊ณ ์š”. ์ƒˆ๋กœ ์บก์ปท์„ ๋‹ค์šด๋กœ๋“œ ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ๋๋‚  ๋•Œ๊นŒ์ง€ VPN ์€ ๊ณ„์† ์ผœ๋†“์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ์ƒํƒœ์—์„œ ์บก์ปท์„ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ํ•œ๊ตญ์–ด๊ฐ€ ๋œน๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„์—๋Š” VPN ์„ ๋Š์–ด๋ฒ„๋ ค๋„ ํ•œ๊ตญ์–ด๋Š” ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์„ ํ–ˆ์ง€๋งŒ ์‚ฌ์‹ค ์บก์ปท์ด ์ œ๊ณตํ•˜๋Š” ํ•œ๊ตญ์–ด ์Œ์„ฑ๋ณ€ํ™˜์€ ํ’ˆ์งˆ์ด ๋ณ„๋กœ์ž…๋‹ˆ๋‹ค. (์ €๋Š” Pro ๊ตฌ๋…์ž์ž…๋‹ˆ๋‹ค) 

MacOS ์šฉ ์‚ฌ์ด๋ฒ„๊ณ ์ŠคํŠธ VPN


์œˆ๋„์ฆˆ์šฉ SoftEther VPN

๋ธ”๋ž™ํ•‘ํฌ ๋กœ์ œ์˜ ๋ณด์ปฌ์˜ ํŠน์ง•

 

๋ธ”๋ž™ํ•‘ํฌ ๋กœ์ œ(Rosรฉ)์˜ ๋ณด์ปฌ์€ ๋…ํŠนํ•˜๊ณ  ๊ฐ์„ฑ์ ์ธ ์Œ์ƒ‰์œผ๋กœ, ๊ทธ๋…€๋งŒ์˜ ๋งค๋ ฅ์„ ์ž˜ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ œ์˜ ๋ชฉ์†Œ๋ฆฌ๋Š” ๋ธ”๋ž™ํ•‘ํฌ ๋…ธ๋ž˜์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ, ์ „ ์„ธ๊ณ„ ํŒฌ๋“ค์—๊ฒŒ ๊นŠ์€ ์ธ์ƒ์„ ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋…€์˜ ๋ณด์ปฌ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

1. ๊ฐ์„ฑ์ ์ธ ์Œ์ƒ‰

โ€ข ๋กœ์ œ์˜ ๋ชฉ์†Œ๋ฆฌ๋Š” ๋ง‘๊ณ  ์„œ์ •์ ์ด๋ฉด์„œ๋„ ์•ฝ๊ฐ„ ํ—ˆ์Šคํ‚คํ•œ ํ†ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋งค์šฐ ๊ฐ์ •์ ์ด๊ณ  ๋”ฐ๋œปํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์ด ํ—ˆ์Šคํ‚คํ•œ ์Œ์ƒ‰์€ ๊ทธ๋…€์˜ ๋ณด์ปฌ์„ ๋” ๊ฐœ์„ฑ ์žˆ๊ณ  ๊ฐ์„ฑ์ ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋…ธ๋ž˜์˜ ๊ฐ์ •์„ ์„ ์ž˜ ํ‘œํ˜„ํ•˜์—ฌ ๋“ฃ๋Š” ์ด๋“ค์—๊ฒŒ ๊ฐ•ํ•œ ๊ฐ์ •์  ์šธ๋ฆผ์„ ์ค๋‹ˆ๋‹ค.

2. ๋ง‘์€ ๊ณ ์Œ

โ€ข ๋กœ์ œ๋Š” ๊ณ ์Œ์—์„œ ํŠนํžˆ ๋ง‘๊ณ  ๊นจ๋—ํ•œ ์†Œ๋ฆฌ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค. ๊ณ ์Œ์ด ํž˜์ฐจ๋ฉด์„œ๋„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด์–ด์ง€๋ฉฐ, ๋ชฉ์†Œ๋ฆฌ์˜ ๊นŠ์ด๋ฅผ ๋”ํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋ž™ํ•‘ํฌ ๊ณก์—์„œ ํ›„๋ ด๊ตฌ๋‚˜ ํด๋ผ์ด๋งฅ์Šค ๋ถ€๋ถ„์—์„œ ๊ทธ๋…€์˜ ๊ณ ์Œ์ด ๋‹๋ณด์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

3. ๋…ํŠนํ•œ ๋ฐœ์Œ๊ณผ ๋”•์…˜

โ€ข ๋กœ์ œ๋Š” ํ˜ธ์ฃผ์—์„œ ์ž๋ผ์„œ ์˜์–ด๊ฐ€ ๋ชจ๊ตญ์–ด์ธ ๋•๋ถ„์— ์˜์–ด ๊ฐ€์‚ฌ์—์„œ๋„ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐœ์Œ๊ณผ ์œ ๋ คํ•œ ๋”•์…˜์„ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๊ตญ์–ด ๊ฐ€์‚ฌ์—์„œ๋„ ํŠน์œ ์˜ ๋ฐœ์Œ ์Šคํƒ€์ผ์ด ๋ฐ˜์˜๋˜์–ด ์žˆ์–ด ๊ทธ๋…€์˜ ๋ชฉ์†Œ๋ฆฌ๊ฐ€ ๋”์šฑ ๋…ํŠนํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

4. ๊ฐ•๋ ฌํ•œ ๊ฐ์ • ํ‘œํ˜„

โ€ข ๋กœ์ œ๋Š” ๋…ธ๋ž˜์—์„œ ๊ฐ์ •์˜ ๋ณ€ํ™”์™€ ๊นŠ์ด๋ฅผ ์ž˜ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋ฐœ๋ผ๋“œ๋‚˜ ๊ฐ์„ฑ์ ์ธ ๋…ธ๋ž˜์—์„œ ์Šฌํ””์ด๋‚˜ ๊ณ ๋…ํ•จ ๊ฐ™์€ ๊ฐ์ •์„ ๊ฐ•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋Œ„์Šค๊ณก์—์„œ๋„ ๊ฐ•๋ ฌํ•œ ์—๋„ˆ์ง€๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด์ปฌ ์Šคํƒ€์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ์ • ํ‘œํ˜„ ๋Šฅ๋ ฅ์€ ๊ทธ๋…€์˜ ์†”๋กœ๊ณก์ธ โ€œOn The Groundโ€๋‚˜ โ€œGoneโ€์—์„œ ํŠนํžˆ ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค.

5. ์œ ์—ฐํ•œ ๋ณด์ปฌ ์ปจํŠธ๋กค

โ€ข ๋กœ์ œ๋Š” ์ž์‹ ๋งŒ์˜ ๋ณด์ปฌ ์Šคํƒ€์ผ์„ ์ž˜ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋‹ค์–‘ํ•œ ์žฅ๋ฅด์—์„œ ์œ ์—ฐํ•˜๊ฒŒ ๋ณด์ปฌ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธ”๋ž™ํ•‘ํฌ์˜ ๊ณก๋“ค์€ ํž™ํ•ฉ, EDM, ํŒ, ๋ฐœ๋ผ๋“œ ๋“ฑ ๋‹ค์–‘ํ•œ ์žฅ๋ฅด๋ฅผ ํฌํ•จํ•˜๋Š”๋ฐ, ๋กœ์ œ๋Š” ๊ฐ ์žฅ๋ฅด์— ๋งž๊ฒŒ ๋ชฉ์†Œ๋ฆฌ์˜ ํ…์Šค์ฒ˜์™€ ๊ฐ•์•ฝ์„ ์กฐ์ ˆํ•˜๋ฉฐ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์†Œํ™”ํ•ด๋ƒ…๋‹ˆ๋‹ค.

6. ํƒ„ํƒ„ํ•œ ๋ผ์ด๋ธŒ ์‹ค๋ ฅ

โ€ข ๋กœ์ œ๋Š” ๋ฌด๋Œ€ ์œ„์—์„œ๋„ ์•ˆ์ •๋œ ๋ผ์ด๋ธŒ ์‹ค๋ ฅ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ, ์ถค์„ ์ถ”๋ฉด์„œ๋„ ํ”๋“ค๋ฆฌ์ง€ ์•Š๋Š” ๋ณด์ปฌ๋กœ ๊ณต์—ฐ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ ๊ณต์—ฐ์—์„œ ๊ทธ๋…€์˜ ๋ณด์ปฌ์€ ์Œ์›๊ณผ ํฐ ์ฐจ์ด๊ฐ€ ์—†์„ ์ •๋„๋กœ ์•ˆ์ •์ ์ด๋ฉฐ, ํŠนํžˆ ๊ฐ์ •์ ์ธ ๊ณก์—์„œ๋Š” ๋ผ์ด๋ธŒ๋กœ ๋“ฃ๋Š” ๊ฒƒ์ด ๋” ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค.

๋กœ์ œ์˜ ๋ณด์ปฌ์€ ๋ธ”๋ž™ํ•‘ํฌ์˜ ์Œ์•…์— ๊ฐ์„ฑ์  ๊นŠ์ด์™€ ๋…ํŠนํ•œ ๊ฐœ์„ฑ์„ ๋”ํ•ด์ฃผ๋ฉฐ, ๊ทธ๋…€์˜ ์†”๋กœ ํ™œ๋™์—์„œ๋„ ํฐ ๊ฐ•์ ์œผ๋กœ ์ž‘์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ๋”” ํ•ด์ปค, 1์ธ ๊ฐœ๋ฐœ์ž ์‚ฌ์—…๊ฐ€

์ธ๋”” ํ•ด์ปค(indie hacker) ๋˜๋Š” 1์ธ ๊ฐœ๋ฐœ ์‚ฌ์—…์€ ํ˜ผ์ž์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด๋‚˜ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์ˆ˜์ต์„ ์ฐฝ์ถœํ•˜๋Š” ํ˜•ํƒœ์˜ ์ฐฝ์—…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์Šคํƒ€ํŠธ์—…๊ณผ ๋‹ฌ๋ฆฌ, ์™ธ๋ถ€ ํˆฌ์ž ์—†์ด ์ž๊ธฐ ์ž๊ธˆ์ด๋‚˜ ์ž‘์€ ๊ทœ๋ชจ์˜ ์ž์›์„ ํ™œ์šฉํ•ด ์ž๋ฆฝํ•˜๋Š” ๊ฒƒ์ด ํŠน์ง•์ž…๋‹ˆ๋‹ค.


์ธ๋”” ํ•ด์ปค๊ฐ€ ๋˜๋Š” ๊ณผ์ •์€ ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค:


1. ์•„์ด๋””์–ด ์„ ์ •: ์‚ฌ์šฉ์ž์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋…์ฐฝ์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

2. ๊ฐœ๋ฐœ: ํ˜ผ์ž์„œ ์ฝ”๋”ฉ, ๋””์ž์ธ, ๋ฐฐํฌ ๋“ฑ ๋ชจ๋“  ๊ฐœ๋ฐœ ๊ณผ์ •์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

3. ๋Ÿฐ์นญ: ์ œํ’ˆ์„ ์›น์‚ฌ์ดํŠธ, ์•ฑ์Šคํ† ์–ด, ๋˜๋Š” ์†Œ์…œ๋ฏธ๋””์–ด ๋“ฑ์„ ํ†ตํ•ด ๊ณต๊ฐœํ•˜๊ณ  ํ™๋ณดํ•ฉ๋‹ˆ๋‹ค.

4. ๋งˆ์ผ€ํŒ… ๋ฐ ํŒ๋งค: ์ดˆ๊ธฐ ์‚ฌ์šฉ์ž๋ฅผ ํ™•๋ณดํ•˜๊ณ , ๊พธ์ค€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ์ œํ’ˆ์„ ๊ฐœ์„ ํ•˜๋ฉด์„œ ์ˆ˜์ต์„ ์ฐฝ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

5. ์œ ์ง€ ๋ฐ ํ™•์žฅ: ์ˆ˜์ต ๋ชจ๋ธ์ด ์•ˆ์ •ํ™”๋˜๋ฉด ๊ณ„์†ํ•ด์„œ ์ œํ’ˆ์„ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ• ์ง€, ๋˜๋Š” ์ƒˆ๋กœ์šด ์•„์ด๋””์–ด๋ฅผ ๊ฐœ๋ฐœํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.


๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ SaaS(์„œ๋น„์Šคํ˜• ์†Œํ”„ํŠธ์›จ์–ด), ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋””์ง€ํ„ธ ์ œํ’ˆ(์˜ˆ: ์˜จ๋ผ์ธ ๊ฐ•์˜, ์ด๋ถ) ๋“ฑ์„ ๋งŽ์ด ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.


์ธ๋”” ํ•ด์ปค ํ™œ๋™์˜ ์žฅ์ ์œผ๋กœ๋Š” ์œ ์—ฐํ•œ ์ผ์ • ๊ด€๋ฆฌ, ์ฐฝ์˜์ ์ธ ํ†ต์ œ๊ถŒ, ๊ทธ๋ฆฌ๊ณ  ์ž‘์€ ๊ทœ๋ชจ์—์„œ๋„ ํฐ ์„ฑ๊ณต์„ ์ด๋ฃฐ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


2011 iMac ์—์„œ Plex ์„œ๋ฒ„

 ํ• ์•„๋ฒ„์ง€ 2011 ์•„์ด๋งฅ์„ Plex ์„œ๋ฒ„๋กœ ๋Œ๋ฆฌ๊ณ  ์žˆ๋Š”๋ฐ ๊ธฐ๊ฐ€๋น„ํŠธ ์ด๋”๋„ท์— ๊ผฝ๊ณ  ์ด ์•„์ด๋งฅ์˜ ๋‚ด์žฅ ํ•˜๋“œ์—์„œ ๋‹ค๋ฅธ ๊ธฐ๊ฐ€๋น„ํŠธ ์ด๋”๋„ท์œผ๋กœ ์—ฐ๊ฒฐํ•œ ์ปด์œผ๋กœ ํŒŒ์ผ ๋ณต์‚ฌ๋ฅผ ํ•˜๋ฉด 100MB/s ์ด ์‰ฝ๊ฒŒ ๋‚˜์˜ต๋‹ˆ๋‹ค๋งŒ ์•„์ด๋งฅ์˜ ์™ธ์žฅ ํ•˜๋“œ๋กœ ๋ถ€ํ„ฐ ๋ณต์‚ฌ๋ฅผ ํ•˜๋ฉด 40MB/s ์–ธ์ €๋ฆฌ๋„ ๊ฒจ์šฐ ๋‚˜์˜ต๋‹ˆ๋‹ค… ์ด ์•„์ด๋งฅ์˜ UBS2 ์˜ ์ตœ๋Œ€์†๋„๊ฐ€ 480Mbps ๋ผ… ๊ธฐ๊ฐ€๋น„ํŠธ ์ด๋”๋„ท์€ ๊ฐœ์‚ด๊ตฌ์ž„. ๋ฌผ๋ก  10Gb Thunderbolt ํฌํŠธ๊ฐ€ ์žˆ์ง€๋งŒ Mini DP ํ˜•ํƒœ์˜ ์ฌ๋”๋ณผํŠธ ์ง€์› ์™ธ์žฅํ•˜๋“œ ์ผ€์ด์Šค๋Š” ๊ตฌํ•˜๊ธฐ๋„ ํž˜๋“ค๊ณ  ์žฌ๊ณ ๊ฐ€ ์žˆ๋‹คํ•ด๋„ ๋ฐฐ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ์ปค์ง€์ง€์š”. UBS2 ์™ธ์žฅ ํ•˜๋“œ๋กœ๋„ Plex ์„œ๋ฒ„๋กœ ์“ฐ๋Š”๋ฐ๋Š” ์ถฉ๋ถ„ํ•จ.

๋ฉ”ํƒ€์˜ Threads

๋ฉ”ํƒ€์˜ Threads ๊ฐ€ ์ž‘๋…„ 7์›” 5์ผ์— ์˜คํ”ˆํ–ˆ๊ณ , ๋‹ค์Œ๋‚ ์ธ๊ฐ€ ๋‚ด ์ฒซ ํฌ์ŠคํŒ…… ๋ฐ˜๋…„์ด์ƒ ๋ˆˆํŒ…๋งŒํ•˜๋‹ค ์ตœ๊ทผ์— ๋ˆˆ์— ๋„์ด๋Š” ๊ธ€๋“ค์— ๋Œ“๊ธ€์„ ์กฐ๊ธˆ ๋‹ฌ๊ณ  ์žˆ๋Š”๋ฐ… ํ˜•ํƒœ๋Š” ๋น„์Šทํ•˜์ง€๋งŒ ํŠธ์œ„ํ„ฐ์™€๋Š” ๊ฒฐ์ด ๋‹ค๋ฆ„. ์ผ๋‹จ ์–ผ๋งˆ์ „๊นŒ์ง€ ์œ ํ–‰ํ–ˆ๋˜ Clubhouse. ์š”์ฆ˜ ๊ทธ ๊ณณ์„ ์–ธ๊ธ‰ํ•˜๋Š” ์‚ฌ๋žŒ ๊ฑฐ์˜ ์—†๊ณ  ํŽ˜๋ถ์ด๋‚˜ X ์—์„œ Threads ๋ฅผ ๋” ์–ธ๊ธ‰ํ•จ. ์ž ๊น ์œ ํ–‰์ด ๋ ์ง€, X, ์ธ์Šคํƒ€, ํŽ˜๋ถ์ฒ˜๋Ÿผ ํฐ ์ž๋ฆฌ๋ฅผ ์žก์„์ง€๋Š” ์•„์ง์€ ๋‚˜๋Š” ๊ด€๋ง์ค‘. My 1st posting on Theread: https://www.threads.net/@sexydeveloper/post/CuX5ngusHr2?xmt=AQGzrKUfDJkBejgz0_KzvXSN-DtDzLRrI51ILeM3b6upLw

iOS error – Canvas area exceeds the maximum limit (width * height > 16,777,216)

์›น์—์„œ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด ์บ”๋ฒ„์Šค ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ FHD (1920×1080) ๋กœ ์บ”๋ฒ„์Šค๋ฅผ ์ƒ์„ฑํ•ด ๋งŒ๋“  ์•ฑ์ด iOS ์˜ ์‚ฌํŒŒ๋ฆฌ๋‚˜ ํฌ๋กฌ, ์•ณ์ง€์—์„œ ์˜ฌ๋ ค๋ณด๋ฉด Canvas area exceeds the maximum limit (width * height > 16,777,216) ์ด๋Ÿฐ ์—๋Ÿฌ๋ฅผ ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ์—์„œ ๋ณด์ด๋ฉฐ ์‹คํ–‰ ์•ˆ๋จ. ๊ทผ๋ฐ 1920×1080 = 2,073,600 ๋กœ ์ œํ•œ์„ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋ฐ๋„ ์ด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค๋Š” ์‹ฌ์˜คํ•œ ๋ฌธ์ œ? ๋ˆˆ์น˜์ฑ˜๊ฒ ์ง€๋งŒ ๋ ˆํ‹ฐ๋‚˜ ๋””์Šคํ”Œ๋ ˆ์ด ๋•Œ๋ฌธ์ž„. ํ•ด์ƒ๋„๊ฐ€ ๋†’๋‹ค๋ณด๋‹ˆ window ๊ฐœ์ฒด์˜ device pixel ratio ์†์„ฑ์ด 3 ์ด์•ผ ๊ทธ๋Ÿฌ๋‹ˆ ๋ฌผ๋ฆฌ์ ์œผ๋กœ (1920×3) x (1080×3) = 18,662,400 ๋ฅผ ๋…ผ๋ฆฌ์  1920×1080 ์งœ๋ฆฌ ์บ”๋ฒ„์Šค๋กœ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋‚จ. ๊ตฌ๊ธ€๋งํ•ด๋ณด๋ฉด ๋ช‡๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด (์ƒ์„ฑํ˜• AI ๋“ค์€ ์•ž์— ์„ค๋ช…ํ•œ ๋‚ด์šฉ์„ ๋‚ด๊ฐ€ ์จ์ฃผ๊ธฐ ์ „๊นŒ์ง€ ์ œ๋Œ€๋กœ ๋ชจ๋ฆ„) ์žˆ๋Š”๋ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ iOS ์ œํ•œ ํ”ฝ์…€ / (1920×3) x (1080×3) = 0.89… ์ด ๋น„์œจ๋กœ ์บ”๋ฒ„์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ๋ ค์ง„ ๋‚ด์šฉ์„ ์ด ๋น„์œจ๋กœ zoom out ์‹œ์ผœ์„œ ํ‘œ์‹œ… ์—ด๋ผ ๊ท€์ฐฎ๊ธดํ•œ๋ฐ… ์—ฌํ•˜ํŠผ ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ํ‘œ์‹œ๋จ. ๋ˆ๋ฐ›๊ณ  ํ•˜๋‹ˆ ํ•˜์ง€ ์•ˆ ๊ทธ๋Ÿผ ๋ชจ๋ฅด๊ณ  ์žˆ์„ ์ผ์ด์ง€ ์•Š์„๊นŒ? ใ…‹ 

Streptosquarus Shape Count

 

A bacteria called streptosquarus comes in very peculiar shapes. The streptosquarus is flat with no perceived thickness. (It is essentially two-dimensional.) It is composed of an integer number of unit squares.

In addition, all the squares in the streptosquarus must be touching at least one other square of the bacteria along edges. 

Write a program that takes a positive integer from the user and returns the number of possible different streptosquarus shapes of that size. Notice that there is only one streptosquarus of sizes one and two, but there are two of size three, five of size four, and 12 of size five.

๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์ŠคํŠธ๋ ™ํ† ์Šค์ฟผ๋Ÿฌ์Šค์˜ ํ˜•ํƒœ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํšŒ์ „๊ณผ ๋Œ€์นญ์— ์˜ํ•œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์—ฌ ์œ ์ผํ•œ ํ˜•ํƒœ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํšŒ์ „๊ณผ ๋Œ€์นญ์„ ํ™•์ธํ•˜๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋งค์šฐ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํฌ๊ธฐ๊ฐ€ 5๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์‹คํ–‰ ์‹œ๊ฐ„์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

from collections import deque


def generate_streptosquarus(n):
if n == 1:
return 1

# All possible moves from a square
moves = [(0, 1), (1, 0), (0, -1), (-1, 0)]

# Generate all possible shapes by adding a square to each exposed edge
def generate_shapes(current_shape):
new_shapes = set()
for x, y in current_shape:
for dx, dy in moves:
new_pos = (x + dx, y + dy)
if new_pos not in current_shape:
new_shape = current_shape | {new_pos}
new_shapes.add(frozenset(new_shape))
return new_shapes

# Normalize shapes by rotating and flipping to remove duplicates
def normalize(shape):
# Convert frozenset to a sorted list of tuples to allow rotations and flips
shape = sorted(shape)

def rotate(shape):
return sorted((y, -x) for x, y in shape)

def flip(shape):
return sorted((-x, y) for x, y in shape)

# Generate all unique rotations and flips of the shape
unique_transforms = {tuple(shape)}
for _ in range(3): # Rotate three more times
shape = rotate(shape)
unique_transforms.add(tuple(shape))

# Flip the shape and get all its rotations
shape = flip(shape)
unique_transforms.add(tuple(shape))
for _ in range(3): # Rotate three more times
shape = rotate(shape)
unique_transforms.add(tuple(shape))

# Normalize to ensure all shapes start from (0, 0)
def normalize_shape(transform):
min_x = min(x for x, y in transform)
min_y = min(y for x, y in transform)
return tuple((x - min_x, y - min_y) for x, y in transform)

normalized_shapes = set(normalize_shape(transform) for transform in unique_transforms)
return min(normalized_shapes) # Return the smallest normalized shape

# Use a set to store all unique shapes
unique_shapes = set()

# Starting queue with a single square
queue = deque([frozenset([(0, 0)])])
while queue:
shape = queue.popleft()
if len(shape) == n:
norm_shape = normalize(shape)
unique_shapes.add(norm_shape)
else:
for new_shape in generate_shapes(shape):
queue.append(new_shape)

return len(unique_shapes)


# Example usage
def main():
print("Enter a positive integer or 'q' to quit.")
while True:
user_input = input("Enter a integer number or 'q' to quit: ")
if user_input.lower() == 'q':
print("Program has ended.")
break
try:
n = int(user_input)
if n < 1:
print("Warning: Please enter a positive integer.")
elif n > 6:
print("Warning: Calculations for numbers greater than 6 may be slow.")
result = generate_streptosquarus(n)
print(f"Number of possible shapes for a streptosquarus of size {n}: {result}")
except ValueError:
print("Warning: Please enter a valid integer or 'q' to quit.")


if __name__ == "__main__":
main()

ํ”Œ๋Ÿฌํ„ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์•ž์— const ๋ถ™์ด๋Š”๊ฒŒ ๋œ ์ด์œ 

์œ„์˜ ํ”Œ๋Ÿฌํ„ฐ ์•ฑ ์ง„์ž…์ ์— ์žˆ๋Š” main() ํ•จ์ˆ˜์—์„œ, ์˜ˆ์ „์—๋Š” ์•ˆ ๋ถ™์ด๋˜ MyApp() ์•ž์— const ๊ฐ€ ๋ถ™๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

runApp(const MyApp()); 

์ด๊ฑฐ๋‚˜

const MyApp({super.key});

์ด ๊ณณ์— const ๋Š” ์™œ ๋ถ™์ด๊ฒŒ ๋˜์—ˆ๋Š”๊ฐ€? Flutter์—์„œ const ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ตœ์ ํ™”์™€ ๊ด€๋ จ๋œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. const ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์ ฏ์„ ์„ ์–ธํ•˜๋ฉด, Flutter๋Š” ๊ทธ ์œ„์ ฏ์„ ์œ„์ ฏ ํŠธ๋ฆฌ์— ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑํ•˜๊ณ , ๋‹ค์‹œ ๋นŒ๋“œํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠนํžˆ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”(static) ์œ„์ ฏ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „์˜ Flutter์—์„œ๋Š” const์˜ ์‚ฌ์šฉ์ด ํ•„์ˆ˜์ ์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, Flutter์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ์•ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ธฐ ์œ„ํ•ด const ํ‚ค์›Œ๋“œ์˜ ์‚ฌ์šฉ์ด ์ ์  ๋” ๊ถŒ์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

const๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ์ด์ ์€

๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ: const๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ƒ์„ฑ๋˜๋ฉฐ, ๋Ÿฐํƒ€์ž„์—๋Š” ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ํ–ฅ์ƒ: const ์œ„์ ฏ์€ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, Flutter ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์œ„์ ฏ์„ ๋‹ค์‹œ ๋นŒ๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ๊ฐ€๋…์„ฑ: const๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, runApp(const MyApp());์—์„œ const MyApp()์€ MyApp ์œ„์ ฏ์ด ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๊ณ , ๊ทธ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋  ํ•„์š”๊ฐ€ ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, const MyApp({super.key});๋Š” MyApp์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ•ญ์ƒ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ตœ์ ํ™”๋Š” ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์•ฑ ๋˜๋Š” ๋ณต์žกํ•œ UI๋ฅผ ๊ฐ€์ง„ ์•ฑ์—์„œ ๋”์šฑ ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ์‹  Flutter ๊ฐœ๋ฐœ์—์„œ๋Š” const์˜ ์‚ฌ์šฉ์ด ๋”์šฑ ๊ฐ•์กฐ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

#ํ”Œ๋Ÿฌํ„ฐ #Flutter #์ƒ์ˆ˜ํ˜• #const

UGREEN 1-IN 2-OUT Bidirectional HDMI Switcher 4K 60Hz

์˜ค๋Š˜ ์‚ฌ์šฉํ•ด ๋ณธ ์ œํ’ˆ์€ UGREEN ์˜ Bidirectional HDMI Switcher 4K 60Hz ์ œํ’ˆ์ž…๋‹ˆ๋‹ค. 

Bidirectional ์ด๊ธฐ ๋•Œ๋ฌธ์— 2 in 1 Out, HDMI Splitter ๋กœ ์“ฐ๊ฑฐ๋‚˜ 1 in 2 Out HDMI Selector ๋กœ ์“ธ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ก์Šค๋ฐ•์Šค์™€ ํ”Œ๋ ˆ์ด์Šคํ…Œ์ด์…˜์— 1๊ฐœ ๋ชจ๋‹ˆํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ ํ•˜๊ณ ์‹ถ์€ ๊ฒŒ์ž„๊ธฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๊ณ ์š”. 

ํ•œ๊ฐœ์˜ ์ปดํ“จํ„ฐ ์ถœ๋ ฅ์„ ์˜ค๋Š˜์€ ์™ผ์ชฝ ๋ชจ๋‹ˆํ„ฐ, ๋‚ด์ผ์€ ์˜ค๋ฅธ์ชฝ ๋ชจ๋‹ˆํ„ฐ์—์„œ ๋ณด๊ณ  ์‹ถ์„ ๋•Œ ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ฃ .

์ €๋Š” ํ•œ์ชฝ์€ ๋งฅ์— ํ•œ์ชฝ์€ ์œˆ๋„์— ์—ฐ๊ฒฐํ•ด์„œ ํ•œ๊ฐœ์˜ ๋ชจ๋‹ˆํ„ฐ๋กœ ์ถœ๋ ฅํ•˜๋Š”๋ฐ ์“ฐ๋ ค๊ณ  ์ƒ€์Šต๋‹ˆ๋‹ค.

์ „ํ™˜ ์†๋„๋Š” ๊ทธ๋ ‡๊ฒŒ ๋น ๋ฅด์ง€ ์•Š์•„์„œ ๋ผ์ด๋ธŒ ๋ฐฉ์†ก์—์„œ ์“ธ๋งŒํ•˜์ง€๋Š” ์•Š๊ฒ ๋„ค์š”. ์บ๋‚˜๋‹ค ์•„๋งˆ์กด ํ˜„์žฌ ๊ฐ€๊ฒฉ์€ 19๋ถˆ์ž…๋‹ˆ๋‹ค.

์Šฌ๋ผ์ž„์˜ ๊ฐ„๋‹จ ๋ฆฌ๋ทฐ ์˜€์Šต๋‹ˆ๋‹ค.