반응형
반응형

랜덤 워크(Random Walk)를 사용하여 **아트적인 노이즈 트레일(Artistic Noise Trail)**을 만드는 것은 제너레이티브 아트(Generative Art)에서 매우 흔하고 흥미로운 기법입니다. 이는 각 단계에서 **무작위성(Stochasticity)**을 이용해 경로를 결정함으로써 예측 불가능하면서도 유기적인 움직임을 만들어냅니다.

 

파이썬에서는 주로 turtle 또는 **matplotlib**을 사용하여 시각화할 수 있지만, 여기서는 제너레이티브 아트에 자주 사용되는 접근 방식인 랜덤 증분을 이용해 구현해 보겠습니다.

 

"""
랜덤 워크(Random Walk)를 사용하여 **아트적인 노이즈 트레일(Artistic Noise Trail)**을 만드는 것은 제너레이티브 아트(Generative Art)에서 매우 흔하고 흥미로운 기법입니다. 이는 각 단계에서 **무작위성(Stochasticity)**을 이용해 경로를 결정함으로써 예측 불가능하면서도 유기적인 움직임을 만들어냅니다.

파이썬에서는 주로 turtle 또는 **matplotlib**을 사용하여 시각화할 수 있지만, 여기서는 제너레이티브 아트에 자주 사용되는 접근 방식인 랜덤 증분을 이용해 구현해 보겠습니다.

"""


import numpy as np
import matplotlib.pyplot as plt

def generate_random_walk_trail(steps, noise_strength=1):
    """
    주어진 단계 수만큼 랜덤 워크 트레일 데이터를 생성합니다.
    
    :param steps: 랜덤 워크를 진행할 단계 수
    :param noise_strength: 노이즈/이동 강도 (클수록 경로가 거칠어짐)
    :return: x, y 좌표 배열
    """
    # 각 단계에서의 x, y 변화량 (랜덤 증분)을 생성합니다.
    # -noise_strength부터 +noise_strength 사이의 균일 분포 난수
    dx = np.random.uniform(-noise_strength, noise_strength, steps)
    dy = np.random.uniform(-noise_strength, noise_strength, steps)

    # 누적합을 계산하여 경로(트레일)를 만듭니다.
    # 각 지점은 이전 지점에서의 변화량을 누적한 결과입니다.
    x_trail = np.cumsum(dx)
    y_trail = np.cumsum(dy)
    
    return x_trail, y_trail

# --- 시각화 설정 ---
STEPS = 5000  # 경로 길이
NOISE_LEVEL = 1.5 # 노이즈 강도 조절

x_coords, y_coords = generate_random_walk_trail(STEPS, NOISE_LEVEL)

# Matplotlib으로 트레일 시각화
fig, ax = plt.subplots(figsize=(10, 10))
ax.plot(x_coords, y_coords, 
        color='white',      # 선 색상
        linewidth=0.5,      # 선 두께
        alpha=0.8)          # 투명도

# 배경 및 축 설정
ax.set_facecolor('black')
ax.set_xticks([])
ax.set_yticks([])
ax.set_title(f"Random Walk Artistic Noise Trail ({STEPS} steps)", color='white')

# 축 비율을 같게 설정하여 왜곡 방지
ax.set_aspect('equal', adjustable='box')

plt.show()

 

 

 

 

import numpy as np
import matplotlib.pyplot as plt

steps = np.random.choice([1, -1], size=(2,1000))
pos = np.cumsum(steps, axis=1)
plt.plot(pos[0], pos[1], color='lime')
plt.axis('off')
plt.title("Random walk path", color='green')
plt.show()

 

반응형
반응형

turtle 로 전체화면에서 임의로 선그리기 

 

import turtle
import random

# 화면 설정
def setup_screen():
    """창을 설정하고 전체 화면과 유사하게 최대화합니다."""
    screen = turtle.Screen()
    screen.setup(width=1.0, height=1.0) # 화면 크기를 최대화합니다.
    screen.title("무작위 선 그리기 (전체 화면)")
    screen.colormode(255) # RGB 색상 모드를 0-255로 설정합니다.
    screen.bgcolor("black") # 배경색을 검은색으로 설정합니다.
    screen.tracer(0) # 그리기 속도를 높이기 위해 자동 화면 업데이트를 끕니다.
    return screen

# 거북이 설정
def setup_turtle():
    """선을 그릴 거북이를 설정합니다."""
    t = turtle.Turtle()
    t.hideturtle() # 거북이 아이콘을 숨깁니다.
    t.speed(0) # 최고 속도로 설정합니다.
    t.pensize(2) # 펜 두께를 설정합니다.
    return t

# 무작위 색상 생성
def get_random_color():
    """무작위 RGB 색상 튜플을 반환합니다."""
    r = random.randint(0, 255)
    g = random.randint(0, 255)
    b = random.randint(0, 255)
    return (r, g, b)

# 메인 그리기 루프
def draw_random_lines(t, screen):
    """화면이 종료될 때까지 무작위 선을 계속 그립니다."""
    while True:
        # 무작위 색상 및 위치 설정
        color = get_random_color()
        t.pencolor(color)
        
        # 펜을 든 상태로 무작위 위치로 이동 (현재 위치에서 그리기 시작)
        t.left(random.randint(-180, 180)) # 무작위로 방향을 돌립니다.
        
        # 무작위 길이만큼 앞으로 이동 (선을 그림)
        distance = random.randint(50, 300)
        t.forward(distance)

        # 화면 가장자리를 벗어났는지 확인하고, 벗어났다면 펜을 들고 중앙 근처로 이동
        # 이 과정이 없으면 거북이가 화면 밖으로 나가버려 그림이 멈춘 것처럼 보일 수 있습니다.
        current_x, current_y = t.position()
        screen_width = screen.window_width()
        screen_height = screen.window_height()
        
        if abs(current_x) > screen_width / 2 or abs(current_y) > screen_height / 2:
            t.penup() # 펜 들기
            t.goto(0, 0) # 중앙으로 이동
            t.left(random.randint(-180, 180)) # 방향을 다시 무작위로 설정
            t.pendown() # 펜 내리기
            
        # 화면 업데이트 (tracer(0)를 사용했으므로 수동으로 업데이트)
        screen.update()

# 프로그램 실행
if __name__ == "__main__":
    screen = setup_screen()
    t = setup_turtle()
    
    try:
        draw_random_lines(t, screen)
    except turtle.Terminator:
        # 창 닫기 버튼을 눌렀을 때 발생하는 예외 처리
        print("프로그램이 종료되었습니다.")
    except Exception as e:
        print(f"예외 발생: {e}")
        
    # 창을 닫을 때까지 프로그램이 대기하도록 함 (실제 draw_random_lines 루프에서는 필요 없음)
    # turtle.done()
반응형
반응형

https://news.hada.io/topic?id=23845

 

프로그래머 정체성 위기 | GeekNews

프로그래머의 정체성이 최근 AI와 LLM 도구의 등장으로 위협받고 있음프로그래밍 문화는 1950년대 MIT의 해커 윤리에서 시작되어 코드 작성 그 자체를 깊이 있는 기술(craft)로 여기며, 정밀한 논리

news.hada.io

https://hojberg.xyz/the-programmer-identity-crisis/

 

  • 프로그래머의 정체성이 최근 AI와 LLM 도구의 등장으로 위협받고 있음
  • 프로그래밍 문화는 1950년대 MIT의 해커 윤리에서 시작되어 코드 작성 그 자체를 깊이 있는 기술(craft)로 여기며, 정밀한 논리와 문제 해결의 몰입을 핵심 가치로 삼아왔음
  • 그러나 현재 AI 산업과 LLM 도구들은 개발자를 단순 명세 작성자나 오퍼레이터로 전환시키려 하며, 직접 코드를 작성하는 대신 자연어로 지시만 내리는 "vibe-coding" 방식을 강요하고 있음
  • LLM 생성 코드는 비결정적이고 부정확하며, 개발자가 직접 코드를 읽고 작성하는 과정에서 얻는 깊은 이해와 몰입을 제거하여 코드베이스와의 연결을 단절시킴
  • 기업들은 생산성 증대를 명분으로 도구 사용을 강제하고, 팀 내 협업과 멘토링 문화를 AI와의 상호작용으로 대체하면서 개발자 간 인간적 연결을 약화시키고 있음
  • 프로그래밍을 단순 산출물이 아닌 사고와 이해의 과정으로 보는 본질적 가치가 상실되고 있으며, 개발자들은 자신의 기술과 즐거움, 그리고 직업적 정체성을 지키기 위해 이러한 변화에 저항해야 함

프로그래머의 본질과 전통

  • 코드 작성은 단순한 업무가 아니라 개발자의 정체성 그 자체이며, 에디터는 작업장이자 성소로서 기술을 연마하고 몰입 상태(flow)에 들어가는 공간임
    • Vim과 같은 도구를 통해 생각과 코드 사이의 장벽 없이 작업하며, 현실 세계에 영향을 미치는 비물질적 세계를 창조함
    • 퍼즐을 푸는 과정 자체가 완성된 그림보다 중요하며, 손가락에서 버퍼로 이어지는 기술의 흐름 속에서 시간이 사라짐
  • 1950년대 후반 MIT에서 새로운 프로그래밍 문화가 탄생했으며, 실험적이고 반체제적인 성향을 가진 해커들이 Flexowriter와 TX-0 컴퓨터를 사용하며 완벽한 프로그램을 추구함
    • "The Right Thing"이라는 개념을 중심으로 우아하고 간결한 코드를 작성하는 것을 목표로 삼음
    • Tech Model Railroad Club 멤버들은 기계 언어에 몰두하며 디지털 마법을 익혔고, 발견한 지식을 다른 학생들과 공유하는 문화를 확립함
  • Building 26의 컴퓨팅 도가니에서 코딩 기술이 단련되었으며, 약 70년 전 확립된 이 문화는 현재까지 이어져 개발자들의 마음과 기계에 여전히 존재함
    • 고대 해커들의 유산은 깊고 운동적인 기술로 남아있으며, 이를 기반으로 열정적인 산업이 구축됨
    • 개발자들은 여전히 동일한 경이로움, 성취감, 퍼즐 해결의 우아함에 의해 동기부여되고 있음
  • 그러나 프로그래머의 정체성을 구성하는 이러한 핵심 가치들이 위협받고 있으며, 한때 밝고 명확했던 프로그래밍의 미래가 이제는 불길한 어둠과 사기, 불확실성으로 가려져 있음

AI 산업의 새로운 정체성 강요

  • 수십억 달러 규모의 AI 산업, Hacker News 커뮤니티, LinkedIn의 LLM 지지자들은 소프트웨어 개발의 미래가 프로그래밍과 거의 닮지 않았다고 주장하며, 1년 전 밈처럼 보였던 "vibe-coding"이 주류가 되고 있음
    • 개발자들은 코드 대신 Markdown으로 명세를 작성해야 하며, 코드베이스의 구석구석을 탐험하고 퍼즐을 풀며 비밀을 발견하는 깊은 몰입과 기술의 깊이가 사라짐
    • 대신 개발자를 위해 에이전트들이 사고하는 동안, 산만한 인지와 컨텍스트 스위칭을 받아들여야 하며, 창의적 문제 해결은 기계에 맡기고 개발자는 단순 오퍼레이터가 됨
  • 일부 개발자들은 이러한 변화와 "Specification Engineering"이라는 새로운 정체성을 환영하며, 오퍼레이터가 되어 Steve Jobs처럼 "오케스트라를 지휘"하는 것에 흥분함
    • 코딩에 대한 관심이 없는 것으로 보이는데도 왜 프로그래머가 되었는지 의문이며, Woz와 Jobs를 혼동한 것이 아닌가 생각됨
    • Prompt, Context, Specification "Engineering"이 프로그래머에게 밝고 번영하는 직업을 가져다줄 것으로 보이지 않음
  • 이는 기술, 숙련도, 노동의 가치 하락을 의미하며, 개발자의 고유한 추상적 사고 능력이 더 이상 필요하지 않은 영역으로 이동하여 이미 제품 매니저와 디자이너가 차지하고 있는 공간으로 들어가게 됨

기업 내 권력 역학의 변화

  • 기업 내에서 이 새로운 정체성이 강요되면서 권력 역학이 변화하고 있으며, 잘못된 곳에서 생산성을 높이려는 광적인 시도로 개발자들은 점점 더 구체적인 방식으로 LLM을 사용하도록 강제됨
    • 순응하지 않으면 쫓겨나고, 자신의 쓸모없음을 알리는 제품을 사용하거나 사직해야 함
    • 과거에는 경영진이 개발자의 도구를 이렇게 구체적으로 지시한 적이 거의 없었음
  • 개발자들은 셰프나 목수처럼 자신의 도구를 큐레이팅하고 연마하는 데 큰 자부심을 가져왔으며, 에디터의 세심한 설정, 닷 파일 조정, 개발 환경 구성 등을 통해 자신의 사고방식에 맞게 도구를 개인화해왔음
    • 기술의 일부로서 도구 세트를 개인화하는 데 헌신해왔으나, 일상 업무와 거의 연결되지 않은 경영진이 이를 명령하는 것은 침해처럼 느껴짐
    • 수십 년간 기업 내에서 우대받았던 프로그래머들에게, 이러한 내러티브는 경영진이 균형을 다시 자신들에게 유리하게 기울일 새로운 방법을 제공함

LLM과 프로그래밍 언어의 본질적 차이

  • 일부는 LLM의 영향을 저수준 언어에서 고수준 언어로의 전환에 비유하지만(Assembly에서 Fortran으로), 이는 여러 측면에서 잘못된 비유임
    • Fortran은 프로그래밍에 뿌리를 두고 기술을 제거하려 하지 않고 그 위에 구축했으며, 프로그래밍의 정밀성과 표현력을 제거하지 않고 확장함
    • Fortran은 입력에 대해 항상 올바른 결과를 성공적으로 생성했지만, LLM의 세계에서는 이 중 어느 것도 사실이 아님
  • 컴퓨터와 프로그래밍은 매우 좌절스러울 수 있지만, 적어도 정밀성에 대해서는 항상 신뢰할 수 있었으며, 프로그래밍을 통해 지시한 대로 정확히 수행함
    • 컴퓨터의 정밀성에 대한 의존과 신뢰 때문에, 챗봇이 요청한 작업을 수행했다고 가스라이팅할 때 이를 믿기 쉬움
  • LLM과 그 작업은 본질적으로 부정확하며, 대형 언어 모델의 속성과 자연어로 지시하는 방식 모두에서 오해의 여지가 있음
    • 비결정성을 싫어하는 프로그래머들이 이러한 접근 방식을 선택한 것은 흥미로우며, 예측 가능성, 조합성, 멱등성, 불안정하지 않은 통합 테스트를 선호함
    • LLM 코드는 그 반대인 일관성 없는 혼돈을 나타냄
  • Dijkstra는 "자연어 프로그래밍의 어리석음에 대하여"에서 자연어가 작업을 단순화할 것이라는 가정에 도전해야 한다고 지적했으며, 형식적 텍스트의 장점은 합법적이기 위해 몇 가지 간단한 규칙만 충족하면 된다는 점이라고 강조함

깊은 이해와 몰입의 상실

  • AI 보조 개발을 엄격함과 관료주의로 vibe-coding과 구분하려는 움직임이 있지만, 이는 근본적인 본질을 무시
    • LLM이 생성한 코드를 자신이 작성했거나 PR에서 리뷰했을 때만큼 면밀히 읽지 않게 되며, LLM 코딩에는 눈을 멍하게 만드는 본질적인 무언가가 있음
    • 대충 훑어보게 되고 압도당하고 지루해하며, CI가 통과하고 프로그램이 컴파일되면 위험한 함정을 맹목적으로 받아들임
    • 테스트가 실행되도록 설정되었는지, 존재하지 않는 라이브러리를 가져왔는지, 전체 라이브러리를 스스로 구현했는지 확인하지 않음
  • 책의 리뷰나 요약은 직접 읽는 경험을 대체할 수 없으며, 수백 페이지에 걸쳐 각 문장을 신중하게 소비하며 아이디어를 숙고하는 과정이 필요함
    • 마찬가지로 AI가 완료한 작업의 요약을 훑어보는 것은 도메인, 문제, 가능한 솔루션에 대한 깊은 이해를 형성하는 것을 빼앗으며, 코드베이스와의 연결을 차단함
    • 무지의 심연에 뛰어들어 주제와 그 함의를 드러내고 배우고 이해하는 것은 만족스럽고 좋은 소프트웨어에 필수적임
    • 소유권, 주체성, 깊고 만족스러운 작업은 에이전트 탭 사이의 산만한 주의로 대체됨
  • Joan Didion은 "나는 내가 무엇을 생각하고 있는지, 무엇을 보고 있는지, 무엇을 보고 그것이 무엇을 의미하는지 알아내기 위해 글을 쓴다"고 말했으며, Peter Naur는 "Theory Building으로서의 프로그래밍"에서 동일한 개념을 탐구함
    • Naur의 "Theory"는 코드베이스의 이해를 구현하며, 작동 방식, 형식주의, 현실 세계의 표현을 포함함
    • 이러한 맥락과 통찰은 오직 몰입을 통해서만 얻어지며, Naur는 "Theory"를 소프트웨어보다 프로그래밍의 주요 결과물이자 실제 제품으로 설명함
    • 잘 발달된 "Theory"가 있어야만 코드베이스에 확장과 버그 수정을 효과적으로 적용할 수 있음
  • 좋은 디자인은 몰입에서 나오며, 텍스트 버퍼에서의 왔다 갔다 하는 작업과 종종 키보드에서 떨어진 곳에서의 작업을 통해 나타남
    • 전체 코드베이스를 마음속에 담을 수 없기에, 모듈, 클래스, 함수에 뛰어들어 흐릿한 정신 모델을 선명하게 해야 함
    • 코드를 읽고 작성하여 인지를 확장하고, 익숙함과 문제 도메인에 대한 이해를 회복해야 함
  • 맥락의 일부가 구축되고 많은 부족한 시도를 통해 마침내 해결책을 발견할 수 있으며, 나쁜 디자인의 불협화음을 느껴야 
    • 혐오스럽고 반복적인 코드를 작성할 때만 더 나은, 더 간결하고 우아하며 조합적이고 재사용 가능한 방법이 있다는 것을 깨달음
    • 이는 문제에 대해 깊이 생각하기 위해 멈추게 하고, 한 걸음 물러서서 처음부터 다시 시작하게 함
    • 반대로 AI 에이전트 작업은 마찰이 없어 대안적 솔루션을 피하게 되며, 수락하는 것이 완벽한지, 평범한지, 끔찍한지, 심지어 해로운지 알 수 없음

팀 협업과 인간 연결의 붕괴

  • LLM 중심 코딩의 인지적 부채는 기술 이탈을 넘어 확장되며, 주의 집중 시간이 짧은 "slop-jockey"들이 풀 리퀘스트와 디자인 문서에 자신의 작업물을 던지며 협업을 저해하고 팀을 방해함
    • 코드 리뷰를 하는 동료들은 자신이 이제 마지막 품질 관리 레이어가 아니라 첫 번째 레이어라는 충격적인 깨달음에 정신을 잃어가고 있음
    • 새로 추가되었지만 호출되지 않는 함수, 환각된 라이브러리 추가, 명백한 런타임 또는 컴파일 오류를 지적해야 함
    • 자신의 코드를 명백히 훑어보기만 한 작성자는 책임을 지지 않으며, "Claude가 그렇게 작성했어요. 바보 같은 AI, 하하"라고 말함
  • 간섭하는 관리자와 돈을 아끼려는 임원들은 팀에서 인간 상호작용을 줄이도록 (희망컨대 무의식적으로) 압박하고 있음
    • 고립되고 연결이 박탈된 상태에서, 이제 작업 경험 주위에 벽을 쌓도록 권한을 부여받고 장려됨
    • 페어 프로그래머가 필요하거나, 솔루션을 주고받으며 논의하거나, 프로토타입을 만들거나, 아키텍처를 스케치하거나, 코드베이스의 난해한 부분에 대한 전문가 질문에 답하는 데 도움이 필요할 때 사람 대신 LLM에 의존함
    • 더 이상 온보딩 버디, 멘토, 동료가 필요하지 않으며, 대신 기계와 대화할 수 있음
    • LLM으로 인간 접촉을 피하는 것이 너무 쉬워져 이것이 표준이 될 수 있음

프로그래머 정체성의 방어

  • 우리가 AI 과대광고 내러티브에 얼마나 순응적이며, 기술의 계획된 삭제에 적극적으로 참여하고, 사고 수단을 기꺼이 포기하는지가 충격적임
    • 취미로 생계를 꾸릴 수 있었던 행운아들이었는데, 슬롭에 대응하기 위해 엄격하고 꼼꼼한 프로세스를 만들더라도 여전히 일의 재미있는 부분을 아웃소싱하고 이를 지시적 고역으로 대체한 것임
  • LLM은 소프트웨어의 복잡성에 대한 궤도에서 핵폭탄을 투하하는 솔루션처럼 보이며, 실제 문제를 해결하는 대신 증상을 치료하기 위해 훨씬 더 복잡하고 모호한 것에 손을 뻗음
    • sed를 Claude로 대체하거나, 문서를 수 시간 동안 검색한 후에도 명확성을 찾는 라이브러리나 프레임워크에 대한 답변을 요청하는 것은 괜찮음
    • 그러나 단순히 오퍼레이터나 코드 리뷰어가 되어 재미있고 흥미로운 작업에서 뒷자리를 차지하는 것은 원하지 않음
  • 반복적인 작업을 돕고, 코드베이스를 이해하고, 올바른 프로그램을 작성하는 데 도움이 되는 도구를 선호하며, 나를 위해 생각하도록 설계된 제품에는 불쾌감을 느낌
    • 내가 생산하는 소프트웨어에 대한 자신의 이해의 주체성을 제거하고, 동료와의 연결을 끊는 제품을 거부함
    • LLM이 과대광고에 부응하더라도, 우리는 여전히 이 모든 것과 기술을 잃게 될 것임
    • 인간은 기계와 그들을 지원하는 기업보다 중요하며, 나머지 우리가 그들이 판매하는 새로운 아메리칸 드림을 쫓는 동안 그들은 이익을 얻고 있음
    • 대가로 우리는 비판적 사고 능력, 재미, 기술, 프라이버시, 그리고 아마도 지구를 제공하고 있음
반응형
반응형

 

[python] asciichartpy -  터미널(콘솔) 환경에 깔끔하고 읽기 쉬운 텍스트 기반의 ASCII 아트 그래프를 그려주는 라이브러리

 

pip install asciichartpy

 

https://pypi.org/project/asciichartpy/

 

Client Challenge

JavaScript is disabled in your browser. Please enable JavaScript to proceed. A required part of this site couldn’t load. This may be due to a browser extension, network issues, or browser settings. Please check your connection, disable any ad blockers, o

pypi.org

 

 

import asciichartpy 

data = [1, 2, 3, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 4, 3, 2, 1]
print("ASCll Line Chart Example")
print(asciichartpy.plot(data, {'height': 10}))

 

import asciichartpy as ac

series1 = [20, 25, 22, 28, 30, 24, 35, 32, 26]
series2 = [10, 15, 12, 18, 20, 14, 25, 22, 16]

# 두 개의 계열을 하나의 차트에 표시
print(ac.plot([series1, series2], {'height': 15, 'colors': [ac.red, ac.blue]}))
반응형
반응형

PHP 8.5: The Version That Will Actually Makes Life Easier

 

https://pixicstudio.medium.com/php-8-5-new-developer-features-f9617311c590

 

PHP 8.5: The Version That Will Actually Makes Life Easier

The Developer-Friendly Upgrade You’ve Been Waiting For

pixicstudio.medium.com

 

PHP 8.5 is out soon, and honestly, it’s one of those releases that makes me excited as a developer. Some of the features are small, but they just feel so right, you know? I’m talking about stuff that just makes your life easier every single day. Let me take you through it.

Pipe Operator: No More Temporary Variables

The pipe operator, you’ve probably seen it floating around in tweets and RFCs. And yes, it’s actually useful.

Imagine this: you have a function called sendEmail. It takes an email address, but before you send it, you want to clean it up. Trim spaces, make it lowercase… usual stuff. Before PHP 8.5, you might do something like this:

$email = "  TEST@EXAMPLE.COM  ";
$email = trim($email);
$email = strtolower($email);
sendEmail($email);

Temporary variables, reassignments, all that noise. Now with the pipe operator:

"  TEST@EXAMPLE.COM  "
    |> trim()
    |> strtolower()
    |> sendEmail();

No temporary variables, everything flows left to right. Makes your code so much cleaner.

No Discard Attribute: Stop Ignoring Return Values

Next up, #[NoDiscard]. This is actually amazing. Sometimes you call a function, and you must use the return value, but people (or even yourself) might forget. PHP 8.5 can now warn you if you ignore it.

#[NoDiscard]
function getName(): string {
    return "Nuno";
}

If you do this:

getName(); // PHP will warn you: "Hey, you should use the return value!"

It forces you to handle the result or explicitly cast to void if you really mean to ignore it. Honestly, this one is top three features for me. You combine this with the pipe operator, and you can write clean, safe chains without warnings.

Closures in Constant Expressions

PHP 8.5 now lets you use static closures in places that only accept compile-time values. Class constants, default property values, attribute arguments… you can now use closures in all of them.

class Example {
    public const VALIDATOR = static function($value) {
        return !empty($value);
    };
}

Before, this would fail, now it works. You can literally attach reusable logic directly to constants or attributes. This is huge for frameworks like Laravel that use a lot of validation or metadata.

Array Helpers: array_first() and array_last()

You know how annoying it was to get the first or last element of an array? I mean, PHP has reset() and end(), but they move the internal pointer. Now we have:

$users = ["Adrian", "Maria", "Pedro"];
$first = array_first($users); // Adrian
$last = array_last($users);   // Pedro

It’s simple, intuitive, and doesn’t mess with your array pointer. Little change, big difference.

Global Constants with Attributes

Another subtle one. PHP 8.5 now lets you add attributes to global constants. Before, this was impossible. Now, you can do something like:

#[Deprecated("Use NEW_CONSTANT instead")]
const OLD_CONSTANT = 42;

Try echoing it:

echo OLD_CONSTANT; // 42 + deprecation warning

It’s basically metadata for constants. If your framework or package uses constants for configuration, you can now attach extra info cleanly.

Get Exception Handler

For framework developers, this one is neat. PHP 8.5 introduces get_exception_handler(). If you’ve ever used set_exception_handler(), you know it’s hard to inspect the existing closure. Now, you can actually grab it:

set_exception_handler(fn($e) => echo "Caught: " . $e->getMessage());
$handler = get_exception_handler();
var_dump($handler);

Perfect for logging, debugging, or even modifying exception handling at runtime. Frameworks like Laravel could make real use of this for global error handling.

Intel List Formatter

And here’s a fun one: IntlListFormatter. Not something you’d use every day, but when you need it, it’s perfect. You can take a list and format it according to locale rules.

$formatter = new \Intl\IntlListFormatter('en', \Intl\IntlListFormatter::TYPE_AND);
echo $formatter->format(['Lisbon', 'Porto', 'Coimbra']); // "Lisbon, Porto, and Coimbra"

It handles “and”, “or”, and other localized ways of formatting lists automatically. Nice little quality-of-life improvement for internationalized apps.

Minor Internal and CLI-Only Improvements

Even the small improvements in PHP 8.5 make a difference, especially if you work with the CLI or care about internal debugging and configuration.

1. php.ini Diff (PHP-IN-DIFF)

Ever wish you could quickly see which settings you’ve changed from the default PHP configuration? PHP 8.5 makes this super easy with a new CLI command:

php -i --diff

This shows you exactly which php.ini options differ from the defaults. For example, I always increase memory limits and disable timeouts for scripts while testing:

memory_limit = -1
max_execution_time = 0

Before, you had to manually compare or scroll through phpinfo(). Now it’s literally built-in. Such a small, but life-saving improvement for anyone debugging PHP setups.

2. PHP Build Date Constant

PHP 8.5 introduces a new constant that tells you exactly when the binary was built. Want to check?

echo PHP_BUILD_DATE;

Output:

2025-09-17 14:32:00

It’s perfect if you’re running multiple PHP binaries or want to verify the version/build you’re using. Nothing groundbreaking, but again, quality-of-life.

3. Final Property Promotion

PHP 8.5 improves property promotion with the ability to mark individual properties as final. You could already make an entire class final, but now you can target specific properties in your constructor:

class User {
    public function __construct(
        final public string $username,
        public string $email
    ) {}
}

Now $username cannot be overridden in subclasses. It’s subtle, but for codebases where immutability matters, this is a huge clarity win.

4. CLI and Debugging Tweaks

Other minor improvements include:

  • Better default error reporting when using php -d overrides.
  • Cleaner warnings for deprecated features in CLI mode.
  • Small optimizations under the hood that make scripts run slightly faster or consume less memory in edge cases.

None of these require code changes, but if you’re a framework developer or DevOps person, they make day-to-day PHP usage smoother.

Why Even Minor Changes Matter

Here’s the thing: PHP 8.5 isn’t just about flashy features. Even small internal improvements and CLI tweaks reduce friction in your workflow. That’s the real magic here, less time fighting configuration, more time writing code that actually does something.

Final Thoughts

PHP 8.5 is packed with quality-of-life features. Not every one of them will change your world, but together they make the language smoother, safer, and more enjoyable.

  • Pipe operator: clean chains, no temp variables.
  • NoDiscard: never ignore important return values again.
  • Closures in constants: attach logic anywhere at compile time.
  • Array helpers: easy access to first and last elements.
  • Attributes on constants: add metadata cleanly.
  • Exception handler inspection: framework-friendly.
  • Intl list formatter: smart, localized lists.

PHP 8.5 feels like one of those releases that makes you happy to write PHP again. It’s not flashy, but it’s clever, practical, and developer-first.

If you haven’t checked it out yet, start testing the beta. I guarantee some of these features will make their way straight into your daily coding habits.

반응형
반응형

마인크래프트 하면서 영어 배운다…알레프랩 와이콤비네이터에 ‘낙점’

 

 

https://www.mk.co.kr/news/business/11443250

 

마인크래프트 하면서 영어 배운다…알레프랩 와이콤비네이터에 ‘낙점’ - 매일경제

게임형 AI 학습 에이전트 크루캐피탈이어 후속 투자 유치 게임·언어·과목 등 확장 계획

www.mk.co.kr

게임형 인공지능(AI) 스타트업 알레프 랩(Aleph Lab)이 미국 실리콘밸리 대표 스타트업 액셀러레이터인 와이콤비네이터(YC)에 낙점됐다.

알레프랩은 올해 가을(F25) 와이콤비네이터 배치 프로그램에 선정돼 후속 투자를 유치했다고 16일 밝혔다. 지난 8월 설립 직후 크루캐피탈(Krew Capital)로부터 첫 투자를 받은 지 약 한 달 만이다.

알레프 랩은 아이들이 좋아하는 게임을 통해 자연스럽게 영어를 습득하는 경험을 목표로, AI 원어민 친구와 함께 게임 마인크래프트 안에서 실시간으로 대화하며 영어를 배우는 학습 서비스 ‘알레프 키즈(Aleph Kids)’를 개발하고 있다. 연내에 게임 플랫폼 ‘로블록스’에서도 서비스를 지원할 계획이다.

알레프 키즈의 첫 번째 AI 원어민 친구 ‘애니’(Annie)는 단순한 대화형 챗봇이 아닌 AI 에이전트로, 주변 환경을 인식해 아이의 답변을 유도하는 질문을 생성하며 자연스러운 언어 학습을 설계했다.

학습자의 흥미, 언어 수준, 게임 상황을 실시간으로 분석해 맞춤형 학습 커리큘럼을 생성하고, 놀면서 배우는 경험(learn through play)을 제공하는 것이 목표다.

투자금은 이후 로블록스 등 인기 게임 속 AI 친구 출시, 스페인어와 프랑스어 등 언어 확장, 수학·과학 등 과목 추가, 성인 대상 학습 서비스 출시 등 제품 확장에 활용될 예정이다.

장한님·한관엽 공동대표는 “아이들이 값비싼 해외 영어캠프나 유학을 가지 않더라도, 언제 어디서나 AI 원어민 친구와 함께 놀면서 자연스럽게 영어 실력을 키우고 유창해질 수 있도록 하겠다”며 “아이들이 해외에 나가서 자신감 있게 영어로 대화하고, 학업과 커리어에서 더 많은 선택지를 가질 수 있는 세상을 만들 것”이라고 밝혔다.

반응형

+ Recent posts