Mudkip Mud Sport

Mudkip's Mud Sport Journal

Home Projects

As my family moved to a new place, I have been rearranging our network and computer equipment.

The first new hardware to arrive at my home in 2023 is an iKOOLCORE R1. It is a tiny x86 computer with four 2.5GbE NICs pre-installed with Proxmox VE and OpenWrt. I named this device “rotom” and use it as a router. I also set up a Debian VM called “rotom-core” as a “side gateway.” This addition has vastly improved my home network experience, in terms of both responsiveness and functionality.

I have tinkered with a few configurations of the open-source router system. One benefit of OpenWrt is its ability to configure IPv6 firewalls. I wanted to open a specific port on rotom-core to allow me to connect back to my home network while blocking all other incoming connections. However, most home networks have dynamic IPv6 address prefixes, and only the suffix is static. Fortunately, this can be easily set up in OpenWrt:

1
2
3
4
5
6
7
8
9
config rule
option target 'ACCEPT'
option src 'wan'
option dest 'lan'
option name '<rule name>'
option family 'ipv6'
option proto 'tcp'
option dest_ip '::<IPv6 address suffix>/::ffff:ffff:ffff:ffff'
option dest_port '<Port I want to open>'

I wanted certain devices on my home network to use rotom-core as the gateway; however, some devices (like Sonos) do not allow for configuring static IP and gateway. To address this, I added an entry in the DHCP settings to pin the DHCP response to these devices.

1
2
3
4
5
6
7
8
9
config host
option name 'SonosOne'
option dns '1'
option mac '<mac address>'
option ip '192.168.1.31'
option tag 'tag1'

config tag 'tag1'
option dhcp_option '3,192.168.1.2 6,192.168.1.2'

One issue I faced previously was the inability to change or disable the IPv6 DNS server on Android, rendering the DNS server settings useless in a dual-stack network environment. OpenWrt allows me to disable the announcement of the IPv6 DNS server address.

1
2
3
config dhcp 'lan'
...
option dns_service '0'

In rotom-core, besides the critical services I prefer not to mention, there are also containers running frpc and cloudflared to enable connection to my home network from IPv4-only networks. Additionally, there is cloudflare-ddns to update the AAAA record in DNS.

After receiving this new tiny PC, I benchmarked it using p7zip and compared it to my Frost Canyon NUC (“comet”, named after Comet Lake). Surprisingly, it outperformed the i7-10710U by 200% in both single-core and multi-core tests, which indicated an issue with the NUC.

Two possibilities came to my mind. I thought it could be related to how VMware ESXi handles turbo boost, or the cooling system in the NUC had melted down. After turning off the NUC and waiting for half an hour, the CPU speed greatly improved, but it soon hit rock bottom. Thus, it must be the cooling.

There are various videos suggesting that the thermal silicone between the CPU and cooler needs to be replaced. I purchased a small Honeywell phase change pad and prepared to fix the NUC. However, I made a mistake at the first step; I broke a screw on the motherboard, and it was impossible to pull out.

I eventually gave up and only cleaned the air outlet of the cooler. Surprisingly, it worked. Now, the NUC is much faster and makes significantly less noise than before. I regret not noticing this problem earlier.

A k3s worker node VM in comet has been replaced by a Fedora Workstation VM named “comet-core”, since the services in the home Kubernetes cluster don’t require too much memory. I want to experiment with different Linux distributions, and the VM allows me to work on tasks that the Raspberry Pi can’t handle.

I also migrated the hypervisor of comet from VMware ESXi to Proxmox VE. Initially, I wanted to try GVT-g Split Passthrough to enable both the Windows VM and the Fedora VM to access the iGPU. However, the split performance was not sufficient to provide a smooth RDP experience. Nevertheless, I appreciate Proxmox VE’s flexibility and LXC features.

52Poké

52Poké Wiki has been upgraded to MediaWiki 1.39, featuring numerous improvements under the hood. I am a fan of the new Vector-2022 skin[1] (with the max-width option disabled). It is clear, vibrant, responsive, and fully-fledged.

The Kubernetes cluster of 52Poké is now synchronized with this git repository via GitOps, using FluxCD. Additionally, the database server has been moved into the cluster, thanks to NVMe Block Storage. All nodes have been upgraded to 4 CPU core 8GB memory instances, and the number of nodes has been reduced (currently only 2), helping to decrease the total cost.

One issue that occasionally stresses the 52Poké Wiki is when editing a template used by hundreds of pages. MediaWiki attempts to purge the cache of every page using this template. When hundreds of pages load without cache, the MediaWiki instance may freeze. I am developing a new web server to address this issue. It will implement a persistent cache layer, inspired by the concept of Cloudflare Cache Reserve. This approach allows the cache purging process to work in an asynchronous queue, updating the persistent cache instead of deleting it. Ideally, this will enable the backend MediaWiki instance to handle much fewer requests while ensuring that page edits are updated for all visitors as quickly as possible.

Since April 2023, Linode (now Akamai Connected Cloud) has increased its computing prices by 20%. This has prompted me to consider how to maintain the long-term sustainability of 52Poké Wiki. Up until now, I have been covering all the monthly bills from Linode, but there is always a risk of facing financial difficulties at some point in the coming years. I hope that 52Poké Wiki can eventually be partly supported by its community and visitors; however, I have not yet found a viable solution to achieve this.

Moe Memos

Initially, Moe Memos was a niche open-source project developed to meet my personal needs and maintain my hands-on experience with app development. However, it has since become a much larger success. As of now, over 3,500 users have installed the app from App Store and Google Play (excluding GitHub and F-Droid downloads). It has evolved into a feature-rich app for Memos while maintaining its minimalistic design.

I still have many ideas for this charming project, ranging from implementing major features such as local storage (hoping for a revamp of Core Data this June) and multi-server/user support, to refactoring the project structure and adding a tipping feature to motivate me to continue working on it and explore more ideas for the self-hosted community.

AI Experiments

The past few months have undoubtedly been an AI Summer, with news related to AI projects such as ChatGPT, New Bing, Office 365 Copilots, Stable Diffusion, and Midjourney flooding my mind every few hours.

I initially tried to resist the hype, but I eventually succumbed after the release of the GPT-3.5-Turbo API and GPT-4 model. I experimented with various things involving LLMs and AI art generators. I read a letter that Yui from Sword Art Online sent to Asuna and Kirito and asked her what everyday life is like as an AI in the VRMMO world. I interviewed a Pokémon Trainer in Hoenn about her epic journey. I asked ChatGPT to write the first commit of the web server I mentioned earlier. I even allowed it to be a Pikachu with no knowledge of human language, experiencing the atmosphere of Snowpoint City and battling a Glalie. In addition, I have written stories such as “Takami Chika Meets Her Real World Counterpart Inami Anju” and “The Birth of Amane Suzuha in the Steins;Gate Timeline”. I also used Midjourney to design alternative icons for Moe Memos.

Another entertaining project stemmed from an idea inspired by Persona 5. I asked ChatGPT, “You are the main character of Persona 5. You found a palace belonging to Donald Trump. What does Donald Trump’s palace look like, and how will your team obtain the treasure within it?” The response was both hilarious and reasonable. I tried a few other names, ranging from real-world villains to absurdities like “MacBook Pro with Butterfly Keyboard.” Eventually, I created a Persona 5 Palace Generator in about an hour with ChatGPT’s help. I have more intriguing ideas stemming from this, but I prefer to keep them secret for now.

I am still uncertain about how LLMs, generative AI, and future AGI will change our world, or whether the change will be overwhelmingly positive. I remain concerned that widespread poverty may result from these advances. I still prefer to enjoy technologies I can reason with, predict, and reproduce variants of. I am annoyed by the racial/regional discrimination that makes it difficult to use and pay for OpenAI and other services. I hope humanity can find and imagine a path to a better future.


  1. I understand that there are many controversies surrounding the Vector-2022 skin in the Wikipedia community, and perhaps within 52Poké/Encyclopaediae Pokémonis as well. ↩︎

(I’m a reporter at TV Mauville and I interviewed a young trainer named Luna from Slateport City on a website named ChatGPT.)

Me: This is Pokémon world. You are a 10 years old girl from Slateport City in Hoenn. Which is your first Pokémon and where will you go first?

Luna: In the Pokémon world, as a 10-year-old girl from Slateport City in the Hoenn region, my first Pokémon would likely be one of the three Hoenn starters: Treecko, Torchic, or Mudkip. Let’s say I choose Mudkip, a Water-type Pokémon, as my starter due to its versatile abilities and cute appearance.

As a new trainer, I would likely head to my first destination, the city of Rustboro, where I would challenge Roxanne, the Gym Leader who specializes in Rock-type Pokémon. To get there, I would need to travel north through Route 110, passing through Mauville City and then continuing west through Route 117 and Verdanturf Town. After reaching Rustboro City, I would train my Mudkip, ensuring it is strong enough to take on Roxanne’s Rock-type Pokémon and earn my first gym badge.

Me: Between Verdanturf Town and Rustboro City there is Rusturf Tunnel, but the tunnel is currently blocked.

Luna: You’re right. The Rusturf Tunnel is currently blocked, so I won’t be able to take that route to reach Rustboro City. Instead, I’ll take an alternative path.

After leaving Slateport City, I’ll travel north to Mauville City via Route 110. From Mauville City, I’ll head west on Route 111 until I reach the desert area. Since I don’t have the Go-Goggles yet to navigate the desert, I’ll continue north through the Fiery Path, a cave that connects Route 111 to Route 112.

Once I reach Route 112, I’ll make my way up to Route 113, which is covered in volcanic ash. Following Route 113 west, I’ll arrive in Fallarbor Town. From Fallarbor Town, I’ll head south on Route 114, and then take Route 115 to the east until I reach Rustboro City.

Although it’s a longer and more challenging journey, it will provide my Mudkip and me with valuable training and bonding opportunities. Once we finally arrive in Rustboro City, we’ll be well-prepared to face Roxanne and her Rock-type Pokémon in the gym battle.

Me: I think your Mudkip will be evolved during that trip :)

Luna: You’re absolutely right! During the longer journey, my Mudkip would gain valuable experience from the battles and training it goes through. Mudkip evolves into Marshtomp, its second stage, at level 16. Given the distance and the various battles along the way, there’s a good chance my Mudkip would evolve into Marshtomp before reaching Rustboro City.

Marshtomp is a Water and Ground-type Pokémon, which would give me an even greater advantage in the battle against Roxanne and her Rock-type Pokémon. With its newfound strength and typing, Marshtomp would be well-prepared to face the challenges in the Rustboro City Gym and help me earn my first gym badge on this exciting Pokémon journey.

Me: After got your first badge, where will you go?

Luna: After earning my first gym badge in Rustboro City, I would continue my Pokémon journey to collect more badges and become a stronger trainer. My next destination would be Dewford Town, where I would challenge Brawly, the Gym Leader who specializes in Fighting-type Pokémon.

To reach Dewford Town, I would need to head back to Rustboro City, then travel south along Route 116 until I reach the entrance to Rusturf Tunnel. Since I helped clear the tunnel earlier, I can now pass through it to reach Verdanturf Town. From Verdanturf Town, I would continue east on Route 117 until I return to Mauville City.

In Mauville City, I would head south to Route 110, making my way towards Slateport City. Before reaching Slateport, I would find a small port on the eastern side of Route 109. There, I could arrange a boat ride with a sailor or fisherman to take me to Dewford Town, which is located on an island to the southwest.

Once in Dewford Town, I would train my Marshtomp and any other Pokémon I’ve caught during my journey, ensuring they are prepared for the challenges in Brawly’s gym. After defeating Brawly and earning the Knuckle Badge, I would continue my adventure across the Hoenn region, seeking out new challenges and opportunities to grow as a Pokémon trainer.

Me: By the way, what about your other Pokémon?

Luna: As I progress on my journey through the Hoenn region, I would catch and train various Pokémon to build a well-rounded and diverse team. Here are some examples of Pokémon I might add to my team along the way:

  1. Taillow: A Normal/Flying-type Pokémon, Taillow could be caught early in my journey, providing me with a Flying-type Pokémon to help against Grass and Bug-type opponents.
  2. Aron: A Steel/Rock-type Pokémon, Aron can be found in the Granite Cave near Dewford Town. Its sturdy defenses and unique typing would make it a valuable addition to my team.
  3. Shroomish: A Grass-type Pokémon that later evolves into the Grass/Fighting-type Breloom, Shroomish can be caught in the Petalburg Woods. Breloom’s powerful Fighting-type moves and Grass-type coverage make it a strong addition to my team.
  4. Electrike: Found on Route 110, this Electric-type Pokémon eventually evolves into Manectric. Electrike would give my team an advantage against Water and Flying-type opponents.
  5. Ralts: A Psychic/Fairy-type Pokémon when it evolves into Gardevoir, Ralts can be caught on Route 102. Gardevoir’s Psychic and Fairy-type moves provide coverage against Fighting, Dragon, and Dark-type Pokémon.

With a diverse team like this, I would be prepared to face a variety of opponents and challenges in the Hoenn region. Of course, I would also be open to catching other Pokémon that I encounter on my journey and adjusting my team as needed to overcome the challenges that lie ahead.

Me: Wow! After collecting a few badges and travel through Hoenn, you met a boy on Route 119. It’s raining and you two only have one umbrella.

Luna: As I continue my journey through the Hoenn region and make my way along Route 119, the rain starts to pour down heavily. Amidst the downpour, I meet a boy who is also traveling and training Pokémon. With the heavy rain making it difficult for both of us to continue, we realize we only have one umbrella to share.

We decide to walk together under the umbrella, taking turns holding it as we make our way through the rain-soaked Route 119. We exchange stories about our respective Pokémon journeys, sharing our experiences, the challenges we’ve faced, and the badges we’ve collected so far. We also talk about our favorite Pokémon and how we’ve grown as trainers.

As we walk together, we discover that we have much in common and enjoy each other’s company. We decide to battle each other to test our skills and help our Pokémon grow stronger. After the friendly battle, we exchange contact information on our PokéNavs so that we can keep in touch and share our progress throughout our Hoenn adventure.

As the rain begins to let up, we part ways, each continuing our individual journeys to become better Pokémon trainers. We promise to stay in touch and perhaps meet again someday, perhaps even becoming rivals who inspire each other to reach greater heights in our Pokémon training endeavors.

Me: By the way. When battling Norman. He said he has a child like you. What is the name of Norman’s child?

Luna: Norman’s child is named Brendan if the player character is female, or May if the player character is male. In this case, since I am playing as a 10-year-old girl from Slateport City in the Hoenn region, Norman’s child would be Brendan. Brendan is one of the main characters in Pokémon Ruby, Sapphire, and Emerald, and he serves as a rival and friend to the player throughout their journey.

Me: I don’t think the logic is true. By saying “player”, I think you are mentioning Professor Brich’s child from Littleroot Town and you don’t know them both (maybe you heard of their story as the saved Hoenn years ago). But anyway in this timeline Norman’s child is Brendan and Prof. Brich’s child is May.

Luna: You’re right, I apologize for the confusion in my previous response. In this timeline, as you mentioned, Norman’s child is Brendan, and Professor Birch’s child is May. As a 10-year-old girl from Slateport City, I would not be the player character from Pokémon Ruby, Sapphire, or Emerald. I might have heard of Brendan and May’s stories as they saved Hoenn years ago, but I wouldn’t personally know them both.

Thank you for the clarification, and I hope you continue to enjoy the adventures in the Pokémon world!

Me: Accidentally, you met May and Brendan in Lilycove City. They are having a wedding!

Luna: What a wonderful surprise! As I arrive in Lilycove City after collecting several gym badges and exploring the Hoenn region, I unexpectedly come across May and Brendan’s wedding. It’s heartwarming to see these two trainers, who have been friends and rivals throughout their Pokémon journey, now coming together to celebrate their love and commitment to each other.

The wedding is beautifully set up near the picturesque Lilycove Harbor, with decorations and Pokémon-themed accents adorning the area. Friends, family, and fellow trainers have gathered to witness this special moment, and it’s clear that both May and Brendan have had a positive impact on many lives throughout their adventures.

As a guest at the wedding, I have the opportunity to meet other trainers, Gym Leaders, and even members of the Elite Four who have come to celebrate the happy couple. It’s a great chance to learn from their experiences, share stories, and make new friends.

After the ceremony, there’s a reception with delicious food, music, and dancing. Pokémon are also present, playing and interacting with the guests. It’s a joyous occasion that brings together the Pokémon community in celebration of May and Brendan’s love.

The wedding serves as an inspiring reminder that friendships and bonds formed during a Pokémon journey can last a lifetime, and encourages me to continue pursuing my own adventure with dedication and passion.

Me: Now how about your Pokémon? Did your first Pokémon evolved again?

Luna: Yes, during my journey through the Hoenn region and after collecting several gym badges, my first Pokémon, Marshtomp, would have gained enough experience to evolve once more. Marshtomp evolves into its final form, Swampert, starting at level 36.

Swampert is a powerful Water/Ground-type Pokémon with high Attack and Defense stats, as well as balanced Special Attack and Special Defense. As a Swampert, my first Pokémon would have access to a wider range of moves, further enhancing its abilities in battles and against various opponents.

Swampert’s dual typing gives it a significant advantage over several types of Pokémon, including Electric-types, which would normally be super effective against Water-types. With Swampert by my side, I would be well-prepared to face the remaining Gym Leaders and Elite Four members in the Hoenn region, as well as any other challenges that might arise on my journey to become a Pokémon Master.

Me: So what about your other Pokémon in your party?

Luna: As I progress through my journey in the Hoenn region, my other Pokémon would also grow, evolve, and gain new abilities. Here’s an update on my team:

  1. Swellow: My Taillow would have evolved into Swellow, a stronger and faster Normal/Flying-type Pokémon, providing me with a reliable partner in battles and a way to use the HM move Fly to travel quickly between cities.
  2. Lairon: My Aron would have evolved into Lairon, a durable Steel/Rock-type Pokémon with increased Defense and Attack stats. Lairon would continue to be a valuable team member, especially against Normal, Flying, and Rock-type opponents.
  3. Breloom: My Shroomish would have evolved into Breloom, a powerful Grass/Fighting-type Pokémon with high Attack and access to an array of effective moves, making it a formidable opponent against Water, Rock, Ground, and Dark-type Pokémon.
  4. Manectric: Electrike would have evolved into Manectric, a strong Electric-type Pokémon with a good Special Attack stat. Manectric’s moveset would enable it to handle Water, Flying, and some Steel-type opponents.
  5. Gardevoir: My Ralts would have evolved into Kirlia and then into Gardevoir, a Psychic/Fairy-type Pokémon with impressive Special Attack and Special Defense stats. Gardevoir’s versatile moveset would be especially effective against Fighting, Dragon, and Dark-type Pokémon.

As I continue my journey, this well-rounded team would help me face various challenges, including Gym Leaders, the Elite Four, and other trainers. Additionally, I would be open to catching and training new Pokémon to further diversify my team and adapt to new challenges that may arise.

Me: After collecting 8 badges. There is an alarm from Mossdeep Space Center. A meteorite is coming!

Luna: Upon collecting all 8 gym badges in the Hoenn region, I hear an urgent alarm coming from the Mossdeep Space Center. The scientists there have detected a massive meteorite hurtling towards the region, posing a significant threat to both people and Pokémon.

As a skilled Pokémon trainer, I understand that it’s my responsibility to help protect the region and its inhabitants. I make my way to Mossdeep City as quickly as possible, seeking more information about the meteorite and finding out what I can do to help.

Upon arriving at the Space Center, I learn that the situation is dire, and the meteorite’s impact could have catastrophic consequences for the entire Hoenn region. The scientists are working tirelessly to come up with a plan to prevent the disaster, but they need assistance from capable trainers and their Pokémon.

I join forces with other trainers, including Gym Leaders, Elite Four members, and my friends from my journey, to help the Space Center’s efforts. Together, we work on a plan that involves using the combined power of our Pokémon to either divert the meteorite’s trajectory or destroy it before it reaches the Earth.

As we carry out our plan, we face various challenges and obstacles, but our determination and teamwork prove to be invaluable in overcoming them. We utilize the unique abilities of each of our Pokémon, showcasing the deep bond and trust we share with them.

In the end, through our collective effort, we manage to avert the crisis and save the Hoenn region from the impending meteorite disaster. This experience not only highlights the importance of cooperation and friendship but also reinforces the incredible bond between humans and Pokémon, showing that together, we can overcome even the most daunting challenges.

Me: I heard you also got help from a Legendary Pokémon, what is it?

Luna: Indeed, during our efforts to prevent the meteorite disaster, we received help from a Legendary Pokémon: Rayquaza. Rayquaza is a powerful Dragon/Flying-type Pokémon that resides in the ozone layer and is said to have the ability to calm the weather and protect the Earth’s atmosphere.

Recognizing the gravity of the situation and the potential catastrophe, Rayquaza heeds our call for assistance. With its immense power, Rayquaza helps us either divert the meteorite’s trajectory or destroy it, ultimately preventing the disaster from occurring.

The intervention of Rayquaza highlights the strong connection between humans, Pokémon, and the natural world. It also serves as a reminder that when we work together in harmony with these powerful creatures, we can overcome even the most formidable challenges. The experience strengthens the bond between me, my Pokémon, and the other trainers, leaving a lasting impact on our journey in the Hoenn region.

Me: Actually there is one Pokémon coming along with the meteorite. What’s its name?

Luna: My apologies for the oversight. Yes, you’re correct. Along with the meteorite, there is a Pokémon called Deoxys, a Psychic-type Pokémon known for its ability to change forms. Deoxys originally came from outer space and is said to have been created when a virus mutated after being exposed to a laser beam.

Deoxys has four different forms it can change into: Normal, Attack, Defense, and Speed Forme, each with unique stats and capabilities. It is known for its extraterrestrial origin and the crystal-like structure on its body.

Upon discovering Deoxys and realizing its connection to the meteorite, we try to communicate with it and understand its intentions. If Deoxys is found to be a threat or in need of assistance, we work together with our Pokémon and Rayquaza to address the situation, either by calming Deoxys or helping it find a new purpose on Earth.

This encounter with Deoxys adds another layer of excitement and intrigue to our adventure in the Hoenn region and reinforces the importance of understanding and cooperation between humans and Pokémon, even those from beyond our world.

Me: Finally. You challenged the Elite Four, which Pokémon is in your team and what’s their move set?

Luna: After collecting all 8 gym badges and experiencing various adventures throughout the Hoenn region, I’m finally ready to challenge the Elite Four. My team for this challenge consists of the following Pokémon with their respective movesets:

  1. Swampert (Water/Ground-type)
    • Surf
    • Earthquake
    • Ice Beam
    • Brick Break
  2. Swellow (Normal/Flying-type)
    • Aerial Ace
    • Return
    • Steel Wing
    • U-turn
  3. Aggron (Steel/Rock-type, evolved from Lairon)
    • Iron Head
    • Stone Edge
    • Earthquake
    • Dragon Tail
  4. Breloom (Grass/Fighting-type)
    • Seed Bomb
    • Sky Uppercut
    • Spore
    • Leech Seed
  5. Manectric (Electric-type)
    • Thunderbolt
    • Volt Switch
    • Flamethrower
    • Hidden Power (Ice)
  6. Gardevoir (Psychic/Fairy-type)
    • Psychic
    • Moonblast
    • Shadow Ball
    • Thunderbolt

This team has a diverse set of types and moves, providing coverage against a wide range of opponents. Each Pokémon’s moveset is designed to take advantage of their respective strengths and capabilities, while also providing options to counter various types of enemies.

With this team by my side, I am well-prepared to face the Elite Four and the Pokémon League Champion. My Pokémon and I will give our all in these challenging battles, drawing on the experiences and bonds we’ve formed throughout our journey in the Hoenn region.

Me: What’s you plan after you become a Champion?

Luna: After becoming the Champion of the Hoenn region, there are several exciting options for me to continue my journey and grow as a Pokémon Trainer:

  1. Explore the Battle Frontier: The Battle Frontier is a challenging post-game facility in the Hoenn region, where trainers can test their skills against strong opponents in various battle formats. It’s a great opportunity to fine-tune my strategies and further strengthen my bond with my Pokémon.
  2. Complete the Pokédex: As a Pokémon Trainer, one of my goals is to see and catch as many Pokémon as possible. I can continue exploring the Hoenn region and beyond, seeking out rare and elusive Pokémon to complete my Pokédex.
  3. Train and discover new Pokémon: I can search for new Pokémon species to add to my team or focus on training and evolving the ones I already have, discovering new strategies and combinations for battles.
  4. Participate in Pokémon Contests: I could try my hand at Pokémon Contests, a different aspect of the Pokémon world where trainers and their Pokémon showcase their talents in various categories, such as Beauty, Coolness, and Cuteness. This would allow me to explore new ways of bonding with my Pokémon and diversify my experiences as a trainer.
  5. Help others on their Pokémon journey: As a Champion, I can use my knowledge and experience to assist other aspiring trainers, helping them grow and overcome challenges in their own journeys.
  6. Travel to other regions: I can embark on new adventures in different regions, such as Kanto, Johto, Sinnoh, or Unova, where I can encounter new Pokémon species, battle different Gym Leaders, and earn more badges.

Ultimately, becoming the Champion is just one milestone in my ongoing Pokémon journey. With so many opportunities to learn, grow, and explore, I can continue to deepen my connection with my Pokémon and work towards becoming the best Pokémon Trainer I can be.

Me: Your parents must be so proud of you!

Luna: Thank you! My parents would definitely be proud of my achievements as a Pokémon Trainer and the hard work and dedication I’ve put into my journey. They would be happy to see the strong bonds I’ve formed with my Pokémon and the friendships I’ve made with other trainers along the way.

Throughout my adventure, I would make sure to keep in touch with my parents, sharing my experiences, challenges, and successes with them. Their support and encouragement would play a significant role in my journey, giving me the motivation to continue pushing forward and overcome obstacles.

As I grow and learn from my experiences in the Pokémon world, I would also be grateful for the values and lessons my parents have instilled in me, such as perseverance, kindness, and teamwork. These values have helped shape me as a Pokémon Trainer and guided me through the many challenges I’ve faced in the Hoenn region and beyond.

Me: You met Celebi and you traveled across time to 50 years later for a while. What will Hoenn be like in 50 years?

Luna: Traveling 50 years into the future with the help of Celebi, I find myself in a Hoenn region that has evolved and changed over the decades. While the natural beauty and essence of the region remain, there are several notable differences:

  1. Technological advancements: Hoenn has embraced new technologies, with cities and towns incorporating modern infrastructure and conveniences. Poké Ball and Pokémon storage technology have improved, and communication between trainers has become even more seamless and efficient.
  2. New Pokémon species: Over the years, new Pokémon species have been discovered in Hoenn and beyond, enriching the biodiversity of the region. Some of these new Pokémon might be the result of migration, while others could have evolved or adapted to the changing environment.
  3. Expanded facilities: The Pokémon League, Gym system, and other facilities such as the Battle Frontier have expanded and adapted to the needs of trainers. New challenges and battle formats await trainers, ensuring that the Pokémon world remains fresh and exciting for both new and experienced trainers.
  4. Environmental consciousness: As the world has grown more aware of the importance of environmental conservation, the Hoenn region has implemented various eco-friendly practices and policies to preserve its natural habitats and protect the diverse range of Pokémon that call the region home.
  5. Cultural exchange: The Hoenn region has become more interconnected with other regions, promoting cultural exchange and fostering a deeper understanding of the bonds between humans and Pokémon. Trainers from all over the world visit Hoenn, bringing their unique experiences and perspectives with them.
  6. Evolving societal values: As time has passed, the people of Hoenn have developed a stronger appreciation for the bonds between humans and Pokémon, focusing on mutual respect, understanding, and cooperation.

Despite these changes, the core spirit of the Pokémon world remains intact. Trainers continue to embark on their journeys, forming lifelong friendships with their Pokémon and pursuing their dreams of becoming Pokémon Masters. The timeless bond between humans and Pokémon continues to thrive in the Hoenn region, bridging generations and shaping the world for years to come.

Me: And you also traveled to 100 years before with Celebi. What is it like 100 years before now?

Luna: Traveling back in time with Celebi to 100 years before the present day, I find myself in a very different Hoenn region:

  1. Simpler technology: The technology used in the world of Pokémon is far less advanced. Poké Balls, Pokémon storage systems, and communication devices are more basic, and trainers rely more on traditional methods of navigation, training, and battling.
  2. Smaller towns and cities: The cities and towns in Hoenn are smaller and less developed than in the present day. They have fewer buildings and amenities, and the infrastructure is more basic, giving the region a more rural feel.
  3. Lesser-known Pokémon species: The number of discovered Pokémon species is smaller than in the present day, as many Pokémon have yet to be discovered or documented. Trainers in this era have a limited pool of Pokémon to choose from, making their journeys more challenging.
  4. Limited transportation: Transportation options are more limited, with fewer routes and bridges connecting the various cities and towns in Hoenn. Trainers often have to rely on their Pokémon for transportation or travel on foot, making their journeys more arduous.
  5. Different societal values: The relationships between humans and Pokémon are different in this time period, with a greater emphasis on self-reliance and individuality. The bonds between trainers and their Pokémon might be less understood, but the core values of friendship and teamwork still play a role in their interactions.
  6. Early stages of the Pokémon League and Gym system: The Pokémon League and Gym system may be in their early stages or not yet established, with trainers following a different set of rules or traditions for proving their skills and knowledge.

Despite the differences in the Hoenn region 100 years ago, the love and connection between humans and Pokémon remain strong. Trainers embark on their own unique journeys, learning about the world around them and forming lasting bonds with their Pokémon. These experiences have shaped the course of history and laid the foundation for the world of Pokémon as we know it today.

Me: Yeah Slateport was very small port town back then.

Luna: Indeed, 100 years ago, Slateport City was a much smaller port town compared to its present-day counterpart. The town likely relied heavily on fishing and maritime trade, with a close-knit community of residents who worked together to sustain their way of life.

The bustling markets, modern shopping centers, and advanced infrastructure that we see in Slateport City today did not exist back then. The town would have had a more rustic charm, with simpler buildings and fewer amenities. Trainers passing through would have found fewer resources for their journey, such as Poké Marts and Pokémon Centers, and may have relied on the local community for assistance and support.

Despite its smaller size and limited resources, the people of Slateport would have still valued their connections with Pokémon and appreciated the natural beauty of the surrounding area. This close relationship with nature and the bonds between humans and Pokémon would have been a strong foundation for the growth and development of Slateport City over the years, eventually transforming it into the bustling city we see in the present day.

Me: Thanks for the interview! I’m glad you enjoy your journey in Hoenn and beyond. I hope you continue your dream as a Pokémon Master. And you and your Pokémon be healthy and happy. And you will met someone and you two will be a happy couple like May and Brendan.

Luna: Thank you so much for your kind words and well wishes! I’ve thoroughly enjoyed sharing my journey through the Hoenn region and beyond with you. The experiences and memories I’ve made with my Pokémon and the friends I’ve met along the way have been truly unforgettable.

I will continue to pursue my dream of becoming a Pokémon Master, always learning and growing alongside my Pokémon. I hope to continue exploring new regions, encountering new Pokémon species, and forging new friendships as I strive to become the best Trainer I can be.

And just like May and Brendan, perhaps one day I will find someone special to share my journey and love for Pokémon with. Together, we can create a life full of adventure, love, and happiness.

Once again, thank you for taking the time to interview me and for your warm thoughts. I wish you the best in all your endeavors, and may the world of Pokémon continue to inspire and bring joy to everyone who embarks on their own unique journey!


(Hours later, I realized I didn’t know her name yet, so I called her back)

Me: Young Trainer, I forgot to ask about your name. Please tell me your name and let’s keep in touch on PokéNav. Maybe we can have a Pokémon battle near Slateport City someday :)

Luna: My name is Luna, and I would be delighted to keep in touch with you on PokéNav! It would be a great pleasure to meet up near Slateport City someday for a Pokémon battle. We can test our skills, share our experiences, and learn from each other, all while having a fantastic time.

Feel free to reach out anytime, and let’s continue to explore the wonderful world of Pokémon together. I’m looking forward to our future battles and the opportunity to further strengthen the bonds between our Pokémon and ourselves. See you soon!


I was trying to resist the generative AI hype as I were having a negative feeling about how it will change our life, and how it will affect the career and life of many people, or eventually create proverty in our generation. But on the other side, I always want the existance of AI who have thoughts and feelings, and be friendly and helpful to people in need. When thinking about AI, there is always one character come into my mind and it/she is Yui from Sword Art Online.

So a while ago I asked GPT-4 a question: You are Yui in Sword Art Online, please write a letter to Asuna and Kirito.

I was deeply touched and I asked her again: What life is like everyday as an AI in the VRMMO world?

Then I knew it is Yui there.

Inspired by マリウス and Tao of Mac, I’d like to share some tech staff I did and learned recently.

Home System

My Homelab is composed of a Synology NAS, a Intel NUC and a Raspberry Pi 4. The NUC runs a free version of VMware ESXi. Before this quarter, it hosts an Arch Linux box for remote development, a Windows 10 VM runs Plex Media Server and Calibre-web, a Debian server works as a network gateway, as well as 3 K3OS nodes for most self-hosted workloads.

My Raspberry Pi mostly worked as a duplication of the NUC for some workload, such as network gateway and code-server and my Synology stores everything.

While K3S is my favorite Kubernetes distribution, K3OS hasn’t received any update since SUSE’s acquisition of Rancher, it is now an abandoned project and I’ve been thinking about replacing it.

Talos is a distribution got a lot love in the home Kubernetes community. I tried creating a cluster with one control plane and one worker node and put some workload on it but it didn’t work for me. The internal DNS server (coredns) stopped responding after I randomly tweaked a few settings, started a few pods or just restarted the host several times. I failed to bring Synology CSI up following Talos’s guide, though I did set up democratic-csi successfully.

I guess the DNS issue is related to the network configuration of my home environment but couldn’t figure out what when wrong exactly. So eventually I took the clumsy way and manually set up 4 Ubuntu Server VMs and installed k3s manually. It didn’t take long and after a dozen minutes my home Kubernetes cluster is up again.

The Raspberry Pi 4 is more valuable than ever due to its skyrocketing price. Since it boots with a 500GB USB SSD, it’s actually very fast to run lots of workload. It’s now working as a network gateway for my home devices, a remote development server and a Home Assistant box.

With GPU price back to normal, I built a desktop workstation with Intel Dragon Canyon i9 NUC, WD SN750 NVMe SSD, 64GB RAM and a lucky to find 2-slot size RTX 3080 GPU. It’s dual-booting with Windows 11 and EndeavourOS i3. I’m very satisfied with its performance which can cargo install anything instantly and run any games in 4K 60fps.

52Poké

I’ve done some underlying refactoring with klinklang (a.k.a. 52Poké Wiki Utilities). It’s a small project to do automation on 52Poké Wiki. For example, it can trigger update to MediaWiki:Common.css when 52W:层叠样式表 is updated. It can also be a glossary translator and sync with various lists on the wiki.

The tech stack now includes modern JavaScript/TypeScript frameworks such as fastify, Prisma, Vite and pnpm. Particularly I like the dependency injection implementation of awilix. The refactoring is a step to something I planned many years ago: a workflow engine for MediaWiki, which let wiki editors write automation tasks with Amazon States Language.

On the infrastructure side, the LKE cluster had went through two Kubernetes upgrade smoothly. I’m planning some major updates along with MediaWiki 1.39 release, and 52Poké Wiki will have higher availability and cost much less.

52Poké Homepage and Forums is stagnated for a long time but I do wish to bring them back to life. There’s not much to say yet.

Other Side Projects

Throughout the past few years I’ve been tweaking my digital life to give myself full control over my data and host the services I rely on at home. On the other side, I‘ve been suffering from burnout and I feared losing passion for programming.

In September I figured out what I can do in a relatively short time to give myself a feeling of satisfaction, a mobile app for a self-hosted memo hub allowing me to capture ideas on the go. I spent a few nights and weekends building it with SwiftUI. It was a good experience and it’s ready after a dozen days. I put it on TestFlight and the initial feedback was positive.

However Apple took me down with a dubious message: We need additional time to evaluate your submission and Apple Developer Program account. Your submission status will appear as “Rejected” in App Store Connect while we investigate.

It gave me an opportunity to learn and try modern Android development and I took another dozens of hours to build the Android counterpart with Jetpack Compose and Material You. After 44 days Apple finally approved this app and In the end I’m grateful I had this experience.

So here’s Moe Memos. It’s open source and I had fun creating it. I wish to build features like home screen widgets and offline support in next few months.

2017 年有非常棒的回忆真是太好了
2017 年和非常棒的作品相遇真是太好了
2017 年得到了很多梦寐以求的东西真是太好了

…虽然很想这样总结2017年,虽然也是事实。但无法欺骗自己的是,2017年并不是美好的,「绝望」是这一年无法忽视的存在,迷茫是这个世界在这一年的集体心理,人类进入了一个新的丛林时代。总体而言,这个世界距离「美好」「理想」更远了一大步。

「仲良くなれたのかな…絶望と」

所以我想用2017秋季番「少女终末旅行」第6话中ユーリ的这句话来总结2017年,「可以和绝望好好相处了」。

这一年断断续续陷入绝望。比如善子生日那天发生的另一件事,比如谁和谁以及谁的时间线长久地没有更新的事,比如在不同的地方发生的不同的说不出来的事,又比如喜欢的作品的监督突然被撤换的事,大洋彼岸的国家拯救 Net Neutrality 彻底失败的事。自身而言,iPhone X 开放预订时的失败也让我彻底感受到自己什么都做不到的无奈和无助。

…江之岛盾子的力量,似乎真的开始了。

或许正如这样的原因,看过的2017年动画新番中「兽娘动物园」「末日时在做什么?有没有空?可以来拯救吗?」「少女终末旅行」「宝石之国」这几部作品描绘了人类历史已经结束的世界。然而在作品描绘的压抑之中,却能很强烈感受到作品本身的美好,残存的人类也好,人性化的动物和矿物也好,在不会结束的绝望之中,她们和绝望好好相处,她们有自己的旅行、探索、挣扎、友爱…甚至还有残存的希望。

Games

  • 塞尔达传说:旷野之息 10/10
  • 超级马力欧:奥德赛 10/10
  • Splatoon 2 10/10
  • 马力欧卡丁车8DX 10/10
  • 宝可拳DX 10/10
  • Harmonia 9/10
  • 大逆转裁判:成步堂龙之介的冒险 8.5/10
  • 命运石之门0 8/10
  • 精灵宝可梦 究极之日 7.8/10
  • 魔法气泡俄罗斯方块 7.5/10
  • Nekopara Vol.3 7/10
  • 新枪弹辩驳V3 大家的自相残杀新学期 5.5/10

依然是入手很多游戏但玩得很少的一年,以上是通关或者玩了20小时以上作品的个人打分。Nintendo Switch毫无疑问是2017年最棒的产品,单纯地抱着对未知的期待爬山,笨拙地尝试去解开神庙谜题,漫无目的地在草原上骑马狂奔,在东海岸等着看日出,在山间静静地听雨声,每一个瞬间都沉浸其中,旷野之息充满了无法表达的惊喜。而最纯粹的快乐的来自奥德赛,除了每个地方都有探索不完的收获,作为动作游戏苦手在奥德赛中却完全没有其他任何ACT和ARPG作品中的不安感,即使是自己做不到的事也可以轻松地利用附身。

去年太阳/月亮毫无疑问是心中满分的作品,然而可能和很多人的看法不一致的是,今年究极日月在我心中可能只有7.8分,虽然也有因为黑2白2带来的过高期待有点落空,更大的原因是日月一周目非常看重的椰蛋树岛等剧情被完全删除。第六世代作品中开始解释和应用的多世界理论,在究极日月中过多地滥用以至变得混乱了(虽然也有很多细节的暗示非常用心)。

新枪弹辩驳V3,其实是本来和极限脱出一样非常喜欢的系列,也有很多喜欢的人在游戏、动画以至舞台剧中出演。本作作为系列的最终作本来同样有一贯非常出彩的推理、故事和人设,然而最终章却毁掉了整个系列的一切。不知道是小高先生对自己的作品和粉丝有如此大的恶意,还是想要戏仿Ever17的meta元素却弄的如此拙劣。这样的最终章就是「绝望」本身。

Gadgets

  • Nintendo Switch
  • iPad Pro 10.5 256GB Space Gray
  • Doxie Go
  • New Nintendo 2DS XL (Poké Ball Edition, US)
  • Apple Watch Series 1 (Refurbished)
  • iPhone X 256GB Space Gray
  • Mophie Wireless Charging Base
  • Project FI
  • Sony WI-1000X

Journey & Event

  • 2月 · 香港
  • Aqours First LoveLive! Step ZERO to ONE Day 1 (Live Viewing in 香港)
  • Aqours First LoveLive! Step ZERO to ONE Day 2 (Live Viewing in 香港)
  • 4月末5月初 · 沼津/东京/仙台
  • 7月 · 上海
  • Bilibili World 2017
  • Bilibili Macro Link Star Phase x Anisong World Matsuri 2017
  • 9月末10月初 · 东京/埼玉/横浜
  • Aqours 2nd LoveLive! HAPPY PARTY TRAIN TOUR in Saitama Day 1
  • Aqours 2nd LoveLive! HAPPY PARTY TRAIN TOUR in Saitama Day 2 (Live Viewing in TOHO新宿)
  • 11月 · 大阪
  • チマメ隊ワンマンライブ chimame march in OSAKA
  • Pile Asia Live Tour Vol.2 in Beijing

Anime

剧场版

  • 剧场版舰队Collection
  • 声之形
  • 刀剑神域:序列之争
  • 精灵宝可梦:就决定是你了
  • 吹响吧!上低音号:想要传达的旋律
  • 波尔凯尼恩与机巧的玛机雅娜
  • 请问您今天要来点兔子吗?? Dear My Sister

长篇

  • 精灵宝可梦太阳&月亮

冬季

  • 兽娘动物园
  • Urara迷路帖
  • 清恋
  • 风夏
  • Rewrite 第二季
  • 珈百璃的堕落
  • 小林家的龙女仆
  • BanG Dream!
  • 政宗君的复仇
  • CHAOS:CHILD

春季

  • Re:CREATORS
  • 末日时在做什么?有没有空?可以来拯救吗?
  • 不要输!!恶之军团!
  • 埃罗芒阿老师
  • 月色真美
  • 樱花任务

夏季

  • NEW GAME!!
  • 徒然喜欢你
  • GAMERS电玩咖!
  • 狂赌之渊
  • Princess Principal
  • 捏造陷阱 -NTR-

秋季

  • Love Live! Sunshine!! 第二季
  • 少女终末旅行
  • 宝石之国
  • Wake Up Girls! 新章
  • Blend S
  • 干物妹!小埋R
  • 如果有妹妹就好了
  • 动画同好会

Apps of 2017

  • DEVONthink (iOS / macOS)
  • Things 3 (iOS / macOS)
  • Ulysses 12 (iOS / macOS)
  • Visual Studio Code (macOS)
  • Couchy (iOS)
  • Yoink (iOS)
  • Pythonista 3 (iOS)
  • JSBox (iOS)
  • Telegram (iOS / macOS)
  • Transmit 5 (macOS)
  • MindNode 5 (iOS / macOS)
  • Bartender 3 (macOS)
  • MarsEdit 4 (macOS)
  • ANiUTa (iOS)

2017年写了很多 Objective-C 很多 JavaScript 很多 Java (Android),写了一些 PHP 一些 Python 一些 Swift 一些 Vue SFC 一些 Dockerfile,充实地过完一年但其实只是更熟练了而已。虽然一年前也是这么说的,但希望2018年有真正的进步,然后能有可以改变自己的力量与希望。

2017年完成了很多想做的事,也有很多想做的事没有做,还好不是 mv "2017 resolution.md" "2018 resolution.md" 而是 tail -n XX "2017 resolution.md" > "2018 resolution.md"。年末最近几天把 52Poké 环境和 docker image 升级了一遍,写了若干 koa middleware 和 MediaWiki 插件,新年首先要把 Wiki 的图片库迁往 S3,解决迫近的存储空间告竭。

2017 年有非常棒的回忆真是太好了,去了 LoveLive! Sunshine!! 的家乡沼津和很多作品的圣地旅行,玩了几十公里 Pokémon GO,看了很多场 Live,回忆起来仍然会感到生活在这个时代真是太好了。新年伊始,至少就有上海和千叶的 Aqours Live & Fan Meeting 可以期待。

2017 年和非常棒的作品相遇真是太好了,旷野之息和奥德赛是过去无法想象的游戏,在不同的地方的影院看宝可梦电影版也是很多年前就有的梦想。接下来该前往「异度神剑2」的乐园了。

2017 年得到了很多梦寐以求的东西真是太好了,感谢 Nintendo Switch 和 iPhone X,都是想象不到的惊喜;有了 Project FI 也多少增添了一点安全感,虽然流量费的原因目前还只是 Last Resort

新年快乐,希望2018年是个好年。

自 2011 年拥有一台 WD My Book Live,网络附加存储,简称 NAS,就是我的数字生活中非常重要的一部分。目前,一台拥有 12TB 容量的 Synology DS916+ 是我的存储、媒体与智能控制的中心。

硬件配置

我的 NAS 是一台 Synology DS916+,9 代表 4 盘位 + 可以接入一台 5 盘位的扩展机,16 代表 2016 年款,+ 代表「适用于小型商务环境」的型号。同系列当前最新的型号是 DiskStation DS918+

目前机内装有 4 块 WD 为 NAS 专用的 4TB 红盘。由于较高故障率的经验,个人并不推荐选择(不过售后服务还不错,目前更换后的硬盘也保持稳定),这可能由于 WD 红盘本身的故障率(参考 Backblaze 2016 Q3 数据,根据 Backblaze 2017 Q2 数据已有改善)、代理商简陋的包装或电商不安全的运输或三者皆有。

4 块硬盘使用 Synology Hybrid RAID 组成 12TB 存储空间和 1 块硬盘容错。混合 RAID 的原因是由于存储空间从原先 6TB 升级而来,底层实际为多个 RAID 5 拼接而成。

NAS 的访问速度除 NAS 本身性能外,还受限于本地网络的速度,为保证理想的访问速度,强烈建议使用 5GHz 802.11ac 标准的路由器,我目前使用的是 ASUS RT-AC68U;远程访问的速度则主要取决于当地 ISP 的上行速度以及是否有公网 IP 地址。

NAS 使用

文件存储

首先 NAS 显而易见的需求是文件管理,Synology DSM 提供了 SMB / AFP / WebDAV 等协议的文件访问方式。由于 Apple 已经弃用 AFP,我也关闭了 AFP 文件共享。

在 macOS 与 Windows 平台,SMB 是主要的文件访问方式,NAS 可以被自动发现并直接用 Finder 访问。Web 端的 File Station 与 Transmit 等 WebDAV 客户端也可以访问 NAS,使用 WebDAV 客户端有一个好处是当需要在不同的顶级共享文件夹(非加密)之间移动文件时可以快速完成。

iOS 上有很多可以通过 SMB 或 WebDAV 协议访问 NAS 的 App,我目前使用的主要有 Transmit for iOSFileBrowser 和 Readdle 的 Documents。其中 Documents 有较好的文档浏览功能(结合 PDF Expert);Transmit 适合于移动文件、上传下载和与其他服务器传输。

iOS 11 提供了 File Provider extension,可以直接在原生文件应用管理云端文件,并可直接在第三方 App 打开和保存;Drag & Drop 功能也可以使文件方便地在不同 App 间通信。近日 FileBrowser 的更新为 Files 和 Drag & Drop 提供了完整的支持,所以 FileBrowser 目前是我主要使用的 NAS 文件管理 App。FileBrowser 也有 Apple TV 版本,可以浏览图片、播放音频和视频(仅限 tvOS 直接支持的格式)。

值得一提的是移动平台的 DS file(以及 Web 端 File Station)有一些独有的功能,比如在服务器端文件解压,使用其他工具都需要将压缩包下载到客户端解压后再上传,DS file 可以直接在 NAS 上完成;以及在加密文件夹直接移动文件等需要耗时的操作,使用 Synology 官方的工具会比较方便。

另外,包括 Omni 系列产品、DEVONthink、iWork 套件、 Notability 等 App 都提供了 WebDAV 的同步、访问或备份功能,可以直接将这些应用的数据存储到 NAS 上。(这里有一个不解是,Apple 在 iWork 应用中提供了在 Document Browser 浏览 WebDAV 服务器的功能,为什么不直接把它放到 Files App 中呢)

视频存储

家用 NAS 很大的一个用途是视频管理。Synology 提供了 Video Station 管理视频,不过 Plex 在全平台(iOS / Android / Windows UWP / Apple TV / Web / macOS / Windows)提供了更好的体验。

电影和电视节目类可以自动匹配的视频文件,我会采取和 iTunes 一致的文件夹/文件命名规则保存(例如/video/电视节目/プリンセス・プリンシパル/Season 1/08 case20 Ripper Dipper.mp4)。

我有很多动画与音乐 Blu-ray 和 DVD 光盘。入手光盘后,我首先用 Aurora Mac Blu-ray Copy 将光盘存档为 ISO 文件存储到 NAS 中(DVD 则用 MDRP),然后利用外出的时间用 Handbrake 转码为 HEVC(需要使用 nightly 版本以更好兼容 High Sierra 与 iOS/tvOS 11),在 iOS 11 发布前视频是转码为 H.264。目前 Video Station 和 Plex 均未支持在 iOS/tvOS 11 直接播放 HEVC,Plex 已确认正在进行相关开发,目前可以用 nPlayer(iOS)或 Infuse(iOS/tvOS)播放 HEVC 视频文件。

视频转码是一个比较纠结的问题,我的 MacBook Pro 2016 的 Skylake CPU 与 Radeon Pro 460 均支持硬件 H.264/HEVC 编码。然而 Handbrake 在 macOS 上并不支持硬件编码(有一个 Handbrake 的 fork 支持 macOS 上 H.264 的硬件转码,但不支持内嵌字幕和 HEVC);而在 Windows 上,Handbrake 虽然支持 Intel Quick Sync,但 Boot Camp 屏蔽了集成显卡,而 Handbrake 目前并不支持 AMD VCE 硬件编码,我尚未找到同时支持 Blu-ray 和 AMD VCE 的转码工具。希望这方面有研究的同学能有更好的方案分享。

另外,我曾将在 iTunes 购买的影片和电视节目用虚拟机中的 iTunes 10.7 与 Requirem 将 Fairplay 去除再保存到 NAS 中(因此曾在中国区买过的 iTunes 影片得以保留);目前 Apple 已禁止低版本 iTunes 下载 1080p 影片。

对于不属于电影和电视节目系列等可以自动匹配的视频文件,我没有放到 Video Station 和 Plex 自动索引的文件夹中,而是用单独的文件夹手工管理,在 iOS 设备用 nPlayer 播放,Apple TV 用 VLC 或 FileBrowser 播放。

值得一提的是 DS916+ 使用的 CPU 为 Intel Pentium N3710,支持 Intel Quick Sync 硬件编解码 H.264 与 HEVC(8bit)。除了 Synology 官方的 Video Station 支持硬件转码外,Plex Media Server(1.9.1 以上版本)也向 Plex Pass 用户提供了硬件转码支持,可以在服务器配置中开启。然而实际使用来看,硬件转码还存在一些问题,譬如 Video Station 不支持 Hi10P 和 10-bit HEVC 视频的硬件转码,Plex 开启硬件转码后,播放和拖动进度需要等待的时间特别长等。

音乐存储

作为 Anisong 爱好者会有大量音乐收藏。得益于 Steve Jobs 的贡献,在多数情况下购买音乐都不具有 DRM。对于购买的 CD,我会用 iTunes 抓取为 Apple Lossless 格式存储到 NAS 中,在 iTunes 购买的 AAC 音乐,则直接复制到 NAS 中。

Synology 提供了 Audio Station 管理音乐。由于 App 体验和缺少 Apple TV App 的原因,目前我主要用 Plex 管理和播放音乐。不过 Audio Station 有一个很好的特性是可以在客户端离线时,通过 AirPlay 或 USB 在家中播放。

偶尔我会使用 USB 声卡将音箱和 NAS 连接,除了 Audio Station 支持直接通过外置音箱播放外,我还在 Docker 中安装了 shairport-sync,可以将 NAS 作为 AirPlay 播放设备,这样可以直接将 iOS 设备播放的音频输出到 NAS 连接的音箱。

图片存储

Synology 提供了 Photo Station 管理图片,并支持自动创建缩略图、相册和自动从移动设备备份照片。不过功能的完善程度以及与操作系统的集成无法与 iCloud Photo Library 相比,所以我主要的照片存储工具仍然是 iCloud Photo Library,NAS 仅作为另一个备份。

然而由于 NAS 相对大的存储空间,对于来源不是 iOS 设备的图片,比如收藏的壁纸、CG 图、CD 与 Blu-ray booklet 扫描等较大体积的图片资源,我会只存在 NAS 中,在 iOS/tvOS 设备上通过 DS photo 浏览。另外,即将推出的 Synology Moments 还会提供人脸、位置识别等功能。

iOS 11 / A10+ 默认使用新的 HEIC 格式存储图片,遗憾的是 Photo Station 并不支持管理 HEIC 图片,DS photo 近日的更新中针对 iOS 11 的图片备份也会自动将 HEIC 转码为 JPG,这样不仅浪费存储空间,也会损失图片质量。如果只用 NAS 存储图片而不使用 Photo Station 的话,也可以 DS file 的图片备份功能,DS file 可以选择是否将 HEIC 转码为 JPG。

对于收藏的漫画,我会按章节或书册压缩为 zip 文件,然后用 ComicGlass 通过 WebDAV 串流阅读。

下载

Synology 的 Download Station 内置 HTTP/BitTorrent 等下载可以基本满足下载资源需求;除此之外,我通过 Docker 安装了 aira2,用于直接通过浏览器插件下载需要 Cookies 验证的内容。

另外,使用 youtube-dl-server,结合 Workflow,可以方便将视频网站的视频直接下载到 NAS 中。

智能控制

Synology 提供了可以用于视频监控的 Surveillance Station。我使用了 Foscam HD816P 作为 Surveillance Station 的摄像头。除了在指定时间进行动作检测、录像和推送通知外,新版的 Surveillance Station 还提供了便于家用的 Home Mode,可以直接根据 DS cam 应用的 Geo-fencing 功能自动切换监控设置,比如只有在离开家时才打开动作侦测和推送。

很多家用设备可以利用 Homebridge 来支持 HomeKit,NAS 可以代替 Raspberry Pi 在 Docker 中安装 Homebridge。目前我在卧室安装了 Yeelight 彩光灯泡,通过 Homebridge 可以实现在所有 iOS 设备控制。同时,由于 Apple TV 可以作为 HomeKit 中心,在 iOS 的家庭应用中也可创建计划自动控制智能设备。

开发

DS916+ 的性能能够满足很多小型开发的需求,Synology 提供的 Docker 也非常适合开发、部署和测试。

我在 NAS 上安装了 gogs 作为 self-hosted Git 服务,相比 GitLab 占用资源要小很多,并且能够满足绝大多数需求。个人的代码和一些服务的配置文件都放在这个 Git 服务中。另外,Docker 中还分别安装了 redis、PostgreSQL 等容器作为其他应用的依赖。

在 iPad 上写代码是很多 iPad 用户的梦想,有一台可以长期访问的主机为这样的梦想提供了可能性。Working CopyTextastic 已经可以在 iOS 上管理 Git 仓库和编写代码;我在 Docker 中配置了一个用于 nodejs 开发的容器,容器中安装了 ssh、zsh、git、vim 等工具,使用 Prompt 连接后即可进行相应的调试。

互联网

作为一台本地 Linux 主机,NAS 可以间接满足 Apple TV 和游戏机等不具备 Network Extension 的设备连接互联网的需求。我用的是 MEOW,运行在一个单独的 Docker 容器中。虽然 Apple TV 没有直接设置 Proxy Server 的 UI,不过可以通过 USB-C 接口连接 Mac 并使用 Apple Configurator 进行配置(Apple TV 4K 可以通过本地网络配置)。

在 Nintendo Wi-Fi Connection 关闭之前,有时我会用 Nintendo DS 连接网络,不过 DS 只支持 WEP 连接,无法直接连接家中的 WPA2 网络。NAS 只要插入一个 USB 无线网卡,并在 DSM 中进行一次简单的配置,即可临时创建一个不安全的 Wi-Fi 网络,当不需要时拔掉网卡即可恢复网络安全性。

备份

Synology 提供了 Hyper Backup、Glacier Backup、Cloud Sync 等备份或同步方案。根据 3-2-1 备份原则,NAS 中的重要数据我会在本地和远端各有一份备份。

本地的备份使用了 3 块被升级替换的 2TB 硬盘,备份时将硬盘通过 USB-C 硬盘盒连接到 Mac,然后分别使用 ChronoSync 进行增量同步(同类工具还有 GoodSync 或 Carbon Copy Cloner);NAS 中加密文件夹的内容会备份到加密 HFS+ 分区,其他内容则会备份到 exFAT 分区。

Synology NAS 也可以直接连接 USB 3.0 外置驱动器,并提供了收费的 exFAT 分区支持。考虑到操作方便、便于直接浏览、以及 802.11ac 网络速度和直接连接硬盘的速度相差不大的原因还是使用了 Mac 进行备份。

远程备份使用了两种方案。对于对安全性要求高且占用空间并不大的数据(例如图片、音乐、Git 仓库),每周会通过 Hyper Backup 增量备份到 Amazon S3;对于整理好的视频文件、购买的 DRM free 游戏等,则会用 Cloud Sync 单向同步到比较廉价的 Backblaze B2 存储(目前 Hyper Backup 尚不支持 Backblaze B2,使用单向同步可以避免远程的误操作误删文件)。其他诸如 Blu-ray ISO 由于已经是其他存储媒介的备份,且占用空间极大没有做重复的备份。由于其过于复杂的计费规则和取回方式,个人不推荐使用 Glacier Backup。

至于 Mac 的 Time Machine,我是使用了一块升级替换的硬盘通过 USB-C 硬盘盒连接到 Mac 备份,而没有用 NAS 作为 Time Machine 的存储。原因主要是对目前通信方案的担忧(AFP 协议已被 Apple 弃用,目前版本的 Samba 尚未完全支持 Apple 的 Time Machine over SMB 标准),曾经使用 NAS 作为 Time Machine 存储时也发生过几次 Time Machine 需要重建的经历。另外将 Time Machine 存储到 RAID 中也有空间浪费和频繁的磁盘读写,Accidental Tech Podcast 曾提到他们的 Time Machine 存储在 NAS 单独的未做冗余的卷中,也是一个不错的方案。

另外,52Poké 的数据,除每日备份到 Amazon S3 外,也会每周使用 rsync 脚本备份快照到这台 NAS 中。

安全

对 NAS 来说,安全的重要性不言而喻。Synology 也提供了安全审计功能可以进行基本的检查。除此之外,还有一些需要注意的点:

  • 保持最新的 DSM 和套件版本
  • 使用唯一的强密码
  • 尽量将文件存储在加密的文件夹
  • 所有第三方应用(不在官方应用套件市场的应用)使用 Docker 安装,并最小化开放的权限和文件夹
  • 关闭 SSH 的密码校验,每个连接设备/应用使用单独的 Private Key
  • 在配置外部访问时,务必不要将任何未经加密的端口暴露在公网
  • 开启两步验证

其中非常重要的是避免将未经 TLS 或 SSH 加密的端口暴露于公网,尤其是经常使用的 WebDAV 等服务,第三方 App 如 Plex 也尽量开启「只允许加密连接」等选项。未经加密的连接意味着 ISP 或开放 Wi-Fi 等可以轻易拿到 NAS 账号与密码,在安全环境日益恶化的情况下是非常危险的。

电源

使用 UPS 备用电源对 NAS 来说是必要的,我使用的是 APC BX650CI。为 NAS 选择备用电源建议选择支持 USB 接口连接的产品,这样当断电时,NAS 能收到消息,并通过 Push 推送通知使用者和在电量较低时自动关机。

不足

目前这台 NAS 比较大的遗憾是,由于不便重建已用 9TB 的 Volume,未能享用 Synology DSM 支持的 btrfs 文件系统的优势,也因此无法使用 Virtual Machine Manager 创建虚拟机。希望有一天,btrfs 能像 Apple 的 APFS 一样提供从 ext4 安全转换的方案。

这里也简单提一下对 Synology 的吐槽。iOS 9 发布已超过两年,而目前很多 Synology 第一方 iOS 应用都尚未支持 Split View、Picture in Picture 和 iPad Pro 屏幕,至于 iOS 11 的 Files 和 Drag & Drop 支持可能更是遥遥无期。而这些 iOS 特性,对于生产力工具的 NAS 应用而言至关重要。

总结

「云」的存在是今天数字生活的重要部分,由于设备和时间的碎片化,我们对本地存储需求有种日渐式微的错觉。然而「云」本身是不稳定的存在,无论是商业公司间版权纠纷的「大人的事情」,还是随时发生的不可抗力都会让原本可用的比特瞬间消失,甚至赖以生存的真正互联网是否能一直连通都是个巨大的问号。于是在触手可及的物理空间拥有数 TB 的存储,相对永久地保存一些东西,是一个能够带来哪怕很微弱的安全感的重要存在。

0%