<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Networking · Nhân Tài Đức</title>
    <link>https://jared.lynskey.co.nz/vi/tags/networking/</link>
    <description>Những câu chuyện ngắn về kỹ thuật phần mềm và lãnh đạo đội ngũ kỹ sư — performance review, tuyển dụng và mở rộng team, CI/CD, giám sát DevOps và AI agent. Viết từ Seoul.</description>
    <generator>Hugo</generator>
    <language>vi</language>
    <copyright>© 2026 Nhân Tài Đức</copyright>
    <lastBuildDate>Wed, 28 Oct 2026 00:00:00 +1300</lastBuildDate>
    <atom:link href="https://jared.lynskey.co.nz/vi/tags/networking/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Dùng Cloudflare WARP làm mạng riêng: kết nối laptop, điện thoại và máy trạm của tôi</title>
      <link>https://jared.lynskey.co.nz/vi/posts/2026/2026-10-01-cloudflare-warp-dev-network/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/vi/posts/2026/2026-10-01-cloudflare-warp-dev-network/</guid>
      <pubDate>Thu, 01 Oct 2026 00:00:00 +1200</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Cloudflare</category>
      <category>WARP</category>
      <category>Zero Trust</category>
      <category>Cloudflare Tunnel</category>
      <category>Networking</category>
      <category>SSH</category>
      <category>DevOps</category>
      <category>AI Agents</category>
      <category>Ollama</category>
      <category>Mobile Development</category>
      <category>IPv6</category>
      <description>Cách tôi dùng Cloudflare WARP và hai Cloudflare Tunnel (Zero Trust) để đưa một laptop, một điện thoại chạy 5G và một máy trạm có GPU ở văn phòng vào chung một mạng riêng: IP riêng cố định, không mở cổng nào, và các dev server nằm sau lớp đăng nhập Access.</description>
      <content:encoded><![CDATA[<p>Cloudflare WARP có thể đưa các máy của chính bạn vào chung một mạng riêng mà không cần mở một cổng nào. Trên mỗi máy bạn muốn truy cập tới, hãy chạy một Cloudflare Tunnel (<code>cloudflared</code>) và cho đường hầm đó quảng bá một dải IP riêng; sau đó đăng ký laptop và điện thoại vào một tổ chức Zero Trust, với client WARP đặt ở include mode. Từ đó trở đi, một chiếc điện thoại đang dùng 5G có thể mở một kết nối bình thường tới <code>198.18.42.2</code> và tới thẳng máy trạm ở văn phòng. Dưới đây là cách tôi thiết lập hệ thống của mình, cùng bốn chỗ khiến tôi vấp trên đường đi.</p>
<p>Bộ đồ nghề làm việc của tôi gồm ba cỗ máy hiếm khi ở cùng một chỗ. Thứ nhất là chiếc MacBook Air, tôi đi đâu nó theo đó. Thứ hai là một máy trạm ở văn phòng tên devbox, có GPU thật, chạy Ollama, mấy công cụ fine-tuning, một cụm Kubernetes nhỏ kèm container registry riêng, và bất kỳ agent nào tôi để lại đang cày một tác vụ dài. Thứ ba là điện thoại, nơi các ứng dụng tôi làm ra thật sự được dùng, và phần lớn thời gian trong ngày nó chạy bằng dữ liệu di động chứ không phải wifi.</p>
<p>Suốt một thời gian dài, ba thiết bị này gần như không nói chuyện được với nhau. Laptop chỉ kết nối được tới devbox khi đang ở trong mạng LAN văn phòng, ra ngoài là chịu. Điện thoại truy cập được dev server trên laptop khi cả hai cùng một mạng wifi, mà cũng chỉ khi tôi nhớ bind vào <code>0.0.0.0</code> và gõ đúng địa chỉ mà DHCP cấp cho chiếc Mac sáng hôm đó. Mọi thứ hay ho trên máy trạm, từ API của Ollama, các dashboard của cụm, dữ liệu trace, đến registry, đều được bind vào localhost hoặc mạng nội bộ của cụm, và tôi cố ý làm vậy, vì không thứ nào trong số đó nên nằm trên internet.</p>
<p>Bài này kể cách tôi nối chúng lại bằng Cloudflare WARP và một cặp Cloudflare Tunnel, điều đó đã thay đổi cách tôi làm tính năng AI và ứng dụng di động ra sao, và vài thứ đã hỏng mà chẳng hề báo cho tôi biết.</p>

<h2 class="relative group">Điều tôi thật sự muốn
    <div id="điều-tôi-thật-sự-muốn" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%c4%91i%e1%bb%81u-t%c3%b4i-th%e1%ba%adt-s%e1%bb%b1-mu%e1%bb%91n" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Nếu viết thành yêu cầu thì danh sách khá ngắn:</p>
<ol>
<li>Laptop chỉ nên là máy khách mỏng (thin client). Việc gì cần GPU, cần nhiều RAM hay phải chạy hàng giờ thì để devbox lo, và laptop phải kết nối tới nó theo cùng một cách, dù đang ở văn phòng, ở nhà hay ở quán cà phê.</li>
<li>Điện thoại phải truy cập được dev server và shell của tôi từ bất cứ đâu, qua dữ liệu di động, mà không cần một cái VPN tôi phải nhớ bật tắt.</li>
<li>Những công cụ tôi dùng để xem hệ thống đang chạy thế nào, như dashboard, trace, <code>docker info</code>, danh sách mô hình, chỉ mình tôi truy cập được, và không bao giờ có URL công khai.</li>
<li>Không mở cổng vào (inbound port) nào. Không trên router văn phòng, không trên router ở nhà, không ở đâu cả.</li>
</ol>
<p>Yêu cầu thứ tư loại bỏ luôn lời giải cũ, tức là chuyển tiếp cổng (port forward) cộng với một tên miền DNS động. Nó cũng loại bỏ khá nhiều mẹo khôn lỏi khác: cả devbox lẫn laptop đều nằm sau NAT mà tôi không kiểm soát, và cứ vài tiếng laptop lại nằm sau một NAT khác.</p>

<h2 class="relative group">Trước đây: một repo toàn đường hầm SSH
    <div id="trước-đây-một-repo-toàn-đường-hầm-ssh" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#tr%c6%b0%e1%bb%9bc-%c4%91%c3%a2y-m%e1%bb%99t-repo-to%c3%a0n-%c4%91%c6%b0%e1%bb%9dng-h%e1%ba%a7m-ssh" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Phiên bản đầu tiên là một repo nhỏ tôi tự viết, và đến giờ nó vẫn là lớp nền. Nó giải quyết đúng một bài toán trên laptop: đặt tên gọn gàng cho những thứ tôi truy cập qua SSH, không hơn. dnsmasq trả lời <code>*.test</code> bằng <code>127.0.0.1</code>, Caddy định tuyến theo hostname tới một cổng cục bộ với <code>tls internal</code> để trình duyệt không kêu ca, còn một loạt launch agent chạy autossh giữ cho các đường hầm chuyển tiếp SSH (SSH forward) luôn mở và tự kết nối lại khi bị rớt. Chỉ cần nhìn hostname là biết thứ đó nằm ở đâu:</p>
<table>
	<thead>
			<tr>
					<th>Hậu tố</th>
					<th>Nghĩa là</th>
					<th>Đi qua</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>*.local.test</code></td>
					<td>chính chiếc Mac này</td>
					<td>không qua gì cả, đây là dev server</td>
			</tr>
			<tr>
					<td><code>*.ssh.test</code></td>
					<td>một máy chủ</td>
					<td>một đường chuyển tiếp autossh</td>
			</tr>
			<tr>
					<td><code>*.cloud.test</code></td>
					<td>một ứng dụng đang host trên cloud</td>
					<td>proxy riêng của nền tảng hosting</td>
			</tr>
	</tbody>
</table>
<p>Vậy nên <code>https://devbox-ollama.ssh.test/api/tags</code> liệt kê các mô hình trên máy trạm, còn <code>https://api.local.test</code> là API của ứng dụng tôi đang làm, chạy ngay trên máy tôi.</p>
<p>Tôi dùng tên miền con của <code>.test</code>, chứ không tạo tên miền cấp cao mới như <code>.ssh</code> hay <code>.cloud</code>, và cũng không dùng <code>.local</code>. RFC 6761 dành riêng <code>.test</code> cho đúng mục đích này, còn <code>.local</code> thuộc về mDNS; chiếm nó là tính năng dò tìm Bonjour trên Mac ngừng hoạt động. dnsmasq vốn đã bắt wildcard toàn bộ <code>*.test</code>, nên thêm một nhãn nữa chẳng tốn gì: chỉ một tệp <code>/etc/resolver/test</code> trỏ vào <code>127.0.0.1</code>, và từ đó về sau không phải chỉnh DNS thêm lần nào.</p>

<h3 class="relative group">HTTPS trên những cái tên không hề tồn tại
    <div id="https-trên-những-cái-tên-không-hề-tồn-tại" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#https-tr%c3%aan-nh%e1%bb%afng-c%c3%a1i-t%c3%aan-kh%c3%b4ng-h%e1%bb%81-t%e1%bb%93n-t%e1%ba%a1i" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Tất cả các tên đó đều chạy HTTPS với chứng chỉ mà trình duyệt tin tưởng, nghe thì có vẻ bất khả thi với một hostname chỉ tồn tại trên laptop của tôi. Caddy làm được nhờ tổ chức cấp chứng chỉ (CA) nội bộ của riêng nó. Khai báo <code>tls internal</code> cho một site nghĩa là bảo Caddy cấp chứng chỉ cho site đó từ một CA cục bộ thay vì xin Let&rsquo;s Encrypt, còn <code>caddy trust</code>, được trình cài đặt chạy một lần, đưa chứng chỉ gốc của CA vào System keychain của macOS (Chrome và Safari đọc từ đây) và vào kho chứng chỉ riêng của Firefox. Từ lúc đó, <code>https://anything.test</code> mở ra mà không có cảnh báo chứng chỉ nào, <code>http://</code> thường thì tự chuyển hướng sang, và không có gì rời khỏi máy.</p>
<p>Đây không chỉ là chuyện cho đẹp. Ngày càng nhiều tính năng của nền tảng web từ chối chạy trên HTTP thường: secure cookie, service worker, clipboard API, bất cứ thứ gì có <code>SameSite=None</code>. Kiểm thử một bản web build trên <code>http://localhost</code> thường sẽ che mất những lỗi chỉ lộ ra trên tên miền HTTPS thật. Kiểm thử trên <code>https://app.local.test</code> thì các lỗi ấy hiện ra ngay trên laptop của tôi.</p>
<p>Một khối cấu hình site, dịch vụ nào cũng giống hệt, chỉ khác số cổng:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-caddyfile" data-lang="caddyfile"><span class="line"><span class="cl"><span class="gh">devbox-ollama.ssh.test</span>, <span class="gh">devbox-ollama.test</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="k">tls</span> <span class="no">internal</span>
</span></span><span class="line"><span class="cl">	<span class="k">import</span> cors
</span></span><span class="line"><span class="cl">	<span class="k">reverse_proxy</span> <span class="n">127.0.0.1</span><span class="p">:</span><span class="mi">11435</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">import</span> proxyhdr
</span></span><span class="line"><span class="cl">		<span class="k">transport</span> <span class="s">http</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="k">keepalive</span> <span class="no">off</span>
</span></span><span class="line"><span class="cl">			<span class="k">dial_timeout</span> <span class="mi">5s</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
<p>Hai snippet kia gánh những phần lắt nhắt. <code>cors</code> phản chiếu lại đúng <code>Origin</code> của bên gọi thay vì gửi <code>*</code>, vì <code>*</code> không được phép khi có dính tới thông tin xác thực (credentials), và nó tự trả lời các yêu cầu preflight <code>OPTIONS</code> bằng mã 204 để phía upstream không bao giờ phải lo. <code>proxyhdr</code> ghi đè header <code>Host</code> thành địa chỉ đích. Một số backend khó tính, trong đó có trang quản trị router và endpoint remote-debugging của Chrome, kiểm tra <code>Host</code>, và nếu không ghi đè thì chúng sẽ từ chối <code>devbox-ollama.ssh.test</code> như một cái tên chưa từng nghe tới. Cơ chế kiểm tra origin của chính Ollama chấp nhận loopback ở mọi cổng, nên ghi đè <code>Host</code> thành <code>127.0.0.1:11435</code> là lọt qua.</p>
<p><code>keepalive off</code> là dòng mà nếu tự làm thì tôi đã sai. Phía upstream là các đường chuyển tiếp SSH mà autossh phá đi dựng lại mỗi khi mạng thay đổi. Nếu bật keep-alive, Caddy sẽ giữ một kết nối trong pool tới một đường hầm đã chết từ lâu, và cứ trả về những lỗi 404 khó hiểu cho tới khi được reload. Tắt đi thì mỗi yêu cầu đều kết nối mới, mà trên loopback thì chi phí đó không đo được.</p>
<p>Mỗi dịch vụ cũng trả lời ở tên phẳng cũ của nó (<code>devbox-ollama.test</code>), để các bookmark từ trước khi có hệ hậu tố vẫn dùng được.</p>

<h3 class="relative group">Thanh menu
    <div id="thanh-menu" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#thanh-menu" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Khi đã có cả chục đường chuyển tiếp do launchd giữ mở, câu tôi cứ hỏi mãi là &ldquo;nó có đang chạy không?&rdquo;, và câu trả lời thì nằm ở ba chỗ: <code>launchctl list</code>, <code>lsof</code> và một lệnh <code>curl</code>. Thế nên tôi viết một plugin nhỏ cho thanh menu để gom về một chỗ, mỗi hostname có một chấm màu bên cạnh:</p>
<ul>
<li>🟢 dịch vụ đã trả lời một yêu cầu đi qua đường hầm</li>
<li>🟡 đường hầm đang mở nhưng dịch vụ phía sau im lặng</li>
<li>🔴 không có gì lắng nghe ở cổng cục bộ, tức là chính đường hầm đã sập</li>
</ul>
<p>Trạng thái vàng mới là cái hữu ích. Một phép kiểm tra chỉ có xanh/đỏ không phân biệt được &ldquo;đường chuyển tiếp SSH đã chết&rdquo; với &ldquo;Ollama bị crash ở đầu bên kia&rdquo;, mà hai chuyện đó có cách sửa hoàn toàn khác nhau. Plugin không giữ danh sách dịch vụ riêng mà đọc chính cấu hình proxy và cấu hình SSH mà mọi thứ khác đang dùng, nên thêm một dịch vụ ở đó là nó tự xuất hiện trên menu.</p>
<p>Phiên bản đầu tiên hơi tham. Nó làm mới mỗi mười giây và gọi vài tiến trình cho mỗi dịch vụ, khoảng bảy mươi tiến trình mỗi lượt, và macOS lập tức liệt nó vào danh sách &ldquo;apps using significant energy&rdquo;. Chỉ chụp trạng thái một lần mỗi lượt và làm mới cách vài phút là đủ kéo nó xuống còn khoảng 0.1% một nhân. Một đèn trạng thái mà ngốn pin thì chẳng giúp được ai, nên đáng tính chi phí của nó ngay từ đầu.</p>
<p>Nó có đúng một lỗ hổng, và lại là lỗ hổng quan trọng nhất. devbox không có tên công khai. Đường chuyển tiếp SSH tới nó kết nối vào một địa chỉ <code>192.168.x</code>, nên nó chỉ chạy được khi laptop đang ở trong LAN văn phòng. Ra khỏi văn phòng là thanh menu chuyển đỏ và đỏ luôn, và mọi thứ tôi đã dời sang máy trạm để đỡ tải cho laptop đều nằm ngoài tầm với, đúng vào những lúc tôi không ngồi cạnh nó.</p>

<h2 class="relative group">Hai đường hầm, quay đúng hướng
    <div id="hai-đường-hầm-quay-đúng-hướng" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#hai-%c4%91%c6%b0%e1%bb%9dng-h%e1%ba%a7m-quay-%c4%91%c3%bang-h%c6%b0%e1%bb%9bng" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Cách sửa gồm ba phần, và hai phần đầu là Cloudflare Tunnel.</p>
<p>Một Cloudflare Tunnel là <code>cloudflared</code> giữ một kết nối đi ra (outbound) tới edge của Cloudflare. Cloudflare đẩy các yêu cầu ngược xuống theo chính kết nối đó, nên một máy nằm sau bao nhiêu lớp NAT cũng truy cập được mà không cần thứ gì lắng nghe trên router. Laptop mang ra wifi khách sạn nó vẫn theo, và nó sống sót được cả CGNAT.</p>
<p>Tôi chạy hai đường hầm, mỗi máy một cái, và lý do đáng để nói một câu. Lối tắt dễ thấy là chỉ một đường hầm trên laptop, thêm một quy tắc ingress trỏ tới cổng SSH của devbox trong LAN văn phòng. Cách đó không cần cài gì lên devbox cả. Nhưng nó cũng đi vòng qua laptop, mà laptop lại chính là cái máy rời khỏi văn phòng. Nó sẽ hỏng đúng trong trường hợp mà nó được tạo ra để xử lý. devbox thì đứng yên một chỗ, nên devbox tự giữ kết nối riêng của mình tới edge.</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># config.yml on devbox (runs as a systemd service)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">protocol</span><span class="p">:</span><span class="w"> </span><span class="l">auto       </span><span class="w"> </span><span class="c"># prefer QUIC, fall back to HTTP/2 over TCP 443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">ha-connections</span><span class="p">:</span><span class="w"> </span><span class="m">4</span><span class="w">     </span><span class="c"># mains-powered, its job is to stay reachable</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">warp-routing</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">connectTimeout</span><span class="p">:</span><span class="w"> </span><span class="l">5s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">ingress</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">hostname</span><span class="p">:</span><span class="w"> </span><span class="l">ssh-devbox.example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">service</span><span class="p">:</span><span class="w"> </span><span class="l">tcp://127.0.0.1:22</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">service</span><span class="p">:</span><span class="w"> </span><span class="l">http_status:404</span></span></span></code></pre></div></div>
<p>Dùng <code>tcp://</code> thay vì <code>ssh://</code> là chỗ rất dễ làm sai. <code>ssh://</code> chọn chế độ terminal hiển thị trên trình duyệt của Cloudflare, vốn bọc luồng dữ liệu lại cho một trang web; một client <code>ssh</code> bình thường đi qua đó sẽ nhận được banner rồi chết ngay ở bước trao đổi khóa. <code>tcp://</code> mới là đường ống byte thuần mà <code>cloudflared access ssh</code> cần, và được thêm cái lợi là nó mang được cả <code>scp</code>, <code>rsync</code>, git qua SSH lẫn port forward.</p>
<p>Chính phần sau cùng ấy đã vá lỗ hổng ở lớp SSH. Cấu hình SSH giờ chọn đường đi cho từng kết nối:</p>
<div class="highlight-wrapper"><pre tabindex="0"><code class="language-sshconfig" data-lang="sshconfig">Match originalhost devbox !exec &#34;nc -z -G 1 &lt;office-lan-ip&gt; 22 &gt;/dev/null 2&gt;&amp;1&#34;
    ProxyCommand cloudflared access ssh --hostname ssh-devbox.example.com ...</code></pre></div>
<p>Khi ở trong LAN văn phòng, phép thăm dò thành công và SSH đi thẳng, một bước nhảy. Ở bất kỳ đâu khác, phép thăm dò thất bại và SSH đi qua Cloudflare, xác thực bằng một service token của Access nên không có bước đăng nhập trên trình duyệt nào chắn đường. Phải là <code>Match originalhost</code>, không phải <code>Match host</code>: <code>host</code> so khớp sau khi <code>HostName</code> đã được thay vào, nên lúc đó tên đã thành IP và khối cấu hình không bao giờ kích hoạt. Kết quả là <code>devbox-ollama.ssh.test</code> chạy được ở văn phòng, ở nhà và trên tàu, và chấm trên thanh menu cứ xanh mãi.</p>
<p>Đường hầm của laptop thì đi theo chiều ngược lại. Nó cấp cho các dev server trên Mac những hostname HTTPS công khai thật: với mỗi ứng dụng tôi đang làm, đó là API, WebSocket server và bản web build của nó. Tất cả đều nằm sau Cloudflare Access, phần này tôi sẽ quay lại sau, vì chính nó biến cách làm này từ liều lĩnh thành an toàn.</p>
<p>Thanh menu cũng phải học cách nhận biết cả hai đường hầm, và nó không làm được bằng cách thăm dò. Một đường hầm chiều vào không có cổng cục bộ nào để kiểm tra, một trong hai connector thậm chí không chạy trên laptop, còn phép thử dễ thấy nhất, curl tới <code>ssh-devbox.example.com</code>, lại luôn nhận được câu trả lời từ edge của Cloudflare dù có connector nào gắn vào hay không, nên nó sẽ báo xanh cho một đường hầm đã chết. launchd cũng chẳng khá hơn: <code>cloudflared</code> cứ nằm đó ở trạng thái &ldquo;loaded, exit 0&rdquo; trong khi mọi kết nối tới edge đã rớt hết. Vậy nên với các đường hầm, menu hỏi Cloudflare API xem mỗi đường hầm có connector nào khỏe mạnh không, vì chính điều đó quyết định một lệnh <code>ssh</code> có tới nơi hay không. Nếu không liên lạc được với API, cả phần đó bị bỏ qua luôn thay vì vẽ màu đỏ. Thanh menu là thứ nhìn lướt qua, và một báo động giả ở đó tốn kém hơn một dòng bị thiếu.</p>

<h2 class="relative group">Phần thứ ba: WARP biến nó thành một mạng
    <div id="phần-thứ-ba-warp-biến-nó-thành-một-mạng" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#ph%e1%ba%a7n-th%e1%bb%a9-ba-warp-bi%e1%ba%bfn-n%c3%b3-th%c3%a0nh-m%e1%bb%99t-m%e1%ba%a1ng" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Đường hầm có hostname rất tuyệt cho mọi thứ nói HTTPS, và cho SSH từ một máy chạy được <code>cloudflared</code>. Điện thoại thì không chạy được. Hơn nữa, hostname của đường hầm không phải là một endpoint TCP: edge của Cloudflare chỉ kết thúc (terminate) HTTPS và WebSocket trên đó, nên cổng 22 tại <code>ssh.example.com</code> đóng, và loay hoay với Access đến mấy cũng không mở được.</p>
<p>Đó là việc của WARP. Cloudflare One Agent (tức client WARP bản doanh nghiệp, không phải ứng dụng &ldquo;1.1.1.1&rdquo; cho người dùng phổ thông, vốn không tham gia tổ chức được) được đăng ký trên laptop và điện thoại vào tổ chức Zero Trust của tôi. Mỗi đường hầm quảng bá các tuyến riêng (private route), và một thiết bị đang chạy WARP có thể mở một socket bình thường tới những địa chỉ đó và tới đúng máy. Nó không còn là &ldquo;truy cập dịch vụ này qua tên&rdquo; nữa, mà thành &ldquo;những cỗ máy này đang ở chung một mạng với tôi&rdquo;:</p>
<table>
	<thead>
			<tr>
					<th>Địa chỉ</th>
					<th>Máy</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>198.18.42.1</code> / <code>fd12:3456:789a::1</code></td>
					<td>chiếc MacBook Air</td>
			</tr>
			<tr>
					<td><code>198.18.42.2</code> / <code>fd12:3456:789a::2</code></td>
					<td>devbox</td>
			</tr>
			<tr>
					<td><code>198.18.42.3</code> / <code>fd12:3456:789a::3</code></td>
					<td>một chiếc Mac thứ hai</td>
			</tr>
	</tbody>
</table>
<p>Những địa chỉ này là alias loopback trên từng máy, được tạo lúc khởi động, nên chúng không phụ thuộc vào DHCP hay router nào tôi đang đứng sau. <code>198.18.42.2</code> là devbox, dù đang ở văn phòng, ở nhà hay từ điện thoại dùng 5G. Địa chỉ LAN thật của chiếc Mac đổi mỗi lần tôi di chuyển; địa chỉ này thì không bao giờ đổi.</p>
<p>Chế độ chia tách đường hầm (split tunnel) đặt ở <strong>include mode</strong>, chỉ chứa những tuyến đó (cộng các dải của Cloudflare mà bản thân WARP cần). Chính điều này khiến client dễ sống cùng. Mặc định là exclude mode, khi đó WARP mang mọi thứ trừ một danh sách các dải riêng, nên từng byte điện thoại gửi đi đều đi vòng qua Cloudflare. Cái giá về pin và độ trễ là có thật, đủ để rốt cuộc tôi sẽ chỉ bật nó khi cần, mà như thế thì mất hết ý nghĩa. Ở include mode, lưu lượng tới ba máy của tôi đi qua WARP, còn mọi thứ khác đi theo đường bình thường, không bị động tới. Thế là client cứ bật suốt. <code>warp-cli status</code> trên laptop báo <code>Connected</code> cả ngày và tôi chẳng phải nghĩ đến nó.</p>
<p>Về giao thức truyền tải, tôi dùng MASQUE, tức HTTP/3 trên UDP 443 với HTTP/2 làm phương án dự phòng, thay vì WireGuard trên UDP 2408. Một số nhà mạng và mạng dành cho khách chặn 2408; gần như chẳng ai chặn 443. Chính sách của tổ chức tôi còn bật sẵn thỏa thuận khóa hậu lượng tử (post-quantum key agreement) cho MASQUE, thứ tôi không đi tìm nhưng cũng chẳng dại gì từ chối.</p>

<h2 class="relative group">Vì sao là 198.18, và vì sao lại có địa chỉ IPv6
    <div id="vì-sao-là-19818-và-vì-sao-lại-có-địa-chỉ-ipv6" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#v%c3%ac-sao-l%c3%a0-19818-v%c3%a0-v%c3%ac-sao-l%e1%ba%a1i-c%c3%b3-%c4%91%e1%bb%8ba-ch%e1%bb%89-ipv6" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Các địa chỉ này trông hơi lạ, và những địa chỉ đầu tiên tôi chọn đã sai theo một cách khá bổ ích.</p>
<p>Lần đầu tôi thử <code>10.10.0.1</code>, vì đó là thứ ai cũng nghĩ tới đầu tiên. Nó thất bại ở cả hai chế độ split tunnel. Ở exclude mode, danh sách mặc định của WARP loại trừ mọi dải RFC 1918 cộng <code>100.64.0.0/10</code>, nên client sẽ bỏ lưu lượng tới địa chỉ đó trước khi nó kịp rời thiết bị. Ở include mode, nó sẽ đụng với bất kỳ mạng <code>10.x</code> thật nào tôi tình cờ tham gia; quán cà phê, không gian làm việc chung và rất nhiều văn phòng dùng đúng dải đó. <code>198.18.0.0/15</code> là dải dành cho đo kiểm hiệu năng (benchmarking) theo RFC 2544. Nó được dành riêng, không bao giờ được định tuyến trên internet công cộng, không nằm trong danh sách loại trừ của WARP, và không mạng thông thường nào dùng tới nó. Các địa chỉ IPv6 là ULA (<code>fd00::/8</code>) cũng vì lý do đó.</p>
<p>Còn vì sao lại có IPv6 thì mới là câu chuyện thú vị hơn. Khi địa chỉ v4 đã chạy, tôi thử từ điện thoại qua wifi, mọi thứ ổn, và tôi coi như xong. Dùng 5G thì không chạy. Agent báo <em>connected</em>, đường hầm khỏe mạnh, Access cũng ổn; phép thử qua wifi đã chứng minh tất cả những điều đó. Vấn đề là mạng di động bây giờ phần lớn chỉ có IPv6. Điện thoại hoàn toàn không có IPv4 gốc, và nó truy cập địa chỉ v4 kia qua bộ chuyển đổi 464XLAT của nhà mạng, thứ nằm <em>bên ngoài</em> đường hầm khi danh sách include chỉ chứa một tiền tố v4. Lưu lượng đi ra internet công cộng, nơi <code>198.18.0.0/15</code> không được định tuyến, và bị bỏ đi không một tiếng động. Không có lỗi nào trên điện thoại, không có gì trong log của connector.</p>
<p>Cách sửa là cấp cho mỗi máy một địa chỉ thứ hai mà điện thoại truy cập được trực tiếp qua IPv6, rồi thêm nó vào các tuyến và vào danh sách include. Giờ các địa chỉ <code>fd12:3456:789a::</code> chính là thứ mà client SSH trên điện thoại thật sự dùng khi chạy dữ liệu di động.</p>

<h2 class="relative group">Giảm tải: laptop chỉ còn là một cái terminal
    <div id="giảm-tải-laptop-chỉ-còn-là-một-cái-terminal" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#gi%e1%ba%a3m-t%e1%ba%a3i-laptop-ch%e1%bb%89-c%c3%b2n-l%c3%a0-m%e1%bb%99t-c%c3%a1i-terminal" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Đây mới là phần mà cả hệ thống này tồn tại để phục vụ.</p>
<p><strong>Mô hình và fine-tuning.</strong> Ollama chạy trên devbox và bind vào <code>127.0.0.1:11434</code>. Phần còn lại của LAN văn phòng không nhìn thấy nó, huống gì internet. Trên laptop, nó xuất hiện ở <code>https://devbox-ollama.ssh.test</code>, hoặc dưới dạng một cổng trần cho những công cụ cần thế:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">OLLAMA_HOST</span><span class="o">=</span>127.0.0.1:11435 ollama list</span></span></code></pre></div></div>
<p>Là 11435 chứ không phải 11434, và tôi cố ý: 11434 là cổng mặc định của chính Ollama, nên nếu có ngày laptop cũng chạy một Ollama cục bộ, hai bên sẽ tranh nhau cổng đó, và tùy cái nào khởi động trước mà tôi có thể âm thầm nhận câu trả lời của devbox từ cái Ollama &ldquo;cục bộ&rdquo;.</p>
<p>Hiệu quả thực tế là khi tôi làm một tính năng AI, mô hình mà nó gọi chạy trên GPU của máy trạm chứ không phải của laptop, dù tôi đang ở đâu. Các lượt đánh giá (evaluation), việc tạo embedding cho cả đống tài liệu, một lần fine-tune: tất cả chạy trên devbox, và quạt laptop thì cứ im. Khi đang làm prototype một agent, tôi có thể trỏ nó tới một mô hình cục bộ trên máy trạm và cho nó chạy hết vòng gọi công cụ này đến vòng khác (tool calling) mà không tốn hóa đơn API nào, rồi chuyển sang mô hình được host khi vòng lặp đã đúng.</p>
<p><strong>Agent chạy dài.</strong> Một phiên agent chạy cả tiếng đồng hồ không nên phụ thuộc vào việc nắp laptop có mở hay không. Chạy nó trên devbox thì laptop chỉ còn là một ô cửa sổ nhìn vào: gập máy lại, lát sau <code>ssh devbox</code> từ bất cứ đâu tôi đang ở, hay từ điện thoại, và nó vẫn còn đó. Trước khi có đường hầm, điều này chỉ làm được ở văn phòng, mà đó lại chính là nơi tôi không cần đến nó.</p>
<p><strong>Build và cụm máy.</strong> Cụm trên devbox có registry riêng, nên image có thể được build và push ngay trên máy trạm, cạnh nơi chúng sẽ chạy, thay vì upload từ laptop qua wifi khách sạn. Dashboard của cụm, dashboard của ingress và giao diện của registry đều là các hostname <code>*.ssh.test</code> trên laptop.</p>
<p><strong>Vòng lặp phát triển di động.</strong> Điện thoại ở cùng mạng riêng với laptop, và các dev server trên laptop cũng có hostname công khai nằm sau Access. Vậy nên tôi có thể mang một bản build native của ứng dụng ra khỏi tòa nhà, dùng 5G, và nó vẫn nói chuyện với API đang chạy trên bàn làm việc của tôi. Hoặc với API trên devbox, nếu tôi để nó chạy ở đó. Trước đây, vòng phản hồi trên thiết bị thật qua mạng di động thật đồng nghĩa với việc triển khai lên một staging server dùng chung. Giờ nó chỉ còn là lưu một tệp.</p>
<p>Có một cái bẫy ở đây, nên biết trước khi bạn đi debug nó như lỗi của ứng dụng. Access cũng bảo vệ cả hostname WebSocket, mà client WebSocket native thì không phải trình duyệt. Nó không mang cookie <code>CF_Authorization</code>, nên kết nối từ bản build native tới WebSocket server bị chặn ngay ở edge với mã 403, trông chẳng giống lỗi do server của bạn trả về chút nào. Các tab trình duyệt thì không sao vì chúng đã giữ cookie từ lúc đăng nhập. Với mọi thứ không phải trình duyệt (ứng dụng native, một script, một agent gọi API dev), lời giải là một <strong>service token</strong> của Access, gửi dưới dạng hai header:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">CF-Access-Client-Id:     &lt;client_id&gt;
</span></span><span class="line"><span class="cl">CF-Access-Client-Secret: &lt;client_secret&gt;</span></span></code></pre></div></div>
<p>Bản thân token không cấp quyền gì. Access chỉ chấp nhận nó ở những ứng dụng có policy nêu tên nó, nên phạm vi của nó đúng bằng danh sách hostname dev, không rộng hơn. Tôi xếp policy của nó vào quyết định <code>non_identity</code> thay vì <code>allow</code>, để trong audit log nó vẫn hiện ra là một bí mật dạng bearer, chứ không phải một người đã đăng nhập.</p>

<h2 class="relative group">Những chỉ số internet không bao giờ thấy
    <div id="những-chỉ-số-internet-không-bao-giờ-thấy" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#nh%e1%bb%afng-ch%e1%bb%89-s%e1%bb%91-internet-kh%c3%b4ng-bao-gi%e1%bb%9d-th%e1%ba%a5y" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Nửa còn lại của điều tôi muốn là khả năng quan sát. Phần lớn những thứ cho bạn biết một hệ thống đang chạy thế nào, một cách đúng đắn, đều không công khai. Trên devbox, đó là:</p>
<ul>
<li>dashboard của ingress proxy, và giao diện tracing chứa trace của nó</li>
<li>một dashboard cho cụm Kubernetes</li>
<li>giao diện của container registry (chỉ đọc)</li>
<li>danh sách mô hình của Ollama và những gì đang được nạp lúc này</li>
<li><code>docker info</code> và số liệu thống kê của container</li>
</ul>
<p>Không thứ nào trong số đó có hostname công khai, và sẽ không bao giờ có. Chúng được bind vào loopback hoặc IP dịch vụ của cụm, truy cập qua một đường chuyển tiếp SSH mà bản thân nó lại chạy trên đường hầm. Một ứng dụng giám sát trên điện thoại đọc <code>docker info --format '{{json .}}'</code> qua SSH xuyên WARP, nên từ đâu tôi cũng xem được các container của mình có đang chạy không, hay có thứ gì đã ngốn hết bộ nhớ.</p>
<p>Chính ứng dụng đó giúp tôi tìm ra một lỗi nhỏ đáng kể lại. sshd dành cho đường hầm trên Mac vẫn đang để <code>LogLevel DEBUG2</code> từ hồi tôi debug nó. Với <code>-e</code>, sshd ghi log ra stderr, và với một phiên SSH thì stderr đó <em>chính là</em> stderr của kênh SSH. Output của mọi lệnh đều trả về kèm thêm dòng <code>debug2: do_setup_env: set TMPDIR</code> ở cuối, và ứng dụng trên điện thoại, vốn gộp hai luồng lại, nhận được JSON hợp lệ theo sau là một dòng log, parse thất bại, rồi hiển thị toàn bộ như một lỗi. Đổi sang <code>LogLevel INFO</code> là xong. Debug xong nhớ trả log level về như cũ.</p>
<p>Cũng có chủ đích không kém là những thứ tôi <em>không</em> đưa lên mạng này. Các đường hầm autossh cũ còn truy cập tới vài router trên mạng của người khác mà tôi giúp trông coi. Những router đó không có hostname công khai và không có tuyến WARP. Một trang quản trị router nằm trên internet là một rủi ro, dù có đăng nhập chắn phía trước, và đó cũng không phải mạng của tôi để mà mở rộng.</p>

<h2 class="relative group">Access là bắt buộc
    <div id="access-là-bắt-buộc" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#access-l%c3%a0-b%e1%ba%aft-bu%e1%bb%99c" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Hostname của một Cloudflare Tunnel nằm trên internet công cộng ngay khi bản ghi DNS của nó tồn tại. Không có tường lửa nào đứng trước nó; không mở cổng chính là mục đích của cả việc này. Lớp bảo vệ phải đến từ edge của Cloudflare, và đó là việc Access làm. Nó từ chối chuyển tiếp bất kỳ yêu cầu nào cho tới khi người truy cập chứng minh được mình là ai, nên một công cụ quét chưa xác thực không bao giờ chạm tới được laptop. Điều đó quan trọng, vì đây là các dev server: một traceback ở chế độ debug kèm cả settings, một JavaScript bundler mở toang. Không thứ gì đằng sau các hostname này được làm ra để đối mặt với internet.</p>
<p>Policy chỉ cho phép chính các địa chỉ email của tôi, không gì khác, với hai cách chứng minh là mã PIN dùng một lần gửi qua email và đăng nhập một lần (SSO). Phiên đăng nhập kéo dài tám tiếng, vì mối đe dọa thực tế là một chiếc laptop bỏ mở ở quán cà phê với cookie có hạn cả ngày, chứ không phải ai đó dò mã PIN bằng brute-force.</p>
<p>SSH được xác thực hai lần, bởi hai hệ thống không hề biết đến nhau. Access quyết định một luồng TCP có được phép tới sshd hay không; sshd thì vẫn đòi khóa của tôi. Mất một trong hai cũng không mở được máy. sshd dành cho đường hầm trên Mac còn tin tưởng SSH CA của Cloudflare, nên Access có thể đăng nhập cho tôi bằng một chứng chỉ ngắn hạn được cấp từ phiên SSO, trong khi <code>authorized_keys</code> vẫn chạy song song, để một cấu hình Access bị hỏng không thể khóa tôi ra khỏi chính laptop của mình.</p>
<p>Phần tôi hài lòng nhất lại là một chi tiết nhỏ. Việc lộ ra ngoài xảy ra khi ba thứ cùng khớp: một bản ghi DNS, một connector đang chạy và một zone đang hoạt động. Chúng trở thành đúng vào những thời điểm khác nhau, theo thứ tự tôi không kiểm soát được; zone tự chuyển sang active, vào một lúc nào đó sau khi nameserver được đổi, rất có thể trong lúc chiếc Mac đang ngủ. Vậy nên launch agent không chạy <code>cloudflared</code> trực tiếp. Nó chạy một bước kiểm tra trước (preflight): đọc các hostname từ chính cấu hình của đường hầm, hỏi Access API xem hostname nào đã được bảo vệ, và từ chối khởi động nếu còn cái nào chưa:</p>
<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">HOSTNAMES</span><span class="o">=</span><span class="k">$(</span>grep -E <span class="s1">&#39;^\s*-\s*hostname:&#39;</span> <span class="s2">&#34;</span><span class="nv">$CONFIG</span><span class="s2">&#34;</span> <span class="p">|</span> sed -E <span class="s1">&#39;s/.*hostname:\s*//&#39;</span> <span class="p">|</span> sort -u<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">PROTECTED</span><span class="o">=</span><span class="k">$(</span>curl -fsS -H <span class="s2">&#34;Authorization: Bearer </span><span class="nv">$CLOUDFLARE_API_TOKEN</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">    <span class="s2">&#34;https://api.cloudflare.com/client/v4/accounts/</span><span class="nv">$CLOUDFLARE_ACCOUNT_ID</span><span class="s2">/access/apps?per_page=100&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">    <span class="p">|</span> python3 -c <span class="s1">&#39;import sys,json; print(&#34;\n&#34;.join(a.get(&#34;domain&#34;,&#34;&#34;) for a in json.load(sys.stdin)[&#34;result&#34;]))&#39;</span><span class="k">)</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">    <span class="o">||</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">&#34;could not reach the Access API. refusing (fail closed).&#34;</span><span class="p">;</span> <span class="nb">exit</span> 1<span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> h in <span class="nv">$HOSTNAMES</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    grep -qxF <span class="s2">&#34;</span><span class="nv">$h</span><span class="s2">&#34;</span> <span class="o">&lt;&lt;&lt;</span><span class="s2">&#34;</span><span class="nv">$PROTECTED</span><span class="s2">&#34;</span> <span class="o">||</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">&#34;NOT starting: </span><span class="nv">$h</span><span class="s2"> has no Access app&#34;</span><span class="p">;</span> <span class="nb">exit</span> 1<span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl"><span class="nb">exec</span> cloudflared tunnel --config <span class="s2">&#34;</span><span class="nv">$CONFIG</span><span class="s2">&#34;</span> run</span></span></code></pre></div></div>
<p>Launch agent có <code>KeepAlive</code>, nên một lần từ chối sẽ tự thử lại sau mỗi 30 giây, và đường hầm tự lên khi các Access app đã tồn tại. Thất bại theo hướng đóng (fail closed) thì cái giá là một lần gián đoạn. Thất bại theo hướng mở (fail open) thì cái giá là bị lộ. Tôi biết mình thà phải giải thích chuyện nào hơn.</p>

<h2 class="relative group">Bốn chỗ khiến tôi vấp
    <div id="bốn-chỗ-khiến-tôi-vấp" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#b%e1%bb%91n-ch%e1%bb%97-khi%e1%ba%bfn-t%c3%b4i-v%e1%ba%a5p" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Mọi thứ ở trên giờ đều chạy. Nhưng trên đường tới đây, ba trong bốn chỗ có cùng một kiểu: thứ bị hỏng không sinh ra lỗi ở bất cứ đâu, còn những phần tôi nhìn thấy được thì đều báo khỏe mạnh.</p>
<p><strong>Tuyến và danh sách include là hai danh sách khác nhau.</strong> Một tuyến của đường hầm khiến Cloudflare <em>sẵn lòng</em> mang một địa chỉ tới đúng connector. Danh sách include của WARP mới là thứ khiến client <em>gửi</em> nó đi ngay từ đầu. devbox không truy cập được từ điện thoại vì các tuyến của nó đã có, nhưng danh sách include vẫn chỉ chứa địa chỉ của chiếc Mac. Điện thoại bỏ gói tin ngay tại máy, connector không hề thấy luồng nào, và dashboard nào cũng xanh. Mỗi máy mới đồng nghĩa với việc thêm địa chỉ của nó vào cả hai nơi.</p>
<p><strong>Địa chỉ IPv4 viết cứng trên mạng di động chỉ có IPv6.</strong> Đã kể ở trên: chạy trên wifi, hỏng trên 5G, không có lỗi. Nếu một tuyến WARP chạy trên wifi mà không chạy trên dữ liệu di động, trong khi Agent vẫn báo connected, thì vấn đề nằm ở định tuyến, không phải ở đường hầm.</p>
<p><strong>sshd của macOS đằng sau cloudflared.</strong> macOS khởi động sshd bằng cơ chế kích hoạt qua socket của launchd, mỗi kết nối một tiến trình <code>sshd -i</code> sống ngắn. Đằng sau cloudflared, banner tới được client rồi luồng bị cắt trước khi chuỗi nhận dạng của client kịp gửi ngược lại, nên mọi lần đăng nhập đều chết ở <code>kex_exchange_identification</code>. Tôi đã xác nhận từ cả hai đầu và tái hiện được bằng một bộ chuyển tiếp TCP thuần, qua đó loại trừ Cloudflare. Cách sửa là chạy thêm một <code>sshd -D</code> độc lập thứ hai trên <code>127.0.0.1:2222</code> và các địa chỉ loopback của WARP, chạy dưới user của tôi, chỉ để làm origin cho đường hầm. Remote Login trong System Settings không bị đụng tới. devbox chạy Linux với một sshd sống lâu bình thường, nên chưa bao giờ gặp vấn đề này.</p>
<p><strong>Những trường cấu hình không còn tồn tại.</strong> Các ví dụ cũ vẫn ghi <code>warp-routing: enabled: true</code> trong cấu hình đường hầm. cloudflared 2026.8 từ chối thẳng trường đó. WARP routing được bật hễ khối cấu hình tồn tại và có một tuyến trỏ tới đường hầm. Ít ra cái này còn báo lỗi, mà sau ba vụ kia thì như thế đã là hào phóng lắm rồi.</p>

<h2 class="relative group">Những gì đã thay đổi
    <div id="những-gì-đã-thay-đổi" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#nh%e1%bb%afng-g%c3%ac-%c4%91%c3%a3-thay-%c4%91%e1%bb%95i" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Tóm lại một cách thành thật: tôi không còn chọn chỗ làm việc dựa trên chỗ đặt phần cứng nữa. Laptop là một bàn phím tốt, một màn hình tốt với thời lượng pin dài, và nó không cần phải hơn thế. Máy trạm gánh phần việc nặng dù tôi đang ở đâu. Điện thoại là một thiết bị kiểm thử thật trên một mạng thật, chứ không phải thứ bị buộc vào wifi văn phòng. Và những phần của hệ thống mà tôi dùng để xem nó đang làm gì thì chỉ cách tôi một cú bấm, còn với người khác thì chúng không hề tồn tại.</p>
<p>Ở quy mô này, mọi thứ nằm gọn trong gói Zero Trust miễn phí của Cloudflare. Cái giá tôi phải trả là thời gian, và một tệp README mà tôi mừng vì đã viết, vì nếu không thì mỗi lỗi ở trên đều sẽ lại là một bí ẩn mới ở lần gặp thứ hai.</p>
<p>Nếu bạn đang tính làm điều gì đó tương tự, đây là những câu tôi sẽ hỏi về hệ thống của bạn:</p>
<ol>
<li>Thứ gì đang chạy trên laptop của bạn chỉ vì laptop là cái máy duy nhất bạn luôn truy cập được?</li>
<li>Điện thoại của bạn có truy cập được dev server qua dữ liệu di động không, chứ không chỉ qua wifi văn phòng? Hãy thử trên 5G, đừng thử trên wifi.</li>
<li>Dashboard nào của bạn đang công khai chỉ vì đó là cách dễ nhất để xem nó từ bên ngoài? Mỗi cái như thế đều là ứng viên để chuyển sang một tuyến riêng.</li>
<li>Nếu ngày mai một hostname của đường hầm được bật lên mà chưa có Access app, thứ gì sẽ chặn nó lại? Nếu câu trả lời là &ldquo;tôi sẽ nhớ&rdquo;, hãy viết bước preflight.</li>
<li>Các địa chỉ riêng của bạn có nằm trong một dải mà những mạng bạn ghé qua sẽ không bao giờ dùng không?</li>
</ol>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2026/2026-10-01-cloudflare-warp-dev-network/featured.jpg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>Coffee chat là gì? Khác gì với phỏng vấn, và nên hỏi gì?</title>
      <link>https://jared.lynskey.co.nz/vi/posts/2024/2024-07-12-coffee-chats/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/vi/posts/2024/2024-07-12-coffee-chats/</guid>
      <pubDate>Fri, 12 Jul 2024 00:30:03 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Engineering Manager</category>
      <category>Team</category>
      <category>People</category>
      <category>Team Size</category>
      <category>Scaling</category>
      <category>Efficiency</category>
      <category>Talent Scouting</category>
      <category>Coffee Chat</category>
      <category>Recruitment</category>
      <category>Hiring</category>
      <category>Culture Fit</category>
      <category>Networking</category>
      <description>Coffee chat là một buổi trò chuyện không chính thức chừng 30–45 phút, ở quán cà phê hoặc qua cuộc gọi video, để hai bên xem có nên nói chuyện sâu hơn hay không. Nó không phải buổi phỏng vấn. Vì sao đây đã thành cách tôi thích nhất để làm quen với lập trình viên, tôi tổ chức ra sao, nên hỏi gì, nên mặc gì và nói chuyện gì nếu bạn là người được mời, và những kiểu làm hỏng buổi gặp thường gặp.</description>
      <content:encoded><![CDATA[<p>Những lập trình viên mà tôi muốn tuyển nhất thì chẳng bao giờ xuất hiện trên các trang tuyển dụng. Họ đang cắm cúi xây dựng một thứ gì đó, khá hài lòng với chỗ làm hiện tại, và luôn dè chừng tin nhắn của chuyên viên tuyển dụng, mà dè chừng cũng phải thôi. Từ khi chuyển sang làm quản lý kỹ thuật (Engineering Manager) hồi đầu năm nay, công cụ tôi dựa vào để gặp được những người như vậy đơn giản đến mức hơi ngại nói ra: một ly cà phê.</p>
<p>Một buổi cà phê trò chuyện (coffee chat) kéo dài khoảng 30–45 phút, không chính thức, ngồi ở quán cà phê hoặc gọi video. Không có bảng trắng, không có hội đồng, không có câu hỏi mẹo. Tôi kể về sản phẩm chúng tôi đang làm và vì sao lại làm nó, còn họ kể về công việc hiện tại và điều họ muốn làm tiếp theo. Cuối buổi, cả hai đều biết có nên nói chuyện sâu hơn hay không. Với tôi, tuyển dụng giống bài toán ghép cặp hơn là bài toán sàng lọc, và đây là cách nhanh nhất tôi biết để hai bên trao đổi đúng những thông tin cần cho việc ghép cặp đó.</p>

<h4 class="relative group">Vì sao tôi chịu khó làm việc này
    <div id="vì-sao-tôi-chịu-khó-làm-việc-này" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#v%c3%ac-sao-t%c3%b4i-ch%e1%bb%8bu-kh%c3%b3-l%c3%a0m-vi%e1%bb%87c-n%c3%a0y" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p>Tôi không còn coi những buổi này là tuyển dụng nữa. Đó chỉ là những cuộc trò chuyện, và thỉnh thoảng lại có một cuộc dẫn tới việc tuyển được người, có khi mười tám tháng sau, khi hoàn cảnh của người đó thay đổi. Những nguồn ứng viên đều đặn mang lại người giỏi đều được xây từ những mối quan hệ như vậy, chứ không phải từ tin đăng tuyển.</p>
<p>Những buổi cà phê này cũng giải quyết luôn vấn đề của bản mô tả công việc (JD). Bản mô tả công việc thì kiểu gì cũng phải viết chung chung. Còn khi ngồi cà phê, ứng viên có thể hỏi những câu thật sự quan trọng với họ: sáu tháng đầu thế nào thì được coi là thành công, tôi sẽ làm việc với ai, bài toán kỹ thuật khó nhằn nhất của đội lúc này là gì. Được nghe câu trả lời thành thật cho những câu hỏi đó, người ta thường tự biết mình có hợp hay không.</p>
<p>Hơn nữa, một buổi cà phê cho người ta tận mắt thấy văn hóa công ty bạn, thay vì chỉ nghe kể. Bạn có chuẩn bị trước không, có thật sự tò mò không, có tôn trọng thời gian của người khác không: những điều đó nói lên nhiều hơn bất kỳ trang tuyển dụng nào. Chiều ngược lại cũng thế. Cách một người cư xử trong một cuộc nói chuyện thoải mái cho bạn biết làm việc cùng họ sẽ ra sao, rõ hơn hẳn một buổi phỏng vấn mà họ đã tập dượt kỹ.</p>
<p>Hình thức này phát huy tác dụng nhất trong mấy trường hợp: khi tiếp cận một người hoàn toàn không tìm việc, khi muốn làm quen trước với một người được giới thiệu trước khi bắt đầu quy trình chính thức, và khi nói chuyện với ai đó đang cân nhắc rẽ hướng sự nghiệp, chẳng hạn từ người làm chuyên môn (IC) lên quản lý, từ startup sang tập đoàn, hoặc ngược lại. Khi thị trường nhân lực khan hiếm, chừng đó trường hợp đã bao gồm gần hết những người bạn muốn tuyển.</p>

<h4 class="relative group">Tôi tổ chức một buổi như thế nào
    <div id="tôi-tổ-chức-một-buổi-như-thế-nào" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#t%c3%b4i-t%e1%bb%95-ch%e1%bb%a9c-m%e1%bb%99t-bu%e1%bb%95i-nh%c6%b0-th%e1%ba%bf-n%c3%a0o" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p>Tin nhắn đầu tiên quyết định tất cả. Tin nhắn chung chung sẽ bị xóa ngay. Hãy tìm hiểu kỹ về người đó trước, và nói thẳng mục đích của mình:</p>
<p><em>&ldquo;Chào Sarah, mình có xem bài nói của bạn về hệ thống phân tán ở QCon và mấy bài blog của bạn về event sourcing. Bên mình ở [Company] cũng đang vật lộn với những bài toán tương tự trong lúc mở rộng hạ tầng thanh toán. Bạn có muốn đi cà phê 30 phút không? Không phải phỏng vấn đâu, chỉ là mình tò mò muốn nghe góc nhìn của bạn và kể bạn nghe bên mình đang làm gì.&rdquo;</em></p>
<p>Tin nhắn này hiệu quả vì nó cụ thể, nói rõ mục đích ngay từ đầu, và mang lại cho người nhận một thứ gì đó (một cuộc trò chuyện về những bài toán thú vị) chứ không chỉ xin thời gian của họ. Sau đó hãy làm cho mọi thứ thật dễ dàng: đưa ra vài khung giờ để họ chọn, chọn một chỗ tiện cho họ hoặc một công cụ gọi video không cần cài đặt, và gửi lời mời qua lịch hẳn hoi để không ai phải đoán giờ đoán chỗ.</p>
<p>Bản thân buổi nói chuyện chỉ cần một khung sườn lỏng lẻo. Mở đầu bằng vài phút hỏi han thật lòng và lý do bạn liên hệ. Tiếp theo là câu chuyện của họ: công việc hiện tại, điều họ thích, điều khiến họ bực mình, điều họ mong muốn ở chỗ làm tiếp theo. Ở đoạn này, việc của bạn chủ yếu là lắng nghe. Sau đó đến lượt bạn: sứ mệnh của công ty, những thách thức thật mà đội đang gặp, kể cả những phần khó khăn, vì ứng viên đánh giá cao sự minh bạch và nhận ra ngay khi bạn đang chào hàng. Đoạn đáng giá nhất là phần trò chuyện cởi mở gần cuối: cần những điều kiện gì thì họ mới cân nhắc chuyển việc? Kết thúc bằng các bước tiếp theo rõ ràng, kể cả khi bước tiếp theo chỉ là &ldquo;mình giữ liên lạc nhé&rdquo;.</p>
<p>Trong vòng 24 giờ, hãy nhắn lại một lời ngắn gọn có nhắc tới một chi tiết cụ thể trong buổi nói chuyện, và làm đúng những gì bạn đã hứa, dù là giới thiệu một người, gửi một liên kết hay bất cứ thứ gì. Chính phần việc nhàm chán sau buổi gặp này mới thể hiện rõ nhất văn hóa của bạn.</p>
<p>Nếu bạn làm việc này thường xuyên, hãy giữ một bảng tính đơn giản ghi lại những người đã nói chuyện và thỉnh thoảng hỏi thăm họ, kể cả khi không có vị trí nào đang tuyển. Và đây cũng không nhất thiết là việc riêng của quản lý. Nhiều buổi cà phê hay nhất lại là khi các kỹ sư của bạn đi cà phê với những người giỏi trong mạng lưới quen biết của chính họ. Những lời giới thiệu chất lượng thường đến từ đó.</p>

<h4 class="relative group">Những câu hỏi đáng dành thời gian
    <div id="những-câu-hỏi-đáng-dành-thời-gian" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#nh%e1%bb%afng-c%c3%a2u-h%e1%bb%8fi-%c4%91%c3%a1ng-d%c3%a0nh-th%e1%bb%9di-gian" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p>Những câu tôi hay hỏi:</p>
<ul>
<li>&ldquo;Gần đây bài toán thú vị nhất mà bạn từng làm là gì?&rdquo;</li>
<li>&ldquo;Ở công việc tiếp theo, bạn muốn điều gì khác đi?&rdquo;</li>
<li>&ldquo;Bạn hay học theo cách nào? Bạn muốn phát triển chuyên môn ra sao?&rdquo;</li>
<li>&ldquo;Bạn có câu hỏi nào để đánh giá xem chỗ này có hợp với mình không?&rdquo;</li>
</ul>
<p>Những câu tôi sẽ hỏi nếu ngồi ở phía bên kia bàn:</p>
<ul>
<li>&ldquo;Thách thức lớn nhất mà đội đang đối mặt lúc này là gì?&rdquo;</li>
<li>&ldquo;Anh/chị đánh giá thế nào là thành công ở vị trí này?&rdquo;</li>
<li>&ldquo;Con đường thăng tiến ở đây như thế nào?&rdquo;</li>
<li>&ldquo;Vì sao anh/chị vào công ty này? Điều gì khiến anh/chị ở lại?&rdquo;</li>
<li>&ldquo;Có điều gì khi làm ở đây mà có thể khiến tôi bất ngờ không?&rdquo;</li>
</ul>

<h4 class="relative group">Nếu bạn là người được mời
    <div id="nếu-bạn-là-người-được-mời" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#n%e1%ba%bfu-b%e1%ba%a1n-l%c3%a0-ng%c6%b0%e1%bb%9di-%c4%91%c6%b0%e1%bb%a3c-m%e1%bb%9di" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p>Phần lớn những người tra &ldquo;coffee chat là gì&rdquo; lại đang ngồi ở phía bên kia bàn so với tôi: có ai đó vừa mời họ đi cà phê, và họ muốn biết mình sắp bước vào chuyện gì. Dưới đây là những điều tôi muốn nói với bạn, từ phía người hay gửi lời mời.</p>
<p>Đây không phải buổi phỏng vấn. Không ai chấm điểm bạn, cũng chẳng có bài kiểm tra nào, nên bạn không cần chuẩn bị sẵn câu trả lời. Dù vậy, đây vẫn là lần gặp đầu tiên và ấn tượng ban đầu vẫn quan trọng, nên hãy coi nó như gặp một người đồng nghiệp tương lai, chứ không phải gặp bạn của một người bạn. Điểm khác với phỏng vấn là ở đây bạn được phép tò mò, và người ta mong bạn hỏi cũng nhiều như bạn trả lời.</p>
<p>Về trang phục, hãy mặc như khi bạn đi làm ở công ty đó vào một ngày bình thường. Nếu không biết họ mặc thế nào thì cứ chọn phong cách lịch sự mà thoải mái (smart casual), không bao giờ sai. Nếu gặp qua video, hãy bật camera và tìm một phòng yên tĩnh; mấy chuyện đó quan trọng hơn chiếc áo bạn mặc.</p>
<p>Chuẩn bị mất khoảng nửa tiếng. Tìm hiểu xem công ty đó làm sản phẩm gì, và đọc qua những gì người mời bạn đã viết hoặc đã làm ra. Chuẩn bị sẵn một phần giới thiệu dài chừng hai phút về công việc hiện tại và điều bạn muốn làm tiếp theo, vì kiểu gì bạn cũng sẽ được hỏi câu đó. Mang theo hai, ba câu hỏi của riêng mình; danh sách ở phần trên là một điểm khởi đầu không tệ.</p>
<p>Còn nên nói chuyện gì: công việc của bạn, điều bạn thích ở công việc đó, và những gì bạn tò mò về công việc của họ. Chuyện lương thì để sau, trừ khi họ chủ động nhắc tới. Bạn hoàn toàn có thể hỏi thẳng xem họ có đang nghĩ tới vị trí nào cho bạn không, và nếu có thì quy trình tuyển dụng sẽ diễn ra thế nào.</p>
<p>Thường thì ai mời người đó trả tiền. Bạn cứ ngỏ ý trả, nhưng đừng giành nhau. Trong vòng một ngày, hãy gửi một lời cảm ơn ngắn có nhắc tới điều gì đó hai bên thực sự đã nói, vậy là bạn đã làm tốt hơn phần lớn mọi người rồi.</p>
<p>Còn nếu chính bạn muốn có một buổi coffee chat, cứ chủ động hỏi. Viết tin nhắn ngắn thôi, nói rõ vì sao bạn muốn gặp đúng người đó, và làm sao cho họ dễ nhận lời: &ldquo;Chào bạn, mình vẫn theo dõi phần việc của đội bạn với tính năng tìm kiếm mới, và mình đang tính chuyển sang mảng platform engineering. Trong vài tuần tới, bạn có thể dành cho mình 30 phút đi cà phê hoặc gọi điện không? Mình sẽ sắp xếp theo lịch của bạn.&rdquo; Với một lời đề nghị cụ thể như vậy, phần lớn mọi người đều đồng ý.</p>

<h4 class="relative group">Những cách làm hỏng buổi cà phê
    <div id="những-cách-làm-hỏng-buổi-cà-phê" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#nh%e1%bb%afng-c%c3%a1ch-l%c3%a0m-h%e1%bb%8fng-bu%e1%bb%95i-c%c3%a0-ph%c3%aa" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p>Cách nhanh nhất là biến nó thành một buổi phỏng vấn trá hình. Hễ bạn bắt đầu hỏi kiểm tra kỹ năng kỹ thuật hay lồng vào mấy câu hỏi hành vi là bạn đã phá vỡ thỏa thuận ngầm giữa hai bên, nên hãy để dành những thứ đó cho quy trình chính thức. Đứng thứ hai là chào hàng quá đà: những người ở lại lâu dài là những người đã biết rõ các khó khăn ngay từ lúc nhận lời. Đến mà không chuẩn bị, hoặc im bặt sau buổi gặp, thì gây hại âm thầm hơn; buổi cà phê nào cũng góp phần định hình những gì người đó kể về bạn với mạng lưới của họ.</p>
<p>Từ phía tôi, dấu hiệu đáng lo là một ứng viên không tò mò về bất cứ điều gì, một cuộc nói chuyện chỉ thuần túy trao đổi lợi ích, hoặc một người nhắc đến chỗ làm cũ nào cũng bằng cùng một giọng cay đắng. Ứng viên cũng nên có danh sách dấu hiệu của riêng mình: người đại diện công ty không giải thích được vì sao công việc này có ý nghĩa, những câu trả lời né tránh về tỷ lệ nghỉ việc hay định hướng của công ty, và bất kỳ ai chỉ lo chào mời bạn hơn là tìm hiểu bạn.</p>
<p>Không phải buổi cà phê nào cũng dẫn tới kết quả, và điều đó hoàn toàn bình thường, vì phần lớn là không. Mục đích là lần tới khi cần tuyển gấp cho một vị trí quan trọng, bạn không phải bắt đầu từ một tin tuyển dụng trống trơn, mà từ cả một loạt những cuộc trò chuyện thật. Hãy liên hệ bằng một lời mời đi cà phê, chứ không phải bằng một bản mô tả công việc.</p>

<h4 class="relative group">Đọc thêm
    <div id="đọc-thêm" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%c4%91%e1%bb%8dc-th%c3%aam" aria-label="Cọc dấu">#</a>
    </span>
    
</h4>
<p><strong>Bài viết liên quan trên blog này:</strong></p>
<ul>
<li><a href="https://jared.lynskey.co.nz/vi/posts/2024/2024-12-19-star-interviews/" >Dùng phương pháp STAR để phỏng vấn lập trình viên</a> - khi buổi cà phê chuyển thành quy trình phỏng vấn chính thức</li>
<li><a href="https://jared.lynskey.co.nz/vi/posts/2024/2024-02-10-prioritizing-onboarding/" >Ba điều tôi ưu tiên khi mới làm quản lý kỹ thuật</a> - điều gì giúp một đội làm việc tốt với nhau, cũng chính là thứ bạn đang tìm khi ghép cặp</li>
<li><a href="https://jared.lynskey.co.nz/vi/posts/2024/2024-07-01-internships/" >Vì sao bạn nên thực tập ở startup</a> - bối cảnh hữu ích khi nói chuyện với người đang cân nhắc chuyển sang startup</li>
</ul>
<p><strong>Tài liệu bên ngoài:</strong></p>
<ul>
<li><a href="https://review.firstround.com/articles/hiring-engineers/"  target="_blank" rel="noreferrer">First Round Review: Hiring Engineers</a> - các hướng dẫn tuyển dụng cho startup từ những người điều hành giàu kinh nghiệm</li>
<li><a href="https://larahogan.me/blog/first-one-on-one-questions/"  target="_blank" rel="noreferrer">Lara Hogan: &ldquo;Questions for Our First 1:1&rdquo;</a> - viết cho các buổi gặp riêng 1:1, nhưng dùng khi đi cà phê cũng rất hợp</li>
<li><a href="https://www.kalzumeus.com/2012/01/23/salary-negotiation/"  target="_blank" rel="noreferrer">Patrick McKenzie bàn về đàm phán lương</a> - đáng đọc để hiểu góc nhìn của ứng viên</li>
<li><a href="https://whothebook.com/" target="_blank" rel="noreferrer">Who: The A Method for Hiring</a> - khung phương pháp tuyển dụng bài bản của Geoff Smart và Randy Street</li>
<li><a href="https://hbr.org/topic/subject/hiring-and-recruitment"  target="_blank" rel="noreferrer">Harvard Business Review: Hiring and Recruitment</a> - các bài viết dựa trên nghiên cứu về thu hút nhân tài</li>
</ul>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2024/2024-07-12-coffee-chats/featured.jpg" medium="image" type="image/jpeg" />
    </item>
    <item>
      <title>Buổi ăn sáng về lãnh đạo của Kiwi Chamber: robot chăm sóc người sa sút trí tuệ và đổi mới sáng tạo ở New Zealand</title>
      <link>https://jared.lynskey.co.nz/vi/posts/2018/2018-11-12-kiwichamberbreakfast/</link>
      <guid isPermaLink="true">https://jared.lynskey.co.nz/vi/posts/2018/2018-11-12-kiwichamberbreakfast/</guid>
      <pubDate>Mon, 12 Nov 2018 00:00:00 +0000</pubDate>
      <dc:creator>Jared Lynskey</dc:creator>
      <category>Kiwi Chamber</category>
      <category>Networking</category>
      <category>New Zealand</category>
      <category>Korea</category>
      <category>Photography</category>
      <description>Ảnh và ghi chép từ buổi ăn sáng cuối cùng năm 2018 trong chuỗi NZ Leadership Speaker Series của Kiwi Chamber: giáo sư Kim Gun-ha nói về robot chăm sóc người sa sút trí tuệ, Tiến sĩ Pau Medrano-Gracia giới thiệu Uniservices, và câu chuyện đổi mới sáng tạo của New Zealand.</description>
      <content:encoded><![CDATA[<p>Năm nay Kiwi Chamber, phòng thương mại của New Zealand tại Hàn Quốc, tổ chức khá nhiều buổi gặp mặt ăn sáng, và hôm nay là buổi cuối cùng. Tôi đến với vai trò tình nguyện viên chụp ảnh. Hai diễn giả khách mời lần này là <a href="https://profiles.auckland.ac.nz/p-medrano"  target="_blank" rel="noreferrer">Dr Pau Medrano-Gracia</a> đến từ Đại học Auckland và giáo sư Kim Gun-ha đến từ Đại học Ewha.</p>

<h2 class="relative group">Robot chăm sóc người sa sút trí tuệ
    <div id="robot-chăm-sóc-người-sa-sút-trí-tuệ" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#robot-ch%c4%83m-s%c3%b3c-ng%c6%b0%e1%bb%9di-sa-s%c3%bat-tr%c3%ad-tu%e1%bb%87" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Giáo sư Kim là chuyên gia thần kinh học. Bài giảng của bà xoay quanh &ldquo;Robot chăm sóc người sa sút trí tuệ&rdquo;, trong đó có tính năng hỗ trợ sinh hoạt hằng ngày, giúp bệnh nhân sa sút trí tuệ được chăm sóc ngay tại nhà. Bà giới thiệu những con robot liên tục tự học để nhận diện ngày càng tốt hơn, cùng các chương trình rèn luyện nhận thức dùng chính những con robot đó. Hiện bà đang cùng các cộng sự phát triển robot chăm sóc bệnh nhân sa sút trí tuệ tại gia, với sự hỗ trợ của Bộ Thương mại, Công nghiệp và Năng lượng Hàn Quốc. Năm 2019, robot của dự án sẽ qua một vòng đánh giá hiệu quả. Nếu đạt, chúng sẽ được đưa vào sử dụng thực tế, mở đường cho dòng robot chăm sóc người sa sút trí tuệ dành cho các hộ gia đình.</p>
<p><figure><span class="mc-img" style="--lqip:url('data:image/webp;base64,UklGRgoBAABXRUJQVlA4IP4AAACwBgCdASogABUAPw1sqEemIyIYBABjEMTygFnC1fKObUlMuCPffRx2qjMs6hwud2hZAKC2pEZcn/Ek30n6QAD+vGgF9ixxyGqUIN5Da06wGtaJixU9JVctynhbD2aLNaCbuHrKh0BV7zApQFTbO4ZZmkPFJQFSb9Hgmu+87waDlsynCsEAIB/1BOQrNbdJqccZ7gPnD0DUmCrKfycyXXK4FEr5PzBOfD/UPnyW4K4nCdw7pzLdChH9/8/7zIf3G422csvM3ot5yTedsh/4iSGI1FbjWI2V+/gEtoEFwnXYCjf6U+V5PD4ey+CMHj+dYwG2bGdrmJ3hVWWTrnAAAA==')"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="Robot chăm sóc người sa sút trí tuệ"
    width="500"
    height="333"
    src="https://jared.lynskey.co.nz/img/posts/kiwicham/robots_hu_fddd1ab2bf1e39b2.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/kiwicham/robots_hu_fddd1ab2bf1e39b2.webp 800w, https://jared.lynskey.co.nz/img/posts/kiwicham/robots_hu_fddd1ab2bf1e39b2.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/kiwicham/robots_hu_fddd1ab2bf1e39b2.webp"></span></figure>
</p>

<h2 class="relative group">Uniservices
    <div id="uniservices" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#uniservices" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<p>Tiến sĩ Medrano-Gracia kể về công việc của ông ở Uniservices, với vai trò quản lý phát triển kinh doanh (Business Development Manager). Uniservices hợp tác với những bộ óc giỏi nhất của Đại học Auckland, đem tư duy sắc sảo của họ vào những ý tưởng có tiềm năng thay đổi thế giới.</p>

<h2 class="relative group">Upstarters
    <div id="upstarters" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#upstarters" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>

<h3 class="relative group">Ý tưởng mới từ một vùng đất mới
    <div id="ý-tưởng-mới-từ-một-vùng-đất-mới" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%c3%bd-t%c6%b0%e1%bb%9fng-m%e1%bb%9bi-t%e1%bb%ab-m%e1%bb%99t-v%c3%b9ng-%c4%91%e1%ba%a5t-m%e1%bb%9bi" aria-label="Cọc dấu">#</a>
    </span>
    
</h3>
<p>Người ta vẫn nói cái khó ló cái khôn. Vậy thì cũng chẳng lạ khi nhiều ý tưởng làm thay đổi thế giới lại ra đời ở một nơi xa xôi như New Zealand. Phần này giới thiệu câu chuyện công nghệ và đổi mới sáng tạo của New Zealand.</p>
<p>Một trong những ví dụ được chiếu lên màn hình là tấm vỏ bọc drone siêu nhẹ của Dotterel, dùng sợi nano tiêu âm của Revolution Fibres để drone bay êm gần như không nghe tiếng.</p>
<p><figure><span class="mc-img" style="--lqip:url('data:image/webp;base64,UklGRugAAABXRUJQVlA4INwAAADwBACdASogABAAPw1oqUgmIyIYBABjEMTzAE6CcSqxGbIEX7otGpjvWjbrOy0y3AAA/v8P95FBHbx/eVAFd87YDN20UkKrX+X+oRfja0b8aq3z9HfBPSUhf0mHywaw8ipKFTXXfNIqL+ySVpTrKz6x12jS1Df/q8u1uQnOTGd/Nd3Tzk+SzxOpirnxcjzyPZ1mz3/OU1efwtzVn8CmK2ehuRsYFBVudResoch6qtj5y7F/Y0jyolyhJBYJMPZEbvZwvvQ0luZEzRMNgtFHUtsJ1E9hx+2CRju11UAA')"><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="auto"
    alt="Slide Upstarters về drone siêu êm của Dotterel và Revolution Fibres"
    width="3333"
    height="1667"
    src="https://jared.lynskey.co.nz/img/posts/kiwicham/dottereal_hu_9b87e875ec570375.webp"
    srcset="https://jared.lynskey.co.nz/img/posts/kiwicham/dottereal_hu_9b87e875ec570375.webp 800w, https://jared.lynskey.co.nz/img/posts/kiwicham/dottereal_hu_4d2cd746e5192f61.webp 1280w"
    sizes="(min-width: 768px) 50vw, 65vw"
    data-zoom-src="https://jared.lynskey.co.nz/img/posts/kiwicham/dottereal_hu_884acb3c86c8a21b.webp"></span></figure>
</p>

<h2 class="relative group">Ảnh chụp tại sự kiện
    <div id="ảnh-chụp-tại-sự-kiện" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e1%ba%a3nh-ch%e1%bb%a5p-t%e1%ba%a1i-s%e1%bb%b1-ki%e1%bb%87n" aria-label="Cọc dấu">#</a>
    </span>
    
</h2>
<script src="https://cdn.jsdelivr.net/npm/publicalbum@latest/dist/pa-embed-player.min.js" async></script>
<div class="pa-embed-player" style="width:100%; height:480px; display:none;"
  data-link="https://photos.app.goo.gl/ZNVotgWiE8N75wpe9"
  data-title="Kiwi Chamber New Zealand Leadership Speaker Series"
  data-description="41 new photos · Album by Jared Lynskey (인재덕)">
  <img data-src="https://lh3.googleusercontent.com/S_fiPGQ-7UMgrKajgQea8ArfZaVFKheFriodbSol_G-pStF7yAXvBueXxKXd3WLz3xS44fCB6iAPw-3fx6ek9ibPOcgcHjFROsH2C821GpAdfY-k-ewtgxxFvMG1faI9ZAOd0D0pDKY=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/Yc4aEIQLfyirjLMUg-XENgYh8rnd9vRgm71k7tFsUYvSgd9ANr0O1lh6BnTyjexAVTmg1h2EUk-Wvy8P9oDVVT5oO9BYG2Z8_M4btbE46y2TrAGvV8RJ6U4FTopVu0bEnl9RIHcTu8M=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/908QZ8mnnMGPhxlqeKLl2fT3vjgOvDAhq8oRhRCKO89yYf4A8dlF3ssUri6iVf77MphwVsDTt8hVMS0kWG7TQIcGPWz2i4_NBdUT_ycawJd77j1ikQXdPO3btW9QpRLstEjD5KAqLow=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/cKnfbhH_O1I3Sjbh7Rsj6Sisl4sNFyh0QH2jXe_1t2eq8lykfwrkpKDCPwDVBPPGFzhIutuFZmjc0kn-2Vj9xn05mhTn70-cTEm1Xgp9bZCyWbSwIC2UJ7VUTKxzveXRyw-csByJ12s=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/2-ZsIjK7X5lPdZ9Ndek2DVkZKWmlDaTuhA2KKfomKcdE0D7SioIXEJJ4GTYxTYszhgipVtSm2YH6CWs1zgpAqI2wkrFFA3yLaml5YZNPIihoYDatfil-vUkFoK2DkzbFGRDasvztzL0=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/wMk8BC4YOLYu5ifL7ZzGWXxJcR3GBDq9vlTrqrEJ41iO4UB9sVchml5QL_VdxUWpEMmLZqIzzJtAETlAJ4Y5_6cK_5Rjl1cZYRbsZXtyV41Qm6S1omAtSSaO4f1sKNz4vP1ytI54OmM=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/Ny0D6YWSNFFMgikFlWNqNzzxFSKKdS95-aTEUU-CTn5vNbQh9HJ-w-zFov1scelUSaLNch3Un3heDuR8etKXHeJ4tB-5BSJUIwhiMU8nAxIsdZBu_diG9HL5hHCjTEJuwN7LQ8Q5rwI=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/ZSwhUdLytH8FS4q2msA6MqZD60bQ1Y4FKkKjaGc4QqN2_-UmsJFAFg9z3Zx0Jqd38rshACIoUz9u6VHM1GJEgdf4zK9L6j02UDom4xHls2L4XrPqLjJRF6aOK2A-MezYF360_Yzh-pI=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/F0LuVNojrNEwEqQaZbn4EsJNs_AWh9cYpKNMikjSMSCzTdOkNHqpuoBgzfCr017cj9JG-9KAe7m7VlH3QtyJXa9eHnUzsKZIwjNaKzl-l4M9j23EGEDCkSssoe_Rp1fiaZ4w_w2JFho=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/prkpXPUphIJPFOn9QWHjmkdko6NF5T3IIUXIyJmpwyJZR-DA0LDA-MySRfgPsTF8NmG-IYQP9W2IFBoPq3MGC1ifEZOfWnkGcVvSSKb5tUmaHkI6_EjFyu_Nw3Gkw9m0DYaZtUircQA=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/1YWZnRhxCJmBrG6XzoAkEnCYrlYFRwA4ov5uZDQNZ9wqZskGQoYc3QD-K0UZbnvvbOQpI7vdhcTrLhvLiYCfIKbB_ZTKXUbPgfTgAPG8ufOjoULSgnVGi_u0L17zlFvgKcRGzSRcgZg=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/T11eYvaBHWxnUkpT0NNdnb1rxLgfJ6_tlYrUmV7G3_PZjIb3qtBeFFAVeIMLl1WvjYrM3NBqS2Zyd-xQwUHQAzehYOdKo_kDjNSMqi2gC_FIok1sBpvj96NUOM_KVqVMRuFhFN6u97k=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/YHvb6sooEQpQVcihuacXRav2-1huhH1dK8YmIKTp_6Ab5SDOO7ll3QL-fJIb6PGd2iJNFpqEmjKvSk8SnzGUMTcBtmN4f1eWwe-q0F-yAz4hCr-2dVBtfFxLHtlFOETCnUzbkDc0Wlg=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/6T1fv2Q1Gu8Ddp_WqNEeaI3GAi9X-LkmWZzNtiy7sYu9TdLtsJGex7XD64XMU9msqGx7b_6RWsliFQ117CPwjY2OcFw9rF9zVDg9gPVZ49QuAFiBEJe6-bkLjOkWzSXx5nD9o34c1GI=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/kTh1W99O39xuC-mYNdTNKpecNKFGeHDNUW4ubPXXtBM0wiXPCwiDc5eFALhOyWt04E1Pn6wnuRyfu71oU9wUQ0-Sba_nvFDHuvhXJXpMwo5M-5kyeAZrpceQtL_2SeqmUGqTNkMmE6Y=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/MC9mw2-C69GVeA_AQDSXnByliQc9ylxWMSYbGwGe86yXP2umBpkNI2dLjXCzk70eS_x3QSMVrJ8Q9lhhTmjCrWGtCc7wmTG3Xr5TifebGUW93vbU08tHJGhl6jETdVg7md4BuCDwUSg=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/o_05UWzm5GoPsd4IHF8ekUa1RAUXqvtdDe8_7HADmR9LmzNmaaOF4HYATqOo-sfi8mLjv55UIJ4Jez8GPYw6p7HTs3V5sme3hEmphzUdBeENj_KVSqsS2ZzuqqCwIrK_DZPzU592RzM=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/Ey36lRjVow8B2l5rI6jqsIZeSm8ptn1YvDB_tS30cgmIlwAHL1AobKZeNT-FAGPGxd5GNWgtj25RzmZ-LFVvCHWBYJQ69QciUN7qCvrAi9pYjmco973qK02PMj_jfMotHlAEzcF0D0c=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/KEF15Rb_Xi_OYdWZZXF968cUtmXqT8cN_6zOjaVpANo80sL9r91pYbmdnF8jvuaw5wjl9ErGT72k50Ik9tD8vBq9wI0aTW9anTquvqF-AaMxMjufHRMsXLy2mza0KAwwyToMSgt4K2g=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/5qim1FL61m9x8v0lYabg_9R-v-SVeO36JOY_VpquisBR1OOKiGLDUGJG2mcU6tdrYFc0n-FrA7dkh_P5g3oo8JQ-Fu-7q_CQil8YkLMcvRPzRrFTJs2okLTqFSog59v3jTlN7wWPeAU=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/jdb6HudyJqin-RIZygtWo9ytPVX3vTsC5mT0RoQrRG0SsUsmmcz8y-2ghqMN5uhIVHnnFtbjjfUuYoTUPv-WmorBNevPJ2UJL-ywkbgCKEhmoaduFaYwFcBCthT-qlWlAs7NHaTMND0=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/3ztK0Qb-l_sWlmaxCMlzw5rIHlHrQ3vtvjkt7etBM9p2m-afmWFQuQddMF9PUQZiWUvr_Q4w3U3VG7EY3sdKPPVO9r8NIpJoPLJTdBqN2FhyREmjNL-Whcw5QLjX5sPaTFEXA4sAHSk=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/T9OBo-lAzgmFS_-Z1asZTYz7JSR4CD5VvI9xFgl8pjp3Js-U1FJ0bogvO0Isr0BvpS4L4N2Aq3Uqqm0Iz7fFH0ke4ekR2Y2VGPabKVrPwfLIiZaRVX5nVQzxAWWKNXuuFcvNQFXE6ik=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/Jwf_HRGx2dQJg-q9k4U5soM5vkwT-AO0zm9GCk8sTWZwisWFwkCLp92N-_wWBa3dterU3aodSsc8TuZPb6zqounFKbwSsDdfz6MfemEZf92c5RCdMrFCquiB7uohYs2t3l5eAtVmXnY=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/xEbSmy6mEJG52RWl77bGxusYIzI5zqel320tOShq8Kwqi1YK_GZis2Qhi1G6Xp125Naxb6DsbOXaLMkP2QhmeG4HYJnwEXxrb9ssRsJZJfi5wsrtSCIRNo-xUyqRPec7z2xWXzQWIvA=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/sSoiWMV6jl1rGWr2IHssqFeAeg8AKCtErRTaZX4XItaE-dbHAEZ_nJI2LzLdDAA_JKO7l3Edn609CDm5aVq66jnwXcv0OdJwIm1OAhXPo7qZKzZp_ENPJTVzVzWf2mXku1Fzn7YmnhI=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/xHKG_sGa3i3zkugAg7R9fCJMUzjsKoqQMwJwpTb6eh-6H8jndaqE-7mMSA0SSfqqle66O6uaHOOh921CutBSr3KCrXTdMZrJfCnN8FSo0rK0UJPhXECCu9KQA5nJqLh_jSqDwEK6_lA=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/EejNdzv77EQhUfADPvU2I9agBQlAH8lzSX6k4rWCQg1-OzTkN4PfzpRzMuShuADCsXzdAnvQH9Apjit1-RvxLJQ-AoFoSfx7F7eqzVyj8EiKeMOJ_kAgoy8nuGYQd9Sy7VfSuk9i_10=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/n69hLebjD_Vns6go_OnHNE-3WKXEuSmE7dg3VJZNC7ofjB8xfG0cfG4mqev43hmgpJucTtxpDslMTftaz3p0M5TXv_DH-4CO7cGaFxvPreHZFnnx2R_PnBfHhpqBJiTzxOi6VPlSYks=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/POD3ZSkdrh_csw-7s7zMxQRWBrPIODC4uuQSCrwrMXaS1nnDNIayPV-TB4PY4aeOnlp4Y1x5TjsngNUI7bhJCzRRRuVnt4moxHhnx2UYRAoM-OT3L-aPvIVOqcFH9Uz-t7pPHt_hmjo=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/oW_evbWI56KNRYHXUIFUFVxvkZIyP4KqqeIaiuzhMfEBDNPDREq5f4_vw8X6gQcHlF6bRCIFm2k148d0cNKm1krhLgHL0wVd8Qifmz6eI34asQGs8_EDSigIeiAWlJfX0jaJvggSh2Y=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/QXgAPlwJNM-RYtxQfXZDk9gCVrjWdeVElshVgD_sveV860MuS8uPIzTuQhsnyRPYvQolA3IPCIgv5f7rmaMLm9FyROZuGbQ-5_V0ANHrtpEkWVXGIvpZ44FtPbN2Fg-4F0MdUPbKev0=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/b-kqe-yt4bPCfJGX153QugpdLPsu8QjOvsK11rXqTIUmE1U9voGzw74pegKWxQAHMnOiHi7PuletGR1kARE0vfX8TqNuco2-l41ct3gJZWOg6CHgZyihv-szyV0m7S3eyMK5UAvX0Nc=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/OxygD01grt445EXyMWYS0mmxR3ioaT14FdDTsO7IjdwaFUZpXiEhIr-rSuQzooKPGKdrZfWp_wwLTvh8yEJH3_xqvTcYXGEJkqLHvNk35Y_TJfdD295WZ19Pg6T5_xKR132S2gHnBwE=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/fMnXj8X2nbgu4gcMPbpV_we6rmnr6dtTsQhUV26fTz9iSoQ1G6Nf3q0HXS3jtk9Ge7mFduc0hHM3U5tKdYwxcMwtkYv2mnv1jzILx2hbC5hue_xC3eWCe-0cznAvoaNhR5LjUaG36vc=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/te_ljSUiJYg3HqrsxjLzktMf09IXRvJJj_JB73A-k8U-z4UaWTB3qqxHlz2WY9YMExTap_vqURPoJXtiImcbgQPHDfxF1Hh4MC_-uH_uT35GevmjbnT5iwD6h5UmLuCikDjbVaDbHxU=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/-w_ozI7CeSRJVMqOVO6whjbckCKr9CXO2sNfhFYasBFbm5vQoR7XMH2Ob7N7mfCjWvoAlyOLF2dv4-_HEwRoWzytVNsooytn1a-Nz4mQnZrLOQUQ3U4YWd8PX0Ts_075f6N4TXpGaZw=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/3z8gqjCv2j21MOTlByi61s-ACd5ScdawtJvcNnmtF3yFffZeKrv_IEm-7CeBl4ptUTgjki8eDbDmToBsMAAyo2eAz-wWiiKA4GvSe4ZssoFN6ocPq3wuN5cbV-64EzEbbiczQs9yJrg=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/_Ho6_iOaZnY33zej0CeUEG4CA7JEdb0kpJZ5Y3l5tu22EeOnWGwVZfYdFN1xZ8hREPQ4-lbvGvF-8sZjZW7JlVfEwCA1uVlDwGqfuDRY6ElsqNXq6ZK2-GgbO3_yEkK_JrTq8O09bQk=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/FdiBHRtCOLosHzSBb_1s_kG65ec8mXb8C01p396FW-31UydYw3Af-Lyf3aAkiA6hia94xjmhyq-Kp0qWCo-nYvY3fSSPpUHNGOMtDKfmesYAIVfKC7Y_rd99Tq6MEYeWYfOCcW186uA=w1920-h1080" src="" alt="" />
  <img data-src="https://lh3.googleusercontent.com/Bh1qAqPJNxiTyv44Vz5F2kTpIdJ2tdMLqWx00jGXZ38PoVHCQQA1ah2ovTwwJEQyZNNjK2eNrcKgVFTiQRqD5Sx1oa-5ZSn2w-eWtibnceks39V0IC4znPuRpB2tzH9dGg7ddSWdXGA=w1920-h1080" src="" alt="" />
</div>
<p>Tôi rất thích đi làm tình nguyện ở những sự kiện góp phần vun đắp quan hệ giữa hai nước.</p>
<p>Mẹo nhỏ: chụp trong phòng tối thì nhớ mang theo ống kính sáng (khẩu độ lớn)! Cứ thử nghĩ xem khán giả và diễn giả sẽ khó chịu cỡ nào nếu bạn liên tục nháy cái đèn flash to đùng để bù sáng. Nhìn chẳng hay ho chút nào!</p>
]]></content:encoded>
      <media:content url="https://jared.lynskey.co.nz/en/posts/2018/2018-11-12-kiwichamberbreakfast/featured.jpg" medium="image" type="image/jpeg" />
    </item>
  </channel>
</rss>
