#javascript replace all spaces
Explore tagged Tumblr posts
Text
Transforming Ideas into Impact: Why Illustration Modelling Matters in Modern Design

In today’s fast-evolving digital space, Illustration Modelling has become more than just a creative discipline—it’s a vital strategy for turning complex concepts into visually engaging and user-focused outcomes. Whether you're building an app, revamping a website, or developing a brand identity, illustration is no longer just about drawing—it's about problem-solving through design.
What sets this method apart is its sharp focus on a single, powerful question: How will this benefit the client’s goal best? Every decision—from the first sketch to the final user experience test—is made with purpose and clarity.
Built for Purpose, Not Just Aesthetics
Far too often, visual design becomes an exercise in style over substance. But effective digital products need both form and function. By using Illustration Modelling, creative teams develop visual assets that support interaction, usability, and brand messaging—all while staying aligned with the user’s expectations.
The process integrates essential steps like planning and sketching, user experience testing, and flowchart and wireframe development to produce high-impact, functional visuals.
Seamless Integration Across Tech
Today’s projects don’t exist in a vacuum. Visual elements must adapt across platforms and technologies. That’s why Illustration Modelling pairs well with tools like:
Front End Development
WordPress
Cloud Migration
JavaScript frameworks
Flutter framework
When illustration is informed by tech, the result is design that works, not just looks good.
Why Team Collaboration Matters
A project’s success depends on synergy. Strong team collaboration ensures the entire process flows from concept to execution. Everyone—developers, designers, planners—has a clear role and shared vision.
Replacing unreliable wireframes and costly agencies, the Illustration Modelling process is more organized, more effective, and much more affordable.
A Smart, Scalable Design Strategy
Because it’s deeply rooted in problem-solving, Illustration Modelling helps teams think beyond aesthetics. It fosters innovation without overwhelming the user. It gives space for brands to speak clearly while keeping the experience simple and intuitive.
And it works seamlessly with ongoing needs like:
API development
UX testing
Creative wireframing
Responsive front-end builds
If you're tired of cookie-cutter visuals and looking for something that truly aligns with your mission, it's time to shift your focus.
#IllustrationModelling#UXDesign#CreativeProcess#FrontendDevelopment#FlutterFramework#TeamCollaboration#Wireframing#DigitalDesign#TechDesign#ProblemSolvingDesign
0 notes
Text
How We Improved Site Speed for a Client's PHP Website
When a client approached us with concerns about their website's loading speed and inconsistent performance, we recognized this as a challenge common among businesses with legacy PHP applications. Site speed plays a critical role in user experience, SEO rankings, and overall digital success. Slow performance can directly impact bounce rates and conversions, which is why PHP development companies must prioritize speed optimization in every project.
In this case study, we’ll walk through the methods we used to optimize a PHP-based website for better speed and performance.
Initial Assessment and Problem Identification
The first step was a full performance audit. Using tools like Google PageSpeed Insights, GTmetrix, and server logs, we uncovered several key issues:
Inefficient database queries
No caching mechanisms in place
Poorly optimized assets (JavaScript, CSS, and images)
High server response times
These issues are not uncommon for websites built a few years ago without ongoing optimization. Many PHP development companies in USA encounter such challenges, especially when websites evolve without scalable backend solutions.
Key Optimization Techniques We Applied
1. Optimizing Database Performance
The website’s dynamic content relied on complex and sometimes redundant SQL queries. We restructured these queries and added indexing where necessary. By reducing query execution time, we achieved noticeable backend performance gains.
2. Implementing Caching
To reduce load on the server and improve response time for repeat visitors, we enabled:
Opcode caching with OPcache
Object caching using Redis
Full-page caching for static and semi-dynamic content
Caching is one of the most effective ways for top PHP development companies in USA to immediately enhance site speed with minimal risk to core functionality.
3. Asset Optimization
We minified all CSS and JavaScript files, removed unused styles, and bundled them efficiently to reduce HTTP requests. Additionally, we enabled Gzip compression and browser caching via .htaccess to improve frontend performance.
4. Image and Media Optimization
Large image files were replaced with compressed versions in modern formats like WebP. We also implemented lazy loading to defer offscreen images from loading until they were needed.
5. Server Configuration Enhancements
Our team fine-tuned PHP-FPM and Apache configurations to ensure that the server handled traffic more efficiently. We increased memory limits, adjusted timeout settings, and introduced monitoring tools to keep track of resource usage.
Results Achieved
After deploying these improvements, the client experienced:
70% faster page load times
A 40% drop in bounce rate
Improved search engine visibility
A smoother and more responsive admin dashboard
These outcomes are a testament to what experienced PHP development companies can accomplish with the right blend of strategy, tools, and technical expertise.
Long-Term Strategy
Speed optimization isn’t a one-time fix. We helped the client set up automated performance reports and regular maintenance routines. This proactive approach ensures their website remains fast even as traffic increases or new features are introduced.
Final Thoughts
For businesses running PHP-based websites, performance optimization should be an ongoing priority. Whether you're maintaining a legacy application or building something new, partnering with professionals matters.
Our success in this project reflects the value that top PHP development companies in USA bring to the table. With hands-on experience, performance tuning capabilities, and scalable development practices, we help our clients stay competitive in the digital space.
If you're looking to enhance your website's performance, collaborating with trusted PHP development companies in USA can lead to transformative results.
0 notes
Text
How to Fix Website Loading Time Issues
In today’s fast-paced digital world, a slow-loading website can be a business killer. Research shows that users expect websites to load within 2–3 seconds, and any delay can lead to a significant drop in user engagement and conversions. If your website is plagued by loading time issues, it’s time to act. With the help of a professional partner like the best website development company in Jaipur, you can identify and resolve these issues to ensure a seamless user experience.
Why Website Loading Time Matters
User Experience (UX): A fast-loading website keeps users engaged and reduces bounce rates.
SEO Rankings: Search engines prioritize fast websites, meaning your site’s speed directly impacts its visibility.
Conversion Rates: Faster websites tend to convert more visitors into customers.
Reputation: Slow-loading websites can harm your brand’s credibility and trustworthiness.
Common Causes of Slow Website Loading Times
1. Unoptimized Images
Large image files can significantly slow down your website. Images need to be compressed and properly formatted for web use.
2. Excessive HTTP Requests
Every element on your website, such as images, scripts, and stylesheets, requires an HTTP request. Too many requests can bog down your loading speed.
3. Poor Hosting Services
A low-quality hosting provider can limit your server’s capacity to handle traffic and deliver content quickly.
4. Bloated Code
Excessive or redundant code in HTML, CSS, or JavaScript files can lead to slower loading times.
5. Lack of Caching
Without caching, browsers need to reload all elements of your website every time a user visits, increasing loading time unnecessarily.
6. Inefficient Plugins
Too many plugins, or poorly coded ones, can slow down your site’s performance.
How to Fix Website Loading Time Issues
1. Optimize Images
Use tools like TinyPNG or ImageOptim to compress images without losing quality.
Implement modern formats like WebP for faster loading.
Use lazy loading for images that don’t appear above the fold.
2. Minimize HTTP Requests
Combine CSS and JavaScript files to reduce the number of requests.
Use a Content Delivery Network (CDN) to deliver assets from the nearest server.
3. Upgrade Your Hosting
Switch to a reliable hosting provider with faster servers.
Consider using managed hosting services or cloud hosting for better scalability and performance.
4. Clean Up Your Code
Minify CSS, JavaScript, and HTML files to remove unnecessary characters and spaces.
Remove unused code and optimize your scripts for better efficiency.
5. Implement Caching
Use browser caching to store static files locally on users’ devices.
Install caching plugins like WP Super Cache or W3 Total Cache for WordPress sites.
6. Audit and Remove Unnecessary Plugins
Deactivate plugins that are not essential for your website’s functionality.
Replace inefficient plugins with lightweight alternatives.
Tools to Measure and Improve Website Speed
Google PageSpeed Insights: Provides detailed insights and suggestions to improve your website speed.
GTmetrix: Offers performance reports and actionable recommendations.
Pingdom: Monitors your website’s loading time and uptime.
Partner with Webpino Software — The Best Website Development Company in Jaipur
At Webpino Software, we specialize in addressing performance challenges to ensure your website loads quickly and efficiently. As the best website development company in Jaipur, we employ advanced optimization techniques to enhance your website’s speed and overall performance.
Our team of experts focuses on everything from image optimization and code refinement to implementing robust caching strategies and upgrading hosting services. With Webpino Software, you can rest assured that your website will provide a seamless, engaging, and fast experience for all users.
Don’t let slow loading times harm your business. Contact Webpino Software today to create a high-performing website that keeps your audience engaged and your business thriving!
#custom website design#web design#website development#best website development company in jaipur#website#business website solutions#digital marketing#web hosting#best website development
0 notes
Text
Tech Farewells of 2024: Products and Services We’re Saying Goodbye To
As we approach the end of 2024, the tech world bids farewell to a number of products, services, and platforms that have been integral to our digital lives for years. In an industry that evolves at lightning speed, obsolescence is inevitable, and even the most beloved technologies must eventually make way for newer innovations. This year, we saw some iconic tech products and services reach the end of their lives, leaving behind a legacy that will be remembered by users and industry experts alike.
Here’s a look at some of the most notable tech farewells of 2024:
1. Google Stadia: The End of the Cloud Gaming Experiment
Google’s ambitious cloud gaming service, Stadia, will officially shut down in 2024. Launched in 2019 with high expectations, Stadia aimed to revolutionize the gaming industry by allowing users to play high-quality games via streaming without the need for dedicated hardware. Despite an initial burst of excitement, Stadia struggled with issues like a limited game library, a lack of consumer interest, and competition from more established platforms. Google has already announced its plans to refund customers for hardware and games purchased on Stadia, marking the end of a bold but ultimately unsuccessful experiment in gaming.
2. Microsoft Internet Explorer: A Final Curtain Call
Internet Explorer, once the most widely used web browser in the world, will officially be retired in 2024. After decades of dominating the browser landscape, Microsoft Edge has now become the company’s focus. While Internet Explorer remained a staple for many users, especially in corporate environments, it’s been gradually replaced by more modern browsers that prioritize speed, security, and user experience. Microsoft has urged users to transition to Edge, which has gained popularity thanks to its fast performance and compatibility with newer web technologies. Though it has been a long time coming, saying goodbye to Internet Explorer marks the end of an era in web browsing.
3. Apple iTunes: A Digital Music Legacy
After over two decades, Apple will officially phase out iTunes in 2024, replacing it with its more streamlined and modern services like Apple Music and the Apple TV app. iTunes was once the go-to platform for purchasing and managing music, movies, and TV shows. However, with the rise of streaming services and digital downloads, iTunes has increasingly become outdated. The shift away from iTunes represents the changing landscape of digital media consumption, with streaming platforms taking center stage. For many long-time users, the shutdown of iTunes marks the end of an era of digital ownership.
4. Twitter (X): A New Beginning, But a Familiar Goodbye
In 2024, Twitter will undergo another major transformation. As part of Elon Musk’s ongoing rebranding efforts, Twitter will officially retire its iconic blue bird logo and become "X." Although the social media platform itself will remain, the shift to "X" is symbolic of Musk’s vision to turn the platform into a broader, all-encompassing digital service—potentially incorporating banking, shopping, and entertainment. While Twitter may continue to exist in some form, its farewell as the social media giant we’ve known for over a decade marks a significant cultural shift in the online space.
5. Adobe Flash Player: A Long-Awaited Farewell
Adobe Flash Player, which was officially phased out in 2020, will no longer receive any updates or support in 2024. While the end of life for Flash Player was announced several years ago, the actual closure of Flash-based content will finally be fully realized this year. Once a dominant tool for web developers, Flash was eventually replaced by more secure and efficient technologies like HTML5, CSS3, and JavaScript. The final curtain for Flash means that many old Flash-based websites and games will be lost to the digital past. For those nostalgic about the days of Flash animations and games, this year marks the final goodbye.
6. Google Hangouts: A Shift to Google Meet and Chat
After years of providing a communication hub for users, Google Hangouts will officially be shut down in 2024. The app, which started as a casual chat platform, was eventually replaced by Google Meet and Google Chat, which offer more robust, business-friendly solutions for communication. Hangouts served as a bridge for many users transitioning from Google Talk to the modern world of video conferencing, but with the increasing dominance of platforms like Zoom and Teams, Google decided to consolidate its messaging services. The shutdown of Hangouts will leave behind a long history of chats, video calls, and memories for users who once relied on it for staying connected.
7. Windows 10: Transition to Windows 11
Windows 10, one of Microsoft’s most successful operating systems, will officially reach the end of support in 2024. Users who still rely on Windows 10 will need to upgrade to Windows 11 to receive updates and security patches. With a sleek, modern interface, better performance, and improved security features, Windows 11 has become the go-to OS for new devices. The phase-out of Windows 10 represents the culmination of Microsoft’s efforts to modernize its ecosystem and provide users with a more intuitive, integrated experience across devices.
Final Thoughts: The Evolution of Technology
As we say goodbye to these products and services in 2024, we are reminded of the rapid pace of technological advancement. While these farewells can feel bittersweet, they also represent progress and the constant reinvention of the tech landscape. New innovations, updated services, and improved devices are always on the horizon, pushing the boundaries of what’s possible in the digital world.
Though we may miss some of these familiar tools and platforms, their departure opens the door for new technologies to take their place. In the ever-changing world of tech, the only constant is change, and 2024 is proof of that. Here's to the future of innovation!
#Tech Farewells#2024 Tech News#Products Retiring in 2024#Technology Updates#End of Service#Digital Media Changes#iTunes Shutdown
0 notes
Text
Google Introduces V8 Sandbox to Tackle Memory Corruption in Chrome

Google has announced a new security feature called the V8 Sandbox for its Chrome web browser. This move aims to address the persistent issue of memory corruption vulnerabilities in the V8 JavaScript and WebAssembly engine. Preventing Memory Corruption Spread According to Samuel Groß, the technical lead for V8 Security, the sandbox is designed to prevent "memory corruption in V8 from spreading within the host process." In other words, it aims to isolate the impact of V8 vulnerabilities by restricting the code executed by V8 to a specific virtual address space, effectively containing any potential damage. A Specialized Solution for V8 Vulnerabilities Google has described the V8 Sandbox as a lightweight, in-process solution that is tailored to mitigate common V8-related vulnerabilities. The rationale behind this approach is that while typical memory-corruption bugs can be addressed using techniques like memory safety, the "subtle logic issues" that plague V8 require a more specialized solution.

Containing Memory Corruption Within the Sandbox
Assumptions and Protective Measures The Chromium team explained that the sandbox assumes an attacker can arbitrarily modify any memory within the sandbox, and can also read memory outside of it. The sandbox, therefore, aims to protect the rest of the process from such an attacker, ensuring that any memory corruption is confined within the sandbox. Addressing the Challenges of V8 Vulnerabilities Interestingly, Groß highlighted the challenges of addressing V8 vulnerabilities by switching to a memory-safe language like Rust or relying on hardware-based memory safety approaches. He noted that nearly all V8 vulnerabilities involve memory corruption within the V8 heap, which cannot be adequately protected by traditional techniques.
Implementing the V8 Sandbox
Replacing Data Types and Minimizing Overhead To mitigate this, the V8 Sandbox replaces data types that can access out-of-sandbox memory with "sandbox-compatible" alternatives, effectively preventing an attacker from accessing other parts of the process' memory. Benchmark results indicate that the V8 Sandbox adds an overhead of around 1% on typical workloads, allowing it to be enabled by default starting with Chrome version 123, across various platforms. However, the sandbox does require a 64-bit system due to its need for a large virtual address space. Complementary Security Efforts The announcement also mentioned Google's use of Kernel Address Sanitizer (KASan) to detect memory bugs in native code and harden Android firmware security, with the tool helping to uncover more than 40 bugs. "Using KASan-enabled builds during testing and/or fuzzing can help catch memory corruption vulnerabilities and stability issues before they land on user devices," the Android team said. Read the full article
0 notes
Link
There are several ways which you may use to replace all white space. Learn how to replace all white spaces from a string in JavaScript.
0 notes
Text
Telegram, the popular messenger with 800 million monthly active users worldwide, is inching closer to adopting an ecosystem strategy that is reminiscent of WeChat’s super app approach. Certain aspects of the ecosystem will be decentralized with help from two heavyweights: Telegram’s crypto partner TON Foundation and WeChat’s owner Tencent. Telegram has been working on a platform where third-party developers, from games to restaurants, can build mini apps to interact with users. In Telegram’s own words: “Developers can use JavaScript to create infinitely flexible interfaces that can be launched right inside Telegram — and can completely replace any website.” To build out this super app platform, Telegram relies on a network of infrastructure partners both from the established tech world and the crypto space. Among them is The Open Network (TON) Foundation, which lays the blockchain groundwork for Telegram but operates as an independent organization. This week, TON Foundation announced that it’s forged a partnership with Tencent Cloud, which has “already successfully supported TON validators and plans to expand its services further to help meet TON’s high compute intensity and network bandwidth needs.” Validators, in web3 lingo, are participants that help authenticate transactions in a blockchain network. “For example, Telegram games built on TON can benefit from Tencent Cloud’s enriched gaming solution and reference cases,” the announcement says. “For all projects built on TON, Tencent Cloud will offer, subject to approval, a dedicated amount of cloud credits and product discounts, made available through the Tencent Cloud Startup Program.” Amid slowing growth in China’s tech industry, Tencent has been stepping up its overseas expansion efforts. In recent months, its cloud computing business has been popping up at tech conventions, including crypto conferences. Tencent could potentially reap great rewards from the partnership if Telegram’s mini-app marketplace takes off like its Chinese counterpart. WeChat has pioneered the mini app model in China and now powers millions of them serving functions from payments, food delivery, e-commerce, ride-hailing, to driver’s license renewal, just to name a few. With a decentralized payments network, Telegram’s mini app ecosystem has the potential to reach an even broader spectrum of users around the world. Learning from WeChat’s playbook Even though Tencent Cloud won’t be TON’s exclusive cloud provider according to TechCrunch’s knowledge, it appears that the partners stand to gain from their synergies. “Given the similarities between WeChat mini apps and Telegram mini apps, we believe that mini app developers from WeChat who are currently using Tencent’s cloud service will begin to build on TON,” Justin Hyun, head of growth at TON Foundation, told TechCrunch. It’s unclear how many developers building for WeChat’s China users are able to capture the diverse needs of Telegram’s international community. Creators of mobile games might have the most transferrable skills, given many of them are already marketing in overseas markets. Given Telegram is blocked in China, many developers will have to familiarize themselves with the app before they can devise meaningful applications for the platform. The developers would also need to learn the programming languages of blockchain apps, which might actually be an easier barrier to overcome than the process of understanding the economic incentives that facilitate decentralized applications. A partnership with Tencent, however, could offer insights into enticing people to use a messenger for a whole array of other purposes. Importantly, payment functionality played a critical role in WeChat’s early rise as it instilled a habit among users to make daily transactions through the chat app. While WeChat makes its in-house payments system the default option and turned it into a cash cow for Tencent, Telegram has integrated with 20 payments solutions and takes no commission through its Bot Payments API.
Aside from mature solutions like Google Pay or Apple Pay, Telegram also recently welcomed a self-custodial wallet that is independently developed by The Open Platform (TOP) using the TON blockchain. Having a crypto wallet can potentially bring a wide range of transaction scenarios to regions where centralized online payments aren’t available. It will be fascinating to witness what lessons Telegram and TON take from WeChat and how a mini app platform with a decentralized twist unfolds. Source
0 notes
Note
Please please share some coding/designing wisdom. Your game is so damn pretty 😭😭😭 Could you tell us what template you used and how hard it was to make it look like it is today? I imagine so much work must have gone into it
😭😭 I am no expert, but these are just my rationale/methods behind the visual choices I made!
For the template I used—I used Vahnya's Template! However, this post by @/manonamora-if has a whole section for templates that I wish I saw or checked out before making my IF! In another lifetime, I might've just used nyehilism's template to achieve the bottom sidebar instead of torturing myself learning how to do it... ;;
Below, I go into detail the timeline of designing Uroboros, as well as advice through the process I went!
Design Timeline
I started designing the UI late October 2022, and kept fixing, changing, editing it well into February and maybe a little bit of March 2023.
October 2022 - Early iterations of the design. Looked for stock images and began implementing it to add a background to the sidebar and the actual passages. Swatched some color palettes and began implementing them into the IF. Later decided to make the sidebar on the bottom instead of on the side. Also, added a title screen.
November - Testing different backgrounds for the IF's sidebar. Added a textbox to the passages, also worked on the black fade transitions.
December - Finished working on the sidebar background for both light and dark theme, began work on the background of the IF instead.
January 2023 - Finished working on the dark and light theme backgrounds! Started work on drawing the skill icons for light and dark theme, and finished!
February - Changed the title screen to look better on mobile, created a circle logo, added a border to the textbox. Also, made further edits for light theme.
March - Just remade the "Uroboros" logo.
If you're wondering why it took approximately 5 months to get to the final version—don't worry! I wasn't working only on the design for 5 months. My partner helped make the edits for the design, while I worked on coding them in and writing.
I spent a lot of time trying to get a grasp on Javascript, SugarCube, and HTML all throughout this time as well, to know how to fluidly add these things. Meaning, while I was working on these visual elements, I was also figuring out how to do the "looking" mechanic, black and white transitions, figuring out how Tweego worked, radio buttons, and so on.
Do note I've been busy the entire time throughout, so perhaps you can do this much quicker than I can!
The "Secrets"
1. Please—look at IFs you love! What are some visual aspects of other IFs that you love and want to include in your story? I started by analyzing parts of other IFs that I love. I liked Wayfarer's textbox; I liked how the choices looked in When Twilight Strikes. I liked the textboxes in the beginning of Zorlok. Find the things that amaze you about other IFs, and implement it your own way!
This seems like super basic advice—but trust me, once you think, "How can I put this in my game?" you will not only be able to have it, but most likely, you'll also learn a LOT.
While seeing how I could make the radio buttons, for example, I started researching. I googled "How to live change text?" and then I found out about jQuery, how to use the replace macro, etc. etc. JUST from researching how to do exactly one (1) feature.
2. What is missing in other IFs? Think about your own reading experience. I didn't like the clunkiness of some, how the sidebar is on the side when space on a mobile-screen is severely limited length-wise. So, I put the sidebar on the bottom.
I didn't like how other choices look in IFs, so I wanted a way to do mine that's nice and elegant(though it's still a little hard to read, admittedly).
Again, researching how to do the things you want opens many doors for you. I learned how to style <li> and change how bullets look, learned how to style links in Twine in general, etc. etc. again with just this ONE thing I wanted to change/add.
3. Don't do the work all by yourself. I struggled so hard because I hate asking for help. I was happy to Google other people's problems, but I never thought to open up my own thread or ask anybody in the community for help. Please, not only ask, but also—your work doesn't have to be completely original.
Use templates. Look at manon's amazing masterlist of things you can implement. I also have a few macro's that you can use, like multipronouns for MC, that does the work for you, for free.
Rip people's codes—respectfully. I'm not saying from other IFs, but online in other places. If they appear on help forums or are publicly available through places like CodePen, chances are that they're open-source or licensed in such a way that anyone can use it (e.g. MIT license).
Again, here is Manon's masterlist, which includes custom macros you can use in your game (Chapel, HiEv and Cycy are my high recommendations)! Additionally, here's my code for multipronouns here and my code for setting RO genders here.
4. MAKE IT READABLE!! Even if you want your game to look pretty... please, I'm begging you, make it easy to read. This is the most important thing ever.
I have a short attention span, and so does my partner. We reviewed the game to make sure we are NOT compromising the reading experience with our design. As much as we want fantastical backgrounds, we wanted to make sure it was at least not distracting. As much as we want gaudy styles, we want the actual passage to be suited for the long haul.
The most, most important part is to enhance the reading experience--not by adding things on, but by making it simple and intuitive. As someone in the computer science field, the user experience is CRITICAL. Put yourself in their shoes, think about them first and foremost.
Twine is amazingly customizable, and its powers can be wielded for good and evil. Plenty of amazing writers but inexperienced UI designers, especially from CoG, get into Twine. CoG almost completely takes away the design element, so Twine is a whole new ballpark.
Uroboros has a lot of pomp, but the actual textbox is uncharacteristically simple in comparison. The simplicity against an otherwise fantastical, but non-distracting background helps give it elegance. The sidebar, in contrast, is very eye-catching—but, it's also out of view most of the time, and isn't built for long reading.
To add on, make sure it's readable on mobile. I guarantee 80% of your readers are going to be reading your IF on their phone, and probably at 3 AM, so you will want the mobile to look as good as PC, or even better.
Closing Thoughts
Anyway, as basic as this advice is, this is really what guided my entire thought process behind my visual choices! -- Picking and choosing what you like from IFs, figuring out how to do them through research, and making sure your IF is built to be read for a while.
Thanks so much for asking, thinking that I have wisdom to impart!! 😭🫶💕
#uroboros-if#uroboros#asks#anon#writing reference#writing advice#if resources#twine resources#twine design#twine coding resources#gameplay design
97 notes
·
View notes
Text
My dudes... I don't know if I'm the last one to learn this, but I come bearing good news! Google's Apps Script is amazing and makes Spreadsheets & Slides so much more powerful!
Tumblr is hardly the best platform to talk about code on but this was a game changer! As a minor helper on @renegadepublishing's yearly exchange, my scripts let me keep up with the growing quantity of entries and while I only figured it out at the end of this year's labors, it will be so very, very, very helpful for next year's.
Will tuck further ravings under the cut but the short of it is that it (A) let me programmatically pull deets from AO3 to enrich final report and (B) let me programmatically fill the results slide show with data.
Coherently flowing prose often fail me when shifting to a technical discussion, so to break down the work:
this was all in JavaScript. I obviously love Kotlin more these days, but it felt painless/rather accessible being in JS
the primary 'key' passed around for the entries (when participents submitted updates and final entries) tended to just be the fic URL (plus gifter/giftee names) - a good UUID but carries no meta info
almost (tho not all) of the entries were hosted on AO3 which made programatic scraping possible
we definitely needed the author & fic name... which required visiting the page. And once you're on the page, why not grab more details? In the end we wound up scraping: title, author, last update, word count, fandom, rating. And while there's more one could collect, we lacked the space to visually display it along with the results. Remember-- the point is the typesetting!
Apps Script let you make URL requests [getContent]
I used the Cheerio library to process the page's contents and let me comb through it using jQuery. Link goes to GitHub page, which has the Script ID you'll need to import it in the Libraries section.
I found the Google Sheets APIs easy enough to read/work with -- just lots of arrays, really. Also, the quotas that you get seem generous to me (for a free product)
AO3 specific note : had to append "?view_adult=true" to the URLs if I wanted to bypass that check screen, but I also had to handle locked fic, which keep you at a reduced info lock screen. Be sure to test E rated & locked fic when drafting your script (Incognito Window is your friend)
Here is the Gist of the pictured script-- it was a 'round 2' edit where I went back and pulled Rating & Locked status : [LINK]
The above refers mostly to the Sheets side of things. The other most magical feature was the population of Slides w/ sheet data!
Notes as follows:
images are my current weakness-- had to go in later and adjust/layout/upload images manually. SUPER LAME. Next time I'm going to dig into pulling images from the drive...
I was able to embed links programmatically into the slides but it was VERY HACKY code. The generation of the PDF links was still a manual task, and while I imagine I could script that, sounds hairy (I want to avoid all things Auth)
The {{name_pattern}} was/is only a stylistic choice. Doing a find & replace on something so distinct is safest tho.
I did not use Alt Text on my things but I think going forward, it would be how I'd ID/address the non-string replacement actions (finding the right shape to anchor a URL link on was finicky the way I did it)
Here is my (very messy!) script for populating the slides: [LINK]
For next time:
using a script to pull tags/fandoms/pairings will make the gifter/giftee pairing process sooooo much smoother (so far it's been very manual!! Bless @aetherseer's tenacity!)
I need to figure out image imports/population of the slides... ignoring any aspect ratio/size issues
27 notes
·
View notes
Note
Achievement anon here! Sorry I wasn't more specific 😵💫😵💫
I suppose both? I just wanna know how to configure achievements as well as how to notify the player with a pop up that they've achieved it, if that makes sense!
Welcome back anon!
Alright!
Notification:
I already partly explained how to code notifications in this ask.
Notifications are not a built-in feature of Sugarcube but a macro created by Chapel. You will need to add both JavaScript and CSS code in the JScript window and Stylesheet respectively. Chapel also provides an explanation on how to use the macro and its different elements.
When all is added to the correct place, you just need to include the macro code in the passage you want to appear:
<<notify 3s>>Notification Text<</notify>>
I advise you to put it at the end of the passage. It will still trigger as if you would put it at the top, but it won't give you a weird space between the top of the passage and the first line of text.
In the ask I mentioned above, I also provided you with 2 different ways to put it in the settings to give the player an option to toggle it off.
Achievements:
Lucky you, I finished writing how to create achievements for the ChoiceScript to Sugarcube guide. There are 2 main ways of coding achievements: variables or save directly in the metadata.
I will provide you will the code on how to set it. The code can be nested in a <<button>> or a <<link>> or coded inside a <<widget>>.
Variable Achievements:
Basic way: you create variables and put the achievements in there. It can be a basic variable, an object or an array.
<<set $achiv1 to true>> <<set $achiv.one to true>> <<set $achiv.push("one")>>
2 ( object.{} ) and 3 ( array.[] ) need to be set in an earlier passage, preferably in StoryInit:
<<set $achiv to {}>> <<set $achiv to []>>
If you have an Achievement page, you can check if the achievement has been earned with a simple <<if>> macro:
<<if $achiv1 is true>>Achievement One Earned<</if>> <<if $achiv.one is true>>Achievement One Earned<</if>> <<if $achiv.includes("one")>>Achievement One Earned<</if>>
Note: you can also use the setup.variable as well instead of $variable.
MetaData Achievements:
If you don't want to create another variable, you can save the achievements directly in the metadata. Note: I have not personally used those, but I USE THEM NOW ! DON'T USE THEM ANYMORE ! I know they work (they are from either the documentation or TME (SG format creator)'s answers on the Twine forums).
Use Memorize/Recall:
<<run memorize("achiv1", true)>> <<if recall("achiv1") is true>>Achievement One Earned<</if>>
Use State.metadata:
<<run State.metadata.set("achiv1", true)>> <<if State.metadata.get("achiv1") == true>>Achievement One Earned<</if>>
First line should be in the passage you want to trigger the achievement, second line in the Achievement passage.
Note: when storing something in the Metadata, it won't be saved properly in the savefile but in your cache. This means that restarting the game will not change the state of those achievements.
Notifying the Player:
In the passage you want to trigger the notification, you just need to use the basic Notification code I mentioned in the first part.
You can also wrap the Notification code in a conditional statement if players who did not earn this achievement also go through the same passage. In that case, you can take the examples above, and just replace the text in between the <<if>> macro.
An example from Exquisite Cadaver (this is in a widget) that I use 2 out of 3 passages:
<<if setup.achievement.double isnot true>> <<if $MCnoun1 eq $MCnoun2 or $MCad1 eq $MCad2>> <<if settings.notifications>> <<notify 6s>>Are you even trying?<</notify>> <</if>> <<set setup.achievement.double to true>> <</if>> <</if>>
(I need to edit my settings so I don't need the notify <<;if>>)
If this achievement has not been earned before AND the player wrote the same word in both the first and second turn AND the player has not turned off the notification, they will get notified. The achievement will be earned if they fulfil both first conditions.
I hope this helps!
7 notes
·
View notes
Photo










May was pretty eventful and looooong. I felt like the days were dragging or maybe it was because of the two-week off time I got before I started working with my new employer. So during the 2-week break, I was planning on creating more mugs, but unfortunately, I was not feeling it. I was too lazy to do pottery and I honestly forgot what I did during that break. Anyway, here are the highlights and lowlights of May:
May 1 - Finally had my physical medical examination after years of not getting one. It was one of the pre-employment requirements I had to do. The results were all good.
May 11 - My Oppo F1S phone gave up one me. It was my phone for 4 years. It was a gift from Asis on my 24th birthday.
May 12 - My work equipment came. Didn’t expect the monitors to be that big, so I had to adjust and arrange everything on my table. But the wires and cables! Oh my, it was such a struggle. Asis even bought these adhesive wire cable management clips to somewhat organize all the tangled messy wire/cables. Also, I was amazed with the Nuc CPU that the company provided. It was so compact and it was my first time using/seeing one. Receiving the equipment made me excited to work! I will no longer use my own personal laptop with work-related stuff. I now have more memory space!
May 15 - Asis bought me a new phone (Samsung S20 FE). Well technically, we both bought it since he only paid almost 70% percent of the total. Hahaha! We also bought stuff needed for our home. Also, we had to buy a new fan and AC for our room because the heat was just crazy even at night.
May 17 - First day at my new work! The first weeks were just full of meetings and watching training videos on PluralSight. I still didn’t have any tasks to do so I learned the basics of Javascript, ReactJS, and Gatsby JS. I also had a hard time adjusting to my new working hours. I will never get used to getting up before 6. (⁎˃ᆺ˂)
Highlights and lowlights of June:
June 1 - Experienced the worst cramps ever. I was having cold sweat and was writhing in pain for god knows how long. I was even ready to go to the hospital. I already drank a pain reliever but the pain was too much. My partner told me to wait for a while and see if it will subside. It actually did after a little while and after I drank another pain reliever that tito Ed (Asis' father) bought for me. He even bought me Pocari Sweat drinks and fruits. I was really grateful for them. I don’t wanna ever feel that pain again. It was really terrifying. (⊃д⊂)
June 3 - Received a milk tea from my team member, Ferly. Pawelcome drink daw. :)
June 2 & 5 - My niece received her 2 sets of storybooks. This is one of the incentives of our company. A small gift to all the employees every month. For this month it was to bring out the inner child in us or we can share it with our kids, nephews, or nieces. Our options were coloring books with pens, DIY resin art, paint by numbers, story books, and board games. So yea, I wanted to give something to my niece so I had to choose story books.
June 11 - Got our first dose! We got Gamaleya Sputnik V. The side effects for me were malaise, muscle pain, and headache, while my partner also felt all these, and also chills and high fever. // I also won the Avatar game in our company. The prize was a feast for my family.
June 17 - I stupidly broke my laptop screen. I have to connect it to a monitor if I want to use it. I still have no plans yet to buy a screen replacement. This monitor setup will do for now.
June 19 - My brother’s birthday
June 20 - Went home to my parents’ place after 2 months. We celebrated my brother’s birthday and also father’s day. I used the feast prize I got from work for this day.
I also got my printed film photos from @tinyprintroom. The quality of the paper used was really nice! ♡
Highlights and lowlights of July:
July 1 - Met up with my BFF Kaye, and Darrel. Ate at Mister Kabab because we were craving their food for so long now, and also went to High Grounds Café.
July 5 - Got this month’s incentives. For this month, it was to channel our inner zen. Our choices were plant growing kit, self-care/pamper kit, humidifier with essential oils, scented candles, and back massager. I chose the self-care/pamper kit. I got this Katinko pain and itch relieving ointment set.
July 13 - Cultural Event for the Proptech Hub Manila, and also a get together before our team lead leaves the company--he and his family are about to migrate to Canada next month. I was scared to join, to be honest, since I’m always paranoid that I might catch COVID, but I took the risk. Our company arranged a VIP room with 2 bowling lanes and a buffet in Studio 300. It was really nice to meet the team. Had a fun time! // I also received the company’s ergonomic chair gift! It was so nice and comfy. I love the teal color. No more back pain while working. I'm truly grateful to be a part of the EG family. The bosses are so giving and all my teammates and colleagues are really nice.
July 17 - Got our second dose! The side effects are still the same for me and Asis, but I felt more body heaviness and pain for this last shot.
Mama found my stuff--Holga camera, GoPro dome, handwritten letters, memorabilia, pressed flowers, and many other important things. I thought I lost all these when we were moving places years ago. Glad I got it back!
I sold 2 of my ceramic mug works. I was really happy that people on Instagram still bought the pieces even though they all have cracks inside. I know they can’t use it as a drinking vessel but it can be a table décor! Grateful for their supports! (•‾⌣‾•)و ̑̑♡
I’m also grateful that most of my family members are now vaccinated. ( ̄▽ ̄)ノ
8 notes
·
View notes
Text
It seems that there are people here who think that WebP is a copyright protection measure, and… that’s honestly just hilarious to me, sorry.
Okay, to clarify what it actually is: It’s just another image format, like JPEG, PNG and (non-animated) GIF. All these formats date back to the late 1980s/early 1990s, and by modern standards, they all suck. Research has moved on, and we now know much more effective ways to compress images that take up much less space and bandwidth and look just the same. It hasn’t ever been a super-pressing issue, since bandwidth has moved on as well, but still, there’s a lot of data being sent that wouldn’t need to be if we had better image compression formats. Then we could use that bandwidth for, uh… I guess more invasive tracking javascript and their way too large ball of dependencies.
Anyway, most of that research was in video codecs, so WebP is (in the “like JPEG” mode) basically a single still frame from a WebM video, and it’s pushed heavily by Google. Apple pushes HEIC, which is the same general principle but instead based on H265 (aka newer M4V files). Modern versions of iOS and Android (and Windows and macOS) support both.
Since these formats are still fairly fresh, yeah, a lot of things don’t know what to do with them. Many image editors can’t open them directly yet, many websites that allow you to upload an image have never heard of them, the works.
But that is a side-effect that will vanish as more tools gain support for these newer formats, not the goal. It’s actually really interesting to see parts of the basic building blocks of the web be replaced like that. But it’s also a change that hasn’t actually been communicated to the non-techy public in any way, so I can definitely understand that people come to this conclusion.
2 notes
·
View notes
Text
Going Serverless: how to run your first AWS Lambda function in the cloud
A decade ago, cloud servers abstracted away physical servers. And now, “Serverless” is abstracting away cloud servers.
Technically, the servers are still there. You just don’t need to manage them anymore.
Another advantage of going serverless is that you no longer need to keep a server running all the time. The “server” suddenly appears when you need it, then disappears when you’re done with it. Now you can think in terms of functions instead of servers, and all your business logic can now live within these functions.
In the case of AWS Lambda Functions, this is called a trigger. Lambda Functions can be triggered in different ways: an HTTP request, a new document upload to S3, a scheduled Job, an AWS Kinesis data stream, or a notification from AWS Simple Notification Service (SNS).
In this tutorial, I’ll show you how to set up your own Lambda Function and, as a bonus, show you how to set up a REST API all in the AWS Cloud, while writing minimal code.
Note that the Pros and Cons of Serverless depend on your specific use case. So in this article, I’m not going to tell you whether Serverless is right for your particular application — I’m just going to show you how to use it.
First, you’ll need an AWS account. If you don’t have one yet, start by opening a free AWS account here. AWS has a free tier that’s more than enough for what you will need for this tutorial.
We’ll be writing the function isPalindrome, which checks whether a passed string is a palindrome or not.
Above is an example implementation in JavaScript. Here is the link for gist on Github.
A palindrome is a word, phrase, or sequence that reads the same backward as forward, for the sake of simplicity we will limit the function to words only.
As we can see in the snippet above, we take the string, split it, reverse it and then join it. if the string and its reverse are equal the string is a Palindrome otherwise the string is not a Palindrome.
Creating the isPalindrome Lambda Function
In this step we will be heading to the AWS Console to create the Lambda Function:
In the AWS Console go to Lambda.
And then press “Get Started Now.”
For runtime select Node.js 6.10 and then press “Blank Function.”
Skip this step and press “Next.”
For Name type in isPalindrome, for description type in a description of your new Lambda Function, or leave it blank.
As you can see in the gist above a Lambda function is just a function we are exporting as a module, in this case, named handler. The function takes three parameters: event, context and a callback function.
The callback will run when the Lambda function is done and will return a response or an error message.For the Blank Lambda blueprint response is hard-coded as the string ‘Hello from Lambda’. For this tutorial since there will be no error handling, you will just use Null. We will look closely at the event parameter in the next few slides.
Scroll down. For Role choose “Create new Role from template”, and for Role name use isPalindromeRole or any name, you like.
For Policy templates, choose “Simple Microservice” permissions.
For Memory, 128 megabytes is more than enough for our simple function.
As for the 3 second timeout, this means that — should the function not return within 3 seconds — AWS will shut it down and return an error. Three seconds is also more than enough.
Leave the rest of the advanced settings unchanged.
Press “Create function.”
Congratulations — you’ve created your first Lambda Function. To test it press “Test.”
As you can see, your Lambda Function returns the hard-coded response of “Hello from Lambda.”
Now add the code from isPalindrome.js to your Lambda Function, but instead of return result use callback(null, result). Then add a hard-coded string value of abcd on line 3 and press “Test.”
The Lambda Function should return “abcd is not a Palindrome.”
For the hard-coded string value of “racecar”, The Lambda Function returns “racecar is a Palindrome.”
So far, the Lambda Function we created is behaving as expected.
In the next steps, I’ll show you how to trigger it and pass it a string argument using an HTTP request.
If you’ve built REST APIs from scratch before using a tool like Express.js, the snippet above should make sense to you. You first create a server, and then define all your routes one-by-one.
In this section, I’ll show you how to do the same thing using the AWS API Gateway.
Creating the API Gateway
Go to your AWS Console and press “API Gateway.”
And then press “Get Started.”
In Create new API dashboard select “New API.”
For API name, use “palindromeAPI.” For description, type in a description of your new API or just leave it blank.
Our API will be a simple one, and will only have one GET method that will be used to communicate with the Lambda Function.
In the Actions menu, select “Create Method.” A small sub-menu will appear. Go ahead and select GET, and click on the checkmark to the right.
For Integration type, select Lambda Function.
Then press “OK.”
In the GET — Method Execution screen press “Integration Request.”
For Integration type, make sure Lambda Function is selected.
For request body passthrough, select “When there are no templates defined” and then for Content-Type enter “application/json”.
In the blank space add the JSON object shown below. This JSON object defines the parameter “string” that will allow us to pass through string values to the Lambda Function using an HTTP GET request. This is similar to using req.params in Express.js.
In the next steps, we’ll look at how to pass the string value to the Lambda Function, and how to access the passed value from within the function.
The API is now ready to be deployed. In the Actions menu click “Deploy API.”
For Deployment Stage select “[New Stage]”.
And for Stage name use “prod” (which is short for “production”).
The API is now deployed, and the invoke URL will be used to communicate via HTTP request with Lambda. If you recall, in addition to a callback, Lambda takes two parameters: event and context.
To send a string value to Lambda you take your function’s invoke URL and add to it ?string=someValue and then the passed value can be accessed from within the function using event.string.
Modify code by removing the hard-coded string value and replacing it with event.string as shown below.
Now in the browser take your function’s invoke URL and add ?string=abcd to test your function via the browser.
As you can see Lambda replies that abcd is not a Palindrome. Now do the same for racecar.
If you prefer you can use Postman as well to test your new isPalindrome Lambda Function. Postman is a great tool for testing your API endpoints, you can learn more about it here.
To verify it works, here’s a Palindrome:
And here’s a non-palindrome:
Congratulations — you have just set up and deployed your own Lambda Function!
Thanks for reading!
5 notes
·
View notes
Note
how did you add text to your askbox on desktop?
Hi there! Hopefully all of this makes sense! 💖
here is the code you need:
<p><iframe frameborder="0" scrolling="no" width="100%" height="190" src="http://www.tumblr.com/ask_form/URL.tumblr.com" style="background-color:transparent; overflow:hidden;" id="ask_form"></iframe><!--[if IE]><script type="text/javascript">document.getElementById('ask_form').allowTransparency=true;</script><![endif]--></p>
First you need to enable your ask box. Then, you’ll go to your customize page and add a page, or edit your existing faq page. I went ahead and created a faq page and formatted it how I wanted, but I believe it has to be a standard page, not a custom one.
Then, click the <html> button to switch the page from standard to html, and paste the code above where you want, whether you want it to occur before the text (like mine) or beneath it. If it’s been done correctly, the text will show up as green and purple text. Change the part that says “URL” to your url - for example:
“http://www.tumblr.com/ask_form/URL.tumblr.com” → “http://www.tumblr.com/ask_form/gallickingun.tumblr.com”
Once you’ve changed your URL, you’ll need to switch it back to standard layout by pressing the <html> button again. Then click Update Preview - you should get an error message, but save anyway. Save and exit, and log back in again. You should see the updated ask box in there!
If you get error messages, start by making sure your ask box is enabled, and that you’ve typed your url correctly. Also remember that you’ll need to update your URL in the code if you ever make a URL switch.
Now you’ll need to update your theme most likely. So, if you can’t directly update your ask link from the sidebar of the theme page, you’ll need to edit the html code. Just go in to edit your theme, and do Ctrl+F and search for “/ask”, and change all instances of this to “/[insertpagenamehere]”. For me it’s /questions so I have changed all instances of this within my actual theme code. You can do Ctrl+F TWICE and it will give you the option to replace all! This is what I did to make it easier, although there should only be one or two instances of the /ask reference within your theme code.
Here is a photo of my /questions page for reference!
The above photo is what the <html> version looks like - note the blue highlighted <html> box on the righthand side. Notice I wanted the ask box to be above my text, so I have made sure it is the first thing I posted so far as code/text goes.
The above picture here shows what the page looks like without the <html> option selected. The white space is where the ask box will show once you save and exit the page.
As always, if you have any questions, send them to me!
12 notes
·
View notes
Text
Plans for nengi.js 2.0
Hi, this is Alex, the people’s network programmer and developer of nengi.js. Let’s talk about the future.
I consider nengi 1.x to be complete. Of course there are always unfinished items of work -- I wish I had a comprehensive tutorial series on prediction for example -- but really things have been stable and good for a long time.
So as I look towards 2.0, there are no fundamental changes to the library in mind. Instead the future is about improvement, making things easier, and staying open to deeper integrations with other libraries and possibly even with other languages.
One area of intended improvement is the whole process around forming connections both on the client and the server.
On the clientside, client.readNetwork() or equivalent is invoked every frame as the mechanism that pumps the network data into the application. However, this pump also controls the network data related to the connection -- meaning that without spinning the game loop one cannot finish trading the data back and forth that completes the handshake. I’d like to redo this such that we end up with a more normal api, e.g. client.connect(address, successCb, failCb) or equivalent. This presents a clean flow with no ambiguity as to when a connection is open. It’ll also let the clientside of games be a bit tidier as they don’t need to spin the network in anticipation of a connection opening.
On the serverside the whole .on(‘connect’, () =>{}) warrants a redo. I have in mind a simpler api where a ‘connectionAttempt’ occurs, and then the user code gets to invoke instance.acceptConnection(client, greeting) or instance.denyConnection(client, reason) thus again providing a nice and clean exact line after which we know what state the connection is in (attempted => connected, or attempted => denied).
Another area is Typescript support and some positive side-effects thereof. Nengi has minimal typescript definitions, but I think the actual surface of each api class/function should be rewritten in actual typescript. This will be limited, as the actual inner workings of nengi are truly untyped -- it has its own crazy typesystem and fancy optimization of high speed iteration based on object shapes that I should stop talking about now before I accidentally write a dissertation.
Per adding Typescript support there will be a major benefit to Typescript and JavaScript developers alike which is the opportunity for some top tier intellisense. The nengi api is small and having some modest documentation pop up right as you type things like .addEntity would be awesome.
The other benefit (ish..) of formally supporting Typescript is that a few of the processes around how to integrate game logic and nengi could finally be strictly addressed. I used to favor a very laissez-faire approach to integration as I didn’t want to stifle anyone’s style… but as time has gone by it seems that the level at which nengi can be decoupled is not seen as powerful, and instead it just confuses people. I want a better newbie experience, and presenting things like “well you can kinda do anything” isn’t helpful. I wouldn’t necessarily limit nengi itself, and instead may supply this functionality as a layer, but I would like to suggest a much stricter boilerplate for topics such as associating game data with a connected client and any other spot where game and network get glued together.
On that note of making things less open ended, I am *considering* whether nengi should offer an Entity and Message etc as part of the api. Currently entity is a concept or an implied interface -- really it is any object. Too decoupled? Maybe something more explicit would be nice. We’ll see.
More advanced protocols/schemas are also needed in the future. There are a bunch of features that can easily come from having more options on the protocols, but initially I plan to skip over all of these features and just change the api in a hopefully future-proof manner. The plan here is to change things from protocol = { x: Int, y: Int, name: String } to something more like context.defineSchema({ x: Int, y: Int, name: String }). Initially these will do the same thing, but in the future more arguments will be added to defineSchema.
The eventual removal of types from nengiConfig is another dream feature that may or may not make 2.0 but is worth a bit of discussion. NengiConfig.js is that file where every entity, message, command etc is listed out. Removing this would require nengi to be able to explain *in binary* how to *read future binary* and is non-trivial. The benefit however is that the parallel building of client and server code would no longer be a strict requirement. In the end of course a client and server need to be built for one another, but if the relationship were less strict than it is now it may pave the way for eventual nengi clients that aren’t even JavaScript. To me this has always been a bad joke -- who would want such a thing??? But as the years have passed it has become clear that nengi is not just special for being JavaScript, but that it is actually competitive in performance and functionality with the type of technology coming out of AAA multiplayer gaming companies (send money!!). So this may not be a bad direction (though it is worth noting there are at least two other major changes needed on this path).
There would also need to be changes to the current ‘semver’-ish release cycle. As it stands currently nengi version numbers follow the rules of breaking changes on major release (1.0.0) non-breaking changes on minor release(0.1.0) and small patches on patch release (0.0.1). As the current version of nengi is 1.18.0 that means that I’ve managed to add all functionality since release without a single breaking change (send money?!). This is not easy. These new changes described above are deliberately breaking api changes. Given the work cycle that I’m on and the lack of funding, the most efficient way for me to work would be with breaking changes allowed and perhaps a changelog to help the users out. So 2.0.0+ may shift to this type of development, where the ‘2’ is just my arbitrary name for the functionality, and 2.1.0 is a potentially breaking change. Obviously no one has to join me over in the land of nengi 2 until it becomes more stable, but letting me do *whatever* will get everything done faster, which is more important than ever given my limited time.
In the category of “maybe 2.0 things” here are a bunch of other things I’d like to talk about too, but they’re too involved (and experimental) of topics to go into detail. Here’s a vague summary of things I’ve put R&D time into:
Experimentally rewrites of sections of nengi in Rust, C, C++ with integrations via n-API, wasm transpilation, and some in-memory efforts. Crossing the boundary between JavaScript and anything else has been problematic as a means of solving most obvious problems, but some less-than-obvious problems may yet warrant this approach. I would say that n-API is a dead end for most nengi functionality but has some merit for spreading sockets across threads. WASM, or specifically working on a continuous block of memory may have some promise but requires further R&D.
An advanced rewrite of the nengi culler based on spatial chunking (promising!).
A middle api between serving up interpolated snapshots and the nengi client hooks api. This would become a generic replacement for the entire nengi clientside api. Until further typescript support I’m going to leave this one alone as it is very likely that a naturally elegant solution will show itself in the near future.
Multithreaded nengi, specifically the spreading of open connections across threads and the computation of snapshots. True optimal CPU use is opening multiple instances, not giving more threads to an instance, but there are some uses nonetheless.
Multi-area servers that use spatial queries instead of instances or channels (for example creating multiple zones, but not making an instance or channel per zone, instead the client.view just goes to a different space with some spatial math).
So yeah, that’s the plan! Thanks for your support (send money)
https://github.com/sponsors/timetocode
https://www.patreon.com/timetocode
2 notes
·
View notes