<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Maggie Ma</title>
    <description>The latest articles on DEV Community by Maggie Ma (@maggie_ma_74a341dc9fbf0f6).</description>
    <link>https://dev.to/maggie_ma_74a341dc9fbf0f6</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3753843%2Fa6d2febc-1acb-4e41-8be7-deff79544386.png</url>
      <title>DEV Community: Maggie Ma</title>
      <link>https://dev.to/maggie_ma_74a341dc9fbf0f6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maggie_ma_74a341dc9fbf0f6"/>
    <language>en</language>
    <item>
      <title>Some Short-Cuts</title>
      <dc:creator>Maggie Ma</dc:creator>
      <pubDate>Wed, 11 Feb 2026 17:06:18 +0000</pubDate>
      <link>https://dev.to/maggie_ma_74a341dc9fbf0f6/some-short-cuts-45ii</link>
      <guid>https://dev.to/maggie_ma_74a341dc9fbf0f6/some-short-cuts-45ii</guid>
      <description>&lt;p&gt;&lt;strong&gt;1. Intelligent Selection Control&lt;/strong&gt;&lt;br&gt;
Expand Selection (Alt + Shift + →): This command allows you to select code blocks logically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt; Every time you hit the right arrow, the selection "levels up"—moving from a single variable to a function call, then to the entire line, and eventually to the whole component or block.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why use it:&lt;/strong&gt; It is much faster and more precise than using a mouse to highlight specific nested logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Efficient Import Cleanup&lt;/strong&gt;&lt;br&gt;
Organize Imports (Ctrl + Shift + O): While this is the default shortcut for "Go to Symbol," in many optimized environments or with specific keybindings, it is used to automatically remove unused imports and alphabetize the remaining ones.&lt;/p&gt;

&lt;p&gt;Pro Tip: If you are using the standard VS Code shortcuts, you can also use Shift + Alt + O to specifically Organize Imports and clean up the top of your file instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. ES7+ React/Redux/React-Native Snippets&lt;/strong&gt;&lt;br&gt;
Instead of typing out repetitive boilerplate codeEditor components, you can use short abbreviations that expand into full code structures.&lt;/p&gt;

&lt;p&gt;rfce -&amp;gt; create a functional component with an export name&lt;br&gt;
rafce-&amp;gt; create a React Arrow Function component with an export name&lt;br&gt;
clg -&amp;gt; console.log(object)&lt;br&gt;
nfn -&amp;gt; const name = (params) =&amp;gt; {}&lt;br&gt;
uef -&amp;gt;  useEffect(() =&amp;gt; {...}, [])&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TIL on Zod...</title>
      <dc:creator>Maggie Ma</dc:creator>
      <pubDate>Mon, 09 Feb 2026 19:12:41 +0000</pubDate>
      <link>https://dev.to/maggie_ma_74a341dc9fbf0f6/til-on-zod-mbh</link>
      <guid>https://dev.to/maggie_ma_74a341dc9fbf0f6/til-on-zod-mbh</guid>
      <description>&lt;p&gt;The LLMs are really just "Garbage in, Gaarbage out"(GIGO) system. If a user provide an input that is too long, contains malicious characters, or missing required field, the AI might be driven crazy.....&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Zod&lt;/strong&gt;&lt;br&gt;
one out of the most is: Zod is Runtime safety, unlike typescript interfaces, Zod checks data at runtime before it ever hits the OpenAI API&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**const chatRequestSchema = z.object({
    prompt: z.string()
    .trim()
    .min(1, 'Prompt is required')
    .max(1000, 'Prompt is too long'),
    conversationId: z.string().uuid(),
})**

app.post('/api/chat', async (req: Request, res:Response) =&amp;gt; {
    const parseResult = chatRequestSchema.safeParse(req.body);
    if (!parseResult.success) {
        res.status(400).json({ error: parseResult.error.format() });
        return;
    }

    const {prompt, conversationId} = req.body;

    try{
        const response: ChatResponse = await chatService.sendRequest(prompt, conversationId);
        console.log("Response from OpenAI:", response);
        res.json({ message: response.message})

    } catch (error) {
        res.status(500).json({ error: 'An error occurred while processing your request.' });
        return;
    }

})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Advanced way of using Zod could be: Zod.infer, to be contionued&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Basics about SAML/SSO with ADLAP</title>
      <dc:creator>Maggie Ma</dc:creator>
      <pubDate>Fri, 06 Feb 2026 19:30:11 +0000</pubDate>
      <link>https://dev.to/maggie_ma_74a341dc9fbf0f6/basics-about-samlsso-with-adlap-47md</link>
      <guid>https://dev.to/maggie_ma_74a341dc9fbf0f6/basics-about-samlsso-with-adlap-47md</guid>
      <description>&lt;p&gt;&lt;a href="https://developer.okta.com/docs/concepts/saml/" rel="noopener noreferrer"&gt;https://developer.okta.com/docs/concepts/saml/&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The cast of Characters(Terminology)&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;The Principal: the user trying to log in&lt;/li&gt;
&lt;li&gt;Identity Provider(IdP): The "Source of Truth", this is the system that knows the user's password and verifies who they are(e.g. Okta, Azure AD)&lt;/li&gt;
&lt;li&gt;Service Provider(SP): The application the user want to use(the app you are building)&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;The "Digital Badge" Concept(The Role)&lt;/li&gt;
&lt;li&gt;IdP = the passport Office: by check your birth certificate and ID to prove you are you, then give you the passport&lt;/li&gt;
&lt;li&gt;Assertion = Passport: A signed document that says "We trust this person is Maggie Ma"&lt;/li&gt;
&lt;li&gt;SP = the TSA/Borading Gate. they don't check your birth certificate, they just looked at your passport, if the passport has the digital signature, they will let you in&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;3: Steps(with pictured workflow)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4ah6aqens4xw1bel65b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4ah6aqens4xw1bel65b.png" alt=" " width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;the metadata is preset(the instruction manual) before anayone logs in, is the rule of the game, including yje SSO Url(App to Okta), ACS Url(Oktaa to app), Entity ID and the cert&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assertion is the passport, uses during runtime, is an XML contains the user's name, emails timestamp, etc. and is signed by Okta using the key in metadata. and the assertion is sent with the ACS Url&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;once the app get the assertion, it checks the signature using metadata from the Public key from metadata&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>security</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>safely store api key in project</title>
      <dc:creator>Maggie Ma</dc:creator>
      <pubDate>Wed, 04 Feb 2026 22:46:02 +0000</pubDate>
      <link>https://dev.to/maggie_ma_74a341dc9fbf0f6/use-bun-3e71</link>
      <guid>https://dev.to/maggie_ma_74a341dc9fbf0f6/use-bun-3e71</guid>
      <description>&lt;p&gt;bun&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
