<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by HeinThuraWynn @ Thomaz @ 李春福 on Medium]]></title>
        <description><![CDATA[Stories by HeinThuraWynn @ Thomaz @ 李春福 on Medium]]></description>
        <link>https://medium.com/@heinthurawynn?source=rss-37c3ea994f02------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*-EBwL0wfGqk97PkzLNv5GA.jpeg</url>
            <title>Stories by HeinThuraWynn @ Thomaz @ 李春福 on Medium</title>
            <link>https://medium.com/@heinthurawynn?source=rss-37c3ea994f02------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 02:58:23 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@heinthurawynn/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[I Turned My Custom Domain Into a Professional Email Address Using iCloud+ — And It Was Surprisingly…]]></title>
            <link>https://heinthurawynn.medium.com/i-turned-my-custom-domain-into-a-professional-email-address-using-icloud-and-it-was-surprisingly-7380bd47f0a2?source=rss-37c3ea994f02------2</link>
            <guid isPermaLink="false">https://medium.com/p/7380bd47f0a2</guid>
            <dc:creator><![CDATA[HeinThuraWynn @ Thomaz @ 李春福]]></dc:creator>
            <pubDate>Thu, 08 Oct 2026 06:02:42 GMT</pubDate>
            <atom:updated>2026-10-08T06:02:42.717Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*G6AKJ1aMXkz9bH6SxLipzw.png" /></figure><h3>I Turned My Custom Domain Into a Professional Email Address Using iCloud+ — And It Was Surprisingly Easy</h3><p><em>How I set up professional business email with Apple iCloud+, Name.com, and GitHub Pages — including a tricky SPF verification issue.</em></p><p>If you’re a freelancer, indie developer, startup founder, or small business owner, you’ve probably wanted a professional email address like:</p><p><a href="/service/mailto:hello@yourdomain.com"><strong>hello@yourdomain.com</strong></a></p><p>Instead of using something like:</p><p><a href="/service/mailto:yourbusiness@gmail.com"><strong>yourbusiness@gmail.com</strong></a></p><p>A custom domain email looks more professional, builds trust, and makes your brand feel more established.</p><p>But when you start looking into business email hosting, you’ll quickly come across services like Google Workspace and Microsoft 365, which typically require separate subscriptions.</p><p>Recently, I discovered something that made me think:</p><p><strong>Wait, I can already do this with my iCloud+ subscription?</strong></p><p>And yes, you can!</p><p>I decided to try Apple’s Custom Email Domain feature with my own website, <strong>wynnsolutionsmyanmar.com</strong>, and the experience was surprisingly straightforward.</p><p>Here’s how I did it, including one small DNS mistake that prevented Apple from verifying my domain.</p><h3>1. What Is iCloud+ Custom Email Domain?</h3><p>Apple’s iCloud+ includes a feature called <strong>Custom Email Domain</strong>.</p><p>It allows you to use a domain you already own to send and receive emails through iCloud Mail.</p><p>For example:</p><ul><li><a href="/service/mailto:hello@yourdomain.com">hello@yourdomain.com</a></li><li><a href="/service/mailto:contact@yourdomain.com">contact@yourdomain.com</a></li><li><a href="/service/mailto:support@yourdomain.com">support@yourdomain.com</a></li></ul><p>You can use these email addresses directly from Apple Mail on your iPhone, iPad, or Mac, as well as through iCloud Mail on the web.</p><p>The best part?</p><p><strong>If you’re already paying for iCloud+, you don’t need another business email hosting subscription for this feature.</strong></p><p>Apple supports up to five custom email domains, with up to three personalized email addresses per domain per person.</p><p>For a solo developer or small business owner, that’s often more than enough.</p><p>One important distinction: multiple email addresses belonging to the same Apple Account share its iCloud Mail inbox. They are not separate employee mailboxes.</p><h3>2. My Existing Setup</h3><p>Before configuring iCloud+, here’s what my infrastructure looked like:</p><p><strong>Domain registrar:</strong> Name.com</p><p><strong>Domain:</strong> wynnsolutionsmyanmar.com</p><p><strong>Website hosting:</strong> GitHub Pages</p><p><strong>Additional subdomain:</strong> Vercel</p><p><strong>Email hosting:</strong> Not configured yet</p><p>My main concern was whether adding iCloud Mail would interfere with my existing website.</p><p>Fortunately, websites and email services use different DNS records.</p><p>GitHub Pages uses A and CNAME records for web traffic, while iCloud Mail uses MX, TXT, and CNAME records for email routing, verification, and authentication.</p><p>This means I could keep my website running on GitHub Pages while using iCloud+ to manage email.</p><p>No website migration. No new server. No backend configuration.</p><p>Just DNS changes.</p><h3>3. Setting Up a Custom Email Domain in iCloud+</h3><p>First, visit:</p><p><a href="https://www.icloud.com/icloudplus">https://www.icloud.com/icloudplus</a></p><p>Sign in with your Apple Account and find the <strong>Custom Email Domain</strong> section.</p><p>You’ll need an active iCloud+ subscription, two-factor authentication, and iCloud Mail enabled.</p><p>Next:</p><ol><li>Select the option to add a domain you own.</li><li>Choose whether the domain will be used by you alone or shared with other people.</li><li>Enter your domain name.</li><li>Follow Apple’s domain verification instructions.</li></ol><p>In my case, I entered:</p><p>wynnsolutionsmyanmar.com</p><p>If you don’t already have an email address using your domain, that’s fine.</p><p>You can create a new custom email address after completing the domain setup. You don’t need to purchase an email mailbox beforehand.</p><h3>4. Configuring DNS Records on Name.com</h3><p>This is where things get slightly technical, but it’s manageable.</p><p>Since my domain was registered with Name.com and its DNS was managed there, I opened the DNS management dashboard.</p><p>Apple provided several DNS records that needed to be added.</p><p>Here is an example of the configuration:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NUUDQgOZpQi-EZ3OIQUYRg.png" /></figure><p><strong>Important:</strong> Always use the exact DNS values and MX priorities provided by Apple during setup.</p><p>The records serve different purposes.</p><p><strong>MX records</strong> tell other mail servers where to deliver incoming emails.</p><p><strong>SPF</strong> helps identify which servers are authorized to send email on behalf of your domain.</p><p><strong>Domain verification TXT</strong> proves that you control the domain.</p><p><strong>DKIM</strong> helps receiving servers verify that outgoing messages were authorized by your domain and haven’t been altered.</p><p>I kept my existing GitHub Pages A records and the CNAME records for my website and subdomain.</p><p>Only the email-related DNS configuration needed attention.</p><p>If you already use another email provider, changing MX records will redirect incoming email to iCloud. Make sure you plan that migration before replacing existing records.</p><h3>5. The Problem: Apple Couldn’t Verify My SPF Record</h3><p>After adding the DNS records, I returned to iCloud+ to finish the setup.</p><p>But Apple displayed this message:</p><blockquote><em>Check your SPF record</em></blockquote><p>It suggested checking my DNS configuration and trying again later, since DNS changes can take time to propagate.</p><p>At first, everything looked correct in the Name.com dashboard.</p><p>My SPF record appeared to be:</p><p>&quot;v=spf1 include:icloud.com ~all&quot;</p><p>It looked reasonable.</p><p>But there was a subtle problem.</p><h3>Debugging with the Terminal</h3><p>As a developer, I prefer verifying DNS records directly rather than relying only on a hosting dashboard.</p><p>On my Mac, I opened Terminal and ran:</p><pre>dig @8.8.8.8 TXT wynnsolutionsmyanmar.com +short</pre><p>The response was:</p><pre>&quot;\&quot;v=spf1 include:icloud.com ~all\&quot;&quot;<br>&quot;apple-domain=YOUR_VERIFICATION_TOKEN&quot;</pre><p>Notice the escaped quotation marks?</p><p>\&quot;</p><p>That was the clue.</p><p>The quotation marks had been stored as part of the actual TXT record value, rather than simply being displayed as DNS string delimiters.</p><p>As a result, the SPF value did not begin with v=spf1 as required.</p><h3>The Fix</h3><p>I went back to Name.com and edited the SPF TXT record.</p><p>Instead of entering:</p><pre>&quot;v=spf1 include:icloud.com ~all&quot;</pre><p>I entered:</p><pre>v=spf1 include:icloud.com ~all</pre><p>Without manually adding quotation marks.</p><p>After saving the record, the expected DNS response was:</p><pre>&quot;v=spf1 include:icloud.com ~all&quot;</pre><p>Those outer quotation marks are normal in dig output.</p><p>The difference is that there are no escaped quotation marks inside the TXT value.</p><p><strong>Developer tip:</strong> If a DNS verification fails, don’t immediately assume it’s just DNS propagation. Inspect the actual public DNS response.</p><p>Also, a domain should publish only one SPF TXT record. If another email service already uses SPF, combine the authorized senders into one valid SPF policy rather than creating multiple SPF records.</p><h3>6. Creating a Professional Email Address</h3><p>Once Apple successfully verifies the domain, you can create your custom email addresses.</p><p>For my business, useful examples include:</p><ul><li><a href="/service/mailto:contact@wynnsolutionsmyanmar.com">contact@wynnsolutionsmyanmar.com</a></li></ul><p>You can then send and receive messages through:</p><p><a href="https://www.icloud.com/mail">https://www.icloud.com/mail</a></p><p>Or use the built-in Mail app on your Apple devices.</p><p>No separate email server setup is required.</p><p>One thing to keep in mind: iCloud+ Custom Email Domain is especially convenient for personal businesses and small teams already using Apple products.</p><p>If you need dedicated employee inboxes, centralized administration, or advanced business collaboration features, Google Workspace or Microsoft 365 may be a better fit.</p><h3>7. Is iCloud+ Better Than Google Workspace?</h3><p>It depends on what you need.</p><p>FeatureiCloud+Google WorkspaceCustom domain emailYesYesAdditional email hosting subscriptionNot if already subscribed to iCloud+RequiredApple Mail integrationExcellentSupportedSeparate managed employee mailboxesLimitedYesCentralized business administrationLimitedExtensiveBest forIndividuals and small businessesGrowing teams and organizations</p><p>For me, the main advantage is simplicity.</p><p>I already use Apple devices and iCloud+, so adding custom domain email is a convenient way to make better use of a subscription I’m already paying for.</p><p>However, iCloud+ is not a complete replacement for a business email platform in every scenario.</p><h3>8. A Few Things Worth Knowing</h3><p>Before using iCloud+ for your own domain, remember:</p><p><strong>DNS hosting and domain registration aren’t always the same.</strong> Even if you purchased your domain from Name.com, your authoritative DNS could be managed by Cloudflare or another provider.</p><p><strong>Email DNS changes don’t require moving your website.</strong> Your GitHub Pages or Vercel hosting can remain untouched.</p><p><strong>DNS propagation can take time.</strong> Some changes become visible quickly, while others take longer depending on caching and provider behavior.</p><p><strong>SPF and DKIM matter.</strong> Correct authentication improves the reliability of your outgoing email, although it doesn’t guarantee inbox delivery.</p><p><strong>DMARC is worth considering.</strong> For a business domain, a properly planned DMARC policy provides additional protection against domain spoofing.</p><p><strong>Custom email addresses aren’t independent inboxes by default.</strong> Multiple addresses assigned to one Apple Account deliver into that account’s iCloud Mail.</p><h3>Final Thoughts</h3><p>Sometimes the most useful tools are features we already have but haven’t explored.</p><p>I originally thought setting up professional business email would mean subscribing to another service and configuring more infrastructure.</p><p>Instead, I discovered that iCloud+ already offered what I needed.</p><p>With a few DNS records, some Terminal debugging, and my existing Apple subscription, I could use my own domain for professional email without changing my website hosting.</p><p>For indie hackers, freelancers, solo developers, and small business owners who are already in the Apple ecosystem, <strong>iCloud+ Custom Email Domain is absolutely worth exploring.</strong></p><p>And if Apple tells you to check your SPF record, remember:</p><p>Sometimes the problem isn’t the DNS propagation.</p><p>Sometimes it’s just two extra quotation marks. 😄</p><h3>Useful Resources</h3><ul><li><a href="https://support.apple.com/guide/icloud/use-a-custom-email-domain-mma473945269/icloud">Apple — Use Custom Email Domain with iCloud Mail</a></li><li><a href="https://www.icloud.com/icloudplus">iCloud+</a></li><li><a href="https://www.name.com/">Name.com</a></li></ul><p><em>Written from my experience setting up custom domain email for Wynn Solutions Myanmar.</em></p><p><strong>Tags:</strong> #iCloud #Apple #CustomDomain #EmailHosting #WebDevelopment</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7380bd47f0a2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cloudflare Wrangler + R2 + D1: Serverless App တစ်ခုကို CLI ကနေ တည်ဆောက်ရအောင်]]></title>
            <link>https://heinthurawynn.medium.com/cloudflare-wrangler-r2-d1-serverless-app-%E1%80%90%E1%80%85%E1%80%BA%E1%80%81%E1%80%AF%E1%80%80%E1%80%AD%E1%80%AF-cli-%E1%80%80%E1%80%94%E1%80%B1-%E1%80%90%E1%80%8A%E1%80%BA%E1%80%86%E1%80%B1%E1%80%AC%E1%80%80%E1%80%BA%E1%80%9B%E1%80%A1%E1%80%B1%E1%80%AC%E1%80%84%E1%80%BA-3872e2f547e2?source=rss-37c3ea994f02------2</link>
            <guid isPermaLink="false">https://medium.com/p/3872e2f547e2</guid>
            <category><![CDATA[cloudflare]]></category>
            <category><![CDATA[r2]]></category>
            <category><![CDATA[1d]]></category>
            <category><![CDATA[wrangler]]></category>
            <category><![CDATA[wynnsolutionsmyanmar]]></category>
            <dc:creator><![CDATA[HeinThuraWynn @ Thomaz @ 李春福]]></dc:creator>
            <pubDate>Sat, 03 Oct 2026 08:01:51 GMT</pubDate>
            <atom:updated>2026-10-03T08:01:51.083Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W46oh_HmegAh4MFC5j5MCQ.png" /></figure><p>Cloudflare ကို website တစ်ခုရဲ့ CDN အနေနဲ့ပဲ သိထားတဲ့ Developer တွေ အများကြီးရှိပါတယ်။</p><p>တကယ်တော့ Cloudflare ရဲ့ Developer Platform မှာ —</p><ul><li>Compute → <strong>Workers</strong></li><li>Object Storage → <strong>R2</strong></li><li>SQL Database → <strong>D1</strong></li><li>Key-Value Storage → <strong>KV</strong></li><li>Edge Database / Stateful Logic → <strong>Durable Objects</strong></li><li>AI → <strong>Workers AI</strong></li><li>Deployment &amp; Development CLI → <strong>Wrangler</strong></li></ul><p>စတဲ့ service တွေရှိပါတယ်။</p><p>ဒီ article မှာတော့ အထူးသဖြင့် <strong>Wrangler + R2 + D1</strong> ကို အခြေခံပြီး Cloudflare ပေါ်မှာ application တစ်ခုကို ဘယ်လိုတည်ဆောက်နိုင်လဲဆိုတာ လေ့လာကြည့်မယ်။</p><h3>Wrangler ဆိုတာဘာလဲ?</h3><p><strong>Wrangler</strong> က Cloudflare Workers နဲ့ Cloudflare Developer Platform resources တွေကို command line ကနေ develop, configure, test, deploy လုပ်နိုင်အောင် Cloudflare ကပေးထားတဲ့ CLI tool ဖြစ်ပါတယ်။</p><p>အလွယ်ပြောရရင် —</p><pre>Your Code<br>    ↓<br>Wrangler<br>    ↓<br>Cloudflare<br>    ↓<br>Workers / R2 / D1 / KV / ...</pre><p>ဆိုတဲ့ workflow ဖြစ်ပါတယ်။</p><p>Wrangler နဲ့ —</p><pre>npx wrangler dev</pre><p>နဲ့ local development လုပ်နိုင်သလို —</p><pre>npx wrangler deploy</pre><p>နဲ့ Worker ကို deploy လုပ်နိုင်ပါတယ်။</p><p>Wrangler ကို project ထဲ local dependency အနေနဲ့ install လုပ်ထားဖို့ Cloudflare က အကြံပြုထားပြီး npx wrangler၊ yarn wrangler၊ pnpm wrangler စတဲ့ package-manager based commands တွေကို အသုံးပြုနိုင်ပါတယ်။</p><h3>R2 ဆိုတာဘာလဲ?</h3><p><strong>Cloudflare R2</strong> က Object Storage ဖြစ်ပါတယ်။</p><p>AWS S3 လိုမျိုး —</p><pre>Images<br>Videos<br>PDFs<br>Documents<br>Backups<br>User Uploads<br>Static Files</pre><p>လို binary/file data တွေကို သိမ်းဖို့ အသုံးပြုနိုင်ပါတယ်။</p><p>ဥပမာ ကိုယ်က BookWorm လို application တစ်ခုလုပ်နေတယ်ဆိုရင် —</p><pre>D1<br> ├── Users<br> ├── Books<br> ├── Categories<br> └── Reading History</pre><pre>R2<br> ├── book-covers/<br> ├── illustrations/<br> ├── ebooks/<br> └── audio/</pre><p>လို ခွဲထားနိုင်ပါတယ်။</p><p>အရေးကြီးတာက <strong>D1 နဲ့ R2 ကို အတူတူသုံးနိုင်တယ်</strong> ဆိုတာပါ။</p><p>Database ထဲမှာ file ကို မသိမ်းဘဲ —</p><pre>D1<br> └── book metadata<br>      ├── title<br>      ├── author<br>      └── cover_url</pre><pre>R2<br> └── actual cover image</pre><p>လို architecture တည်ဆောက်နိုင်ပါတယ်။</p><h3>D1 ဆိုတာဘာလဲ?</h3><p><strong>Cloudflare D1</strong> က Cloudflare ရဲ့ SQL database service ဖြစ်ပြီး SQLite ကို အခြေခံထားပါတယ်။</p><p>Application ရဲ့ structured data တွေကို သိမ်းဖို့ သုံးနိုင်ပါတယ်။</p><p>ဥပမာ —</p><pre>Users<br>Products<br>Orders<br>Posts<br>Comments<br>Reviews<br>Categories<br>Reading History</pre><p>စတာတွေကို D1 ထဲမှာ သိမ်းနိုင်ပါတယ်။</p><p>Architecture ကို ရိုးရိုးလေးကြည့်ရင် —</p><pre>User<br>  ↓<br>Cloudflare Worker<br>  ↓<br>D1 Database<br>  ↓<br>SQL Query</pre><p>ဖြစ်ပါတယ်။</p><p>D1 database ကို Wrangler ကနေ create လုပ်နိုင်ပြီး database ကို Worker ထဲမှာ binding အဖြစ် ချိတ်ဆက်အသုံးပြုနိုင်ပါတယ်။</p><h3>R2 + D1 ကို ဘာကြောင့် အတူသုံးမလဲ?</h3><p>ဒီနှစ်ခုရဲ့ role မတူပါဘူး။</p><h3>D1</h3><p>Structured data အတွက် —</p><pre>User<br>Product<br>Order<br>Book<br>Category<br>Review</pre><h3>R2</h3><p>Files / Objects အတွက် —</p><pre>Image<br>PDF<br>Video<br>Audio<br>ZIP<br>Document</pre><p>ဆိုပြီး စဉ်းစားနိုင်ပါတယ်။</p><p>ဥပမာ e-commerce application တစ်ခုဆိုရင် —</p><pre>Cloudflare Worker<br>                       │<br>              ┌────────┴────────┐<br>              ↓                 ↓<br>             D1                 R2<br>       Structured Data       Object Storage<br>              │                 │<br>        ┌─────┼─────┐       ┌───┼────┐<br>        │     │     │       │   │    │<br>      Users Products Orders Images PDFs</pre><p>ဒီ architecture က serverless application တွေအတွက် အတော်လေး practical ဖြစ်ပါတယ်။</p><h3>အရင်ဆုံး Wrangler Install လုပ်မယ်</h3><p>Node.js project တစ်ခုရှိတယ်ဆိုရင် —</p><pre>npm install -D wrangler</pre><p>ပြီးရင် —</p><pre>npx wrangler --version</pre><p>နဲ့ version စစ်နိုင်ပါတယ်။</p><p>Cloudflare account ကို authenticate လုပ်ချင်ရင် —</p><pre>npx wrangler login</pre><p>ကို အသုံးပြုနိုင်ပါတယ်။</p><h3>Worker Project တည်ဆောက်မယ်</h3><p>Project အသစ်တစ်ခုစဖို့ —</p><pre>npm create cloudflare@latest my-app</pre><p>ပြီးရင် project folder ထဲဝင်ပါ။</p><pre>cd my-app</pre><p>Local development စဖို့ —</p><pre>npx wrangler dev</pre><p>ဒါဆို local development server တစ်ခု run နေပါလိမ့်မယ်။</p><h3>D1 Database တည်ဆောက်မယ်</h3><p>Database အသစ်တစ်ခု create လုပ်ဖို့ —</p><pre>npx wrangler d1 create my-app-db</pre><p>ဒီ command က D1 database အသစ်တစ်ခု create လုပ်ပေးပြီး Worker configuration ထဲမှာ အသုံးပြုမယ့် database binding နဲ့ ID ကို ရရှိစေပါတယ်။</p><p>ပြီးရင် application ရဲ့ configuration မှာ D1 binding ကို ချိတ်ပေးနိုင်ပါတယ်။</p><p>ဥပမာ —</p><pre>{<br>  &quot;d1_databases&quot;: [<br>    {<br>      &quot;binding&quot;: &quot;DB&quot;,<br>      &quot;database_name&quot;: &quot;my-app-db&quot;,<br>      &quot;database_id&quot;: &quot;YOUR_DATABASE_ID&quot;<br>    }<br>  ]<br>}</pre><p>ဒီလို binding လုပ်ထားရင် Worker code ထဲမှာ —</p><pre>env.DB</pre><p>ကနေ database ကို access လုပ်နိုင်ပါတယ်။</p><h3>Table တစ်ခု Create လုပ်ကြည့်မယ်</h3><p>ဥပမာ users table —</p><pre>CREATE TABLE users (<br>    id INTEGER PRIMARY KEY AUTOINCREMENT,<br>    name TEXT NOT NULL,<br>    email TEXT UNIQUE NOT NULL,<br>    created_at DATETIME DEFAULT CURRENT_TIMESTAMP<br>);</pre><p>Local database မှာ run ချင်ရင် —</p><pre>npx wrangler d1 execute my-app-db \<br>  --file=./schema.sql \<br>  --local</pre><p>Remote database မှာ run ချင်ရင် —</p><pre>npx wrangler d1 execute my-app-db \<br>  --file=./schema.sql \<br>  --remote</pre><p>Wrangler ရဲ့ D1 command တွေမှာ local နဲ့ remote database နှစ်မျိုးလုံးကို ခွဲပြီး execute လုပ်နိုင်ပါတယ်။</p><h3>D1 Migration သုံးမယ်</h3><p>Production project ဖြစ်လာရင် SQL ကို တစ်ခါတည်း manually run တာထက် migrations သုံးတာ ပိုကောင်းပါတယ်။</p><p>Migration အသစ် create လုပ်ဖို့ —</p><pre>npx wrangler d1 migrations create my-app-db create-users</pre><p>ပြီးရင် migration file ထဲမှာ —</p><pre>CREATE TABLE users (<br>    id INTEGER PRIMARY KEY AUTOINCREMENT,<br>    name TEXT NOT NULL,<br>    email TEXT UNIQUE NOT NULL<br>);</pre><p>လိုရေးနိုင်ပါတယ်။</p><p>Migration apply လုပ်ဖို့ —</p><pre>npx wrangler d1 migrations apply my-app-db</pre><p>ဖြစ်ပါတယ်။</p><p>ဒီလို version-controlled database schema workflow သုံးနိုင်တာက team development နဲ့ CI/CD အတွက် အသုံးဝင်ပါတယ်။</p><h3>R2 Bucket တည်ဆောက်မယ်</h3><p>အခု file storage အတွက် R2 bucket တစ်ခု create လုပ်မယ်။</p><pre>npx wrangler r2 bucket create my-app-files</pre><p>Bucket list ကြည့်ချင်ရင် —</p><pre>npx wrangler r2 bucket list</pre><p>Cloudflare ရဲ့ လက်ရှိ Wrangler R2 commands တွေက bucket create, list နဲ့ object management တွေအတွက် အသုံးပြုနိုင်ပါတယ်။</p><h3>Worker ထဲမှာ R2 Binding ချိတ်မယ်</h3><p>ဥပမာ configuration မှာ —</p><pre>{<br>  &quot;r2_buckets&quot;: [<br>    {<br>      &quot;binding&quot;: &quot;FILES&quot;,<br>      &quot;bucket_name&quot;: &quot;my-app-files&quot;<br>    }<br>  ]<br>}</pre><p>လို binding ချိတ်နိုင်ပါတယ်။</p><p>ပြီးရင် Worker code ထဲမှာ —</p><pre>env.FILES</pre><p>ကနေ R2 bucket ကို access လုပ်နိုင်ပါတယ်။</p><h3>File Upload လုပ်ကြည့်မယ်</h3><p>ဥပမာ Worker endpoint တစ်ခုမှာ —</p><pre>export default {<br>  async fetch(request, env) {<br>    const url = new URL(request.url);</pre><pre>    if (request.method === &quot;PUT&quot; &amp;&amp; url.pathname.startsWith(&quot;/upload/&quot;)) {<br>      const key = url.pathname.replace(&quot;/upload/&quot;, &quot;&quot;);</pre><pre>      await env.FILES.put(key, request.body);</pre><pre>      return new Response(&quot;Uploaded&quot;);<br>    }</pre><pre>    return new Response(&quot;Hello World&quot;);<br>  }<br>};</pre><p>ဒီလိုရေးထားရင် —</p><pre>PUT /upload/profile.jpg</pre><p>ဆိုတဲ့ request ကနေ R2 ထဲမှာ —</p><pre>profile.jpg</pre><p>ဆိုတဲ့ object တစ်ခု သိမ်းနိုင်ပါတယ်။</p><p>Cloudflare Workers က R2 bucket ကို binding လုပ်ထားတဲ့အခါ Workers API ကနေ objects တွေကို read/write လုပ်နိုင်ပါတယ်။</p><h3>R2 Object ကို Read လုပ်မယ်</h3><p>Upload လုပ်ထားတဲ့ file ကို ပြန်ဖတ်ချင်ရင် —</p><pre>const object = await env.FILES.get(&quot;profile.jpg&quot;);</pre><pre>if (!object) {<br>  return new Response(&quot;Not Found&quot;, {<br>    status: 404<br>  });<br>}</pre><pre>return new Response(object.body, {<br>  headers: {<br>    &quot;Content-Type&quot;: object.httpMetadata?.contentType || &quot;application/octet-stream&quot;<br>  }<br>});</pre><p>ဒီလို R2 object ကို Worker ကနေ directly retrieve လုပ်နိုင်ပါတယ်။</p><h3>D1 + R2 ကို Application တစ်ခုထဲမှာ တွဲသုံးမယ်</h3><p>ဒီအပိုင်းက တကယ်အသုံးဝင်ပါတယ်။</p><p>ဥပမာ user profile system တစ်ခုလုပ်မယ်ဆိုပါစို့။</p><p>User ရဲ့ information ကို D1 မှာ —</p><pre>users<br>-------------------------<br>id<br>name<br>email<br>avatar_key</pre><p>Avatar image ကို R2 မှာ —</p><pre>avatars/<br>    user-123.jpg</pre><p>လို သိမ်းနိုင်ပါတယ်။</p><p>Request တစ်ခုလာတဲ့အခါ —</p><pre>Client<br>   │<br>   ▼<br>Worker<br>   │<br>   ├───────────────┐<br>   ▼               ▼<br>  D1               R2<br>   │               │<br>User Metadata    Avatar</pre><p>ဆိုတဲ့ architecture ဖြစ်လာပါတယ်။</p><h3>Real-world Example: Blog Platform</h3><p>Tech Articles page တစ်ခုလုပ်တယ်လို့ ယူဆကြည့်မယ်။</p><p>D1 မှာ —</p><pre>articles<br>-------------------------<br>id<br>title<br>slug<br>content<br>author_id<br>published_at</pre><p>R2 မှာ —</p><pre>article-images/<br>    cloudflare-tunnel.png<br>    wrangler-r2-d1.png<br>    serverless.png</pre><p>လို သိမ်းထားနိုင်ပါတယ်။</p><p>API request တစ်ခု —</p><pre>GET /api/articles/cloudflare-tunnel</pre><p>ဝင်လာရင် Worker က —</p><pre>Request<br>   ↓<br>Worker<br>   ↓<br>D1<br>   ↓<br>Article Metadata<br>   ↓<br>R2<br>   ↓<br>Cover Image<br>   ↓<br>JSON Response</pre><p>လို workflow နဲ့ response ပြန်နိုင်ပါတယ်။</p><h3>Wrangler က Development ကို ဘာကြောင့် လွယ်စေတာလဲ?</h3><p>ပုံမှန် application development မှာ —</p><pre>Code<br> ↓<br>Server<br> ↓<br>Database<br> ↓<br>Object Storage<br> ↓<br>Deployment</pre><p>တစ်ခုချင်းစီကို သီးခြား configure လုပ်ရတတ်ပါတယ်။</p><p>Cloudflare ecosystem မှာတော့ Wrangler က ဒီ resources တွေကို CLI တစ်ခုထဲကနေ manage လုပ်နိုင်အောင် ကူညီပေးပါတယ်။</p><pre>Wrangler<br>                    │<br>       ┌────────────┼────────────┐<br>       ↓            ↓            ↓<br>    Worker         D1           R2<br>       │            │            │<br>    Compute      Database     Storage</pre><p>ဒါကြောင့် project configuration ကို code repository ထဲမှာ ထည့်ထားပြီး repeatable development/deployment workflow တည်ဆောက်နိုင်ပါတယ်။</p><h3>Local Development မှာလည်း R2 + D1 စမ်းလို့ရတယ်</h3><p>Cloudflare application တစ်ခုကို production မတင်ခင် local မှာ test လုပ်နိုင်တာက အရေးကြီးပါတယ်။</p><p>D1 အတွက် —</p><pre>npx wrangler d1 execute my-app-db \<br>  --command=&quot;SELECT * FROM users&quot; \<br>  --local</pre><p>လို local database ကို query လုပ်နိုင်ပါတယ်။</p><p>R2 object တွေကိုလည်း local development environment မှာ စမ်းသပ်နိုင်ပါတယ်။ Cloudflare ရဲ့ local-development documentation မှာ R2 object operations နဲ့ D1 SQL operations တွေအတွက် local mode ကို ဖော်ပြထားပါတယ်။</p><h3>Database Backup / Export</h3><p>D1 database ကို SQL file အဖြစ် export လုပ်ချင်ရင် —</p><pre>npx wrangler d1 export my-app-db \<br>  --remote \<br>  --output=backup.sql</pre><p>လိုလုပ်နိုင်ပါတယ်။</p><p>Table တစ်ခုချင်းစီ export လုပ်တာ၊ schema ပဲ export လုပ်တာ၊ data ပဲ export လုပ်တာမျိုးလည်း Wrangler ရဲ့ D1 export command မှာ support လုပ်ထားပါတယ်။</p><h3>Production Architecture</h3><p>နောက်ဆုံးမှာ application architecture က ဒီလိုမျိုး ဖြစ်လာနိုင်ပါတယ် —</p><pre>Internet<br>                       │<br>                       ▼<br>               Cloudflare Network<br>                       │<br>                       ▼<br>                    Worker<br>                       │<br>              ┌────────┴────────┐<br>              │                 │<br>              ▼                 ▼<br>             D1                 R2<br>        SQL Database        Object Storage<br>              │                 │<br>       ┌──────┼──────┐      ┌───┼────┐<br>       │      │      │      │   │    │<br>     Users  Posts  Orders  Images PDFs</pre><p>ဒီ architecture မှာ —</p><p><strong>Worker</strong><br>→ Business logic / API / routing</p><p><strong>D1</strong><br>→ Structured relational data</p><p><strong>R2</strong><br>→ Files / Objects</p><p>ဆိုပြီး responsibility ကို ခွဲထားနိုင်ပါတယ်။</p><h3>Wrangler + R2 + D1 ကို ဘယ်အချိန်မှာ သုံးမလဲ?</h3><p>RequirementCloudflare ServiceAPI / Backend LogicWorkersCLI / DeploymentWranglerSQL DatabaseD1Images / FilesR2Key-Value DataKVStateful coordinationDurable ObjectsTemporary Local → Public URLTryCloudflare</p><p>ဒါကြောင့် Cloudflare ကို CDN တစ်ခုအဖြစ်ပဲ မမြင်ဘဲ <strong>Application Platform</strong> တစ်ခုအဖြစ် စဉ်းစားနိုင်ပါတယ်။</p><h3>အရေးကြီးတဲ့ Concept တစ်ခု</h3><p>Application တစ်ခုတည်ဆောက်တဲ့အခါ data အားလုံးကို database တစ်ခုထဲ ထည့်ဖို့ မလိုပါဘူး။</p><p>ဥပမာ —</p><pre>Application<br>                     │<br>          ┌──────────┼──────────┐<br>          ↓          ↓          ↓<br>         D1         R2        KV<br>          │          │          │<br>       Structured   Files    Fast/Small<br>         Data      Objects      Data</pre><p>ဒီလို <strong>data type အလိုက် storage ကို ခွဲသုံးတာ</strong> က scalable architecture တည်ဆောက်ရာမှာ အရေးကြီးတဲ့ concept တစ်ခုပါ။</p><h3>Conclusion</h3><p>Wrangler + R2 + D1 ကို နားလည်ထားရင် Cloudflare ပေါ်မှာ serverless application တစ်ခုတည်ဆောက်ဖို့ အခြေခံ architecture ကို စတင်နားလည်နိုင်ပါပြီ။</p><p>အဓိကမှတ်ထားရမယ့် concept က —</p><pre>Wrangler<br>   ↓<br>Manage / Develop / Deploy</pre><pre>Worker<br>   ↓<br>Run Application Logic</pre><pre>D1<br>   ↓<br>Store Structured Data</pre><pre>R2<br>   ↓<br>Store Files / Objects</pre><p>ပြီးတော့ real-world application တစ်ခုမှာ —</p><pre>User<br> ↓<br>Cloudflare Worker<br> ↓<br> ├── D1 → Users / Posts / Orders<br> │<br> └── R2 → Images / PDFs / Videos</pre><p>ဆိုတဲ့ architecture တစ်ခုတည်ဆောက်နိုင်ပါတယ်။</p><p>အထူးသဖြင့် <strong>API + Database + File Storage</strong> ပါတဲ့ modern web application တစ်ခုကို traditional server တစ်လုံးကို အဓိကထားမနေဘဲ Cloudflare Developer Platform ပေါ်မှာ တည်ဆောက်ချင်တဲ့ Developer တွေအတွက် ဒီ architecture က စိတ်ဝင်စားစရာကောင်းတဲ့ approach တစ်ခုပါ။</p><p>နောက်တစ်ဆင့်အနေနဲ့ —</p><pre>npx wrangler dev<br>npx wrangler d1 create my-db<br>npx wrangler r2 bucket create my-files<br>npx wrangler deploy</pre><p>ဆိုတဲ့ commands တွေကနေ စပြီး ကိုယ့်ရဲ့ ပထမဆုံး Cloudflare application ကို တည်ဆောက်ကြည့်နိုင်ပါတယ်။</p><p>#Cloudflare #Wrangler #CloudflareWorkers #CloudflareR2 #CloudflareD1 #Serverless #ServerlessArchitecture #WebDevelopment #BackendDevelopment #APIDevelopment #JavaScript #TypeScript #SQL #SQLite #ObjectStorage #CloudComputing #DeveloperTools #DevOps #CloudDevelopment #SoftwareEngineering #TechMyanmar #MyanmarDevelopers #WynnSolutionsMyanmar</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3872e2f547e2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[TryCloudflare: Localhost ကို Public Internet ပေါ် စက္ကန့်ပိုင်းအတွင်း တင်ကြည့်မယ်]]></title>
            <link>https://heinthurawynn.medium.com/trycloudflare-localhost-%E1%80%80%E1%80%AD%E1%80%AF-public-internet-%E1%80%95%E1%80%B1%E1%80%AB%E1%80%BA-%E1%80%85%E1%80%80%E1%80%B9%E1%80%80%E1%80%94%E1%80%B7%E1%80%BA%E1%80%95%E1%80%AD%E1%80%AF%E1%80%84%E1%80%BA%E1%80%B8%E1%80%A1%E1%80%90%E1%80%BD%E1%80%84%E1%80%BA%E1%80%B8-%E1%80%90%E1%80%84%E1%80%BA%E1%80%80%E1%80%BC%E1%80%8A%E1%80%B7%E1%80%BA%E1%80%99%E1%80%9A%E1%80%BA-f1b368c05757?source=rss-37c3ea994f02------2</link>
            <guid isPermaLink="false">https://medium.com/p/f1b368c05757</guid>
            <category><![CDATA[trycloudflare]]></category>
            <category><![CDATA[myanmardev]]></category>
            <category><![CDATA[cloudflare-tunnel]]></category>
            <category><![CDATA[cloudflare]]></category>
            <dc:creator><![CDATA[HeinThuraWynn @ Thomaz @ 李春福]]></dc:creator>
            <pubDate>Sat, 03 Oct 2026 06:57:29 GMT</pubDate>
            <atom:updated>2026-10-03T06:57:29.605Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="TryCloudflare" src="https://cdn-images-1.medium.com/max/1024/1*wWBrRq1OSK2IqXp_9Cbkgg.png" /></figure><p>Developer တစ်ယောက်အနေနဲ့ local မှာ run နေတဲ့ application ကို တခြားသူတစ်ယောက်ဆီ ခဏ share ချင်တဲ့အချိန်တွေ ရှိတတ်ပါတယ်။</p><p>ဥပမာ —</p><ul><li>Client ကို development version demo ပြချင်တာ</li><li>Mobile phone ကနေ localhost website ကို test လုပ်ချင်တာ</li><li>Webhook endpoint ကို local machine မှာ test လုပ်ချင်တာ</li><li>Frontend developer နဲ့ backend API ကို ခဏ share ချင်တာ</li><li>QA tester ကို local build တစ်ခု access ပေးချင်တာ</li></ul><p>ပုံမှန်ဆိုရင် server တင်မယ်၊ domain/subdomain configure လုပ်မယ်၊ SSL setup လုပ်မယ်ဆိုပြီး အဆင့်တွေအများကြီး လိုနိုင်ပါတယ်။</p><p>ဒီလို development/testing use case တွေအတွက် Cloudflare မှာ <strong>TryCloudflare / Quick Tunnels</strong> ဆိုတဲ့ အလွန်အသုံးဝင်တဲ့ feature တစ်ခုရှိပါတယ်။</p><h3>TryCloudflare ဆိုတာဘာလဲ?</h3><p>TryCloudflare ဟာ <strong>Cloudflare Tunnel ရဲ့ Quick Tunnel feature</strong> ဖြစ်ပါတယ်။</p><p>ကိုယ့် computer ထဲမှာ</p><pre>http://localhost:3000</pre><p>လို run နေတဲ့ application တစ်ခုကို</p><pre>https://random-name.trycloudflare.com</pre><p>လို public HTTPS URL တစ်ခုနဲ့ Internet ကနေ access လုပ်နိုင်အောင် expose လုပ်ပေးနိုင်ပါတယ်။</p><p>အထူးသဖြင့် Quick Tunnel သုံးဖို့အတွက် Cloudflare account မလိုပါဘူး။ ကိုယ်ပိုင် domain လည်း မလိုပါဘူး။ DNS records configure လုပ်စရာလည်း မလိုပါဘူး။</p><p>လိုအပ်တာက cloudflared နဲ့ local မှာ run နေတဲ့ service တစ်ခုပဲ ဖြစ်ပါတယ်။</p><h3>ဘယ်လိုအလုပ်လုပ်သလဲ?</h3><p>Architecture ကို အလွယ်ကြည့်မယ်ဆိုရင် —</p><pre>User / Client<br>     │<br>     │ HTTPS<br>     ▼<br>Cloudflare Network<br>     │<br>     │ Cloudflare Tunnel<br>     ▼<br> cloudflared<br>     │<br>     ▼<br>localhost:3000<br>     │<br>     ▼<br>Your Application</pre><p>ဒီနေရာမှာ အရေးကြီးတဲ့အချက်က router မှာ port forwarding လုပ်ပြီး local machine ကို တိုက်ရိုက် Internet ပေါ် expose လုပ်တာ မဟုတ်ပါဘူး။</p><p>cloudflared က ကိုယ့် machine ကနေ Cloudflare network ဆီကို <strong>outbound connection</strong> စတင်တည်ဆောက်ပေးတာပါ။ Cloudflare Tunnel ရဲ့ architecture က inbound port ဖွင့်စရာမလိုဘဲ origin service ကို Cloudflare network နဲ့ ချိတ်ဆက်နိုင်အောင် design လုပ်ထားပါတယ်။</p><p>ဥပမာ user က</p><pre>https://example-random.trycloudflare.com</pre><p>ကို request လုပ်လိုက်ရင် traffic flow က အကြမ်းဖျင်းအားဖြင့်</p><pre>Browser<br>   ↓<br>Cloudflare Edge<br>   ↓<br>Encrypted Tunnel<br>   ↓<br>cloudflared<br>   ↓<br>localhost:3000</pre><p>ဖြစ်သွားပါတယ်။</p><h3>Setup လုပ်ကြည့်မယ်</h3><p>ပထမဆုံး cloudflared ကို install လုပ်ရပါမယ်။</p><p>macOS မှာ Homebrew သုံးထားရင် —</p><pre>brew install cloudflared</pre><p>ပြီးရင် ကိုယ့် application ကို ပုံမှန်အတိုင်း run ထားပါ။</p><p>ဥပမာ Node.js / React / Laravel / WordPress development server တစ်ခုက</p><pre>http://localhost:8080</pre><p>မှာ run နေတယ်ဆိုပါစို့။</p><p>Quick Tunnel စဖို့ command တစ်ကြောင်းပဲ လိုပါတယ်။</p><pre>cloudflared tunnel --url http://localhost:8080</pre><p>Run လိုက်တဲ့အခါ cloudflared က random trycloudflare.com hostname တစ်ခု generate လုပ်ပေးပါလိမ့်မယ်။</p><p>ဥပမာ —</p><pre>https://random-words-example.trycloudflare.com</pre><p>အဲဒီ URL ကို browser ကနေဖွင့်လိုက်ရင် ကိုယ့် localhost:8080 မှာ run နေတဲ့ application ကို Internet ကနေ access လုပ်နိုင်ပါပြီ။</p><h3>Development Workflow မှာ ဘယ်နေရာတွေ အသုံးဝင်လဲ?</h3><h3>Client Demo</h3><p>Project ကို production/staging server မတင်ရသေးပေမယ့် client ကို progress ပြချင်တယ်ဆိုပါစို့။</p><pre>npm run dev</pre><p>ပြီးရင် —</p><pre>cloudflared tunnel --url http://localhost:5173</pre><p>Client ဆီကို generated URL ပေးလိုက်ရုံပါပဲ။</p><p>Frontend changes လုပ်လိုက်တိုင်း local server မှာ reflect ဖြစ်ပြီး tunnel ကတစ်ဆင့် client ဘက်ကလည်း မြင်နိုင်ပါတယ်။</p><h3>Mobile Testing</h3><p>Desktop မှာ development လုပ်နေတဲ့ website ကို actual phone ကနေ စမ်းချင်ရင်လည်း အသုံးဝင်ပါတယ်။</p><pre>localhost:3000<br>       ↓<br>Cloudflare Tunnel<br>       ↓<br>https://random.trycloudflare.com<br>       ↓<br>iPhone / Android</pre><p>Local network IP တွေ configure လုပ်နေစရာမလိုဘဲ public URL ကို phone browser ကနေ တန်းဖွင့်နိုင်ပါတယ်။</p><h3>Webhook Testing</h3><p>Webhook development မှာ ပိုပြီးအသုံးဝင်ပါတယ်။</p><p>ဥပမာ local API က —</p><pre>http://localhost:8000/api/webhook</pre><p>ဆိုရင် Quick Tunnel ဖွင့်ပြီးနောက် —</p><pre>https://random.trycloudflare.com/api/webhook</pre><p>လို public endpoint ရလာနိုင်ပါတယ်။</p><p>ဒါကို third-party service ရဲ့ webhook URL အဖြစ် development/testing အတွက် သုံးနိုင်ပါတယ်။</p><h3>QA Testing</h3><p>Developer machine မှာ run နေတဲ့ build ကို QA tester ဆီပေးချင်ရင် staging deployment မလုပ်ခင် Quick Tunnel နဲ့ အမြန် share လုပ်နိုင်ပါတယ်။</p><p>ဒါကြောင့် development cycle မှာ</p><pre>Developer<br>    ↓<br>Local App<br>    ↓<br>TryCloudflare<br>    ↓<br>QA / Client / Teammate</pre><p>ဆိုတဲ့ workflow လုပ်နိုင်ပါတယ်။</p><h3>Access ကို Email နဲ့ Restrict လုပ်ခြင်း</h3><p>Quick Tunnel ရဲ့ စိတ်ဝင်စားစရာကောင်းတဲ့ လက်ရှိ feature တစ်ခုက email authentication ပါ။</p><p>Public URL ရသွားတဲ့သူတိုင်း ဝင်ကြည့်နိုင်တာမျိုး မဖြစ်စေချင်ဘူးဆိုရင် —</p><pre>cloudflared tunnel \<br>  --url http://localhost:8080 \<br>  --allowed-mail alice@example.com</pre><p>လို run နိုင်ပါတယ်။</p><p>Visitor က URL ကိုဝင်တဲ့အခါ email authentication လုပ်ရပြီး email ဆီပို့တဲ့ one-time PIN နဲ့ authenticate လုပ်ပြီးမှ local application ကို access ရမှာပါ။ Multiple email addresses နဲ့ domain-level allowance တွေလည်း configure လုပ်နိုင်ပါတယ်။</p><p>ဒါက temporary client demos နဲ့ internal previews တွေအတွက် တော်တော်အသုံးဝင်ပါတယ်။</p><h3>Security အရ ဘာကောင်းသလဲ?</h3><p>Traditional approach မှာ —</p><pre>Internet<br>   ↓<br>Public IP<br>   ↓<br>Open Port<br>   ↓<br>Local Server</pre><p>လိုမျိုး ဖြစ်နိုင်ပါတယ်။</p><p>Cloudflare Tunnel architecture ကတော့ origin ကနေ Cloudflare ဆီ outbound connection စလုပ်တာဖြစ်တဲ့အတွက် inbound port ဖွင့်စရာ၊ public origin IP expose လုပ်စရာ မလိုပါဘူး။</p><p>ဒါပေမယ့် Quick Tunnel URL ကို public ထုတ်ထားရင် URL သိတဲ့သူက application ကို access လုပ်နိုင်တာကို သတိထားရပါမယ်။ Sensitive development environment ဖြစ်ရင် email restriction သုံးတာ ဒါမှမဟုတ် proper Cloudflare Access configuration ပါတဲ့ named tunnel သုံးတာ ပိုသင့်တော်ပါတယ်။</p><h3>TryCloudflare ကို Production မှာ သုံးသင့်လား?</h3><p><strong>မသုံးသင့်ပါဘူး။</strong></p><p>Cloudflare ကိုယ်တိုင်က Quick Tunnels ကို testing နဲ့ development အတွက် ရည်ရွယ်ထားတယ်လို့ documentation မှာ ရှင်းရှင်းလင်းလင်း ဖော်ပြထားပါတယ်။</p><p>Quick Tunnel မှာ —</p><ul><li>uptime guarantee မရှိပါ</li><li>tunnel အသစ်ပြန်စတိုင်း hostname ပြောင်းနိုင်ပါတယ်</li><li>တစ်ချိန်တည်းမှာ in-flight requests 200 အထိ limitation ရှိပါတယ်</li><li>limit ကျော်သွားရင် HTTP 429 ရနိုင်ပါတယ်</li><li>Server-Sent Events (SSE) မထောက်ပံ့ပါ</li></ul><p>ဆိုတဲ့ limitations တွေ ရှိပါတယ်။</p><p>Production environment အတွက်တော့ account နဲ့ domain configure လုပ်ထားတဲ့ proper <strong>Cloudflare Tunnel / Named Tunnel</strong> ကို သုံးသင့်ပါတယ်။ အဲဒီမှာ stable hostname တစ်ခုကို local service နဲ့ map လုပ်နိုင်ပါတယ်။</p><h3>Quick Tunnel vs Production Cloudflare Tunnel</h3><p>FeatureQuick TunnelNamed / Production TunnelCloudflare AccountမလိုလိုOwn DomainမလိုလိုURLRandom trycloudflare.comကိုယ်ပိုင် hostnameSetupအလွန်မြန်Configuration လိုStable URLမဟုတ်ဟုတ်Productionမသင့်သင့်Best UseDev / Demo / TestingProduction / Staging</p><p>Quick Tunnel ကို တစ်ခါသုံး preview environment လို့ စဉ်းစားနိုင်ပြီး Named Tunnel ကို long-running infrastructure အတွက် သုံးတာ ပိုသင့်တော်ပါတယ်။</p><h3>ngrok နဲ့ Concept တူလား?</h3><p>Concept အရတော့ တူပါတယ်။</p><p>နှစ်ခုစလုံးရဲ့ common development use case က —</p><pre>localhost<br>   ↓<br>Tunnel<br>   ↓<br>Public HTTPS URL</pre><p>ဖြစ်ပါတယ်။</p><p>TryCloudflare ရဲ့ အားသာချက်က Cloudflare ecosystem ကိုသုံးနေတဲ့ developer တွေအတွက် Cloudflare Tunnel architecture နဲ့ တိုက်ရိုက်ချိတ်ဆက်ပြီး စမ်းနိုင်တာပါ။</p><p>အထူးသဖြင့် account/domain setup မလုပ်ချင်သေးတဲ့အချိန်</p><pre>cloudflared tunnel --url http://localhost:8080</pre><p>command တစ်ကြောင်းနဲ့ public development URL ရနိုင်တာက အလွန်အဆင်ပြေပါတယ်။</p><h3>2026 မှာ Wrangler ကနေလည်း Quick Tunnel ဖွင့်နိုင်ပြီ</h3><p>Cloudflare ရဲ့ newer developer tooling မှာ Wrangler ကနေ Quick Tunnel စနိုင်တဲ့ command လည်း ရှိလာပါတယ်။</p><pre>npx wrangler tunnel quick-start http://localhost:8080</pre><p>ဒါကလည်း temporary random *.trycloudflare.com URL တစ်ခုထုတ်ပေးပါတယ်။ Quick Tunnel က process run နေတဲ့အချိန်အတွင်းပဲ အသက်ဝင်နေမှာ ဖြစ်ပါတယ်။</p><p>Wrangler/Vite development workflow တွေမှာလည်း local dev session ကို Tunnel ကတစ်ဆင့် share လုပ်နိုင်တဲ့ integration တွေ ထပ်တိုးလာပါတယ်။</p><h3>Conclusion</h3><p>TryCloudflare ဟာ feature ကြီးကြီးမားမားတစ်ခုလို ထင်ရပေမယ့် developer workflow ထဲမှာတော့ အတော်လေး practical ဖြစ်ပါတယ်။</p><p>အထူးသဖြင့် —</p><pre>Local Development<br>       ↓<br>Need Public Access<br>       ↓<br>cloudflared Quick Tunnel<br>       ↓<br>*.trycloudflare.com<br>       ↓<br>Client / QA / Mobile / Webhook</pre><p>ဆိုတဲ့ workflow ကို server deployment မလုပ်ဘဲ မိနစ်ပိုင်းအတွင်း တည်ဆောက်နိုင်ပါတယ်။</p><p>စမ်းကြည့်ချင်ရင် အဓိကမှတ်ထားရမယ့် command က တစ်ကြောင်းပဲရှိပါတယ်။</p><pre>cloudflared tunnel --url http://localhost:8080</pre><p>ဒါနဲ့ ကိုယ့် localhost က application တစ်ခုကို temporary public HTTPS endpoint တစ်ခုအဖြစ် ပြောင်းနိုင်ပါတယ်။</p><p>TryCloudflare ဟာ production hosting replacement မဟုတ်ပါဘူး။ ဒါပေမယ့် <strong>local development, temporary demos, QA testing နဲ့ webhook development</strong> အတွက် developer toolbox ထဲမှာ ထည့်ထားသင့်တဲ့ utility တစ်ခုဖြစ်ပါတယ်။</p><p>Official references အနေနဲ့ <a href="https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/?utm_source=chatgpt.com">Cloudflare Quick Tunnels Documentation</a> နဲ့ <a href="https://developers.cloudflare.com/tunnel/?utm_source=chatgpt.com">Cloudflare Tunnel Documentation</a> ကို ဆက်ဖတ်နိုင်ပါတယ်။</p><p>#Cloudflare #TryCloudflare #CloudflareTunnel #QuickTunnel #CloudflareWorkers #DevTools #WebDevelopment #SoftwareEngineering #DeveloperTools #DevOps #Networking #Localhost #Webhook #APIDevelopment #CloudComputing #HTTPS #CyberSecurity #CloudflareDevelopers #TechMyanmar #MyanmarDevelopers<br>#WynnSolutionsMyanmar</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f1b368c05757" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Clean, Working Setup: pnpm + Express on macOS with a Flutter (Riverpod) iOS App — plus ngrok]]></title>
            <link>https://heinthurawynn.medium.com/a-clean-working-setup-pnpm-express-on-macos-with-a-flutter-riverpod-ios-app-plus-ngrok-1c71993616dc?source=rss-37c3ea994f02------2</link>
            <guid isPermaLink="false">https://medium.com/p/1c71993616dc</guid>
            <category><![CDATA[flutter-app-development]]></category>
            <category><![CDATA[riverpod]]></category>
            <category><![CDATA[localhost]]></category>
            <category><![CDATA[expressjs]]></category>
            <dc:creator><![CDATA[HeinThuraWynn @ Thomaz @ 李春福]]></dc:creator>
            <pubDate>Thu, 04 Sep 2025 10:56:46 GMT</pubDate>
            <atom:updated>2025-09-04T10:56:46.311Z</atom:updated>
            <content:encoded><![CDATA[<h3>A Clean, Working Setup: pnpm + Express on macOS with a Flutter (Riverpod) iOS App — plus ngrok</h3><p>You’ve got a Node.js API on your Mac and a Flutter app on a <strong>real iOS device</strong>. You want them to talk smoothly over the same Wi-Fi or from anywhere via <strong>ngrok</strong>.</p><p>Here’s a clean, copy-pasteable setup that just works.</p><h3>What you’ll build</h3><ul><li>A minimal <strong>Express</strong> API (served with <strong>pnpm</strong>)</li><li>Reachable from your iPhone either:</li><li><strong>A.</strong> Directly over your LAN (using your Mac’s IP), or</li><li><strong>B.</strong> Via a public <strong>ngrok HTTPS</strong> URL (no IP juggling, ATS-friendly)</li><li><strong>Flutter</strong> app using <strong>Riverpod</strong> + <strong>Dio</strong> that calls /health and shows the response.</li></ul><h4>Prerequisites</h4><ul><li>macOS with Node.js ≥ 18 and <strong>pnpm</strong></li><li>Flutter SDK installed, Xcode set up for iOS</li><li>An iPhone on the same Wi-Fi (for the LAN option)</li><li>An ngrok account (free is fine) for the <a href="https://dashboard.ngrok.com/signup?ref=home-hero">ngrok</a> option</li></ul><h3><strong>Part 1 </strong>— <strong>Express API (pnpm)</strong></h3><ol><li>Scaffold &amp; install</li></ol><blockquote>mkdir mac-express-api &amp;&amp; cd mac-express-api<br>pnpm init -y<br>pnpm add express cors<br>pnpm add -D nodemon</blockquote><p>in the package.json — add scripts:</p><pre>{<br>  &quot;name&quot;: &quot;mac-express-api&quot;,<br>  &quot;version&quot;: &quot;1.0.0&quot;,<br>  &quot;main&quot;: &quot;src/server.js&quot;,<br>  &quot;scripts&quot;: {<br>    &quot;dev&quot;: &quot;nodemon --watch src --ext js,json src/server.js&quot;<br>  },<br>  &quot;dependencies&quot;: {<br>    &quot;cors&quot;: &quot;^2.8.5&quot;,<br>    &quot;express&quot;: &quot;^4.19.2&quot;<br>  },<br>  &quot;devDependencies&quot;: {<br>    &quot;nodemon&quot;: &quot;^3.1.0&quot;<br>  }<br>}</pre><p>2. Minimal server bound to all interfaces</p><p>src/server.js</p><pre>const express = require(&#39;express&#39;);<br>const cors = require(&#39;cors&#39;);<br><br>const app = express();<br>app.use(express.json());<br><br>// Keep CORS wide open for dev; tighten later if needed<br>app.use(cors({ origin: true }));<br><br>app.get(&#39;/health&#39;, (req, res) =&gt; {<br>  res.json({ ok: true, time: new Date().toISOString() });<br>});<br><br>const PORT = process.env.PORT || 3000;<br><br>// IMPORTANT: bind to 0.0.0.0 so devices on your network (or ngrok) can reach it<br>app.listen(PORT, &#39;0.0.0.0&#39;, () =&gt; {<br>  console.log(`API listening on http://0.0.0.0:${PORT}`);<br>});</pre><p>Run it:</p><pre>pnpm dev</pre><h3>Part 2 — Choose how the iPhone reaches your API</h3><h3>Option A) Direct LAN (same Wi-Fi)</h3><ol><li>Find your Mac’s IP:</li></ol><pre>ipconfig getifaddr en0   # usually Wi-Fi; example: 192.168.1.23</pre><p>2. Test from your iPhone’s Safari:</p><p><a href="http://192.168.1.23:3000/health">http://192.168.1.23:3000/health</a></p><p>If you see JSON, you’re good.</p><blockquote><em>If it doesn’t load, check macOS </em><strong><em>Firewall</em></strong><em> (System Settings → Network → Firewall → allow Node/nodemon) and ensure your router doesn’t enable </em><strong><em>AP/client isolation</em></strong><em>.</em></blockquote><p>iOS ATS for HTTP on LAN</p><p>iOS blocks plain HTTP by default. For development, add an exception:</p><p>ios/Runner/Info.plist:</p><pre>&lt;key&gt;NSAppTransportSecurity&lt;/key&gt;<br>&lt;dict&gt;<br>  &lt;key&gt;NSExceptionDomains&lt;/key&gt;<br>  &lt;dict&gt;<br>    &lt;key&gt;192.168.1.23&lt;/key&gt;<br>    &lt;dict&gt;<br>      &lt;key&gt;NSTemporaryExceptionAllowsInsecureHTTPLoads&lt;/key&gt;&lt;true/&gt;<br>    &lt;/dict&gt;<br>  &lt;/dict&gt;<br>&lt;/dict&gt;</pre><p>(Change 192.168.1.23 to your IP.)</p><h3>Option B) ngrok (recommended, HTTPS out of the box)</h3><ol><li>Install &amp; authenticate ngrok (grab your <strong>authtoken</strong> from the ngrok dashboard):</li></ol><pre>ngrok config add-authtoken &lt;YOUR_AUTHTOKEN&gt;</pre><p>2. Expose your local API:</p><pre>ngrok http 3000</pre><p>3. Copy the <strong>HTTPS</strong> forwarding URL, e.g. <a href="https://exampleforwardingurl.ngrok.io/">https://exampleforwardingurl.ngrok.io</a></p><p>This works <strong>from anywhere</strong>, not just your Wi-Fi.</p><p>Because it’s real <strong>HTTPS</strong>, iOS ATS is happy — <strong>no Info.plist exceptions needed</strong>.</p><p>Free ngrok URLs rotate when you restart. For a stable URL, reserve a domain (paid).</p><h3>Part 3 — Flutter (Riverpod) wiring</h3><p>Add dependencies:</p><pre>flutter pub add flutter_riverpod dio</pre><p>We’ll make the base URL configurable via --dart-define, so you can swap between LAN IP and ngrok quickly.</p><ol><li>Base URL provider (Riverpod)</li></ol><pre>ngrok config add-authtoken &lt;YOUR_AUTHTOKEN&gt;</pre><p>2. Dio provider</p><p>lib/core/network/dio_provider.dart</p><pre>import &#39;package:dio/dio.dart&#39;;<br>import &#39;package:flutter_riverpod/flutter_riverpod.dart&#39;;<br>import &#39;base_url.dart&#39;;<br><br>final dioProvider = Provider&lt;Dio&gt;((ref) {<br>  final baseUrl = ref.watch(baseUrlProvider);<br>  return Dio(BaseOptions(<br>    baseUrl: baseUrl,<br>    connectTimeout: const Duration(seconds: 10),<br>    receiveTimeout: const Duration(seconds: 20),<br>  ));<br>});</pre><p>3. Simple repo + provider</p><p>lib/features/health/health_repo.dart</p><pre>import &#39;package:dio/dio.dart&#39;;<br>import &#39;package:flutter_riverpod/flutter_riverpod.dart&#39;;<br>import &#39;../../core/network/dio_provider.dart&#39;;<br><br>final healthRepoProvider = Provider&lt;HealthRepo&gt;((ref) {<br>  final dio = ref.watch(dioProvider);<br>  return HealthRepo(dio);<br>});<br><br>class HealthRepo {<br>  final Dio _dio;<br>  HealthRepo(this._dio);<br><br>  Future&lt;Map&lt;String, dynamic&gt;&gt; getHealth() async {<br>    final res = await _dio.get(&#39;/health&#39;);<br>    return Map&lt;String, dynamic&gt;.from(res.data);<br>  }<br>}</pre><p>lib/features/health/health_provider.dart</p><pre>import &#39;package:flutter_riverpod/flutter_riverpod.dart&#39;;<br>import &#39;health_repo.dart&#39;;<br><br>final healthProvider = FutureProvider&lt;Map&lt;String, dynamic&gt;&gt;((ref) async {<br>  final repo = ref.watch(healthRepoProvider);<br>  return repo.getHealth();<br>});</pre><p>4. A tiny UI to verify</p><p>lib/features/health/health_screen.dart</p><pre>import &#39;package:flutter/material.dart&#39;;<br>import &#39;package:flutter_riverpod/flutter_riverpod.dart&#39;;<br>import &#39;health_provider.dart&#39;;<br><br>class HealthScreen extends ConsumerWidget {<br>  const HealthScreen({super.key});<br><br>  @override<br>  Widget build(BuildContext context, WidgetRef ref) {<br>    final asyncHealth = ref.watch(healthProvider);<br>    return Scaffold(<br>      appBar: AppBar(title: const Text(&#39;Health Check&#39;)),<br>      body: Center(<br>        child: asyncHealth.when(<br>          data: (d) =&gt; Text(&#39;OK: ${d[&#39;ok&#39;]} at ${d[&#39;time&#39;]}&#39;),<br>          loading: () =&gt; const CircularProgressIndicator(),<br>          error: (e, _) =&gt; Text(&#39;Error: $e&#39;),<br>        ),<br>      ),<br>    );<br>  }<br>}</pre><p>Hook it up as your home widget (e.g., in main.dart) and don’t forget ProviderScope.</p><h3>Part 4 — Run the whole thing</h3><p>A) Using LAN IP (same Wi-Fi)</p><ol><li>Start the API:</li></ol><pre>pnpm dev</pre><p>2. Verify from iPhone Safari:</p><pre>http://&lt;YOUR_MAC_IP&gt;:3000/health</pre><p>3. Run Flutter to the <strong>real device</strong> (with your IP):</p><pre>flutter run --dart-define=API_BASE_URL=http://192.168.1.23:3000</pre><blockquote><em>If iOS throws ATS errors, add the </em><em>Info.plist exception shown above.</em></blockquote><p>B) Using ngrok (recommended)</p><ol><li>Start the API:</li></ol><pre>pnpm dev</pre><p>2. Start ngrok:</p><pre>ngrok http 3000</pre><p>3. Use the HTTPS URL for Flutter:</p><pre>flutter run --dart-define=API_BASE_URL=https://exampleforwardingurl.ngrok.io</pre><p>No ATS changes needed — ngrok is HTTPS. Your app will work even off your home Wi-Fi.</p><h3>Troubleshooting Cheatsheet</h3><h3>Can’t reach server from iPhone (LAN)</h3><ul><li>net; WLAN AP/client isolation disabled</li><li>macOS Firewall allows Node/nodemon</li><li>Same SSID/subnet; WLAN AP/client isolation disabled</li></ul><p><strong>ATS blocked (only on HTTP to LAN IP)</strong></p><ul><li>Add the NSExceptionDomains entry in Info.plist, or use ngrok HTTPS to avoid ATS exceptions entirely.</li></ul><p><strong>ngrok URL changes every run</strong></p><ul><li>That’s normal on free plans. Consider a reserved domain for a stable URL.</li></ul><p><strong>CORS errors</strong></p><ul><li>Native Flutter apps (Dio) aren’t subject to browser CORS. If you also open the API in a web browser, keep cors({ origin: true }) during dev.</li></ul><p><strong>Simulator vs Real Device</strong></p><ul><li>Simulator can often use <a href="http://localhost/">http://localhost</a>. Real devices must use LAN IP or ngrok.</li></ul><h3>Optional: Environment presets</h3><p>For convenience, create run configs:</p><p><strong>LAN dev</strong>:</p><pre>flutter run --dart-define=API_BASE_URL=http://192.168.1.23:3000</pre><p><strong>ngrok dev</strong>:</p><pre>flutter run --dart-define=API_BASE_URL=https://abc123.ngrok.io</pre><p>Or add them to launch.json in VS Code, or make simple shell scripts.</p><figure><img alt="Proudly share development knowledge by Thomaz Wynn from WynnSolutions" src="https://cdn-images-1.medium.com/max/1024/1*SVmLPCGNfI1C2Nhz312CvQ.jpeg" /></figure><h3>Wrap-up</h3><p>That’s it — a clean Express API served via <strong>pnpm</strong>, reachable by a <strong>Flutter (Riverpod)</strong> iOS app over your LAN or through a secure <strong>ngrok</strong> URL. Use LAN for super-low latency on the same Wi-Fi, and flip to ngrok when you leave your network or want an ATS-friendly HTTPS endpoint with zero extra config.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1c71993616dc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ကိုယ်တိုင် အဖေတယောက်ဖြစ်လာတဲ့အခါ…]]></title>
            <link>https://heinthurawynn.medium.com/%E1%80%80%E1%80%AD%E1%80%AF%E1%80%9A%E1%80%BA%E1%80%90%E1%80%AD%E1%80%AF%E1%80%84%E1%80%BA-%E1%80%A1%E1%80%96%E1%80%B1%E1%80%90%E1%80%9A%E1%80%B1%E1%80%AC%E1%80%80%E1%80%BA%E1%80%96%E1%80%BC%E1%80%85%E1%80%BA%E1%80%9C%E1%80%AC%E1%80%90%E1%80%B2%E1%80%B7%E1%80%A1%E1%80%81%E1%80%AB-37404cb0edc2?source=rss-37c3ea994f02------2</link>
            <guid isPermaLink="false">https://medium.com/p/37404cb0edc2</guid>
            <dc:creator><![CDATA[HeinThuraWynn @ Thomaz @ 李春福]]></dc:creator>
            <pubDate>Thu, 22 May 2025 15:59:34 GMT</pubDate>
            <atom:updated>2025-05-22T15:59:34.768Z</atom:updated>
            <content:encoded><![CDATA[<p>ကိုယ်တိုင်အဖေတယောက်ဖြစ်လာတဲ့အခါ ကိုယ့်တုန်းကဆိုတဲ့ အတွေးလေးတွေနဲ့ ယှဉ်ပြီး ကိုယ့်သားသမီးကို ပိုကောင်းတာတွေချည်းပေးချင်တယ်။ ကိုယ်ရခဲ့တဲ့မေတ္တာတွေ အချစ်တွေထပ် မလျှော့အောင်ပေးချင်တယ်။ တကယ်တော့လေ ဖေဖေကို ချစ်တယ် ထုတ်ဖွင့်မပြောခဲ့ပေမဲ့ အရမ်းကျေးဇူးတင်မိတယ်။ လောကမှာ ကိုယ်တကယ်မတတ်နိုင်တာတွေကို ကိုယ့်သားသမီးအတွက်ပေးနိုင်အောင်ကြိုးစားပေးခဲ့တာတွေ အခုချိန်မှ သိရတယ်။ အသုံးမကျဘူးလို့ အများက ဝိုင်းပြောဖို့ကြိုးစားတာတွေကို သီးခံရင်း အကောင်းဆုံးလုပ်ကိုင် အရိုးသားဆုံးနေထိုင်ခဲ့တယ် မခိုးမဝှက် ဂွင်မကျော်ပဲ ကိုယ်အလုပ်ကိုယ်အကောင်းဆုံးလုပ်ခဲ့လို့ အားလုံးက အားကျလေးစားရတဲ့ ဖေဖေ။ အဲ့နောက်ကွယ်မှာတော့ မပြည့်စုံတဲ့ မိသားစု ဆိုတာမျိုးမဖြစ်ရအောင် မေမေက သူတက်နိုင်သလောက် အလုပ်ပိုကြိုးစား စာပိုသင်ပြီး ကိုယ်တွေ ဘဝကို ပိုလျှံမနေတောင် လူတန်းစေ့အောင် ထားခဲ့ပေးတယ်။</p><p>သူအင်ဂျင်နီယာတက္ကသလိုလ်ဆင်းတဲ့ အင်ဂျင်နီယာ မဖြစ်ခဲ့လို့ သားနှစ်ယောက်လုံးကို အင်ဂျင်နီယာကျောင်းရအောင် ထားပေးခဲ့တယ်။</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*d0CFlpwwNMxSlIy-" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/519/1*o4zSybGEStPfqQCkVMuJww.png" /></figure><p>အကုန်ပြည့်စုံပြီလို့ထင်ရတဲ့အချိန် ကိုဗစ်ကြောင့် သူထားခဲ့တယ်။ ဒီနေ့ မေ၂၂ အိပ်မက်မက်တယ် ဖေဖေလေ အိမ်ပြန်လာတာ ကားဂိတ်မှာသွားစောင့်ပေးတာတဲ့ ကိုယ့်ရှေ့မှာ ကလေးတစ်ယောက်က ဈေးဝယ်ချင်တာ သူ့အဖေရှာနေတာတဲ့ ကိုယ့်စိတ်ထဲတော့ ကိုယ်လဲ အဖေပြန်အလာ လာကြိုတာပေါ့​ရေခဲထုပ်လေးစားရင်းနဲ့ ကားလမ်းကူးလိုက်တာ ကားပေါ်ပါသွားလို့ ဖေဖေနဲ့လွဲသွားတယ် <strong>အိမ်မက်ထဲမှာတောင် ဝေဝေဝါးဝါးနဲ့ မှတ်မိတဲ့အဖေဆိုတာလေ ညမိုးချုပ်ကို လိုင်းကားတိုးစီးရင်း အင်ဂျင်နီယာ ဆိုက်ဝတ်စုံနဲ့ အလုပ်လုပ်နေရတုန်းတဲ့ ဝမ်းနည်းလိုက်တာဗျာ….</strong></p><p>ခုချိန်ထိ ဘာပဲပေးရပေးရပါ အဖေကို ပြန်ရမယ်ဆို လိုချင်တုန်းပဲ လွမ်းတယ် ဘယ်တွေရောက်ပြီး ဘယ်အရပ်ဒေသမှာ မိဘတာဝန်လွန်စွာကျေပွန်နေပြန်ပြီလဲနော်…</p><figure><img alt="ဖေဖေကိုယ်တိုင် ကြီးကြပ်စီမံခဲ့တဲ့ နဂါးရုံဘုရားရှေ့မှာ မေမေနဲ့အမှတ်တရ" src="https://cdn-images-1.medium.com/max/1024/0*PlzwG-4BcwekxGxv" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*-Tv_tNQShSWCuTrV" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/686/0*I8EKXFSmISmEHvyh" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=37404cb0edc2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ဖေဖေ Dev တယောက် ဘဝရဲ့ အချိုးအကွေ့များ]]></title>
            <link>https://heinthurawynn.medium.com/%E1%80%96%E1%80%B1%E1%80%96%E1%80%B1-dev-%E1%80%90%E1%80%9A%E1%80%B1%E1%80%AC%E1%80%80%E1%80%BA-%E1%80%98%E1%80%9D%E1%80%9B%E1%80%B2%E1%80%B7-%E1%80%A1%E1%80%81%E1%80%BB%E1%80%AD%E1%80%AF%E1%80%B8%E1%80%A1%E1%80%80%E1%80%BD%E1%80%B1%E1%80%B7%E1%80%99%E1%80%BB%E1%80%AC%E1%80%B8-6bba9fcbc063?source=rss-37c3ea994f02------2</link>
            <guid isPermaLink="false">https://medium.com/p/6bba9fcbc063</guid>
            <dc:creator><![CDATA[HeinThuraWynn @ Thomaz @ 李春福]]></dc:creator>
            <pubDate>Sat, 17 May 2025 19:27:01 GMT</pubDate>
            <atom:updated>2025-05-17T19:27:01.807Z</atom:updated>
            <content:encoded><![CDATA[<p>ကျနော်ဟာ ဖေဖေ အသစ်စက်စက်လေးပါ, အသိအကို တစ်ယောက်ရဲ့မိတ်ဆက်ပေးမှုနဲ့ အဆင်ပြေပြေနဲ့ Upwork မှာ Remote လုပ်နိုင်ခဲ့တယ်နောက်တော့ နှစ်လအကြာမှာ လုပ်နေတဲ့အလုပ်ကိုပဲ အလုပ်ရှင်ပြောင်းပြီး Upwork မှာပဲ Rate တိုးသွားပြီး ဆက်လုပ်တယ် အဆင်ပြေတယ်ပေါ့ နောက်ပိုင်းမှာတော့ Upwork က Percent ပေးရမှာဆိုးလို့ဆိုပြီး Company မှာ permanent အနေနဲ့ NDA Contract ပြောင်းသွားတယ်။ လုပ်ရတဲ့အလုပ်ကလဲ တကယ် သာသာယာယာ လောင်မှုတွေမရှိသလောက်ပဲ ဒါပေမဲ့ အလုပ်ရှင်စပြောင်းထဲက လုပ်နေတဲ့ Web platform ကြီးရဲ့ Income ကိုမေးတော့ သူတို့က တခြားလုပ်ငန်းတွေကနေငွေဝင်ပြီး ဒီပေါ်မှာ သေချာလေး မြှုပ်နှံနေတာတဲ့ ကျနော်လုပ်ရတဲ့အပိုင်းက API services တွေချိတ်ယုံပဲ Social Platformကြီးဆိုတော့ အောင်မြင်တဲ့အခါ portfolio ကောင်းတယ်ဆိုတဲ့အတွေးနဲ့ပဲ နေလိုက်တာ pay လဲ နိုင်ငံခြားမှာ သွားလုပ်သလောက်မမီပေမဲ့ ၇၀%လောက် နိုင်ငံခြားမှာ လုပ်သလောက်ရနေတာဆိုတော့ အိုးမကွာ အိမ်မကွာနဲ့ပျော်စရာပဲလေဆိုပြီးနေလိုက်တယ်.</p><p>အလုပ်က Apr မှာ စလုပ်တာ Agency မှာ လုပ်နေရာက inhouse ကို June မှာ ပြောင်းရတယ် နှစ်ကုန်တော့ UpWork ကနေ Permanent ဖြစ်သွားတယ်ပေါ့။ ပြဿနာက တနှစ်ပြည့်ခါနီးမှာစတာပဲ Product က Launch ဖြစ်ဖို့ အဝေးကြီးလိုသေးတယ် Feature တွေက မစုံသေး Design တွေက ခဏခဏပြင်နဲ့ စမ်းမဆုံး ထည့်မဆုံး အကုန်လုံး ပွယောင်းယောင်း codeတွေနဲ့ ရှေ့ code လဲ ဖျက်မရ နောက် code ကလဲ ပြင်လွယ်ပြောင်းလွယ်တွေ လိုက်ရေးရနဲ့ တော်တော် အဆင်မပြေနေပါဘူး။ income ကလဲ မဝင်သေးတော့ အလုပ်ရှင်ခမျာ လစာတောင် (၇)ရက်လောက်နောက်ကျပြီးမှ ပေးနိုင်တော့တာမျိုးဖြစ်လာတယ်။ မတိုင်ခင်မှာလဲ လူလျှော့ဖို့တော့လိုနေပြီ ပြောနေတာမျိုးတွေ ကြားရတယ်။ ကိုယ်က project သုံးခုလောက်ကို ကိုင်ရတော့ လုံးဝ လျှော့ရင် ကိုယ်မပါဘူးပဲထင်တာ မထင်မှတ်ပဲ ကိုယ်က ထိပ်ဆုံးကပါသွားရော..</p><p>ကျနော့်အမျိုးသမီးနဲ့ စတွေ့တုန်းကလည်း stress တွေ မိသားစု ကိစ္စတွေ အချစ်ရေး အဆင်မပြေမှုတွေနဲ့မလို့ ကျနော့်မှာ အလုပ်ထွက်ထားတယ်။ သူမ ဖေးမမှုတွေနဲ့ အစကပြန်ကြိုးစားပြီး Senior Dev, Lead Dev အဖြစ်နဲ့ Corporate Company ကြီးတခုမှာလုပ်နိုင်ခဲ့တယ်။ Coup နဲ့ Covid နဲ့ ကြုံလာတော့ WFH လုပ်ချင်လို့ အလုပ်ထွက်ခဲ့တယ် Remote Singapore အလုပ်တွေ Join တာ Stress ပိလို့ ပြုတ်ပြန်ရော တကယ်တော့ မင်္ဂလာဆောင်ဖို့အကုန် စီစဉ်ပြီးသား ဖိိတ်စာမှာတောင် အလုပ်ထည့်ရိုက်ထားတာကနေ အကုန်ပြန်ပြင်ခဲ့ရ အလုပ်မရှိပဲ မင်္ဂလာဆောင်ဖို့ စီစဉ်ခဲ့ရတယ်။ ရည်းစား စဖြစ်တော့လဲ အလုပ်လက်မဲ့ မင်္ဂလာဆောင်ခါနီးလဲ အလုပ်မရှိနဲ့ ကံကောင်းလို့ အကိုတစ်ယောက်က ချိတ်ဆက်ပေးလို့ Upwork remote အလုပ်တခုမှာ အလုပ်ပြန်ရတယ် အခု တနှစ်လောက်ပဲကြာတယ် သားလေးမွေးပြီးခါမှာလဲ ထပ်ပြုတ်ပြန်ပြီ အလုပ်လက်မဲ့ ဖေဖေဖြစ်ပြန်ပြီဗျာ..</p><p>အမျိုးသမီးရဲ့ အားပေးမှုတွေနဲ့ မပြိုလဲဘူးဗျာ ကျနော်ပြန်ပြီး အလုပ်တွေရှာဦးမယ်.. လျှောက်ဦးမယ်…</p><p>ဟိန်းသူရ <br>May 18 2023</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6bba9fcbc063" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Flutter: CocoaPods’s specs repository is too out-of-date to satisfy dependencies]]></title>
            <link>https://heinthurawynn.medium.com/flutter-cocoapodss-specs-repository-is-too-out-of-date-to-satisfy-dependencies-ce7ad5ca4a20?source=rss-37c3ea994f02------2</link>
            <guid isPermaLink="false">https://medium.com/p/ce7ad5ca4a20</guid>
            <dc:creator><![CDATA[HeinThuraWynn @ Thomaz @ 李春福]]></dc:creator>
            <pubDate>Tue, 17 Oct 2023 19:23:01 GMT</pubDate>
            <atom:updated>2023-10-17T19:23:01.620Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>original link <a href="https://stackoverflow.com/questions/64443888/flutter-cocoapodss-specs-repository-is-too-out-of-date-to-satisfy-dependencies">https://stackoverflow.com/questions/64443888/flutter-cocoapodss-specs-repository-is-too-out-of-date-to-satisfy-dependencies</a></blockquote><ul><li>Go to /ios folder inside your Project.</li><li>Delete Podfile.lock (YourPoject/ios/Podfile.lock)</li><li>run cmd pod repo remove trunk</li></ul><p>Now you have removed the pod completely. Now run</p><p>Here you have to do it according to the chip of your Mac, here I have given for both. thanks, @Kamal Panara for identifying this</p><p>For Intel chip users</p><pre>Run pod install --repo-update</pre><p>(Make sure your cd into the iOS directory of the flutter app) For M1 chip Users</p><p>install ffi first (if not) In regular terminal using command:</p><pre>sudo arch -x86_64 gem install ffi</pre><p>then run</p><pre>arch -x86_64 pod install --repo-update</pre><p>Note if you are getting an error of</p><pre>[!] CocoaPods could not find compatible versions for pod &quot;cloud_firestore&quot;:<br>  In Podfile:<br>    cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`)</pre><pre>Specs satisfying the `cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`)` dependency were found, but they required a higher minimum deployment target.</pre><pre>[!] Automatically assigning platform `iOS` with version `9.0` on target `Runner` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.</pre><p>now go to the podfile at line just uncomment the line and make it similar like below.</p><pre>platform :ios, &#39;12.0&#39;</pre><p>Now re-run this cmd.</p><pre>arch -x86_64 pod install --repo-update</pre><p>Now this time it will work fine.</p><p>now run</p><pre>flutter clean</pre><p>then</p><pre>flutter run</pre><p>enjoy.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ce7ad5ca4a20" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Xcode Simulator tricks]]></title>
            <link>https://heinthurawynn.medium.com/xcode-simulator-tricks-5e5e0a0da0a5?source=rss-37c3ea994f02------2</link>
            <guid isPermaLink="false">https://medium.com/p/5e5e0a0da0a5</guid>
            <dc:creator><![CDATA[HeinThuraWynn @ Thomaz @ 李春福]]></dc:creator>
            <pubDate>Sat, 14 Oct 2023 01:43:04 GMT</pubDate>
            <atom:updated>2023-10-14T01:43:04.990Z</atom:updated>
            <content:encoded><![CDATA[<p>Xcode Simulator tricks</p><p>About This Mac -&gt; Storage -&gt; Manage -&gt; Developer<br>And deleted all the contents there</p><p>data from <a href="https://gist.github.com/mael/e3d9cd77a43347091d5c3894ce4e22c7">https://gist.github.com/mael/e3d9cd77a43347091d5c3894ce4e22c7</a></p><h3><a href="https://gist.github.com/mael/e3d9cd77a43347091d5c3894ce4e22c7#solution-unable-to-boot-the-simulator">Solution “Unable to boot the Simulator”</a></h3><blockquote><em>sudo mkdir /private/tmp</em></blockquote><blockquote><em>sudo chmod 1777 /private/tmp</em></blockquote><h3><a href="https://gist.github.com/mael/e3d9cd77a43347091d5c3894ce4e22c7#other-basic-command">Other basic command</a></h3><p>xcrun</p><blockquote><em>xcrun simctl list devices //to list all simulators</em></blockquote><blockquote><em>xcrun simctl delete // to delete specific device</em></blockquote><blockquote><em>xcrun simctl delete unavailable // to remove old devices for runtimes that are no longer supported</em></blockquote><p>Delete and clean</p><blockquote><em>xcrun simctl shutdown all</em></blockquote><blockquote><em>xcrun simctl delete $(xcrun simctl list | grep -o ‘[0–9A-F]{8}-[0–9A-F]{4}-[0–9A-F]{4}-[0–9A-F]{4}-[0–9A-F]{12}’ | xargs)</em></blockquote><blockquote><em>xcrun simctl delete unavailable</em></blockquote><p>xcode</p><blockquote><em>sudo xcode-select — reset</em></blockquote><p>To delete devices go here:</p><p>~/Library/Developer/CoreSimulator/Devices</p><h3><a href="https://gist.github.com/mael/e3d9cd77a43347091d5c3894ce4e22c7#simulator">Simulator</a></h3><p>Defautl open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/</p><p>Launch multiple simulators</p><p>find simulator id’s from the ‘xcrun simctl list’ command</p><blockquote><em>xcrun simctl boot 12F3C6FB-1A8A-4D20–922F-2DB485F58F0F</em></blockquote><blockquote><em>xcrun simctl boot BE53CBFF-4900–4F10-A1D4-B451AB4C9E7E</em></blockquote><blockquote><em>open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/</em></blockquote><h3><a href="https://gist.github.com/mael/e3d9cd77a43347091d5c3894ce4e22c7#from-xcode-project">From Xcode project</a></h3><ol><li>Go to Window &gt; Devices and Simulators, delete all the simulators, all of them.</li><li>Clear /Library/Developer/CoreSimulator/ folder.</li><li>Return to Xcode and install the required simulators.</li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5e5e0a0da0a5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Frontend Dev တွေ သိသင့်သော ဖတ်သင့်သော Article များ စုစည်းမှု]]></title>
            <link>https://heinthurawynn.medium.com/frontend-dev-%E1%80%90%E1%80%BD%E1%80%B1-%E1%80%9E%E1%80%AD%E1%80%9E%E1%80%84%E1%80%B7%E1%80%BA%E1%80%9E%E1%80%B1%E1%80%AC-%E1%80%96%E1%80%90%E1%80%BA%E1%80%9E%E1%80%84%E1%80%B7%E1%80%BA%E1%80%9E%E1%80%B1%E1%80%AC-article-%E1%80%99%E1%80%BB%E1%80%AC%E1%80%B8-%E1%80%85%E1%80%AF%E1%80%85%E1%80%8A%E1%80%BA%E1%80%B8%E1%80%99%E1%80%BE%E1%80%AF-1d625c4c8627?source=rss-37c3ea994f02------2</link>
            <guid isPermaLink="false">https://medium.com/p/1d625c4c8627</guid>
            <category><![CDATA[web-dev-resources]]></category>
            <dc:creator><![CDATA[HeinThuraWynn @ Thomaz @ 李春福]]></dc:creator>
            <pubDate>Wed, 17 Aug 2022 20:09:42 GMT</pubDate>
            <atom:updated>2022-08-17T20:09:42.696Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>ကျနော် Coursera.org က <a href="https://www.coursera.org/professional-certificates/meta-front-end-developer">Meta Front-End Developer Professional Certificate</a> Course ကို တက်ဖြစ်တယ် React ကို သိချင်လို့တက်တာပေမဲ့ အခြေခံတွေပါ သူတို့သင်ပေးတာ ဘယ်လိုလဲသိချင်လို့တက်လိုက်တာ တော်တော်လေး အဆင်ပြေတယ်ပြောရမယ် ကျနော် တက္ကသိုလ်တက်ခဲ့တဲ့ အချိန်မှာ ဒီ Course ကိုသိခဲ့ရင် သိပ်ကောင်းမှာပဲလို့တွေးမိတယ် Server တွေ IP layer တွေကို ပါ ပါးပါးလေး သိသင့်သလောက်ထည့်ရှင်းပြထားတာတွေကို ကြိုက်တယ်။ သင်ခန်းစာတွေထဲက Additional Resources တွေကို Note မှတ်ထားရင်းနဲ့ web development ကို စိတ်ဝင်စားတဲ့ ဘာမှမသိသေးတဲ့သူတွေလဲ ဒီ Course ကို ရွေးချယ် တက်သင့်တယ်လို့ Recomand ပေးချင်တယ်။</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*4z6X5KyQ3nfL-uiUvzQmKg.png" /></figure><p>#SharingIsCaring!</p><p>HTTP Overview (Mozilla)</p><p><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview?fbclid=IwAR3Ovs_obGUpFopS_P5gdc9fDxxgpoeI6xTki91cQKBtak4IoOV9PDc5BIA">https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview</a></p><p>Introduction to Networking by Dr.Charles R Severance</p><p><a href="https://www.amazon.com/Introduction-Networking-How-Internet-Works/dp/1511654945/?fbclid=IwAR3GidcOxWkY0iAa7z6z6DJLbDaC4CsNrtyl6xme088Bfbh50MM6uPkMa2E">https://www.amazon.com/Introduction.../dp/1511654945/</a></p><p>Chrome Developer Tools Overview (Google)</p><p><a href="https://developer.chrome.com/docs/devtools/overview/?fbclid=IwAR3yWKGuHrcwk4zB7yWa0I3GJ6TlBhKDRlMSeGoHvJZdvnGoaHcNaL8fz0M">https://developer.chrome.com/docs/devtools/overview/</a></p><p>Firefox Developer Tools User Docs (Mozilla)</p><p><a href="https://firefox-source-docs.mozilla.org/devtools-user/index.html?fbclid=IwAR3hwR_3m1tlxrWF3449CDFgbHkWmXqWD84u19b9PCZUKy7dd8gzVzjKZw0">https://firefox-source-docs.mozilla.org/devtoo.../index.html</a></p><p>Getting Started with Visual Studio Code (Microsoft)</p><p><a href="https://code.visualstudio.com/docs?fbclid=IwAR0ZAk8w2gq1BWbSakJSiXAVfxZkXmx8F8Df4QYNIUZgSC7XSTCVUla9kI0">https://code.visualstudio.com/docs</a></p><p>HTML Elements Reference (Mozilla)</p><p><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element?fbclid=IwAR3XLx1_oyOWghwAAEhr0IJa-7x0wFvq3hinPWrJEKLwzLo8xMwbeM6vG30">https://developer.mozilla.org/en-US/docs/Web/HTML/Element</a></p><p>The Form Element (Mozilla)</p><p><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form?fbclid=IwAR3XLx1_oyOWghwAAEhr0IJa-7x0wFvq3hinPWrJEKLwzLo8xMwbeM6vG30">https://developer.mozilla.org/.../docs/Web/HTML/Element/form</a></p><p>What is the Document Object Model? (W3C)</p><p><a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.w3.org%2FTR%2FWD-DOM%2Fintroduction.html%3Ffbclid%3DIwAR0Z2sr0hY-VXubh5Ru7jorZZafwXy_Eet8OJmiFswsmvcfTMknNjJbJ1EM&amp;h=AT0fDys9xo2F8_diq3omSysxQjnUlGhGHhxoswStQcPW4aemddrUS84TtwPSfih4_TolN7j1yjmO3J09mvyJPcFvds_AiuS2d6i4z6FGnoYBzS5I4Fs3oz373JZZD-lSfe52c2ap7g&amp;__tn__=-UK-R&amp;c%5B0%5D=AT2zQLw0PTxF9ytc3R8VwBV4CV-DdeGBHwjCUtwpPmYZ3hiVi5qPTaxvy1mYthryWvMW6TayllVxa3PsHQY69PpK6O3VQ9nbzFNlRwczhI2lFhCcTqTRjWrlQnl2aowbH7Ib7TTv2ogxgzyFFjclwfNIU5-1dM93ByypluxTm2A56TqNluVr">https://www.w3.org/TR/WD-DOM/introduction.html</a></p><p>ARIA in HTML (W3C via Github)</p><p><a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fw3c.github.io%2Fhtml-aria%2F%3Ffbclid%3DIwAR13WyGBL2DjzufxTgdhYMOpoVL3RjDCdQWkVhRIJBr1JL-TT2e6Yf_wsGA&amp;h=AT3yI1h_7FOg4wIce040x6t2v-0EnCjbqxaVUqjEl_UW-q-bO7GpCvm1-jJVKK5i9iZFpaDq9JULSjxTS6q2Le9GqQDn5rztRkhnd-_MSrnyi0mEqD8KmJQ3dcexP0HUxRlpS5p0Dw&amp;__tn__=-UK-R&amp;c%5B0%5D=AT2zQLw0PTxF9ytc3R8VwBV4CV-DdeGBHwjCUtwpPmYZ3hiVi5qPTaxvy1mYthryWvMW6TayllVxa3PsHQY69PpK6O3VQ9nbzFNlRwczhI2lFhCcTqTRjWrlQnl2aowbH7Ib7TTv2ogxgzyFFjclwfNIU5-1dM93ByypluxTm2A56TqNluVr">https://w3c.github.io/html-aria/</a></p><p>ARIA Authoring Practices (W3C)</p><p><a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.w3.org%2FTR%2Fwai-aria-practices-1.2%2F%3Ffbclid%3DIwAR3QQbefkZgAzVJhdeT0sxwKL8CuczH5vrU-pD4Vuy5Iy91zhIXb3q5-wXM&amp;h=AT2VYocoKcSfp0rMObnh1Or0zqeMQ6hZ6uBATwnz_UOZV3Eu8DPnVS1X_EgnSHbmSkkcsW1teMkkT6m2dG1pHXdUXv7JSpiVFQRHo9YFwB-UC1xSm3f4Da4IBOlEHT5U14yCGsW59g&amp;__tn__=-UK-R&amp;c%5B0%5D=AT2zQLw0PTxF9ytc3R8VwBV4CV-DdeGBHwjCUtwpPmYZ3hiVi5qPTaxvy1mYthryWvMW6TayllVxa3PsHQY69PpK6O3VQ9nbzFNlRwczhI2lFhCcTqTRjWrlQnl2aowbH7Ib7TTv2ogxgzyFFjclwfNIU5-1dM93ByypluxTm2A56TqNluVr">https://www.w3.org/TR/wai-aria-practices-1.2/</a></p><p>Learn more​</p><p>Here is a list of resources that may be helpful as you continue your learning journey.</p><p>CSS Reference (Mozilla)</p><p><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference?fbclid=IwAR36qg7GfKt427RE_H_vU0-uqGdIy9_NdSEjk6Jj-OOiwGsyq_vYlSHnhQ4">https://developer.mozilla.org/en-US/docs/Web/CSS/Reference</a></p><p>HTML and CSS: Design and build websites by Jon Duckett</p><p><a href="https://www.amazon.com/HTML-CSS-Design-Build-Websites/dp/1118008189/?fbclid=IwAR0v9_zOwoSHZIummXXCMCpSuN_3KBarM_XUKCwGXDAsUMe9bRbhK5O6Jqw">https://www.amazon.com/HTML-CSS-Design.../dp/1118008189/</a></p><p>CSS Definitive Guide by Eric Meyer</p><p><a href="https://www.amazon.com/CSS-Definitive-Guide-Visual-Presentation/dp/1449393195/?fbclid=IwAR26uIu4cpOjsAtPIb6xNC9BJkvOp2K6HptaELM1R0j9Ubtf_y4CY_pLm-c">https://www.amazon.com/CSS-Definitive.../dp/1449393195/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1d625c4c8627" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ubuntu စက်မှာ VPN လိုတဲ့အခါ…]]></title>
            <link>https://heinthurawynn.medium.com/ubuntu-%E1%80%85%E1%80%80%E1%80%BA%E1%80%99%E1%80%BE%E1%80%AC-vpn-%E1%80%9C%E1%80%AD%E1%80%AF%E1%80%90%E1%80%B2%E1%80%B7%E1%80%A1%E1%80%81%E1%80%AB-804db6751c1d?source=rss-37c3ea994f02------2</link>
            <guid isPermaLink="false">https://medium.com/p/804db6751c1d</guid>
            <category><![CDATA[myanmar]]></category>
            <category><![CDATA[warp]]></category>
            <category><![CDATA[internet-rights]]></category>
            <category><![CDATA[vpn]]></category>
            <dc:creator><![CDATA[HeinThuraWynn @ Thomaz @ 李春福]]></dc:creator>
            <pubDate>Fri, 17 Sep 2021 13:18:55 GMT</pubDate>
            <atom:updated>2021-09-17T13:18:55.772Z</atom:updated>
            <content:encoded><![CDATA[<blockquote><em>၂၀၂၁ Coup ကြောင့် မြန်မာနိုင်ငံမှာ အင်တာနက် ပိတ်ဆို့မှုတွေနဲ့ သုံးစွဲမှုမှာ ကန့်သတ်ချက်တွေများစွာရှိနေဆဲပါ</em></blockquote><p>ကျနော့်ရုံးက DIA လိုင်းတွေချိတ်ထားတော့ Internet သုံးရတာ အဆင်ပြေတယ် အိမ်ပြန်ရောက်မှ Code ရေးဖို့ကြိုးစားတဲ့ အခါမှာတော့ ပြဿနာစတက်ပါပြီ Composer ကို ခေါ်မရတာနဲ့ Bitbucket ကို ဝင်မရရတာနဲ့ Singapore Server တွေဆို ချိတ်လို့မရရတာနဲ့ စိတ်အရမ်းရှုပ်ရပါတယ် OutLine ကို သုံးဖို့ တခြားသူတွေပြောပေမဲ့ ကျနော့် Laptopမှာ သွင်းလို့မရဘူး ကျနော်ရုံးက စက်ထဲမှာတော့ Outline က ကောင်းကောင်းသုံးလို့ရတယ် အိမ်က Ubuntu စက်မှာ VPN ချိတ်ဖို့လိုလာပြီဆိုတော့ Warp 1.1.1.1 ကိုများသုံးလို့ရမလားလို့ သုံးကြည့်တာအဆင်ပြေသွားလို့ Information လေး မျှဝေပေးချင်ပါတယ်။</p><h4>https://developers.cloudflare.com/warp-client/setting-up/linux</h4><p>အပေါ်ကလင့်မှာ အပြည့်အစုံတွေ့ရမှာပါ။ ကျနော်ကတော့ မြန်မာလို့Content ရှိစေချင်လို့ ထပ်ပြီးရေးထားလိုက်ပါမယ်။</p><p>ပထမဆုံး Linux Desktop Client သွင်းမယ်ပေါ့ဗျာ</p><p>Curl နဲ့ ပထမဆုံး Cloudflare Client package သွင်းကြမယ်</p><h4>curl https://pkg.cloudflareclient.com/pubkey.gpg | sudo apt-key add -</h4><p>ရမရ အောက်က Cmd လေးကို Run ကြည့်လိုက်ဗျာ</p><h4>echo &#39;deb http://pkg.cloudflareclient.com/ &lt;RELEASE&gt; main&#39; | sudo tee /etc/apt/sources.list.d/cloudflare-client.list</h4><p>Release နေရာမှာ ကိုနဲ့ ကိုက်တဲ့ Versionကို ထည့်ပေးလိုက်ပါ ကျနော်က တော့ 20.04 ဆိုတော့ focal ကို ရွေးလိုက်တယ်</p><h4>echo &#39;deb http://pkg.cloudflareclient.com/ focal main&#39; | sudo tee /etc/apt/sources.list.d/cloudflare-client.list</h4><p>ပြီးတဲ့အခါ sudo apt-get update ပေါ့ ပြီးရင် Cloudflare warp သွင်းလိုက်ပါ။</p><h4>sudo apt-get update &amp;&amp; sudo apt-get upgrade &amp;&amp; sudo apt install cloudflare-warp</h4><p>yum based OS မှာ ဆိုရင်တော့</p><h4>sudo yum install cloudflare-warp</h4><p>ပြီးတဲ့အခါ Register လုပ်ရမဲ့ cmd က တော့</p><h4>warp-cli register</h4><p>Connect လုပ်တဲ့ အခါမှာတော့</p><h4>warp-cli connect</h4><p>အလုပ်လုပ်မလုပ်စစ်ဖို့ကတော့ အောက်က ကောင်လေး ထပ် Run ကြည့်ပါ</p><h4>curl https://www.cloudflare.com/cdn-cgi/trace/</h4><p>ဒါဆို</p><h4>warp=on</h4><p>ဖြစ်နေမယ်ခင်ဗျာ့ အမြဲ ဖွင့်ထားချင်ရင်</p><h4>warp-cli enable-<strong>always</strong>-on</h4><p>ဒီလောက်ဆိုသုံးလို့အဆင်ပြေမယ် ထင်ပါတယ်။ နောက်တစ်ခေါက် စက် ပိတ်ပြီး ပြန်ဖွင့်တာဖြစ်ဖြစ် Internet line ပြောင်းတာ ချိန်းတာဖြစ်ဖြစ်</p><h4>warp-cli connect</h4><p>ပြန်ခေါ်ကြည့်ပေးလိုက် အဲ့တာ success ဆိုရင် WARP 1.1.1.1 ဖွင့်ပြီးပြီပေါ့ဗျာ။</p><blockquote>အင်တာနက်ပိတ်ခံရခြင်း ဘေးအန္တရာယ်မှ ကင်းဝေးပါစေ။ လူ့အခွင့်အရေး ပိတ်ဆို့မှုများ ပပျောက်ပါစေဗျာ။</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/0*KqoQW2kTh6BhB6Rs.jpg" /></figure><p>Bye for now</p><p>Thomaz</p><p>Sr. Software Engineer</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=804db6751c1d" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>