2026년 4월 4일 토요일

[2026-04-04] 경험의 멸종(The Extinction of Experience)

경험의 멸종(The Extinction of Experience)


인간은 자의식이 있음을 잃어버린다. 
그리고 요즘엔 육체가 있다는 것도 잊어버리고 있다.

스마트폰을 통한 수많은 경험, 소통 그러나 걸음마를 하면서 넘어지며 상처가 난 아픔, 이를 뽑아야 새 이가 돋아나는 느낌이 모든 것은 육체가 있어야만 경험할 수 있는 것들이다.

기술의 발전으로 인해 마케팅이 현실의 경험을 대신 고객이 경험한 듯 전달하고 있다.
수많은 쇼츠, 동영상을 오래도록 보고 나면 내가 경험한 건가? 영상으로 본 건가? 혼란스럽다.

그래서 동료들과 이야기 하다가 '내가 겪은 것처럼 말하다 보니 구체화가 안되는 경우도 생긴다'
그때, 아 이거 내가 경험한 게 아니구나.. 

이미 인류는 기술의 발전을 내려 놓지 않을 것이다. 
어떤 사람은 돈을 위해, 어떤 사람은 아픈 사람을 돕겠다는 의지로, 
어떤 사람은 지구와 인류를 위해 점점 기술을 발전 시킬 것이다.

그러나 아프지 않고, 죽지 않고, 움직이지 않아도 되는 세상이 오면 
과연 우리에게 어떤 의미가 있을까? 
몇 사람이나 행복함을 느끼고 살까 싶다.

우리는 SNS, Youtube를 통해 이미 너무나 많은 타인의 삶을 훔쳐보고 있다. 
이제는 그 타인의 삶도 AI 가 만들어 내고 있어 그 진위가 모호하다.

우리는 왜 타인의 삶을 훔쳐보게 됐을까? 
아마도 우리는 경험을 할 수 없는 것에 대리만족 하고 있지 않을까?

왜 ? 언제부터 우리는 경험하는 것도 못하게 되었을까?

학교는 점점 현장 학습, 운동회, 친구들과 하는 공동 과제를 줄여간다.
경쟁도 현장 학습도, 운동도 없다.

어디서 다양한 경험을 하는 방법, 심지어 사람과 처음 인사를 하고 말을 트고 하는 것은 배웠을까?
사람이 지나가면 눈이 마주치면 인사하는 것은 배웠을까?

나는 기술을 좋아 한다. 그러나 경험할 수 있는 시간까지 빼앗기고 싶지 않다.
내가 기술을 좋아 하는 이유는 적어도 하루 8시간 안에 일을 끝내고 (예전에는 불가능 했나? 그래서 야근을 많이 했나?) 가족들과 친구들과 혹은 혼자서 산책도 독서도 등산도 하고 싶어서 이다.

너무 늦게 퇴근하면 하기 어려운 것들을 기술로 일을 제시간에 마치고 칼퇴해야만 할 수 있는 경험들이다.

물론 환자나 노인 등 약자에게 짜증 내지 않고 친절하게 응대하고 도와주는 로봇 같은 기술은 필요하다. 이런 사람이 있으면 좋겠지만 현실에는 보기 힘들다. 그래서 이 분야는 로봇으로 대체하는 것에 찬성한다.

나는 노트에 펜으로 글쓰는 걸 좋아한다. 이렇게 타이핑 치기 전 반드시 내 생각을 글로 그림으로 종이에 작성해본다. 

서양에서는 타자가 발전한 이후로 필기를 하는 것은 거의 없다고 한다.
정자체, 필기체 이렇게 구분해서 쓸 수 있는 사람이 몇이나 될까?

손으로 직접 글씨를 쓰는데는 손근육과 생각등이 확장되는데 아주 도움이 된다.

건축 설계 도면을 손으로 그리다가 CAD가 나오면서 생산성은 혁신이 되었지만, 
왠지 나는 더 많은 시간을 컴퓨터 앞에 앉아 있고 생각도 안하고 무지성으로 라인 그리고 연결하고 있는 것을 퇴근할 쯤 눈치챈다.

허탈하다. 지금 AI가 생각 조차 훔쳐가버리는 세상이다. 컴퓨터 앞에 앉을 필요도 없는 세상이 오고 있다. 과연 우리는 생각할까?

지금 세대는 태어나면서 기술, 기계와 AI가 공존하는 세상을 본다.
그래도 배움은 인간에게서 이뤄져야 한다.

아이들과 함께 경험을 가르치고, 서로 이야기를 나누며 상호작용하는 법을 배워야 한다.

그래서 아이들과 마트도 가고 물건을 만져보면서 서로 어떤 게 더 좋네, 비싸네 이야기도 하면서 시간을 보내는 것이 중요하다.

육체성의 소멸 앞에서

저자는 육체성이 소멸될 것이라는 결말을 정해 놓은 듯 하다. 부정하긴 싫지만 이대로 100면 후면 과연 육체가 존재할까? 


의도된 기다림과 지루함 즐기기

맥도날드의 드라이브 쓰루, 놀이 공원의 퀵 패스 사람들은 기다림을 돈으로 줄이고자 한다.
그러나 기다림 속에 지루함은 우리에게 주변들 둘러보고 생각하고 더 나가 옆 사람과 이야기를 나눌 수 있는 기회를 준다.


매일 만드는 침묵의 시간

침묵은 상당히 어색하다. 특히 수많은 자극에 익숙해진 우리는 1분의 침묵도 용납되지 않는다. 
심지어 잠자는 시간도 3시간으로 줄여가며 침묵의 시간을 없애고 있다.

매일 침묵의 시간을 30분 이상 만들자, 아무것도 안 해도 된다. 그러라고 만든 시간이다.
조금 지나면 어색함은 사라지고 고요함에서 느껴지는 편안함이 좋아 질 것이다.


여섯 번째 감각 : 디지털 감각

우리의 생각, 기억을 그대로 컴퓨터 메모리로 옮겨서 영원히 디지털 세상에서 살려는 움직임도 있다. 이미 우리는 막을 수 없는 기술의 물결에 휩쓸려 있다.

그래도 인간임을 인식하고 육체가 있음을 느끼고 살아 가려면 손을 쓰고, 몸을 움직여 경험하고, 사람들과 커뮤니케이션을 하고, 기다림과 지루함, 침묵을 즐기는 습관이 필요하다.


소멸하는 장소, 개인화 된 공간

많은 사람이 모이는 장소면 면적, 편의시설 등을 확보하고 유지하려면 돈이 많이 든다.
무엇보다 이제 사람들이 이런 장소를 원하지 않는다. 사람과 만날 일이 없기 때문이다.

그리고 이제 3평 남짓 개인화된 공간에서 더 즐겁다. 몸을 움직일 필요도, 청소를 할 필요도 없으니
누워서 스마트폰만 볼 수 있는 환경만 되면 모두 충족할 수 있다.


자세한 내용 보기 »

라벨: , ,

2026년 3월 28일 토요일

[2026-03-28] 완벽한 원시인 (PERFECT CAVEMAN)

완벽한 원시인 (PERFECT CAVEMAN)

오랜만에 책을 읽었다. 이 책을 선택하게 된 이유는 완벽한 뇌, 몸, 정서를 되찾기 위해서다.
그 말은 현재 나의 뇌, 몸, 정서는 비정상이거나 비정상이 되어감을 느낀다는 것이다.

매일 매일 나빠지는 것을 알고 있지만, 그것은 한번에 오지 않는다. 10년에 걸쳐 조금씩 온다.
정말 공감되는 말이다. 

그리고 느끼지 못하는 상태에서 닥쳐오니 갑자기 안 좋아진 것 처럼 느끼겠지만 그런 건 절대도 없다.

이 책에서는 인공이 만들어낸 가짜의 자연으로 인해, 시계는 아침인데 햇빛을 받지 않는 몸은 아침인지 모른다. 아침에 고기를 먹어야 힘이 나는데 커피, 빵, 씨리얼을 먹는다.

전부 가짜로 채워져 있다. 거기에 우리는 쇼츠로 주어진 먹이로만 살아나는 상태가 되었다.
이것도 조금씩 온다. 돌이킬 수 없을 때 까지 가게 된다.

나는 이제 멈추려고 한다. 나는 아주 운이 좋은 사람이다.
이것도 하늘이 주신 변화의 기회라고 생각한다.

이제는 다른 삶, 건강한 삶과 정신으로 돌아가야 겠다.


10만년 동안 인류는 종족을 보호하고 생존을 위해 움직이며 치열하게 살아왔다.
그런데 불과 50년 사이 문명은 인간에게 가짜 자연환경에 놓이게 했다.
이 가짜 환경은 사람을 죽인다. 그러면 어떻게 다시 건강한 뇌, 몸, 정서를 되찾을까?
원시인의 생활, 먹는 것을 관찰하고 따르라.

원시인의 일상
1. 태양이 떠오르고 동굴 안으로 쏟아지는 강력한 햇빛을 받으며 기상한다. 
2. 동족이 잘 있는지 살펴보고, 간단한 식사를 하고 오늘의 사냥감을 찾아 떠난다.
3. 거의 15km를 매일 반복하며 살아간다.
4. 모든 것은 자연 상태의 것을 먹는다. 
5. 저녁에는 모닥불에서 서로의 힘듦을 공감하고 위로하며 정서적 안정을 찾는다.

현대인의 일상
1. 아침에 7시 알람을 듣고 일어난다. 그러나 창문은 열지 않는다. 햇빛이 들어오지 않기 때문에 더 이상 열 필요가 없다.
2. 스마트폰을 켜서 밤새 만들어진 쇼츠, DM을 보면서 소속감을 느낀다. 그러나 그 들은 내가 위험하거나 도움을 요청할 때 와줄 만큼 유대가 없다는 것을 안다. 그냥 일상이니 하는 것이다.
3. 사무실에 출근해서 하루 8시간을 사무실에서 일만 한다. 이때 뇌는 가만히 있는 상태를 위험이 없는 안정된 상태로 보고, 모든 능력을 줄인다. 
4. 그러니 머리는 더 돌지 않는다.
5. 퇴근하고 자극적인 음식을 먹고, 밤새 휴대폰으로 거짓 도파민으로 고갈 될 때까지 눈, 몸, 정신을 혹사 시키고 새벽 2시가 넘어 잠에 든다.
6. 이 과정에서 우리는 전부 붕괴된다. 이것이 10년 동안 서서히 온다.

우리는 어떻게 건강한 원시인이 될까?
1. 아침에 일어나서 햇빛 속으로 20분을 걷는다.
    하루에 50분 일하면 10분은 햇빛 속에 걷는다.
    무조건 밖으로 나가라. 이유는 없다. 그냥 그렇게 우리는 만들어 졌다.
2. 적당한 운동을 해야 하고, 배드민턴, 테니스를 해라. 
    게임속에서 상대의 눈을 마주하고, 동료와 호흡을 같이하면서 동질감 속의 안정감을 찾아라
    동료와 함께 대화를 나누고, 공감하고, 도와줘라
3. 불편함을 스스로 만들어라. 그래야 성장한다.
4. 부족한게 있어야 하고, 대면하고, 기여하고, 사랑을 나눠라.
5. 탈집중을 통해 아무것도 하지마라. 그래도 많이 하고 있다.
    식사도 저녁 7시 이후 아침 7시까지 먹지마라.
    몰입해라.


현대 사회에 adhd가 잘 맞다. 
사냥감이 지나갈 때 분석과 판단 보다 먼저 창을 들고 따라가서 잡아오도록 설계된 사람들이다.

현대는 무엇보다 실행하고 뭔가를 이루는 사람이다. 
그렇게 생긴 사람들이다.
그리고 AI 덕분에 실행은 더욱 편해졌다.

그래도 여러분이 결혼을 하고 자녀를 낳는다면 100일 지나면
반드시 책을 하루에 2권 이상, 2시간 정도는 읽어주면 좋겠다. 

같은 책이라도 여러 번 재미있게 읽어주면 중학생이 되어도 가족이 함께 모여 식사를 하고
식사 시간에 많은 대화를 한다. 고등학교, 대학생이 되면 이젠 독립할 준비를 시켜줄 시간도 되고
독립하더라도 언제나 가족은 너의 곁에서 지켜준다는 믿음도 생긴다.

자녀가 이제 독립을 하게되어도, 그간 있었던 대화, 유대감, 소속감, 믿음으로 잦은 전화, 카톡과 그리고 떨어져 있는 기분은 사실상 잘 들지 않는다.















라벨: ,

2026년 1월 14일 수요일

[2025-12-24] OpenAI 는 위태롭게 느껴진다.

OpenAI 는 위태롭게 느껴진다.

세상에 AI의 대 전한점을 보여줬고, IT를 분야에 새로운 활력을 불어넣었던 OpenAI의 chatGPT 인데, 선두 주자였던 만큼 새로운 기술과 경험을 공개했었다.

그러나 지금은 아래와 같은 이유로 그들이 더 이상 성장하지 못하고, 5년 안에 신기루 처럼 사라질 역사에서나 회자될 것처럼 위태롭게 느껴진다.

  1. AI Assistant 만큼 기업이 활용하기에 쉬운 기능도 없다. 이걸 beta 에서 v2 정도 지원하고 멈췄다. 심지어 gpt-4.1에서 모델 지원도 안한다. 물론 Agent SDK를 밀기위해서 그렇겠지만 과연 Any client에서의 활용성, langchain과 호환성등... 어디에 붙힌다한들 Restful API 만 알면 다 연동 가능하다. 

  2. Vector Store는 AI 의 능력을 올리는 RAG의 필수이다. 그런데 아직 text 만 수용하고 있고, 내부적으로 어떻게 동작하는지 모르지만 여러 기법들이 많이 나왔지만, 지원하지 않는다.
    또한 개발자가 임베딩하는 여러 알고리즘을 적용하거나, 문서 파서등을 유연하게 붙힐 수 있는 구조도 아니다. 그러나 지금 있는 vs는 딱 80점이다. 뭔가 정확하지도 애매하지도.. 그렇다고 실무에 쓰자니 애매한... 그래서 사람들은 별도 vs 구축으로 눈을 돌리고 있다. 이것 부터 시작해서 점점 openai 플랫폼에서 빠져나가게 될것이다. 구글 file_search 는 얼마나 강력한가? 원래 강점을 제대로 살리는 서비스

  3. Agent는 너무 어슬프다. 독립적인 것도 아니고, 호환성이 좋은 것도 아니고 유연하지도 않고...
    n8n을 대체하지도 못하는 기능등이 많이 아쉽다.

종합적으로 선두 였지만 이제 기능 하나하나가 60점 정도 되는 어슬픈 기능을 내고 있다. 사용자는 실망하고... 그래서 "하나라도 제대로 된 것을 구현하는 데 집중했으면 한다." 물론 LLM은 기본이다.
우선 순위를 하자면 agent workflow -> vector store -> assitant ?

개인적으로 
  1. AWS bedrock 간단한 것처럼 말하지만 assistant 보다 10배는 진입 장벽이 어렵다. 물론 한번 구축해두면 그 다음부터 쉽다고는 하지만 여전히 어렵다. 
  2. 구글은 기업이 사용하기엔 너무나 해야될게 많다. 개인에게는 최적인듯..


역시 돈으로 되지는 않고, 실패를 적게하는 fast follow의 강점도 너무나 많다.


라벨: , , ,

2025년 8월 24일 일요일

[2025-07-19] Mac 초기 설정 (M시리즈, 개발자용)

[2025-07-19] Mac 초기 설정 (개발자용)

안녕하세요 클스 입니다.


드디어 M4 16인치 맥을 구매했습니다. 그러나 매번 맥을 초기화하는 것은 힘들죠, 

그리고 기존 인텔맥에서 M1으로 변경된 시점에 백업,복원 하기엔 불안함도 있고, 클린 설치하고 싶기도 한데, Mac 초기 설정하는 것은 매우 시간이 많이 듭니다.

그래서 반드시 맥에 필수로 개발할때 셋팅하는 스크립트를 작성했습니다.


사전 준비:

1. 맥에 사용자 계정과 sudo 권한 준비

2. M1 이상 맥북

 

설치할 순서:

1. shell 은 zsh 로 가정

2. homebrew 설치, brew update, upgrade

3. wget, curl, openssl, rsync

4. oh my zsh,
     4.1 plugin : zsh-autosuggestions, zsh-syntax-highlighting

------------------- 이후는 별도 스크립트로 작성할 예정입니다. --------------------

5. poetry, pyenv, virtual-env, uv

6. nvm, node, npm, pnpm

7. python 

------------------------------------


$ vi install_mack.sh

#!/bin/zsh

set -e

# ─────────────────────────────────────────────
# Mac DevBox Full Setup Script (Interactive)
# By 클스AI
# ─────────────────────────────────────────────

# ───────────── 1. 유틸 함수 ─────────────
print_header() {
echo -e "\n🔹 $1 🔹"
}

ask_install() {
read -r "ans?➡️ $1 설치하시겠습니까? (Y/n) "
[[ -z "$ans" || "$ans" =~ ^[Yy]$ ]]
}

confirm() {
local prompt="$1"
local ans
read "ans?➡️ $prompt [Y/n] "
[[ -z "$ans" || "$ans" =~ ^[Yy]$ ]]
}

# ───────────── 2. OS/SED 세팅 ─────────────
print_header "OS 버전 확인 [$(uname)]"
if [[ "$(uname)" == "Darwin" ]]; then
SED_INPLACE=(-i '')
else
SED_INPLACE=(-i)
fi

echo "현재 실행 중인 shell: $(ps -p $$ -o comm=)"
echo "전체 실행 경로: $(ps -p $$ -o args=)"

# ───────────── 4. sudo 권한 ─────────────
print_header "sudo 권한 요청"
sudo -v

# ───────────── 5. macOS/Xcode 업데이트 ─────────────
if ask_install "macOS 및 Xcode Command Line Tools 전체 업데이트"; then
echo "✅ macOS 및 Xcode CLI 도구 업데이트 진행 중..."
softwareupdate --all --install
if ! xcode-select -p &>/dev/null; then
echo "🛠 Command Line Tools가 설치되지 않아 자동 설치 시도"
xcode-select --install
print_header "설치가 완료되면 엔터를 눌러주세요"
read -r
fi
elif ! xcode-select -p &>/dev/null; then
if ask_install "Command Line Tools 설치"; then
xcode-select --install
print_header "설치가 완료되면 엔터를 눌러주세요"
read -r
fi
fi

# ───────────── 6. Rosetta (Apple Silicon 전용) ─────────────
if [[ "$(uname -m)" == "arm64" ]] && ! pgrep -x oahd &>/dev/null; then
print_header "Rosetta 2 설치"
softwareupdate --install-rosetta --agree-to-license
fi

# ───────────── 3. 기존 zsh/oh-my-zsh 백업 및 삭제 ─────────────

if confirm "zsh 및 Oh My Zsh 환경을 완전히 초기화(재설치)하시겠습니까?"; then
rm -f ~/.zshrc
rm -rf ~/.oh-my-zsh
echo "🧹 .zshrc, .oh-my-zsh 모두 삭제(초기화) 완료!"
else
echo "ℹ️ zsh/Oh My Zsh 초기화(삭제) 건너뜁니다."
fi


# ───────────── 7. Homebrew 설치/업데이트 ─────────────
print_header "Homebrew 설치/업데이트"
if ! command -v brew &>/dev/null; then
/bin/bash -c \
"$(curl -k -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi

# ─────────────────────────────
# ⬆️ Homebrew 최신화
# ─────────────────────────────
if command -v brew &>/dev/null; then
print_header "Homebrew 패키지 정보 최신화"
brew update
brew upgrade
fi

# ───────────── 8. zsh 설치 및 기본 쉘 설정 ─────────────
print_header "zsh 설치 및 기본 쉘 설정"
if brew list --formula | grep -q "^zsh\$"; then
if confirm "zsh는 이미 설치되어 있습니다. 최신 버전으로 업그레이드하시겠습니까?"; then
brew upgrade zsh
else
echo "zsh 업그레이드 건너뜁니다."
fi
else
brew install zsh
fi

ZSH_PATH="$(which zsh)"
# 로그인 셸이 뭔지 확인 (dscl은 macOS 전용)
if [[ "$(uname)" == "Darwin" ]]; then
login_shell=$(dscl . -read /Users/$USER UserShell 2>/dev/null | grep '^UserShell:' | awk '{print $2}')
else
login_shell=$(getent passwd $USER | cut -d: -f7)
fi
# 현재 프로세스 실행 중인 셸
current_shell_running="$(ps -p $$ -o comm=)"
# 또는, 현재 환경변수(로그인 쉘) 사용
current_shell="$SHELL"

# echo "ZSH_PATH : $ZSH_PATH"
# echo "login_shell : $login_shell"
# echo "current_shell : $current_shell"
echo "current_running: $current_shell_running"

if [[ "$login_shell" == "$ZSH_PATH" ]]; then
echo "✔️ 기본 로그인 쉘이 이미 $ZSH_PATH 입니다."
else
if confirm "기본 로그인 쉘을 $ZSH_PATH 로 변경하시겠습니까?"; then
# 쉘 경로가 /etc/shells에 없다면 등록
if ! grep -Fxq "$ZSH_PATH" /etc/shells; then
echo "$ZSH_PATH" | sudo tee -a /etc/shells
fi
chsh -s "$ZSH_PATH"
print_header "기본 쉘이 $ZSH_PATH 으로 변경되었습니다. (터미널 재시작 필수)"
else
echo "기본 쉘 변경을 건너뜁니다."
fi
fi


# ───────────── 9. Oh My Zsh 및 플러그인 설치 ─────────────
if confirm "Oh My Zsh 설치/업데이트 및 플러그인 구성"; then
ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
if [[ -d "$HOME/.oh-my-zsh" ]]; then
echo "🔄 Oh My Zsh가 이미 설치되어 있습니다. 업데이트 중…"
zsh -ic "omz update"
else
echo "📥 Oh My Zsh를 설치합니다…"
sh -c "$(curl -k -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
fi
for plugin in zsh-autosuggestions zsh-syntax-highlighting; do
PLUGIN_DIR="$ZSH_CUSTOM/plugins/$plugin"
if [[ -d "$PLUGIN_DIR" ]]; then
echo "✔️ 플러그인 '$plugin' 이미 설치됨"
else
echo "➕ 플러그인 '$plugin' 설치 중…"
git clone "https://github.com/zsh-users/$plugin" "$PLUGIN_DIR"
fi
done
fi

# ───────────── 10. plugins=() 라인 관리 ─────────────
touch ~/.zshrc
if grep -q '^plugins=' ~/.zshrc; then
plugins_raw=$(grep '^plugins=' ~/.zshrc | head -1 | sed 's/^plugins=//' | tr -d '()')
plugins_arr=(${(z)plugins_raw})
typeset -U plugins_arr
plugins_arr+=('zsh-autosuggestions' 'zsh-syntax-highlighting')
new_plugins="plugins=(${plugins_arr[*]})"
sed "${SED_INPLACE[@]}" -E "s/^plugins=\(.*\)/$new_plugins/" ~/.zshrc
else
echo "\nplugins=(zsh-autosuggestions zsh-syntax-highlighting)" >> ~/.zshrc
fi
echo "🔧 plugins 라인 구성 완료"

# ───────────── 11. ZSH_THEME 교체 (robbyrussell → eastwood, 개행) ─────────────
THEME_LINE=$(grep -n '^ZSH_THEME="robbyrussell"' ~/.zshrc | cut -d: -f1)
if [[ -n "$THEME_LINE" ]]; then
sed "${SED_INPLACE[@]}" "${THEME_LINE}s/^/#/" ~/.zshrc
if [[ "$(uname)" == "Darwin" ]]; then
sed "${SED_INPLACE[@]}" "$((THEME_LINE+1))i\\
ZSH_THEME=\"eastwood\"\\
\\
" ~/.zshrc
else
sed "${SED_INPLACE[@]}" "$((THEME_LINE+1))i ZSH_THEME=\"eastwood\"\n" ~/.zshrc
sed "${SED_INPLACE[@]}" "$((THEME_LINE+2))i " ~/.zshrc
fi
echo "🎨 ZSH_THEME 변경: 'robbyrussell' → 'eastwood' (개행 포함)"
else
echo "⚠️ ZSH_THEME=\"robbyrussell\" 라인이 없습니다. 직접 확인 요망"
fi


# 6. 기본 CLI 도구 설치
###############################################################################
print_header "기본 CLI 도구 설치 (curl wget jq openssl python) 및 업그레이드"

# ───────────── 패키지 목록 선언 (재활용!) ─────────────
BREW_PACKAGES=(
curl
wget
git
subversion
rsync
jq
zlib
sqlite3
xz
readline
ncurses
openssl
python
asitop
showcert
libiconv
convmv
tree
)

# ───────────── 패키지 설치/업그레이드 루프 ─────────────
for pkg in "${BREW_PACKAGES[@]}"; do
if brew list --formula | grep -qx "$pkg"; then
echo "✔️ $pkg 설치됨. 업데이트 가능한지 확인 중…"
if brew outdated --formula | grep -qx "$pkg"; then
echo "⬆️ $pkg 업그레이드 중..."
brew upgrade "$pkg"
else
echo "✅ $pkg는 최신 버전입니다."
fi
else
echo "➕ $pkg가 설치되지 않았습니다. 설치합니다…"
brew install "$pkg"
fi
done

append_custom_setting_block() {
local zshrc="$HOME/.zshrc"
local mark_begin="# AI Solution Basic Block Begin ---------"
local mark_end="# AI Solution Basic Block End ---------"

mkdir -p ~/cncity/devtools
mkdir -p ~/svn
mkdir -p ~/data

# 👉 여기서 BREW_PACKAGES를 그대로 사용!
local PATH_LINE=""
for pkg in "${BREW_PACKAGES[@]}"; do
local bin_path="$(brew --prefix $pkg 2>/dev/null)/bin"
if [[ -d "$bin_path" ]]; then
PATH_LINE="${PATH_LINE:+$PATH_LINE:}$bin_path"
fi
done
if [[ -n "$PATH_LINE" ]]; then
PATH_LINE="export PATH=\".:$PATH_LINE:\$PATH\""
fi

touch "$zshrc"
if grep -F -q "$mark_begin" "$zshrc"; then
echo "➖ {$mark_begin} 블록이 이미 .zshrc에 존재합니다. 중복 추가하지 않습니다."
else
echo "➕ {$mark_begin} 블록을 .zshrc에 추가합니다."
cat << EOF >> "$zshrc"

${mark_begin}
${PATH_LINE}

# git 계열 ssl 무시
export GIT_SSL_NO_VERIFY=true

# 히스토리 설정
HISTSIZE=3000
SAVEHIST=3000
HISTFILE=~/.zsh_history

# Alias
alias ll='ls -alF'
alias lll='ls -al'
alias la='ls -A'
alias l='ls -CF'
alias grep='grep --color=auto'

alias show-openport="lsof -PiTCP -sTCP:LISTEN"
alias gputop="sudo asitop"

alias docker=podman

mcd() { mkdir -p "$1" && cd "$1"; }

${mark_end}
EOF
echo "✅ {$mark_begin} 블록이 추가되었습니다."
fi
}

append_custom_setting_block


#---------------- /etc/hosts -------------

replace_host_block() {
local hosts_file="/etc/hosts"
local mark_begin="# My Host Begin"
local mark_end="# My Host End"
local tmpfile
tmpfile=$(mktemp)

# ✅ 교체할 블록 내용 (필요시 주인님이 수정 가능)
local block_content
block_content=$(cat << 'EOF'
# My Host Begin --------

# Added by Docker Desktop
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
# End of section

# SSL for local
127.0.0.1 localtest.dev
# End SSL
# My Host End --------
EOF
)

# 🔄 기존 블록이 있으면 교체, 없으면 추가
if grep -Fq "$mark_begin" "$hosts_file"; then
sudo awk -v begin="$mark_begin" -v end="$mark_end" -v content="$block_content" '
$0 ~ begin { print content; skip=1; next }
$0 ~ end { skip=0; next }
skip==0 { print }
' "$hosts_file" > "$tmpfile" && sudo mv "$tmpfile" "$hosts_file"
echo "♻️ 기존 Host Block을 교체했습니다."
else
printf "\n%s\n" "$block_content" | sudo tee -a "$hosts_file" >/dev/null
echo "✅ Host Block이 추가되었습니다."
fi
}


if confirm "AI 솔루션팀 /etc/hosts 파일을 구성하시겠습니까?(Y/N)"; then
replace_host_block
fi

# ───────────── 13. 완료 메시지 ─────────────
print_header "🎉 모든 설정이 완료되었습니다!"
printf "\n🎉 모든 설정이 완료되었습니다!\n"
echo "source ~/.zshrc 를 실행하세요."
----------------------------------------------------------------------------------------
:wq
----------------------------------------------------------------------------------------

파일에 실행 권한 부여

$ chmod +x install_mac.sh

--------------------------------




스크립트는 본인의 환경에 맞게 필요한 것을 설치하면 됩니다.

이상 클스 였습니다.

라벨: ,