{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "AI自习室 (中文)",
  "home_page_url": "https://aidev.fit/",
  "feed_url": "https://aidev.fit/feed.json",
  "description": "AI自习室 (中文) — developer tutorials, tool comparisons, and guides",
  "language": "zh-CN",
  "items": [
    {
      "id": "https://aidev.fit/en/tech/unit-testing-guide.html",
      "url": "https://aidev.fit/en/tech/unit-testing-guide.html",
      "title": "单元测试入门：从零到写出第一个可维护的测试",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "零基础单元测试入门教程，覆盖 Python/pytest 实战，AAA 模式、Mock、Fixture 核心概念一网打尽。",
      "date_published": "2026-05-20",
      "date_modified": "2026-05-20",
      "tags": [
        "单元测试",
        "Python",
        "测试"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/regex-guide.html",
      "url": "https://aidev.fit/en/tech/regex-guide.html",
      "title": "正则表达式 30 分钟入门指南",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "从完全不懂到能写出实用的正则表达式，涵盖元字符、量词、分组、断言和 Python/JS 实战示例。",
      "date_published": "2026-05-20",
      "date_modified": "2026-05-20",
      "tags": [
        "正则表达式",
        "编程",
        "教程"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/python-tutorial.html",
      "url": "https://aidev.fit/en/tech/python-tutorial.html",
      "title": "Python 入门教程：从零到写出第一个程序",
      "content_text": "Python Tutorial: From Zero to Your First Program Python is the most approachable programming language in the world — and also one of the most powerful. In this tutorial, you'll go from zero to a working program in 30 minutes. Installing Python Download from python.org . During installation on Windows, check \"Add Python to PATH\" . On macOS, brew install python works too. Verify with: python3 --version # should print &quot;Python 3.x.x&quot; Your First Program print(&quot;Hello, world!&quot;) Save as hello.py and run with python3 hello.py . That's it — you're a programmer now. Variables and Types name = &quot;Alice&quot; # string age = 30 # integer height = 1.68 # float is_student = False # boolean print(f&quot;{name} is {age} years old&quot;) # f-strings! Conditionals score = 85 if score &gt;= 90 : print ( &quot;A&quot; ) elif score &gt;= 80 : print ( &quot;B&quot; ) elif score &gt;= 70 : print ( &quot;C&quot; ) else : print ( &quot;Need improvement&quot; ) Lists and Loops fruits = [&quot;apple&quot;, &quot;banana&quot;, &quot;cherry&quot;] fruits.append(&quot;date&quot;) print(fruits[0]) # &quot;apple&quot; for fruit in fruits: print(fruit.upper()) # List comprehension (Python&#39;s superpower) squares = [x**2 for x in range(10)] # → [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] Dictionaries user = { &quot;name&quot; : &quot;Alice&quot; , &quot;email&quot; : &quot;alice@example.com&quot; , &quot;age&quot; : 30 } print ( user [ &quot;name&quot; ]) user [ &quot;city&quot; ] = &quot;New York&quot; # add a key for key , value in user . items (): print ( f &quot;{key}: {value}&quot; ) Functions def greet ( name , greeting = &quot;Hello&quot; ) : return f &quot;{greeting}, {name}!&quot; print ( greet ( &quot;Alice&quot; )) # &quot;Hello, Alice!&quot; print ( greet ( &quot;Bob&quot; , &quot;Howdy&quot; )) # &quot;Howdy, Bob!&quot; Working with Files # Read a file with open(&quot;data.txt&quot;, &quot;r&quot;) as f: content = f.read() # Write a file with open(&quot;output.txt&quot;, &quot;w&quot;) as f: f.write(&quot;Hello, file!&quot;) Error Handling try: result = 10 / 0 except ZeroDivisionError: print(&quot;Can&#39;t divide by zero!&quot;) finally: print(&quot;This always runs&quot;) A Complete Mini-Program import json def load_todos (): try : with open ( &quot;todos.json&quot; ) as f : return json . load ( f ) except FileNotFoundError : return [] def save_todos ( todos ): with open ( &quot;todos.json&quot; , &quot;w&quot; ) as f : json . dump ( todos , f , indent = 2 ) def main (): todos = load_todos () while True : cmd = input ( &quot;add/show/quit: &quot; ) . lower () if cmd == &quot;add&quot; : todos . append ( input ( &quot;Task: &quot; )) save_todos ( todos ) elif cmd == &quot;show&quot; : for i , t in enumerate ( todos , 1 ): print ( f &quot; { i } . { t } &quot; ) elif cmd == &quot;quit&quot; : break main () Where to Go Next Automate the Boring Stuff — free Python book, perfect for practical learners Real Python — excellent tutorials from beginner to advanced Build something — a CLI tool, a simple web scraper, a TODO app. Anything. The secret to learning Python: start building things immediately. Don't get stuck in tutorial hell. See also: Nginx Configuration Guide , Terraform Infrastructure as Code , API Gateway Implementation Guide",
      "content_html": "<h1>Python Tutorial: From Zero to Your First Program</h1>\n<p>Python is the most approachable programming language in the world — and also one of the most powerful. In this tutorial, you'll go from zero to a working program in 30 minutes.</p>\n<h2>Installing Python</h2>\n<p>Download from <a href=\"https://www.python.org/downloads/\">python.org</a>. During installation on Windows, check <strong>\"Add Python to PATH\"</strong>. On macOS, <code>brew install python</code> works too. Verify with:</p>\n<div class=\"codehilite\"><pre><span></span><code>python3 --version  # should print &quot;Python 3.x.x&quot;\n</code></pre></div>\n\n<h2>Your First Program</h2>\n<div class=\"codehilite\"><pre><span></span><code>print(&quot;Hello, world!&quot;)\n</code></pre></div>\n\n<p>Save as <code>hello.py</code> and run with <code>python3 hello.py</code>. That's it — you're a programmer now.</p>\n<h2>Variables and Types</h2>\n<div class=\"codehilite\"><pre><span></span><code>name = &quot;Alice&quot;           # string\nage = 30                 # integer\nheight = 1.68            # float\nis_student = False       # boolean\n\nprint(f&quot;{name} is {age} years old&quot;)  # f-strings!\n</code></pre></div>\n\n<h2>Conditionals</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">score</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mi\">85</span>\n<span class=\"k\">if</span><span class=\"w\"> </span><span class=\"nv\">score</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"mi\">90</span>:\n<span class=\"w\">    </span><span class=\"nv\">print</span><span class=\"ss\">(</span><span class=\"s2\">&quot;A&quot;</span><span class=\"ss\">)</span>\n<span class=\"nv\">elif</span><span class=\"w\"> </span><span class=\"nv\">score</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"mi\">80</span>:\n<span class=\"w\">    </span><span class=\"nv\">print</span><span class=\"ss\">(</span><span class=\"s2\">&quot;B&quot;</span><span class=\"ss\">)</span>\n<span class=\"nv\">elif</span><span class=\"w\"> </span><span class=\"nv\">score</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"mi\">70</span>:\n<span class=\"w\">    </span><span class=\"nv\">print</span><span class=\"ss\">(</span><span class=\"s2\">&quot;C&quot;</span><span class=\"ss\">)</span>\n<span class=\"k\">else</span>:\n<span class=\"w\">    </span><span class=\"nv\">print</span><span class=\"ss\">(</span><span class=\"s2\">&quot;Need improvement&quot;</span><span class=\"ss\">)</span>\n</code></pre></div>\n\n<h2>Lists and Loops</h2>\n<div class=\"codehilite\"><pre><span></span><code>fruits = [&quot;apple&quot;, &quot;banana&quot;, &quot;cherry&quot;]\nfruits.append(&quot;date&quot;)\nprint(fruits[0])          # &quot;apple&quot;\n\nfor fruit in fruits:\n    print(fruit.upper())\n\n<span class=\"gh\">#</span> List comprehension (Python&#39;s superpower)\nsquares = [x**2 for x in range(10)]\n<span class=\"gh\">#</span> → [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n</code></pre></div>\n\n<h2>Dictionaries</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"ss\">user</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;Alice&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;email&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;alice@example.com&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;age&quot;</span><span class=\"p\">:</span> <span class=\"mi\">30</span>\n<span class=\"p\">}</span>\nprint<span class=\"p\">(</span>user<span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">])</span>\nuser<span class=\"p\">[</span><span class=\"s2\">&quot;city&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;New York&quot;</span>  <span class=\"c1\"># add a key</span>\n\nfor key<span class=\"p\">,</span> value <span class=\"k\">in</span> user<span class=\"o\">.</span>items<span class=\"p\">():</span>\n    print<span class=\"p\">(</span>f<span class=\"s2\">&quot;{key}: {value}&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h2>Functions</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">def</span><span class=\"w\"> </span><span class=\"nv\">greet</span><span class=\"ss\">(</span><span class=\"nv\">name</span>,<span class=\"w\"> </span><span class=\"nv\">greeting</span><span class=\"o\">=</span><span class=\"s2\">&quot;Hello&quot;</span><span class=\"ss\">)</span>:\n<span class=\"w\">    </span><span class=\"k\">return</span><span class=\"w\"> </span><span class=\"nv\">f</span><span class=\"s2\">&quot;{greeting}, {name}!&quot;</span>\n\n<span class=\"nv\">print</span><span class=\"ss\">(</span><span class=\"nv\">greet</span><span class=\"ss\">(</span><span class=\"s2\">&quot;Alice&quot;</span><span class=\"ss\">))</span><span class=\"w\">               </span>#<span class=\"w\"> </span><span class=\"s2\">&quot;Hello, Alice!&quot;</span>\n<span class=\"nv\">print</span><span class=\"ss\">(</span><span class=\"nv\">greet</span><span class=\"ss\">(</span><span class=\"s2\">&quot;Bob&quot;</span>,<span class=\"w\"> </span><span class=\"s2\">&quot;Howdy&quot;</span><span class=\"ss\">))</span><span class=\"w\">        </span>#<span class=\"w\"> </span><span class=\"s2\">&quot;Howdy, Bob!&quot;</span>\n</code></pre></div>\n\n<h2>Working with Files</h2>\n<div class=\"codehilite\"><pre><span></span><code># Read a file\nwith open(&quot;data.txt&quot;, &quot;r&quot;) as f:\n    content = f.read()\n\n# Write a file\nwith open(&quot;output.txt&quot;, &quot;w&quot;) as f:\n    f.write(&quot;Hello, file!&quot;)\n</code></pre></div>\n\n<h2>Error Handling</h2>\n<div class=\"codehilite\"><pre><span></span><code>try:\n    result = 10 / 0\nexcept ZeroDivisionError:\n    print(&quot;Can&#39;t divide by zero!&quot;)\nfinally:\n    print(&quot;This always runs&quot;)\n</code></pre></div>\n\n<h2>A Complete Mini-Program</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">json</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">load_todos</span><span class=\"p\">():</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;todos.json&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">f</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">json</span><span class=\"o\">.</span><span class=\"n\">load</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span>\n    <span class=\"k\">except</span> <span class=\"ne\">FileNotFoundError</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"p\">[]</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">save_todos</span><span class=\"p\">(</span><span class=\"n\">todos</span><span class=\"p\">):</span>\n    <span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;todos.json&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;w&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">f</span><span class=\"p\">:</span>\n        <span class=\"n\">json</span><span class=\"o\">.</span><span class=\"n\">dump</span><span class=\"p\">(</span><span class=\"n\">todos</span><span class=\"p\">,</span> <span class=\"n\">f</span><span class=\"p\">,</span> <span class=\"n\">indent</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">main</span><span class=\"p\">():</span>\n    <span class=\"n\">todos</span> <span class=\"o\">=</span> <span class=\"n\">load_todos</span><span class=\"p\">()</span>\n    <span class=\"k\">while</span> <span class=\"kc\">True</span><span class=\"p\">:</span>\n        <span class=\"n\">cmd</span> <span class=\"o\">=</span> <span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s2\">&quot;add/show/quit: &quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">()</span>\n        <span class=\"k\">if</span> <span class=\"n\">cmd</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;add&quot;</span><span class=\"p\">:</span>\n            <span class=\"n\">todos</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"nb\">input</span><span class=\"p\">(</span><span class=\"s2\">&quot;Task: &quot;</span><span class=\"p\">))</span>\n            <span class=\"n\">save_todos</span><span class=\"p\">(</span><span class=\"n\">todos</span><span class=\"p\">)</span>\n        <span class=\"k\">elif</span> <span class=\"n\">cmd</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;show&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">for</span> <span class=\"n\">i</span><span class=\"p\">,</span> <span class=\"n\">t</span> <span class=\"ow\">in</span> <span class=\"nb\">enumerate</span><span class=\"p\">(</span><span class=\"n\">todos</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">):</span>\n                <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"sa\">f</span><span class=\"s2\">&quot;</span><span class=\"si\">{</span><span class=\"n\">i</span><span class=\"si\">}</span><span class=\"s2\">. </span><span class=\"si\">{</span><span class=\"n\">t</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">elif</span> <span class=\"n\">cmd</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;quit&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">break</span>\n\n<span class=\"n\">main</span><span class=\"p\">()</span>\n</code></pre></div>\n\n<h2>Where to Go Next</h2>\n<ul>\n<li><strong>Automate the Boring Stuff</strong> — free Python book, perfect for practical learners</li>\n<li><strong>Real Python</strong> — excellent tutorials from beginner to advanced</li>\n<li><strong>Build something</strong> — a CLI tool, a simple web scraper, a TODO app. Anything.</li>\n</ul>\n<p>The secret to learning Python: start building things immediately. Don't get stuck in tutorial hell.</p>\n<p><strong>See also:</strong> <a href=\"/en/tech/nginx-configuration-guide.html\">Nginx Configuration Guide</a>, <a href=\"/en/tech/terraform-infrastructure-code.html\">Terraform Infrastructure as Code</a>, <a href=\"/en/tech/api-gateway-implementation.html\">API Gateway Implementation Guide</a></p>",
      "summary": "零基础 Python 编程入门，30 分钟掌握变量、条件、循环、函数等核心语法，手写第一个可运行程序。",
      "date_published": "2026-05-20",
      "date_modified": "2026-05-20",
      "tags": [
        "Python",
        "编程入门",
        "教程"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/web-security-basics.html",
      "url": "https://aidev.fit/en/tech/web-security-basics.html",
      "title": "Web 安全入门：每个开发者都应知道的 10 个安全实践",
      "content_text": "Web Security Basics: CORS, CSP, XSS, CSRF — What Every Developer Must Know Security isn't optional — it's part of your job as a developer. Most breaches exploit well-known vulnerabilities that have been understood for years. Here are the five web security threats every developer must understand, with prevention strategies and code examples. The Threat Landscape Attack Severity OWASP Rank What It Does XSS (Cross-Site Scripting) Critical #2 Injects malicious scripts into your pages SQL Injection Critical #3 Executes arbitrary SQL on your database CSRF (Cross-Site Request Forgery) High Dropped Tricks users into performing unwanted actions CORS Misconfiguration High #5 Allows unauthorized cross-origin access Insecure Authentication Critical #1 Weak auth allows account takeover 1. Cross-Site Scripting (XSS) XSS happens when user input is rendered as HTML without sanitization. An attacker who can inject tags can steal cookies, session tokens, and sensitive data. // ❌ Vulnerable : div . innerHTML = userComment ; // Attacker : &lt; img src = x onerror = &quot;stealCookies()&quot; &gt; // ✅ Safe : div . textContent = userComment ; // Escapes HTML automatically // Or sanitize : import DOMPurify from &#39;dompurify&#39; ; div . innerHTML = DOMPurify . sanitize ( userComment ); React note: JSX auto-escapes by default — you're safe from XSS in standard rendering. The danger is dangerouslySetInnerHTML and direct DOM manipulation. 2. SQL Injection Concatenating user input into SQL queries gives attackers full database access. Parameterized queries are the fix — use them 100% of the time. // ❌ Vulnerable — attacker input : &quot;1; DROP TABLE users;&quot; const query = ` SELECT * FROM users WHERE id = ${ userId }` ; // ✅ Safe — parameterized query const query = &quot;SELECT * FROM users WHERE id = $1&quot; ; const result = await db . query ( query , [ userId ] ); // ORM users : Prisma / Drizzle parameterize automatically 3. Cross-Site Request Forgery (CSRF) An attacker's site makes a request to your API using the victim's cookies. CSRF tokens ensure the request originated from your own frontend. // Mitigation strategies: // 1. SameSite cookies (simplest, best): Set - Cookie : session = abc123 ; SameSite = Strict ; HttpOnly ; Secure // 2. CSRF token (additional layer): // Server sends a unique token; client includes it in requests // Modern frameworks (Next.js, Remix) handle this automatically // 3. Custom header requirement: // Browsers don&#39;t allow custom headers cross-origin // Require X-Requested-With or similar 4. CORS Misconfiguration CORS (Cross-Origin Resource Sharing) controls which origins can access your API. The most common mistake: using a wildcard or reflecting the Origin header blindly. // ❌ Vulnerable — allows any origin : Access - Control - Allow - Origin : * Access - Control - Allow - Credentials : true // Can &#39;t use with * // ❌ Vulnerable — reflects origin blindly : // If your server echoes back the request &#39;s Origin header, any domain can access // ✅ Safe — explicit allowlist : const allowedOrigins = [ &quot;https://myapp.com&quot; , &quot;https://admin.myapp.com&quot; ]; const origin = req . headers . origin ; if ( allowedOrigins . includes ( origin )) { res . setHeader ( &quot;Access-Control-Allow-Origin&quot; , origin ); } 5. Content Security Policy (CSP) CSP is your last line of defense. It tells the browser what sources of scripts, styles, and other resources are allowed. A well-configured CSP makes XSS exploitation nearly impossible. // Recommended CSP header: Content - Security - Policy : default - src &#39;self&#39; ; script - src &#39;self&#39; &#39;unsafe-inline&#39; &#39;unsafe-eval&#39; https : //js.stripe.com; style - src &#39;self&#39; &#39;unsafe-inline&#39; ; img - src &#39;self&#39; data : https :; font - src &#39;self&#39; ; connect - src &#39;self&#39; https : //api.myapp.com; frame - src https : //js.stripe.com; // NO &#39;unsafe-inline&#39; for scripts in production (use nonce/hash) Security Checklist Authentication: Use OAuth 2.0 / OIDC. Never roll your own crypto. Passwords: bcrypt with cost factor 12+. Never store plaintext. HTTPS: Everywhere. Redirect HTTP. HSTS header. Dependencies: npm audit / snyk weekly. Auto-update minor patches. Environment variables: Never commit .env files. Inject at runtime. Rate limiting: Protect login and API endpoints from brute force. Logging: Log auth events. Never log passwords or tokens. Bottom line: Use parameterized queries, auto-escaping frameworks, SameSite cookies, CSP headers, and explicit CORS allowlists. Security is layers — implement them all, and a single failure won't compromise you. See also: REST API Best Practices and API Design Patterns . See also: API Design Patterns: Rate Limiting, Pagination, Idempotency, and More , Caching Strategies for Web Apps: CDN, Redis, Browser, and API Caching , WebSocket vs SSE vs Polling: Real-Time Data Patterns for Web Apps",
      "content_html": "<h1>Web Security Basics: CORS, CSP, XSS, CSRF — What Every Developer Must Know</h1>\n<p>Security isn't optional — it's part of your job as a developer. Most breaches exploit well-known vulnerabilities that have been understood for years. Here are the five web security threats every developer must understand, with prevention strategies and code examples.</p>\n<h2>The Threat Landscape</h2>\n<table>\n<thead>\n<tr>\n<th>Attack</th>\n<th>Severity</th>\n<th>OWASP Rank</th>\n<th>What It Does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>XSS (Cross-Site Scripting)</td>\n<td>Critical</td>\n<td>#2</td>\n<td>Injects malicious scripts into your pages</td>\n</tr>\n<tr>\n<td>SQL Injection</td>\n<td>Critical</td>\n<td>#3</td>\n<td>Executes arbitrary SQL on your database</td>\n</tr>\n<tr>\n<td>CSRF (Cross-Site Request Forgery)</td>\n<td>High</td>\n<td>Dropped</td>\n<td>Tricks users into performing unwanted actions</td>\n</tr>\n<tr>\n<td>CORS Misconfiguration</td>\n<td>High</td>\n<td>#5</td>\n<td>Allows unauthorized cross-origin access</td>\n</tr>\n<tr>\n<td>Insecure Authentication</td>\n<td>Critical</td>\n<td>#1</td>\n<td>Weak auth allows account takeover</td>\n</tr>\n</tbody>\n</table>\n<h2>1. Cross-Site Scripting (XSS)</h2>\n<p>XSS happens when user input is rendered as HTML without sanitization. An attacker who can inject <script> tags can steal cookies, session tokens, and sensitive data.</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">//</span> <span class=\"err\">❌</span> <span class=\"n\">Vulnerable</span><span class=\"p\">:</span>\n<span class=\"n\">div</span><span class=\"o\">.</span><span class=\"n\">innerHTML</span> <span class=\"o\">=</span> <span class=\"n\">userComment</span><span class=\"p\">;</span>  <span class=\"o\">//</span> <span class=\"n\">Attacker</span><span class=\"p\">:</span> <span class=\"o\">&lt;</span><span class=\"n\">img</span> <span class=\"n\">src</span><span class=\"o\">=</span><span class=\"n\">x</span> <span class=\"n\">onerror</span><span class=\"o\">=</span><span class=\"s2\">&quot;stealCookies()&quot;</span><span class=\"o\">&gt;</span>\n\n<span class=\"o\">//</span> <span class=\"err\">✅</span> <span class=\"n\">Safe</span><span class=\"p\">:</span>\n<span class=\"n\">div</span><span class=\"o\">.</span><span class=\"n\">textContent</span> <span class=\"o\">=</span> <span class=\"n\">userComment</span><span class=\"p\">;</span>      <span class=\"o\">//</span> <span class=\"n\">Escapes</span> <span class=\"n\">HTML</span> <span class=\"n\">automatically</span>\n<span class=\"o\">//</span> <span class=\"n\">Or</span> <span class=\"n\">sanitize</span><span class=\"p\">:</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">DOMPurify</span> <span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"s1\">&#39;dompurify&#39;</span><span class=\"p\">;</span>\n<span class=\"n\">div</span><span class=\"o\">.</span><span class=\"n\">innerHTML</span> <span class=\"o\">=</span> <span class=\"n\">DOMPurify</span><span class=\"o\">.</span><span class=\"n\">sanitize</span><span class=\"p\">(</span><span class=\"n\">userComment</span><span class=\"p\">);</span>\n</code></pre></div>\n\n<p><strong>React note:</strong> JSX auto-escapes by default — you're safe from XSS in standard rendering. The danger is dangerouslySetInnerHTML and direct DOM manipulation.</p>\n<h2>2. SQL Injection</h2>\n<p>Concatenating user input into SQL queries gives attackers full database access. Parameterized queries are the fix — use them 100% of the time.</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"err\">❌</span><span class=\"w\"> </span><span class=\"n\">Vulnerable</span><span class=\"w\"> </span><span class=\"err\">—</span><span class=\"w\"> </span><span class=\"n\">attacker</span><span class=\"w\"> </span><span class=\"k\">input</span><span class=\"err\">:</span><span class=\"w\"> </span><span class=\"ss\">&quot;1; DROP TABLE users;&quot;</span>\n<span class=\"n\">const</span><span class=\"w\"> </span><span class=\"n\">query</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"err\">`</span><span class=\"k\">SELECT</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"k\">FROM</span><span class=\"w\"> </span><span class=\"n\">users</span><span class=\"w\"> </span><span class=\"k\">WHERE</span><span class=\"w\"> </span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"err\">${</span><span class=\"n\">userId</span><span class=\"err\">}`</span><span class=\"p\">;</span>\n\n<span class=\"o\">//</span><span class=\"w\"> </span><span class=\"err\">✅</span><span class=\"w\"> </span><span class=\"n\">Safe</span><span class=\"w\"> </span><span class=\"err\">—</span><span class=\"w\"> </span><span class=\"n\">parameterized</span><span class=\"w\"> </span><span class=\"n\">query</span>\n<span class=\"n\">const</span><span class=\"w\"> </span><span class=\"n\">query</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"ss\">&quot;SELECT * FROM users WHERE id = $1&quot;</span><span class=\"p\">;</span>\n<span class=\"n\">const</span><span class=\"w\"> </span><span class=\"k\">result</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">await</span><span class=\"w\"> </span><span class=\"n\">db</span><span class=\"p\">.</span><span class=\"n\">query</span><span class=\"p\">(</span><span class=\"n\">query</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">userId</span><span class=\"o\">]</span><span class=\"p\">);</span>\n<span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">ORM</span><span class=\"w\"> </span><span class=\"nl\">users</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">Prisma</span><span class=\"o\">/</span><span class=\"n\">Drizzle</span><span class=\"w\"> </span><span class=\"n\">parameterize</span><span class=\"w\"> </span><span class=\"n\">automatically</span>\n</code></pre></div>\n\n<h2>3. Cross-Site Request Forgery (CSRF)</h2>\n<p>An attacker's site makes a request to your API using the victim's cookies. CSRF tokens ensure the request originated from your own frontend.</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\">// Mitigation strategies:</span>\n<span class=\"c1\">// 1. SameSite cookies (simplest, best):</span>\n<span class=\"nx\">Set</span><span class=\"o\">-</span><span class=\"nx\">Cookie</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"nx\">session</span><span class=\"p\">=</span><span class=\"nx\">abc123</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"nx\">SameSite</span><span class=\"p\">=</span><span class=\"nx\">Strict</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"nx\">HttpOnly</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"nx\">Secure</span>\n\n<span class=\"c1\">// 2. CSRF token (additional layer):</span>\n<span class=\"c1\">// Server sends a unique token; client includes it in requests</span>\n<span class=\"c1\">// Modern frameworks (Next.js, Remix) handle this automatically</span>\n\n<span class=\"c1\">// 3. Custom header requirement:</span>\n<span class=\"c1\">// Browsers don&#39;t allow custom headers cross-origin</span>\n<span class=\"c1\">// Require X-Requested-With or similar</span>\n</code></pre></div>\n\n<h2>4. CORS Misconfiguration</h2>\n<p>CORS (Cross-Origin Resource Sharing) controls which origins can access your API. The most common mistake: using a wildcard or reflecting the Origin header blindly.</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"err\">❌</span><span class=\"w\"> </span><span class=\"n\">Vulnerable</span><span class=\"w\"> </span><span class=\"err\">—</span><span class=\"w\"> </span><span class=\"n\">allows</span><span class=\"w\"> </span><span class=\"n\">any</span><span class=\"w\"> </span><span class=\"n\">origin</span><span class=\"p\">:</span>\n<span class=\"n\">Access</span><span class=\"o\">-</span><span class=\"n\">Control</span><span class=\"o\">-</span><span class=\"n\">Allow</span><span class=\"o\">-</span><span class=\"n\">Origin</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"o\">*</span>\n<span class=\"n\">Access</span><span class=\"o\">-</span><span class=\"n\">Control</span><span class=\"o\">-</span><span class=\"n\">Allow</span><span class=\"o\">-</span><span class=\"n\">Credentials</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"bp\">true</span><span class=\"w\">  </span><span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">Can</span><span class=\"s1\">&#39;t use with *</span>\n\n<span class=\"o\">//</span><span class=\"w\"> </span><span class=\"err\">❌</span><span class=\"w\"> </span><span class=\"n\">Vulnerable</span><span class=\"w\"> </span><span class=\"err\">—</span><span class=\"w\"> </span><span class=\"n\">reflects</span><span class=\"w\"> </span><span class=\"n\">origin</span><span class=\"w\"> </span><span class=\"n\">blindly</span><span class=\"p\">:</span>\n<span class=\"o\">//</span><span class=\"w\"> </span><span class=\"n\">If</span><span class=\"w\"> </span><span class=\"n\">your</span><span class=\"w\"> </span><span class=\"n\">server</span><span class=\"w\"> </span><span class=\"n\">echoes</span><span class=\"w\"> </span><span class=\"n\">back</span><span class=\"w\"> </span><span class=\"n\">the</span><span class=\"w\"> </span><span class=\"n\">request</span><span class=\"s1\">&#39;s Origin header, any domain can access</span>\n\n<span class=\"o\">//</span><span class=\"w\"> </span><span class=\"err\">✅</span><span class=\"w\"> </span><span class=\"n\">Safe</span><span class=\"w\"> </span><span class=\"err\">—</span><span class=\"w\"> </span><span class=\"n\">explicit</span><span class=\"w\"> </span><span class=\"n\">allowlist</span><span class=\"p\">:</span>\n<span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">allowedOrigins</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"s2\">&quot;https://myapp.com&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">&quot;https://admin.myapp.com&quot;</span><span class=\"p\">];</span>\n<span class=\"k\">const</span><span class=\"w\"> </span><span class=\"n\">origin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">req</span><span class=\"o\">.</span><span class=\"n\">headers</span><span class=\"o\">.</span><span class=\"n\">origin</span><span class=\"p\">;</span>\n<span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">allowedOrigins</span><span class=\"o\">.</span><span class=\"n\">includes</span><span class=\"p\">(</span><span class=\"n\">origin</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">  </span><span class=\"n\">res</span><span class=\"o\">.</span><span class=\"n\">setHeader</span><span class=\"p\">(</span><span class=\"s2\">&quot;Access-Control-Allow-Origin&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">origin</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n\n<h2>5. Content Security Policy (CSP)</h2>\n<p>CSP is your last line of defense. It tells the browser what sources of scripts, styles, and other resources are allowed. A well-configured CSP makes XSS exploitation nearly impossible.</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\">// Recommended CSP header:</span>\n<span class=\"n\">Content</span><span class=\"o\">-</span><span class=\"n\">Security</span><span class=\"o\">-</span><span class=\"n\">Policy</span><span class=\"p\">:</span>\n<span class=\"w\">  </span><span class=\"n\">default</span><span class=\"o\">-</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"s\">&#39;self&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">  </span><span class=\"n\">script</span><span class=\"o\">-</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"s\">&#39;self&#39;</span><span class=\"w\"> </span><span class=\"s\">&#39;unsafe-inline&#39;</span><span class=\"w\"> </span><span class=\"s\">&#39;unsafe-eval&#39;</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"p\">:</span><span class=\"c1\">//js.stripe.com;</span>\n<span class=\"w\">  </span><span class=\"n\">style</span><span class=\"o\">-</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"s\">&#39;self&#39;</span><span class=\"w\"> </span><span class=\"s\">&#39;unsafe-inline&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">  </span><span class=\"n\">img</span><span class=\"o\">-</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"s\">&#39;self&#39;</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"p\">:;</span>\n<span class=\"w\">  </span><span class=\"n\">font</span><span class=\"o\">-</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"s\">&#39;self&#39;</span><span class=\"p\">;</span>\n<span class=\"w\">  </span><span class=\"n\">connect</span><span class=\"o\">-</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"s\">&#39;self&#39;</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"p\">:</span><span class=\"c1\">//api.myapp.com;</span>\n<span class=\"w\">  </span><span class=\"n\">frame</span><span class=\"o\">-</span><span class=\"n\">src</span><span class=\"w\"> </span><span class=\"n\">https</span><span class=\"p\">:</span><span class=\"c1\">//js.stripe.com;</span>\n<span class=\"w\">  </span><span class=\"c1\">// NO &#39;unsafe-inline&#39; for scripts in production (use nonce/hash)</span>\n</code></pre></div>\n\n<h2>Security Checklist</h2>\n<ul>\n<li><strong>Authentication:</strong> Use OAuth 2.0 / OIDC. Never roll your own crypto.</li>\n<li><strong>Passwords:</strong> bcrypt with cost factor 12+. Never store plaintext.</li>\n<li><strong>HTTPS:</strong> Everywhere. Redirect HTTP. HSTS header.</li>\n<li><strong>Dependencies:</strong> npm audit / snyk weekly. Auto-update minor patches.</li>\n<li><strong>Environment variables:</strong> Never commit .env files. Inject at runtime.</li>\n<li><strong>Rate limiting:</strong> Protect login and API endpoints from brute force.</li>\n<li><strong>Logging:</strong> Log auth events. Never log passwords or tokens.</li>\n</ul>\n<p><strong>Bottom line:</strong> Use parameterized queries, auto-escaping frameworks, SameSite cookies, CSP headers, and explicit CORS allowlists. Security is layers — implement them all, and a single failure won't compromise you. See also: <a href=\"/en/tech/rest-api-best-practices.html\">REST API Best Practices</a> and <a href=\"/en/tech/api-design-patterns.html\">API Design Patterns</a>.</p>\n<p><strong>See also:</strong> <a href=\"/en/tech/api-design-patterns.html\">API Design Patterns: Rate Limiting, Pagination, Idempotency, and More</a>, <a href=\"/en/tech/caching-strategies-web-apps.html\">Caching Strategies for Web Apps: CDN, Redis, Browser, and API Caching</a>, <a href=\"/en/tech/websocket-vs-sse-vs-polling.html\">WebSocket vs SSE vs Polling: Real-Time Data Patterns for Web Apps</a></p>",
      "summary": "XSS、CSRF、SQL 注入、HTTPS、CORS……这些不是运维的事。本文用通俗语言讲解 10 个每个 Web 开发者都必须掌握的安全实践，附代码示例和检查清单。",
      "date_published": "2026-05-20",
      "date_modified": "2026-05-20",
      "tags": [
        "Web安全",
        "XSS",
        "CSRF",
        "HTTPS",
        "教程"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/indie-dev-guide.html",
      "url": "https://aidev.fit/en/sidehustle/indie-dev-guide.html",
      "title": "独立开发者出海指南：从产品 Idea 到稳定变现",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "面向程序员的独立开发者完整指南：产品创意验证、技术选型、海外支付接入、推广引流和变现策略。",
      "date_published": "2026-05-20",
      "date_modified": "2026-05-20",
      "tags": [
        "独立开发者",
        "出海",
        "变现"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/remote-work.html",
      "url": "https://aidev.fit/en/sidehustle/remote-work.html",
      "title": "远程工作平台大盘点",
      "content_text": "Best Remote Work Platforms: Upwork, Toptal, and Beyond Remote work isn't the future anymore — it's the present. But finding quality remote opportunities requires knowing where to look. Here's a curated guide to the platforms that actually deliver. General Freelance Platforms Platform Best For Fee Notes Upwork General freelancing 10% Largest marketplace. Can be a race to the bottom if you compete on price. Build a strong profile and niche down. Fiverr Defined services (gigs) 20% You define packages at fixed prices. Works well for design, writing, and quick coding tasks. Less back-and-forth than Upwork. Toptal Elite developers Varies Claims to accept top 3%. Rigorous screening process, but the rates reflect it. If you pass, you'll work with serious clients. Freelancer Contest-based work 10%+ Similar to Upwork but with a contest system. Good for design portfolios. Developer-Specific Platforms Platform Best For Model Gun.io Senior devs, US-based Vetted, direct hire focus Arc.dev Remote dev jobs Apply once, companies reach out Hired.com Tech salaries &gt; $100K Reverse marketplace — companies apply to you Remote-First Job Boards Site Focus Frequency We Work Remotely All remote roles 100+ new listings/week Remote OK Tech-heavy remote jobs Aggregated, high volume Remotive Curated remote jobs Hand-picked, quality over quantity JS Remotely JavaScript/TypeScript only Niche but focused Niche Platforms YunoJuno — UK/EU creative and tech freelancers. Good rates, less competition than US platforms. CodeMentor — Get paid to do code reviews and mentoring. Lower volume but high hourly rates. Working Nomads — Curated remote job newsletter. Subscribe and get filtered jobs in your inbox. How to Stand Out Specialize, don't generalize. \"Full-stack developer\" is a commodity. \"React developer specializing in real-time dashboards\" gets hired at 3x the rate. Build a portfolio piece, not a portfolio. One impressive project with a live demo and a case study beats ten todo apps. Start with smaller projects. Get 3-4 five-star reviews on Upwork before going after larger contracts. Social proof compounds. Don't compete on price. Clients who pay the least are the most demanding. Set your rate at a level that filters out bad clients. See also: No-Code and Low-Code Business Opportunities , Developer Affiliate Income , Email Marketing for Developers",
      "content_html": "<h1>Best Remote Work Platforms: Upwork, Toptal, and Beyond</h1>\n<p>Remote work isn't the future anymore — it's the present. But finding quality remote opportunities requires knowing where to look. Here's a curated guide to the platforms that actually deliver.</p>\n<h2>General Freelance Platforms</h2>\n<table>\n<thead>\n<tr>\n<th>Platform</th>\n<th>Best For</th>\n<th>Fee</th>\n<th>Notes</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Upwork</strong></td>\n<td>General freelancing</td>\n<td>10%</td>\n<td>Largest marketplace. Can be a race to the bottom if you compete on price. Build a strong profile and niche down.</td>\n</tr>\n<tr>\n<td><strong>Fiverr</strong></td>\n<td>Defined services (gigs)</td>\n<td>20%</td>\n<td>You define packages at fixed prices. Works well for design, writing, and quick coding tasks. Less back-and-forth than Upwork.</td>\n</tr>\n<tr>\n<td><strong>Toptal</strong></td>\n<td>Elite developers</td>\n<td>Varies</td>\n<td>Claims to accept top 3%. Rigorous screening process, but the rates reflect it. If you pass, you'll work with serious clients.</td>\n</tr>\n<tr>\n<td><strong>Freelancer</strong></td>\n<td>Contest-based work</td>\n<td>10%+</td>\n<td>Similar to Upwork but with a contest system. Good for design portfolios.</td>\n</tr>\n</tbody>\n</table>\n<h2>Developer-Specific Platforms</h2>\n<table>\n<thead>\n<tr>\n<th>Platform</th>\n<th>Best For</th>\n<th>Model</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Gun.io</strong></td>\n<td>Senior devs, US-based</td>\n<td>Vetted, direct hire focus</td>\n</tr>\n<tr>\n<td><strong>Arc.dev</strong></td>\n<td>Remote dev jobs</td>\n<td>Apply once, companies reach out</td>\n</tr>\n<tr>\n<td><strong>Hired.com</strong></td>\n<td>Tech salaries &gt; $100K</td>\n<td>Reverse marketplace — companies apply to you</td>\n</tr>\n</tbody>\n</table>\n<h2>Remote-First Job Boards</h2>\n<table>\n<thead>\n<tr>\n<th>Site</th>\n<th>Focus</th>\n<th>Frequency</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>We Work Remotely</strong></td>\n<td>All remote roles</td>\n<td>100+ new listings/week</td>\n</tr>\n<tr>\n<td><strong>Remote OK</strong></td>\n<td>Tech-heavy remote jobs</td>\n<td>Aggregated, high volume</td>\n</tr>\n<tr>\n<td><strong>Remotive</strong></td>\n<td>Curated remote jobs</td>\n<td>Hand-picked, quality over quantity</td>\n</tr>\n<tr>\n<td><strong>JS Remotely</strong></td>\n<td>JavaScript/TypeScript only</td>\n<td>Niche but focused</td>\n</tr>\n</tbody>\n</table>\n<h2>Niche Platforms</h2>\n<ul>\n<li><strong>YunoJuno</strong> — UK/EU creative and tech freelancers. Good rates, less competition than US platforms.</li>\n<li><strong>CodeMentor</strong> — Get paid to do code reviews and mentoring. Lower volume but high hourly rates.</li>\n<li><strong>Working Nomads</strong> — Curated remote job newsletter. Subscribe and get filtered jobs in your inbox.</li>\n</ul>\n<h2>How to Stand Out</h2>\n<ol>\n<li><strong>Specialize, don't generalize.</strong> \"Full-stack developer\" is a commodity. \"React developer specializing in real-time dashboards\" gets hired at 3x the rate.</li>\n<li><strong>Build a portfolio piece, not a portfolio.</strong> One impressive project with a live demo and a case study beats ten todo apps.</li>\n<li><strong>Start with smaller projects.</strong> Get 3-4 five-star reviews on Upwork before going after larger contracts. Social proof compounds.</li>\n<li><strong>Don't compete on price.</strong> Clients who pay the least are the most demanding. Set your rate at a level that filters out bad clients.</li>\n</ol>\n<p><strong>See also:</strong> <a href=\"/en/sidehustle/no-code-business.html\">No-Code and Low-Code Business Opportunities</a>, <a href=\"/en/sidehustle/affiliate-income.html\">Developer Affiliate Income</a>, <a href=\"/en/sidehustle/email-marketing.html\">Email Marketing for Developers</a></p>",
      "summary": "盘点国内外主流远程工作平台，包括 Upwork、Toptal、电鸭社区等，自由职业者和数字游民必看。",
      "date_published": "2026-05-20",
      "date_modified": "2026-05-20",
      "tags": [
        "远程工作",
        "自由职业"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/newsletter-monetization-guide.html",
      "url": "https://aidev.fit/en/sidehustle/newsletter-monetization-guide.html",
      "title": "程序员的 Newsletter 副业指南：从 0 到 1000 订阅",
      "content_text": "Developer Newsletter Monetization: From Side Project to Full-Time Income Developer newsletters have become one of the most reliable ways to build internet income. One dedicated writer, a niche topic, and 5K+ engaged subscribers can generate $5K-20K/month. Here's how the best dev newsletters do it — and how you can too. The Developer Newsletter Landscape Newsletter Subscribers Revenue Model Est. Revenue TLDR (Dan Ni) 1.25M+ Sponsorships $5M+/yr Bytes.dev (Ty Magnin) 100K+ Sponsorships $500K+/yr Frontend Focus (Cooper Press) 180K+ Sponsorships $1M+/yr Pragmatic Engineer (Gergely Orosz) 150K+ Paid + sponsors $1M+/yr Solo dev newsletter (niche, 5K subs) 5K Sponsorships $20-60K/yr Step 1: Pick a Platform Platform Cost Best For ConvertKit Free &lt; 1,000 subs Creators, paid newsletters, automations beehiiv Free &lt; 2,500 subs Growth focused, built-in ad network Buttondown $9/mo Minimalist, developer-friendly, API Substack Free (10% cut of paid) Paid newsletters, least technical setup Self-hosted (Ghost) $9-31/mo Maximum control, blog + newsletter Recommendation for developers: Buttondown (minimalist, Markdown, API) or Ghost (full control, blog + newsletter). Step 2: Grow to Your First 1,000 Subscribers Write one genuinely excellent post per week and post it on Dev.to, Hacker News, Reddit, and Twitter/X. Cross-promote with other newsletters in your niche. \"I'll recommend you if you recommend me.\" Create a lead magnet: \"Free cheatsheet: 50 Git commands you'll use daily\" → email gate. Add a CTA to every article you write: \"Enjoyed this? I write a weekly newsletter about [topic]. Join 2,500 developers here.\" Engage in communities: Answer questions on Reddit, Discord, Stack Overflow. Signature links add up. Step 3: Monetize Method When Revenue per 1,000 subs Sponsorships 1,000+ subs $50-200/issue per sponsor Paid tier (extra content) 2,000+ subs (5-10% convert) $500-5,000/mo Job board 5,000+ subs $200-500/posting Digital products (to your list) Any size $500-5,000/product launch Affiliate links Any size $50-500/mo Sponsorship Pricing Formula # Standard formula: Sponsorship Price = (Subscribers × CPM × Placement Factor) / 1000 Example: 5,000 subs × $30 CPM × 1.0 (primary spot) = $150/issue 3 sponsors per issue = $450/issue Weekly = $1,800/month # As you grow: 10,000 subs × $40 CPM × 1.0 = $400/issue 3 sponsors × $400 = $1,200/issue Weekly = $4,800/month Topics That Work General \"web development\" newsletters compete with everyone. Narrower wins: \"TypeScript Tips\" — too narrow? \"Modern TypeScript\" — just right. \"React Weekly\" — too broad. \"Next.js &amp; React Server Components\" — differentiated. \"DevOps\" — saturated. \"Platform Engineering for Startups\" — niche and valuable. Bottom line: Pick a focused developer niche. Write consistently for 6 months before worrying about revenue. Cross-promote with other newsletters. Sponsorships kick in at ~1,000 engaged subscribers. Four sponsors per issue at 10K subs = comfortable full-time income. See also: Technical Writing Income and Selling Digital Products . See also: Mobile App Income in 2026: How Much Can a Solo Developer Really Make? , How to Make Money with Chrome Extensions in 2026: Complete Guide , How to Build and Sell VS Code Extensions: A Developer's Guide to Recurring Revenue",
      "content_html": "<h1>Developer Newsletter Monetization: From Side Project to Full-Time Income</h1>\n<p>Developer newsletters have become one of the most reliable ways to build internet income. One dedicated writer, a niche topic, and 5K+ engaged subscribers can generate $5K-20K/month. Here's how the best dev newsletters do it — and how you can too.</p>\n<h2>The Developer Newsletter Landscape</h2>\n<table>\n<thead>\n<tr>\n<th>Newsletter</th>\n<th>Subscribers</th>\n<th>Revenue Model</th>\n<th>Est. Revenue</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>TLDR (Dan Ni)</td>\n<td>1.25M+</td>\n<td>Sponsorships</td>\n<td>$5M+/yr</td>\n</tr>\n<tr>\n<td>Bytes.dev (Ty Magnin)</td>\n<td>100K+</td>\n<td>Sponsorships</td>\n<td>$500K+/yr</td>\n</tr>\n<tr>\n<td>Frontend Focus (Cooper Press)</td>\n<td>180K+</td>\n<td>Sponsorships</td>\n<td>$1M+/yr</td>\n</tr>\n<tr>\n<td>Pragmatic Engineer (Gergely Orosz)</td>\n<td>150K+</td>\n<td>Paid + sponsors</td>\n<td>$1M+/yr</td>\n</tr>\n<tr>\n<td>Solo dev newsletter (niche, 5K subs)</td>\n<td>5K</td>\n<td>Sponsorships</td>\n<td>$20-60K/yr</td>\n</tr>\n</tbody>\n</table>\n<h2>Step 1: Pick a Platform</h2>\n<table>\n<thead>\n<tr>\n<th>Platform</th>\n<th>Cost</th>\n<th>Best For</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>ConvertKit</strong></td>\n<td>Free &lt; 1,000 subs</td>\n<td>Creators, paid newsletters, automations</td>\n</tr>\n<tr>\n<td><strong>beehiiv</strong></td>\n<td>Free &lt; 2,500 subs</td>\n<td>Growth focused, built-in ad network</td>\n</tr>\n<tr>\n<td><strong>Buttondown</strong></td>\n<td>$9/mo</td>\n<td>Minimalist, developer-friendly, API</td>\n</tr>\n<tr>\n<td><strong>Substack</strong></td>\n<td>Free (10% cut of paid)</td>\n<td>Paid newsletters, least technical setup</td>\n</tr>\n<tr>\n<td><strong>Self-hosted (Ghost)</strong></td>\n<td>$9-31/mo</td>\n<td>Maximum control, blog + newsletter</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Recommendation for developers:</strong> Buttondown (minimalist, Markdown, API) or Ghost (full control, blog + newsletter).</p>\n<h2>Step 2: Grow to Your First 1,000 Subscribers</h2>\n<ol>\n<li><strong>Write one genuinely excellent post per week</strong> and post it on Dev.to, Hacker News, Reddit, and Twitter/X.</li>\n<li><strong>Cross-promote with other newsletters</strong> in your niche. \"I'll recommend you if you recommend me.\"</li>\n<li><strong>Create a lead magnet:</strong> \"Free cheatsheet: 50 Git commands you'll use daily\" → email gate.</li>\n<li><strong>Add a CTA to every article you write:</strong> \"Enjoyed this? I write a weekly newsletter about [topic]. Join 2,500 developers here.\"</li>\n<li><strong>Engage in communities:</strong> Answer questions on Reddit, Discord, Stack Overflow. Signature links add up.</li>\n</ol>\n<h2>Step 3: Monetize</h2>\n<table>\n<thead>\n<tr>\n<th>Method</th>\n<th>When</th>\n<th>Revenue per 1,000 subs</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Sponsorships</strong></td>\n<td>1,000+ subs</td>\n<td>$50-200/issue per sponsor</td>\n</tr>\n<tr>\n<td><strong>Paid tier (extra content)</strong></td>\n<td>2,000+ subs (5-10% convert)</td>\n<td>$500-5,000/mo</td>\n</tr>\n<tr>\n<td><strong>Job board</strong></td>\n<td>5,000+ subs</td>\n<td>$200-500/posting</td>\n</tr>\n<tr>\n<td><strong>Digital products (to your list)</strong></td>\n<td>Any size</td>\n<td>$500-5,000/product launch</td>\n</tr>\n<tr>\n<td><strong>Affiliate links</strong></td>\n<td>Any size</td>\n<td>$50-500/mo</td>\n</tr>\n</tbody>\n</table>\n<h2>Sponsorship Pricing Formula</h2>\n<div class=\"codehilite\"><pre><span></span><code># Standard formula:\nSponsorship Price = (Subscribers × CPM × Placement Factor) / 1000\n\nExample:\n5,000 subs × $30 CPM × 1.0 (primary spot) = $150/issue\n3 sponsors per issue = $450/issue\nWeekly = $1,800/month\n\n# As you grow:\n10,000 subs × $40 CPM × 1.0 = $400/issue\n3 sponsors × $400 = $1,200/issue\nWeekly = $4,800/month\n</code></pre></div>\n\n<h2>Topics That Work</h2>\n<p>General \"web development\" newsletters compete with everyone. Narrower wins:</p>\n<ul>\n<li>\"TypeScript Tips\" — too narrow? \"Modern TypeScript\" — just right.</li>\n<li>\"React Weekly\" — too broad. \"Next.js &amp; React Server Components\" — differentiated.</li>\n<li>\"DevOps\" — saturated. \"Platform Engineering for Startups\" — niche and valuable.</li>\n</ul>\n<p><strong>Bottom line:</strong> Pick a focused developer niche. Write consistently for 6 months before worrying about revenue. Cross-promote with other newsletters. Sponsorships kick in at ~1,000 engaged subscribers. Four sponsors per issue at 10K subs = comfortable full-time income. See also: <a href=\"/en/sidehustle/technical-writing-income.html\">Technical Writing Income</a> and <a href=\"/en/sidehustle/sell-digital-products.html\">Selling Digital Products</a>.</p>\n<p><strong>See also:</strong> <a href=\"/en/sidehustle/build-mobile-app-income.html\">Mobile App Income in 2026: How Much Can a Solo Developer Really Make?</a>, <a href=\"/en/sidehustle/chrome-extension-monetization.html\">How to Make Money with Chrome Extensions in 2026: Complete Guide</a>, <a href=\"/en/sidehustle/sell-vscode-extensions.html\">How to Build and Sell VS Code Extensions: A Developer's Guide to Recurring Revenue</a></p>",
      "summary": "Newsletter 是 2026 年程序员最被低估的副业。本文从选题、平台选择、内容策略到变现模式，手把手教你从零搭建一个能赚钱的邮件通讯。",
      "date_published": "2026-05-20",
      "date_modified": "2026-05-20",
      "tags": [
        "Newsletter",
        "副业",
        "变现",
        "内容创作"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/chatgpt-plus-worth.html",
      "url": "https://aidev.fit/en/ai/chatgpt-plus-worth.html",
      "title": "ChatGPT Plus 值得买吗？免费版 vs Plus vs Pro 深度对比",
      "content_text": "Is ChatGPT Plus Worth It? Free vs Plus vs Pro Compared (2026) $20/month for ChatGPT Plus. $200/month for Pro. Free is free. Which one actually makes sense for you? After testing all three tiers extensively, here's the honest breakdown. The Tiers at a Glance Feature Free Plus ($20/mo) Pro ($200/mo) Model GPT-4o mini (fast) GPT-4o (full), o1 GPT-4o, o1 Pro, unlimited Messages (GPT-4o) ~10/day ~80/3hrs Unlimited DALL·E images 2/day Unlimited Unlimited Web browsing Limited ✅ ✅ File upload Images only All file types All file types Code Interpreter Limited ✅ ✅ Voice conversations Limited ✅ ✅ o1 Pro mode ❌ ❌ ✅ (deep reasoning) Free: Good Enough for Most People If you use ChatGPT casually — a few questions here and there, help drafting an email, summarizing a short article — the free tier is genuinely fine. GPT-4o mini is fast and surprisingly capable for everyday tasks. The main limitation is the ~10 GPT-4o messages per day cap, but you can plan around it. Stay free if: You're a casual user who asks fewer than 10 serious questions a day. Plus: The Sweet Spot For $20/month, you get significantly more: real GPT-4o with web browsing, file uploads, DALL·E image generation, and Code Interpreter for data analysis. If you use ChatGPT as part of your daily workflow — writing code, analyzing spreadsheets, creating content — Plus pays for itself in the first hour of the month. Upgrade to Plus if: You hit the GPT-4o message limit on the free tier more than once a week You need to upload and analyze documents (PDFs, spreadsheets, code) You create images for presentations or social media regularly You use ChatGPT as a coding assistant daily Pro: Only for Power Users $200/month is a serious commitment. The main draws are unlimited access (no message caps, no throttling) and o1 Pro mode — which runs a deeper reasoning process for complex math, science, and coding problems. Unless you're running ChatGPT all day as a core part of your professional workflow, it's hard to justify. Upgrade to Pro if: You're a researcher who needs the deepest reasoning on complex problems You use ChatGPT as your primary coding tool for 6+ hours a day You run a business where ChatGPT usage directly generates revenue My Recommendation Start free. When you find yourself frustrated by limits, upgrade to Plus. If Plus still isn't enough — and you're earning money from the work ChatGPT helps with — consider Pro. The path is: Free → Plus (when limited) → Pro (when Plus is a bottleneck) . Most people will never need Pro. See also: 25 Best AI Tools for Developers in 2026: Code, Debug, Deploy , Open Source LLMs Compared 2026: Llama 3 vs Mistral vs Qwen vs Gemma , Prompt Engineering: From Beginner to Expert",
      "content_html": "<h1>Is ChatGPT Plus Worth It? Free vs Plus vs Pro Compared (2026)</h1>\n<p>$20/month for ChatGPT Plus. $200/month for Pro. Free is free. Which one actually makes sense for you? After testing all three tiers extensively, here's the honest breakdown.</p>\n<h2>The Tiers at a Glance</h2>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Free</th>\n<th>Plus ($20/mo)</th>\n<th>Pro ($200/mo)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Model</td>\n<td>GPT-4o mini (fast)</td>\n<td>GPT-4o (full), o1</td>\n<td>GPT-4o, o1 Pro, unlimited</td>\n</tr>\n<tr>\n<td>Messages (GPT-4o)</td>\n<td>~10/day</td>\n<td>~80/3hrs</td>\n<td>Unlimited</td>\n</tr>\n<tr>\n<td>DALL·E images</td>\n<td>2/day</td>\n<td>Unlimited</td>\n<td>Unlimited</td>\n</tr>\n<tr>\n<td>Web browsing</td>\n<td>Limited</td>\n<td>✅</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>File upload</td>\n<td>Images only</td>\n<td>All file types</td>\n<td>All file types</td>\n</tr>\n<tr>\n<td>Code Interpreter</td>\n<td>Limited</td>\n<td>✅</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Voice conversations</td>\n<td>Limited</td>\n<td>✅</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>o1 Pro mode</td>\n<td>❌</td>\n<td>❌</td>\n<td>✅ (deep reasoning)</td>\n</tr>\n</tbody>\n</table>\n<h2>Free: Good Enough for Most People</h2>\n<p>If you use ChatGPT casually — a few questions here and there, help drafting an email, summarizing a short article — the free tier is genuinely fine. GPT-4o mini is fast and surprisingly capable for everyday tasks. The main limitation is the ~10 GPT-4o messages per day cap, but you can plan around it.</p>\n<p><strong>Stay free if:</strong> You're a casual user who asks fewer than 10 serious questions a day.</p>\n<h2>Plus: The Sweet Spot</h2>\n<p>For $20/month, you get significantly more: real GPT-4o with web browsing, file uploads, DALL·E image generation, and Code Interpreter for data analysis. If you use ChatGPT as part of your daily workflow — writing code, analyzing spreadsheets, creating content — Plus pays for itself in the first hour of the month.</p>\n<p><strong>Upgrade to Plus if:</strong></p>\n<ul>\n<li>You hit the GPT-4o message limit on the free tier more than once a week</li>\n<li>You need to upload and analyze documents (PDFs, spreadsheets, code)</li>\n<li>You create images for presentations or social media regularly</li>\n<li>You use ChatGPT as a coding assistant daily</li>\n</ul>\n<h2>Pro: Only for Power Users</h2>\n<p>$200/month is a serious commitment. The main draws are <strong>unlimited access</strong> (no message caps, no throttling) and <strong>o1 Pro mode</strong> — which runs a deeper reasoning process for complex math, science, and coding problems. Unless you're running ChatGPT all day as a core part of your professional workflow, it's hard to justify.</p>\n<p><strong>Upgrade to Pro if:</strong></p>\n<ul>\n<li>You're a researcher who needs the deepest reasoning on complex problems</li>\n<li>You use ChatGPT as your primary coding tool for 6+ hours a day</li>\n<li>You run a business where ChatGPT usage directly generates revenue</li>\n</ul>\n<h2>My Recommendation</h2>\n<p>Start free. When you find yourself frustrated by limits, upgrade to Plus. If Plus still isn't enough — and you're earning money from the work ChatGPT helps with — consider Pro. The path is: <strong>Free → Plus (when limited) → Pro (when Plus is a bottleneck)</strong>. Most people will never need Pro.</p>\n<p><strong>See also:</strong> <a href=\"/en/ai/best-ai-tools-developers-2026.html\">25 Best AI Tools for Developers in 2026: Code, Debug, Deploy</a>, <a href=\"/en/ai/open-source-llm-comparison.html\">Open Source LLMs Compared 2026: Llama 3 vs Mistral vs Qwen vs Gemma</a>, <a href=\"/en/ai/prompt-engineering.html\">Prompt Engineering: From Beginner to Expert</a></p>",
      "summary": "2026 年 ChatGPT 三档价格方案深度对比：免费版、Plus($20/月)、Pro($200/月) 各自适合什么人？帮你做出不后悔的选择。",
      "date_published": "2026-05-20",
      "date_modified": "2026-05-20",
      "tags": [
        "ChatGPT",
        "评测对比",
        "AI工具"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/ai-personal-efficiency.html",
      "url": "https://aidev.fit/en/ai/ai-personal-efficiency.html",
      "title": "AI 时代的个人效率提升：我的 10 个日常使用场景",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "从写邮件、读论文到自动化工作流，分享 AI 融入日常生活的 10 个真实场景和具体工具推荐，每个场景附带可复制的提示词模板。",
      "date_published": "2026-05-20",
      "date_modified": "2026-05-20",
      "tags": [
        "AI效率",
        "个人提升",
        "实用技巧"
      ]
    },
    {
      "id": "https://aidev.fit/en/daily/ai-daily-news-2026-05-19.html",
      "url": "https://aidev.fit/en/daily/ai-daily-news-2026-05-19.html",
      "title": "AI每日资讯 — 2026年5月19日：Gemini 3发布、Anthropic收购、马斯克败诉、Cerebras IPO",
      "content_text": "AI Daily Digest — May 19, 2026: Gemini 3, Anthropic M&amp;A, Musk Defeated, Cerebras IPO 1. Google Launches Gemini 3, Embedding AI Across Its Entire Ecosystem Google released Gemini 3.0 simultaneously across Search AI Mode, Workspace, Android, Cloud, and developer tools — a departure from its prior developer-first rollout pattern. The launch includes Antigravity , a new agentic IDE where AI acts as a first-class collaborator in the editor, terminal, and browser. Analysts note Google's unique position: no other AI company can flip as many product surfaces to a new model on day one. Source: Maginative 2. Anthropic Acquires Dev Tools Startup Used by OpenAI, Google, and Cloudflare Anthropic has acquired a developer tools company whose products were previously used by OpenAI, Google, and Cloudflare. The deal signals an expansion of Anthropic's enterprise developer ecosystem strategy and strengthens its competitive position against vertically integrated rivals. Financial terms were not disclosed. Source: TechCrunch 3. Jury Rules Against Elon Musk in Lawsuit Against OpenAI and Sam Altman A jury ruled against Elon Musk in his closely watched lawsuit against Sam Altman and OpenAI, rejecting claims over the company's governance and direction. The trial centered on fiduciary duty and OpenAI's transition from nonprofit to capped-profit structure. The verdict marks a significant legal milestone for AI corporate governance. Source: TechCrunch 4. Cerebras Raises $5.5 Billion in 2026's First Mega Tech IPO AI chip company Cerebras raised $5.5 billion in its public debut, with shares surging 108% on the first day of trading. The IPO marks the largest tech offering of 2026 so far and signals robust investor appetite for alternatives to NVIDIA in the AI training and inference chip market. Source: TechCrunch 5. NVIDIA H200 China Deal Survives Trump-Xi Summit — With Conditions The NVIDIA H200 export deal to China survived high-level talks between US and Chinese leaders, but with unexpected restrictions that reshape the AI chip supply landscape. The outcome preserves a critical revenue channel for NVIDIA while addressing US national security concerns about advanced AI hardware reaching Chinese entities. Source: AI News 6. OpenAI Releases Open-Weight Safety Models Under Apache 2.0 License OpenAI launched gpt-oss-safeguard , open-weight reasoning models (120B and 20B parameters) that classify content safety based on user-defined policies at inference time — no retraining needed when rules change. Released under Apache 2.0 on Hugging Face as part of the ROOST nonprofit initiative. The 120B model outperformed GPT-5 on OpenAI's internal safety benchmark (46.3% vs 43.2%). Source: Maginative 7. IBM Research Unveils Breakthrough Analog AI Chip for Efficient Deep Learning IBM Research unveiled a novel analog AI chip designed for energy-efficient deep learning inference. The chip uses in-memory computing to perform matrix operations directly in analog circuitry, potentially reducing power consumption by orders of magnitude compared to digital accelerators. The breakthrough addresses one of AI's most pressing bottlenecks: the energy cost of large-scale inference. Source: AI News 8. Google Warns: Malicious Web Pages Are Actively Poisoning AI Agents Google issued a security alert warning that adversarial web content is being used to poison AI agents that browse the internet. Attackers can inject hidden prompts or data into web pages that, when consumed by AI crawlers and agents, manipulate their behavior or extract sensitive information. The advisory urges developers to implement content sandboxing and retrieval validation. Source: AI News 9. Hugging Face Hosted Malware Disguised as Official OpenAI Package Malicious software was discovered on Hugging Face masquerading as an official OpenAI release, exposing critical supply-chain vulnerabilities in open-source AI. The incident underscores the urgent need for package provenance verification, cryptographic signing, and automated security scanning across AI model registries. Source: AI News 10. Humanoid Robots Enter Real Factory Trials as Physical AI Matures Multiple companies have begun testing humanoid robots in live manufacturing environments, moving beyond controlled lab demonstrations. These deployments test robots on variable, complex tasks alongside human workers. The trials represent a milestone for physical AI — the intersection of robotics, computer vision, and autonomous decision-making in unstructured environments. Source: AI News AI Daily Digest is curated from trusted technology news sources. Last updated: May 19, 2026. See also: Building AI Automation Workflows with n8n: A Practical Guide , Fine-Tuning Open Source LLMs: A Developer's Practical Guide (2026) , AI Agents Memory Patterns: Working, Episodic, Semantic, and Reflective Memory See also: Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026) , Building a DevTools Startup: Strategy Guide , Affiliate Marketing for Dev Tools: Programs, Content, Disclosure See also: Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026) , Building a DevTools Startup: Strategy Guide , Affiliate Marketing for Dev Tools: Programs, Content, Disclosure See also: Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026) , Building a DevTools Startup: Strategy Guide , Affiliate Marketing for Dev Tools: Programs, Content, Disclosure See also: Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026) , Building a DevTools Startup: Strategy Guide , Affiliate Marketing for Dev Tools: Programs, Content, Disclosure See also: Prompt Injection Prevention: Securing Your LLM Applications (2026) , Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026) , Building a DevTools Startup: Strategy Guide See also: LLM Function Calling: Complete Developer Guide with Code Examples , Prompt Injection Prevention: Securing Your LLM Applications (2026) , Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026) See also: Prompt Injection Prevention: Securing Your LLM Applications (2026) , Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026) , Building a DevTools Startup: Strategy Guide See also: LLM Function Calling: Complete Developer Guide with Code Examples , Prompt Injection Prevention: Securing Your LLM Applications (2026) , Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026) See also: AI Agents for Developers: A Practical Guide to Building and Using Agents , LLM Function Calling: Complete Developer Guide with Code Examples , Prompt Injection Prevention: Securing Your LLM Applications (2026) See also: AI Agents for Developers: A Practical Guide to Building and Using Agents , LLM Function Calling: Complete Developer Guide with Code Examples , Prompt Injection Prevention: Securing Your LLM Applications (2026) See also: AI Agents for Developers: A Practical Guide to Building and Using Agents , LLM Function Calling: Complete Developer Guide with Code Examples , Prompt Injection Prevention: Securing Your LLM Applications (2026)",
      "content_html": "<h1>AI Daily Digest — May 19, 2026: Gemini 3, Anthropic M&amp;A, Musk Defeated, Cerebras IPO</h1>\n<h2>1. Google Launches Gemini 3, Embedding AI Across Its Entire Ecosystem</h2>\n<p>Google released Gemini 3.0 simultaneously across Search AI Mode, Workspace, Android, Cloud, and developer tools — a departure from its prior developer-first rollout pattern. The launch includes <strong>Antigravity</strong> , a new agentic IDE where AI acts as a first-class collaborator in the editor, terminal, and browser. Analysts note Google's unique position: no other AI company can flip as many product surfaces to a new model on day one.</p>\n<p><strong>Source:</strong> <a href=\"https://www.maginative.com/article/googles-gemini-3-is-here-heres-why-it-actually-matters/\">Maginative</a></p>\n<h2>2. Anthropic Acquires Dev Tools Startup Used by OpenAI, Google, and Cloudflare</h2>\n<p>Anthropic has acquired a developer tools company whose products were previously used by OpenAI, Google, and Cloudflare. The deal signals an expansion of Anthropic's enterprise developer ecosystem strategy and strengthens its competitive position against vertically integrated rivals. Financial terms were not disclosed.</p>\n<p><strong>Source:</strong> <a href=\"https://techcrunch.com/2026/05/18/anthropic-has-acquired-the-dev-tools-startup-used-by-openai-google-and-cloudflare/\">TechCrunch</a></p>\n<h2>3. Jury Rules Against Elon Musk in Lawsuit Against OpenAI and Sam Altman</h2>\n<p>A jury ruled against Elon Musk in his closely watched lawsuit against Sam Altman and OpenAI, rejecting claims over the company's governance and direction. The trial centered on fiduciary duty and OpenAI's transition from nonprofit to capped-profit structure. The verdict marks a significant legal milestone for AI corporate governance.</p>\n<p><strong>Source:</strong> <a href=\"https://techcrunch.com/2026/05/18/elon-musk-has-lost-his-lawsuit-against-sam-altman-and-openai/\">TechCrunch</a></p>\n<h2>4. Cerebras Raises $5.5 Billion in 2026's First Mega Tech IPO</h2>\n<p>AI chip company Cerebras raised $5.5 billion in its public debut, with shares surging 108% on the first day of trading. The IPO marks the largest tech offering of 2026 so far and signals robust investor appetite for alternatives to NVIDIA in the AI training and inference chip market.</p>\n<p><strong>Source:</strong> <a href=\"https://techcrunch.com/2026/05/14/cerebras-raises-5-5b-kicking-off-2026s-ipo-season-with-a-bang/\">TechCrunch</a></p>\n<h2>5. NVIDIA H200 China Deal Survives Trump-Xi Summit — With Conditions</h2>\n<p>The NVIDIA H200 export deal to China survived high-level talks between US and Chinese leaders, but with unexpected restrictions that reshape the AI chip supply landscape. The outcome preserves a critical revenue channel for NVIDIA while addressing US national security concerns about advanced AI hardware reaching Chinese entities.</p>\n<p><strong>Source:</strong> <a href=\"https://www.artificialintelligence-news.com/news/nvidia-h200-china-deal-stalled-trump-xi-summit-2026/\">AI News</a></p>\n<h2>6. OpenAI Releases Open-Weight Safety Models Under Apache 2.0 License</h2>\n<p>OpenAI launched <strong>gpt-oss-safeguard</strong> , open-weight reasoning models (120B and 20B parameters) that classify content safety based on user-defined policies at inference time — no retraining needed when rules change. Released under Apache 2.0 on Hugging Face as part of the ROOST nonprofit initiative. The 120B model outperformed GPT-5 on OpenAI's internal safety benchmark (46.3% vs 43.2%).</p>\n<p><strong>Source:</strong> <a href=\"https://www.maginative.com/article/openai-releases-open-weight-safety-models-that-rewrite-policy-rules-on-the-fly/\">Maginative</a></p>\n<h2>7. IBM Research Unveils Breakthrough Analog AI Chip for Efficient Deep Learning</h2>\n<p>IBM Research unveiled a novel analog AI chip designed for energy-efficient deep learning inference. The chip uses in-memory computing to perform matrix operations directly in analog circuitry, potentially reducing power consumption by orders of magnitude compared to digital accelerators. The breakthrough addresses one of AI's most pressing bottlenecks: the energy cost of large-scale inference.</p>\n<p><strong>Source:</strong> <a href=\"https://www.artificialintelligence-news.com/news/ibm-research-breakthrough-analog-ai-chip-deep-learning/\">AI News</a></p>\n<h2>8. Google Warns: Malicious Web Pages Are Actively Poisoning AI Agents</h2>\n<p>Google issued a security alert warning that adversarial web content is being used to poison AI agents that browse the internet. Attackers can inject hidden prompts or data into web pages that, when consumed by AI crawlers and agents, manipulate their behavior or extract sensitive information. The advisory urges developers to implement content sandboxing and retrieval validation.</p>\n<p><strong>Source:</strong> <a href=\"https://www.artificialintelligence-news.com/news/google-warns-malicious-web-pages-poisoning-ai-agents/\">AI News</a></p>\n<h2>9. Hugging Face Hosted Malware Disguised as Official OpenAI Package</h2>\n<p>Malicious software was discovered on Hugging Face masquerading as an official OpenAI release, exposing critical supply-chain vulnerabilities in open-source AI. The incident underscores the urgent need for package provenance verification, cryptographic signing, and automated security scanning across AI model registries.</p>\n<p><strong>Source:</strong> <a href=\"https://www.artificialintelligence-news.com/news/malware-on-hugging-face-malicious-software-masquerading-as-openai-release/\">AI News</a></p>\n<h2>10. Humanoid Robots Enter Real Factory Trials as Physical AI Matures</h2>\n<p>Multiple companies have begun testing humanoid robots in live manufacturing environments, moving beyond controlled lab demonstrations. These deployments test robots on variable, complex tasks alongside human workers. The trials represent a milestone for physical AI — the intersection of robotics, computer vision, and autonomous decision-making in unstructured environments.</p>\n<p><strong>Source:</strong> <a href=\"https://www.artificialintelligence-news.com/news/physical-ai-humanoid-robots-factories/\">AI News</a></p>\n<hr />\n<p><em>AI Daily Digest is curated from trusted technology news sources. Last updated: May 19, 2026.</em></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/n8n-ai-automation.html\">Building AI Automation Workflows with n8n: A Practical Guide</a>, <a href=\"/en/ai/fine-tune-open-source-llm.html\">Fine-Tuning Open Source LLMs: A Developer's Practical Guide (2026)</a>, <a href=\"/en/ai/ai-agents-memory-patterns.html\">AI Agents Memory Patterns: Working, Episodic, Semantic, and Reflective Memory</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/multimodal-ai-guide.html\">Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026)</a>, <a href=\"/en/sidehustle/devtools-startup.html\">Building a DevTools Startup: Strategy Guide</a>, <a href=\"/en/sidehustle/affiliate-marketing-dev.html\">Affiliate Marketing for Dev Tools: Programs, Content, Disclosure</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/multimodal-ai-guide.html\">Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026)</a>, <a href=\"/en/sidehustle/devtools-startup.html\">Building a DevTools Startup: Strategy Guide</a>, <a href=\"/en/sidehustle/affiliate-marketing-dev.html\">Affiliate Marketing for Dev Tools: Programs, Content, Disclosure</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/multimodal-ai-guide.html\">Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026)</a>, <a href=\"/en/sidehustle/devtools-startup.html\">Building a DevTools Startup: Strategy Guide</a>, <a href=\"/en/sidehustle/affiliate-marketing-dev.html\">Affiliate Marketing for Dev Tools: Programs, Content, Disclosure</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/multimodal-ai-guide.html\">Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026)</a>, <a href=\"/en/sidehustle/devtools-startup.html\">Building a DevTools Startup: Strategy Guide</a>, <a href=\"/en/sidehustle/affiliate-marketing-dev.html\">Affiliate Marketing for Dev Tools: Programs, Content, Disclosure</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/prompt-injection-prevention.html\">Prompt Injection Prevention: Securing Your LLM Applications (2026)</a>, <a href=\"/en/ai/multimodal-ai-guide.html\">Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026)</a>, <a href=\"/en/sidehustle/devtools-startup.html\">Building a DevTools Startup: Strategy Guide</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/function-calling-guide.html\">LLM Function Calling: Complete Developer Guide with Code Examples</a>, <a href=\"/en/ai/prompt-injection-prevention.html\">Prompt Injection Prevention: Securing Your LLM Applications (2026)</a>, <a href=\"/en/ai/multimodal-ai-guide.html\">Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026)</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/prompt-injection-prevention.html\">Prompt Injection Prevention: Securing Your LLM Applications (2026)</a>, <a href=\"/en/ai/multimodal-ai-guide.html\">Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026)</a>, <a href=\"/en/sidehustle/devtools-startup.html\">Building a DevTools Startup: Strategy Guide</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/function-calling-guide.html\">LLM Function Calling: Complete Developer Guide with Code Examples</a>, <a href=\"/en/ai/prompt-injection-prevention.html\">Prompt Injection Prevention: Securing Your LLM Applications (2026)</a>, <a href=\"/en/ai/multimodal-ai-guide.html\">Building Multimodal AI Applications: Vision, Audio, and Text Combined (2026)</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/ai-agents-guide.html\">AI Agents for Developers: A Practical Guide to Building and Using Agents</a>, <a href=\"/en/ai/function-calling-guide.html\">LLM Function Calling: Complete Developer Guide with Code Examples</a>, <a href=\"/en/ai/prompt-injection-prevention.html\">Prompt Injection Prevention: Securing Your LLM Applications (2026)</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/ai-agents-guide.html\">AI Agents for Developers: A Practical Guide to Building and Using Agents</a>, <a href=\"/en/ai/function-calling-guide.html\">LLM Function Calling: Complete Developer Guide with Code Examples</a>, <a href=\"/en/ai/prompt-injection-prevention.html\">Prompt Injection Prevention: Securing Your LLM Applications (2026)</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/ai-agents-guide.html\">AI Agents for Developers: A Practical Guide to Building and Using Agents</a>, <a href=\"/en/ai/function-calling-guide.html\">LLM Function Calling: Complete Developer Guide with Code Examples</a>, <a href=\"/en/ai/prompt-injection-prevention.html\">Prompt Injection Prevention: Securing Your LLM Applications (2026)</a></p>",
      "summary": "今日AI十大要闻：Google Gemini 3携Antigravity IDE发布、Anthropic收购开发者工具公司、马斯克诉OpenAI案败诉、Cerebras 55亿美元IPO、NVIDIA H200中国协议存续、IBM模拟AI芯片突破、OpenAI开源安全模型、Google警告AI Agent遭网页毒害、Hugging Face恶意软件事件、人形机器人进入工厂实测。附原文来源链接。",
      "date_published": "2026-05-19",
      "date_modified": "2026-05-19",
      "tags": [
        "AI资讯",
        "每日要闻",
        "Gemini 3",
        "OpenAI",
        "Anthropic",
        "Cerebras",
        "AI Agent",
        "AI安全"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/git-advanced.html",
      "url": "https://aidev.fit/en/tech/git-advanced.html",
      "title": "Git 进阶：交互式 rebase、cherry-pick 和 bisect 实战",
      "content_text": "Git Advanced: Interactive Rebase, Cherry-Pick, Bisect, and More Most developers stop at add , commit , push , and pull . But Git has a set of advanced commands that can save hours of frustration and make your commit history something you're actually proud of. Here's your guide to interactive rebase, cherry-pick, bisect, reflog, and hooks. Interactive Rebase: Rewrite History Cleanly The most powerful Git feature most developers never learn. Interactive rebase lets you reorder, squash, split, and edit commits before pushing. # Squash last 4 commits into 1 clean commit git rebase - i HEAD ~ 4 # In the editor , mark commits : # pick abc1234 First commit message ( keep as - is ) # squash def5678 Fix typo ( merge into previous ) # squash ghi9012 Format code ( merge into previous ) # squash jkl3456 Update tests ( merge into previous ) # Then write a single commit message When to Use Interactive Rebase Before pushing to main: Squash \"WIP\" and \"fix typo\" commits into meaningful units Before opening a PR: Reorder commits so they tell a logical story Never: On shared branches or commits that have been pushed. Rewriting public history causes chaos. Cherry-Pick: Apply a Specific Commit Anywhere When you need one specific commit from another branch without merging everything: # Apply a single commit to the current branch git cherry-pick abc1234 # Apply a range of commits git cherry-pick abc1234..def5678 # Cherry-pick without committing (stage changes only) git cherry-pick -n abc1234 Common use: a bug fix on a release branch that you need on main, but main has diverged significantly. Cherry-pick the fix commit. Git Bisect: Find the Commit That Broke Everything Binary search through your commit history to find exactly which commit introduced a bug: # Start bisect session git bisect start git bisect bad HEAD # current commit is broken git bisect good v2 . 5 . 0 # this tag was working # Git checks out a commit halfway between . Test it . # If broken : git bisect bad # If working : git bisect good # Repeat until Git identifies the culprit commit . # Then end the session : git bisect reset For automated bisecting, provide a test script: git bisect run npm test # Git runs the test on each step # If the test exits with code 0 → good , non - zero → bad # Git finds the breaking commit automatically Git Reflog: The Ultimate Undo Reflog records every movement of HEAD — commits, checkouts, rebases, resets. When you think you've lost work, reflog is your safety net: git reflog # Shows: abc1234 HEAD@ {{ 0 }} : commit: Add login feature # def5678 HEAD@ {{ 1 }} : rebase (finish): returning to refs/heads/main # ghi9012 HEAD@ {{ 2 }} : reset: moving to HEAD~3 # Recover that &quot;lost&quot; commit git checkout HEAD@ {{ 2 }} # go back to before the reset git branch recovered-branch # save it to a branch Scenario Recovery Command Undo a bad rebase git reset --hard HEAD@{{1}} Recover deleted branch git checkout -b recovered HEAD@{{3}} Undo amend on wrong commit git reset --soft HEAD@{{1}} Git Hooks: Automate Your Workflow Hooks are scripts that run automatically on Git events. They live in .git/hooks/ and can be written in any language. Use them to prevent mistakes before they happen: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/bin/bash # .git/hooks/pre-commit — run linter before every commit npm run lint if [ $? -ne 0 ] ; then echo &quot;Linting failed. Commit aborted.&quot; exit 1 fi #!/bin/bash # .git/hooks/commit-msg — enforce conventional commits MSG = $( cat &quot; $1 &quot; ) if ! echo &quot; $MSG &quot; | grep -qE &quot;^(feat|fix|refactor|test|docs|chore)(\\(.+\\))?: &quot; ; then echo &quot;Commit message must follow conventional commits format&quot; echo &quot; feat: add feature&quot; echo &quot; fix: resolve bug&quot; exit 1 fi Hook When It Runs Use For pre-commit Before commit is created Linting, formatting, unit tests commit-msg After message is entered Enforce message format pre-push Before push to remote Integration tests, security scans post-checkout After checkout/switching branches Install dependencies if changed See also: DevOps for Developers: CI/CD, Docker, IaC, and Monitoring — A Practical Guide , Environment Variables: The Complete Guide for Developers , CI/CD Pipeline Complete Guide 2026: From Git Push to Production",
      "content_html": "<h1>Git Advanced: Interactive Rebase, Cherry-Pick, Bisect, and More</h1>\n<p>Most developers stop at <code>add</code>, <code>commit</code>, <code>push</code>, and <code>pull</code>. But Git has a set of advanced commands that can save hours of frustration and make your commit history something you're actually proud of. Here's your guide to interactive rebase, cherry-pick, bisect, reflog, and hooks.</p>\n<h2>Interactive Rebase: Rewrite History Cleanly</h2>\n<p>The most powerful Git feature most developers never learn. Interactive rebase lets you reorder, squash, split, and edit commits before pushing.</p>\n<div class=\"codehilite\"><pre><span></span><code>#<span class=\"w\"> </span><span class=\"nv\">Squash</span><span class=\"w\"> </span><span class=\"nv\">last</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"w\"> </span><span class=\"nv\">commits</span><span class=\"w\"> </span><span class=\"nv\">into</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"nv\">clean</span><span class=\"w\"> </span><span class=\"nv\">commit</span>\n<span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">rebase</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nv\">HEAD</span><span class=\"o\">~</span><span class=\"mi\">4</span>\n\n#<span class=\"w\"> </span><span class=\"nv\">In</span><span class=\"w\"> </span><span class=\"nv\">the</span><span class=\"w\"> </span><span class=\"nv\">editor</span>,<span class=\"w\"> </span><span class=\"nv\">mark</span><span class=\"w\"> </span><span class=\"nv\">commits</span>:\n#<span class=\"w\"> </span><span class=\"nv\">pick</span><span class=\"w\"> </span><span class=\"nv\">abc1234</span><span class=\"w\"> </span><span class=\"nv\">First</span><span class=\"w\"> </span><span class=\"nv\">commit</span><span class=\"w\"> </span><span class=\"nv\">message</span><span class=\"w\">      </span><span class=\"ss\">(</span><span class=\"nv\">keep</span><span class=\"w\"> </span><span class=\"nv\">as</span><span class=\"o\">-</span><span class=\"nv\">is</span><span class=\"ss\">)</span>\n#<span class=\"w\"> </span><span class=\"nv\">squash</span><span class=\"w\"> </span><span class=\"nv\">def5678</span><span class=\"w\"> </span><span class=\"nv\">Fix</span><span class=\"w\"> </span><span class=\"nv\">typo</span><span class=\"w\">                </span><span class=\"ss\">(</span><span class=\"nv\">merge</span><span class=\"w\"> </span><span class=\"nv\">into</span><span class=\"w\"> </span><span class=\"nv\">previous</span><span class=\"ss\">)</span>\n#<span class=\"w\"> </span><span class=\"nv\">squash</span><span class=\"w\"> </span><span class=\"nv\">ghi9012</span><span class=\"w\"> </span><span class=\"nv\">Format</span><span class=\"w\"> </span><span class=\"nv\">code</span><span class=\"w\">             </span><span class=\"ss\">(</span><span class=\"nv\">merge</span><span class=\"w\"> </span><span class=\"nv\">into</span><span class=\"w\"> </span><span class=\"nv\">previous</span><span class=\"ss\">)</span>\n#<span class=\"w\"> </span><span class=\"nv\">squash</span><span class=\"w\"> </span><span class=\"nv\">jkl3456</span><span class=\"w\"> </span><span class=\"nv\">Update</span><span class=\"w\"> </span><span class=\"nv\">tests</span><span class=\"w\">            </span><span class=\"ss\">(</span><span class=\"nv\">merge</span><span class=\"w\"> </span><span class=\"nv\">into</span><span class=\"w\"> </span><span class=\"nv\">previous</span><span class=\"ss\">)</span>\n#<span class=\"w\"> </span><span class=\"k\">Then</span><span class=\"w\"> </span><span class=\"nv\">write</span><span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"w\"> </span><span class=\"nv\">single</span><span class=\"w\"> </span><span class=\"nv\">commit</span><span class=\"w\"> </span><span class=\"nv\">message</span>\n</code></pre></div>\n\n<h3>When to Use Interactive Rebase</h3>\n<ul>\n<li><strong>Before pushing to main:</strong> Squash \"WIP\" and \"fix typo\" commits into meaningful units</li>\n<li><strong>Before opening a PR:</strong> Reorder commits so they tell a logical story</li>\n<li><strong>Never:</strong> On shared branches or commits that have been pushed. Rewriting public history causes chaos.</li>\n</ul>\n<h2>Cherry-Pick: Apply a Specific Commit Anywhere</h2>\n<p>When you need one specific commit from another branch without merging everything:</p>\n<div class=\"codehilite\"><pre><span></span><code># Apply a single commit to the current branch\ngit cherry-pick abc1234\n\n# Apply a range of commits\ngit cherry-pick abc1234..def5678\n\n# Cherry-pick without committing (stage changes only)\ngit cherry-pick -n abc1234\n</code></pre></div>\n\n<p>Common use: a bug fix on a release branch that you need on main, but main has diverged significantly. Cherry-pick the fix commit.</p>\n<h2>Git Bisect: Find the Commit That Broke Everything</h2>\n<p>Binary search through your commit history to find exactly which commit introduced a bug:</p>\n<div class=\"codehilite\"><pre><span></span><code>#<span class=\"w\"> </span><span class=\"nv\">Start</span><span class=\"w\"> </span><span class=\"nv\">bisect</span><span class=\"w\"> </span><span class=\"nv\">session</span>\n<span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">bisect</span><span class=\"w\"> </span><span class=\"nv\">start</span>\n<span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">bisect</span><span class=\"w\"> </span><span class=\"nv\">bad</span><span class=\"w\"> </span><span class=\"nv\">HEAD</span><span class=\"w\">          </span>#<span class=\"w\"> </span><span class=\"nv\">current</span><span class=\"w\"> </span><span class=\"nv\">commit</span><span class=\"w\"> </span><span class=\"nv\">is</span><span class=\"w\"> </span><span class=\"nv\">broken</span>\n<span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">bisect</span><span class=\"w\"> </span><span class=\"nv\">good</span><span class=\"w\"> </span><span class=\"nv\">v2</span>.<span class=\"mi\">5</span>.<span class=\"mi\">0</span><span class=\"w\">       </span>#<span class=\"w\"> </span><span class=\"nv\">this</span><span class=\"w\"> </span><span class=\"nv\">tag</span><span class=\"w\"> </span><span class=\"nv\">was</span><span class=\"w\"> </span><span class=\"nv\">working</span>\n\n#<span class=\"w\"> </span><span class=\"nv\">Git</span><span class=\"w\"> </span><span class=\"nv\">checks</span><span class=\"w\"> </span><span class=\"nv\">out</span><span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"w\"> </span><span class=\"nv\">commit</span><span class=\"w\"> </span><span class=\"nv\">halfway</span><span class=\"w\"> </span><span class=\"nv\">between</span>.<span class=\"w\"> </span><span class=\"nv\">Test</span><span class=\"w\"> </span><span class=\"nv\">it</span>.\n#<span class=\"w\"> </span><span class=\"k\">If</span><span class=\"w\"> </span><span class=\"nv\">broken</span>:<span class=\"w\">  </span><span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">bisect</span><span class=\"w\"> </span><span class=\"nv\">bad</span>\n#<span class=\"w\"> </span><span class=\"k\">If</span><span class=\"w\"> </span><span class=\"nv\">working</span>:<span class=\"w\"> </span><span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">bisect</span><span class=\"w\"> </span><span class=\"nv\">good</span>\n\n#<span class=\"w\"> </span><span class=\"nv\">Repeat</span><span class=\"w\"> </span><span class=\"k\">until</span><span class=\"w\"> </span><span class=\"nv\">Git</span><span class=\"w\"> </span><span class=\"nv\">identifies</span><span class=\"w\"> </span><span class=\"nv\">the</span><span class=\"w\"> </span><span class=\"nv\">culprit</span><span class=\"w\"> </span><span class=\"nv\">commit</span>.\n#<span class=\"w\"> </span><span class=\"k\">Then</span><span class=\"w\"> </span><span class=\"k\">end</span><span class=\"w\"> </span><span class=\"nv\">the</span><span class=\"w\"> </span><span class=\"nv\">session</span>:\n<span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">bisect</span><span class=\"w\"> </span><span class=\"nv\">reset</span>\n</code></pre></div>\n\n<p>For automated bisecting, provide a test script:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">bisect</span><span class=\"w\"> </span><span class=\"nv\">run</span><span class=\"w\"> </span><span class=\"nv\">npm</span><span class=\"w\"> </span><span class=\"nv\">test</span><span class=\"w\">     </span>#<span class=\"w\"> </span><span class=\"nv\">Git</span><span class=\"w\"> </span><span class=\"nv\">runs</span><span class=\"w\"> </span><span class=\"nv\">the</span><span class=\"w\"> </span><span class=\"nv\">test</span><span class=\"w\"> </span><span class=\"nv\">on</span><span class=\"w\"> </span><span class=\"nv\">each</span><span class=\"w\"> </span><span class=\"nv\">step</span>\n#<span class=\"w\"> </span><span class=\"k\">If</span><span class=\"w\"> </span><span class=\"nv\">the</span><span class=\"w\"> </span><span class=\"nv\">test</span><span class=\"w\"> </span><span class=\"nv\">exits</span><span class=\"w\"> </span><span class=\"nv\">with</span><span class=\"w\"> </span><span class=\"nv\">code</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"w\"> </span>→<span class=\"w\"> </span><span class=\"nv\">good</span>,<span class=\"w\"> </span><span class=\"nv\">non</span><span class=\"o\">-</span><span class=\"nv\">zero</span><span class=\"w\"> </span>→<span class=\"w\"> </span><span class=\"nv\">bad</span>\n#<span class=\"w\"> </span><span class=\"nv\">Git</span><span class=\"w\"> </span><span class=\"nv\">finds</span><span class=\"w\"> </span><span class=\"nv\">the</span><span class=\"w\"> </span><span class=\"nv\">breaking</span><span class=\"w\"> </span><span class=\"nv\">commit</span><span class=\"w\"> </span><span class=\"nv\">automatically</span>\n</code></pre></div>\n\n<h2>Git Reflog: The Ultimate Undo</h2>\n<p>Reflog records every movement of HEAD — commits, checkouts, rebases, resets. When you think you've lost work, reflog is your safety net:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"x\">git reflog</span>\n<span class=\"x\"># Shows: abc1234 HEAD@</span><span class=\"cp\">{{</span><span class=\"m\">0</span><span class=\"cp\">}}</span><span class=\"x\">: commit: Add login feature</span>\n<span class=\"x\">#        def5678 HEAD@</span><span class=\"cp\">{{</span><span class=\"m\">1</span><span class=\"cp\">}}</span><span class=\"x\">: rebase (finish): returning to refs/heads/main</span>\n<span class=\"x\">#        ghi9012 HEAD@</span><span class=\"cp\">{{</span><span class=\"m\">2</span><span class=\"cp\">}}</span><span class=\"x\">: reset: moving to HEAD~3</span>\n\n<span class=\"x\"># Recover that &quot;lost&quot; commit</span>\n<span class=\"x\">git checkout HEAD@</span><span class=\"cp\">{{</span><span class=\"m\">2</span><span class=\"cp\">}}</span><span class=\"x\">       # go back to before the reset</span>\n<span class=\"x\">git branch recovered-branch   # save it to a branch</span>\n</code></pre></div>\n\n<table>\n<thead>\n<tr>\n<th>Scenario</th>\n<th>Recovery Command</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Undo a bad rebase</td>\n<td><code>git reset --hard HEAD@{{1}}</code></td>\n</tr>\n<tr>\n<td>Recover deleted branch</td>\n<td><code>git checkout -b recovered HEAD@{{3}}</code></td>\n</tr>\n<tr>\n<td>Undo amend on wrong commit</td>\n<td><code>git reset --soft HEAD@{{1}}</code></td>\n</tr>\n</tbody>\n</table>\n<h2>Git Hooks: Automate Your Workflow</h2>\n<p>Hooks are scripts that run automatically on Git events. They live in <code>.git/hooks/</code> and can be written in any language. Use them to prevent mistakes before they happen:</p>\n<div class=\"codehilite\"><table class=\"codehilitetable\"><tr><td class=\"linenos\"><div class=\"linenodiv\"><pre><span class=\"normal\"> 1</span>\n<span class=\"normal\"> 2</span>\n<span class=\"normal\"> 3</span>\n<span class=\"normal\"> 4</span>\n<span class=\"normal\"> 5</span>\n<span class=\"normal\"> 6</span>\n<span class=\"normal\"> 7</span>\n<span class=\"normal\"> 8</span>\n<span class=\"normal\"> 9</span>\n<span class=\"normal\">10</span>\n<span class=\"normal\">11</span>\n<span class=\"normal\">12</span>\n<span class=\"normal\">13</span>\n<span class=\"normal\">14</span>\n<span class=\"normal\">15</span>\n<span class=\"normal\">16</span>\n<span class=\"normal\">17</span>\n<span class=\"normal\">18</span></pre></div></td><td class=\"code\"><div><pre><span></span><code><span class=\"ch\">#!/bin/bash</span>\n<span class=\"c1\"># .git/hooks/pre-commit — run linter before every commit</span>\nnpm<span class=\"w\"> </span>run<span class=\"w\"> </span>lint\n<span class=\"k\">if</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"w\"> </span><span class=\"nv\">$?</span><span class=\"w\"> </span>-ne<span class=\"w\"> </span><span class=\"m\">0</span><span class=\"w\"> </span><span class=\"o\">]</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">then</span>\n<span class=\"w\">  </span><span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;Linting failed. Commit aborted.&quot;</span>\n<span class=\"w\">  </span><span class=\"nb\">exit</span><span class=\"w\"> </span><span class=\"m\">1</span>\n<span class=\"k\">fi</span>\n\n\n<span class=\"c1\">#!/bin/bash</span>\n<span class=\"c1\"># .git/hooks/commit-msg — enforce conventional commits</span>\n<span class=\"nv\">MSG</span><span class=\"o\">=</span><span class=\"k\">$(</span>cat<span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"nv\">$1</span><span class=\"s2\">&quot;</span><span class=\"k\">)</span>\n<span class=\"k\">if</span><span class=\"w\"> </span>!<span class=\"w\"> </span><span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;</span><span class=\"nv\">$MSG</span><span class=\"s2\">&quot;</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span>grep<span class=\"w\"> </span>-qE<span class=\"w\"> </span><span class=\"s2\">&quot;^(feat|fix|refactor|test|docs|chore)(\\(.+\\))?: &quot;</span><span class=\"p\">;</span><span class=\"w\"> </span><span class=\"k\">then</span>\n<span class=\"w\">  </span><span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;Commit message must follow conventional commits format&quot;</span>\n<span class=\"w\">  </span><span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;  feat: add feature&quot;</span>\n<span class=\"w\">  </span><span class=\"nb\">echo</span><span class=\"w\"> </span><span class=\"s2\">&quot;  fix: resolve bug&quot;</span>\n<span class=\"w\">  </span><span class=\"nb\">exit</span><span class=\"w\"> </span><span class=\"m\">1</span>\n<span class=\"k\">fi</span>\n</code></pre></div></td></tr></table></div>\n\n<table>\n<thead>\n<tr>\n<th>Hook</th>\n<th>When It Runs</th>\n<th>Use For</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>pre-commit</td>\n<td>Before commit is created</td>\n<td>Linting, formatting, unit tests</td>\n</tr>\n<tr>\n<td>commit-msg</td>\n<td>After message is entered</td>\n<td>Enforce message format</td>\n</tr>\n<tr>\n<td>pre-push</td>\n<td>Before push to remote</td>\n<td>Integration tests, security scans</td>\n</tr>\n<tr>\n<td>post-checkout</td>\n<td>After checkout/switching branches</td>\n<td>Install dependencies if changed</td>\n</tr>\n</tbody>\n</table>\n<p><strong>See also:</strong> <a href=\"/en/tech/devops-for-developers.html\">DevOps for Developers: CI/CD, Docker, IaC, and Monitoring — A Practical Guide</a>, <a href=\"/en/tech/environment-variables-guide.html\">Environment Variables: The Complete Guide for Developers</a>, <a href=\"/en/tech/ci-cd-pipeline-guide.html\">CI/CD Pipeline Complete Guide 2026: From Git Push to Production</a></p>",
      "summary": "进阶 Git 技巧三件套：用交互式 rebase 整理提交历史、用 cherry-pick 精确移植代码、用 bisect 二分法定位 Bug，让你的 Git 段位从熟练进化到精通。",
      "date_published": "2026-05-19",
      "date_modified": "2026-05-19",
      "tags": [
        "Git",
        "进阶",
        "开发工具"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/github-copilot-guide.html",
      "url": "https://aidev.fit/en/tech/github-copilot-guide.html",
      "title": "GitHub Copilot 完全使用指南：从安装到高效协作",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "全面掌握 GitHub Copilot 的使用技巧，包括快捷键、上下文工程、最佳实践和常见陷阱，让 AI 编程工具真正为你提效。",
      "date_published": "2026-05-19",
      "date_modified": "2026-05-19",
      "tags": [
        "GitHub Copilot",
        "AI编程",
        "效率"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/ai-model-cost-calculator.html",
      "url": "https://aidev.fit/en/tools/ai-model-cost-calculator.html",
      "title": "AI Model API Cost Calculator (2026): Compare Claude, GPT, Gemini, DeepSeek",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "Input your token volume and instantly compare costs across 10+ AI models. Updated with 2026 pricing.",
      "date_published": "2026-05-19",
      "date_modified": "2026-05-19",
      "tags": [
        "Developer Tools",
        "Productivity"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/framework-decision-wizard.html",
      "url": "https://aidev.fit/en/tools/framework-decision-wizard.html",
      "title": "Which Frontend Framework Should I Use? — Interactive Decision Wizard (2026)",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "Answer 5 questions about your project and get a data-driven framework recommendation. Compares 8 frameworks across 7 criteria.",
      "date_published": "2026-05-19",
      "date_modified": "2026-05-19",
      "tags": [
        "Developer Tools",
        "Productivity"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/cron-expression-builder.html",
      "url": "https://aidev.fit/en/tools/cron-expression-builder.html",
      "title": "Cron Expression Builder — Visual Cron Schedule Generator",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "Build cron expressions visually with live preview of next execution times. Supports all standard cron fields with human-readable descriptions.",
      "date_published": "2026-05-19",
      "date_modified": "2026-05-19",
      "tags": [
        "Developer Tools",
        "Productivity"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/json-to-typescript.html",
      "url": "https://aidev.fit/en/tools/json-to-typescript.html",
      "title": "JSON to TypeScript Interface Converter — Free Online Tool",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "Paste JSON, get TypeScript types instantly. Supports nested objects, arrays, optional fields, and union types.",
      "date_published": "2026-05-19",
      "date_modified": "2026-05-19",
      "tags": [
        "Developer Tools",
        "Productivity"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/ai-coding.html",
      "url": "https://aidev.fit/en/ai/ai-coding.html",
      "title": "用 AI 辅助编程：从零到生产力",
      "content_text": "AI-Assisted Programming: From Zero to 10x Productivity AI coding tools have evolved from \"impressive demo\" to \"I can't work without this\" in under two years. But there's a wide gap between using AI to autocomplete lines and building a genuine human-AI development workflow. This guide covers the tools and the workflow. The Tool Landscape (2026) Tool Strengths Best For Price GitHub Copilot In-editor completions, chat, agents (Copilot Extensions) General coding. Best IDE integration. $10/mo (Individual) Cursor AI-native editor, Tab multi-line edits, Composer for multi-file changes Greenfield projects, rapid prototyping. Free / $20/mo Claude Code Terminal-based agent, understands entire repos, runs commands Complex refactoring, debugging, PR reviews. API usage / $20/mo (Pro) ChatGPT Code Interpreter Data analysis, visualization, file processing Data science, CSV/JSON manipulation. Free / $20/mo Continue.dev Open-source, bring-your-own-model Privacy-focused, custom models. Free How to Actually Use AI When Coding 1. Use AI for Boilerplate and Repetition AI is excellent at generating repetitive code — CRUD endpoints, unit tests, form components, data models. Describe the pattern once, let AI generate the rest. This is where you'll see the biggest time savings. 2. Use AI to Explore Unfamiliar Codebases Point Claude Code at a new repo and ask \"What's the authentication flow?\" or \"Where is error handling for database connections?\" AI that can read your whole codebase is dramatically more useful than AI that only sees one file. 3. Use AI for First Drafts, Not Final Code The best workflow: AI writes a first draft → you review and refine → AI writes tests → you verify edge cases. Think of AI as an extremely fast junior developer who never gets tired but sometimes hallucinates. 4. Don't Use AI for Architecture Decisions AI can explain trade-offs between approaches, but it shouldn't make the final call. It doesn't understand your team's dynamics, your users' needs, or your business constraints. Common Pitfalls Trusting AI-generated code without review. AI makes plausible-looking mistakes. Always understand what the code does before committing. Letting AI write tests for code it also wrote. If the AI misunderstood the requirement, the test will encode the same misunderstanding. Write the test yourself for critical business logic. Pasting entire files into chat. This is slow and error-prone. Use tools that read your codebase directly (Claude Code, Cursor). Over-relying on AI as a beginner. If you're learning, write the code yourself first. Use AI to explain concepts and review your work, not to do the work for you. Building a Productive Workflow Plan in plain English. Describe what you want to build before writing code. Generate the scaffold. Let AI create the file structure, boilerplate, and initial implementation. Review and refine. Read every line. Refactor anything unclear. Add error handling. Write tests. Tests prove the code works and serve as documentation. Iterate. Ask AI to add features, fix bugs, or refactor — in small, reviewable steps. See also: Claude vs ChatGPT (2026): Which AI Assistant Is Right for You? , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama , ChatGPT API vs Claude API vs Gemini API: Developer Comparison (2026)",
      "content_html": "<h1>AI-Assisted Programming: From Zero to 10x Productivity</h1>\n<p>AI coding tools have evolved from \"impressive demo\" to \"I can't work without this\" in under two years. But there's a wide gap between using AI to autocomplete lines and building a genuine human-AI development workflow. This guide covers the tools and the workflow.</p>\n<h2>The Tool Landscape (2026)</h2>\n<table>\n<thead>\n<tr>\n<th>Tool</th>\n<th>Strengths</th>\n<th>Best For</th>\n<th>Price</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>GitHub Copilot</strong></td>\n<td>In-editor completions, chat, agents (Copilot Extensions)</td>\n<td>General coding. Best IDE integration.</td>\n<td>$10/mo (Individual)</td>\n</tr>\n<tr>\n<td><strong>Cursor</strong></td>\n<td>AI-native editor, Tab multi-line edits, Composer for multi-file changes</td>\n<td>Greenfield projects, rapid prototyping.</td>\n<td>Free / $20/mo</td>\n</tr>\n<tr>\n<td><strong>Claude Code</strong></td>\n<td>Terminal-based agent, understands entire repos, runs commands</td>\n<td>Complex refactoring, debugging, PR reviews.</td>\n<td>API usage / $20/mo (Pro)</td>\n</tr>\n<tr>\n<td><strong>ChatGPT Code Interpreter</strong></td>\n<td>Data analysis, visualization, file processing</td>\n<td>Data science, CSV/JSON manipulation.</td>\n<td>Free / $20/mo</td>\n</tr>\n<tr>\n<td><strong>Continue.dev</strong></td>\n<td>Open-source, bring-your-own-model</td>\n<td>Privacy-focused, custom models.</td>\n<td>Free</td>\n</tr>\n</tbody>\n</table>\n<h2>How to Actually Use AI When Coding</h2>\n<h3>1. Use AI for Boilerplate and Repetition</h3>\n<p>AI is excellent at generating repetitive code — CRUD endpoints, unit tests, form components, data models. Describe the pattern once, let AI generate the rest. This is where you'll see the biggest time savings.</p>\n<h3>2. Use AI to Explore Unfamiliar Codebases</h3>\n<p>Point Claude Code at a new repo and ask \"What's the authentication flow?\" or \"Where is error handling for database connections?\" AI that can read your whole codebase is dramatically more useful than AI that only sees one file.</p>\n<h3>3. Use AI for First Drafts, Not Final Code</h3>\n<p>The best workflow: AI writes a first draft → you review and refine → AI writes tests → you verify edge cases. Think of AI as an extremely fast junior developer who never gets tired but sometimes hallucinates.</p>\n<h3>4. Don't Use AI for Architecture Decisions</h3>\n<p>AI can explain trade-offs between approaches, but it shouldn't make the final call. It doesn't understand your team's dynamics, your users' needs, or your business constraints.</p>\n<h2>Common Pitfalls</h2>\n<ul>\n<li><strong>Trusting AI-generated code without review.</strong> AI makes plausible-looking mistakes. Always understand what the code does before committing.</li>\n<li><strong>Letting AI write tests for code it also wrote.</strong> If the AI misunderstood the requirement, the test will encode the same misunderstanding. Write the test yourself for critical business logic.</li>\n<li><strong>Pasting entire files into chat.</strong> This is slow and error-prone. Use tools that read your codebase directly (Claude Code, Cursor).</li>\n<li><strong>Over-relying on AI as a beginner.</strong> If you're learning, write the code yourself first. Use AI to explain concepts and review your work, not to do the work for you.</li>\n</ul>\n<h2>Building a Productive Workflow</h2>\n<ol>\n<li><strong>Plan in plain English.</strong> Describe what you want to build before writing code.</li>\n<li><strong>Generate the scaffold.</strong> Let AI create the file structure, boilerplate, and initial implementation.</li>\n<li><strong>Review and refine.</strong> Read every line. Refactor anything unclear. Add error handling.</li>\n<li><strong>Write tests.</strong> Tests prove the code works and serve as documentation.</li>\n<li><strong>Iterate.</strong> Ask AI to add features, fix bugs, or refactor — in small, reviewable steps.</li>\n</ol>\n<p><strong>See also:</strong> <a href=\"/en/ai/claude-vs-chatgpt.html\">Claude vs ChatGPT (2026): Which AI Assistant Is Right for You?</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a>, <a href=\"/en/ai/chatgpt-vs-claude-vs-gemini-api.html\">ChatGPT API vs Claude API vs Gemini API: Developer Comparison (2026)</a></p>",
      "summary": "全面对比 GitHub Copilot、Cursor、Claude Code 等 AI 编程工具，教你建立人机协作的高效开发工作流，避免 AI 写代码的常见陷阱。",
      "date_published": "2026-05-19",
      "date_modified": "2026-05-19",
      "tags": [
        "AI编程",
        "GitHub Copilot",
        "Claude Code"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/no-code-ai-chatbot.html",
      "url": "https://aidev.fit/en/ai/no-code-ai-chatbot.html",
      "title": "零代码搭建 AI 聊天机器人：客服、知识库、个人助手",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "手把手用 Dify/Coze/Botpress 搭建 RAG 驱动的智能对话机器人，无需一行代码，上传文档即可拥有专属 AI 助手。",
      "date_published": "2026-05-18",
      "date_modified": "2026-05-18",
      "tags": [
        "AI聊天机器人",
        "零代码",
        "RAG"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/ai-agent-development-2026.html",
      "url": "https://aidev.fit/en/ai/ai-agent-development-2026.html",
      "title": "AI Agent 开发入门 2026：从原理到第一个智能体",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "AI Agent 是 2026 年最热的开发方向。本文从原理、框架选型到完整代码示例，手把手教你开发第一个能自主执行任务的 AI 智能体。",
      "date_published": "2026-05-11",
      "date_modified": "2026-05-11",
      "tags": [
        "AI Agent",
        "AI开发",
        "LLM应用",
        "教程"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/saas-idea-validation.html",
      "url": "https://aidev.fit/en/sidehustle/saas-idea-validation.html",
      "title": "SaaS 创意验证：不写代码也能测试你的Idea能不能赚钱",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "90% 的 SaaS 产品死于没人要。本文教你用 Landing Page 测试、模拟门铃、电梯测试等方法，在写代码前就验证产品想法，避免浪费数月开发。",
      "date_published": "2026-05-01",
      "date_modified": "2026-05-01",
      "tags": [
        "SaaS",
        "创意验证",
        "独立开发者",
        "创业"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/frontend-framework-comparison-2026.html",
      "url": "https://aidev.fit/en/tech/frontend-framework-comparison-2026.html",
      "title": "2026 前端框架对比：React vs Vue vs Svelte vs Solid 怎么选",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "React、Vue、Svelte、Solid.js 四大前端框架 2026 年深度横评：性能、生态、学习曲线、AI 工具支持、适用场景全方位对比，帮你做出正确的技术选型。",
      "date_published": "2026-04-28",
      "date_modified": "2026-04-28",
      "tags": [
        "前端框架",
        "React",
        "Vue",
        "Svelte",
        "Solid",
        "对比评测"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/docker-quickstart.html",
      "url": "https://aidev.fit/en/tech/docker-quickstart.html",
      "title": "Docker 30 分钟入门：从安装到第一个容器",
      "content_text": "Docker in 30 Minutes: From Install to First Container Docker lets you package your application with everything it needs into a lightweight container that runs anywhere. No more \"it works on my machine.\" Let's get you from zero to a running container in 30 minutes. What Problem Does Docker Solve? Before Docker: you install Python 3.11, your teammate uses 3.10, the server runs 3.9. Your app uses PostgreSQL 15, but production is on 14. Dependency hell. Docker wraps your app AND its exact environment into one portable unit — a container. Installation Download Docker Desktop from docker.com . It includes Docker Engine, CLI, Docker Compose, and a GUI dashboard. Verify: docker --version docker run hello-world # should print a welcome message Core Concepts Concept What It Is Analogy Image A blueprint — the files, dependencies, and config A recipe Container A running instance of an image The dish you cooked Dockerfile Instructions to build an image The recipe card Docker Hub Public registry of images GitHub for container images Volume Persistent storage outside the container An external hard drive Your First Container # Run nginx web server in a container docker run -d -p 8080:80 --name my-nginx nginx # Visit http://localhost:8080 — you&#39;ll see the nginx welcome page! # What&#39;s running? docker ps # Stop it docker stop my-nginx # Remove it docker rm my-nginx Writing a Dockerfile Create a simple Python app: # app.py from flask import Flask app = Flask ( __name__ ) @app . route ( &#39;/&#39; ) def home (): return &#39;Hello from Docker!&#39; if __name__ == &#39;__main__&#39; : app . run ( host = &#39;0.0.0.0&#39; , port = 5000 ) # Dockerfile FROM python : 3.12 - slim # start from a Python image WORKDIR / app # set working directory COPY requirements . txt . # copy dependency list RUN pip install - r requirements . txt COPY . . # copy everything else EXPOSE 5000 # document what port we use CMD [ &quot;python&quot; , &quot;app.py&quot; ] # what to run on start # requirements.txt flask == 3.1.0 # Build and run docker build - t my - python - app . docker run - d - p 5000 : 5000 my - python - app Essential Commands docker ps # list running containers docker ps - a # list ALL containers docker images # list images docker logs &lt; container &gt; # view logs docker exec - it &lt; c &gt; bash # shell into a running container docker rm &lt; container &gt; # remove a container docker rmi &lt; image &gt; # remove an image docker system prune - a # clean up everything unused Docker Compose (Multi-Container Apps) # docker-compose.yml version : &#39;3.8&#39; services : web : build : . ports : - &quot;5000:5000&quot; depends_on : - db db : image : postgres : 16 environment : POSTGRES_PASSWORD : secret volumes : - pgdata : / var / lib / postgresql / data volumes : pgdata : docker compose up - d # start everything docker compose down # stop everything Docker vs VM Containers share the host OS kernel, so they start in milliseconds and use minimal RAM. VMs each need their own OS, taking gigabytes. For most web apps, Docker is the clear winner. See also: Rust for JavaScript Developers: Complete Learning Path (2026) , Dockerfile Best Practices for Production , Infrastructure Testing with Terratest and Other Tools",
      "content_html": "<h1>Docker in 30 Minutes: From Install to First Container</h1>\n<p>Docker lets you package your application with everything it needs into a lightweight container that runs anywhere. No more \"it works on my machine.\" Let's get you from zero to a running container in 30 minutes.</p>\n<h2>What Problem Does Docker Solve?</h2>\n<p>Before Docker: you install Python 3.11, your teammate uses 3.10, the server runs 3.9. Your app uses PostgreSQL 15, but production is on 14. Dependency hell. Docker wraps your app AND its exact environment into one portable unit — a container.</p>\n<h2>Installation</h2>\n<p>Download <strong>Docker Desktop</strong> from <a href=\"https://docker.com/products/docker-desktop\">docker.com</a>. It includes Docker Engine, CLI, Docker Compose, and a GUI dashboard. Verify:</p>\n<div class=\"codehilite\"><pre><span></span><code>docker --version\ndocker run hello-world   # should print a welcome message\n</code></pre></div>\n\n<h2>Core Concepts</h2>\n<table>\n<thead>\n<tr>\n<th>Concept</th>\n<th>What It Is</th>\n<th>Analogy</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Image</strong></td>\n<td>A blueprint — the files, dependencies, and config</td>\n<td>A recipe</td>\n</tr>\n<tr>\n<td><strong>Container</strong></td>\n<td>A running instance of an image</td>\n<td>The dish you cooked</td>\n</tr>\n<tr>\n<td><strong>Dockerfile</strong></td>\n<td>Instructions to build an image</td>\n<td>The recipe card</td>\n</tr>\n<tr>\n<td><strong>Docker Hub</strong></td>\n<td>Public registry of images</td>\n<td>GitHub for container images</td>\n</tr>\n<tr>\n<td><strong>Volume</strong></td>\n<td>Persistent storage outside the container</td>\n<td>An external hard drive</td>\n</tr>\n</tbody>\n</table>\n<h2>Your First Container</h2>\n<div class=\"codehilite\"><pre><span></span><code># Run nginx web server in a container\ndocker run -d -p 8080:80 --name my-nginx nginx\n\n# Visit http://localhost:8080 — you&#39;ll see the nginx welcome page!\n\n# What&#39;s running?\ndocker ps\n\n# Stop it\ndocker stop my-nginx\n\n# Remove it\ndocker rm my-nginx\n</code></pre></div>\n\n<h2>Writing a Dockerfile</h2>\n<p>Create a simple Python app:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\"># app.py</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">flask</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Flask</span>\n<span class=\"n\">app</span> <span class=\"o\">=</span> <span class=\"n\">Flask</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n\n<span class=\"nd\">@app</span><span class=\"o\">.</span><span class=\"n\">route</span><span class=\"p\">(</span><span class=\"s1\">&#39;/&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">home</span><span class=\"p\">():</span>\n    <span class=\"k\">return</span> <span class=\"s1\">&#39;Hello from Docker!&#39;</span>\n\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;__main__&#39;</span><span class=\"p\">:</span>\n    <span class=\"n\">app</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">(</span><span class=\"n\">host</span><span class=\"o\">=</span><span class=\"s1\">&#39;0.0.0.0&#39;</span><span class=\"p\">,</span> <span class=\"n\">port</span><span class=\"o\">=</span><span class=\"mi\">5000</span><span class=\"p\">)</span>\n\n\n<span class=\"c1\"># Dockerfile</span>\n<span class=\"n\">FROM</span> <span class=\"n\">python</span><span class=\"p\">:</span><span class=\"mf\">3.12</span><span class=\"o\">-</span><span class=\"n\">slim</span>          <span class=\"c1\"># start from a Python image</span>\n<span class=\"n\">WORKDIR</span> <span class=\"o\">/</span><span class=\"n\">app</span>                    <span class=\"c1\"># set working directory</span>\n<span class=\"n\">COPY</span> <span class=\"n\">requirements</span><span class=\"o\">.</span><span class=\"n\">txt</span> <span class=\"o\">.</span>         <span class=\"c1\"># copy dependency list</span>\n<span class=\"n\">RUN</span> <span class=\"n\">pip</span> <span class=\"n\">install</span> <span class=\"o\">-</span><span class=\"n\">r</span> <span class=\"n\">requirements</span><span class=\"o\">.</span><span class=\"n\">txt</span>\n<span class=\"n\">COPY</span> <span class=\"o\">.</span> <span class=\"o\">.</span>                        <span class=\"c1\"># copy everything else</span>\n<span class=\"n\">EXPOSE</span> <span class=\"mi\">5000</span>                     <span class=\"c1\"># document what port we use</span>\n<span class=\"n\">CMD</span> <span class=\"p\">[</span><span class=\"s2\">&quot;python&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;app.py&quot;</span><span class=\"p\">]</span>        <span class=\"c1\"># what to run on start</span>\n\n\n<span class=\"c1\"># requirements.txt</span>\n<span class=\"n\">flask</span><span class=\"o\">==</span><span class=\"mf\">3.1.0</span>\n\n\n<span class=\"c1\"># Build and run</span>\n<span class=\"n\">docker</span> <span class=\"n\">build</span> <span class=\"o\">-</span><span class=\"n\">t</span> <span class=\"n\">my</span><span class=\"o\">-</span><span class=\"n\">python</span><span class=\"o\">-</span><span class=\"n\">app</span> <span class=\"o\">.</span>\n<span class=\"n\">docker</span> <span class=\"n\">run</span> <span class=\"o\">-</span><span class=\"n\">d</span> <span class=\"o\">-</span><span class=\"n\">p</span> <span class=\"mi\">5000</span><span class=\"p\">:</span><span class=\"mi\">5000</span> <span class=\"n\">my</span><span class=\"o\">-</span><span class=\"n\">python</span><span class=\"o\">-</span><span class=\"n\">app</span>\n</code></pre></div>\n\n<h2>Essential Commands</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">ps</span><span class=\"w\">                  </span>#<span class=\"w\"> </span><span class=\"nv\">list</span><span class=\"w\"> </span><span class=\"nv\">running</span><span class=\"w\"> </span><span class=\"nv\">containers</span>\n<span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">ps</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">a</span><span class=\"w\">               </span>#<span class=\"w\"> </span><span class=\"nv\">list</span><span class=\"w\"> </span><span class=\"nv\">ALL</span><span class=\"w\"> </span><span class=\"nv\">containers</span>\n<span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">images</span><span class=\"w\">              </span>#<span class=\"w\"> </span><span class=\"nv\">list</span><span class=\"w\"> </span><span class=\"nv\">images</span>\n<span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">logs</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"nv\">container</span><span class=\"o\">&gt;</span><span class=\"w\">    </span>#<span class=\"w\"> </span><span class=\"nv\">view</span><span class=\"w\"> </span><span class=\"nv\">logs</span>\n<span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"k\">exec</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">it</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"nv\">c</span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"nv\">bash</span><span class=\"w\">   </span>#<span class=\"w\"> </span><span class=\"nv\">shell</span><span class=\"w\"> </span><span class=\"nv\">into</span><span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"w\"> </span><span class=\"nv\">running</span><span class=\"w\"> </span><span class=\"nv\">container</span>\n<span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">rm</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"nv\">container</span><span class=\"o\">&gt;</span><span class=\"w\">      </span>#<span class=\"w\"> </span><span class=\"nv\">remove</span><span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"w\"> </span><span class=\"nv\">container</span>\n<span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">rmi</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"nv\">image</span><span class=\"o\">&gt;</span><span class=\"w\">         </span>#<span class=\"w\"> </span><span class=\"nv\">remove</span><span class=\"w\"> </span><span class=\"nv\">an</span><span class=\"w\"> </span><span class=\"nv\">image</span>\n<span class=\"nv\">docker</span><span class=\"w\"> </span><span class=\"nv\">system</span><span class=\"w\"> </span><span class=\"nv\">prune</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">a</span><span class=\"w\">     </span>#<span class=\"w\"> </span><span class=\"nv\">clean</span><span class=\"w\"> </span><span class=\"nv\">up</span><span class=\"w\"> </span><span class=\"nv\">everything</span><span class=\"w\"> </span><span class=\"nv\">unused</span>\n</code></pre></div>\n\n<h2>Docker Compose (Multi-Container Apps)</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"c1\"># docker-compose.yml</span>\n<span class=\"n\">version</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">&#39;3.8&#39;</span>\n<span class=\"n\">services</span><span class=\"p\">:</span>\n<span class=\"w\">  </span><span class=\"n\">web</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><span class=\"n\">build</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"o\">.</span>\n<span class=\"w\">    </span><span class=\"n\">ports</span><span class=\"p\">:</span>\n<span class=\"w\">      </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"s2\">&quot;5000:5000&quot;</span>\n<span class=\"w\">    </span><span class=\"n\">depends_on</span><span class=\"p\">:</span>\n<span class=\"w\">      </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">db</span>\n<span class=\"w\">  </span><span class=\"n\">db</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><span class=\"n\">image</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">postgres</span><span class=\"p\">:</span><span class=\"mi\">16</span>\n<span class=\"w\">    </span><span class=\"n\">environment</span><span class=\"p\">:</span>\n<span class=\"w\">      </span><span class=\"n\">POSTGRES_PASSWORD</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"n\">secret</span>\n<span class=\"w\">    </span><span class=\"n\">volumes</span><span class=\"p\">:</span>\n<span class=\"w\">      </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">pgdata</span><span class=\"p\">:</span><span class=\"o\">/</span><span class=\"k\">var</span><span class=\"o\">/</span><span class=\"n\">lib</span><span class=\"o\">/</span><span class=\"n\">postgresql</span><span class=\"o\">/</span><span class=\"n\">data</span>\n\n<span class=\"n\">volumes</span><span class=\"p\">:</span>\n<span class=\"w\">  </span><span class=\"n\">pgdata</span><span class=\"p\">:</span>\n\n\n<span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">compose</span><span class=\"w\"> </span><span class=\"n\">up</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">d</span><span class=\"w\">       </span><span class=\"c1\"># start everything</span>\n<span class=\"n\">docker</span><span class=\"w\"> </span><span class=\"n\">compose</span><span class=\"w\"> </span><span class=\"n\">down</span><span class=\"w\">        </span><span class=\"c1\"># stop everything</span>\n</code></pre></div>\n\n<h2>Docker vs VM</h2>\n<p>Containers share the host OS kernel, so they start in milliseconds and use minimal RAM. VMs each need their own OS, taking gigabytes. For most web apps, Docker is the clear winner.</p>\n<p><strong>See also:</strong> <a href=\"/en/tech/rust-for-javascript-developers.html\">Rust for JavaScript Developers: Complete Learning Path (2026)</a>, <a href=\"/en/tech/dockerfile-best-practices.html\">Dockerfile Best Practices for Production</a>, <a href=\"/en/tech/infrastructure-testing.html\">Infrastructure Testing with Terratest and Other Tools</a></p>",
      "summary": "零基础 Docker 入门教程，30 分钟掌握镜像、容器、Dockerfile 核心概念，亲手构建并运行你的第一个容器化应用。",
      "date_published": "2026-04-22",
      "date_modified": "2026-04-22",
      "tags": [
        "Docker",
        "容器",
        "DevOps"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/midjourney-prompts.html",
      "url": "https://aidev.fit/en/ai/midjourney-prompts.html",
      "title": "Midjourney 提示词大全：从入门到进阶",
      "content_text": "Midjourney Prompt Guide: From Basics to Pro-Level Images Midjourney v7 produces stunning images, but only if you speak its language. This guide covers the prompt structure that consistently produces professional results, plus battle-tested templates you can copy and adapt. Prompt Structure A well-formed Midjourney prompt has four parts: [Subject] + [Style/Medium] + [Lighting/Composition] + [Parameters] Example : Portrait of a female cyberpunk character, digital art style by WLOP and Artgerm, neon lighting with rim light from the side, cinematic composition --ar 2 : 3 --stylize 250 --v 7 The Parameters That Matter Parameter What It Does Recommendation --ar &lt;w&gt;:&lt;h&gt; Aspect ratio 2:3 for portraits, 16:9 for landscapes, 1:1 for social media --stylize &lt;0-1000&gt; Artistic flair vs prompt accuracy 100-250 for realistic, 500-750 for artistic --chaos &lt;0-100&gt; Variation between the 4 images 0 for consistency, 30-50 for exploration, 80+ for wild ideas --weird &lt;0-3000&gt; Unconventional/experimental results 0 for normal, 500+ for creative/abstract --no &lt;element&gt; Negative prompt --no text, watermark, signature, blurry 10 Battle-Tested Prompt Templates 1. Professional Portrait Portrait of a [ age ] [ gender ] [ profession ] , [ setting ] , soft natural lighting , shot on 85 mm f / 1.4 , shallow depth of field , professional headshot style --ar 2:3 --stylize 150 2. Product Photography [ Product ] on a [ color ] backdrop , product photography style , studio lighting with soft shadows , clean and minimal , shot with macro lens , commercial photography --ar 1:1 --stylize 100 3. Logo Design Minimalist logo for [ company / type ], vector style , flat design , [ specific symbols / elements ], [ color palette ], white background , suitable for app icon -- ar 1 : 1 -- stylize 50 4. Architectural Visualization [ Building type ] architecture , [ style ] design , golden hour lighting , photorealistic 3 D render , wide - angle lens , surrounded by [ environment ], architectural photography -- ar 16 : 9 -- stylize 200 5. Food Photography [ Dish name ], overhead flat lay , natural window lighting , styled with [ props / herbs ], shallow depth of field , food photography , appetizing , vibrant colors -- ar 4 : 5 -- stylize 100 6. Fantasy Landscape Epic fantasy landscape , [ specific features ], concept art by [ artist reference ], atmospheric lighting with god rays , cinematic composition , 8 K ultra detailed -- ar 16 : 9 -- stylize 500 7. UI/UX Mockup [ App type ] mobile app design , clean UI , modern minimal interface , [ color scheme ], glassmorphism style , Dribbble featured , dark mode , figma design -- ar 9 : 16 -- stylize 80 8. Character Design [ Character description ], character design sheet , multiple views ( front , side , back ), [ art style ], clean linework , flat colors , concept art , turnaround reference -- ar 16 : 9 -- stylize 200 9. Isometric Illustration Isometric illustration of a [ scene / room / building ], [ color palette ], clean vector style , 3 D isometric view , detailed interior , pastel colors , soft shadows , illustration -- ar 1 : 1 -- stylize 150 10. Cinematic Scene [ Scene description ], cinematic shot , [ lighting description ], movie still from [ reference director / film ], anamorphic lens , film grain , color graded -- ar 21 : 9 -- stylize 300 Pro Tips Use artist references sparingly. One or two references sharpen the style. Three or more create visual chaos. Describe what you want, not what you don't want. Use --no for 1-2 things max. Focus on positive description. Vary one thing at a time. When experimenting, change one parameter at a time so you know what caused the difference. Save your best prompts. Good prompts are assets. Build a personal library organized by category. See also: Advanced Prompt Engineering: Techniques That Actually Work for Developers , LLM Cost Optimization: Cut Your AI API Bills by 50-80% (2026 Guide) , Prompt Engineering: From Beginner to Expert",
      "content_html": "<h1>Midjourney Prompt Guide: From Basics to Pro-Level Images</h1>\n<p>Midjourney v7 produces stunning images, but only if you speak its language. This guide covers the prompt structure that consistently produces professional results, plus battle-tested templates you can copy and adapt.</p>\n<h2>Prompt Structure</h2>\n<p>A well-formed Midjourney prompt has four parts:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"k\">[Subject] + [Style/Medium] + [Lighting/Composition] + [Parameters]</span>\n\n<span class=\"na\">Example</span><span class=\"o\">:</span>\n<span class=\"na\">Portrait of a female cyberpunk character, digital art style by</span>\n<span class=\"na\">WLOP and Artgerm, neon lighting with rim light from the side,</span>\n<span class=\"na\">cinematic composition --ar 2</span><span class=\"o\">:</span><span class=\"s\">3 --stylize 250 --v 7</span>\n</code></pre></div>\n\n<h2>The Parameters That Matter</h2>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>What It Does</th>\n<th>Recommendation</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>--ar &lt;w&gt;:&lt;h&gt;</code></td>\n<td>Aspect ratio</td>\n<td>2:3 for portraits, 16:9 for landscapes, 1:1 for social media</td>\n</tr>\n<tr>\n<td><code>--stylize &lt;0-1000&gt;</code></td>\n<td>Artistic flair vs prompt accuracy</td>\n<td>100-250 for realistic, 500-750 for artistic</td>\n</tr>\n<tr>\n<td><code>--chaos &lt;0-100&gt;</code></td>\n<td>Variation between the 4 images</td>\n<td>0 for consistency, 30-50 for exploration, 80+ for wild ideas</td>\n</tr>\n<tr>\n<td><code>--weird &lt;0-3000&gt;</code></td>\n<td>Unconventional/experimental results</td>\n<td>0 for normal, 500+ for creative/abstract</td>\n</tr>\n<tr>\n<td><code>--no &lt;element&gt;</code></td>\n<td>Negative prompt</td>\n<td><code>--no text, watermark, signature, blurry</code></td>\n</tr>\n</tbody>\n</table>\n<h2>10 Battle-Tested Prompt Templates</h2>\n<h3>1. Professional Portrait</h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">Portrait</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">age</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">gender</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">profession</span><span class=\"o\">]</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">setting</span><span class=\"o\">]</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">soft</span><span class=\"w\"> </span><span class=\"k\">natural</span>\n<span class=\"n\">lighting</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">shot</span><span class=\"w\"> </span><span class=\"k\">on</span><span class=\"w\"> </span><span class=\"mi\">85</span><span class=\"n\">mm</span><span class=\"w\"> </span><span class=\"n\">f</span><span class=\"o\">/</span><span class=\"mf\">1.4</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">shallow</span><span class=\"w\"> </span><span class=\"k\">depth</span><span class=\"w\"> </span><span class=\"k\">of</span><span class=\"w\"> </span><span class=\"n\">field</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">professional</span>\n<span class=\"n\">headshot</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"c1\">--ar 2:3 --stylize 150</span>\n</code></pre></div>\n\n<h3>2. Product Photography</h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"o\">[</span><span class=\"n\">Product</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"k\">on</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"o\">[</span><span class=\"n\">color</span><span class=\"o\">]</span><span class=\"w\"> </span><span class=\"n\">backdrop</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">product</span><span class=\"w\"> </span><span class=\"n\">photography</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">studio</span>\n<span class=\"n\">lighting</span><span class=\"w\"> </span><span class=\"k\">with</span><span class=\"w\"> </span><span class=\"n\">soft</span><span class=\"w\"> </span><span class=\"n\">shadows</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">clean</span><span class=\"w\"> </span><span class=\"ow\">and</span><span class=\"w\"> </span><span class=\"n\">minimal</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">shot</span><span class=\"w\"> </span><span class=\"k\">with</span><span class=\"w\"> </span><span class=\"n\">macro</span><span class=\"w\"> </span><span class=\"n\">lens</span><span class=\"p\">,</span>\n<span class=\"n\">commercial</span><span class=\"w\"> </span><span class=\"n\">photography</span><span class=\"w\"> </span><span class=\"c1\">--ar 1:1 --stylize 100</span>\n</code></pre></div>\n\n<h3>3. Logo Design</h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">Minimalist</span><span class=\"w\"> </span><span class=\"n\">logo</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">company</span><span class=\"o\">/</span><span class=\"n\">type</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">vector</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">flat</span><span class=\"w\"> </span><span class=\"n\">design</span><span class=\"p\">,</span>\n<span class=\"p\">[</span><span class=\"n\">specific</span><span class=\"w\"> </span><span class=\"n\">symbols</span><span class=\"o\">/</span><span class=\"n\">elements</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"n\">palette</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">white</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"p\">,</span>\n<span class=\"n\">suitable</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"n\">app</span><span class=\"w\"> </span><span class=\"n\">icon</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">ar</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"o\">:</span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">stylize</span><span class=\"w\"> </span><span class=\"mi\">50</span>\n</code></pre></div>\n\n<h3>4. Architectural Visualization</h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"p\">[</span><span class=\"n\">Building</span><span class=\"w\"> </span><span class=\"n\">type</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"n\">architecture</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">style</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"n\">design</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">golden</span><span class=\"w\"> </span><span class=\"n\">hour</span><span class=\"w\"> </span><span class=\"n\">lighting</span><span class=\"p\">,</span>\n<span class=\"n\">photorealistic</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"n\">D</span><span class=\"w\"> </span><span class=\"n\">render</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">wide</span><span class=\"o\">-</span><span class=\"n\">angle</span><span class=\"w\"> </span><span class=\"n\">lens</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">surrounded</span><span class=\"w\"> </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">environment</span><span class=\"p\">],</span>\n<span class=\"n\">architectural</span><span class=\"w\"> </span><span class=\"n\">photography</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">ar</span><span class=\"w\"> </span><span class=\"mi\">16</span><span class=\"o\">:</span><span class=\"mi\">9</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">stylize</span><span class=\"w\"> </span><span class=\"mi\">200</span>\n</code></pre></div>\n\n<h3>5. Food Photography</h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"p\">[</span><span class=\"n\">Dish</span><span class=\"w\"> </span><span class=\"n\">name</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">overhead</span><span class=\"w\"> </span><span class=\"n\">flat</span><span class=\"w\"> </span><span class=\"n\">lay</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">natural</span><span class=\"w\"> </span><span class=\"n\">window</span><span class=\"w\"> </span><span class=\"n\">lighting</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">styled</span><span class=\"w\"> </span><span class=\"n\">with</span>\n<span class=\"p\">[</span><span class=\"n\">props</span><span class=\"o\">/</span><span class=\"n\">herbs</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">shallow</span><span class=\"w\"> </span><span class=\"n\">depth</span><span class=\"w\"> </span><span class=\"n\">of</span><span class=\"w\"> </span><span class=\"n\">field</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">food</span><span class=\"w\"> </span><span class=\"n\">photography</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">appetizing</span><span class=\"p\">,</span>\n<span class=\"n\">vibrant</span><span class=\"w\"> </span><span class=\"n\">colors</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">ar</span><span class=\"w\"> </span><span class=\"mi\">4</span><span class=\"o\">:</span><span class=\"mi\">5</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">stylize</span><span class=\"w\"> </span><span class=\"mi\">100</span>\n</code></pre></div>\n\n<h3>6. Fantasy Landscape</h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">Epic</span><span class=\"w\"> </span><span class=\"n\">fantasy</span><span class=\"w\"> </span><span class=\"n\">landscape</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">specific</span><span class=\"w\"> </span><span class=\"n\">features</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">concept</span><span class=\"w\"> </span><span class=\"n\">art</span><span class=\"w\"> </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">artist</span>\n<span class=\"n\">reference</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">atmospheric</span><span class=\"w\"> </span><span class=\"n\">lighting</span><span class=\"w\"> </span><span class=\"n\">with</span><span class=\"w\"> </span><span class=\"n\">god</span><span class=\"w\"> </span><span class=\"n\">rays</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">cinematic</span><span class=\"w\"> </span><span class=\"n\">composition</span><span class=\"p\">,</span>\n<span class=\"mi\">8</span><span class=\"n\">K</span><span class=\"w\"> </span><span class=\"n\">ultra</span><span class=\"w\"> </span><span class=\"n\">detailed</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">ar</span><span class=\"w\"> </span><span class=\"mi\">16</span><span class=\"o\">:</span><span class=\"mi\">9</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">stylize</span><span class=\"w\"> </span><span class=\"mi\">500</span>\n</code></pre></div>\n\n<h3>7. UI/UX Mockup</h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"p\">[</span><span class=\"n\">App</span><span class=\"w\"> </span><span class=\"n\">type</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"n\">mobile</span><span class=\"w\"> </span><span class=\"n\">app</span><span class=\"w\"> </span><span class=\"n\">design</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">clean</span><span class=\"w\"> </span><span class=\"n\">UI</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">modern</span><span class=\"w\"> </span><span class=\"n\">minimal</span><span class=\"w\"> </span><span class=\"n\">interface</span><span class=\"p\">,</span>\n<span class=\"p\">[</span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"n\">scheme</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">glassmorphism</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">Dribbble</span><span class=\"w\"> </span><span class=\"n\">featured</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">dark</span><span class=\"w\"> </span><span class=\"n\">mode</span><span class=\"p\">,</span>\n<span class=\"n\">figma</span><span class=\"w\"> </span><span class=\"n\">design</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">ar</span><span class=\"w\"> </span><span class=\"mi\">9</span><span class=\"o\">:</span><span class=\"mi\">16</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">stylize</span><span class=\"w\"> </span><span class=\"mi\">80</span>\n</code></pre></div>\n\n<h3>8. Character Design</h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"p\">[</span><span class=\"n\">Character</span><span class=\"w\"> </span><span class=\"n\">description</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">character</span><span class=\"w\"> </span><span class=\"n\">design</span><span class=\"w\"> </span><span class=\"n\">sheet</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">multiple</span><span class=\"w\"> </span><span class=\"n\">views</span>\n<span class=\"p\">(</span><span class=\"n\">front</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">side</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">back</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">art</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">clean</span><span class=\"w\"> </span><span class=\"n\">linework</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">flat</span><span class=\"w\"> </span><span class=\"n\">colors</span><span class=\"p\">,</span>\n<span class=\"n\">concept</span><span class=\"w\"> </span><span class=\"n\">art</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">turnaround</span><span class=\"w\"> </span><span class=\"n\">reference</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">ar</span><span class=\"w\"> </span><span class=\"mi\">16</span><span class=\"o\">:</span><span class=\"mi\">9</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">stylize</span><span class=\"w\"> </span><span class=\"mi\">200</span>\n</code></pre></div>\n\n<h3>9. Isometric Illustration</h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">Isometric</span><span class=\"w\"> </span><span class=\"n\">illustration</span><span class=\"w\"> </span><span class=\"n\">of</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">scene</span><span class=\"o\">/</span><span class=\"n\">room</span><span class=\"o\">/</span><span class=\"n\">building</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"n\">palette</span><span class=\"p\">],</span>\n<span class=\"n\">clean</span><span class=\"w\"> </span><span class=\"n\">vector</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"n\">D</span><span class=\"w\"> </span><span class=\"n\">isometric</span><span class=\"w\"> </span><span class=\"n\">view</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">detailed</span><span class=\"w\"> </span><span class=\"n\">interior</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">pastel</span>\n<span class=\"n\">colors</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">soft</span><span class=\"w\"> </span><span class=\"n\">shadows</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">illustration</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">ar</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"o\">:</span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">stylize</span><span class=\"w\"> </span><span class=\"mi\">150</span>\n</code></pre></div>\n\n<h3>10. Cinematic Scene</h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"p\">[</span><span class=\"n\">Scene</span><span class=\"w\"> </span><span class=\"n\">description</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">cinematic</span><span class=\"w\"> </span><span class=\"n\">shot</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">lighting</span><span class=\"w\"> </span><span class=\"n\">description</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">movie</span>\n<span class=\"n\">still</span><span class=\"w\"> </span><span class=\"n\">from</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"n\">reference</span><span class=\"w\"> </span><span class=\"n\">director</span><span class=\"o\">/</span><span class=\"n\">film</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">anamorphic</span><span class=\"w\"> </span><span class=\"n\">lens</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">film</span><span class=\"w\"> </span><span class=\"n\">grain</span><span class=\"p\">,</span>\n<span class=\"n\">color</span><span class=\"w\"> </span><span class=\"n\">graded</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">ar</span><span class=\"w\"> </span><span class=\"mi\">21</span><span class=\"o\">:</span><span class=\"mi\">9</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"n\">stylize</span><span class=\"w\"> </span><span class=\"mi\">300</span>\n</code></pre></div>\n\n<h2>Pro Tips</h2>\n<ul>\n<li><strong>Use artist references sparingly.</strong> One or two references sharpen the style. Three or more create visual chaos.</li>\n<li><strong>Describe what you want, not what you don't want.</strong> Use <code>--no</code> for 1-2 things max. Focus on positive description.</li>\n<li><strong>Vary one thing at a time.</strong> When experimenting, change one parameter at a time so you know what caused the difference.</li>\n<li><strong>Save your best prompts.</strong> Good prompts are assets. Build a personal library organized by category.</li>\n</ul>\n<p><strong>See also:</strong> <a href=\"/en/ai/prompt-engineering-advanced.html\">Advanced Prompt Engineering: Techniques That Actually Work for Developers</a>, <a href=\"/en/ai/llm-cost-optimization.html\">LLM Cost Optimization: Cut Your AI API Bills by 50-80% (2026 Guide)</a>, <a href=\"/en/ai/prompt-engineering.html\">Prompt Engineering: From Beginner to Expert</a></p>",
      "summary": "系统整理 Midjourney 提示词结构、参数体系与风格参考，附赠 10 套实战验证的提示词模板，涵盖写实人像、Logo 设计、产品摄影等高频场景。",
      "date_published": "2026-04-22",
      "date_modified": "2026-05-14",
      "tags": [
        "Midjourney",
        "AI绘画",
        "提示词"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/langchain-intro.html",
      "url": "https://aidev.fit/en/ai/langchain-intro.html",
      "title": "LangChain 入门：构建你的第一个 AI 应用",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "深入浅出讲解 LangChain 核心概念（Chain、Agent、Tool、Memory），用可运行的 RAG 问答代码示例带你写出第一个 LLM 应用。",
      "date_published": "2026-04-22",
      "date_modified": "2026-04-22",
      "tags": [
        "LangChain",
        "AI开发",
        "LLM应用"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/stable-diffusion.html",
      "url": "https://aidev.fit/en/ai/stable-diffusion.html",
      "title": "Stable Diffusion 出图入门指南",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "零基础入门 Stable Diffusion，详解 Checkpoint、Sampler、Steps、CFG Scale 等核心参数，手把手教你从安装到出第一张高质量图片。",
      "date_published": "2026-04-17",
      "date_modified": "2026-04-17",
      "tags": [
        "Stable Diffusion",
        "AI绘画",
        "开源"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/prompt-engineering.html",
      "url": "https://aidev.fit/en/ai/prompt-engineering.html",
      "title": "ChatGPT 提示词工程入门：从新手到高手",
      "content_text": "Prompt Engineering: From Beginner to Expert Prompt engineering isn't about memorizing magic phrases — it's about clearly communicating what you want, how you want it, and what context the AI needs. Master these fundamentals and you'll get dramatically better results from any LLM. The Five Elements of a Good Prompt Every effective prompt has some combination of these five elements: Role — Who is the AI? \"You are a senior software engineer reviewing code for security vulnerabilities.\" Task — What exactly should it do? \"Find SQL injection vulnerabilities in the following code.\" Context — What background matters? \"This code runs in a Node.js/Express backend with PostgreSQL.\" Format — How should the output look? \"List each vulnerability with: location, severity, and fix.\" Constraints — What are the boundaries? \"Only flag HIGH or CRITICAL severity issues. Ignore style concerns.\" Before/After: The Same Request, Different Results Bad Prompt Write a blog post about Docker. Result: Generic 200-word overview that reads like a Wikipedia article. Useless. Good Prompt You are a senior DevOps engineer writing for an audience of junior developers who have never used containers . Write a blog post titled &quot;Docker in 30 Minutes: From Zero to First Container.&quot; Use a friendly , conversational tone . Every concept should include a hands-on code example . Structure it as: 1 . What problem Docker solves ( 1 paragraph ) 2 . Installation ( 2 sentences + command ) 3 . Core concepts ( image , container , Dockerfile — with analogies ) 4 . Your first container ( step-by-step walkthrough ) 5 . Common gotchas ( bullet points ) Keep the post under 800 words . Use simple English — if a high school student wouldn&#39;t understand a sentence , rewrite it . Result: A focused, practical tutorial that the target audience would actually find useful. Key Techniques 1. Chain of Thought Ask the model to think step by step before answering. This dramatically improves accuracy on reasoning tasks: Q: A bat and a ball cost $1.10 total. The bat costs $1.00 more than the ball. How much does the ball cost? Think through this step by step before giving the final answer. 2. Few-Shot Prompting Show 2-3 examples of what you want: Convert these sentences to active voice: Input: The bug was found by the QA team. Output: The QA team found the bug. Input: The deployment was completed by the DevOps engineer. Output: 3. Iterative Refinement Your first prompt rarely produces a perfect result. Use the conversation like a designer briefing a junior: Start broad: \"Write a Python script that processes CSV files.\" Add constraints: \"The CSV has headers. Skip empty lines. Handle FileNotFoundError.\" Refine output: \"Make the error messages user-friendly. Add a progress bar.\" Common Mistakes Being too vague — \"Write something about AI\" tells the model nothing. Be specific about topic, audience, format, and tone. Asking for too much at once — A 5,000-word article with 10 sections will be shallow. Ask for one section at a time. Not providing examples — When you care about format or style, show 1-2 examples. It's the most efficient way to communicate what you want. Accepting the first answer — The first response is a draft. Push back: \"Make it more concise\" or \"That analogy doesn't work — try another one.\" See also: Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama , MCP (Model Context Protocol) Complete Guide: The Standard Connecting AI to Your Tools , How to Build a Custom GPT Plugin: Complete Developer Guide",
      "content_html": "<h1>Prompt Engineering: From Beginner to Expert</h1>\n<p>Prompt engineering isn't about memorizing magic phrases — it's about clearly communicating what you want, how you want it, and what context the AI needs. Master these fundamentals and you'll get dramatically better results from any LLM.</p>\n<h2>The Five Elements of a Good Prompt</h2>\n<p>Every effective prompt has some combination of these five elements:</p>\n<ol>\n<li><strong>Role</strong> — Who is the AI? \"You are a senior software engineer reviewing code for security vulnerabilities.\"</li>\n<li><strong>Task</strong> — What exactly should it do? \"Find SQL injection vulnerabilities in the following code.\"</li>\n<li><strong>Context</strong> — What background matters? \"This code runs in a Node.js/Express backend with PostgreSQL.\"</li>\n<li><strong>Format</strong> — How should the output look? \"List each vulnerability with: location, severity, and fix.\"</li>\n<li><strong>Constraints</strong> — What are the boundaries? \"Only flag HIGH or CRITICAL severity issues. Ignore style concerns.\"</li>\n</ol>\n<h2>Before/After: The Same Request, Different Results</h2>\n<h3>Bad Prompt</h3>\n<div class=\"codehilite\"><pre><span></span><code>Write a blog post about Docker.\n</code></pre></div>\n\n<p><strong>Result:</strong> Generic 200-word overview that reads like a Wikipedia article. Useless.</p>\n<h3>Good Prompt</h3>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">You</span> <span class=\"n\">are</span> <span class=\"n\">a</span> <span class=\"n\">senior</span> <span class=\"n\">DevOps</span> <span class=\"n\">engineer</span> <span class=\"n\">writing</span> <span class=\"k\">for</span> <span class=\"n\">an</span> <span class=\"n\">audience</span> <span class=\"nb\">of</span> <span class=\"n\">junior</span>\n<span class=\"n\">developers</span> <span class=\"n\">who</span> <span class=\"n\">have</span> <span class=\"n\">never</span> <span class=\"n\">used</span> <span class=\"n\">containers</span>.\n\n<span class=\"n\">Write</span> <span class=\"n\">a</span> <span class=\"n\">blog</span> <span class=\"n\">post</span> <span class=\"n\">titled</span> <span class=\"s\">&quot;Docker in 30 Minutes: From Zero to First</span>\n<span class=\"s\">Container.&quot;</span> <span class=\"n\">Use</span> <span class=\"n\">a</span> <span class=\"n\">friendly</span>, <span class=\"n\">conversational</span> <span class=\"n\">tone</span>. <span class=\"n\">Every</span> <span class=\"n\">concept</span> <span class=\"n\">should</span>\n<span class=\"n\">include</span> <span class=\"n\">a</span> <span class=\"n\">hands-on</span> <span class=\"nb\">code</span> <span class=\"n\">example</span>. <span class=\"n\">Structure</span> <span class=\"n\">it</span> <span class=\"n\">as:</span>\n\n<span class=\"mi\">1</span>. <span class=\"n\">What</span> <span class=\"n\">problem</span> <span class=\"n\">Docker</span> <span class=\"n\">solves</span> (<span class=\"mi\">1</span> <span class=\"n\">paragraph</span>)\n<span class=\"mi\">2</span>. <span class=\"n\">Installation</span> (<span class=\"mi\">2</span> <span class=\"n\">sentences</span> + <span class=\"nb\">command</span>)\n<span class=\"mi\">3</span>. <span class=\"n\">Core</span> <span class=\"n\">concepts</span> (<span class=\"n\">image</span>, <span class=\"n\">container</span>, <span class=\"n\">Dockerfile</span> — <span class=\"k\">with</span> <span class=\"n\">analogies</span>)\n<span class=\"mi\">4</span>. <span class=\"n\">Your</span> <span class=\"nb\">first</span> <span class=\"n\">container</span> (<span class=\"n\">step-by-step</span> <span class=\"n\">walkthrough</span>)\n<span class=\"mi\">5</span>. <span class=\"n\">Common</span> <span class=\"n\">gotchas</span> (<span class=\"n\">bullet</span> <span class=\"n\">points</span>)\n\n<span class=\"n\">Keep</span> <span class=\"n\">the</span> <span class=\"n\">post</span> <span class=\"n\">under</span> <span class=\"mi\">800</span> <span class=\"nb\">words</span>. <span class=\"n\">Use</span> <span class=\"n\">simple</span> <span class=\"n\">English</span> — <span class=\"k\">if</span> <span class=\"n\">a</span> <span class=\"n\">high</span> <span class=\"n\">school</span>\n<span class=\"n\">student</span> <span class=\"n\">wouldn&#39;t</span> <span class=\"n\">understand</span> <span class=\"n\">a</span> <span class=\"n\">sentence</span>, <span class=\"n\">rewrite</span> <span class=\"n\">it</span>.\n</code></pre></div>\n\n<p><strong>Result:</strong> A focused, practical tutorial that the target audience would actually find useful.</p>\n<h2>Key Techniques</h2>\n<h3>1. Chain of Thought</h3>\n<p>Ask the model to think step by step before answering. This dramatically improves accuracy on reasoning tasks:</p>\n<div class=\"codehilite\"><pre><span></span><code>Q: A bat and a ball cost $1.10 total. The bat costs $1.00 more than\nthe ball. How much does the ball cost?\n\nThink through this step by step before giving the final answer.\n</code></pre></div>\n\n<h3>2. Few-Shot Prompting</h3>\n<p>Show 2-3 examples of what you want:</p>\n<div class=\"codehilite\"><pre><span></span><code>Convert these sentences to active voice:\n\nInput: The bug was found by the QA team.\nOutput: The QA team found the bug.\n\nInput: The deployment was completed by the DevOps engineer.\nOutput:\n</code></pre></div>\n\n<h3>3. Iterative Refinement</h3>\n<p>Your first prompt rarely produces a perfect result. Use the conversation like a designer briefing a junior:</p>\n<ol>\n<li>Start broad: \"Write a Python script that processes CSV files.\"</li>\n<li>Add constraints: \"The CSV has headers. Skip empty lines. Handle FileNotFoundError.\"</li>\n<li>Refine output: \"Make the error messages user-friendly. Add a progress bar.\"</li>\n</ol>\n<h2>Common Mistakes</h2>\n<ul>\n<li><strong>Being too vague</strong> — \"Write something about AI\" tells the model nothing. Be specific about topic, audience, format, and tone.</li>\n<li><strong>Asking for too much at once</strong> — A 5,000-word article with 10 sections will be shallow. Ask for one section at a time.</li>\n<li><strong>Not providing examples</strong> — When you care about format or style, show 1-2 examples. It's the most efficient way to communicate what you want.</li>\n<li><strong>Accepting the first answer</strong> — The first response is a draft. Push back: \"Make it more concise\" or \"That analogy doesn't work — try another one.\"</li>\n</ul>\n<p><strong>See also:</strong> <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a>, <a href=\"/en/ai/mcp-complete-guide.html\">MCP (Model Context Protocol) Complete Guide: The Standard Connecting AI to Your Tools</a>, <a href=\"/en/ai/build-chatgpt-plugin.html\">How to Build a Custom GPT Plugin: Complete Developer Guide</a></p>",
      "summary": "系统学习提示词工程的核心方法论，掌握角色设定、任务描述、格式约束、示例引导五大要素，用真实案例对比展示好提示词与坏提示词的本质区别。",
      "date_published": "2026-04-16",
      "date_modified": "2026-04-16",
      "tags": [
        "ChatGPT",
        "Prompt Engineering",
        "AI对话"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/notion-complete-guide.html",
      "url": "https://aidev.fit/en/tools/notion-complete-guide.html",
      "title": "Notion 完全使用指南：从入门到精通",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "最完整的 Notion 中文教程，覆盖数据库、公式、模板、自动化等核心功能，附 10 个可以直接用的模板。",
      "date_published": "2026-04-12",
      "date_modified": "2026-04-12",
      "tags": [
        "Notion",
        "效率工具",
        "教程"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/macos-tools.html",
      "url": "https://aidev.fit/en/tech/macos-tools.html",
      "title": "macOS 效率工具推荐合集",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "精选 macOS 效率工具推荐，涵盖启动器、窗口管理、剪贴板、截图、终端等必备软件。",
      "date_published": "2026-04-10",
      "date_modified": "2026-05-13",
      "tags": [
        "macOS",
        "效率工具"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/rest-api-best-practices.html",
      "url": "https://aidev.fit/en/tech/rest-api-best-practices.html",
      "title": "REST API 设计最佳实践：写出让人愿意用的接口",
      "content_text": "REST API Best Practices: The Complete Guide for 2026 REST APIs power the modern web, but most APIs are designed with subtle flaws that cause pain months later. This guide covers the conventions, patterns, and anti-patterns that separate production APIs from weekend projects. 1. Use Nouns, Not Verbs, for Resources # Good GET /users GET /users/42 POST /users PUT /users/42 DELETE /users/42 # Bad GET /getUsers POST /createUser GET /users/42/getProfile 2. Version Your API from Day One Use URL prefix versioning ( /v1/users ) or header-based versioning ( Accept: application/vnd.api.v2+json ). URL versioning is simpler for public APIs. Choose one and stick with it everywhere — mixing strategies is worse than either alone. 3. Consistent Naming Conventions // JSON: camelCase for properties {{ &quot;userId&quot; : 42 , &quot;createdAt&quot; : &quot;2026-05-07&quot; }} // URL paths: kebab-case GET /user-orders/42 // Query parameters: snake_case GET /users?sort_by=name&amp;page;_size=20 4. Use Proper HTTP Status Codes Code When to Use 200 OK Successful GET, PUT, PATCH 201 Created Successful POST — always include Location header 204 No Content Successful DELETE (no body returned) 400 Bad Request Malformed input, validation failure 401 Unauthorized Missing or expired auth token 403 Forbidden Authenticated but not permitted 404 Not Found Resource doesn't exist 409 Conflict Duplicate or state conflict 422 Unprocessable Valid syntax but semantic error 429 Too Many Rate limit exceeded — include Retry-After header 500 Internal Error Unexpected server failure (never expose stack traces) 5. Error Response Format Always return errors in a consistent structure: {{ &quot;error&quot; : {{ &quot;code&quot; : &quot;VALIDATION_ERROR&quot; , &quot;message&quot; : &quot;Email is required&quot; , &quot;details&quot; : [ {{ &quot;field&quot; : &quot;email&quot; , &quot;reason&quot; : &quot;must not be empty&quot; }} , {{ &quot;field&quot; : &quot;age&quot; , &quot;reason&quot; : &quot;must be positive&quot; }} ], &quot;requestId&quot;: &quot;req_abc123&quot; }} }} 6. Pagination, Filtering, and Sorting # Pagination with cursor ( preferred for large datasets ) GET / users ? cursor = eyJpZCI6NDJ9 &amp; limit ;= 20 Response : {{ &quot;data&quot; : [ ... ], &quot;nextCursor&quot; : &quot;eyJpZCI6NjJ9&quot; , &quot;hasMore&quot; : true }} # Or offset - based for simpler use cases GET / users ? offset = 0 &amp; limit ;= 20 # Filtering GET / users ? status = active &amp; role ;= admin # Sorting GET / users ? sort = - createdAt # descending GET / users ? sort = + name # ascending 7. Security Checklist Always use HTTPS. No exceptions. Set rate limits. At minimum: 60 req/min per IP for unauthenticated, 1000 req/min per user for authenticated. Validate Content-Type. Reject requests with wrong Content-Type headers. Set CORS explicitly. Never use Access-Control-Allow-Origin: * with credentials. Use API keys or OAuth2. Never roll your own auth protocol. Keep secrets out of responses. Password hashes, internal IDs, stack traces, server versions. 8. API Documentation Use OpenAPI 3.1 (Swagger). It's the industry standard and generates interactive docs automatically. Tools like Stoplight, Redoc, and Swagger UI render beautiful docs from a single spec file. If your API doesn't have an OpenAPI spec, it's not ready for production. See also: Python asyncio Complete Guide: Coroutines, Tasks, and Event Loops , Testing Strategies for Web Apps: Unit, Integration, E2E, and When to Use Each , Node.js Streams: Complete Guide to Efficient Data Processing",
      "content_html": "<h1>REST API Best Practices: The Complete Guide for 2026</h1>\n<p>REST APIs power the modern web, but most APIs are designed with subtle flaws that cause pain months later. This guide covers the conventions, patterns, and anti-patterns that separate production APIs from weekend projects.</p>\n<h2>1. Use Nouns, Not Verbs, for Resources</h2>\n<div class=\"codehilite\"><pre><span></span><code># Good\nGET    /users\nGET    /users/42\nPOST   /users\nPUT    /users/42\nDELETE /users/42\n\n# Bad\nGET    /getUsers\nPOST   /createUser\nGET    /users/42/getProfile\n</code></pre></div>\n\n<h2>2. Version Your API from Day One</h2>\n<p>Use URL prefix versioning (<code>/v1/users</code>) or header-based versioning (<code>Accept: application/vnd.api.v2+json</code>). URL versioning is simpler for public APIs. Choose one and stick with it everywhere — mixing strategies is worse than either alone.</p>\n<h2>3. Consistent Naming Conventions</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"x\">// JSON: camelCase for properties</span>\n<span class=\"cp\">{{</span><span class=\"s2\">&quot;userId&quot;</span><span class=\"o\">:</span> <span class=\"m\">42</span><span class=\"o\">,</span> <span class=\"s2\">&quot;createdAt&quot;</span><span class=\"o\">:</span> <span class=\"s2\">&quot;2026-05-07&quot;</span><span class=\"cp\">}}</span>\n\n<span class=\"x\">// URL paths: kebab-case</span>\n<span class=\"x\">GET /user-orders/42</span>\n\n<span class=\"x\">// Query parameters: snake_case</span>\n<span class=\"x\">GET /users?sort_by=name&amp;page;_size=20</span>\n</code></pre></div>\n\n<h2>4. Use Proper HTTP Status Codes</h2>\n<table>\n<thead>\n<tr>\n<th>Code</th>\n<th>When to Use</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>200 OK</td>\n<td>Successful GET, PUT, PATCH</td>\n</tr>\n<tr>\n<td>201 Created</td>\n<td>Successful POST — always include Location header</td>\n</tr>\n<tr>\n<td>204 No Content</td>\n<td>Successful DELETE (no body returned)</td>\n</tr>\n<tr>\n<td>400 Bad Request</td>\n<td>Malformed input, validation failure</td>\n</tr>\n<tr>\n<td>401 Unauthorized</td>\n<td>Missing or expired auth token</td>\n</tr>\n<tr>\n<td>403 Forbidden</td>\n<td>Authenticated but not permitted</td>\n</tr>\n<tr>\n<td>404 Not Found</td>\n<td>Resource doesn't exist</td>\n</tr>\n<tr>\n<td>409 Conflict</td>\n<td>Duplicate or state conflict</td>\n</tr>\n<tr>\n<td>422 Unprocessable</td>\n<td>Valid syntax but semantic error</td>\n</tr>\n<tr>\n<td>429 Too Many</td>\n<td>Rate limit exceeded — include Retry-After header</td>\n</tr>\n<tr>\n<td>500 Internal Error</td>\n<td>Unexpected server failure (never expose stack traces)</td>\n</tr>\n</tbody>\n</table>\n<h2>5. Error Response Format</h2>\n<p>Always return errors in a consistent structure:</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"cp\">{{</span>\n  <span class=\"s2\">&quot;error&quot;</span><span class=\"o\">:</span> <span class=\"o\">{{</span>\n    <span class=\"s2\">&quot;code&quot;</span><span class=\"o\">:</span> <span class=\"s2\">&quot;VALIDATION_ERROR&quot;</span><span class=\"o\">,</span>\n    <span class=\"s2\">&quot;message&quot;</span><span class=\"o\">:</span> <span class=\"s2\">&quot;Email is required&quot;</span><span class=\"o\">,</span>\n    <span class=\"s2\">&quot;details&quot;</span><span class=\"o\">:</span> <span class=\"o\">[</span>\n      <span class=\"o\">{{</span><span class=\"s2\">&quot;field&quot;</span><span class=\"o\">:</span> <span class=\"s2\">&quot;email&quot;</span><span class=\"o\">,</span> <span class=\"s2\">&quot;reason&quot;</span><span class=\"o\">:</span> <span class=\"s2\">&quot;must not be empty&quot;</span><span class=\"cp\">}}</span><span class=\"x\">,</span>\n<span class=\"x\">      </span><span class=\"cp\">{{</span><span class=\"s2\">&quot;field&quot;</span><span class=\"o\">:</span> <span class=\"s2\">&quot;age&quot;</span><span class=\"o\">,</span> <span class=\"s2\">&quot;reason&quot;</span><span class=\"o\">:</span> <span class=\"s2\">&quot;must be positive&quot;</span><span class=\"cp\">}}</span>\n<span class=\"x\">    ],</span>\n<span class=\"x\">    &quot;requestId&quot;: &quot;req_abc123&quot;</span>\n<span class=\"x\">  }}</span>\n<span class=\"x\">}}</span>\n</code></pre></div>\n\n<h2>6. Pagination, Filtering, and Sorting</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">Pagination</span><span class=\"w\"> </span><span class=\"nx\">with</span><span class=\"w\"> </span><span class=\"nx\">cursor</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nx\">preferred</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nx\">large</span><span class=\"w\"> </span><span class=\"nx\">datasets</span><span class=\"p\">)</span>\n<span class=\"nx\">GET</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nx\">users</span><span class=\"p\">?</span><span class=\"nx\">cursor</span><span class=\"p\">=</span><span class=\"nx\">eyJpZCI6NDJ9</span><span class=\"o\">&amp;</span><span class=\"nx\">limit</span><span class=\"p\">;=</span><span class=\"mi\">20</span>\n<span class=\"nx\">Response</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">{{</span><span class=\"s\">&quot;data&quot;</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"o\">...</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"s\">&quot;nextCursor&quot;</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s\">&quot;eyJpZCI6NjJ9&quot;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s\">&quot;hasMore&quot;</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"kc\">true</span><span class=\"p\">}}</span>\n\n<span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">Or</span><span class=\"w\"> </span><span class=\"nx\">offset</span><span class=\"o\">-</span><span class=\"nx\">based</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nx\">simpler</span><span class=\"w\"> </span><span class=\"nx\">use</span><span class=\"w\"> </span><span class=\"nx\">cases</span>\n<span class=\"nx\">GET</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nx\">users</span><span class=\"p\">?</span><span class=\"nx\">offset</span><span class=\"p\">=</span><span class=\"mi\">0</span><span class=\"o\">&amp;</span><span class=\"nx\">limit</span><span class=\"p\">;=</span><span class=\"mi\">20</span>\n\n<span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">Filtering</span>\n<span class=\"nx\">GET</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nx\">users</span><span class=\"p\">?</span><span class=\"nx\">status</span><span class=\"p\">=</span><span class=\"nx\">active</span><span class=\"o\">&amp;</span><span class=\"nx\">role</span><span class=\"p\">;=</span><span class=\"nx\">admin</span>\n\n<span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">Sorting</span>\n<span class=\"nx\">GET</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nx\">users</span><span class=\"p\">?</span><span class=\"nx\">sort</span><span class=\"p\">=</span><span class=\"o\">-</span><span class=\"nx\">createdAt</span><span class=\"w\">  </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">descending</span>\n<span class=\"nx\">GET</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"nx\">users</span><span class=\"p\">?</span><span class=\"nx\">sort</span><span class=\"p\">=</span><span class=\"o\">+</span><span class=\"nx\">name</span><span class=\"w\">       </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">ascending</span>\n</code></pre></div>\n\n<h2>7. Security Checklist</h2>\n<ul>\n<li><strong>Always use HTTPS.</strong> No exceptions.</li>\n<li><strong>Set rate limits.</strong> At minimum: 60 req/min per IP for unauthenticated, 1000 req/min per user for authenticated.</li>\n<li><strong>Validate Content-Type.</strong> Reject requests with wrong Content-Type headers.</li>\n<li><strong>Set CORS explicitly.</strong> Never use <code>Access-Control-Allow-Origin: *</code> with credentials.</li>\n<li><strong>Use API keys or OAuth2.</strong> Never roll your own auth protocol.</li>\n<li><strong>Keep secrets out of responses.</strong> Password hashes, internal IDs, stack traces, server versions.</li>\n</ul>\n<h2>8. API Documentation</h2>\n<p>Use OpenAPI 3.1 (Swagger). It's the industry standard and generates interactive docs automatically. Tools like Stoplight, Redoc, and Swagger UI render beautiful docs from a single spec file. If your API doesn't have an OpenAPI spec, it's not ready for production.</p>\n<p><strong>See also:</strong> <a href=\"/en/tech/python-asyncio-guide.html\">Python asyncio Complete Guide: Coroutines, Tasks, and Event Loops</a>, <a href=\"/en/tech/testing-strategies-web-apps.html\">Testing Strategies for Web Apps: Unit, Integration, E2E, and When to Use Each</a>, <a href=\"/en/tech/nodejs-streams-guide.html\">Node.js Streams: Complete Guide to Efficient Data Processing</a></p>",
      "summary": "从 URL 设计、HTTP 方法选择到错误处理和分页，系统讲解 REST API 设计规范，附常见反模式避坑。",
      "date_published": "2026-04-07",
      "date_modified": "2026-05-15",
      "tags": [
        "REST API",
        "后端",
        "最佳实践"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/ollama-local-llm.html",
      "url": "https://aidev.fit/en/ai/ollama-local-llm.html",
      "title": "本地运行大模型：Ollama 完全入门指南",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "从安装到实战，手把手教你用 Ollama 在个人电脑上运行 Llama、Mistral、Qwen 等开源大模型，实现隐私安全的本地 AI 助手。",
      "date_published": "2026-04-03",
      "date_modified": "2026-04-03",
      "tags": [
        "Ollama",
        "本地LLM",
        "开源模型"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/ai-writing.html",
      "url": "https://aidev.fit/en/ai/ai-writing.html",
      "title": "如何用 AI 写高质量原创文章",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "揭秘人机协作写作框架：从提纲到初稿到人工润色，让你的文章既有 AI 效率又有人类灵魂，同时避开通用语气和事实错误两大雷区。",
      "date_published": "2026-04-01",
      "date_modified": "2026-05-15",
      "tags": [
        "AI写作",
        "内容创作",
        "ChatGPT"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/free-api-collection.html",
      "url": "https://aidev.fit/en/tools/free-api-collection.html",
      "title": "30 个免费又好用的 API 合集：开发者必备",
      "content_text": "30 Free and Useful APIs Every Developer Should Know A good API can save you weeks of development. These 30 APIs are either completely free or have generous free tiers that cover personal projects and MVPs. Every entry includes a sample request and rate limit info. Weather API Free Tier What You Get Open-Meteo Unlimited Weather forecasts, historical data. No API key required. Open source. OpenWeatherMap 1,000 calls/day Current weather, 5-day forecast, air pollution data. WeatherAPI 1M calls/month Real-time, forecast, astronomy, sports, timezone. Very generous. # Open-Meteo example ( no API key needed !) curl &quot;https://api.open-meteo.com/v1/forecast?latitude=52.52&amp;longitude;=13.41&amp;current;_weather=true&quot; AI &amp; Machine Learning API Free Tier What You Get OpenAI API $5 credit (expires in 3 months) GPT-4o, GPT-4o-mini. Enough for thousands of requests. Claude API $5 credit Claude Opus/Sonnet/Haiku. Great for long-context tasks. Hugging Face Free tier with rate limits Thousands of open models via Inference API. Text, image, audio. Cohere 100 calls/min Embeddings, text generation, reranking. Good for RAG pipelines. Translation &amp; Text API Free Tier What You Get Google Translate (LibreTranslate) Self-host = unlimited Open-source alternative. Host on a $5 VPS for unlimited translations. DeepL API 500,000 chars/month Highest quality machine translation. EU-based. LanguageTool Free (self-host) Grammar and style checker. Open source. Data &amp; Knowledge API Free Tier What You Get REST Countries Unlimited Data on all countries: flags, currencies, languages, timezones. OpenLibrary Unlimited Book data: covers, authors, editions. Internet Archive project. PokéAPI Unlimited All Pokémon data. Great for learning how to consume REST APIs. NASA APIs 1,000 calls/hour APOD (Astronomy Picture of the Day), Mars rover photos, Earth imagery. Images &amp; Media API Free Tier What You Get Unsplash API 50 requests/hour High-quality free photos. Attribution required. Pexels API 200 requests/hour Free stock photos and videos. No attribution required. ImgBB Unlimited (32MB limit) Image upload with auto-generated URLs. Great for quick hosting. Dev &amp; Infrastructure API Free Tier What You Get GitHub API 60 requests/hour (unauth) Repos, issues, users, gists. Use a token for 5,000/hr. ipapi 1,000/day (or 45/min) IP geolocation. City-level accuracy on free tier. ExchangeRate-API 1,500/month Currency conversion rates. Updated daily. Fun &amp; Niche API Free Tier What You Get JokeAPI Unlimited Programming jokes, dark jokes, puns. Filter by category. Bored API Unlimited Random activity suggestions. Filter by type and participants. Dog API Unlimited Random dog pictures by breed. The internet's most important resource. API Design Tips Cache aggressively — Most free APIs have rate limits. Cache responses so you don't hit them unnecessarily. Use exponential backoff — When you get a 429 (rate limited), wait and retry with increasing delays. Keep keys out of your repo — Use environment variables. Even for free API keys. Fallback gracefully — Free APIs can go down. Your app should still work if the dog picture API is having a bad day. See also: Best Programming Books 2026: 15 Books Every Developer Should Read , Best Headless CMS Platforms 2026: Strapi vs Sanity vs Contentful vs Payload , Best API Testing Tools 2026: Postman vs Insomnia vs Bruno vs Hurl",
      "content_html": "<h1>30 Free and Useful APIs Every Developer Should Know</h1>\n<p>A good API can save you weeks of development. These 30 APIs are either completely free or have generous free tiers that cover personal projects and MVPs. Every entry includes a sample request and rate limit info.</p>\n<h2>Weather</h2>\n<table>\n<thead>\n<tr>\n<th>API</th>\n<th>Free Tier</th>\n<th>What You Get</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Open-Meteo</strong></td>\n<td>Unlimited</td>\n<td>Weather forecasts, historical data. No API key required. Open source.</td>\n</tr>\n<tr>\n<td><strong>OpenWeatherMap</strong></td>\n<td>1,000 calls/day</td>\n<td>Current weather, 5-day forecast, air pollution data.</td>\n</tr>\n<tr>\n<td><strong>WeatherAPI</strong></td>\n<td>1M calls/month</td>\n<td>Real-time, forecast, astronomy, sports, timezone. Very generous.</td>\n</tr>\n</tbody>\n</table>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nt\">Open-Meteo</span><span class=\"w\"> </span><span class=\"nt\">example</span><span class=\"w\"> </span><span class=\"o\">(</span><span class=\"nt\">no</span><span class=\"w\"> </span><span class=\"nt\">API</span><span class=\"w\"> </span><span class=\"nt\">key</span><span class=\"w\"> </span><span class=\"nt\">needed</span><span class=\"o\">!)</span>\n<span class=\"nt\">curl</span><span class=\"w\"> </span><span class=\"s2\">&quot;https://api.open-meteo.com/v1/forecast?latitude=52.52&amp;longitude;=13.41&amp;current;_weather=true&quot;</span>\n</code></pre></div>\n\n<h2>AI &amp; Machine Learning</h2>\n<table>\n<thead>\n<tr>\n<th>API</th>\n<th>Free Tier</th>\n<th>What You Get</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>OpenAI API</strong></td>\n<td>$5 credit (expires in 3 months)</td>\n<td>GPT-4o, GPT-4o-mini. Enough for thousands of requests.</td>\n</tr>\n<tr>\n<td><strong>Claude API</strong></td>\n<td>$5 credit</td>\n<td>Claude Opus/Sonnet/Haiku. Great for long-context tasks.</td>\n</tr>\n<tr>\n<td><strong>Hugging Face</strong></td>\n<td>Free tier with rate limits</td>\n<td>Thousands of open models via Inference API. Text, image, audio.</td>\n</tr>\n<tr>\n<td><strong>Cohere</strong></td>\n<td>100 calls/min</td>\n<td>Embeddings, text generation, reranking. Good for RAG pipelines.</td>\n</tr>\n</tbody>\n</table>\n<h2>Translation &amp; Text</h2>\n<table>\n<thead>\n<tr>\n<th>API</th>\n<th>Free Tier</th>\n<th>What You Get</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Google Translate (LibreTranslate)</strong></td>\n<td>Self-host = unlimited</td>\n<td>Open-source alternative. Host on a $5 VPS for unlimited translations.</td>\n</tr>\n<tr>\n<td><strong>DeepL API</strong></td>\n<td>500,000 chars/month</td>\n<td>Highest quality machine translation. EU-based.</td>\n</tr>\n<tr>\n<td><strong>LanguageTool</strong></td>\n<td>Free (self-host)</td>\n<td>Grammar and style checker. Open source.</td>\n</tr>\n</tbody>\n</table>\n<h2>Data &amp; Knowledge</h2>\n<table>\n<thead>\n<tr>\n<th>API</th>\n<th>Free Tier</th>\n<th>What You Get</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>REST Countries</strong></td>\n<td>Unlimited</td>\n<td>Data on all countries: flags, currencies, languages, timezones.</td>\n</tr>\n<tr>\n<td><strong>OpenLibrary</strong></td>\n<td>Unlimited</td>\n<td>Book data: covers, authors, editions. Internet Archive project.</td>\n</tr>\n<tr>\n<td><strong>PokéAPI</strong></td>\n<td>Unlimited</td>\n<td>All Pokémon data. Great for learning how to consume REST APIs.</td>\n</tr>\n<tr>\n<td><strong>NASA APIs</strong></td>\n<td>1,000 calls/hour</td>\n<td>APOD (Astronomy Picture of the Day), Mars rover photos, Earth imagery.</td>\n</tr>\n</tbody>\n</table>\n<h2>Images &amp; Media</h2>\n<table>\n<thead>\n<tr>\n<th>API</th>\n<th>Free Tier</th>\n<th>What You Get</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Unsplash API</strong></td>\n<td>50 requests/hour</td>\n<td>High-quality free photos. Attribution required.</td>\n</tr>\n<tr>\n<td><strong>Pexels API</strong></td>\n<td>200 requests/hour</td>\n<td>Free stock photos and videos. No attribution required.</td>\n</tr>\n<tr>\n<td><strong>ImgBB</strong></td>\n<td>Unlimited (32MB limit)</td>\n<td>Image upload with auto-generated URLs. Great for quick hosting.</td>\n</tr>\n</tbody>\n</table>\n<h2>Dev &amp; Infrastructure</h2>\n<table>\n<thead>\n<tr>\n<th>API</th>\n<th>Free Tier</th>\n<th>What You Get</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>GitHub API</strong></td>\n<td>60 requests/hour (unauth)</td>\n<td>Repos, issues, users, gists. Use a token for 5,000/hr.</td>\n</tr>\n<tr>\n<td><strong>ipapi</strong></td>\n<td>1,000/day (or 45/min)</td>\n<td>IP geolocation. City-level accuracy on free tier.</td>\n</tr>\n<tr>\n<td><strong>ExchangeRate-API</strong></td>\n<td>1,500/month</td>\n<td>Currency conversion rates. Updated daily.</td>\n</tr>\n</tbody>\n</table>\n<h2>Fun &amp; Niche</h2>\n<table>\n<thead>\n<tr>\n<th>API</th>\n<th>Free Tier</th>\n<th>What You Get</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>JokeAPI</strong></td>\n<td>Unlimited</td>\n<td>Programming jokes, dark jokes, puns. Filter by category.</td>\n</tr>\n<tr>\n<td><strong>Bored API</strong></td>\n<td>Unlimited</td>\n<td>Random activity suggestions. Filter by type and participants.</td>\n</tr>\n<tr>\n<td><strong>Dog API</strong></td>\n<td>Unlimited</td>\n<td>Random dog pictures by breed. The internet's most important resource.</td>\n</tr>\n</tbody>\n</table>\n<h2>API Design Tips</h2>\n<ul>\n<li><strong>Cache aggressively</strong> — Most free APIs have rate limits. Cache responses so you don't hit them unnecessarily.</li>\n<li><strong>Use exponential backoff</strong> — When you get a 429 (rate limited), wait and retry with increasing delays.</li>\n<li><strong>Keep keys out of your repo</strong> — Use environment variables. Even for free API keys.</li>\n<li><strong>Fallback gracefully</strong> — Free APIs can go down. Your app should still work if the dog picture API is having a bad day.</li>\n</ul>\n<p><strong>See also:</strong> <a href=\"/en/tools/best-programming-books.html\">Best Programming Books 2026: 15 Books Every Developer Should Read</a>, <a href=\"/en/tools/best-headless-cms-platforms.html\">Best Headless CMS Platforms 2026: Strapi vs Sanity vs Contentful vs Payload</a>, <a href=\"/en/tools/best-api-testing-tools.html\">Best API Testing Tools 2026: Postman vs Insomnia vs Bruno vs Hurl</a></p>",
      "summary": "收录 30 个完全免费或慷慨免费额度的 API，涵盖天气、翻译、AI、数据、图片等分类，每个附调用示例和额度说明。",
      "date_published": "2026-03-30",
      "date_modified": "2026-03-30",
      "tags": [
        "API",
        "免费",
        "开发者资源"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/chrome-plugins.html",
      "url": "https://aidev.fit/en/tools/chrome-plugins.html",
      "title": "2025 年度必备 Chrome 插件推荐",
      "content_text": "15 Essential Chrome Extensions for Developers (2026) Your browser is where you spend most of your day. These 15 Chrome extensions make it faster, safer, and more productive — broken down by category so you can pick what matters most to you. Productivity &amp; Focus Extension What It Does uBlock Origin The only ad blocker you need. Lightweight, open source, and blocks trackers too. Uses far less memory than AdBlock Plus. OneTab Converts all your open tabs into a single list. Click to restore individually or all at once. Saves 95% memory when you have 50 tabs open. Toby Visual tab management with drag-and-drop collections. Organize tabs by project and sync across devices. Momentum Replaces new tab with a beautiful background, clock, and a daily focus prompt. Keeps you from getting sucked into the browser black hole. Security &amp; Privacy Extension What It Does Bitwarden Free, open-source password manager. Auto-fills logins, generates strong passwords, syncs across all devices. The best free option by a mile. Privacy Badger From the EFF. Automatically learns which trackers to block based on their behavior. No configuration needed — just install and forget. HTTPS Everywhere Automatically switches sites from HTTP to HTTPS when available. Protection against downgrade attacks. Developer Tools Extension What It Does React Developer Tools Inspect React component trees, props, state, and hooks. Essential for React debugging. JSON Formatter Auto-formats JSON responses in the browser with syntax highlighting and collapsible trees. Makes reading API responses bearable. Wappalyzer Shows what technologies a website uses — frameworks, analytics, CDNs, CMS. Great for competitive research and tech curiosity. VisBug A visual design debugging tool. Move, resize, and restyle elements directly on the page. Like Firebug for the modern web. Design &amp; Content Extension What It Does ColorZilla Eyedropper tool that picks colors from any webpage. Includes a gradient generator and CSS gradient parser. GoFullPage Captures full-page screenshots — scrolling included. Perfect for documenting designs, creating portfolios, or reporting bugs. WhatFont Hover over any text to identify the font family, size, weight, and line height. Saves you from digging into DevTools just to find a font name. The One Extension to Rule Them All If you only install one: uBlock Origin . It makes the web faster, cleaner, and safer. Everything else is optimization on top of that foundation. See also: Best Markdown Editors , Best Password Managers for Developers , Project Management Tools for Developers",
      "content_html": "<h1>15 Essential Chrome Extensions for Developers (2026)</h1>\n<p>Your browser is where you spend most of your day. These 15 Chrome extensions make it faster, safer, and more productive — broken down by category so you can pick what matters most to you.</p>\n<h2>Productivity &amp; Focus</h2>\n<table>\n<thead>\n<tr>\n<th>Extension</th>\n<th>What It Does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>uBlock Origin</strong></td>\n<td>The only ad blocker you need. Lightweight, open source, and blocks trackers too. Uses far less memory than AdBlock Plus.</td>\n</tr>\n<tr>\n<td><strong>OneTab</strong></td>\n<td>Converts all your open tabs into a single list. Click to restore individually or all at once. Saves 95% memory when you have 50 tabs open.</td>\n</tr>\n<tr>\n<td><strong>Toby</strong></td>\n<td>Visual tab management with drag-and-drop collections. Organize tabs by project and sync across devices.</td>\n</tr>\n<tr>\n<td><strong>Momentum</strong></td>\n<td>Replaces new tab with a beautiful background, clock, and a daily focus prompt. Keeps you from getting sucked into the browser black hole.</td>\n</tr>\n</tbody>\n</table>\n<h2>Security &amp; Privacy</h2>\n<table>\n<thead>\n<tr>\n<th>Extension</th>\n<th>What It Does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Bitwarden</strong></td>\n<td>Free, open-source password manager. Auto-fills logins, generates strong passwords, syncs across all devices. The best free option by a mile.</td>\n</tr>\n<tr>\n<td><strong>Privacy Badger</strong></td>\n<td>From the EFF. Automatically learns which trackers to block based on their behavior. No configuration needed — just install and forget.</td>\n</tr>\n<tr>\n<td><strong>HTTPS Everywhere</strong></td>\n<td>Automatically switches sites from HTTP to HTTPS when available. Protection against downgrade attacks.</td>\n</tr>\n</tbody>\n</table>\n<h2>Developer Tools</h2>\n<table>\n<thead>\n<tr>\n<th>Extension</th>\n<th>What It Does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>React Developer Tools</strong></td>\n<td>Inspect React component trees, props, state, and hooks. Essential for React debugging.</td>\n</tr>\n<tr>\n<td><strong>JSON Formatter</strong></td>\n<td>Auto-formats JSON responses in the browser with syntax highlighting and collapsible trees. Makes reading API responses bearable.</td>\n</tr>\n<tr>\n<td><strong>Wappalyzer</strong></td>\n<td>Shows what technologies a website uses — frameworks, analytics, CDNs, CMS. Great for competitive research and tech curiosity.</td>\n</tr>\n<tr>\n<td><strong>VisBug</strong></td>\n<td>A visual design debugging tool. Move, resize, and restyle elements directly on the page. Like Firebug for the modern web.</td>\n</tr>\n</tbody>\n</table>\n<h2>Design &amp; Content</h2>\n<table>\n<thead>\n<tr>\n<th>Extension</th>\n<th>What It Does</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>ColorZilla</strong></td>\n<td>Eyedropper tool that picks colors from any webpage. Includes a gradient generator and CSS gradient parser.</td>\n</tr>\n<tr>\n<td><strong>GoFullPage</strong></td>\n<td>Captures full-page screenshots — scrolling included. Perfect for documenting designs, creating portfolios, or reporting bugs.</td>\n</tr>\n<tr>\n<td><strong>WhatFont</strong></td>\n<td>Hover over any text to identify the font family, size, weight, and line height. Saves you from digging into DevTools just to find a font name.</td>\n</tr>\n</tbody>\n</table>\n<h2>The One Extension to Rule Them All</h2>\n<p>If you only install one: <strong>uBlock Origin</strong>. It makes the web faster, cleaner, and safer. Everything else is optimization on top of that foundation.</p>\n<p><strong>See also:</strong> <a href=\"/en/tools/markdown-editors.html\">Best Markdown Editors</a>, <a href=\"/en/tools/password-managers.html\">Best Password Managers for Developers</a>, <a href=\"/en/tools/project-management-tools.html\">Project Management Tools for Developers</a></p>",
      "summary": "精选 15 款必备 Chrome 浏览器插件，涵盖效率、安全、开发、设计等场景。",
      "date_published": "2026-03-30",
      "date_modified": "2026-03-30",
      "tags": [
        "Chrome",
        "浏览器插件"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/ai-coding-tools-comparison-2026.html",
      "url": "https://aidev.fit/en/ai/ai-coding-tools-comparison-2026.html",
      "title": "AI 编程助手对比 2026：Cursor vs Copilot vs Claude Code 怎么选",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "2026 年三大 AI 编程助手横向评测：Cursor、GitHub Copilot、Claude Code 在代码补全、多文件重构、项目理解、价格等方面的深度对比，帮你选出最适合的工具。",
      "date_published": "2026-03-30",
      "date_modified": "2026-03-30",
      "tags": [
        "AI编程",
        "Cursor",
        "Copilot",
        "Claude Code",
        "对比评测"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/tech-blog-monetization.html",
      "url": "https://aidev.fit/en/sidehustle/tech-blog-monetization.html",
      "title": "如何通过写技术博客赚钱：从 0 到月入 1000 美元",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "技术博客的完整变现路径：广告、联盟营销、付费内容、咨询转化，附带真实案例和收入拆解。",
      "date_published": "2026-03-29",
      "date_modified": "2026-03-29",
      "tags": [
        "技术博客",
        "博客变现",
        "副业"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/ai-ppt-presentation.html",
      "url": "https://aidev.fit/en/ai/ai-ppt-presentation.html",
      "title": "用 AI 做 PPT：从 3 小时到 10 分钟",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "对比 Gamma、Beautiful.ai、Tome、iSlide AI、WPS AI 五大 AI PPT 工具，掌握人机协作的正确工作流程，避免 AI 生成千篇一律的幻灯片。",
      "date_published": "2026-03-23",
      "date_modified": "2026-03-23",
      "tags": [
        "AIPPT",
        "汇报材料",
        "效率提升"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/ai-automation-workflow.html",
      "url": "https://aidev.fit/en/ai/ai-automation-workflow.html",
      "title": "AI 自动化工作流实战：让 AI 替你干重复活",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "手把手搭建 AI 自动化工作流：Zapier/Make + ChatGPT/Claude API 联动，自动处理邮件、生成报表、监控舆情。",
      "date_published": "2026-03-22",
      "date_modified": "2026-05-13",
      "tags": [
        "AI自动化",
        "Zapier",
        "效率提升"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/mcp-protocol-guide.html",
      "url": "https://aidev.fit/en/ai/mcp-protocol-guide.html",
      "title": "MCP 协议入门：让 AI 模型安全访问你的工具和数据",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "Model Context Protocol (MCP) 是 Anthropic 推出的开放协议，让 AI 助手通过标准化接口连接外部工具和数据源。本文从零讲解 MCP 的核心概念、服务端开发、客户端集成。",
      "date_published": "2026-03-19",
      "date_modified": "2026-03-19",
      "tags": [
        "MCP",
        "AI开发",
        "协议",
        "教程"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/content-creator-startup.html",
      "url": "https://aidev.fit/en/sidehustle/content-creator-startup.html",
      "title": "从零开始做自媒体：平台选择、内容定位与变现路径",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "2026 年自媒体运营全攻略：公众号、知乎、小红书、抖音四大平台对比，帮你找到适合自己的内容方向和变现模式。",
      "date_published": "2026-03-11",
      "date_modified": "2026-05-15",
      "tags": [
        "自媒体",
        "内容创作",
        "副业"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/knowledge-monetization.html",
      "url": "https://aidev.fit/en/sidehustle/knowledge-monetization.html",
      "title": "如何把你的专业知识变成付费内容：从 0 到月入 5000",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "手把手教你将专业技能包装为付费内容产品：在线课程、付费专栏、社群运营，三个变现路径的完整实操指南。",
      "date_published": "2026-03-06",
      "date_modified": "2026-03-06",
      "tags": [
        "知识付费",
        "变现",
        "副业"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/ai-era-side-hustles.html",
      "url": "https://aidev.fit/en/sidehustle/ai-era-side-hustles.html",
      "title": "AI 时代程序员的 5 个新副业机会（2026）",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "AI 不是来抢你饭碗的——它是来给你送新工具的。本文盘点 2026 年程序员最值得尝试的 5 个 AI 副业方向，每个都附具体入行路径和收入参考。",
      "date_published": "2026-03-05",
      "date_modified": "2026-03-05",
      "tags": [
        "副业",
        "AI",
        "变现",
        "程序员",
        "被动收入"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/developer-productivity-2026.html",
      "url": "https://aidev.fit/en/tech/developer-productivity-2026.html",
      "title": "程序员效率提升 2026：AI 时代的 10 倍开发效率方法论",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "传统的搬砖式编码正在被 AI 取代。本文从工具链升级、认知模式转变到精力管理，系统讲解 2026 年程序员实现 10 倍效率突破的具体方法。",
      "date_published": "2026-03-04",
      "date_modified": "2026-03-04",
      "tags": [
        "效率提升",
        "AI编程",
        "职业发展",
        "工具推荐"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/openai-api-intro.html",
      "url": "https://aidev.fit/en/ai/openai-api-intro.html",
      "title": "OpenAI API 入门：用 10 行代码调用 GPT",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "零基础入门 OpenAI API，从获取 Key 到发出第一个请求，涵盖 Chat Completion、System Prompt、Temperature 等核心概念，附带可运行的 Python 和 JS 示例。",
      "date_published": "2026-02-20",
      "date_modified": "2026-02-20",
      "tags": [
        "OpenAI API",
        "GPT",
        "编程入门"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/screen-recording-tools.html",
      "url": "https://aidev.fit/en/tools/screen-recording-tools.html",
      "title": "2026 年最佳屏幕录制和视频剪辑工具推荐",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "精选 8 款屏幕录制和轻量视频编辑工具，涵盖免费和付费，适合做教程、演示和产品介绍视频。",
      "date_published": "2026-02-06",
      "date_modified": "2026-02-06",
      "tags": [
        "屏幕录制",
        "视频工具",
        "效率"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/editor-comparison-2026.html",
      "url": "https://aidev.fit/en/tools/editor-comparison-2026.html",
      "title": "VS Code vs JetBrains vs Cursor：2026 年代码编辑器终极对比",
      "content_text": "VS Code vs JetBrains vs Cursor: Ultimate Code Editor Showdown (2026) The code editor market in 2026 has consolidated around three heavyweights: Microsoft's VS Code, JetBrains' IntelliJ-based IDEs, and the AI-native Cursor. Each takes a fundamentally different approach to helping you write code. Here's how to pick. VS Code The Swiss Army Knife. Lightweight, extensible, and free. With 40,000+ extensions, there's almost nothing it can't do — but you need to assemble your own IDE from parts. The remote development features (SSH, containers, WSL) are genuinely best-in-class. Price: Free (Microsoft) Best for: Full-stack web dev, TypeScript/JavaScript, polyglot developers, remote work Weakness: Java/C# support isn't as deep as JetBrains. AI features require extensions (Copilot). JetBrains IDEs (IntelliJ IDEA / WebStorm / PyCharm) The Specialist. Each JetBrains IDE is tailored to a specific language ecosystem, and it shows. Refactoring tools that actually understand your code. A debugger that just works. Database tools built in. The trade-off: heavier, more expensive, and slower to start. Price: Free (Community) / $169+/year (Professional) Best for: Java/Kotlin, C#, PHP, large enterprise codebases, complex refactoring Weakness: Heavier resource usage. AI features (JetBrains AI) are decent but not as strong as Cursor or Copilot. Cursor The AI-Native Editor. A VS Code fork rebuilt from the ground up around AI interaction. Instead of asking AI for code and pasting it in, you describe what you want and Cursor writes it in your codebase — understanding your existing files, types, and patterns. The \"Tab to accept\" model for multi-line edits is so natural it feels like telepathy. Price: Free (limited) / $20/mo (Pro) Best for: Greenfield projects, rapid prototyping, solo developers, AI-first workflows Weakness: Lacks some VS Code extensions. Not ideal for large enterprise projects. AI-generated code still needs careful review. Head-to-Head Comparison Dimension VS Code JetBrains Cursor Startup speed Fast Slow Fast Memory usage ~300-800MB ~1-3GB ~400-900MB Extension ecosystem 40,000+ 3,000+ Most VS Code extensions AI integration Via extensions Built-in (decent) Core feature (excellent) Refactoring Good Excellent Good (AI-assisted) Database tools Via extensions Built-in Via extensions Best for General purpose Enterprise/Java AI-first workflow My Recommendation Start with VS Code — it's the safest default and costs nothing. If you work primarily with Java, C#, or large enterprise codebases, JetBrains is worth every dollar. If you're an indie dev or early-stage startup, try Cursor — the AI-first approach genuinely makes you faster once you adjust your workflow. Truth is, many experienced developers use two: JetBrains for deep refactoring sessions, VS Code/Cursor for quick edits and frontend work. Don't be dogmatic — use the right tool for the task. See also: IDE Comparison 2026: VS Code, JetBrains, Zed, Cursor — Performance and Features , Best Database GUI Tools 2026: TablePlus vs DBeaver vs Beekeeper vs DataGrip , Best Code Review Tools 2026: GitHub, GitLab, Graphite, Reviewable Compared",
      "content_html": "<h1>VS Code vs JetBrains vs Cursor: Ultimate Code Editor Showdown (2026)</h1>\n<p>The code editor market in 2026 has consolidated around three heavyweights: Microsoft's VS Code, JetBrains' IntelliJ-based IDEs, and the AI-native Cursor. Each takes a fundamentally different approach to helping you write code. Here's how to pick.</p>\n<h2>VS Code</h2>\n<p><strong>The Swiss Army Knife.</strong> Lightweight, extensible, and free. With 40,000+ extensions, there's almost nothing it can't do — but you need to assemble your own IDE from parts. The remote development features (SSH, containers, WSL) are genuinely best-in-class.</p>\n<ul>\n<li><strong>Price:</strong> Free (Microsoft)</li>\n<li><strong>Best for:</strong> Full-stack web dev, TypeScript/JavaScript, polyglot developers, remote work</li>\n<li><strong>Weakness:</strong> Java/C# support isn't as deep as JetBrains. AI features require extensions (Copilot).</li>\n</ul>\n<h2>JetBrains IDEs (IntelliJ IDEA / WebStorm / PyCharm)</h2>\n<p><strong>The Specialist.</strong> Each JetBrains IDE is tailored to a specific language ecosystem, and it shows. Refactoring tools that actually understand your code. A debugger that just works. Database tools built in. The trade-off: heavier, more expensive, and slower to start.</p>\n<ul>\n<li><strong>Price:</strong> Free (Community) / $169+/year (Professional)</li>\n<li><strong>Best for:</strong> Java/Kotlin, C#, PHP, large enterprise codebases, complex refactoring</li>\n<li><strong>Weakness:</strong> Heavier resource usage. AI features (JetBrains AI) are decent but not as strong as Cursor or Copilot.</li>\n</ul>\n<h2>Cursor</h2>\n<p><strong>The AI-Native Editor.</strong> A VS Code fork rebuilt from the ground up around AI interaction. Instead of asking AI for code and pasting it in, you describe what you want and Cursor writes it in your codebase — understanding your existing files, types, and patterns. The \"Tab to accept\" model for multi-line edits is so natural it feels like telepathy.</p>\n<ul>\n<li><strong>Price:</strong> Free (limited) / $20/mo (Pro)</li>\n<li><strong>Best for:</strong> Greenfield projects, rapid prototyping, solo developers, AI-first workflows</li>\n<li><strong>Weakness:</strong> Lacks some VS Code extensions. Not ideal for large enterprise projects. AI-generated code still needs careful review.</li>\n</ul>\n<h2>Head-to-Head Comparison</h2>\n<table>\n<thead>\n<tr>\n<th>Dimension</th>\n<th>VS Code</th>\n<th>JetBrains</th>\n<th>Cursor</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Startup speed</td>\n<td>Fast</td>\n<td>Slow</td>\n<td>Fast</td>\n</tr>\n<tr>\n<td>Memory usage</td>\n<td>~300-800MB</td>\n<td>~1-3GB</td>\n<td>~400-900MB</td>\n</tr>\n<tr>\n<td>Extension ecosystem</td>\n<td>40,000+</td>\n<td>3,000+</td>\n<td>Most VS Code extensions</td>\n</tr>\n<tr>\n<td>AI integration</td>\n<td>Via extensions</td>\n<td>Built-in (decent)</td>\n<td>Core feature (excellent)</td>\n</tr>\n<tr>\n<td>Refactoring</td>\n<td>Good</td>\n<td>Excellent</td>\n<td>Good (AI-assisted)</td>\n</tr>\n<tr>\n<td>Database tools</td>\n<td>Via extensions</td>\n<td>Built-in</td>\n<td>Via extensions</td>\n</tr>\n<tr>\n<td>Best for</td>\n<td>General purpose</td>\n<td>Enterprise/Java</td>\n<td>AI-first workflow</td>\n</tr>\n</tbody>\n</table>\n<h2>My Recommendation</h2>\n<p><strong>Start with VS Code</strong> — it's the safest default and costs nothing. If you work primarily with Java, C#, or large enterprise codebases, JetBrains is worth every dollar. If you're an indie dev or early-stage startup, try Cursor — the AI-first approach genuinely makes you faster once you adjust your workflow.</p>\n<p>Truth is, many experienced developers use two: JetBrains for deep refactoring sessions, VS Code/Cursor for quick edits and frontend work. Don't be dogmatic — use the right tool for the task.</p>\n<p><strong>See also:</strong> <a href=\"/en/tools/ide-comparison-2026.html\">IDE Comparison 2026: VS Code, JetBrains, Zed, Cursor — Performance and Features</a>, <a href=\"/en/tools/best-database-gui-tools.html\">Best Database GUI Tools 2026: TablePlus vs DBeaver vs Beekeeper vs DataGrip</a>, <a href=\"/en/tools/best-code-review-tools.html\">Best Code Review Tools 2026: GitHub, GitLab, Graphite, Reviewable Compared</a></p>",
      "summary": "全方位对比三大主流代码编辑器的性能、AI 能力、生态插件和价格，帮你选出最适合自己的开发工具。",
      "date_published": "2026-02-06",
      "date_modified": "2026-05-13",
      "tags": [
        "编辑器",
        "VS Code",
        "JetBrains",
        "对比评测"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/password-manager-comparison.html",
      "url": "https://aidev.fit/en/tools/password-manager-comparison.html",
      "title": "2026 年最佳密码管理器对比：LastPass vs 1Password vs Bitwarden",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "六大主流密码管理器全方位对比，涵盖安全性、易用性、跨平台、价格，帮你选出最适合的一款。",
      "date_published": "2026-02-03",
      "date_modified": "2026-02-03",
      "tags": [
        "密码管理",
        "安全",
        "对比评测"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/linux-commands.html",
      "url": "https://aidev.fit/en/tech/linux-commands.html",
      "title": "Linux 命令行入门：30 个最常用的命令",
      "content_text": "Linux Commands Cheat Sheet: 50 Commands Every Developer Should Know A good Linux command-line reference isn't nice to have — it's essential. This cheatsheet covers 50 commands organized by what you're actually trying to do, from file navigation to process management to networking. File Navigation pwd # print working directory ls - la # list all files with details cd / path / to / dir # change directory cd .. # go up one level cd - # go back to previous directory find . - name &quot;*.py&quot; # find files by name pattern locate filename # find file quickly ( uses indexed db ) File Operations cp source dest # copy file cp -r source dest # copy directory recursively mv source dest # move or rename rm file # remove file rm -rf dir # remove directory (DANGER — no undo) mkdir -p a/b/c # create nested directories touch file # create empty file or update timestamp ln -s target link # create symbolic link Viewing and Editing Files cat file # print entire file less file # scroll through file ( q to quit ) head - 20 file # first 20 lines tail - f file # follow file as it grows ( logs ) wc - l file # count lines grep &quot;pattern&quot; file # search for pattern grep - r &quot;pattern&quot; dir # search recursively nano file # simple terminal editor vim file # advanced editor (: q ! to quit ) Permissions chmod 755 script.sh # rwxr-xr-x (owner full, others read+execute) chmod +x script.sh # make executable chown user:group file # change owner and group umask 022 # set default permissions mask Process Management ps aux # list all running processes ps aux | grep nginx # find specific process top # real - time process monitor ( q to quit ) htop # prettier top ( install separately ) kill 1234 # terminate process by PID kill - 9 1234 # force kill ( SIGKILL ) pkill - f pattern # kill by name pattern bg # resume suspended job in background fg # bring background job to foreground jobs # list background jobs Disk and Storage df -h # disk free (human-readable) du -sh dir # directory size summary du -sh * | sort -h # size of each item, sorted mount # show mounted filesystems lsblk # list block devices Networking ping host # test connectivity curl - I url # fetch headers only curl - s url | jq # fetch JSON and pretty-print wget url # download file ssh user @ host # connect to remote server scp file user @ host : path # copy file to remote netstat - tlnp # listening ports ss - tlnp # modern alternative to netstat lsof - i : 3000 # what&#39;s using port 3000 Text Processing sed &#39;s/old/new/g&#39; file # replace all occurrences awk &#39; {{ print $ 1 }} &#39; file # print first column sort file # sort lines sort -u file # sort and deduplicate uniq -c file # count occurrences cut -d&#39;,&#39; -f1 file # extract column 1 from CSV tr &#39;[:lower:]&#39; &#39;[:upper:]&#39; # convert case Compression and Archives tar -czf archive.tar.gz dir # create gzipped tarball tar -xzf archive.tar.gz # extract gzipped tarball gzip file # compress single file gunzip file.gz # decompress zip -r archive.zip dir # create zip System Info uname - a # kernel info whoami # current user who # who is logged in uptime # how long system has been up free - h # memory usage date # current date / time history # command history !! # re - run last command ! $ # last argument of previous command Quick Reference by Task Task Command Find large files find . -type f -size +100M Search in files grep -rn \"TODO\" . Count files in directory ls -1 | wc -l See disk usage of all mounts df -h Check if a port is open nc -zv host 443 Watch command output every 2s watch -n 2 command Create alias permanently echo 'alias ll=\"ls -la\"' &gt;&gt; ~/.bashrc See also: Helm Charts: Kubernetes Package Management , Developer Environment Setup Guide , Kubernetes Security Best Practices",
      "content_html": "<h1>Linux Commands Cheat Sheet: 50 Commands Every Developer Should Know</h1>\n<p>A good Linux command-line reference isn't nice to have — it's essential. This cheatsheet covers 50 commands organized by what you're actually trying to do, from file navigation to process management to networking.</p>\n<h2>File Navigation</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">pwd</span><span class=\"w\">                     </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"k\">print</span><span class=\"w\"> </span><span class=\"n\">working</span><span class=\"w\"> </span><span class=\"n\">directory</span>\n<span class=\"n\">ls</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">la</span><span class=\"w\">                  </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">list</span><span class=\"w\"> </span><span class=\"ow\">all</span><span class=\"w\"> </span><span class=\"n\">files</span><span class=\"w\"> </span><span class=\"k\">with</span><span class=\"w\"> </span><span class=\"n\">details</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"k\">path</span><span class=\"o\">/</span><span class=\"k\">to</span><span class=\"o\">/</span><span class=\"n\">dir</span><span class=\"w\">         </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">change</span><span class=\"w\"> </span><span class=\"n\">directory</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"p\">..</span><span class=\"w\">                   </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"k\">go</span><span class=\"w\"> </span><span class=\"n\">up</span><span class=\"w\"> </span><span class=\"n\">one</span><span class=\"w\"> </span><span class=\"k\">level</span>\n<span class=\"n\">cd</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\">                    </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"k\">go</span><span class=\"w\"> </span><span class=\"n\">back</span><span class=\"w\"> </span><span class=\"k\">to</span><span class=\"w\"> </span><span class=\"n\">previous</span><span class=\"w\"> </span><span class=\"n\">directory</span>\n<span class=\"n\">find</span><span class=\"w\"> </span><span class=\"p\">.</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"ss\">&quot;*.py&quot;</span><span class=\"w\">     </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">find</span><span class=\"w\"> </span><span class=\"n\">files</span><span class=\"w\"> </span><span class=\"k\">by</span><span class=\"w\"> </span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"n\">pattern</span>\n<span class=\"n\">locate</span><span class=\"w\"> </span><span class=\"n\">filename</span><span class=\"w\">         </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"n\">find</span><span class=\"w\"> </span><span class=\"k\">file</span><span class=\"w\"> </span><span class=\"n\">quickly</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">uses</span><span class=\"w\"> </span><span class=\"n\">indexed</span><span class=\"w\"> </span><span class=\"n\">db</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h2>File Operations</h2>\n<div class=\"codehilite\"><pre><span></span><code>cp source dest          # copy file\ncp -r source dest       # copy directory recursively\nmv source dest          # move or rename\nrm file                 # remove file\nrm -rf dir              # remove directory (DANGER — no undo)\nmkdir -p a/b/c          # create nested directories\ntouch file              # create empty file or update timestamp\nln -s target link       # create symbolic link\n</code></pre></div>\n\n<h2>Viewing and Editing Files</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nx\">cat</span><span class=\"w\"> </span><span class=\"nx\">file</span><span class=\"w\">                </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">print</span><span class=\"w\"> </span><span class=\"nx\">entire</span><span class=\"w\"> </span><span class=\"nx\">file</span>\n<span class=\"nx\">less</span><span class=\"w\"> </span><span class=\"nx\">file</span><span class=\"w\">               </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">scroll</span><span class=\"w\"> </span><span class=\"nx\">through</span><span class=\"w\"> </span><span class=\"nx\">file</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nx\">q</span><span class=\"w\"> </span><span class=\"nx\">to</span><span class=\"w\"> </span><span class=\"nx\">quit</span><span class=\"p\">)</span>\n<span class=\"nx\">head</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"mi\">20</span><span class=\"w\"> </span><span class=\"nx\">file</span><span class=\"w\">           </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">first</span><span class=\"w\"> </span><span class=\"mi\">20</span><span class=\"w\"> </span><span class=\"nx\">lines</span>\n<span class=\"nx\">tail</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nx\">f</span><span class=\"w\"> </span><span class=\"nx\">file</span><span class=\"w\">            </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">follow</span><span class=\"w\"> </span><span class=\"nx\">file</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"nx\">it</span><span class=\"w\"> </span><span class=\"nx\">grows</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nx\">logs</span><span class=\"p\">)</span>\n<span class=\"nx\">wc</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nx\">l</span><span class=\"w\"> </span><span class=\"nx\">file</span><span class=\"w\">              </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">count</span><span class=\"w\"> </span><span class=\"nx\">lines</span>\n<span class=\"nx\">grep</span><span class=\"w\"> </span><span class=\"s\">&quot;pattern&quot;</span><span class=\"w\"> </span><span class=\"nx\">file</span><span class=\"w\">     </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">search</span><span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"nx\">pattern</span>\n<span class=\"nx\">grep</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nx\">r</span><span class=\"w\"> </span><span class=\"s\">&quot;pattern&quot;</span><span class=\"w\"> </span><span class=\"nx\">dir</span><span class=\"w\">   </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">search</span><span class=\"w\"> </span><span class=\"nx\">recursively</span>\n<span class=\"nx\">nano</span><span class=\"w\"> </span><span class=\"nx\">file</span><span class=\"w\">               </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">simple</span><span class=\"w\"> </span><span class=\"nx\">terminal</span><span class=\"w\"> </span><span class=\"nx\">editor</span>\n<span class=\"nx\">vim</span><span class=\"w\"> </span><span class=\"nx\">file</span><span class=\"w\">                </span><span class=\"err\">#</span><span class=\"w\"> </span><span class=\"nx\">advanced</span><span class=\"w\"> </span><span class=\"nx\">editor</span><span class=\"w\"> </span><span class=\"p\">(:</span><span class=\"nx\">q</span><span class=\"p\">!</span><span class=\"w\"> </span><span class=\"nx\">to</span><span class=\"w\"> </span><span class=\"nx\">quit</span><span class=\"p\">)</span>\n</code></pre></div>\n\n<h2>Permissions</h2>\n<div class=\"codehilite\"><pre><span></span><code>chmod 755 script.sh     # rwxr-xr-x (owner full, others read+execute)\nchmod +x script.sh      # make executable\nchown user:group file   # change owner and group\numask 022               # set default permissions mask\n</code></pre></div>\n\n<h2>Process Management</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">ps</span><span class=\"w\"> </span><span class=\"n\">aux</span><span class=\"w\">                  </span><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"n\">list</span><span class=\"w\"> </span><span class=\"n\">all</span><span class=\"w\"> </span><span class=\"n\">running</span><span class=\"w\"> </span><span class=\"n\">processes</span>\n<span class=\"n\">ps</span><span class=\"w\"> </span><span class=\"n\">aux</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"n\">grep</span><span class=\"w\"> </span><span class=\"n\">nginx</span><span class=\"w\">     </span><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"n\">find</span><span class=\"w\"> </span><span class=\"n\">specific</span><span class=\"w\"> </span><span class=\"n\">process</span>\n<span class=\"n\">top</span><span class=\"w\">                     </span><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"kt\">real</span><span class=\"o\">-</span><span class=\"kt\">time</span><span class=\"w\"> </span><span class=\"n\">process</span><span class=\"w\"> </span><span class=\"n\">monitor</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">q</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"n\">quit</span><span class=\"p\">)</span>\n<span class=\"n\">htop</span><span class=\"w\">                    </span><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"n\">prettier</span><span class=\"w\"> </span><span class=\"n\">top</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">install</span><span class=\"w\"> </span><span class=\"n\">separately</span><span class=\"p\">)</span>\n<span class=\"n\">kill</span><span class=\"w\"> </span><span class=\"mh\">1234</span><span class=\"w\">               </span><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"n\">terminate</span><span class=\"w\"> </span><span class=\"n\">process</span><span class=\"w\"> </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"n\">PID</span>\n<span class=\"n\">kill</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"mh\">9</span><span class=\"w\"> </span><span class=\"mh\">1234</span><span class=\"w\">            </span><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"k\">force</span><span class=\"w\"> </span><span class=\"n\">kill</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">SIGKILL</span><span class=\"p\">)</span>\n<span class=\"n\">pkill</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">f</span><span class=\"w\"> </span><span class=\"n\">pattern</span><span class=\"w\">        </span><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"n\">kill</span><span class=\"w\"> </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"n\">pattern</span>\n<span class=\"n\">bg</span><span class=\"w\">                      </span><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"n\">resume</span><span class=\"w\"> </span><span class=\"n\">suspended</span><span class=\"w\"> </span><span class=\"n\">job</span><span class=\"w\"> </span><span class=\"n\">in</span><span class=\"w\"> </span><span class=\"n\">background</span>\n<span class=\"n\">fg</span><span class=\"w\">                      </span><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"n\">bring</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"w\"> </span><span class=\"n\">job</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"n\">foreground</span>\n<span class=\"n\">jobs</span><span class=\"w\">                    </span><span class=\"p\">#</span><span class=\"w\"> </span><span class=\"n\">list</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"w\"> </span><span class=\"n\">jobs</span>\n</code></pre></div>\n\n<h2>Disk and Storage</h2>\n<div class=\"codehilite\"><pre><span></span><code>df -h                   # disk free (human-readable)\ndu -sh dir              # directory size summary\ndu -sh * | sort -h      # size of each item, sorted\nmount                   # show mounted filesystems\nlsblk                   # list block devices\n</code></pre></div>\n\n<h2>Networking</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">ping</span><span class=\"w\"> </span><span class=\"n\">host</span><span class=\"w\">               </span><span class=\"c1\"># test connectivity</span>\n<span class=\"n\">curl</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">I</span><span class=\"w\"> </span><span class=\"n\">url</span><span class=\"w\">             </span><span class=\"c1\"># fetch headers only</span>\n<span class=\"n\">curl</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">s</span><span class=\"w\"> </span><span class=\"n\">url</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"n\">jq</span><span class=\"w\">        </span><span class=\"c1\"># fetch JSON and pretty-print</span>\n<span class=\"n\">wget</span><span class=\"w\"> </span><span class=\"n\">url</span><span class=\"w\">                </span><span class=\"c1\"># download file</span>\n<span class=\"n\">ssh</span><span class=\"w\"> </span><span class=\"n\">user</span><span class=\"err\">@</span><span class=\"n\">host</span><span class=\"w\">           </span><span class=\"c1\"># connect to remote server</span>\n<span class=\"n\">scp</span><span class=\"w\"> </span><span class=\"n\">file</span><span class=\"w\"> </span><span class=\"n\">user</span><span class=\"err\">@</span><span class=\"n\">host</span><span class=\"p\">:</span><span class=\"n\">path</span><span class=\"w\"> </span><span class=\"c1\"># copy file to remote</span>\n<span class=\"n\">netstat</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">tlnp</span><span class=\"w\">           </span><span class=\"c1\"># listening ports</span>\n<span class=\"n\">ss</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">tlnp</span><span class=\"w\">                </span><span class=\"c1\"># modern alternative to netstat</span>\n<span class=\"n\">lsof</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"p\">:</span><span class=\"mi\">3000</span><span class=\"w\">           </span><span class=\"c1\"># what&#39;s using port 3000</span>\n</code></pre></div>\n\n<h2>Text Processing</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"x\">sed &#39;s/old/new/g&#39; file  # replace all occurrences</span>\n<span class=\"x\">awk &#39;</span><span class=\"cp\">{{</span><span class=\"nv\">print</span> <span class=\"err\">$</span><span class=\"m\">1</span><span class=\"cp\">}}</span><span class=\"x\">&#39; file  # print first column</span>\n<span class=\"x\">sort file               # sort lines</span>\n<span class=\"x\">sort -u file            # sort and deduplicate</span>\n<span class=\"x\">uniq -c file            # count occurrences</span>\n<span class=\"x\">cut -d&#39;,&#39; -f1 file      # extract column 1 from CSV</span>\n<span class=\"x\">tr &#39;[:lower:]&#39; &#39;[:upper:]&#39; # convert case</span>\n</code></pre></div>\n\n<h2>Compression and Archives</h2>\n<div class=\"codehilite\"><pre><span></span><code>tar -czf archive.tar.gz dir   # create gzipped tarball\ntar -xzf archive.tar.gz       # extract gzipped tarball\ngzip file                     # compress single file\ngunzip file.gz                # decompress\nzip -r archive.zip dir        # create zip\n</code></pre></div>\n\n<h2>System Info</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">uname</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">a</span><span class=\"w\">                </span>#<span class=\"w\"> </span><span class=\"nv\">kernel</span><span class=\"w\"> </span><span class=\"nv\">info</span>\n<span class=\"nv\">whoami</span><span class=\"w\">                  </span>#<span class=\"w\"> </span><span class=\"nv\">current</span><span class=\"w\"> </span><span class=\"nv\">user</span>\n<span class=\"nv\">who</span><span class=\"w\">                     </span>#<span class=\"w\"> </span><span class=\"nv\">who</span><span class=\"w\"> </span><span class=\"nv\">is</span><span class=\"w\"> </span><span class=\"nv\">logged</span><span class=\"w\"> </span><span class=\"nv\">in</span>\n<span class=\"k\">uptime</span><span class=\"w\">                  </span>#<span class=\"w\"> </span><span class=\"nv\">how</span><span class=\"w\"> </span><span class=\"nv\">long</span><span class=\"w\"> </span><span class=\"nv\">system</span><span class=\"w\"> </span><span class=\"nv\">has</span><span class=\"w\"> </span><span class=\"nv\">been</span><span class=\"w\"> </span><span class=\"nv\">up</span>\n<span class=\"nv\">free</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">h</span><span class=\"w\">                 </span>#<span class=\"w\"> </span><span class=\"nv\">memory</span><span class=\"w\"> </span><span class=\"nv\">usage</span>\n<span class=\"nv\">date</span><span class=\"w\">                    </span>#<span class=\"w\"> </span><span class=\"nv\">current</span><span class=\"w\"> </span><span class=\"nv\">date</span><span class=\"o\">/</span><span class=\"nv\">time</span>\n<span class=\"nv\">history</span><span class=\"w\">                 </span>#<span class=\"w\"> </span><span class=\"nv\">command</span><span class=\"w\"> </span><span class=\"nv\">history</span>\n<span class=\"o\">!!</span><span class=\"w\">                      </span>#<span class=\"w\"> </span><span class=\"nv\">re</span><span class=\"o\">-</span><span class=\"nv\">run</span><span class=\"w\"> </span><span class=\"nv\">last</span><span class=\"w\"> </span><span class=\"nv\">command</span>\n<span class=\"o\">!</span>$<span class=\"w\">                      </span>#<span class=\"w\"> </span><span class=\"nv\">last</span><span class=\"w\"> </span><span class=\"nv\">argument</span><span class=\"w\"> </span><span class=\"nv\">of</span><span class=\"w\"> </span><span class=\"nv\">previous</span><span class=\"w\"> </span><span class=\"nv\">command</span>\n</code></pre></div>\n\n<h2>Quick Reference by Task</h2>\n<table>\n<thead>\n<tr>\n<th>Task</th>\n<th>Command</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Find large files</td>\n<td><code>find . -type f -size +100M</code></td>\n</tr>\n<tr>\n<td>Search in files</td>\n<td><code>grep -rn \"TODO\" .</code></td>\n</tr>\n<tr>\n<td>Count files in directory</td>\n<td><code>ls -1 | wc -l</code></td>\n</tr>\n<tr>\n<td>See disk usage of all mounts</td>\n<td><code>df -h</code></td>\n</tr>\n<tr>\n<td>Check if a port is open</td>\n<td><code>nc -zv host 443</code></td>\n</tr>\n<tr>\n<td>Watch command output every 2s</td>\n<td><code>watch -n 2 command</code></td>\n</tr>\n<tr>\n<td>Create alias permanently</td>\n<td><code>echo 'alias ll=\"ls -la\"' &gt;&gt; ~/.bashrc</code></td>\n</tr>\n</tbody>\n</table>\n<p><strong>See also:</strong> <a href=\"/en/tech/helm-kubernetes-package-management.html\">Helm Charts: Kubernetes Package Management</a>, <a href=\"/en/tech/dev-environment-setup.html\">Developer Environment Setup Guide</a>, <a href=\"/en/tech/kubernetes-services-security.html\">Kubernetes Security Best Practices</a></p>",
      "summary": "Linux 新手必学的 30 个命令，从文件操作、权限管理到进程查看，每个带示例，收藏这一篇就够了。",
      "date_published": "2026-01-22",
      "date_modified": "2026-05-14",
      "tags": [
        "Linux",
        "命令行",
        "教程"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/cli-tools-collection.html",
      "url": "https://aidev.fit/en/tools/cli-tools-collection.html",
      "title": "10 款开发者必备的命令行工具（2026 版）",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "精选 10 款提升终端效率的命令行工具，涵盖文件管理、JSON 处理、Git 增强、系统监控等场景。",
      "date_published": "2026-01-16",
      "date_modified": "2026-01-16",
      "tags": [
        "命令行",
        "开发工具",
        "效率"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/terminal-tools-2026.html",
      "url": "https://aidev.fit/en/tools/terminal-tools-2026.html",
      "title": "2026 年 10 款必装终端工具：让你的命令行效率翻倍",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "从现代终端模拟器到智能 Shell 增强工具，盘点 2026 年程序员最值得安装的 10 款命令行工具。涵盖 Warp、Starship、fzf、zoxide、bat 等效率神器。",
      "date_published": "2026-01-15",
      "date_modified": "2026-01-15",
      "tags": [
        "终端",
        "命令行",
        "效率",
        "开发工具",
        "工具推荐"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/digital-products-guide.html",
      "url": "https://aidev.fit/en/sidehustle/digital-products-guide.html",
      "title": "数字产品创作指南：Notion 模板、Ebook、设计素材怎么做",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "手把手教你创作和销售数字产品——Notion 模板、电子书、设计素材等，一次创作持续变现的被动收入模式。",
      "date_published": "2026-01-09",
      "date_modified": "2026-01-09",
      "tags": [
        "数字产品",
        "被动收入",
        "副业"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/ai-data-analysis.html",
      "url": "https://aidev.fit/en/ai/ai-data-analysis.html",
      "title": "告别 Excel 公式：用 AI 做数据分析实战",
      "content_text": "AI-Powered Data Analysis: Using LLMs for Data Science and Visualization Why LLMs for Data Analysis? Traditional data analysis workflows require proficiency in Python (pandas, NumPy), SQL, and visualization libraries. LLMs lower this barrier: you describe what you want in natural language, and the model generates the code, interprets results, or produces charts directly. In 2026, three approaches dominate: AI-assisted coding (Copilot in Jupyter), natural language to visualization (ChatGPT Code Interpreter/Advanced Data Analysis), and agent-driven analysis (AutoGPT-style pipeline agents). Setting Up Your Environment For the examples below, you need Python 3.10+ with these libraries: pip install pandas numpy matplotlib seaborn openai python-dotenv Load your API key and prepare a sample dataset: import pandas as pd import numpy as np from openai import OpenAI client = OpenAI() df = pd.read_csv(\"sales_data.csv\") print(df.head()) Data Cleaning via Natural Language Instead of remembering pandas syntax, describe the cleaning step: prompt = \"The DataFrame has columns X. Missing values: Y. Write Python code to clean this data.\" response = client.chat.completions.create(model=\"gpt-4o\", messages=[...], temperature=0.1) code = response.choices[0].message.content exec(code) This pattern — describe, generate, execute — lets you clean datasets without memorizing pandas API calls. Keep temperature low (0.1) for deterministic output. Exploratory Analysis with AI LLMs excel at suggesting what to explore. Feed them column metadata and ask for analysis suggestions. The model suggests heatmaps of missing values, distribution plots, time series decompositions, and segmentation analysis. Statistical Testing Made Simple Statistical tests are powerful but easy to misapply. LLMs handle selection and interpretation. This is especially useful for A/B testing, where misapplying a t-test vs Mann-Whitney leads to wrong conclusions. Data Visualization with AI Generate publication-quality charts from natural language descriptions. The LLM handles matplotlib/Seaborn syntax, color palettes, legend placement, and axis formatting. Agent-Based Analysis Pipelines Chain multiple LLM calls into an agent pipeline for complex analysis. The agent can clean data, run correlations, and create dashboards in sequence. Real-World Use Cases Marketing analytics: An e-commerce team reduced weekly reporting from 6 hours to 45 minutes by describing each report section in natural language. Financial analysis: A fintech startup uses LLMs to generate portfolio risk reports. The model reads position data, runs Value-at-Risk calculations, and produces narrative explanations with charts. Healthcare research: Researchers explore clinical trial data with LLMs, which suggest subgroup analyses that traditional workflows miss. Limitations and Best Practices Always validate generated code in a sandbox. Statistical interpretations can be confidently wrong; have domain experts review. Large datasets (100K+ rows) need sampling. Be specific in prompts. Summary LLMs transform data analysis from syntax-heavy coding into collaborative dialogue. This doesn't replace data scientists — it accelerates them. The best analysts in 2026 combine domain expertise with AI-powered tooling. See also: Model Evaluation: Benchmarks, Human Evaluation, LLM-as-Judge, and A/B Testing in Production , Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Fine-Tuning vs RAG: When to Use Each, Hybrid Approaches, Cost Comparison . See also: Building AI-Powered CLI Tools: A Complete Guide for Developers , MCP (Model Context Protocol) Complete Guide: The Standard Connecting AI to Your Tools , AI for DevOps in 2026: Best Tools and Practical Use Cases See also: Building AI-Powered CLI Tools: A Complete Guide for Developers , MCP (Model Context Protocol) Complete Guide: The Standard Connecting AI to Your Tools , AI for DevOps in 2026: Best Tools and Practical Use Cases See also: Building AI-Powered CLI Tools: A Complete Guide for Developers , MCP (Model Context Protocol) Complete Guide: The Standard Connecting AI to Your Tools , AI for DevOps in 2026: Best Tools and Practical Use Cases See also: Building AI-Powered CLI Tools: A Complete Guide for Developers , MCP (Model Context Protocol) Complete Guide: The Standard Connecting AI to Your Tools , AI for DevOps in 2026: Best Tools and Practical Use Cases See also: Building AI-Powered CLI Tools: A Complete Guide for Developers , MCP (Model Context Protocol) Complete Guide: The Standard Connecting AI to Your Tools , AI for DevOps in 2026: Best Tools and Practical Use Cases See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama See also: Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization , Embeddings: Techniques and Best Practices , Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama",
      "content_html": "<h1>AI-Powered Data Analysis: Using LLMs for Data Science and Visualization</h1>\n<h2>Why LLMs for Data Analysis?</h2>\n<p>Traditional data analysis workflows require proficiency in Python (pandas, NumPy), SQL, and visualization libraries. LLMs lower this barrier: you describe what you want in natural language, and the model generates the code, interprets results, or produces charts directly.</p>\n<p>In 2026, three approaches dominate: AI-assisted coding (Copilot in Jupyter), natural language to visualization (ChatGPT Code Interpreter/Advanced Data Analysis), and agent-driven analysis (AutoGPT-style pipeline agents).</p>\n<h2>Setting Up Your Environment</h2>\n<p>For the examples below, you need Python 3.10+ with these libraries:</p>\n<p>pip install pandas numpy matplotlib seaborn openai python-dotenv</p>\n<p>Load your API key and prepare a sample dataset:</p>\n<p>import pandas as pd</p>\n<p>import numpy as np</p>\n<p>from openai import OpenAI</p>\n<p>client = OpenAI()</p>\n<p>df = pd.read_csv(\"sales_data.csv\")</p>\n<p>print(df.head())</p>\n<h2>Data Cleaning via Natural Language</h2>\n<p>Instead of remembering pandas syntax, describe the cleaning step:</p>\n<p>prompt = \"The DataFrame has columns X. Missing values: Y. Write Python code to clean this data.\"</p>\n<p>response = client.chat.completions.create(model=\"gpt-4o\", messages=[...], temperature=0.1)</p>\n<p>code = response.choices[0].message.content</p>\n<p>exec(code)</p>\n<p>This pattern — describe, generate, execute — lets you clean datasets without memorizing pandas API calls. Keep temperature low (0.1) for deterministic output.</p>\n<h2>Exploratory Analysis with AI</h2>\n<p>LLMs excel at suggesting what to explore. Feed them column metadata and ask for analysis suggestions. The model suggests heatmaps of missing values, distribution plots, time series decompositions, and segmentation analysis.</p>\n<h2>Statistical Testing Made Simple</h2>\n<p>Statistical tests are powerful but easy to misapply. LLMs handle selection and interpretation. This is especially useful for A/B testing, where misapplying a t-test vs Mann-Whitney leads to wrong conclusions.</p>\n<h2>Data Visualization with AI</h2>\n<p>Generate publication-quality charts from natural language descriptions. The LLM handles matplotlib/Seaborn syntax, color palettes, legend placement, and axis formatting.</p>\n<h2>Agent-Based Analysis Pipelines</h2>\n<p>Chain multiple LLM calls into an agent pipeline for complex analysis. The agent can clean data, run correlations, and create dashboards in sequence.</p>\n<h2>Real-World Use Cases</h2>\n<p>Marketing analytics: An e-commerce team reduced weekly reporting from 6 hours to 45 minutes by describing each report section in natural language.</p>\n<p>Financial analysis: A fintech startup uses LLMs to generate portfolio risk reports. The model reads position data, runs Value-at-Risk calculations, and produces narrative explanations with charts.</p>\n<p>Healthcare research: Researchers explore clinical trial data with LLMs, which suggest subgroup analyses that traditional workflows miss.</p>\n<h2>Limitations and Best Practices</h2>\n<p>Always validate generated code in a sandbox. Statistical interpretations can be confidently wrong; have domain experts review. Large datasets (100K+ rows) need sampling. Be specific in prompts.</p>\n<h2>Summary</h2>\n<p>LLMs transform data analysis from syntax-heavy coding into collaborative dialogue. This doesn't replace data scientists — it accelerates them. The best analysts in 2026 combine domain expertise with AI-powered tooling.</p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-evaluation-harness.html\">Model Evaluation: Benchmarks, Human Evaluation, LLM-as-Judge, and A/B Testing in Production</a>, <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/fine-tuning-vs-rag.html\">Fine-Tuning vs RAG: When to Use Each, Hybrid Approaches, Cost Comparison</a>.</p>\n<p><strong>See also:</strong> <a href=\"/en/tools/ai-cli-tools-guide.html\">Building AI-Powered CLI Tools: A Complete Guide for Developers</a>, <a href=\"/en/ai/mcp-complete-guide.html\">MCP (Model Context Protocol) Complete Guide: The Standard Connecting AI to Your Tools</a>, <a href=\"/en/ai/ai-devops-tools.html\">AI for DevOps in 2026: Best Tools and Practical Use Cases</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/ai-cli-tools-guide.html\">Building AI-Powered CLI Tools: A Complete Guide for Developers</a>, <a href=\"/en/ai/mcp-complete-guide.html\">MCP (Model Context Protocol) Complete Guide: The Standard Connecting AI to Your Tools</a>, <a href=\"/en/ai/ai-devops-tools.html\">AI for DevOps in 2026: Best Tools and Practical Use Cases</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/ai-cli-tools-guide.html\">Building AI-Powered CLI Tools: A Complete Guide for Developers</a>, <a href=\"/en/ai/mcp-complete-guide.html\">MCP (Model Context Protocol) Complete Guide: The Standard Connecting AI to Your Tools</a>, <a href=\"/en/ai/ai-devops-tools.html\">AI for DevOps in 2026: Best Tools and Practical Use Cases</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/ai-cli-tools-guide.html\">Building AI-Powered CLI Tools: A Complete Guide for Developers</a>, <a href=\"/en/ai/mcp-complete-guide.html\">MCP (Model Context Protocol) Complete Guide: The Standard Connecting AI to Your Tools</a>, <a href=\"/en/ai/ai-devops-tools.html\">AI for DevOps in 2026: Best Tools and Practical Use Cases</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/ai-cli-tools-guide.html\">Building AI-Powered CLI Tools: A Complete Guide for Developers</a>, <a href=\"/en/ai/mcp-complete-guide.html\">MCP (Model Context Protocol) Complete Guide: The Standard Connecting AI to Your Tools</a>, <a href=\"/en/ai/ai-devops-tools.html\">AI for DevOps in 2026: Best Tools and Practical Use Cases</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>\n<p><strong>See also:</strong> <a href=\"/en/ai/model-deployment.html\">Model Deployment: vLLM, TGI, ONNX, Quantization, GPU Optimization</a>, <a href=\"/en/ai/embeddings-techniques.html\">Embeddings: Techniques and Best Practices</a>, <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a></p>",
      "summary": "用自然语言操作数据，上传 CSV 直接出图表和分析报告。详解 ChatGPT Code Interpreter、Julius AI 等工具的真实能力与边界。",
      "date_published": "2026-01-05",
      "date_modified": "2026-05-13",
      "tags": [
        "数据分析",
        "ChatGPT",
        "Python"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/note-apps.html",
      "url": "https://aidev.fit/en/tools/note-apps.html",
      "title": "白板/笔记/思维导图工具对比",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "对比 Notion、Obsidian、Miro、Heptabase 等主流笔记和思维导图工具的优缺点，帮你选适合自己的。",
      "date_published": "2025-12-30",
      "date_modified": "2025-12-30",
      "tags": [
        "效率工具",
        "笔记软件"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/online-tools-2026.html",
      "url": "https://aidev.fit/en/tools/online-tools-2026.html",
      "title": "10 个你每天都会用到的免费在线工具网站",
      "content_text": "10 Free Online Tools You'll Use Every Single Day Not every task needs a full app. Sometimes you just need to convert a file, resize an image, or format some JSON — and you need it done in 10 seconds. These 10 free online tools do exactly that. No signup, no download, no nonsense. 1. TinyPNG / Squoosh Image compression that actually works. TinyPNG shrinks PNGs and JPEGs by 50-80% with no visible quality loss by using smart compression algorithms. For more control, Squoosh (from Google) lets you compare compression codecs side-by-side before downloading. Both are free, browser-based, and require zero registration. 2. Excalidraw The hand-drawn diagram tool. Excalidraw creates diagrams that look hand-drawn — which makes them feel approachable and unfinished in exactly the right way. Perfect for architecture sketches, flowcharts, and wireframes. End-to-end encrypted, collaborative, and open source. Your diagrams are saved as shareable links. 3. CyberChef The \"Cyber Swiss Army Knife.\" CyberChef lets you chain together 300+ data operations: Base64 decode → decompress → parse JSON → extract fields — all in a drag-and-drop pipeline. Built by GCHQ (yes, the British intelligence agency) and completely open source. It runs entirely in your browser — no data ever leaves your machine. 4. JSON Crack JSON → beautiful visual graph. Paste any JSON and JSON Crack turns it into an interactive tree or graph visualization. Far easier to understand complex nested structures than reading raw JSON. Free tier is generous, and the VS Code extension integrates it into your editor. 5. Photopea Photoshop in your browser. Photopea is a near-perfect clone of Photoshop CS6 — layers, filters, blending modes, everything. It opens PSD, Sketch, XD, and GIMP files natively. Free with ads. If you only need Photoshop twice a year, uninstall the Creative Cloud bloat and bookmark Photopea. 6. Image Color Picker Upload → click → get hex code. Upload any image to imagecolorpicker.com , click on a pixel, and get the exact color code in HEX, RGB, and HSL. Also generates a color palette from the image. Faster than opening Photoshop just to sample a color. 7. Remove.bg Remove image backgrounds in 5 seconds. remove.bg uses AI to cut out subjects from backgrounds. One free HD download per account. For bulk use, the API is reasonably priced. The quality on photos of people is shockingly good. 8. PDF24 Tools Everything PDF. PDF24 offers 30+ PDF tools: merge, split, compress, convert to/from Word/Excel/PPT, OCR, sign, and protect. Free, no limits, no registration. Runs locally in your browser — your documents never hit their servers. The best PDF toolset on the web, bar none. 9. CodePen / JSFiddle Instant frontend playgrounds. When you need to test a CSS trick, debug a JavaScript snippet, or share a working demo, these sandboxes let you write HTML/CSS/JS and see results instantly. CodePen is better for sharing/showcasing; JSFiddle is faster for quick tests. 10. Shields.io Badges for your README. shields.io generates those little status badges you see on GitHub repos — build passing, coverage 95%, license MIT, etc. Dynamic badges that update automatically from your CI/CD pipeline. The URL-based API is dead simple once you learn the pattern. See also: Feature Flag Tools: LaunchDarkly vs Unleash vs Flagsmith , Logging Tools: ELK Stack vs Loki vs Splunk , Monitoring Tools: Grafana vs Datadog vs New Relic",
      "content_html": "<h1>10 Free Online Tools You'll Use Every Single Day</h1>\n<p>Not every task needs a full app. Sometimes you just need to convert a file, resize an image, or format some JSON — and you need it done in 10 seconds. These 10 free online tools do exactly that. No signup, no download, no nonsense.</p>\n<h2>1. TinyPNG / Squoosh</h2>\n<p><strong>Image compression that actually works.</strong> <a href=\"https://tinypng.com\">TinyPNG</a> shrinks PNGs and JPEGs by 50-80% with no visible quality loss by using smart compression algorithms. For more control, <a href=\"https://squoosh.app\">Squoosh</a> (from Google) lets you compare compression codecs side-by-side before downloading. Both are free, browser-based, and require zero registration.</p>\n<h2>2. Excalidraw</h2>\n<p><strong>The hand-drawn diagram tool.</strong> <a href=\"https://excalidraw.com\">Excalidraw</a> creates diagrams that look hand-drawn — which makes them feel approachable and unfinished in exactly the right way. Perfect for architecture sketches, flowcharts, and wireframes. End-to-end encrypted, collaborative, and open source. Your diagrams are saved as shareable links.</p>\n<h2>3. CyberChef</h2>\n<p><strong>The \"Cyber Swiss Army Knife.\"</strong> <a href=\"https://gchq.github.io/CyberChef/\">CyberChef</a> lets you chain together 300+ data operations: Base64 decode → decompress → parse JSON → extract fields — all in a drag-and-drop pipeline. Built by GCHQ (yes, the British intelligence agency) and completely open source. It runs entirely in your browser — no data ever leaves your machine.</p>\n<h2>4. JSON Crack</h2>\n<p><strong>JSON → beautiful visual graph.</strong> Paste any JSON and <a href=\"https://jsoncrack.com\">JSON Crack</a> turns it into an interactive tree or graph visualization. Far easier to understand complex nested structures than reading raw JSON. Free tier is generous, and the VS Code extension integrates it into your editor.</p>\n<h2>5. Photopea</h2>\n<p><strong>Photoshop in your browser.</strong> <a href=\"https://photopea.com\">Photopea</a> is a near-perfect clone of Photoshop CS6 — layers, filters, blending modes, everything. It opens PSD, Sketch, XD, and GIMP files natively. Free with ads. If you only need Photoshop twice a year, uninstall the Creative Cloud bloat and bookmark Photopea.</p>\n<h2>6. Image Color Picker</h2>\n<p><strong>Upload → click → get hex code.</strong> Upload any image to <a href=\"https://imagecolorpicker.com\">imagecolorpicker.com</a>, click on a pixel, and get the exact color code in HEX, RGB, and HSL. Also generates a color palette from the image. Faster than opening Photoshop just to sample a color.</p>\n<h2>7. Remove.bg</h2>\n<p><strong>Remove image backgrounds in 5 seconds.</strong> <a href=\"https://remove.bg\">remove.bg</a> uses AI to cut out subjects from backgrounds. One free HD download per account. For bulk use, the API is reasonably priced. The quality on photos of people is shockingly good.</p>\n<h2>8. PDF24 Tools</h2>\n<p><strong>Everything PDF.</strong> <a href=\"https://tools.pdf24.org\">PDF24</a> offers 30+ PDF tools: merge, split, compress, convert to/from Word/Excel/PPT, OCR, sign, and protect. Free, no limits, no registration. Runs locally in your browser — your documents never hit their servers. The best PDF toolset on the web, bar none.</p>\n<h2>9. CodePen / JSFiddle</h2>\n<p><strong>Instant frontend playgrounds.</strong> When you need to test a CSS trick, debug a JavaScript snippet, or share a working demo, these sandboxes let you write HTML/CSS/JS and see results instantly. CodePen is better for sharing/showcasing; JSFiddle is faster for quick tests.</p>\n<h2>10. Shields.io</h2>\n<p><strong>Badges for your README.</strong> <a href=\"https://shields.io\">shields.io</a> generates those little status badges you see on GitHub repos — build passing, coverage 95%, license MIT, etc. Dynamic badges that update automatically from your CI/CD pipeline. The URL-based API is dead simple once you learn the pattern.</p>\n<p><strong>See also:</strong> <a href=\"/en/tools/feature-flag-tools.html\">Feature Flag Tools: LaunchDarkly vs Unleash vs Flagsmith</a>, <a href=\"/en/tools/logging-tools.html\">Logging Tools: ELK Stack vs Loki vs Splunk</a>, <a href=\"/en/tools/monitoring-tools.html\">Monitoring Tools: Grafana vs Datadog vs New Relic</a></p>",
      "summary": "精选 10 个完全免费、无需注册的在线工具，涵盖图片处理、文件转换、文本工具等高频场景，用完即走的轻量工具合集。",
      "date_published": "2025-12-25",
      "date_modified": "2025-12-25",
      "tags": [
        "在线工具",
        "效率",
        "免费"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/programmer-side-hustle.html",
      "url": "https://aidev.fit/en/sidehustle/programmer-side-hustle.html",
      "title": "2026 年程序员接私活指南：渠道、报价、避坑全攻略",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "程序员做副业的完整指南，涵盖国内外接单平台、报价策略、合同模板、税务处理，帮你安全高效地增加收入。",
      "date_published": "2025-12-16",
      "date_modified": "2025-12-16",
      "tags": [
        "接私活",
        "程序员",
        "副业"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/free-images.html",
      "url": "https://aidev.fit/en/sidehustle/free-images.html",
      "title": "免费可商用图片资源汇总",
      "content_text": "Best Free Stock Photo Sites for Commercial Use High-quality images make content 94% more engaging — but stock photos add up fast. These sites offer beautiful, royalty-free images you can use for free, even commercially. Most don't even require attribution (though giving credit is a nice gesture). The Big Three (Start Here) Site Library Size License Standout Feature Unsplash 3M+ images Free for commercial use Highest quality curation. The go-to for \"professional but not stock-photo-y\" images. Pexels 3M+ images + video Free for commercial use Includes free stock videos. Strong search with color filtering. Pixabay 4.2M+ images, videos, vectors Free for commercial use Largest library. Includes illustrations and vector graphics. Quality is more variable. Hidden Gems Site What Makes It Special Burst (by Shopify) Business and ecommerce focused. Great for product mockups and entrepreneur content. Kaboompics Curated by one photographer. Cohesive aesthetic — every image works with every other. Includes a color palette for each photo. Stocksnap No repeat images from the big sites. Smaller library (~5K) but uniquely curated. FoodiesFeed Thousands of high-res food photos. All shot by professional food photographers. If you blog about food, this is your goldmine. Gratisography Quirky, surreal images you won't find elsewhere. A rabbit wearing sunglasses. A serious businessman with a rubber chicken. For when stock photos feel too stock. Illustrations &amp; Icons Site What You Get unDraw Open-source SVG illustrations. Change the color to match your brand with one click. Download as SVG or PNG. Humaaans Mix-and-match illustrations of people. Customize hair, clothing, pose. All free for commercial use. Feather Icons 280+ open-source icons designed on a 24x24 grid. Consistent, minimal, beautiful. The Legal Stuff (in Plain English) \"Free for commercial use\" means you can use it on your blog, in products, in ads — without paying. \"No attribution required\" means you don't need to credit the photographer. But if it's convenient, still do — it helps the ecosystem. Avoid images with recognizable people or brands — those may need a model or property release even if the photo is free. Don't resell the images as-is — that's the one thing the license doesn't allow. Modifying and using in your work is fine. See also: Landing Page Conversion Optimization , SaaS Pricing Strategies , Freelance Pricing Guide for Developers: How to Charge What You're Worth",
      "content_html": "<h1>Best Free Stock Photo Sites for Commercial Use</h1>\n<p>High-quality images make content 94% more engaging — but stock photos add up fast. These sites offer beautiful, royalty-free images you can use for free, even commercially. Most don't even require attribution (though giving credit is a nice gesture).</p>\n<h2>The Big Three (Start Here)</h2>\n<table>\n<thead>\n<tr>\n<th>Site</th>\n<th>Library Size</th>\n<th>License</th>\n<th>Standout Feature</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Unsplash</strong></td>\n<td>3M+ images</td>\n<td>Free for commercial use</td>\n<td>Highest quality curation. The go-to for \"professional but not stock-photo-y\" images.</td>\n</tr>\n<tr>\n<td><strong>Pexels</strong></td>\n<td>3M+ images + video</td>\n<td>Free for commercial use</td>\n<td>Includes free stock videos. Strong search with color filtering.</td>\n</tr>\n<tr>\n<td><strong>Pixabay</strong></td>\n<td>4.2M+ images, videos, vectors</td>\n<td>Free for commercial use</td>\n<td>Largest library. Includes illustrations and vector graphics. Quality is more variable.</td>\n</tr>\n</tbody>\n</table>\n<h2>Hidden Gems</h2>\n<table>\n<thead>\n<tr>\n<th>Site</th>\n<th>What Makes It Special</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Burst (by Shopify)</strong></td>\n<td>Business and ecommerce focused. Great for product mockups and entrepreneur content.</td>\n</tr>\n<tr>\n<td><strong>Kaboompics</strong></td>\n<td>Curated by one photographer. Cohesive aesthetic — every image works with every other. Includes a color palette for each photo.</td>\n</tr>\n<tr>\n<td><strong>Stocksnap</strong></td>\n<td>No repeat images from the big sites. Smaller library (~5K) but uniquely curated.</td>\n</tr>\n<tr>\n<td><strong>FoodiesFeed</strong></td>\n<td>Thousands of high-res food photos. All shot by professional food photographers. If you blog about food, this is your goldmine.</td>\n</tr>\n<tr>\n<td><strong>Gratisography</strong></td>\n<td>Quirky, surreal images you won't find elsewhere. A rabbit wearing sunglasses. A serious businessman with a rubber chicken. For when stock photos feel too stock.</td>\n</tr>\n</tbody>\n</table>\n<h2>Illustrations &amp; Icons</h2>\n<table>\n<thead>\n<tr>\n<th>Site</th>\n<th>What You Get</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>unDraw</strong></td>\n<td>Open-source SVG illustrations. Change the color to match your brand with one click. Download as SVG or PNG.</td>\n</tr>\n<tr>\n<td><strong>Humaaans</strong></td>\n<td>Mix-and-match illustrations of people. Customize hair, clothing, pose. All free for commercial use.</td>\n</tr>\n<tr>\n<td><strong>Feather Icons</strong></td>\n<td>280+ open-source icons designed on a 24x24 grid. Consistent, minimal, beautiful.</td>\n</tr>\n</tbody>\n</table>\n<h2>The Legal Stuff (in Plain English)</h2>\n<ul>\n<li><strong>\"Free for commercial use\"</strong> means you can use it on your blog, in products, in ads — without paying.</li>\n<li><strong>\"No attribution required\"</strong> means you don't need to credit the photographer. But if it's convenient, still do — it helps the ecosystem.</li>\n<li><strong>Avoid images with recognizable people or brands</strong> — those may need a model or property release even if the photo is free.</li>\n<li><strong>Don't resell the images as-is</strong> — that's the one thing the license doesn't allow. Modifying and using in your work is fine.</li>\n</ul>\n<p><strong>See also:</strong> <a href=\"/en/sidehustle/landing-page-conversion.html\">Landing Page Conversion Optimization</a>, <a href=\"/en/sidehustle/saas-pricing.html\">SaaS Pricing Strategies</a>, <a href=\"/en/sidehustle/freelance-pricing-guide.html\">Freelance Pricing Guide for Developers: How to Charge What You're Worth</a></p>",
      "summary": "盘点 10+ 免费可商用的高质量图片资源网站，包括 Unsplash、Pexels、Pixabay 等，设计师和运营必备。",
      "date_published": "2025-12-16",
      "date_modified": "2025-12-16",
      "tags": [
        "图片资源",
        "免费"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/ai-art-monetization.html",
      "url": "https://aidev.fit/en/ai/ai-art-monetization.html",
      "title": "AI 绘画变现指南：从出图到接单的完整路径",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "手把手教你将 AI 绘画技能变现：接单平台、素材销售、自媒体涨粉、定制服务四大路径，附定价策略和接单避坑。",
      "date_published": "2025-12-13",
      "date_modified": "2026-05-14",
      "tags": [
        "AI绘画",
        "变现",
        "Midjourney",
        "副业"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/git-cheatsheet.html",
      "url": "https://aidev.fit/en/tech/git-cheatsheet.html",
      "title": "Git 常用命令速查表",
      "content_text": "Git Commands Cheat Sheet: The Only Reference You Need Git is the backbone of modern software development. This cheat sheet covers every command you'll need in daily work — from basic commits to hairy rebase scenarios. Setup &amp; Configuration git config --global user.name &quot;Your Name&quot; git config --global user.email &quot;you@example.com&quot; git config --global init.defaultBranch main git config --list # show all settings Starting a Repository git init # create a new repo git clone &lt;url&gt; # clone an existing repo git clone -b &lt;branch&gt; &lt;url&gt; # clone a specific branch Staging &amp; Committing git status # what changed? git add &lt;file&gt; # stage a file git add -p # stage interactively (hunks) git commit -m &quot;message&quot; # commit staged changes git commit -am &quot;message&quot; # add tracked files AND commit git commit --amend # fix the last commit message Branching git branch # list local branches git branch &lt;name&gt; # create a branch git checkout &lt;name&gt; # switch to a branch git checkout -b &lt;name&gt; # create AND switch git switch &lt;name&gt; # modern way to switch git switch -c &lt;name&gt; # modern create + switch git merge &lt;branch&gt; # merge branch into current git branch -d &lt;name&gt; # delete a branch (safe) git branch -D &lt;name&gt; # force delete Undoing Things git restore &lt;file&gt; # discard working changes git restore --staged &lt;file&gt; # unstage a file git reset --soft HEAD~1 # undo last commit, keep changes staged git reset --hard HEAD~1 # undo last commit, discard changes (DANGER) git revert &lt;commit&gt; # safe undo — creates a new commit git stash # save uncommitted changes git stash pop # restore stashed changes Remote Repositories git remote -v # list remotes git remote add origin &lt;url&gt; # add a remote git push origin main # push to remote git push -u origin main # push and set upstream git pull origin main # fetch + merge git fetch origin # fetch without merging git push origin --delete &lt;branch&gt; # delete remote branch Log &amp; History git log -- oneline -- graph -- all # pretty history graph git log - p &lt; file &gt; # see changes to a file git blame &lt; file &gt; # who changed what line git diff # unstaged changes git diff -- staged # staged changes git show &lt; commit &gt; # details of a commit Advanced: Interactive Rebase git rebase - i HEAD ~ 3 # squash / reword last 3 commits git rebase - i -- autosquash # auto - squash fixup commits git rebase -- continue | -- abort | -- skip Quick Reference Card Task Command Create branch git checkout -b feature/x Save work git stash Undo last commit git reset --soft HEAD~1 Discard file changes git restore file.txt See what you did git log --oneline -10 Sync with remote git pull --rebase Bookmark this page. You'll be back. See also: Helm Charts: Kubernetes Package Management , Edge Computing in 2026: A Complete Guide for Developers , Webpack vs Vite Comparison",
      "content_html": "<h1>Git Commands Cheat Sheet: The Only Reference You Need</h1>\n<p>Git is the backbone of modern software development. This cheat sheet covers every command you'll need in daily work — from basic commits to hairy rebase scenarios.</p>\n<h2>Setup &amp; Configuration</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"c1\">--global user.name &quot;Your Name&quot;</span>\n<span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"c1\">--global user.email &quot;you@example.com&quot;</span>\n<span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"c1\">--global init.defaultBranch main</span>\n<span class=\"n\">git</span><span class=\"w\"> </span><span class=\"n\">config</span><span class=\"w\"> </span><span class=\"c1\">--list  # show all settings</span>\n</code></pre></div>\n\n<h2>Starting a Repository</h2>\n<div class=\"codehilite\"><pre><span></span><code>git init                    # create a new repo\ngit clone &lt;url&gt;             # clone an existing repo\ngit clone -b &lt;branch&gt; &lt;url&gt; # clone a specific branch\n</code></pre></div>\n\n<h2>Staging &amp; Committing</h2>\n<div class=\"codehilite\"><pre><span></span><code>git status                  # what changed?\ngit add &lt;file&gt;              # stage a file\ngit add -p                  # stage interactively (hunks)\ngit commit -m &quot;message&quot;     # commit staged changes\ngit commit -am &quot;message&quot;    # add tracked files AND commit\ngit commit --amend          # fix the last commit message\n</code></pre></div>\n\n<h2>Branching</h2>\n<div class=\"codehilite\"><pre><span></span><code>git branch                  # list local branches\ngit branch &lt;name&gt;           # create a branch\ngit checkout &lt;name&gt;         # switch to a branch\ngit checkout -b &lt;name&gt;      # create AND switch\ngit switch &lt;name&gt;           # modern way to switch\ngit switch -c &lt;name&gt;        # modern create + switch\ngit merge &lt;branch&gt;          # merge branch into current\ngit branch -d &lt;name&gt;        # delete a branch (safe)\ngit branch -D &lt;name&gt;        # force delete\n</code></pre></div>\n\n<h2>Undoing Things</h2>\n<div class=\"codehilite\"><pre><span></span><code>git restore &lt;file&gt;          # discard working changes\ngit restore --staged &lt;file&gt; # unstage a file\ngit reset --soft HEAD~1     # undo last commit, keep changes staged\ngit reset --hard HEAD~1     # undo last commit, discard changes (DANGER)\ngit revert &lt;commit&gt;         # safe undo — creates a new commit\ngit stash                    # save uncommitted changes\ngit stash pop                # restore stashed changes\n</code></pre></div>\n\n<h2>Remote Repositories</h2>\n<div class=\"codehilite\"><pre><span></span><code>git remote -v                        # list remotes\ngit remote add origin &lt;url&gt;          # add a remote\ngit push origin main                 # push to remote\ngit push -u origin main              # push and set upstream\ngit pull origin main                 # fetch + merge\ngit fetch origin                     # fetch without merging\ngit push origin --delete &lt;branch&gt;    # delete remote branch\n</code></pre></div>\n\n<h2>Log &amp; History</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">log</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">oneline</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">graph</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">all</span><span class=\"w\">      </span>#<span class=\"w\"> </span><span class=\"nv\">pretty</span><span class=\"w\"> </span><span class=\"nv\">history</span><span class=\"w\"> </span><span class=\"nv\">graph</span>\n<span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">log</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">p</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"nv\">file</span><span class=\"o\">&gt;</span><span class=\"w\">                    </span>#<span class=\"w\"> </span><span class=\"nv\">see</span><span class=\"w\"> </span><span class=\"nv\">changes</span><span class=\"w\"> </span><span class=\"nv\">to</span><span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"w\"> </span><span class=\"nv\">file</span>\n<span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">blame</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"nv\">file</span><span class=\"o\">&gt;</span><span class=\"w\">                     </span>#<span class=\"w\"> </span><span class=\"nv\">who</span><span class=\"w\"> </span><span class=\"nv\">changed</span><span class=\"w\"> </span><span class=\"nv\">what</span><span class=\"w\"> </span><span class=\"nv\">line</span>\n<span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">diff</span><span class=\"w\">                             </span>#<span class=\"w\"> </span><span class=\"nv\">unstaged</span><span class=\"w\"> </span><span class=\"nv\">changes</span>\n<span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">diff</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">staged</span><span class=\"w\">                    </span>#<span class=\"w\"> </span><span class=\"nv\">staged</span><span class=\"w\"> </span><span class=\"nv\">changes</span>\n<span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"k\">show</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"nv\">commit</span><span class=\"o\">&gt;</span><span class=\"w\">                    </span>#<span class=\"w\"> </span><span class=\"nv\">details</span><span class=\"w\"> </span><span class=\"nv\">of</span><span class=\"w\"> </span><span class=\"nv\">a</span><span class=\"w\"> </span><span class=\"nv\">commit</span>\n</code></pre></div>\n\n<h2>Advanced: Interactive Rebase</h2>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">rebase</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nv\">HEAD</span><span class=\"o\">~</span><span class=\"mi\">3</span><span class=\"w\">                 </span>#<span class=\"w\"> </span><span class=\"nv\">squash</span><span class=\"o\">/</span><span class=\"nv\">reword</span><span class=\"w\"> </span><span class=\"nv\">last</span><span class=\"w\"> </span><span class=\"mi\">3</span><span class=\"w\"> </span><span class=\"nv\">commits</span>\n<span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">rebase</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">autosquash</span><span class=\"w\">           </span>#<span class=\"w\"> </span><span class=\"nv\">auto</span><span class=\"o\">-</span><span class=\"nv\">squash</span><span class=\"w\"> </span><span class=\"nv\">fixup</span><span class=\"w\"> </span><span class=\"nv\">commits</span>\n<span class=\"nv\">git</span><span class=\"w\"> </span><span class=\"nv\">rebase</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"k\">continue</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">abort</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"o\">--</span><span class=\"nv\">skip</span>\n</code></pre></div>\n\n<h2>Quick Reference Card</h2>\n<table>\n<thead>\n<tr>\n<th>Task</th>\n<th>Command</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Create branch</td>\n<td><code>git checkout -b feature/x</code></td>\n</tr>\n<tr>\n<td>Save work</td>\n<td><code>git stash</code></td>\n</tr>\n<tr>\n<td>Undo last commit</td>\n<td><code>git reset --soft HEAD~1</code></td>\n</tr>\n<tr>\n<td>Discard file changes</td>\n<td><code>git restore file.txt</code></td>\n</tr>\n<tr>\n<td>See what you did</td>\n<td><code>git log --oneline -10</code></td>\n</tr>\n<tr>\n<td>Sync with remote</td>\n<td><code>git pull --rebase</code></td>\n</tr>\n</tbody>\n</table>\n<p>Bookmark this page. You'll be back.</p>\n<p><strong>See also:</strong> <a href=\"/en/tech/helm-kubernetes-package-management.html\">Helm Charts: Kubernetes Package Management</a>, <a href=\"/en/tech/edge-computing-2026-guide.html\">Edge Computing in 2026: A Complete Guide for Developers</a>, <a href=\"/en/tech/webpack-vs-vite-bundlers.html\">Webpack vs Vite Comparison</a></p>",
      "summary": "Git 常用命令速查，涵盖分支管理、撤销操作、暂存与提交、远程协作等核心场景，快速查找即用。",
      "date_published": "2025-12-09",
      "date_modified": "2025-12-09",
      "tags": [
        "Git",
        "命令行"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/perplexity-guide.html",
      "url": "https://aidev.fit/en/ai/perplexity-guide.html",
      "title": "Perplexity 深度使用指南：比 Google 更聪明的搜索方式",
      "content_text": "Perplexity Deep Dive: A Smarter Way to Search Than Google Perplexity isn't just \"Google with AI answers.\" It's a fundamentally different approach to search — one that synthesizes multiple sources into a coherent answer with inline citations, instead of giving you 10 blue links and calling it a day. Here's how to use it like a power user. Perplexity vs Google: When to Use Which Task Use Perplexity Use Google Getting a quick answer to a factual question ✅ OK Researching a topic with multiple perspectives ✅✅ OK Finding a specific website or product OK ✅ Shopping for the best price OK ✅ Checking real-time news/sports/weather ✅ ✅ Deep academic literature review ✅ with Pro Search ✅ with Scholar Core Features Pro Search The free version uses a quick model that's fine for simple questions. Pro Search (Pro plan, $20/mo) does multi-step reasoning: it breaks your question into sub-questions, searches each one, synthesizes the findings, and delivers a comprehensive answer with 20+ citations. For research, competitive analysis, or learning a new topic, it's worth the upgrade. Pro Search query example : &quot;What are the key differences between Rust&#39;s ownership model and Go&#39;s garbage collection, and which performs better for a real-time data processing pipeline?&quot; The AI will : 1. Research Rust ownership model 2. Research Go garbage collection 3. Compare performance characteristics 4. Find real - world benchmarks 5. Synthesize into a structured answer with citations Collections Collections are your personal research libraries. Create a Collection for each project or topic. All searches within a Collection share context — Perplexity remembers what you've already researched and builds on it. You can also add other people to a Collection for collaborative research. Focus Focus lets you scope searches to specific sources: Web — general web search (default) Academic — scientific papers and journals only Writing — generates without searching (like ChatGPT) Wolfram Alpha — computational and mathematical queries YouTube — search video transcripts Reddit — search Reddit discussions Pages Turn any Perplexity thread into a shareable, well-formatted web page with one click. Great for sharing research findings with your team or publishing a quick report. Pro Techniques Chain your searches. Search broad → identify key angles → search each angle deeply → synthesize. This is how professional researchers work. Ask for comparisons. \"Compare X and Y in terms of A, B, and C. Use a table.\" Perplexity excels at structured comparisons with inline citations. Set up a daily briefing Collection. Pin searches like \"Latest developments in [your industry] today\" and refresh daily. Saves scanning 10 news sites. Challenge the answer. \"Are there any studies that contradict this?\" or \"What's the counterargument?\" Perplexity will find opposing views. See also: 25 Best AI Tools for Developers in 2026: Code, Debug, Deploy , RAG Best Practices 2026: Building Production-Ready Retrieval Systems , Midjourney Prompt Guide: From Basics to Pro-Level Images",
      "content_html": "<h1>Perplexity Deep Dive: A Smarter Way to Search Than Google</h1>\n<p>Perplexity isn't just \"Google with AI answers.\" It's a fundamentally different approach to search — one that synthesizes multiple sources into a coherent answer with inline citations, instead of giving you 10 blue links and calling it a day. Here's how to use it like a power user.</p>\n<h2>Perplexity vs Google: When to Use Which</h2>\n<table>\n<thead>\n<tr>\n<th>Task</th>\n<th>Use Perplexity</th>\n<th>Use Google</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Getting a quick answer to a factual question</td>\n<td>✅</td>\n<td>OK</td>\n</tr>\n<tr>\n<td>Researching a topic with multiple perspectives</td>\n<td>✅✅</td>\n<td>OK</td>\n</tr>\n<tr>\n<td>Finding a specific website or product</td>\n<td>OK</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Shopping for the best price</td>\n<td>OK</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Checking real-time news/sports/weather</td>\n<td>✅</td>\n<td>✅</td>\n</tr>\n<tr>\n<td>Deep academic literature review</td>\n<td>✅ with Pro Search</td>\n<td>✅ with Scholar</td>\n</tr>\n</tbody>\n</table>\n<h2>Core Features</h2>\n<h3>Pro Search</h3>\n<p>The free version uses a quick model that's fine for simple questions. <strong>Pro Search</strong> (Pro plan, $20/mo) does multi-step reasoning: it breaks your question into sub-questions, searches each one, synthesizes the findings, and delivers a comprehensive answer with 20+ citations. For research, competitive analysis, or learning a new topic, it's worth the upgrade.</p>\n<div class=\"codehilite\"><pre><span></span><code><span class=\"n\">Pro</span><span class=\"w\"> </span><span class=\"k\">Search</span><span class=\"w\"> </span><span class=\"n\">query</span><span class=\"w\"> </span><span class=\"nl\">example</span><span class=\"p\">:</span>\n<span class=\"ss\">&quot;What are the key differences between Rust&#39;s ownership model and</span>\n<span class=\"ss\">Go&#39;s garbage collection, and which performs better for a real-time</span>\n<span class=\"ss\">data processing pipeline?&quot;</span>\n\n<span class=\"n\">The</span><span class=\"w\"> </span><span class=\"n\">AI</span><span class=\"w\"> </span><span class=\"nl\">will</span><span class=\"p\">:</span>\n<span class=\"mf\">1.</span><span class=\"w\"> </span><span class=\"n\">Research</span><span class=\"w\"> </span><span class=\"n\">Rust</span><span class=\"w\"> </span><span class=\"n\">ownership</span><span class=\"w\"> </span><span class=\"n\">model</span>\n<span class=\"mf\">2.</span><span class=\"w\"> </span><span class=\"n\">Research</span><span class=\"w\"> </span><span class=\"k\">Go</span><span class=\"w\"> </span><span class=\"n\">garbage</span><span class=\"w\"> </span><span class=\"n\">collection</span>\n<span class=\"mf\">3.</span><span class=\"w\"> </span><span class=\"n\">Compare</span><span class=\"w\"> </span><span class=\"n\">performance</span><span class=\"w\"> </span><span class=\"n\">characteristics</span>\n<span class=\"mf\">4.</span><span class=\"w\"> </span><span class=\"n\">Find</span><span class=\"w\"> </span><span class=\"nc\">real</span><span class=\"o\">-</span><span class=\"n\">world</span><span class=\"w\"> </span><span class=\"n\">benchmarks</span>\n<span class=\"mf\">5.</span><span class=\"w\"> </span><span class=\"n\">Synthesize</span><span class=\"w\"> </span><span class=\"k\">into</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"n\">structured</span><span class=\"w\"> </span><span class=\"n\">answer</span><span class=\"w\"> </span><span class=\"k\">with</span><span class=\"w\"> </span><span class=\"n\">citations</span>\n</code></pre></div>\n\n<h3>Collections</h3>\n<p>Collections are your personal research libraries. Create a Collection for each project or topic. All searches within a Collection share context — Perplexity remembers what you've already researched and builds on it. You can also add other people to a Collection for collaborative research.</p>\n<h3>Focus</h3>\n<p>Focus lets you scope searches to specific sources:</p>\n<ul>\n<li><strong>Web</strong> — general web search (default)</li>\n<li><strong>Academic</strong> — scientific papers and journals only</li>\n<li><strong>Writing</strong> — generates without searching (like ChatGPT)</li>\n<li><strong>Wolfram Alpha</strong> — computational and mathematical queries</li>\n<li><strong>YouTube</strong> — search video transcripts</li>\n<li><strong>Reddit</strong> — search Reddit discussions</li>\n</ul>\n<h3>Pages</h3>\n<p>Turn any Perplexity thread into a shareable, well-formatted web page with one click. Great for sharing research findings with your team or publishing a quick report.</p>\n<h2>Pro Techniques</h2>\n<ul>\n<li><strong>Chain your searches.</strong> Search broad → identify key angles → search each angle deeply → synthesize. This is how professional researchers work.</li>\n<li><strong>Ask for comparisons.</strong> \"Compare X and Y in terms of A, B, and C. Use a table.\" Perplexity excels at structured comparisons with inline citations.</li>\n<li><strong>Set up a daily briefing Collection.</strong> Pin searches like \"Latest developments in [your industry] today\" and refresh daily. Saves scanning 10 news sites.</li>\n<li><strong>Challenge the answer.</strong> \"Are there any studies that contradict this?\" or \"What's the counterargument?\" Perplexity will find opposing views.</li>\n</ul>\n<p><strong>See also:</strong> <a href=\"/en/ai/best-ai-tools-developers-2026.html\">25 Best AI Tools for Developers in 2026: Code, Debug, Deploy</a>, <a href=\"/en/ai/rag-best-practices.html\">RAG Best Practices 2026: Building Production-Ready Retrieval Systems</a>, <a href=\"/en/ai/midjourney-prompts.html\">Midjourney Prompt Guide: From Basics to Pro-Level Images</a></p>",
      "summary": "从基础搜索到 Pro Search 深度研究，详解 Perplexity 的 Collections、Focus、Pages 三大功能，附实战查询范例和与传统搜索的对比。",
      "date_published": "2025-12-02",
      "date_modified": "2025-12-02",
      "tags": [
        "Perplexity",
        "AI搜索",
        "效率工具"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/claude-vs-chatgpt.html",
      "url": "https://aidev.fit/en/ai/claude-vs-chatgpt.html",
      "title": "Claude vs ChatGPT 2026 深度对比：哪个 AI 更适合你",
      "content_text": "Claude vs ChatGPT (2026): Which AI Assistant Is Right for You? 2026's AI assistant market is a two-horse race between Claude and ChatGPT. Both are excellent, but they have distinct personalities and strengths. Using the right one for the right task can double your productivity. Core Capability Comparison Dimension ChatGPT Claude Coding Strong — especially code completion and Code Interpreter Excellent — long context understands entire codebases Writing quality Good Best in class — natural tone, nuanced, rarely sounds AI-generated Long document analysis Decent (128K context) Best (200K context, precise citations) Data analysis Strong — Code Interpreter is excellent for spreadsheets Good — Artifacts for interactive output Image generation ✅ DALL·E 3 built in ❌ No image generation Web search ✅ Built-in browsing ❌ Not natively supported Multimodal input Image understanding + generation Image understanding (no generation) Speed Fast (especially 4o mini) Slightly slower but more thorough Cost (Pro tier) Free / Plus $20 / Pro $200 Free / Pro $20 / Team $25 Scenario-by-Scenario Best Pick Writing Code Winner: Tie, leaning Claude. Both are excellent. Claude's advantage is understanding large codebases — feed it your entire repo and it grasps patterns and conventions. ChatGPT's advantage is Code Interpreter for data-heavy coding tasks. For everyday web development, you'll be happy with either. For complex refactoring or code review of a large codebase, Claude pulls ahead. Writing Articles / Copy Winner: Claude. Claude's writing is noticeably more natural in English and dramatically better in Chinese. It understands tone, voice, and nuance at a level that makes ChatGPT feel slightly generic. If you're a writer, blogger, or content creator, Claude is the clear choice. Reading Papers / Long Documents Winner: Claude. The 200K context window means you can feed Claude an entire book or a stack of research papers, and it will cite specific passages with page numbers. ChatGPT can handle long documents too, but Claude's citation accuracy and ability to cross-reference across a massive context is best-in-class. Creating Presentations / Visual Content Winner: ChatGPT. Claude cannot generate images. If you need AI-generated visuals — presentation graphics, social media images, concept art — ChatGPT with DALL·E 3 is your only option between the two. For text-heavy slides, Claude's writing quality helps, but you'll need another tool for the visuals. Daily Q&A; / Assistant Tasks Winner: Tie. Both handle everyday questions well. Claude's answers tend to be more thoughtful and nuanced. ChatGPT's are faster and more concise. Neither is the wrong choice for quick questions. The Optimal Setup Dual-wield the free tiers. Claude Free + ChatGPT Free gives you the best of both worlds at zero cost. Use ChatGPT for image generation, web browsing, and quick answers. Use Claude for deep writing, code review, and document analysis. If you only pay for one: Choose based on your primary use case. Writing and research → Claude Pro. Visual content and web-connected tasks → ChatGPT Plus. The gap between these models is narrowing every quarter. Pick one, learn it deeply, and don't obsess over which is slightly better this week. The time you spend comparing tools is time you could spend building something. See also: Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama , 25 Best AI Tools for Developers in 2026: Code, Debug, Deploy , How to Build a Custom GPT Plugin: Complete Developer Guide",
      "content_html": "<h1>Claude vs ChatGPT (2026): Which AI Assistant Is Right for You?</h1>\n<p>2026's AI assistant market is a two-horse race between Claude and ChatGPT. Both are excellent, but they have distinct personalities and strengths. Using the right one for the right task can double your productivity.</p>\n<h2>Core Capability Comparison</h2>\n<table>\n<thead>\n<tr>\n<th>Dimension</th>\n<th>ChatGPT</th>\n<th>Claude</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Coding</td>\n<td>Strong — especially code completion and Code Interpreter</td>\n<td>Excellent — long context understands entire codebases</td>\n</tr>\n<tr>\n<td>Writing quality</td>\n<td>Good</td>\n<td>Best in class — natural tone, nuanced, rarely sounds AI-generated</td>\n</tr>\n<tr>\n<td>Long document analysis</td>\n<td>Decent (128K context)</td>\n<td>Best (200K context, precise citations)</td>\n</tr>\n<tr>\n<td>Data analysis</td>\n<td>Strong — Code Interpreter is excellent for spreadsheets</td>\n<td>Good — Artifacts for interactive output</td>\n</tr>\n<tr>\n<td>Image generation</td>\n<td>✅ DALL·E 3 built in</td>\n<td>❌ No image generation</td>\n</tr>\n<tr>\n<td>Web search</td>\n<td>✅ Built-in browsing</td>\n<td>❌ Not natively supported</td>\n</tr>\n<tr>\n<td>Multimodal input</td>\n<td>Image understanding + generation</td>\n<td>Image understanding (no generation)</td>\n</tr>\n<tr>\n<td>Speed</td>\n<td>Fast (especially 4o mini)</td>\n<td>Slightly slower but more thorough</td>\n</tr>\n<tr>\n<td>Cost (Pro tier)</td>\n<td>Free / Plus $20 / Pro $200</td>\n<td>Free / Pro $20 / Team $25</td>\n</tr>\n</tbody>\n</table>\n<h2>Scenario-by-Scenario Best Pick</h2>\n<h3>Writing Code</h3>\n<p><strong>Winner: Tie, leaning Claude.</strong> Both are excellent. Claude's advantage is understanding large codebases — feed it your entire repo and it grasps patterns and conventions. ChatGPT's advantage is Code Interpreter for data-heavy coding tasks. For everyday web development, you'll be happy with either. For complex refactoring or code review of a large codebase, Claude pulls ahead.</p>\n<h3>Writing Articles / Copy</h3>\n<p><strong>Winner: Claude.</strong> Claude's writing is noticeably more natural in English and dramatically better in Chinese. It understands tone, voice, and nuance at a level that makes ChatGPT feel slightly generic. If you're a writer, blogger, or content creator, Claude is the clear choice.</p>\n<h3>Reading Papers / Long Documents</h3>\n<p><strong>Winner: Claude.</strong> The 200K context window means you can feed Claude an entire book or a stack of research papers, and it will cite specific passages with page numbers. ChatGPT can handle long documents too, but Claude's citation accuracy and ability to cross-reference across a massive context is best-in-class.</p>\n<h3>Creating Presentations / Visual Content</h3>\n<p><strong>Winner: ChatGPT.</strong> Claude cannot generate images. If you need AI-generated visuals — presentation graphics, social media images, concept art — ChatGPT with DALL·E 3 is your only option between the two. For text-heavy slides, Claude's writing quality helps, but you'll need another tool for the visuals.</p>\n<h3>Daily Q&A; / Assistant Tasks</h3>\n<p><strong>Winner: Tie.</strong> Both handle everyday questions well. Claude's answers tend to be more thoughtful and nuanced. ChatGPT's are faster and more concise. Neither is the wrong choice for quick questions.</p>\n<h2>The Optimal Setup</h2>\n<p><strong>Dual-wield the free tiers.</strong> Claude Free + ChatGPT Free gives you the best of both worlds at zero cost. Use ChatGPT for image generation, web browsing, and quick answers. Use Claude for deep writing, code review, and document analysis.</p>\n<p><strong>If you only pay for one:</strong> Choose based on your primary use case. Writing and research → Claude Pro. Visual content and web-connected tasks → ChatGPT Plus.</p>\n<p>The gap between these models is narrowing every quarter. Pick one, learn it deeply, and don't obsess over which is slightly better this week. The time you spend comparing tools is time you could spend building something.</p>\n<p><strong>See also:</strong> <a href=\"/en/ai/best-llms-for-coding-2026.html\">Best LLMs for Coding in 2026: Claude vs GPT-4o vs Gemini vs DeepSeek vs CodeLlama</a>, <a href=\"/en/ai/best-ai-tools-developers-2026.html\">25 Best AI Tools for Developers in 2026: Code, Debug, Deploy</a>, <a href=\"/en/ai/build-chatgpt-plugin.html\">How to Build a Custom GPT Plugin: Complete Developer Guide</a></p>",
      "summary": "Claude 和 ChatGPT 在编程、写作、分析、多模态等方面的真实能力对比，帮你根据不同场景选择最佳 AI 助手。",
      "date_published": "2025-11-27",
      "date_modified": "2026-05-12",
      "tags": [
        "Claude",
        "ChatGPT",
        "对比评测",
        "AI工具"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/dev-podcasts.html",
      "url": "https://aidev.fit/en/tools/dev-podcasts.html",
      "title": "10 个程序员必听的播客：学技术、追趋势、听故事",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "精选 10 个中文和英文优质技术播客，涵盖编程技能、行业趋势、职业发展和创业故事，通勤和健身时充电最佳。",
      "date_published": "2025-11-21",
      "date_modified": "2025-11-21",
      "tags": [
        "播客",
        "学习资源",
        "开发者"
      ]
    },
    {
      "id": "https://aidev.fit/en/tools/project-management-tools.html",
      "url": "https://aidev.fit/en/tools/project-management-tools.html",
      "title": "2026 年最佳项目管理工具对比：Jira vs Linear vs Notion vs ClickUp",
      "content_text": "Project Management Tools for Developers Project management tools help teams track work, prioritize tasks, and ship software. Developers have specific needs: issue tracking, sprint planning, Git integration, and API access for automation. This guide compares the leading options. Developer Requirements A developer-friendly project management tool should: Integrate with Git providers (GitHub, GitLab, Bitbucket). Support agile workflows (sprints, backlogs, Kanban). Provide a fast, responsive interface. Offer API access for automation. Support markdown for descriptions and comments. Allow developer workflow customization. Linear Linear has become the preferred project management tool for modern software teams. It focuses on speed and developer experience. Key Features: Extremely fast keyboard-first interface. Markdown support with inline code blocks. GitHub/GitLab integration (auto-link PRs, branches). Sprint management with velocity tracking. Cycle-based workflow (Linear's alternative to sprints). Roadmap view for long-term planning. API and GraphQL-based webhooks. // Linear GraphQL API query { issues(filter: { assignee: { email: { eq: \"dev@example.com\" } } }) { nodes { title state { name } labels { nodes { name } } } } } Linking to GitHub: // Branch names auto-create links git checkout -b feature/LIN-123-add-auth // PR with \"LIN-123\" in body auto-links Pros : Fastest interface, excellent keyboard navigation, clean UI, good Git integration. Cons : Paid ($8/user/month), fewer templates, no time tracking. Jira Jira is the most widely used project management tool in enterprise software development. It offers maximum customization at the cost of complexity. Key Features: Highly customizable workflows and issue types. Scrum and Kanban boards. Roadmaps with dependency tracking. Advanced reporting (burndown, velocity, cumulative flow). Deep GitHub/Bitbucket integration. JQL (Jira Query Language) for advanced filtering. Marketplace with thousands of add-ons. // Jira Query Language examples project = \"BACKEND\" AND status != Done ORDER BY priority DESC assignee = currentUser() AND due &lt; now() AND status != Done Pros : Most customizable, enterprise features, extensive integrations, reporting. Cons : Slow and complex, steep learning curve, expensive ($7.75/user/month, but many add-ons cost extra). GitHub Projects GitHub Projects integrates project management directly into the GitHub workflow. It is built on GitHub Issues with a Kanban-style board. Key Features: Tight GitHub integration (issues, PRs, milestones). Kanban board with customizable columns. Markdown description support. Issue templates and forms. Automation via GitHub Actions. Roadmap view (beta). Free for public repositories. GitHub Project automation workflow name: Move issues on: pull_request: types: [opened] jobs: automate: runs-on: ubuntu-latest steps: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\- uses: actions/add-to-project@v1 with: project-url: https://github.com/orgs/myorg/projects/1 github-token: ${{ secrets.PROJECT_TOKEN }} Pros : Native GitHub integration, free, simple, Actions automation. Cons : Limited features compared to dedicated tools, no sprint management, basic reporting. Notion Notion is a flexible workspace that combines notes, databases, and project management. It is popular for its all-in-one approach. Key Features: Databases with custom views (table, board, timeline, calendar). Wiki and documentation alongside project management. Linked databases (same data, multiple views). Templates for various workflows. API for programmatic access. Collaboration with comments and mentions. Pros : All-in-one (wiki + project management), flexible data model, beautiful UI. Cons : Can be slow with large databases, not developer-specific, limited Git integration. Taiga Taiga is an open-source project management platform with a focus on agile methodologies. Key Features: Scrum and Kanban support. User story mapping. Sprint backlog. Burndown charts. Wiki integration. Self-hosted option available. Pros : Open source, self-hostable, good agile support. Cons : Smaller community, less polished than paid options. ClickUp ClickUp is a feature-rich project management tool that aims to replace multiple tools with one platform. Key Features: Multiple views (list, board, Gantt, calendar, mind map). Docs and whiteboards. Goals and OKRs. Time tracking built-in. Automations without coding. Integrations with GitHub, GitLab, Slack. Pros : Most feature-rich, all-in-one platform, good free tier. Cons : Can feel overwhelming, performance issues at scale, less focused than competitors. Comparison Table | Tool | Price | Speed | Git Integration | Sprint Mgmt | API | Self-Host | |------|-------|-------|----------------|-------------|-----|-----------| | Linear | $8/user/mo | Excellent | Good | Yes (cycles) | GraphQL | No | | Jira | $7.75/user/mo | Slow | Excellent | Yes | REST | Yes (DC) | | GitHub Projects | Free | Good | Native | Basic | REST/GH | No | | Notion | $10/user/mo | Medium | Limited | Yes | REST | No | | Taiga | Free/Paid | Good | Limited | Yes | REST | Yes | | ClickUp | $7/user/mo | Medium | Good | Yes | REST | No | Developer Workflow Integration Automated Status Updates: The best project management tools automatically update issue status based on Git activity: Developer creates branch \"fix/LIN-123-timeout\" → Issue moves to \"In Progress\" Developer opens PR with \"Closes LIN-123\" → Issue moves to \"In Review\" PR merges to main → Issue moves to \"Done\" Set this up in Linear via Git integration, in Jira via Smart Commits, or in GitHub Projects via the built-in automation. API-Driven Ticket Creation: !/bin/bash Create a Linear issue from the command line curl -X POST https://api.linear.app/graphql \\ -H \"Authorization: $LINEAR_API_KEY\" \\ -H \"Content-Type: application/json\" \\ -d '{ \"query\": \"mutation { issueCreate(input: { title: \\\"Fix login timeout\\\", teamId: \\\"TEAM_ID\\\", priority: 2 }) { success } }\" }' Recommendations Startups and small teams : Linear (best developer experience) or GitHub Projects (free, native). Enterprise teams : Jira (most customization, compliance features). All-in-one workspace : Notion (documents + project management). Budget-conscious : GitHub Projects (free with GitHub) or Taiga (free, self-hosted). Feature-maximalists : ClickUp (most features, best free tier). Summary The project management tool landscape has shifted toward developer experience. Linear leads for speed and keyboard-first design. Jira remains the enterprise standard despite its complexity. GitHub Projects offers the simplest integration for GitHub-native teams. The trend is toward automation -- the best tools update themselves based on Git activity, reducing administrative overhead. Choose a tool that integrates deeply with your existing workflow rather than forcing your team to adapt to the tool. See also: Issue Tracking Tools: Jira, Linear, GitHub Issues, and More , Developer Note Taking Tools , API Testing Tools Comparison . See also: Developer Note Taking Tools , Issue Tracking Tools: Jira, Linear, GitHub Issues, and More , Best Project Management Tools for Dev Teams 2026: Linear vs Jira vs ClickUp vs Notion See also: Developer Note Taking Tools , Issue Tracking Tools: Jira, Linear, GitHub Issues, and More , Best Project Management Tools for Dev Teams 2026: Linear vs Jira vs ClickUp vs Notion See also: Developer Note Taking Tools , Issue Tracking Tools: Jira, Linear, GitHub Issues, and More , Best Project Management Tools for Dev Teams 2026: Linear vs Jira vs ClickUp vs Notion See also: Developer Note Taking Tools , Issue Tracking Tools: Jira, Linear, GitHub Issues, and More , Best Project Management Tools for Dev Teams 2026: Linear vs Jira vs ClickUp vs Notion See also: Developer Note Taking Tools , Issue Tracking Tools: Jira, Linear, GitHub Issues, and More , Best Project Management Tools for Dev Teams 2026: Linear vs Jira vs ClickUp vs Notion See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients See also: Performance Testing Tools: k6 vs Locust vs JMeter , Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler , Best Database GUI Clients",
      "content_html": "<h1>Project Management Tools for Developers</h1>\n<p>Project management tools help teams track work, prioritize tasks, and ship software. Developers have specific needs: issue tracking, sprint planning, Git integration, and API access for automation. This guide compares the leading options.</p>\n<h2>Developer Requirements</h2>\n<p>A developer-friendly project management tool should:</p>\n<ul>\n<li>\n<p>Integrate with Git providers (GitHub, GitLab, Bitbucket).</p>\n</li>\n<li>\n<p>Support agile workflows (sprints, backlogs, Kanban).</p>\n</li>\n<li>\n<p>Provide a fast, responsive interface.</p>\n</li>\n<li>\n<p>Offer API access for automation.</p>\n</li>\n<li>\n<p>Support markdown for descriptions and comments.</p>\n</li>\n<li>\n<p>Allow developer workflow customization.</p>\n</li>\n</ul>\n<h2>Linear</h2>\n<p>Linear has become the preferred project management tool for modern software teams. It focuses on speed and developer experience.</p>\n<p><strong>Key Features:</strong></p>\n<ul>\n<li>\n<p>Extremely fast keyboard-first interface.</p>\n</li>\n<li>\n<p>Markdown support with inline code blocks.</p>\n</li>\n<li>\n<p>GitHub/GitLab integration (auto-link PRs, branches).</p>\n</li>\n<li>\n<p>Sprint management with velocity tracking.</p>\n</li>\n<li>\n<p>Cycle-based workflow (Linear's alternative to sprints).</p>\n</li>\n<li>\n<p>Roadmap view for long-term planning.</p>\n</li>\n<li>\n<p>API and GraphQL-based webhooks.</p>\n</li>\n</ul>\n<p>// Linear GraphQL API</p>\n<p>query {</p>\n<p>issues(filter: { assignee: { email: { eq: \"dev@example.com\" } } }) {</p>\n<p>nodes {</p>\n<p>title</p>\n<p>state { name }</p>\n<p>labels { nodes { name } }</p>\n<p>}</p>\n<p>}</p>\n<p>}</p>\n<p><strong>Linking to GitHub:</strong></p>\n<p>// Branch names auto-create links</p>\n<p>git checkout -b feature/LIN-123-add-auth</p>\n<p>// PR with \"LIN-123\" in body auto-links</p>\n<p><strong>Pros</strong> : Fastest interface, excellent keyboard navigation, clean UI, good Git integration.</p>\n<p><strong>Cons</strong> : Paid ($8/user/month), fewer templates, no time tracking.</p>\n<h2>Jira</h2>\n<p>Jira is the most widely used project management tool in enterprise software development. It offers maximum customization at the cost of complexity.</p>\n<p><strong>Key Features:</strong></p>\n<ul>\n<li>\n<p>Highly customizable workflows and issue types.</p>\n</li>\n<li>\n<p>Scrum and Kanban boards.</p>\n</li>\n<li>\n<p>Roadmaps with dependency tracking.</p>\n</li>\n<li>\n<p>Advanced reporting (burndown, velocity, cumulative flow).</p>\n</li>\n<li>\n<p>Deep GitHub/Bitbucket integration.</p>\n</li>\n<li>\n<p>JQL (Jira Query Language) for advanced filtering.</p>\n</li>\n<li>\n<p>Marketplace with thousands of add-ons.</p>\n</li>\n</ul>\n<p>// Jira Query Language examples</p>\n<p>project = \"BACKEND\" AND status != Done ORDER BY priority DESC</p>\n<p>assignee = currentUser() AND due &lt; now() AND status != Done</p>\n<p><strong>Pros</strong> : Most customizable, enterprise features, extensive integrations, reporting.</p>\n<p><strong>Cons</strong> : Slow and complex, steep learning curve, expensive ($7.75/user/month, but many add-ons cost extra).</p>\n<h2>GitHub Projects</h2>\n<p>GitHub Projects integrates project management directly into the GitHub workflow. It is built on GitHub Issues with a Kanban-style board.</p>\n<p><strong>Key Features:</strong></p>\n<ul>\n<li>\n<p>Tight GitHub integration (issues, PRs, milestones).</p>\n</li>\n<li>\n<p>Kanban board with customizable columns.</p>\n</li>\n<li>\n<p>Markdown description support.</p>\n</li>\n<li>\n<p>Issue templates and forms.</p>\n</li>\n<li>\n<p>Automation via GitHub Actions.</p>\n</li>\n<li>\n<p>Roadmap view (beta).</p>\n</li>\n<li>\n<p>Free for public repositories.</p>\n</li>\n</ul>\n<h2>GitHub Project automation workflow</h2>\n<p>name: Move issues</p>\n<p>on:</p>\n<p>pull_request:</p>\n<p>types: [opened]</p>\n<p>jobs:</p>\n<p>automate:</p>\n<p>runs-on: ubuntu-latest</p>\n<p>steps:</p>\n<p>\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\- uses: actions/add-to-project@v1</p>\n<p>with:</p>\n<p>project-url: https://github.com/orgs/myorg/projects/1</p>\n<p>github-token: ${{ secrets.PROJECT_TOKEN }}</p>\n<p><strong>Pros</strong> : Native GitHub integration, free, simple, Actions automation.</p>\n<p><strong>Cons</strong> : Limited features compared to dedicated tools, no sprint management, basic reporting.</p>\n<h2>Notion</h2>\n<p>Notion is a flexible workspace that combines notes, databases, and project management. It is popular for its all-in-one approach.</p>\n<p><strong>Key Features:</strong></p>\n<ul>\n<li>\n<p>Databases with custom views (table, board, timeline, calendar).</p>\n</li>\n<li>\n<p>Wiki and documentation alongside project management.</p>\n</li>\n<li>\n<p>Linked databases (same data, multiple views).</p>\n</li>\n<li>\n<p>Templates for various workflows.</p>\n</li>\n<li>\n<p>API for programmatic access.</p>\n</li>\n<li>\n<p>Collaboration with comments and mentions.</p>\n</li>\n</ul>\n<p><strong>Pros</strong> : All-in-one (wiki + project management), flexible data model, beautiful UI.</p>\n<p><strong>Cons</strong> : Can be slow with large databases, not developer-specific, limited Git integration.</p>\n<h2>Taiga</h2>\n<p>Taiga is an open-source project management platform with a focus on agile methodologies.</p>\n<p><strong>Key Features:</strong></p>\n<ul>\n<li>\n<p>Scrum and Kanban support.</p>\n</li>\n<li>\n<p>User story mapping.</p>\n</li>\n<li>\n<p>Sprint backlog.</p>\n</li>\n<li>\n<p>Burndown charts.</p>\n</li>\n<li>\n<p>Wiki integration.</p>\n</li>\n<li>\n<p>Self-hosted option available.</p>\n</li>\n</ul>\n<p><strong>Pros</strong> : Open source, self-hostable, good agile support.</p>\n<p><strong>Cons</strong> : Smaller community, less polished than paid options.</p>\n<h2>ClickUp</h2>\n<p>ClickUp is a feature-rich project management tool that aims to replace multiple tools with one platform.</p>\n<p><strong>Key Features:</strong></p>\n<ul>\n<li>\n<p>Multiple views (list, board, Gantt, calendar, mind map).</p>\n</li>\n<li>\n<p>Docs and whiteboards.</p>\n</li>\n<li>\n<p>Goals and OKRs.</p>\n</li>\n<li>\n<p>Time tracking built-in.</p>\n</li>\n<li>\n<p>Automations without coding.</p>\n</li>\n<li>\n<p>Integrations with GitHub, GitLab, Slack.</p>\n</li>\n</ul>\n<p><strong>Pros</strong> : Most feature-rich, all-in-one platform, good free tier.</p>\n<p><strong>Cons</strong> : Can feel overwhelming, performance issues at scale, less focused than competitors.</p>\n<h2>Comparison Table</h2>\n<p>| Tool | Price | Speed | Git Integration | Sprint Mgmt | API | Self-Host |</p>\n<p>|------|-------|-------|----------------|-------------|-----|-----------|</p>\n<p>| Linear | $8/user/mo | Excellent | Good | Yes (cycles) | GraphQL | No |</p>\n<p>| Jira | $7.75/user/mo | Slow | Excellent | Yes | REST | Yes (DC) |</p>\n<p>| GitHub Projects | Free | Good | Native | Basic | REST/GH | No |</p>\n<p>| Notion | $10/user/mo | Medium | Limited | Yes | REST | No |</p>\n<p>| Taiga | Free/Paid | Good | Limited | Yes | REST | Yes |</p>\n<p>| ClickUp | $7/user/mo | Medium | Good | Yes | REST | No |</p>\n<h2>Developer Workflow Integration</h2>\n<p><strong>Automated Status Updates:</strong></p>\n<p>The best project management tools automatically update issue status based on Git activity:</p>\n<p>Developer creates branch \"fix/LIN-123-timeout\" → Issue moves to \"In Progress\"</p>\n<p>Developer opens PR with \"Closes LIN-123\" → Issue moves to \"In Review\"</p>\n<p>PR merges to main → Issue moves to \"Done\"</p>\n<p>Set this up in Linear via Git integration, in Jira via Smart Commits, or in GitHub Projects via the built-in automation.</p>\n<p><strong>API-Driven Ticket Creation:</strong></p>\n<h2>!/bin/bash</h2>\n<h2>Create a Linear issue from the command line</h2>\n<p>curl -X POST https://api.linear.app/graphql \\</p>\n<p>-H \"Authorization: $LINEAR_API_KEY\" \\</p>\n<p>-H \"Content-Type: application/json\" \\</p>\n<p>-d '{</p>\n<p>\"query\": \"mutation { issueCreate(input: { title: \\\"Fix login timeout\\\", teamId: \\\"TEAM_ID\\\", priority: 2 }) { success } }\"</p>\n<p>}'</p>\n<h2>Recommendations</h2>\n<ul>\n<li>\n<p><strong>Startups and small teams</strong> : Linear (best developer experience) or GitHub Projects (free, native).</p>\n</li>\n<li>\n<p><strong>Enterprise teams</strong> : Jira (most customization, compliance features).</p>\n</li>\n<li>\n<p><strong>All-in-one workspace</strong> : Notion (documents + project management).</p>\n</li>\n<li>\n<p><strong>Budget-conscious</strong> : GitHub Projects (free with GitHub) or Taiga (free, self-hosted).</p>\n</li>\n<li>\n<p><strong>Feature-maximalists</strong> : ClickUp (most features, best free tier).</p>\n</li>\n</ul>\n<h2>Summary</h2>\n<p>The project management tool landscape has shifted toward developer experience. Linear leads for speed and keyboard-first design. Jira remains the enterprise standard despite its complexity. GitHub Projects offers the simplest integration for GitHub-native teams. The trend is toward automation -- the best tools update themselves based on Git activity, reducing administrative overhead. Choose a tool that integrates deeply with your existing workflow rather than forcing your team to adapt to the tool.</p>\n<p><strong>See also:</strong> <a href=\"/en/tools/issue-tracking-tools.html\">Issue Tracking Tools: Jira, Linear, GitHub Issues, and More</a>, <a href=\"/en/tools/note-taking-tools.html\">Developer Note Taking Tools</a>, <a href=\"/en/tools/api-testing-tools.html\">API Testing Tools Comparison</a>.</p>\n<p><strong>See also:</strong> <a href=\"/en/tools/note-taking-tools.html\">Developer Note Taking Tools</a>, <a href=\"/en/tools/issue-tracking-tools.html\">Issue Tracking Tools: Jira, Linear, GitHub Issues, and More</a>, <a href=\"/en/tools/best-project-management-dev.html\">Best Project Management Tools for Dev Teams 2026: Linear vs Jira vs ClickUp vs Notion</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/note-taking-tools.html\">Developer Note Taking Tools</a>, <a href=\"/en/tools/issue-tracking-tools.html\">Issue Tracking Tools: Jira, Linear, GitHub Issues, and More</a>, <a href=\"/en/tools/best-project-management-dev.html\">Best Project Management Tools for Dev Teams 2026: Linear vs Jira vs ClickUp vs Notion</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/note-taking-tools.html\">Developer Note Taking Tools</a>, <a href=\"/en/tools/issue-tracking-tools.html\">Issue Tracking Tools: Jira, Linear, GitHub Issues, and More</a>, <a href=\"/en/tools/best-project-management-dev.html\">Best Project Management Tools for Dev Teams 2026: Linear vs Jira vs ClickUp vs Notion</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/note-taking-tools.html\">Developer Note Taking Tools</a>, <a href=\"/en/tools/issue-tracking-tools.html\">Issue Tracking Tools: Jira, Linear, GitHub Issues, and More</a>, <a href=\"/en/tools/best-project-management-dev.html\">Best Project Management Tools for Dev Teams 2026: Linear vs Jira vs ClickUp vs Notion</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/note-taking-tools.html\">Developer Note Taking Tools</a>, <a href=\"/en/tools/issue-tracking-tools.html\">Issue Tracking Tools: Jira, Linear, GitHub Issues, and More</a>, <a href=\"/en/tools/best-project-management-dev.html\">Best Project Management Tools for Dev Teams 2026: Linear vs Jira vs ClickUp vs Notion</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>\n<p><strong>See also:</strong> <a href=\"/en/tools/performance-testing-tools.html\">Performance Testing Tools: k6 vs Locust vs JMeter</a>, <a href=\"/en/tools/secret-management-tools.html\">Secret Management Tools: Vault vs AWS Secrets Manager vs Doppler</a>, <a href=\"/en/tools/database-clients.html\">Best Database GUI Clients</a></p>",
      "summary": "四大主流项目管理工具全方位横评，涵盖任务管理、自动化、AI 功能、价格，帮团队选出最佳协作平台。",
      "date_published": "2025-11-19",
      "date_modified": "2025-11-19",
      "tags": [
        "项目管理",
        "团队协作",
        "对比评测"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/cross-border-ecommerce.html",
      "url": "https://aidev.fit/en/sidehustle/cross-border-ecommerce.html",
      "title": "跨境电商入门指南：从 0 到第一单的全流程",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "新手友好的跨境电商入门教程，Shopee/Lazada/Tokopedia 三大平台对比，选品、运营、物流全链路讲解。",
      "date_published": "2025-11-14",
      "date_modified": "2025-11-14",
      "tags": [
        "跨境电商",
        "电商",
        "Shopee"
      ]
    },
    {
      "id": "https://aidev.fit/en/sidehustle/affiliate-marketing.html",
      "url": "https://aidev.fit/en/sidehustle/affiliate-marketing.html",
      "title": "Affiliate Marketing 完全入门指南：从 0 到第一笔佣金",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "手把手教你从零开始做联盟营销：选平台、选产品、做内容、引流量，全套实操流程助你拿到第一笔被动收入。",
      "date_published": "2025-11-07",
      "date_modified": "2025-11-07",
      "tags": [
        "联盟营销",
        "被动收入",
        "副业"
      ]
    },
    {
      "id": "https://aidev.fit/en/tech/vscode-extensions.html",
      "url": "https://aidev.fit/en/tech/vscode-extensions.html",
      "title": "VS Code 十大必备插件：让编码效率翻倍",
      "content_text": "10 Must-Have VS Code Extensions to Double Your Productivity A freshly installed VS Code is a blank canvas. The right extensions turn it into the most powerful editor on the planet. Here are the 10 you should install first. 1. GitHub Copilot / Supermaven AI code completion that actually works. Copilot understands your project context and suggests entire functions, not just single lines. If you're looking for a free alternative, Supermaven is surprisingly good for tab completions. Install at least one — coding without AI assistance in 2026 feels like coding without autocomplete. 2. GitLens Git superpowers inside VS Code. Hover over any line to see who changed it and when. Inline blame annotations, rich commit history, branch comparison, and an interactive rebase UI. It makes the built-in Git support feel like a demo. Free for individual use. 3. Prettier The formatter that ended all formatting arguments. Set it as your default formatter, enable \"Format on Save,\" and never think about indentation or line wrapping again. Supports JavaScript, TypeScript, HTML, CSS, JSON, Markdown, and a dozen more languages. 4. ESLint Catches bugs before they happen. It's not just about style — ESLint flags unused variables, missing await, unreachable code, and security patterns. Pair with Prettier for the ultimate code quality setup. 5. Error Lens Shows errors and warnings inline, right in your code — not in a separate panel. The error message appears next to the offending line, color-coded. It sounds small, but seeing errors immediately as you type changes everything. Once you try it, you can't go back. 6. Thunder Client A lightweight API client built into VS Code's sidebar. Think Postman, but it lives in your editor, doesn't require an account, and is much faster for quick API testing. Supports collections, environments, and scriptless testing. 7. Dev Containers Define your development environment in a Dockerfile or docker-compose.yml, and VS Code runs inside the container. Every team member gets the exact same tools and versions — no more \"works on my machine.\" Essential for projects with complex dependencies. 8. Better Comments Color-codes your comments: orange for TODOs, red for FIXMEs, green for notes, blue for info. It makes important comments visually scannable instead of blending into a sea of gray. Simple idea, outsized impact. 9. Path Intellisense Autocompletes file paths as you type imports and requires. Saves you from the \"wait, was it ../../components/Button or ../components/Button ?\" dance. 10. Project Manager Fast switching between projects. Save your favorite repos, assign tags, and jump between them with Ctrl+Shift+P → \"Project Manager: Open.\" If you bounce between multiple codebases, this is a lifesaver. Bonus: Color Theme Pick one good theme and stick with it. Catppuccin , Dracula , and One Dark Pro are community favorites with excellent language coverage. A theme you enjoy looking at for 8 hours a day is worth the 30 seconds to install. See also: Docker in 30 Minutes: From Install to First Container , Git Workflows: Git Flow vs GitHub Flow vs Trunk-Based Development , Infrastructure Testing with Terratest and Other Tools",
      "content_html": "<h1>10 Must-Have VS Code Extensions to Double Your Productivity</h1>\n<p>A freshly installed VS Code is a blank canvas. The right extensions turn it into the most powerful editor on the planet. Here are the 10 you should install first.</p>\n<h2>1. GitHub Copilot / Supermaven</h2>\n<p>AI code completion that actually works. Copilot understands your project context and suggests entire functions, not just single lines. If you're looking for a free alternative, <strong>Supermaven</strong> is surprisingly good for tab completions. Install at least one — coding without AI assistance in 2026 feels like coding without autocomplete.</p>\n<h2>2. GitLens</h2>\n<p>Git superpowers inside VS Code. Hover over any line to see who changed it and when. Inline blame annotations, rich commit history, branch comparison, and an interactive rebase UI. It makes the built-in Git support feel like a demo. Free for individual use.</p>\n<h2>3. Prettier</h2>\n<p>The formatter that ended all formatting arguments. Set it as your default formatter, enable \"Format on Save,\" and never think about indentation or line wrapping again. Supports JavaScript, TypeScript, HTML, CSS, JSON, Markdown, and a dozen more languages.</p>\n<h2>4. ESLint</h2>\n<p>Catches bugs before they happen. It's not just about style — ESLint flags unused variables, missing await, unreachable code, and security patterns. Pair with Prettier for the ultimate code quality setup.</p>\n<h2>5. Error Lens</h2>\n<p>Shows errors and warnings inline, right in your code — not in a separate panel. The error message appears next to the offending line, color-coded. It sounds small, but seeing errors immediately as you type changes everything. Once you try it, you can't go back.</p>\n<h2>6. Thunder Client</h2>\n<p>A lightweight API client built into VS Code's sidebar. Think Postman, but it lives in your editor, doesn't require an account, and is much faster for quick API testing. Supports collections, environments, and scriptless testing.</p>\n<h2>7. Dev Containers</h2>\n<p>Define your development environment in a Dockerfile or docker-compose.yml, and VS Code runs inside the container. Every team member gets the exact same tools and versions — no more \"works on my machine.\" Essential for projects with complex dependencies.</p>\n<h2>8. Better Comments</h2>\n<p>Color-codes your comments: orange for TODOs, red for FIXMEs, green for notes, blue for info. It makes important comments visually scannable instead of blending into a sea of gray. Simple idea, outsized impact.</p>\n<h2>9. Path Intellisense</h2>\n<p>Autocompletes file paths as you type imports and requires. Saves you from the \"wait, was it <code>../../components/Button</code> or <code>../components/Button</code>?\" dance.</p>\n<h2>10. Project Manager</h2>\n<p>Fast switching between projects. Save your favorite repos, assign tags, and jump between them with Ctrl+Shift+P → \"Project Manager: Open.\" If you bounce between multiple codebases, this is a lifesaver.</p>\n<h2>Bonus: Color Theme</h2>\n<p>Pick one good theme and stick with it. <strong>Catppuccin</strong> , <strong>Dracula</strong> , and <strong>One Dark Pro</strong> are community favorites with excellent language coverage. A theme you enjoy looking at for 8 hours a day is worth the 30 seconds to install.</p>\n<p><strong>See also:</strong> <a href=\"/en/tech/docker-quickstart.html\">Docker in 30 Minutes: From Install to First Container</a>, <a href=\"/en/tech/git-workflows-team-guide.html\">Git Workflows: Git Flow vs GitHub Flow vs Trunk-Based Development</a>, <a href=\"/en/tech/infrastructure-testing.html\">Infrastructure Testing with Terratest and Other Tools</a></p>",
      "summary": "精选 10 款 VS Code 必备插件，涵盖 AI 补全、Git 可视化、代码格式化、远程开发等高频场景，新装编辑器第一件事就是装这些。",
      "date_published": "2025-11-05",
      "date_modified": "2025-11-05",
      "tags": [
        "VS Code",
        "编辑器",
        "效率工具"
      ]
    },
    {
      "id": "https://aidev.fit/en/ai/ai-video-tools.html",
      "url": "https://aidev.fit/en/ai/ai-video-tools.html",
      "title": "2025 AI 视频生成工具横评：Sora vs Runway vs Pika",
      "content_text": "Content coming soon.",
      "content_html": "<p>Content coming soon.</p>",
      "summary": "六大 AI 视频工具全方位对比，从画质、价格、易用性到适用场景，帮你选出最适合的 AI 视频创作工具，避免盲目追热点。",
      "date_published": "2025-10-07",
      "date_modified": "2025-10-07",
      "tags": [
        "AI视频",
        "Sora",
        "Runway",
        "视频生成"
      ]
    }
  ]
}