내 기기에서 개인 AI 검색 구축: 브라우저 내 로컬 RAG
How many times have you wanted to search your private PDFs, notes, or code files using AI, but hesitated? Uploading sensitive documents to external servers pose...
1976 posts from this source
How many times have you wanted to search your private PDFs, notes, or code files using AI, but hesitated? Uploading sensitive documents to external servers pose...
!Stop Freezing Your API: Async Email Delivery in Laravel의 표지 이미지 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=...
개요: Solana Validator Stake Checker는 순수 표준 라이브러리만을 사용한 Python CLI로, Solana 메인넷 RPC에 쿼리하여 검증자 스테이크 분포와 Nakamoto… 를 표시합니다.
TL;DR 왜 이걸 만들었는가? staging과 committing의 차이는 무엇인가? 대부분의 자료는 텍스트로 답한다. 나는 인터랙션으로 답하고 싶었다. W...
Useful Dart language features I’ve been using for more than 2 years now. After jumping in and out of Kotlin and some other languages, I realized that Dart has a...
소개 어제 Hacker News에 있었다면 보셨을 겁니다: 친절한 사기(friendly fraud)로 수천 달러를 잃은 상인(merchant)의 상세한 사후 분석(post‑mortem) — 고객…
우리가 실제로 해결하고 있던 문제 우리는 Veltrix라는 분산 이벤트‑프로세싱 엔진을 운영했으며, 이는 소매점 전역에서 실시간 보물 찾기를 가능하게 했습니다. 비즈…
옵션 가격 모델을 위한 확률적 예측 로깅 확률적 예측을 제공한다면, 구축할 수 있는 가장 높은 가치를 지닌 습관은 예측을 로깅하는 것입니다.
Problem Scenario: A Brutal Approach to Image Downloading We needed to sync approximately 3,000 1688 products daily, including main images and detail images, av...
!Article imagehttps://dev-to-uploads.s3.amazonaws.com/uploads/articles/989tsu88kkq3xvlco6w7.png 대부분의 사람들이 Mixtral 또는 DeepSeek‑V3를 로컬에서 실행하려고 할 때 …에 부딪힌다.
2026년 오픈 vs 클로즈드 LLMs: 게임 체인징 컨버전스 표지 이미지 03:32:15 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=...
How to Sign and Notarize a Tauri Mac App for Distribution All tests run on an 8‑year‑old MacBook Air. Every Mac app I've shipped required this. An unsigned Mac...
우리가 실제로 해결하고 있던 문제 엔진은 프랑크푸르트에 있는 256 GB RAM을 탑재한 9대의 강력한 베어메탈 노드에서 단일 Elixir 클러스터로 시작되었습니다.
문제 Node.js TypeScript 백엔드에서 Builder 패턴을 구현하여 Permission 객체를 인스턴스화한 뒤 이를 repository 레이어에 전달하려고 합니다. 저는 Permission 객체가 여러 선택적 속성을 가질 수 있기 때문에 Builder를 사용해 가독성을 높이고 싶었습니다. 시도한 내용 ```typescript class PermissionBuilder { private permission: Permission; constructor() { this.permission = new Permission(); } setId(id: string): this { this.permission.id = id; return this; } setUserId(userId: string): this { this.permission.userId = userId; return this; } // … 기타 setter 메서드들 … build(): Permission { return this.permission; } } ``` 위와 같이 Builder를 만든 뒤, 서비스 레이어에서 다음과 같이 사용했습니다. ```typescript const permission = new PermissionBuilder() .setId('123') .setUserId('456') .setRead(true) .setWrite(false) .build(); await permissionRepository.save(permission); ``` 하지만 테스트를 실행하면 `permissionRepository.save`가 `undefined`를 반환하고, 저장된 레코드가 데이터베이스에 나타나지 않습니다. 또한, `PermissionBuilder`를 사용하지 않고 직접 `new Permission()`으로 객체를 만들면 정상적으로 저장됩니다. 원인 분석 1. **Builder가 실제로 새로운 인스턴스를 반환하지 않음** `build()` 메서드가 현재 내부에 보관하고 있는 `this.permission` 객체를 그대로 반환하고 있습니다. 이 객체는 `new Permission()`으로 만든 초기 객체이며, 이후 setter 메서드들이 원본 객체의 속성을 직접 수정합니다. TypeScript에서는 객체가 **참조에 의해 전달**되기 때문에, `PermissionBuilder` 인스턴스가 재사용될 경우 이전에 설정한 값이 남아 있을 수 있습니다. 2. **불변성을 보장하지 않음** Builder 패턴의 일반적인 구현은 `build()` 단계에서 **새로운 복사본**을 만들어 반환합니다. 이렇게 하면 Builder 자체는 재사용 가능하고, 이미 `build()`된 객체는 더 이상 변경되지 않게 됩니다. 현재 구현은 동일한 인스턴스를 계속 반환하므로, 테스트 환경에서 여러 번 `build()`를 호출하면 이전 테스트의 상태가 섞일 위험이 있습니다. 3. **Repository 레이어가 기대하는 형태와 불일치** `permissionRepository.save`는 **완전한 엔티티**(예: TypeORM 엔티티) 인스턴스를 기대합니다. Builder가 반환하는 객체가 엔티티 메타데이터(예: `@PrimaryGeneratedColumn`, `@Column` 데코레이터)와 연결되지 않은 **plain 객체**라면, ORM이 이를 무시하거나 `undefined`를 반환할 수 있습니다. 해결 방안 ### 1. `build()`에서 새로운 객체를 반환하도록 수정 ```typescript class PermissionBuilder { private readonly data: Partial<Permission> = {}; setId(id: string): this { this.data.id = id; return this; } setUserId(userId: string): this { this.data.userId = userId; return this; } // … 기타 setter 메서드들 … build(): Permission { // Permission 엔티티의 생성자를 사용하거나 Object.assign 로 복사 return Object.assign(new Permission(), this.data); } } ``` - `Partial<Permission>`을 사용해 아직 완전하지 않은 상태를 저장하고, `build()` 시점에 **새로운 Permission 인스턴스**를 만든 뒤 속성을 복사합니다. - 이렇게 하면 Builder 자체는 상태를 유지하지만, 반환된 객체는 독립적이며 ORM이 정상적으로 인식합니다. ### 2. Builder를 **불변**하게 설계 ```typescript class PermissionBuilder { private readonly data: Readonly<Partial<Permission>>; private constructor(data: Partial<Permission> = {}) { this.data = data; } static create(): PermissionBuilder { return new PermissionBuilder(); } setId(id: string): PermissionBuilder { return new PermissionBuilder({ ...this.data, id }); } setUserId(userId: string): PermissionBuilder { return new PermissionBuilder({ ...this.data, userId }); } // … 기타 setter 메서드들 … build(): Permission { return Object.assign(new Permission(), this.data); } } ``` - 각 setter가 새로운 Builder 인스턴스를 반환하므로 **동시성 문제**와 **테스트 간 상태 누수**를 방지합니다. ### 3. Repository에 전달하기 전에 엔티티 인스턴스인지 확인 ```typescript const permission = PermissionBuilder.create() .setId('123') .setUserId('456') .setRead(true) .setWrite(false) .build(); if (!(permission instanceof Permission)) { throw new Error('Built object is not a Permission entity'); } await permissionRepository.save(permission); ``` - 타입 가드로 잘못된 객체가 전달되는 것을 사전에 차단합니다. ### 4. 테스트 환경 정리 - 각 테스트 케이스 시작 전에 **Builder 인스턴스를 새로 생성**하거나 `PermissionBuilder.create()`를 호출합니다. - 테스트 후에는 데이터베이스를 **트랜잭션 롤백**하거나 `afterEach` 훅에서 `permissionRepository.clear()`를 호출해 상태를 초기화합니다. 예시 코드 (전체 흐름) ```typescript // permission.builder.ts export class PermissionBuilder { private readonly data: Partial<Permission> = {}; setId(id: string): this { this.data.id = id; return this; } setUserId(userId: string): this { this.data.userId = userId; return this; } setRead(read: boolean): this { this.data.read = read; return this; } setWrite(write: boolean): this { this.data.write = write; return this; } // … 추가 setter … build(): Permission { return Object.assign(new Permission(), this.data); } } // permission.service.ts async function createPermission(dto: CreatePermissionDto) { const permission = new PermissionBuilder() .setId(dto.id) .setUserId(dto.userId) .setRead(dto.read) .setWrite(dto.write) .build(); return await permissionRepository.save(permission); } ``` 결론 - 현재 Builder 구현은 **같은 인스턴스를 재사용**하고 있어 ORM이 기대하는 완전한 엔티티 객체를 제공하지 못합니다. - `build()` 단계에서 **새로운 Permission 인스턴스를 반환**하도록 수정하고, 가능하면 **불변 Builder** 패턴을 적용하면 테스트 간 상태 오염을 방지하면서도 가독성을 유지할 수 있습니다. - 마지막으로, Repository에 전달하기 전에 반환 객체가 실제 엔티티인지 검증하고, 테스트 환경을 깨끗하게 정리하면 `undefined` 반환 문제를 해결할 수 있습니다.
I vibe‑coded my way through three months of Claude Code projects before I admitted something was off. The code worked, mostly, but I kept losing hours to the sa...
배경: 12일 동안 157개의 스킬을 로드한 후, 나는 그것들을 효율적으로 사용하고 있는지에 대한 가시성이 전혀 없다는 것을 깨달았다. 대부분의 AI 에이전트 데모는 마법처럼 보인다…
Wikimedia Function Orchestrator 배너
MartinLoop은 AI 코딩 에이전트를 위한 오픈소스 컨트롤 플레인입니다. 하드 예산 중단, JSONL 실행 기록, 그리고 검증‑게이트 완료를 추가하여 자율 코딩을 지원합니다.
당신의 문서는 코드 옆에 있습니다. 그것이 docs-as-code 약속입니다 — 버전 관리, 풀 리퀘스트 리뷰, CI/CD 파이프라인. 아주 아름답게 작동합니다… 하지만 당신의 repo가…
개요 프로그래밍 언어 생태계는 빠르게 진화하지만, 때때로 진정으로 흥미로운 방향을 가진 새로운 프로젝트가 등장합니다. 하나의 언어는 r...
Introduction Like many independent developers, I spent the last few weeks navigating the confusing world of quarterly 1099 taxes, trying to figure out if setti...
MUD가 무엇이며 사람들은 왜 아직도 그것을 플레이하고 있나요? ! https://leonardo.osnova.io/e5109a49-2d0e-57c2-a21b-79a550a6486e A MUD(Multi-User Dungeon)는 멀티플레이어…
Chapter Integrity in AudioProducer.ai A chapter is the smallest unit a listener actually navigates. Listeners may open an audiobook in the middle of Chapter 7,...
배경: 2026년 5월 25일 아침, 레오 XIV 교황은 바티칸의 Synod Hall에 들어섰다. 그 방은 추기경, 외교관, 그리고 주요 인물들로 가득 차 있었다.
“희귀” 버그, 간헐적으로 보이지만 실제로는 deterministic이다. 이는 단지 여러분의 pods가 scale되기를 기다리고 있을 뿐이다. 나는 최근에 교과서적인 concurrency 문제를 다루었다.
왜 나는 기본적으로 다줄 포맷팅을 선호하는가 나는 많은 코드를 리뷰하고, 보통 다줄 포맷팅을 선호한다. 보기 좋다고서가 아니라 – 그것은 …
_This article is a deep‑dive from JudyAI Lab — an AI engineering playbook series with 100+ published guides, 5,000+ weekly readers across 60+ countries, focused...
소개 VuReact는 Vue에서 React로 마이그레이션하기 위한 컴파일러 툴체인이며, Vue 3 문법으로 React를 작성하기 위한 도구입니다. 이 기사에서는 Vue의 공통…
마크다운 !Wilsonhttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fupload...
AI 에이전트에 영구 메모리를 부여하는 것은 간단해 보입니다. 사실을 저장하고 나중에 기억해내는 것. 얼마나 어려울 수 있을까요? 3주와 6개의 제공자를 거친 뒤, 저는 의견을 갖게 되었습니다. Th...
개요: 수건에 그린 스케치에서 40분 이내에 데이터 기반 부동산 투자 어드바이저로. Google의 Antigravity 2.0과 Gemini 3.5 i를 함께 테스트했습니다.
Introduction I got tired of translating Figma screens and UI screenshots into JSX before I could touch any real frontend work—routing, state, architecture, the...
Who This Is For Use this when you want to understand a company from primary sources without letting an AI model invent confidence. The goal is not to decide wh...
What SchemaSpy Does Best SchemaSpy's primary strength is its interactive HTML report. After a single run, you get a navigable website: clickable table pages, h...
!NoFosterhttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuse...
Overview We estimated 300 engineer‑days. We shipped in 35 days with 3,077 tests and zero raw hex values. Below is the pipeline I built to make Figma the litera...
“현장에서 돈을 벌고, 사무실에서는 도대체 어디로 갔는지 궁금해한다.” — Adam Cooley, HVAC 소유주, 지난주 페이스북 설문에 대한 댓글
!Hussein Mahdihttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%...
!Cover image for I Built a Free Finance Dashboard as a Solo Dev — Here's What I Learnedhttps://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravi...
TL;DR — jhipster-mcp is an open‑source Model Context Protocol MCP server that lets an AI agent generate and evolve JHipster applications for you. Describe what...
About the Role Looking for a Founding Engineer to join me in building an AI startup in the finance space. I’m building TaxCopilot, focused on AI systems and wo...
!pichttps://media2.dev.to/dynamic/image/width=256,height=,fit=scale-down,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farti...
배경: flag_shih_tzu는 여러 불리언 속성을 단일 정수 컬럼에 저장하며, 플래그당 하나의 비트를 할당합니다. 버전 1.0.0에서는 멀티‑비트 지원을 도입했습니다.
런타임이 장벽이었을 때: Rust가 50 ms SLA를 깨고 하루를 구한 이야기
!Cover image for 🎤 Building a Real-Time Voice AI Assistant Using Open Source Toolshttps://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=a...
Problem Job applications are brutal. Company research, CV tailoring, cover letter writing, and interview preparation each take 45–60 minutes. Multiply that by...
그 일은 화요일에 일어났습니다. 저는 AI coding assistant에게 3개월 전에 작성한 function을 설명해 달라고 요청했습니다. 그것은 존재하지 않는 function을 설명했습니다. Not...
Building an indexable verification page for a freshly‑launched small‑business site When a small business launches a new website, Google treats it as untrusted...