aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPinapelz <yukais@pinapelz.com>2024-10-24 01:11:49 -0700
committerPinapelz <yukais@pinapelz.com>2024-10-24 01:11:52 -0700
commitd704be19afb2e4701a1947a28ef4970d0b3acfa3 (patch)
tree5366be4c472ef3f7a04dba5a5cf1223a6463c1ad
parent96392c73bd5c7ba9f66437205ebcf6c3a1553695 (diff)
post: the oshimark problem
-rw-r--r--package.json1
-rw-r--r--pnpm-lock.yaml17
-rw-r--r--src/components/Latex.astro18
-rw-r--r--src/content/blog/the-oshimark-problem.mdx89
4 files changed, 125 insertions, 0 deletions
diff --git a/package.json b/package.json
index 2b3db54..499d084 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
"@astrojs/rss": "^4.0.9",
"@astrojs/sitemap": "^3.2.1",
"astro": "^4.16.5",
+ "katex": "^0.16.11",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"sharp": "^0.33.5"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2fd6127..dc1e36d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -23,6 +23,9 @@ importers:
astro:
specifier: ^4.16.5
version: 4.16.5(rollup@4.24.0)(typescript@5.5.4)
+ katex:
+ specifier: ^0.16.11
+ version: 0.16.11
react:
specifier: ^18.3.1
version: 18.3.1
@@ -800,6 +803,10 @@ packages:
comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+ commander@8.3.0:
+ resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+ engines: {node: '>= 12'}
+
common-ancestor-path@1.0.1:
resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==}
@@ -1136,6 +1143,10 @@ packages:
engines: {node: '>=6'}
hasBin: true
+ katex@0.16.11:
+ resolution: {integrity: sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==}
+ hasBin: true
+
kind-of@6.0.3:
resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
engines: {node: '>=0.10.0'}
@@ -2637,6 +2648,8 @@ snapshots:
comma-separated-tokens@2.0.3: {}
+ commander@8.3.0: {}
+
common-ancestor-path@1.0.1: {}
convert-source-map@2.0.0: {}
@@ -3019,6 +3032,10 @@ snapshots:
json5@2.2.3: {}
+ katex@0.16.11:
+ dependencies:
+ commander: 8.3.0
+
kind-of@6.0.3: {}
kleur@3.0.3: {}
diff --git a/src/components/Latex.astro b/src/components/Latex.astro
new file mode 100644
index 0000000..f335189
--- /dev/null
+++ b/src/components/Latex.astro
@@ -0,0 +1,18 @@
+---
+import katex from 'katex';
+
+const { formula = '' } = Astro.props;
+const html = katex.renderToString(formula, {throwOnError: false});
+---
+
+<div class="text-center">
+ <span set:html={html} class="" />
+</div>
+
+<link
+ rel="stylesheet"
+ href="https://cdn.jsdelivr.net/npm/katex@0.15.1/dist/katex.css"
+ integrity="sha384-WsHMgfkABRyG494OmuiNmkAOk8nhO1qE+Y6wns6v+EoNoTNxrWxYpl5ZYWFOLPCM"
+ crossorigin="anonymous"
+/>
+
diff --git a/src/content/blog/the-oshimark-problem.mdx b/src/content/blog/the-oshimark-problem.mdx
new file mode 100644
index 0000000..873207b
--- /dev/null
+++ b/src/content/blog/the-oshimark-problem.mdx
@@ -0,0 +1,89 @@
+---
+title: 'The Year 11779 Oshi Mark Problem'
+description: 'When will we run out of 2-emoji oshi marks?'
+pubDate: 'Oct 24 2024'
+heroImage: 'https://files.catbox.moe/8gr7k2.jpg'
+---
+import Latex from '../../components/Latex.astro';
+
+(This is a problem that lives rent-free in my head)
+
+The oshi mark is are emoji(s) that VTuber fans will often put in their social media usernames to represent their support for a particular VTuber. These are typically chosen during or before a VTuber's debut stream, you'll often see many VTubers changing their usernames to include them too!
+
+Seems like a good idea, until you realize that there is a finite number of emojis...
+
+## Definition
+As of writing this there are 3790 emojis in the Unicode standard. I know that platforms like X have may have their own standards (Twemoji), but for the sake of this problem let's assume that we're using the Unicode standard.
+
+This also includes skin-tones, which may or may not be appropriate to use in this context as well. However, this is just all theory anyways so let's include them and take this as a best-case scenario.
+
+## Problem
+Ideally, VTubers all want a unique oshi mark to represent them. Of course, in the early days of VTubing a single emoji would be enough to represent a VTuber. However, as the industry grows and more VTubers debut, the chances of a VTuber getting a unique oshi mark decreases...
+
+So the fix is intuitive, let's just use 2 emojis for each new VTuber. This is fine, in fact its the solution we're on right now, but how long until we run out of 2-emoji oshi marks?
+
+
+<Latex formula="\binom{3790}{2} = \frac{3790 \times 3789}{2} = 7,171,755" />
+We then assume that all 1-emoji oshi marks are taken, so add that to the total number of 2-emoji oshi marks and we end up with 7,175,545 VTubers.
+
+### Predicting Growth
+We can predict VTuber growth in a fairly crude manner using Holodex. I wrote a Java wrapper for the Holodex API a while back, so I was easily able to spin something up quick.
+```java
+import com.pinapelz.Holodex;
+import com.pinapelz.HolodexException;
+import com.pinapelz.datatypes.Video;
+import com.pinapelz.query.VideoQueryBuilder;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class App {
+ public static void main(String[] args) {
+ try {
+ Holodex holodex = new Holodex("API_KEY");
+ VideoQueryBuilder query = new VideoQueryBuilder().setTopic("Debut_Stream").setLimit(100);
+ List<Video> videos = holodex.getVideos(query);
+
+ Map<LocalDate, Integer> dateCountMap = new HashMap<>();
+ for (Video video : videos) {
+ System.out.println(video.title);
+ LocalDate date;
+ try {
+ date = LocalDate.parse(video.published_at, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+ } catch (NullPointerException e) {
+ continue;
+ }
+ dateCountMap.put(date, dateCountMap.getOrDefault(date, 0) + 1);
+ }
+
+ double average = dateCountMap.values().stream().mapToInt(Integer::intValue).average().orElse(0.0);
+ System.out.println("Average number of debut streams per day: " + average);
+
+ } catch (HolodexException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+}
+```
+
+The above code takes the first 100 streams that are tagged as a "Debut_Stream" and then finds the average number of debut streams per day.
+
+Running the code outputs:
+```
+Average number of debut streams per day: 1.9565217391304348
+```
+
+Let's just call it at 2 new debut streams per day roughly. This means that we can expect 730 new VTubers per year.
+
+There are some numbers online that suggest that there are around [https://blog.gamesight.io/vtuber/](49 500 VTubers as of June 2023), so let's
+estimate that there are probably around 52 000 VTubers by the end of 2024.
+
+So that means 7,125,545 unique 2-emoji oshi marks remain assuming all VTubers have an oshi mark:
+
+Using the growth rate previously calculated: This means that in 9754 years, 4 months, and 2 days we will run out of 2-emoji oshi marks... (oh no!)
+
+### Conclusion
+On February 26th, 11779 we will run out of 2-emoji oshi marks, and will need to start using 3-emojis instead. So sleep well at night knowing that we have a long time before we run out of 2-emoji oshi marks. \ No newline at end of file
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage