<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><title>t.laboratory (한국어)</title><link>https://tlaboratory.net/ko/</link><description>Flutter, 앱 운영, 서버, 스크래핑, AI까지. 15개 이상의 앱을 실제로 운영하며 얻은 실무 기록.</description><language>ko</language><item><title>3개 언어 블로그를 411줄짜리 Python 정적 사이트 생성기로 만들기</title><link>https://tlaboratory.net/ko/python-static-site-generator-multilingual/</link><guid>https://tlaboratory.net/ko/python-static-site-generator-multilingual/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>Hugo 대신 직접 만든 이유와, hreflang·noindex 옛 글·광고 자리·JSON-LD·안전한 증분 FTP 배포를 어떻게 처리하는지.</description></item><item><title>PHP에서 prepared statement로 바꾸면 JSON 타입이 바뀐다</title><link>https://tlaboratory.net/ko/php-prepared-statements-change-json-number-types/</link><guid>https://tlaboratory.net/ko/php-prepared-statements-change-json-number-types/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>mysqli의 query()를 prepared statement로 바꾸면 json_encode에서 &quot;7&quot;이 7이 된다. PHP 8.5 + MariaDB 11.8 실측과, 구버전 Flutter 앱이 죽는 이유.</description></item><item><title>LiteSpeed .htaccess로 한글 URL 리라이트하기: 실측으로 확인한 것</title><link>https://tlaboratory.net/ko/litespeed-htaccess-rewrite-non-ascii-urls/</link><guid>https://tlaboratory.net/ko/litespeed-htaccess-rewrite-non-ascii-urls/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>패턴은 인코딩 전일까 후일까, 공백은 어떻게 쓸까, 301은 쿼리스트링을 남길까. 운영 중인 LiteSpeed에 요청 23번을 보내 확인한 결과와 안전한 실험 방법.</description></item><item><title>호스팅 계정 이전 후 조용히 깨져 있던 다섯 가지</title><link>https://tlaboratory.net/ko/hosting-account-migration-what-broke/</link><guid>https://tlaboratory.net/ko/hosting-account-migration-what-broke/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>계정을 옮긴 뒤에도 모든 페이지가 200이었다. 그런데 FTP 루트, 크론 경로, Python venv, 실행 권한, 크론의 &#x27;분&#x27; 설정이 소리 없이 깨져 있었다.</description></item><item><title>앱 16개를 8주 만에 최신 Flutter로 옮기며 깨진 것들</title><link>https://tlaboratory.net/ko/flutter-migration-16-apps-what-broke/</link><guid>https://tlaboratory.net/ko/flutter-migration-16-apps-what-broke/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>2026년 5~7월, 웹뷰 래퍼였던 앱 6개를 네이티브 Flutter로, 오래된 Flutter 앱 10개를 최신으로 바꿨다. 빌드 오류, 심사 반려, 되돌린 변경의 기록.</description></item><item><title>공유 호스팅의 PHP 크론으로 FCM 예약 푸시 보내기</title><link>https://tlaboratory.net/ko/fcm-scheduled-push-php-cron/</link><guid>https://tlaboratory.net/ko/fcm-scheduled-push-php-cron/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>Flutter 앱 8개에 당첨 결과 알림을 5분 주기 PHP 크론과 FCM HTTP v1로 보낸다. 데이터가 나왔을 때만, 하루 한 번, 그리고 200을 믿지 않는다.</description></item><item><title>Dart http 클라이언트는 POST의 301을 따라가지 않는다: 실측과 해결</title><link>https://tlaboratory.net/ko/dart-http-post-redirect-not-followed/</link><guid>https://tlaboratory.net/ko/dart-http-post-redirect-not-followed/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>Flutter 앱의 검색이 서버의 301 때문에 조용히 실패하고 있었다. Dart 3.11과 http 1.6이 리다이렉트 코드마다 어떻게 동작하는지 curl과 비교하고, 검증한 해결법을 정리했다.</description></item><item><title>호스팅 CDN이 API 응답과 301까지 캐시하고 있었다</title><link>https://tlaboratory.net/ko/cdn-caches-api-responses-and-redirects/</link><guid>https://tlaboratory.net/ko/cdn-caches-api-responses-and-redirects/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>라우팅을 바꾼 뒤 API URL 4개가 CDN에서 옛 301을 계속 돌려줬다. Hostinger CDN이 무엇을 캐시하는지 헤더별로 실측하고, 속지 않는 검증 방법을 정리했다.</description></item><item><title>앱 개인정보처리방침은 기억이 아니라 매니페스트로 쓴다</title><link>https://tlaboratory.net/ko/app-privacy-policy-from-manifests/</link><guid>https://tlaboratory.net/ko/app-privacy-policy-from-manifests/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>스토어 등록 24건이 예시 문구가 남은 템플릿을 가리키고 있었다. 앱 17개의 방침을 pubspec, Info.plist, 병합된 Android 매니페스트로 다시 만든 기록.</description></item><item><title>Flutter 앱 17개의 AdMob 빈도를 자체 서버에서 조절하기</title><link>https://tlaboratory.net/ko/admob-remote-ad-config-server/</link><guid>https://tlaboratory.net/ko/admob-remote-ad-config-server/</guid><pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate><description>Firebase Remote Config를 141줄짜리 PHP 엔드포인트로 바꾼 이유, 앱 쪽 대비책, 그리고 다시 빌드하지 않고 광고 간격을 바꿨을 때 CTR이 어떻게 움직였는지.</description></item><item><title>앱스토어 등록 URL을 끊지 않고 WordPress를 정적 사이트로 옮기기</title><link>https://tlaboratory.net/ko/wordpress-to-static-without-breaking-store-urls/</link><guid>https://tlaboratory.net/ko/wordpress-to-static-without-breaking-store-urls/</guid><pubDate>Sun, 08 Nov 2026 00:00:00 +0000</pubDate><description>스토어 등록 24건이 WordPress 페이지를 개인정보처리방침 URL로 쓰고 있었다. LiteSpeed에서 등록 URL을 모두 200으로 유지한 채 5분 만에 전환한 기록.</description></item><item><title>구버전 앱을 멈추지 않고 레거시 PHP API 정리하기</title><link>https://tlaboratory.net/ko/move-legacy-php-api-without-breaking-old-app-versions/</link><guid>https://tlaboratory.net/ko/move-legacy-php-api-without-breaking-old-app-versions/</guid><pubDate>Sun, 08 Nov 2026 00:00:00 +0000</pubDate><description>API 폴더 8개, PHP 파일 102개, 깊이가 다른 include 네 가지, 강제 업데이트할 수 없는 앱. 내부 리라이트와 응답 비교로 /api/v1 아래로 옮긴 과정.</description></item><item><title>AI 코딩 에이전트에게 운영 서버를 맡겼을 때 실제로 버틴 안전장치</title><link>https://tlaboratory.net/ko/ai-coding-agent-live-server-guardrails/</link><guid>https://tlaboratory.net/ko/ai-coding-agent-live-server-guardrails/</guid><pubDate>Sun, 08 Nov 2026 00:00:00 +0000</pubDate><description>AI 에이전트가 하룻밤에 운영 사이트와 앱 API 8개를 옮겼다. 에이전트가 낸 실수, 그것을 잡아낸 검사, 사람에게 남긴 일을 정리했다.</description></item><item><title>이진 탐색(Binary Search): 2021년 코드를 다시 돌려 보니</title><link>https://tlaboratory.net/ko/algorithm-binary-search/</link><guid>https://tlaboratory.net/ko/algorithm-binary-search/</guid><pubDate>Tue, 29 Jun 2021 00:00:00 +0000</pubDate><description>정렬된 배열을 반씩 줄여 가며 찾는 이진 탐색. 2021년 예제를 지금 컴파일하니 에러가 났고, 비교 횟수 설명도 1회씩 틀렸다. 실측으로 고친 보강판.</description></item></channel></rss>
