<?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: Zoe</title>
    <description>The latest articles on DEV Community by Zoe (@zperk13).</description>
    <link>https://dev.to/zperk13</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%2F688618%2F9c96b597-d6cb-4c95-925c-0a19f308ef52.jpeg</url>
      <title>DEV Community: Zoe</title>
      <link>https://dev.to/zperk13</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zperk13"/>
    <language>en</language>
    <item>
      <title>Figuring out how Rust's SemVer works</title>
      <dc:creator>Zoe</dc:creator>
      <pubDate>Fri, 25 Nov 2022 03:48:11 +0000</pubDate>
      <link>https://dev.to/zperk13/figuring-out-how-rusts-semver-works-2k33</link>
      <guid>https://dev.to/zperk13/figuring-out-how-rusts-semver-works-2k33</guid>
      <description>&lt;p&gt;I was wondering how Rust's SemVer works, so I ran some experiments. For those who don't know, SemVer is what Cargo uses to decide what version of a depenecy it should use, because it might not be excactly what you specified.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://doc.rust-lang.org/cargo/reference/resolver.html" rel="noopener noreferrer"&gt;doc.rust-lang.org/cargo/reference/resolver.html&lt;/a&gt; does a good job explaning how it works, but I wanted to run some experiments to help wrap my head around it. Here are the results:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cargo b&lt;/code&gt; is the same as &lt;code&gt;cargo build&lt;/code&gt;, which I'm just running so Cargo will download the depencies.&lt;/p&gt;

&lt;p&gt;Rust Analyzer is never running, it might start downloading stuff before I'm ready.&lt;/p&gt;

&lt;p&gt;No Cargo.lock&lt;br&gt;
Latest serde_json version is v1.0.89&lt;br&gt;
Setting Cargo.toml to depend on &lt;code&gt;serde_json = "1.0.0"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;cargo b&lt;/code&gt;&lt;br&gt;
serde_json v1.0.89 is downloaded&lt;/p&gt;

&lt;p&gt;Deleted Cargo.lock&lt;br&gt;
Latest serde_json version is v1.0.89&lt;br&gt;
Setting Cargo.toml to depend on &lt;code&gt;serde_json = "1.0.90"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;cargo b&lt;/code&gt;&lt;br&gt;
error: failed to select a version for the requirement &lt;code&gt;serde_json = "^1.0.90"&lt;/code&gt;&lt;br&gt;
No Cargo.lock file generated&lt;/p&gt;

&lt;p&gt;No Cargo.lock file&lt;br&gt;
Latest serde_json version is v1.0.89&lt;br&gt;
Setting Cargo.toml to depend on &lt;code&gt;serde_json = "0./*"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;cargo b&lt;/code&gt;&lt;br&gt;
serde_json v0.9.10 is downloaded&lt;/p&gt;

&lt;p&gt;Deleted Cargo.lock&lt;br&gt;
Latest serde_json version is v1.0.89&lt;br&gt;
Setting Cargo.toml to depend on &lt;code&gt;serde_json = "0.0./*"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;cargo b&lt;/code&gt;&lt;br&gt;
error: failed to select a version for the requirement &lt;code&gt;serde_json = "0.0./*"&lt;/code&gt;&lt;br&gt;
No Cargo.lock file generated&lt;/p&gt;

&lt;p&gt;No Cargo.lock file&lt;br&gt;
Latest serde_json version is v1.0.89&lt;br&gt;
Setting Cargo.toml to depend on &lt;code&gt;serde_json = "0./*./*"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;cargo b&lt;/code&gt;&lt;br&gt;
serde_json v0.9.10 is downloaded&lt;/p&gt;

&lt;p&gt;Deleted Cargo.lock&lt;br&gt;
Removed dependency in Cargo.toml&lt;br&gt;
Latest rand version is v0.8.5&lt;br&gt;
Setting Cargo.toml to depend on &lt;code&gt;rand = "0.8.0"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;cargo b&lt;/code&gt;&lt;br&gt;
rand v0.8.5 is downloaded&lt;/p&gt;

&lt;p&gt;Deleted Cargo.lock&lt;br&gt;
Removed dependency in Cargo.toml&lt;br&gt;
Latest bitflags version is v1.3.2&lt;br&gt;
Setting Cargo.toml to depend on &lt;code&gt;bitflags = "1.0.0"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;cargo b&lt;/code&gt;&lt;br&gt;
bitflags v1.3.2 is downloaded&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Always specify versions with all 3 numbers.&lt;br&gt;
The latest version that is on the same MAJOR version will be downloaded.&lt;br&gt;
In versions &amp;gt;= 1.0.0, with x.y.z, x is the major version, y and z are minor versions.&lt;br&gt;
In versions  &amp;lt; 1.0.0, with 0.y.z, y is the major version, z is the minor version.&lt;br&gt;
According to the docs, in 0.0.z, z is the major version.&lt;/p&gt;

&lt;p&gt;This is fine because minor version changes shouldn't break anything if the crate is SemVer compliant, and here's a situation where this flexibility works out:&lt;/p&gt;

&lt;p&gt;A depends on B v1.0.0&lt;br&gt;
A depends on C v1.0.0&lt;br&gt;
C depends on B v1.1.0&lt;br&gt;
The latest version of B is v1.1.1&lt;br&gt;
The latest version of C is v1.0.0&lt;/p&gt;

&lt;p&gt;When A is built, it will use B v1.1.1, and C 1.0.0, which will use B v1.1.1, there won't be a situation where there are two versions of the same library.&lt;/p&gt;

&lt;p&gt;This also works the other way around, with A having a newer version of B than C, C will upgrade its B.&lt;/p&gt;

&lt;p&gt;Multiple versions of the same library will exist if, for instance:&lt;br&gt;
A depends on B v1.0.0&lt;br&gt;
A depends on C v1.0.0&lt;br&gt;
C depends on B v2.0.0&lt;/p&gt;

&lt;p&gt;In this case, A will have to compile two separate versions of B, but that's ok because it means that even when B is on version 999.999.999 and the library structure is completely different, the not updated C will still compile, using the latest version of C v2./&lt;em&gt;./&lt;/em&gt;, getting any updates that happened that didn't qualify for a major update, which can include security patches and optimizations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Major vs Minor update
&lt;/h2&gt;

&lt;p&gt;A major update is something that will cause code using a previous version to break, such as changing the signature of a public function.&lt;/p&gt;

&lt;p&gt;A minor update is something that will NOT cause code using a previous version to break, such as generalizing a function to use generics, and the new generics support the original type.&lt;/p&gt;

&lt;p&gt;You can read more about what is a minor or major change at &lt;a href="https://doc.rust-lang.org/cargo/reference/semver.html" rel="noopener noreferrer"&gt;doc.rust-lang.org/cargo/reference/semver.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
    </item>
    <item>
      <title>How to send texts in any programming language for free</title>
      <dc:creator>Zoe</dc:creator>
      <pubDate>Wed, 18 Aug 2021 03:45:16 +0000</pubDate>
      <link>https://dev.to/zperk13/how-to-send-texts-in-any-programming-language-for-free-3593</link>
      <guid>https://dev.to/zperk13/how-to-send-texts-in-any-programming-language-for-free-3593</guid>
      <description>&lt;h2&gt;
  
  
  UPDATE June 16, 2025:
&lt;/h2&gt;

&lt;p&gt;Wow it's been a long time since I wrote this. All the information below is still accurate, and I'll do my best to update it when it's not, but even though it's accurate, some services, such as T-Mobile, can be a bit hit or miss on whether they let the text go through. You can follow the instructions in this post if you want to receive texts specifically, but if you just want notifications on your phone, I personally recommend &lt;a href="https://ntfy.sh/" rel="noopener noreferrer"&gt;https://ntfy.sh/&lt;/a&gt;. I've been self-hosting it (though you don't have to self-host it if you don't want to) for months and have gotten every notification I sent very quickly. If you have any questions about my experience with it, feel free to leave a comment.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is a short post about a not often talked about feature in mobile phone service providers.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;DISCLAIMER: This will not cover receiving texts&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You might've wanted to automate sending a text. Well it's actually much simpler than you might think to do that. All you need to do is send an email (this post will not cover how to do that, there are plenty of tutorials about how to do that in pretty much every language). T-Mobile, Sprint, Metro PCS, Cricket, and Republic Wireless have an email domain that you can use to send texts via email. The email you send to is &lt;code&gt;number@mobile_email_domain&lt;/code&gt;. Here are the domains for the listed providers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;T-Mobile: &lt;code&gt;number@tmomail.net&lt;/code&gt; (Note: As of April 2025, I have been having issues with them. People get the texts sometimes, but not every time)&lt;/li&gt;
&lt;li&gt;Verizon: &lt;code&gt;number@vtext.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Metro PCS: &lt;code&gt;number@mymetropcs.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cricket: &lt;code&gt;number@sms.cricketwireless.net&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Republic Wireless: &lt;code&gt;number@text.republicwireless.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;del&gt;AT&amp;amp;T: &lt;code&gt;number@txt.att.net&lt;/code&gt;&lt;/del&gt; Update 4/4/2025: AT&amp;amp;T will stop supporting email-to-text messages on 6/17/2025&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The number should not have any dashes or other symbols, just numbers (eg: &lt;code&gt;7185550001@tmomail.net&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;A few final notes&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If you know of another domain for another mobile phone service provider, feel free to leave it in the comments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure you're properly encoding the subject and not just putting 2 newlines, like some tutorials suggest. This will work fine for some providers, and not for others. I spent way too long trying to figure out why I stopped getting texts from my program after T-Mobile changed something in their system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I marked the emails with &lt;code&gt;inline code blocks&lt;/code&gt; so they wouldn't get detected as an actual email and get highlighted&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you want to also receive texts, Twilio might be what you're looking for, &lt;del&gt;but I have no experience with it&lt;/del&gt;. Update: 4/4/2025: I have experience with them now. They do not let just anyone use their service. They have to approve you. They didn't approve me. If you're not a business, I doubt they'll let you in.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tutorial</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
