<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Jalal LinuX</title><link>https://virgool.ir/feed/@jalallinux</link><description></description><language>fa</language><pubDate>2026-11-10 23:45:01</pubDate><image><url>https://files.virgool.ir/upload/users/945263/avatar/avatar.png</url><title>Jalal LinuX</title><link>https://virgool.ir/@jalallinux</link></image><item><title>مفهوم Harness Engineering چیست؟</title><link>https://virgool.ir/@jalallinux/openai-harness-engineering-u7uwshizibxs</link><description>چرا OpenAI می‌گوید آینده مهندسی نرم‌افزار دیگر «کدنویسی» نیست؟این مقاله، خلاصه و بازنویسی آزاد مقاله رسمی OpenAI با عنوان &#34;Harness engineering: leveraging Codex in an agent-first world&#34; است. اگر به موضوع علاقه‌مند شدید، حتماً نسخه اصلی را نیز مطالعه کنید.مقدمهاگر تا امروز فکر می‌کردید مهم‌ترین مهارت برنامه‌نویس‌ها در آینده Prompt Engineering است، احتمالاً وقت آن رسیده که این دیدگاه را تغییر دهید.OpenAI در مقاله‌ای با عنوان Harness Engineering از مفهومی صحبت می‌کند که به نظر می‌رسد قرار است یکی از مهم‌ترین مهارت‌های مهندسی نرم‌افزار در عصر Agentها باشد.جالب‌تر اینکه این مقاله فقط یک ایده تئوری نیست.تیم OpenAI طی حدود پنج ماه یک محصول واقعی ساخت؛ محصولی که:نزدیک به یک میلیون خط کد داشت.بیش از ۱۵۰۰ Pull Request روی آن ثبت شد.کاربران واقعی از آن استفاده می‌کردند.اما حتی یک خط از کدهای پروژه را انسان‌ها مستقیماً ننوشته بودند.تمام کدها توسط Codex تولید شده بود و انسان‌ها فقط مسیر را مشخص می‌کردند. (OpenAI)جمله‌ای که تمام مقاله را خلاصه می‌کندOpenAI یک جمله ساده اما عمیق دارد:Humans steer. Agents execute.یعنی:انسان مسیر را مشخص می‌کند؛ Agent اجرا می‌کند.به نظر ساده می‌آید، اما در عمل یعنی نقش برنامه‌نویس در حال تغییر است.Harness Engineering یعنی چه؟کلمه Harness در انگلیسی به معنی افسار یا وسیله‌ای برای هدایت و کنترل است.OpenAI از این واژه برای توصیف تمام محیطی استفاده می‌کند که Agent داخل آن کار می‌کند.خیلی‌ها فکر می‌کنند اگر بهترین مدل دنیا را داشته باشند، همه چیز حل می‌شود.اما OpenAI می‌گوید:مدل فقط یکی از اجزای سیستم است.آن چیزی که کیفیت خروجی را تعیین می‌کند، محیطی است که Agent داخل آن قرار گرفته است.این محیط شامل مواردی مثل:RepositoryDocumentationابزارهاتست‌هاCI/CDقوانین معماریحافظه پروژهدسترسی‌هاFeedback Loopاست.به مجموع این موارد Harness گفته می‌شود. (OpenAI)مشکل Agent نیست؛ مشکل محیط استیکی از جالب‌ترین بخش‌های مقاله همین قسمت است.تیم OpenAI در ابتدای پروژه تصور می‌کرد هر جا Agent اشتباه می‌کند، مشکل از خود مدل است.اما بعد از مدتی به نتیجه متفاوتی رسیدند.آن‌ها متوجه شدند تقریباً همیشه سؤال درست این نیست که:«چرا Agent اشتباه کرد؟»بلکه باید پرسید:«ما چه چیزی را برای Agent فراهم نکرده‌ایم که باعث شده نتواند کار را درست انجام دهد؟»این تغییر نگاه، اساس Harness Engineering است. (OpenAI)Prompt خوب کافی نیستیکی از برداشت‌های رایج این است که اگر Prompt خوبی بنویسیم، خروجی خوبی هم می‌گیریم.OpenAI با این دیدگاه موافق نیست.به گفته آن‌ها، Prompt فقط یکی از قطعات پازل است.اگر مستندات پروژه ناقص باشد، قوانین معماری مشخص نباشد، تست وجود نداشته باشد یا Agent نداند اطلاعات را از کجا پیدا کند، حتی بهترین Prompt هم معجزه نخواهد کرد. (OpenAI)نقش برنامه‌نویس در حال تغییر استدر گذشته بخش زیادی از زمان یک مهندس نرم‌افزار صرف این کارها می‌شد:نوشتن کدتسترفع باگRefactorاما OpenAI معتقد است در دنیای Agentها، نقش انسان بیشتر به این سمت می‌رود:تعریف مسئلهشکستن مسئله به بخش‌های کوچک‌ترطراحی محیط مناسب برای Agentساخت ابزارهاتعریف قوانینایجاد حلقه‌های بازخوردبررسی نتیجه نهایییعنی ارزش اصلی برنامه‌نویس دیگر در سرعت تایپ کردن نیست، بلکه در طراحی سیستم است. (OpenAI)Repository فقط برای انسان نیستقبلاً هدف این بود که Repository برای اعضای تیم خوانا باشد.اما OpenAI مفهوم جدیدی معرفی می‌کند:Agent Legibilityیعنی Repository باید برای Agent هم قابل فهم باشد.نام فایل‌ها، ساختار پوشه‌ها، مستندات، قوانین و حتی نحوه سازمان‌دهی پروژه باید طوری باشد که Agent بتواند به راحتی آن را درک کند. (OpenAI)AGENTS.md قرار نیست همه چیز باشدخیلی از پروژه‌ها یک فایل بزرگ به نام AGENTS.md می‌سازند و تمام اطلاعات پروژه را داخل آن می‌ریزند.OpenAI این روش را توصیه نمی‌کند.به جای آن، پیشنهاد می‌کند AGENTS.md فقط نقش یک فهرست راهنما را داشته باشد.یعنی به Agent بگوید:معماری را از کجا بخواند.قوانین کدنویسی کجاست.مستندات API در چه مسیری قرار دارند.تصمیمات معماری در کدام پوشه ثبت شده‌اند.در واقع دانش اصلی پروژه باید داخل Repository زندگی کند، نه داخل یک فایل چند هزار خطی. (OpenAI)مستندات هم باید تست شوندیکی از جذاب‌ترین ایده‌های مقاله این است که Documentation هم باید بخشی از فرآیند کیفیت باشد.اگر:لینک‌ها خراب باشند،مستندات قدیمی شده باشند،ساختار اشتباه باشد،باید CI آن را تشخیص دهد.حتی OpenAI از Agentهایی استفاده می‌کند که فقط وظیفه‌شان بررسی و اصلاح مستندات است. (OpenAI)معماری نباید فقط یک توصیه باشداگر به Agent بگویید:«لطفاً Clean Architecture را رعایت کن.»احتمالاً کافی نیست.OpenAI پیشنهاد می‌کند قوانین معماری تا جای ممکن قابل اجرا باشند.مثلاً با:LinterStatic AnalysisRuleهای CIتست‌های خودکاربه جای اینکه فقط به Agent اعتماد کنید، سیستم خودش جلوی خطا را بگیرد. (OpenAI)سرعت بالا، فلسفه Merge را هم تغییر می‌دهدوقتی Agentها می‌توانند در مدت کوتاهی صدها Pull Request تولید کنند، روش سنتی Review دیگر جواب نمی‌دهد.به همین دلیل OpenAI از چندین Agent برای بازبینی، تست و اصلاح Pull Requestها استفاده می‌کند تا انسان فقط روی تصمیم‌های مهم تمرکز کند. (OpenAI)Agent-generated واقعاً یعنی چه؟شاید تصور کنید Agent-generated فقط یعنی تولید کد.اما تعریف OpenAI بسیار گسترده‌تر است.از نگاه آن‌ها، یک Agent می‌تواند:طراحی انجام دهد.کد بنویسد.تست تولید کند.Pull Request بسازد.کد خودش را Review کند.خطاها را اصلاح کند.دوباره تست بگیرد.در این مدل، انسان بیشتر نقش هدایت‌کننده را دارد تا اجراکننده. (OpenAI)یکی از چالش‌های آینده: Entropyهرچه Agentها سریع‌تر کد تولید کنند، Repository هم سریع‌تر شلوغ می‌شود.فایل‌های اضافی، کدهای بدون استفاده، مستندات قدیمی و وابستگی‌های غیرضروری به مرور زمان کیفیت پروژه را پایین می‌آورند.OpenAI این وضعیت را Entropy می‌نامد و معتقد است همان‌طور که Garbage Collector حافظه را تمیز می‌کند، پروژه هم به فرآیندهای دائمی برای پاکسازی و نظم‌دهی نیاز دارد. (OpenAI)جمع‌بندیمهم‌ترین پیام این مقاله شاید این باشد که:در آینده، مزیت رقابتی تیم‌های نرم‌افزاری داشتن قوی‌ترین مدل هوش مصنوعی نیست؛ بلکه داشتن بهترین Harness است.هرچه محیطی که Agent داخل آن کار می‌کند شفاف‌تر، مستندتر، قانونمندتر و قابل‌اعتمادتر باشد، خروجی Agent هم بهتر خواهد بود.به همین دلیل احتمالاً در چند سال آینده، یکی از مهم‌ترین مهارت‌های مهندسان نرم‌افزار دیگر صرفاً برنامه‌نویسی نخواهد بود؛ بلکه طراحی محیطی خواهد بود که Agentها بتوانند داخل آن با اطمینان کار کنند.منبع اصلیمقاله رسمی OpenAI:Harness engineering: leveraging Codex in an agent-first worldhttps://openai.com/index/harness-engineering/ (OpenAI)</description><category>Jalal LinuX</category><author>Jalal LinuX</author><pubDate>Mon, 27 Jul 2026 11:17:50 +0330</pubDate></item><item><title>داکرایز لاراول</title><link>https://virgool.ir/@jalallinux/laravel-dockerize-rkwgmyzk55qi</link><description>سلام دوستان ✌??چند مدت پیش برای داکرایز پروژه لاراولی ایمیج ساختم و خیلی کمکم کرد و دوستان هم استفاده از این ایمیج براشون راحت بوده و راضی بودن. دوست داشتم با شما هم به اشتراک بزارم. ✍️پکیج های نصب شده و کانفیگ های این ایمیج:&#xA;OS: amd64/ubuntu:20.04&#xA;TimeZone: Asia/Tehran&#xA;&#xA;Php: 8.0&#xA;Composer: latest&#xA;Node: 16&#xA;Npm: latest&#xA;Pm2: latest&#xA;Postgres-Client: 14&#xA;&#xA;OS Packages:&#xA;nano wget curl net-tools iputils-ping &#xA;supervisor sqlite3 zip unzip git htop&#xA;jpegoptim optipng pngquant gifsicle&#xA;&#xA;Php Extensions: swoole pgsql sqlite3 gd curl memcached imap mbstring xml zip bcmath soap readline intl pcov msgpack ldap igbinary redis pear  Php Customize ini: post_max_size=100M upload_max_filesize=100M variables_order=EGPCS&#xA;&#xA;Aliases:&#xA;art = php artisan شما برای استفاده از این ایمیج نیاز به ایجاد ۵ فایل در پروژه خود دارید..env.dockerاین فایل همان env ای خواهد بود که در cotainer شما ایجاد میشود. میتوانید برای ادرس دادن به ای پی بیرون از کانتینر (سروری ک دارید روش کار میکنید) از host.docker.internal استفاده کنید.APP_NAME=Laravel&#xA;APP_ENV=production&#xA;APP_KEY=&#xA;APP_DEBUG=false&#xA;APP_URL=http://lcalhost&#xA;&#xA;LOG_CHANNEL=daily&#xA;LOG_DEPRECATIONS_CHANNEL=null&#xA;LOG_LEVEL=debug&#xA;&#xA;DB_CONNECTION=pgsql&#xA;&#xA;DB_HOST=host.docker.internal&#xA;DB_PORT=5432&#xA;DB_DATABASE=laravel&#xA;DB_USERNAME=postgres&#xA;DB_PASSWORD=postgres&#xA;&#xA;BROADCAST_DRIVER=log&#xA;CACHE_DRIVER=redis&#xA;FILESYSTEM_DISK=local&#xA;QUEUE_CONNECTION=database&#xA;SESSION_DRIVER=file&#xA;SESSION_LIFETIME=120&#xA;&#xA;MEMCACHED_HOST=127.0.0.1&#xA;&#xA;REDIS_HOST=host.docker.internal&#xA;REDIS_PASSWORD=&#xA;REDIS_PORT=6379&#xA;&#xA;MAIL_MAILER=smtp&#xA;MAIL_HOST=smtp.gmail.com&#xA;MAIL_PORT=465&#xA;MAIL_USERNAME=&#xA;MAIL_PASSWORD=&#xA;MAIL_ENCRYPTION=tls&#xA;MAIL_FROM_ADDRESS=&#xA;MAIL_FROM_NAME=&#34;${APP_NAME}&#34;&#xA;&#xA;AWS_ACCESS_KEY_ID=&#xA;AWS_SECRET_ACCESS_KEY=&#xA;AWS_DEFAULT_REGION=us-east-1&#xA;AWS_BUCKET=&#xA;AWS_USE_PATH_STYLE_ENDPOINT=false&#xA;&#xA;PUSHER_APP_ID=&#xA;PUSHER_APP_KEY=&#xA;PUSHER_APP_SECRET=&#xA;PUSHER_HOST=&#xA;PUSHER_PORT=443&#xA;PUSHER_SCHEME=https&#xA;PUSHER_APP_CLUSTER=mt1&#xA;&#xA;VITE_PUSHER_APP_KEY=&#34;${PUSHER_APP_KEY}&#34;&#xA;VITE_PUSHER_HOST=&#34;${PUSHER_HOST}&#34;&#xA;VITE_PUSHER_PORT=&#34;${PUSHER_PORT}&#34;&#xA;VITE_PUSHER_SCHEME=&#34;${PUSHER_SCHEME}&#34;&#xA;VITE_PUSHER_APP_CLUSTER=&#34;${PUSHER_APP_CLUSTER}&#34;‍docker-compose.ymlversion: &#39;3&#39;&#xA;services:&#xA;    app:&#xA;        container_name: &#39;laravel&#39;&#xA;        restart: always&#xA;        build:&#xA;            context: .&#xA;            dockerfile: Dockerfile&#xA;        tty: true&#xA;        extra_hosts:&#xA;            - &#39;host.docker.internal:host-gateway&#39;&#xA;        ports:&#xA;            - &#39;0.0.0.0:80:8000&#39;DockerfileFROM jalallinux/laravel-9:php-80&#xA;&#xA;COPY . /app&#xA;WORKDIR /app&#xA;&#xA;COPY start-container /usr/local/bin/start-container&#xA;COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf&#xA;RUN chmod +x /usr/local/bin/start-container&#xA;&#xA;COPY .env.docker .env&#xA;RUN composer install&#xA;&#xA;EXPOSE 8000&#xA;ENTRYPOINT [&#34;start-container&#34;]start-container#!/usr/bin/env bash&#xA;&#xA;if [ ! -z &#34;$WWWUSER&#34; ]; then&#xA;    usermod -u $WWWUSER root&#xA;fi&#xA;&#xA;if [ ! -d /.composer ]; then&#xA;    mkdir /.composer&#xA;fi&#xA;&#xA;chmod -R ugo+rw /.composer&#xA;&#xA;if [ $# -gt 0 ]; then&#xA;    exec gosu $WWWUSER &#34;$@&#34;&#xA;else&#xA;    exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf&#xA;fisupervisor.confاین فایل supervisor است برای ران کردن و نگه داشتن پروسس ها. که در این مثال دستور serv پروژه و pm2 رو ران کردیم.[supervisord]&#xA;nodaemon=true&#xA;user=root&#xA;logfile=/var/log/supervisor/supervisord.log&#xA;pidfile=/var/run/supervisord.pid&#xA;&#xA;[program:php]&#xA;#command=/usr/bin/php -d variables_order=EGPCS /app/artisan serve --host=0.0.0.0 --port=8000&#xA;command=/usr/bin/php -d variables_order=EGPCS /app/artisan octane:start --host=0.0.0.0 --port=8000&#xA;user=root&#xA;stdout_logfile=/dev/stdout&#xA;stdout_logfile_maxbytes=0&#xA;stderr_logfile=/dev/stderr&#xA;stderr_logfile_maxbytes=0&#xA;&#xA;[program:pm2]&#xA;command=/usr/bin/pm2 start&#xA;user=root&#xA;autorestart=falseecosystem.config.jsاین فایل مربوط به pm2 است و باید پروسس هایی که میخواهید ران باشن رو در این لیست اضافه کنید. در این مثال یک scheduler و چهار صف لاراول را ران کردیم. برای اطلاعات بیشتر به داکیومنت pm2 مراجعه کنید.module.exports = {&#xA;    apps: [&#xA;        {&#xA;            namespace: &#34;laravel&#34;,&#xA;            name: &#34;scheduler&#34;,&#xA;            interpreter: &#34;php&#34;,&#xA;            script: &#34;artisan&#34;,&#xA;            exec_mode: &#34;fork&#34;,&#xA;            instances: 1,&#xA;            autorestart: true,&#xA;            cron_restart: &#34;* * * * *&#34;,&#xA;            max_memory_restart: &#34;50M&#34;,&#xA;            watch: false,&#xA;            args: [&#xA;                &#34;schedule:work&#34;,&#xA;            ],&#xA;        },&#xA;        {&#xA;            namespace: &#34;laravel&#34;,&#xA;            name: &#34;queue&#34;,&#xA;            interpreter: &#34;php&#34;,&#xA;            script: &#34;artisan&#34;,&#xA;            exec_mode: &#34;fork&#34;,&#xA;            instances: 4,&#xA;            autorestart: true,&#xA;            cron_restart: &#34;5 * * * *&#34;,&#xA;            max_memory_restart: &#34;50M&#34;,&#xA;            watch: false,&#xA;            args: [&#xA;                &#34;queue:work&#34;,&#xA;                &#34;database&#34;,&#xA;                &#34;--queue=default&#34;,&#xA;                &#34;--tries=3&#34;,&#xA;            ],&#xA;        },&#xA;    ]&#xA;}در آخر هم میتونید با دستور زیر پروژه خود را با داکر اجرا کنید.docker-compose up -d --buildامیدوار مفید واقع شده باشه ?</description><category>Jalal LinuX</category><author>Jalal LinuX</author><pubDate>Fri, 06 Jan 2023 10:33:34 +0330</pubDate></item></channel></rss>