<?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: gemmaro</title>
    <description>The latest articles on DEV Community by gemmaro (@gemmaro).</description>
    <link>https://dev.to/gemmaro</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F656518%2F92caad54-1313-464a-9910-12301ba00800.png</url>
      <title>DEV Community: gemmaro</title>
      <link>https://dev.to/gemmaro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gemmaro"/>
    <language>en</language>
    <item>
      <title>Bundler Quiz!</title>
      <dc:creator>gemmaro</dc:creator>
      <pubDate>Sat, 25 Jul 2026 21:19:10 +0000</pubDate>
      <link>https://dev.to/gemmaro/bundler-quiz-3fkh</link>
      <guid>https://dev.to/gemmaro/bundler-quiz-3fkh</guid>
      <description>&lt;p&gt;(Translated from the &lt;a href="https://qiita.com/gemmaro/items/d99188cd07e59a8e9faf" rel="noopener noreferrer"&gt;Japanese article&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;This is a quiz about Ruby's Bundler!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add &lt;em&gt;8 characters&lt;/em&gt; to the following &lt;code&gt;Gemfile&lt;/code&gt; so that &lt;code&gt;bundle install&lt;/code&gt; fails (with non-zero exit code) for the second time or later.&lt;/p&gt;


&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;"https://rubygems.org"&lt;/span&gt;
&lt;span class="n"&gt;gemspec&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bundler is a fairly recent version (approximately version 3 or later).&lt;/li&gt;
&lt;li&gt;The first invocation succeeds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you find the answer (on your own), please send me a direct message on &lt;a href="https://ruby.social/@gemmaro" rel="noopener noreferrer"&gt;ruby.social&lt;/a&gt; or email, etc.!&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrong Answers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An invalid URL like &lt;code&gt;https://rubygems.org12345678&lt;/code&gt;: It doesn't fail since Bundler doesn't refer to the URL.&lt;/li&gt;
&lt;li&gt;An invalid URL and gems: It fails on the first run.  It must fail only on the second or later runs.&lt;/li&gt;
&lt;li&gt;Something like this: It exeeds 8 characters.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;"https://rubygems.org"&lt;/span&gt;
  &lt;span class="n"&gt;gemspec&lt;/span&gt;
  &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;file?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Gemfile.lock"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="k"&gt;raise&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;Copyright (C) 2026 gemmaro&lt;/p&gt;

&lt;p&gt;Copying and distribution of this file, with or without modification,&lt;br&gt;
are permitted in any medium without royalty provided the copyright&lt;br&gt;
notice and this notice are preserved.  This file is offered as-is,&lt;br&gt;
without any warranty.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>bundler</category>
      <category>quiz</category>
      <category>gemfile</category>
    </item>
    <item>
      <title>Easy Gmail setup with Gnus and smtpmail via OAuth2</title>
      <dc:creator>gemmaro</dc:creator>
      <pubDate>Sat, 25 Jul 2026 19:28:05 +0000</pubDate>
      <link>https://dev.to/gemmaro/easy-gmail-setup-with-gnus-and-smtpmail-via-oauth2-3ale</link>
      <guid>https://dev.to/gemmaro/easy-gmail-setup-with-gnus-and-smtpmail-via-oauth2-3ale</guid>
      <description>&lt;p&gt;(This is a manual paraphrase of the &lt;a href="https://qiita.com/gemmaro/items/06e5e9caf9449357a2b4" rel="noopener noreferrer"&gt;Japanese article&lt;/a&gt;.  It might not be fluent English; sorry in advance.)&lt;/p&gt;

&lt;p&gt;This article explains how to send and receive email on Emacs.  Particularly, we will use &lt;em&gt;Gnus&lt;/em&gt; for receiving, &lt;em&gt;smtpmail&lt;/em&gt; for sending, &lt;em&gt;Gmail&lt;/em&gt; for an email service, and &lt;em&gt;OAuth2&lt;/em&gt; for authentication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outline
&lt;/h2&gt;

&lt;p&gt;Files: Emacs initialization file (e.g. &lt;code&gt;~/.emacs.d/init.el&lt;/code&gt;) and auth-source file (e.g. &lt;code&gt;~/.authinfo&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Emacs: Install &lt;a href="https://elpa.gnu.org/packages/auth-source-xoauth2-plugin.html" rel="noopener noreferrer"&gt;&lt;code&gt;auth-source-xoauth2-plugin&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Emacs: Set Customize variables and edit authinfo.&lt;/li&gt;
&lt;li&gt;Emacs: Restart Emacs and launch Gnus.  A prompt appears in the minibuffer.
It also opens a confirmation page in your browser.&lt;/li&gt;
&lt;li&gt;Browser: Press Continue.  It looks like an error page, but this is expected.&lt;/li&gt;
&lt;li&gt;Browser: Copy &lt;code&gt;code=&amp;lt;CODE&amp;gt;&lt;/code&gt; query parameter from the address bar.&lt;/li&gt;
&lt;li&gt;Emacs: Paste the code in the Emacs minibuffer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Customize variables to set.  Please replace &lt;code&gt;&amp;lt;NAME&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight common_lisp"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;auth-source-xoauth2-plugin-mode&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;gnus-secondary-select-methods&lt;/span&gt;
 &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;nnimap&lt;/span&gt; &lt;span class="s"&gt;"imap.gmail.com"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;nnimap-user&lt;/span&gt; &lt;span class="s"&gt;"&amp;lt;NAME&amp;gt;@gmail.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;nnimap-server-port&lt;/span&gt; &lt;span class="s"&gt;"imaps"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;nnimap-stream&lt;/span&gt; &lt;span class="nv"&gt;tls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
           &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;nnir-search-engine&lt;/span&gt; &lt;span class="nv"&gt;imap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;nnimap-authenticator&lt;/span&gt; &lt;span class="nv"&gt;xoauth2&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;message-send-mail-function&lt;/span&gt; &lt;span class="ss"&gt;'smtpmail-send-it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;smtpmail-smtp-server&lt;/span&gt; &lt;span class="s"&gt;"smtp.gmail.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;smtpmail-smtp-service&lt;/span&gt; &lt;span class="s"&gt;"587"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;smtpmail-stream-type&lt;/span&gt; &lt;span class="ss"&gt;'starttls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;;; I recommend not to set browse-url-browser-function to eww,&lt;/span&gt;
&lt;span class="c1"&gt;;; and to keep smtpmail-smtp-user as default.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example &lt;code&gt;~/.authinfo&lt;/code&gt;.  Please replace &lt;code&gt;&amp;lt;NAME&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;machine imap.gmail.com login &amp;lt;NAME&amp;gt;@gmail.com port imaps auth xoauth2 auth-source-xoauth2-predefined-service google
machine smtp.gmail.com login &amp;lt;NAME&amp;gt;@gmail.com port 587 auth xoauth2 auth-source-xoauth2-predefined-service google
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all!&lt;/p&gt;

&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;OAuth2&lt;/strong&gt;&lt;br&gt;
Gmail &lt;a href="https://support.google.com/mail/answer/185833?hl=ja" rel="noopener noreferrer"&gt;still support&lt;/a&gt; username/password authentication.  So you can also configure authinfo as follows, though it is not OAuth2.  Please replace &lt;code&gt;&amp;lt;NAME&amp;gt;&lt;/code&gt; and &lt;code&gt;[...]&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;machine smtp.gmail.com login &amp;lt;NAME&amp;gt;@gmail.com password [...] port 587
machine imap.gmail.com login &amp;lt;NAME&amp;gt;@gmail.com password [...] port 993
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;auth-source file&lt;/strong&gt;&lt;br&gt;
If you set up PGP, you can also use an encrypted &lt;code&gt;~/.authinfo.gpg&lt;/code&gt; file.  See also &lt;code&gt;auth-sources&lt;/code&gt; Customize variable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;browse-url-browser-function&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
EWW is a great web browser, but here we don't use EWW because otherwise it won't automatically open a web browser (like Firefox) which supports JavaScript, so you have to copy the URL manually from the minibuffer.  It can be also problematic since EWW buffer might collide with Gnus buffers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;smtpmail-smtp-user&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
auth-source-xoauth2-plugin package internally handles this variable, so leaving this variable unset should cause fewer problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to send email?&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;C-x m&lt;/code&gt; (&lt;code&gt;M-x compose-mail&lt;/code&gt;) to open a buffer with message major mode.  Fill in the message and &lt;code&gt;C-c C-c&lt;/code&gt; (&lt;code&gt;M-x message-send-and-exit&lt;/code&gt;) to send the email.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;auth-source: Info "(auth) Top"&lt;/li&gt;
&lt;li&gt;smtpmail: Info "(smtpmail) Top" and "(smtpmail) Authentication"&lt;/li&gt;
&lt;li&gt;Gnus: Info "(gnus) Top"
and "(gnus) Customizing the IMAP Connection" (&lt;code&gt;nnimap-authenticator&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/manphiz/auth-source-xoauth2-plugin/-/blob/8f7725ef7fce48a548f997aceebfdebcf1b4d214/docs/oauth2-initial-set-up.org" rel="noopener noreferrer"&gt;Initial set up using OAuth2 and auth-source-xoauth2-plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;Copyright (C) 2026 gemmaro&lt;/p&gt;

&lt;p&gt;Copying and distribution of this file, with or without modification,&lt;br&gt;
are permitted in any medium without royalty provided the copyright&lt;br&gt;
notice and this notice are preserved.  This file is offered as-is,&lt;br&gt;
without any warranty.&lt;/p&gt;

</description>
      <category>emacs</category>
      <category>gmail</category>
      <category>gnus</category>
      <category>oauth</category>
    </item>
  </channel>
</rss>
