#proc-macros
Explore tagged Tumblr posts
lizclipse · 1 year ago
Text
been making a little rpc library to try and simplify doing network things because http sucks ass and websockets are just tubes. i have it generating code for clients and just as i get the http stuff working, i find that the rust crate jsonrpsee has a lot of what i wanted in the first place, but doesn't have any sort of compatibility with any other web framework, which is needed if you dont want to uploads files using base64 like a jackass
so now i have a dilemma. i could keep working on my home-grown solution that i have, which plays really nicely with other frameworks and allows any sort of encoding (like you could use some binary encoding instead of being forced to use json) and will let me expand in interesting ways in the future
or, i could switch to a big, tested, existing library that is built on industry standards and write my own integration to make it work on the web framework i want it on
the latter means less code/effort (i think), but the former gives me me a lot more options and lets me write stuff my own way (i could even make my rpc library support jsonrpc as a transport tbh). i'm genuinely stuck on this now, as both paths seem really even to me
1 note · View note
ntrlily · 2 years ago
Text
if ur lactose intolerant.... rember ur lactase... my final message before i go back to bed
0 notes
chryza · 3 months ago
Text
FFXIV resources I take for granted but apparently a lot of people don’t know exist
The Balance: Community of math wizards who calculate your optimal openers and gear melds, then publish the information for everyone.
Lulus Tools for Ocean Voyage: Detailed information about upcoming ocean fishing voyages including baits, int procs, weather conditions, and more
Garland Tools | Database: Allows you to look up anything in the game, where you get it, and how to use it. Additionally allows you to make interactive crafting checklists that show materials needed. Best for simple solo crafting.
Garland Tools | Bell: Lists all special gathering nodes, where to find them, what time they’re up, what level you need to be at, with customizable notifications
Teamcraft: hub for various crafting tools including rotation planner, crafting checklists, crafting commissions, and more. Best for social crafting.
Eorzea Collection: Glamour hub, lists armor sets and has a gallery of user submitted glams
FFXIV Gardening: Database of seeds, cross breeding pairs, and a planner for your garden.
FFXIV Collect: create an account and manage your collections of mounts, orchestrion rolls, minions, and more.
MogTalk: Official host for world first races for Savage and Ultimates.
Gillionaire Girls: Crafting Levelling guides and Macro resources for DoH
Lulus Chocobo Color Calculator: creates a list of feeds to dye your chocobo new colors.
Sightseeing Log Helper: simple tracker to complete the early sightseeing logs, which are kind of bullshit.
1K notes · View notes
pickles4nickles · 1 year ago
Text
Tumblr media
So I’ve been watching playthroughs of Yakuza games for a while now, but when I saw that the newest game takes place in Hawai’i, the place where I was born, raised, and have lived in for nearly 30 years now, I knew that this was something I had to have first-hand experience with and not let some guy tell me how to feel about it, to put it bluntly.
I went on a month and a half long journey to finish this game, so I sat around for a bit like
Jesus Christ I should write a review on it.
So if you’d like to read about 5k words on what I thought about The Video Game™, here you go.
Overall, Like a Dragon: Infinite Wealth is a really really good game. However, as Hawai’i local it was kind of hard for me to turn my brain off to some of the cultural inaccuracies and as someone who tends to play smaller indie games, I clocked in about 110 hours on this and I burned out a little towards the end.
GAMEPLAY
Let’s get into Gameplay first because I think I have the most positive thoughts about it. If you haven’t heard my thoughts about Pokemon lately, it mostly boils down to “It’s the only RPG I’ve really been playing in recent years and the gameplay has been very watered down and I yearn for a decent PvE experience.” This game definitely scratched that itch in more ways than one.
Infinite Wealth’s turn-based combat system revolves around positioning. Some moves have an AoE of either a straight line or a circle. Positioning a character next to an ally will proc a combo move with them and positioning them near items will proc an item attack where you can beat a guy to death with a traffic cone or something.
The job system is robust. Every character starts off with a default class- Ichiban’s is Hero, an all-rounder that can pretty much do anything; characters like Nanba and Eric (I know the game calls him Tomi or Tomizawa, but I’m not the game and “Fuckin’ Eric” sounds way better than “Fuckin’ Tomi”) are magic-oriented, so they’re basically wizards by default. You can change their class to other jobs (Desperado is my favorite because it’s basically gun mage), which unlocks new skills as you level them up. You can also change jobs as much as you want and skills carry over between them, so there’s a bit of moveset mixing and matching that makes my brain feel good.
Ryu Ga Gotoku Studio, (the Yakuza devs, which we’re just gonna abbreviate to RGG from here on out) have always been REALLY good at asset reuse (again, I cast a dirty look to Game Freak). They’ll make a whole-ass map of a region and reuse that same map for several games down the line. Not only do you spend a significant time in Ijincho again and not only do you go to Kamurocho for little bit… AGAIN, but there are two… what I can only call “macro” games that have the best asset reuse I’ve seen in, like, maybe anything ever.
DONDOKO ISLAND
Like A Dragon: Infinite Wealth comes with a whole-ass Animal Crossing clone that’s also kind of The Sims called Dondoko Island. In this, you rehab an island that’s being used as a dump for some trash pirates (no, seriously, they’re actually pirates, yar har and everything) back into a five star resort. There’s a whole-ass crafting system where you go around the island, harvesting resources, to build furniture and facilities, which include whole-ass buildings which have appeared in past Yakuza games. The crafting system is GREATLY improved over Animal Crossing: New Horizon in that you can skip the goddamn animation and craft multiple of the same items at once. You don’t even have to have all the materials in your inventory, it’ll take it from your storage. Placing items in the world is also in an overhead view and the only grievance I have with the system is that placing paths is really weird and you can only place a limited number of them. But overall, Nintendo, was it really that hard to put into the video game. Why did you make AC:NH disrespect my time in that way?
Once the island has been cleaned up enough, you can start inviting guests over, which all have their own set of preferences for the vibe of your island (rustic, pop, sleazy, etc), their lodging quality, and how much of the island’s flora and fauna (and minerals, I guess??) you’ve discovered.
I really really liked Dondoko Island because who am I to say no to a management mini/macro game with decoration elements. I mostly really appreciate that it doesn’t waste your time. I wanna say I finished it in like less than 20 hours… which is not short for a game within a game (actually, that’s insane for a game within a game), but for a game of this genre, it’s pretty short.
There’s also an entire separate mini-island that further helps you with efficiently running your island by passively collecting resources over time and just being a general stockpile of bugs and fish to catch. But I can’t talk about this part without talking about…
SUJIMON
A returning character voiced by Keith Silverstein in the English dub – yes, that Keith Silverstein, who voices Masayoshi Shido of Persona 5 and Zhongli of The Genshin Impact™ is a professor who documents the behavior of weird and often hostile middle aged men, called Sujimon. When Ichiban goes to Hawai’i, he asks him to also document the native Sujimon there as there’s a prominent Sujimon scene there. Mans wasn’t kidding as there is an underground, more or less ilicit Sujimon fight club called The Sujimon League with its own Elite Four called The Discrete Four.
In the previous game, Sujimon was just your bestiary (literally called the Sujidex), but now it’s a whole-ass game, which I can mostly only describe as simplified Yokai Watch, but a glorified card game. Just so we’re not here for forever talking about middle-aged men cockfights… because I can talk about the mechanics and inner workings of middle-aged men cockfights for a hot minute, Sujimon League basically operates on a 3v3, with an additional bench of 3, rock-paper-scissors kind of system. You’ll need strong Sujimon to get through this macro game and you’ll recruit new guys through four ways- through random fights on the map, through literal Pokemon GO raids, through a gacha system, and through combining Sujimon of the same type into stronger Sujimon (don’t think too hard about that one). I had a LOT of fun with this and, again, it scratched an itch I’ve had for a while. Almost all of the Sujimon are just guys you’ll fight in-game, so, again, an excellent use of asset reuse.
Sujimon smoothly integrates into Dondoko Island in a way that makes Palworld look even more balls-less than it already is. You know that little island I was talking about a few paragraphs back? That’s Dondoko Farm. You can put your Sujimon to work on it! As you’re running around on Dondoko Island, letting it consume your life, your Sujimon will grow crops, scrounge around for resources, and earn some cash for you. The island also has some resources to help with Sujimon League by leveling them up with a small investment of some dondoko bucks and your time, but also a Pokemon-Amie type mini-mini game that helps strengthen the friendship of your current Sujimon team.
Yes.
This game lets you pet-
The sweaty, weirdo middle-aged men.
Don’t think about it too hard.
Especially don’t think about it too hard when you have a Sujimon on your team that uses Xander Mobus’ voice clips.
Anyway, there’s also another minigame called Sicko Snap, which is basically Pokemon Snap with Sujimon. It’s a good one, too.
STORY
I guess… the best way I’d explain my feelings on Infinite Wealth’s story is
Objectively, this is an okay story. Like, it’s par for the course for a Yakuza game. I have a lot of personal grievances with this plot which I’ll fully unsheathe my blade for in the next section, but for now I’ll just say… this game is basically Hawaii Five-O crammed into a Yakuza game and that was an emotional rollercoaster ride that I’m not sure I enjoyed.
Like a Dragon’s main theme is “Even if you hit rock bottom, it’s never too late to get back up again” and that’s something I hold near and dear to my heart.
They have used this theme to my benefit and to my dismay as this also apparently means it’s never too late for ~*Romance*~ which, sure, yeah, okay, true, but did it have to be Ichiban and Saeko?
I’m trying to give the game the benefit of the doubt because… to me, it’s mostly one-sided (as in, like, Saeko’s willing to give him a chance, but isn’t as crazy for Ichiban as he is for her) and, like, dude is allowed to have a crush. But from what I have seen… because I never got around to finishing her Drink Link (I was gonna but I’m like really burned out on the game), they kinda strap C4 to the Bechdel Test and raze a village to the ground with it when it comes to Saeko’s character arc because most of her dialogue and interactions are about The Incident with Ichiban, which sucks because she had more character than just a romance interest for the protagonist in the previous game. If you’re also REALLY not into this plot point like I am, the story DOES NOT let you forget that this indeed happened as it seems to be a plot thread that might continue into the next game as well.
Needless to say, I don’t ship it, and I don’t get to block tags and just walk away from this one.
The game also kinda keeps nudging at, “Hehe, Chitose’s pretty cute too, right?” to which I say
Yes I understand she’s of legal age but she’s only like 21 AT MOST and Ichiban’s like 40-something you stop with that.
It doesn’t feel like Ichiban really had a character arc in this… unless you count “proposing on the first date” to “saying I love you on a redo and then being weird about it again” as character growth. He went to Hawai’i, had some shenanigans, found mom, got backstabbed again, fought the cult (which I’ll be really salty about in the next section), went back home to help Eiji’s character arc. This isn’t a bad thing, it’s just… Ichiban went on another adventure. And it was ok. I think maybe the game was sizing him up to, again, take Kiryu’s place and be The Hero, but… we already did that already? And I’m not even sure if the game was able to complete that message by the end of the game.
Kiryu probably got the most character development out of this game and talking this over with my friend Andrew, he brought up that it kinda wasn’t fair that this is supposed to be Ichiban’s game, but he had to share half of it with Kiryu. And I agree. His sections were also really hard to get into if you haven’t been a longtime fan. Again, I have a decent amount of Yakuza knowledge, but with Kiryu’s memories, a LOT of it went over my head.  It seems like RGG’s been trying to retire him as a protagonist for like three games now and MAYBE this time they’ll actually do it after this victory lap they’ve given him. But he did learn that “my friends are my power” and “never ever give up, you still have time to do better.” And you know what, that’s rad.
As far as the villains go, just, I dunno, they’re fine? Ebina and Eiji are very “okay bitch, stay mad, then,” and it’s. Fine? My only complaint is that Ebina’s arc felt like it was under-seasoned before they put it in the oven to cook and they could’ve peppered it on a little earlier in the game or something. Bryce’s entire deal I may have taken a little too personally, but that’s for later. Dwight was literally just Danny Trejo doing a villain role and I have absolutely no qualms with it. He was fun to watch.
The supporting cast was fun as always. Eric I hated at first, but he grew on me in the same way that, like, I’d bully a friend. Chitose I also kinda hated at first, was very sus of, but then she had a character arc that was pretty good. The Yokohama gang didn’t really have character arcs to them, but they were still fun to hang out with nonetheless. We got to learn a little bit more about Seonhee and she’s really fun. Both her and Zhao, who is my favorite for several reasons, are really really fun characters as they are both crime bosses (former, in Zhao’s case) who are BIG FUCKING WEIRDOS and I love them for it.
Joongi Han becomes a party member WAY too late in my opinion that, in a way, he’s technically an optional party member, or at least like getting a Dratini right before the Pokemon League in Gold/Silver/Crystal. He had some fun character moments, but felt kinda like an afterthought.
But also, ain’t no way he got his Hawai’i clothes at Hilo Hattie. There’s no way.
To wrap up my thoughts on the main story, I’d just like to say: the plot point that they sailed to Japan on a little tugboat in a handful of hours as opposed to WEEKS is peak Hawaii Five-O vibes and it infuriates me, but everyone kept telling me “it’s okay, the coast guard picked them up, like, halfway” and I will sit down and not start a fistfight over it. And just. That was the vibe of the game for me. Just… alternating between a J-Drama and Hawaii Five-O.
I don’t really have much to say about the substories except that they’re either almost Oscar-worthy material or they’re a snoozefest that I just tabbed through. I can really only think of three substories off the top of my head that were EXCELLENT, though - Nancy and Olivia, the artificial snow quest (THIS ONE IS EMOTIONAL WHIPLASH), and the traveling aquarium one. The rest I mostly just tabbed through because they were just……. Eh. But I think I’m okay with that since we have Sujimon and Dondoko to make up for it.
THE CULTURAL GRIEVANCES
So as I type this section out, I run my hands over my face to remind myself and say
This is a game that takes place in Hawai’i from a Japanese perspective, written primarily for a Japanese audience and I assume that certain things may come from a place of ignorance, but not maliciousness.
Hey Tumblr.
I want you to read that first bolded sentence again.
Because I know how you guys are with reading comprehension.
But that being said, as a Hawai’i-born Chinese person, there’s quite a lot about the Hawai’i cultural aspects of this game that I have problems with. If you wanna see me roast this game, you can stick around, but if not… Here is your chance to bail.
I’ve tried my best to write this in a way where I look at the thing that pissed me off and ask myself,  “Am I taking this too seriously or do I actually have a problem with it?” and write more or less objectively, but some of it might still come off as overly caustic. Just. I tried.
And after a deep breath,
Ho brah,
We go.
WHAT IS HAWAIIAN CULTURE, ANYWAY?
To start off, I’m not sure if RGG knows the difference between being a Hawai’i local and actually being of Hawaiian blood…? The game mentions at the very beginning that Akane is half-Japanese… and half-Hawaiian, which makes Ichiban one-fourth Hawaiian, which makes ME kinda… squint. Like, we’d need to know more about Akane’s backstory, but if you know anything about indigenous cultures, finding someone who’s half native is HARD nowadays. Akane also looks pretty light skinned for someone who’s allegedly half-Japanese, half-Hawaiian but that’s just my tiny nitpick?
I’m also… not sure what kinda research RGG did on Hawaiian last names because some of the ones I see on random enemies are kinda… 
Who is that
What is that
I have never seen anyone named that in my entire life
Sure, my worldview is a little shut in, but, no, what IS that?
Mililani is not a last name, that’s a neighborhood, why’s she Lani Mililani?
WHAT IS THAT?
The pidgin in the game is also there, but… small kine hit or miss. For those of you who don’t know, pidgin is Hawai’i’s creole, which came from a bunch of cultures who don’t speak the same language eventually falling into a kitbashed language system that works for everyone. Looking at the VA listing in the credits, they did hire some local people (they have Hawaiian names) and some of the VO performances work really well like Obispo in the restaurant side story and the cab driver dialogue that ONLY comes up in the Japanese audio version of the game for some reason. Others… are… hm (I don’t know what’s going on with Jeff the taco truck guy). I feel like the voice director got the intonation on the line reads down pretty well, but on the localization side, the syntax and grammar are a little off. Pidgin tends to come off as “broken english,” but it’s technically not since it’s its own language system with its own rules. So you have a lot of line reads that are in the right inflection, but the way it’s written is wrong for pidgin dialogue.
And it just doesn’t sound 100% right to me.
There’s also some… small pronunciation nitpicks that I have. Ukulele is pronounced the white way - it’s not Yooka-Laylee like the Chameleon and Bat, it’s ook-oo-leh-leh like Tapu Lele, the Pokemon. Some characters pronounce Hawai’i as huh-why and not ha-wuh-ee, which is more right (it’s SUPPOSED to be ha-vai-ee but I’m not native Hawaiian and this is kind of an axolotl situation so, y’know).
But shout-outs to the “Whatchu lookin’ at?” line guy.
Because that one is just, no notes, perfect.
NOTHING CAN BE NORMAL, I GUESS
Something that rubbed me the wrong way in this game is the mystification of a culture that’s foreign to you, that is, taking a culture that’s not yours and describing or representing it in such a way that it sounds so deviant and hard to comprehend compared to the one you’re used to. Think of that one tweet where someone describes hamburgers like a white person would describe asian fruit.
There's the lei substory where the girl needs to make a lei with blue plumerias (which does not exist by the way) because there’s an urban legend that if you give a blue plumeria lei to someone, it’s a way of confessing your true love. Lei are just… things you give as, like, a “congrats!” kind of a thing. Or if you wanna be touristy about it, a “welcome!” kind of gift. There’s nothing mystical about it, most grocery stores stock a few that you can just pick up, grab and go style. 
The entire game mechanic of “shaka to make friends” was so?? Like maybe after 8 hours into the Hawai’i map, I was like, okay, I’ll just… fine. I’ll accept it. But my god did I not appreciate it when Kson came up to me and was like “what’s a motherfucker gotta do around here to make some friends” and told me how FRIENDLY the Hawaiian people were and how you can just throw a shaka to make friends; while me, probably the saltiest, introverted Hawai’i local that throws stink-eye at tourists who can’t watch where they’re going, playing the video game on that day was like, “We don’t fucking do that, hello??” I don’t even know why we shaka?? Most people you ask that question will just be like “idk it’s the local thing, they do it at the end of the 5pm news on KHON2.”
There’s a substory in this game with a character named Nathan, but we were all calling him racist Alpharad because he kinda looks like him (ALPHARAD HIMSELF IS NOT RACIST OR IN THIS GAME I WANNA CLARIFY THAT) and he’s basically, like… a weeb. He’s recording what seems like a PBS special on Japanese tourists in Hawai’i, but he’s kind of a shitter about it. He makes Ichiban choose between local foods and cold-ass rice and becomes upset when he chooses kalua pork over the rice since it wasn’t The Japanese Option. It escalates to making Ichiban play darts with shuriken and when he loses, he tells him to “live up to his dishonor,” slides him a knife and board, and asks him if he wants to take a finger or hara-kiri. To which Ichiban goes “dude, I get you like Japanese culture, but you can’t treat people this way”
To which I look back at the game like
You clearly understand how this feels, so why are you doing this to Hawaiian culture?
Again, I understand that a lot of this game was written with maybe just ignorance, and not malice, and this isn’t really a call-out post to RGG or anything, but BOY…
Okay.
Now we get to my biggest gripe with this game.
PALEKANA CAN SUCK MY NUTS
I’m kinda disappointed in their choice to use a Hawaiian cult as a plot point. It’s not quite a native savages kind of a vibe, but… In the year of our lord 2024, I thought we would know better than to portray an indigenous religion as a bloodthirsty cult? I also don’t like how they’re conflating the Hawaiian religion with what’s more like a Christian/Catholic cult in this.
Palekana is portrayed as “cultists who worship a goddess who lives in a mystical land, forbidden only to her chosen and maybe one day we’ll be worthy of her blessings.” Hawaiian religion is… not… like that at all? They did get the part about “giving back to the community” correct as a part of Hawaiian culture is mālama ‘aina, meaning, you need to care for the land you live on, which is… reasonable? I guess the other basic idea of Hawaiian religion is that certain places, things, and times that are important, and you shouldn’t touch it unless you wanna fuck around and find out. But the game just kinda wildly overboils this.
Like, I don’t claim to be an expert, I’ve only scraped the basics from what I learned in school (a year’s worth of Hawaiiana lessons in middle school, a semester’s worth in college; went to a private Catholic school, took two world religion classes in college), but Palekana has a very Catholic European religion kind vibe instead of a Hawaiian one. And I really, really don’t like that the game conflates the two. The Palekana cultists wear hoods, which is a distinctly European thing (it’s too hot for hoods here!). The beaded necklaces also seem more like rosaries, which, again, very Catholic. The idea that a god-figure will save you is also a VERY Catholic idea. I’m also assuming the goddess Nele that they use in the game is an expy for Pele, which… okay, like, you can do that with locations. Ala Moana Shopping Center represented as Anaconda Mall in the game hurts me a lot, but… to change up the name of the most prominent deity in Hawaiian religion is like
Dude, I’m not Hawaiian, but I know better than to shit on Pele?
Maybe I’m taking this a little too seriously, but it comes off as a little(??) disrespectful.
To give them the benefit of the doubt, maybe RGG wrote this plot point in this way to be like, well, they’re the villains, so we’ll write them so hyperbolically evil and wrong so people won’t mistake that for the actual culture? But my gut reaction is that they’re only writing from what they’ve seen in the movies and they wanted to make a story like that.
This was my least favorite part of the plot because not only does the cult aspect feel like it’s in bad taste, but it’s SO MUCH of the story and you REALLY can’t get away from it.
Alright. So now that I’ve aired that out of my system, I’m finally capping off this section with the part of the game that hit the closest to me and that is
CHINESE IN HAWAI’I
Listen. Again.
This is a story about Hawai’i, written by a Japanese team, for a Japanese audience.
Yakuza is a series that often talks about the racial conflict between the Japanese, Chinese, and Koreans. And I don’t expect them to portray any of these groups in anything more than a neutral light in this game about Gang Crime.
But ohhhhh my gooooood did they get the Chinatown section so wroooooooong.
Right off the bat, the big glaring problem I have with this game is. All the guys speak Mandarin. I think they might just be reusing voice clips from Yakuza 7, which, sure, fine, I understand that video games are hard to make and expensive.
In Hawai’i, like, real-world Hawai’i, not the bizzaro Hawai’i this game takes place in, we’re definitely starting to see more Mandarin-speaking immigrants show up, but most of the town speaks Cantonese.
Most of the people here a generation or two above me come from Guangdong or Hong Kong, which are Cantonese-speaking areas. It’s an entirely different dialect that’s really only been represented in small bits in media I’m familiar with, like in Jackie Chan Adventures (the uncle’s chant is basically “no more ghosts, get out of here” in Cantonese) and Digimon Tamers (“Moumentai” is “it’s okay/don’t worry about it” in Cantonese), and it seems really hard to get VAs that speak it, so I’m not… really that mad about it.
BUT. Then there’s Wong Tou.
Wong is the Cantonese pronunciation of 黄 , Huang or Hwang in Mandarin.
So like… clearly they knew?? But?? Decided not to go all in on it??
(And then Daniel Dae Kim is his face model and I just??? Bro’s Korean, hello?????)
And then there’s the name of Wong Tou’s gang. The Ganzhe.
Which is a stupid name.
The Chinese dictionary gives me 甘蔗 which translates to sugarcane, which. I get it. The plantation times. The Chinese and the Japanese and the Filipinos and the Portuguese and whatever all used to work on the cane plantations.
…But you’re out here calling your BIG KNIFE GANG “Sugarcane??”
My guy, you could start a reggae band with that name instead.
SPEAKING OF REGGAE-
No one knows how to pronounce Ganzhe properly besides Eric’s VA apparently? All the other VAs pronounce the gan closer to “van” when it’s supposed to be more like a “gone.”
Yes. That’s right.
Ganzhe is pronounced more like ganja.
You know.
The Marajuanas™
I’m a Hawai’i-born Chinese, first-generation local on my mom’s side and third-gen local on my dad’s. I grew up in Chinatown, so this was a section of the game that was near and dear to my heart. So I THINK and HOPE you’d understand my frustration to see that work needed to be done on the representation of my culture in this game. It was definitely a little fun to see my hometown modeled in this game- they got Maunakea Marketplace and Keikaulike Mall down pretty accurately and some of the motifs on the buildings made me do a double take because they were so familiar to me. BUT, man, this cultural aspect of the game needed A LOT of work.
SO TO FINALLY CLOSE THIS OUT
Japanese people love Hawai'i a lot.
I think Japanese people love Hawai'i more than Hawai'i locals do.
But as for portraying it accurately, I understand that no one can do it as well as a local islander can. Did I personally think they did the best they could?
………………ehh
Like, if you turn your brain off, it's fine??
If you turn your brain off and not let Palekana get to you, this game is fine.
It can be a little campy.
It can be a little Hollywood.
It can be a little Disneyland.
And despite my four pages of bitching about it, at the end of the day. It is fine.
So with that, I’ve hit like ten full pages on this Google Doc. Despite half of this review being me complaining about what they got wrong about Hawai’i culture in this game, I liked it a lot! When the game didn't have me strapped down for an episode of a J-drama or Hawaii Five-O, I liked running around town, fighting guys, making other guys fight other guys, and managing a resort island. If anything, this game actually motivated me a little to make more local-themed stuff, because as I notice people getting older, there’s less and less people to correctly preserve highly specific culture stuff like this. So a lot of that responsibility falls on me, y’know?
Thank you for making it to the end of this review! I know it was a lot. I don’t know what happened. I do recommend this game, but I ask that you do NOT finish the game with the takeaway that you have learned everything there is to know about Hawai’i.
I’ll fight you with a lawn chair (in Minecraft, for the FBI agent reading this) if you do that.
Other than that, I think you’ll have a lot of fun but also take your time because this game is, like, a 100 hour commitment. Not Persona 5 Royal long, but a commitment nonetheless.
52 notes · View notes
hydropotato · 4 months ago
Text
The big 200!
Tumblr media
200 days of Warframe! That's genuinely wild to me. I guess since I do have autism, I could call it my hyperfixation. But really, it's just a great game. So chock-full of things to do, lots of replayable content.
I really think this game deserves recognition. I've not played it all these years, only really heard it now and then. As somebody who has played a huge variety of games, Warframe has really been an eye-opener. It's not perfect, but I don't think any of us can confidently say any game this massive is perfect.
A certain FPS changed their business model drastically to demand money from their players to get cosmetics, with free content being far more limited. A certain gacha game kept me farming for items to improve my characters, with so many stages of RNG and no way to guarantee good stats. Warframe doesn't make those glaring mistakes. Want cosmetics? There's lots to obtain for free, and the premium currency is obtainable via trading with other players for stuff they might want. Want a good build? Stat bonuses come from mods; each is individually configurable, and mods are obtained from doing missions which grants loads of other resources. I absolutely love the fact that you can play the game for the sake of playing, and you get rewarded, as compared to playing and playing just to get a reward.
Also,
Tumblr media
I made a second account! Yep, I like this game that much. I gave my 2nd account Xaku Prime just to get things started, but moving forward I'm hoping to have it be a sort of loot/defence complement. Think a Nekros with Desecrate, while my main runs Hydroid or Khora. Not botting, no macros, just having two games open at my desk. And I'd keep this in closed lobbies so that others don't have to deal with me taking turns between the two accounts.
but also, having game knowledge really helps. I managed to complete the Endurance trial with Xaku using Fast Deflection, Vigilante Vigor, and Arcane Aegis.This trial requires you to stand in the centre of a ring of lasers beaming at you. If you survive, you get this special Exilus mod that increases max energy and parkour velocity. Real handy. Basically, my shield gating and shield regenerating was consistent and rapid enough to negate the laser damage. Did not actually think it would work that well.
Back to my main:
Tumblr media Tumblr media
Made a silly little Kitgun. You see, it's named after Eleanor because her kit inflicts Radiation procs as well... and uhm, nothing else... definitelynotthefreakytentaclesandthefactthatifshehadagockitwouldprobablybetentacular,NotToBeAHomestuckOrAnythingbutyouknow..
anywhosers. It's a genuinely strong gun as well! Super fun. Its damage ramp-up doesn't really require kills too heavily which makes it comfortable to play with.
Anyways, to celebrate 200 days of Warframe, DE released the Rhino Heirloom skin! No, they didn't. Well they did release it, but they didn't know it was my day 200. Maybe.
Tumblr media Tumblr media
The first one was because,, yeah I mean it's my default when I don't know what colour scheme to use. I'm trans, I might as well use it. It's also a cute colour scheme anyways.
The second one was a little more up my alley. Sleek, and the Citrine Noble Animation makes him look kinda sassy. Honestly, his Heirloom skin has so many bells and whistles that it's hard to add attachments to it, which isn't that bad since it's rather complete on its own. Also, I really like purple and black.
Also, I need to get screenshots of Belly of the Beast's mission. Or footage. Cos I absolutely adore the interactions between Ordis and Parvos Granum. My favourite has got to be Parvos asking Ordis is he longs to join the Operator in the bloodbath and slaughter going on through the mission. Ordis replies that Parvos has been in the void for a very long time, and to seek medical attention. Basically "take your meds, Grandpa". Love that.
I think I'll conclude this post for now. I've played Warframe for 100 days, and then 200 days. I wouldn't be surprised if day 300 arrived before I myself had realised that many days had passed. It really is a great game to pass time. It doesn't demand that you stay in the house, it simply leaves some aromatic kibble at the door for you to snack on (assuming, within this metaphor, that you are a stray cat or dog). I'm definitely playing this game more.
P.S. Thinking of being casual... They really need to rework Wukong. Make his playstyle less hasty. People are playing him to minimise playing the game. That feels like a waste to me.
9 notes · View notes
gettinbetterworkblr · 5 months ago
Text
thsre has to be a way to make this work. there HAS to be. i can't have to write out over 100 fucking proc freqs. i can't. it doesn't make sense. why would i not be able to write a macro to just do it
4 notes · View notes
this-week-in-rust · 5 months ago
Text
This Week in Rust 582
Hello and welcome to another issue of This Week in Rust! Rust is a programming language empowering everyone to build reliable and efficient software. This is a weekly summary of its progress and community. Want something mentioned? Tag us at @ThisWeekInRust on X (formerly Twitter) or @ThisWeekinRust on mastodon.social, or send us a pull request. Want to get involved? We love contributions.
This Week in Rust is openly developed on GitHub and archives can be viewed at this-week-in-rust.org. If you find any errors in this week's issue, please submit a PR.
Want TWIR in your inbox? Subscribe here.
Updates from Rust Community
Official
Announcing Rust 1.84.0
This Month in Our Test Infra: December 2024
Foundation
Announcing Rust Global 2025: London
Newsletters
This Month in Rust OSDev: December 2024
Rust Trends Issue #57
Project/Tooling Updates
cargo.nvim - A Neovim plugin for Rust's Cargo commands
Context-Generic Programming Updates: v0.3.0 Release and New Chapters
The RTen machine learning runtime - a 2024 retrospective
Observations/Thoughts
The gen auto-trait problem
Async Rust is about concurrency, not (just) performance
The Emotional Appeal of Rust
[audio] Brave with Anton Lazarev
[audio] Lychee with Matthias Endler
Rust Walkthroughs
Creating an embedded device driver in Rust
Const Evaluation in Rust For Hex Strings Validation
Concurrent and parallel future execution in Rust
[video] Intro to Embassy: embedded development with async Rust
[video] Comprehending Proc Macros
[video] CppCon - C++/Rust Interop: Using Bridges in Practice
Miscellaneous
December 2024 Rust Jobs Report
Tracing Large Memory Allocations in Rust with BPFtrace
On LLMs and Code Optimization
Nand2Tetris - Project 7 (VM Translator Part 1)
Crate of the Week
This week's crate is vidyut, a Sanskrit toolkit containing functionality about meter, segmentation, inflections, etc.
Thanks to Arun Prasad for the self-suggestion!
Please submit your suggestions and votes for next week!
Calls for Testing
An important step for RFC implementation is for people to experiment with the implementation and give feedback, especially before stabilization. The following RFCs would benefit from user testing before moving forward:
RFCs
No calls for testing were issued this week.
Rust
Tracking issue for RFC 3695: Allow boolean literals as cfg predicates
Testing steps
Rustup
No calls for testing were issued this week.
If you are a feature implementer and would like your RFC to appear on the above list, add the new call-for-testing label to your RFC along with a comment providing testing instructions and/or guidance on which aspect(s) of the feature need testing.
RFCs
Rust
Rustup
If you are a feature implementer and would like your RFC to appear on the above list, add the new call-for-testing label to your RFC along with a comment providing testing instructions and/or guidance on which aspect(s) of the feature need testing.
Call for Participation; projects and speakers
CFP - Projects
Always wanted to contribute to open-source projects but did not know where to start? Every week we highlight some tasks from the Rust community for you to pick and get started!
Some of these tasks may also have mentors available, visit the task page for more information.
rama - see if improvements can/have-to be made to rama's http open telemetry layer support
rama – add rama to TechEmpower's FrameworkBenchmark
rama – add rama server benchmark to sharkbench
If you are a Rust project owner and are looking for contributors, please submit tasks here or through a PR to TWiR or by reaching out on X (formerly Twitter) or Mastodon!
CFP - Events
Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.
Rust Week (Rust NL) | Closes on 2024-01-19 | Utrecht, NL | Event on 2025-05-13 & 2025-05-14
Rust Summit | Rolling deadline | Belgrade, RS | Event on 2025-06-07
If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a PR to TWiR or by reaching out on X (formerly Twitter) or Mastodon!
Updates from the Rust Project
469 pull requests were merged in the last week
add new {x86_64,i686}-win7-windows-gnu targets
arm: add unstable soft-float target feature
-Zrandomize-layout harder. Foo<T> != Foo<U>
best_blame_constraint: Blame better constraints when the region graph has cycles from invariance or 'static
mir_transform: implement #[rustc_force_inline]
run_make_support: add #![warn(unreachable_pub)]
account for identity substituted items in symbol mangling
add -Zmin-function-alignment
add default_field_values entry to unstable book
add a list of symbols for stable standard library crates
add an InstSimplify for repetitive array expressions
add inherent versions of MaybeUninit methods for slices
add missing provenance APIs on NonNull
assert that Instance::try_resolve is only used on body-like things
avoid ICE: Account for for<'a> types when checking for non-structural type in constant as pattern
avoid replacing the definition of CURRENT_RUSTC_VERSION
cleanup suggest_binding_for_closure_capture_self diag in borrowck
condvar: implement wait_timeout for targets without threads
convert typeck constraints in location-sensitive polonius
depth limit const eval query
detect mut arg: &Ty meant to be arg: &mut Ty and provide structured suggestion
do not ICE when encountering predicates from other items in method error reporting
eagerly collect mono items for non-generic closures
ensure that we don't try to access fields on a non-struct pattern type
exhaustively handle expressions in patterns
fix ICE with references to infinite structs in consts
fix cycle error only occurring with -Zdump-mir
fix handling of ZST in win64 ABI on windows-msvc targets
implement const Destruct in old solver
lower Guard Patterns to HIR
make (unstable API) UniqueRc invariant for soundness
make MIR cleanup for functions with impossible predicates into a real MIR pass
make lit_to_mir_constant and lit_to_const infallible
normalize each signature input/output in typeck_with_fallback with its own span
remove a bunch of diagnostic stashing that doesn't do anything
remove allocations from case-insensitive comparison to keywords
remove special-casing for argument patterns in MIR typeck (attempt to fix perf regression of #133858)
reserve x18 register for aarch64 wrs vxworks target
rm unnecessary OpaqueTypeDecl wrapper
suggest Replacing Comma with Semicolon in Incorrect Repeat Expressions
support target specific optimized-compiler-builtins
unify conditional-const error reporting with non-const error reporting
use a post-monomorphization typing env when mangling components that come from impls
use llvm.memset.p0i8.* to initialize all same-bytes arrays
used pthread name functions returning result for FreeBSD and DragonFly
warn about broken simd not only on structs but also enums and unions when we didn't opt in to it
implement trait upcasting
mir-opt: GVN some more transmute cases
miri: add FreeBSD maintainer; test all of Solarish
miri: added Android to epoll and eventfd test targets
miri: adjust the way we build miri-script in RA, to fix proc-macros
miri: illumos: added epoll and eventfd
miri: supported fioclex for ioctl on macos
miri: switched FreeBSD to pthread_setname_np
miri: use deref_poiner_as instead of deref_pointer
proc_macro: Use ToTokens trait in quote macro
add #[inline] to copy_from_slice
impl String::into_chars
initial fs module for uefi
hashbrown: added Allocator template argument for rustc_iter
account for optimization levels other than numbers
cargo: schemas: Fix 'metadata' JSON Schema
cargo: schemas: Fix the [lints] JSON Schema
cargo: perf: cargo-package: match certain path prefix with pathspec
cargo: fix: emit warnings as warnings when learning rust target info
cargo: make "C" explicit in extern "C"
cargo: setup cargo environment for cargo rustc --print
cargo: simplify SourceID Ord/Eq
rustdoc-json: include items in stripped modules in Crate::paths
rustdoc: use import stability marker in display
rustdoc: use stable paths as preferred canonical paths
rustfmt: drop nightly-gating of the --style-edition flag registration
clippy: add new lint unneeded_struct_pattern
clippy: auto-fix slow_vector_initialization in some cases
clippy: do not intersect spans coming from different contexts
clippy: do not look for significant drop inside .await expansion
clippy: do not propose to elide lifetimes if this causes an ambiguity
clippy: do not remove identity mapping if mandatory mutability would be lost
clippy: do not trigger redundant_pub_crate in external macros
clippy: don't emit machine applicable map_flatten lint if there are code comments
clippy: don't suggest to use cloned for Cow in unnecessary_to_owned
clippy: fix type suggestion for manual_is_ascii_check
clippy: improve needless_as_bytes to also detect str::bytes()
clippy: new lint: manual_ok_err
clippy: remove unneeded parentheses in unnecessary_map_or lint output
rust-analyzer: add a new and improved syntax tree view
rust-analyzer: add config setting which allows adding additional include paths to the VFS
rust-analyzer: re-implement rust string highlighting via tool attribute
rust-analyzer: fix JSON project PackageRoot buildfile inclusion
rust-analyzer: do not compute prettify_macro_expansion() unless the "Inline macro" assist has actually been invoked
rust-analyzer: do not offer completions within macro strings
rust-analyzer: fix env/option_env macro check disregarding macro_rules definitions
rust-analyzer: fix ref text edit for binding mode hints
rust-analyzer: fix a bug with missing binding in MBE
rust-analyzer: fix actual token lookup in completion's expand()
rust-analyzer: fix another issue with fixup reversing
rust-analyzer: fix diagnostics not clearing between flychecks
rust-analyzer: make edition per-token, not per-file
rust-analyzer: implement #[rust_analyzer::skip] for bodies
rust-analyzer: implement implicit sized bound inlay hints
rust-analyzer: improve hover module path rendering
Rust Compiler Performance Triage
A quiet week with little change to the actual compiler performance. The biggest compiler regression was quickly recognized and reverted.
Triage done by @rylev. Revision range: 0f1e965f..1ab85fbd
Summary:
(instructions:u) mean range count Regressions ❌ (primary) 0.4% [0.1%, 1.8%] 21 Regressions ❌ (secondary) 0.5% [0.0%, 2.0%] 35 Improvements ✅ (primary) -0.8% [-2.7%, -0.3%] 6 Improvements ✅ (secondary) -10.2% [-27.8%, -0.1%] 13 All ❌✅ (primary) 0.2% [-2.7%, 1.8%] 27
4 Regressions, 3 Improvements, 3 Mixed; 3 of them in rollups 44 artifact comparisons made in total
Full report here
Approved RFCs
Changes to Rust follow the Rust RFC (request for comments) process. These are the RFCs that were approved for implementation this week:
No RFCs were approved this week.
Final Comment Period
Every week, the team announces the 'final comment period' for RFCs and key PRs which are reaching a decision. Express your opinions now.
RFCs
Supertrait item shadowing v2
Tracking Issues & PRs
Rust
remove support for the (unstable) #[start] attribute
fully de-stabilize all custom inner attributes
Uplift clippy::double_neg lint as double_negations
Optimize Seek::stream_len impl for File
[rustdoc] Add sans-serif font setting
Tracking Issue for PathBuf::add_extension and Path::with_added_extension
Make the wasm_c_abi future compat warning a hard error
const-eval: detect more pointers as definitely not-null
Consider fields to be inhabited if they are unstable
disallow repr() on invalid items
Cargo
No Cargo Tracking Issues or PRs entered Final Comment Period this week.
Language Team
No Language Team Proposals entered Final Comment Period this week.
Language Reference
distinct 'static' items never overlap
Unsafe Code Guidelines
No Unsafe Code Guideline Tracking Issues or PRs entered Final Comment Period this week.
New and Updated RFCs
Make trait methods callable in const contexts
RFC: Allow packages to specify a set of supported targets
Upcoming Events
Rusty Events between 2025-01-15 - 2025-02-12 🦀
Virtual
2025-01-15 | Virtual (London, UK) | London Rust Project Group
Meet and greet with project allocations
2025-01-15 | Virtual (Tel Aviv-Yafo, IL) | Code Mavens 🦀 - 🐍 - 🐪
An introduction to WASM in Rust with Márk Tolmács (Virtual, English)
2025-01-15 | Virtual (Vancouver, BC, CA) | Vancouver Rust
Leptos
2025-01-16 | Virtual (Berlin, DE) | OpenTechSchool Berlin + Rust Berlin
Rust Hack and Learn | Mirror: Rust Hack n Learn Meetup
2025-01-16 | Virtual (San Diego, CA, US) | San Diego Rust
San Diego Rust January 2025 Tele-Meetup
2025-01-16 | Virtual and In-Person (Redmond, WA, US) | Seattle Rust User Group
January Meetup
2025-01-17 | Virtual (Jersey City, NJ, US) | Jersey City Classy and Curious Coders Club Cooperative
Rust Coding / Game Dev Fridays Open Mob Session!
2025-01-21 | Virtual (Tel Aviv-Yafo, IL) | Rust 🦀 TLV
Exploring Rust Enums with Yoni Peleg (Virtual, Hebrew)
2025-01-21 | Virtual (Washington, DC, US) | Rust DC
Mid-month Rustful
2025-01-22 | Virtual (Rotterdam, NL) | Bevy Game Development
Bevy Meetup #8
2025-01-23 & 2025-01-24 | Virtual | Mainmatter Rust Workshop
Remote Workshop: Testing for Rust projects – going beyond the basics
2025-01-24 | Virtual (Jersey City, NJ, US) | Jersey City Classy and Curious Coders Club Cooperative
Rust Coding / Game Dev Fridays Open Mob Session!
2025-01-26 | Virtual (Tel Aviv-Yafo, IL) | Rust 🦀 TLV
Rust and embedded programming with Leon Vak (online in Hebrew)
2025-01-27 | Virtual (London, UK) | London Rust Project Group
using traits in Rust for flexibility, mocking/ unit testing, and more
2025-01-28 | Virtual (Dallas, TX, US) | Dallas Rust User Meetup
Last Tuesday
2025-01-30 | Virtual (Berlin, DE) | OpenTechSchool Berlin + Rust Berlin
Rust Hack and Learn | Mirror: Rust Hack n Learn Meetup
2025-01-30 | Virtual (Charlottesville, VA, US) | Charlottesville Rust Meetup
Quantum Computers Can’t Rust-Proof This!
2025-01-30 | Virtual (Tel Aviv-Yafo, IL) | Code Mavens 🦀 - 🐍 - 🐪
Are We Embedded Yet? - Implementing tiny HTTP server on a microcontroller
2025-01-31 | Virtual (Delhi, IN) | Hackathon Raptors Association
Blazingly Fast Rust Hackathon
2025-01-31 | Virtual (Jersey City, NJ, US) | Jersey City Classy and Curious Coders Club Cooperative
Rust Coding / Game Dev Fridays Open Mob Session!
2025-02-01 | Virtual (Kampala, UG) | Rust Circle Kampala
Rust Circle Meetup
2025-02-04 | Virtual (Buffalo, NY, US) | Buffalo Rust Meetup
Buffalo Rust User Group
2025-02-05 | Virtual (Indianapolis, IN, US) | Indy Rust
Indy.rs - with Social Distancing
2025-02-07 | Virtual (Jersey City, NJ, US) | Jersey City Classy and Curious Coders Club Cooperative
Rust Coding / Game Dev Fridays Open Mob Session!
2025-02-11 | Virtual (Dallas, TX, US) | Dallas Rust User Meetup
Second Tuesday
2025-02-11 | Virtual (Tel Aviv-Yafo, IL) | Code Mavens 🦀 - 🐍 - 🐪
Meet Elusion: New DataFrame Library powered by Rust 🦀 with Borivoj Grujicic
Europe
2025-01-16 | Amsterdam, NL | Rust Developers Amsterdam Group
Meetup @ Avalor AI
2025-01-16 | Karlsruhe, DE | Rust Hack & Learn Karlsruhe
Karlsruhe Rust Hack and Learn Meetup bei BlueYonder
2025-01-18 | Stockholm, SE | Stockholm Rust
Ferris' Fika Forum #8
2025-01-21 | Edinburgh, GB | Rust and Friends
Rust and Friends (evening pub)
2025-01-21 | Ghent, BE | Systems Programming Ghent
Tech Talks & Dinner: Insights on Systems Programming Side Projects (in Rust) - Leptos (full-stack Rust with webassembly), Karyon (distributed p2p software in Rust), FunDSP (audio synthesis in Rust)
2025-01-21 | Leipzig, SN, DE | Rust - Modern Systems Programming in Leipzig
Self-Organized Peer-to-Peer Networks using Rust
2025-01-22 | London, GB | Rust London User Group
Rust London's New Years Party & Community Swag Drop
2025-01-22 | Oberursel, DE | Rust Rhein Main
Rust 2024 Edition and Beyond
2025-01-23 | Barcelona, ES | Barcelona Free Software
Why Build a New Browser Engine in Rust?
2025-01-23 | Paris, FR | Rust Paris
Rust meetup #74
2025-01-24 | Edinburgh, GB | Rust and Friends
Rust and Friends (daytime coffee)
2025-01-27 | Prague, CZ | Rust Prague
Rust Meetup Prague (January 2025)
2025-01-28 | Aarhus, DK | Rust Aarhus
Hack Night - Advent of Code
2025-01-28 | Manchester, GB | Rust Manchester
Rust Manchester January Code Night
2025-01-30 | Augsburg, DE | Rust Meetup Augsburg
Rust Meetup #11: Hypermedia-driven development in Rust
2025-01-30 | Berlin, DE | Rust Berlin
Rust and Tell - Title
2025-02-01 | Brussels, BE | FOSDEM 2025
FOSDEM Rust Devroom
2025-02-01 | Nürnberg, DE | Rust Nuremberg
Technikmuseum Sinsheim
2025-02-05 | Oxford, GB | Oxford Rust Meetup Group
Oxford Rust and C++ social
2025-02-12 | Reading, GB | Reading Rust Workshop
Reading Rust Meetup
North America
2025-01-16 | Nashville, TN, US | Music City Rust Developers
Rust Game Development Series 1: Community Introductions
2025-01-16 | Redmond, WA, US | Seattle Rust User Group
January Meetup
2025-01-16 | Spokane, WA, US | Spokane Rust
Spokane Rust Monthly Meetup: Traits and Generics
2025-01-17 | México City, MX | Rust MX
Multithreading y Async en Rust 101 - HolaMundo - Parte 3
2025-01-18 | Boston, MA, US | Boston Rust Meetup
Back Bay Rust Lunch, Jan 18
2025-01-21 | New York, NY, US | Rust NYC
Rust NYC Monthly Meetup
2025-01-21 | San Francisco, CA, US | San Francisco Rust Study Group
Rust Hacking in Person
2025-01-22 | Austin, TX, US | Rust ATX
Rust Lunch - Fareground
2025-01-23 | Mountain View, CA, US | Hacker Dojo
RUST MEETUP at HACKER DOJO | Rust Meetup at Hacker Dojo - Mountain View Rust Meetup Page
2025-01-28 | Boulder, CO, US | Boulder Rust Meetup
From Basics to Advanced: Testing
2025-02-06 | Saint Louis, MO, US | STL Rust
Async, the Future of Futures
Oceania:
2025-02-04 | Auckland, NZ | Rust AKL
Rust AKL: How We Learn Rust
If you are running a Rust event please add it to the calendar to get it mentioned here. Please remember to add a link to the event too. Email the Rust Community Team for access.
Jobs
Please see the latest Who's Hiring thread on r/rust
Quote of the Week
This is a wonderful unsoundness and I am incredibly excited about it :3
– lcnr on github
Thanks to Christoph Grenz for the suggestion!
Please submit quotes and vote for next week!
This Week in Rust is edited by: nellshamrell, llogiq, cdmistman, ericseppanen, extrawurst, U007D, joelmarcey, mariannegoldin, bennyvasquez, bdillo
Email list hosting is sponsored by The Rust Foundation
Discuss on r/rust
2 notes · View notes
greatonlinetrainingsposts · 18 days ago
Text
Why Clinical SAS Training is a Smart Career Move for Life Sciences Graduates in India
In India, life sciences graduates often find themselves at a crossroads after completing their degrees. While the pharmaceutical and biotech industries are growing rapidly, many students are unsure about the right path forward. If you're one of them, Clinical SAS Training could be your ticket to a thriving career in clinical research and data analysis.
Understanding Clinical SAS
Clinical SAS refers to the use of the SAS (Statistical Analysis System) software in clinical trials. SAS is a powerful data analytics tool used extensively by pharmaceutical companies, CROs (Contract Research Organizations), and healthcare providers to analyze and report clinical trial data.
With the growing number of clinical trials being outsourced to India, the demand for skilled Clinical SAS professionals has increased significantly. India has become a hub for clinical research, and companies are looking for trained SAS programmers to ensure high-quality data handling and regulatory compliance.
Growing Job Market in India
According to industry trends, India is among the top destinations for global clinical trials. Cities like Hyderabad, Bangalore, and Pune are witnessing increased hiring of SAS programmers. Clinical SAS training prepares you for roles such as Clinical Data Analyst, SAS Programmer, and Statistical Analyst.
Employers expect professionals who are not only technically sound but also understand the clinical trial lifecycle. A certified Clinical SAS programmer becomes a valuable asset to any company involved in drug development and regulatory submissions.
What You Learn in Clinical SAS Training
A typical Clinical SAS training course will cover:
SAS Base Programming: Learn the fundamentals like data steps, PROC steps, libraries, and datasets.
SAS Advanced Programming: Dive deeper into macros, SQL procedures, and data manipulations.
Clinical Domain Knowledge: Understand the clinical trial process, CDISC standards (SDTM and ADaM), and how data is submitted to regulatory authorities like the FDA.
Hands-On Projects: Many training programs now include real-time case studies and data handling scenarios to simulate on-the-job challenges.
These elements are essential to bridge the gap between academic knowledge and industry expectations.
Certification: A Game-Changer
Although not mandatory, SAS certification (like Base SAS or Clinical Trials Programmer certification) adds significant value to your resume. Recruiters in India often prioritize certified candidates because it assures them of your proficiency and seriousness about the profession.
Many training institutes offer certification support, practice tests, and placement assistance. If you're choosing a course, check if these services are included.
Advantages of Clinical SAS Training in India
Affordable: Compared to other countries, training in India is more cost-effective.
Accessible: With the rise of online learning, students across India—whether in metropolitan areas or small towns—can access high-quality training.
Job-Ready Skills: Most programs focus on practical, hands-on training which aligns well with employer expectations.
Final Thoughts
If you're a life sciences graduate looking to break into the clinical research industry, Clinical SAS training can open up a world of opportunities. The blend of statistical skills and clinical domain expertise makes you highly employable in a competitive market. With India’s growing role in global clinical trials, now is the perfect time to consider this career move.
0 notes
techscaler-solutions · 23 days ago
Text
Master the Future of Analytics at the Top Advanced SAS Training Centre in Pune
In today’s data-driven world, tools like SAS (Statistical Analysis System) play a crucial role in helping professionals turn raw data into actionable insights. From finance and healthcare to retail and manufacturing, SAS is the backbone of smart decision-making. However, the tool alone isn’t enough—mastery is key. That’s where an advanced SAS training centre in Pune can set you apart.
SAS remains a gold standard in the analytics industry due to its robustness, flexibility, and deep statistical capabilities. Even with the rise of newer platforms, organizations continue to rely heavily on SAS for complex data analysis and predictive modeling. By honing your skills through expert guidance, you're not just learning software—you’re learning how to lead in the data age.
Pune: The Data Capital in the Making
It’s no surprise that Pune is fast becoming a hotspot for IT and analytics talent. With its thriving tech ecosystem, proximity to major corporate hubs, and a culture of education, the city is ideal for upskilling in specialized fields like SAS.
Choosing an advanced SAS training centre in Pune means you gain access to world-class mentors, peer learning opportunities, and real-world projects. Unlike online-only courses, Pune’s top institutes offer a hybrid approach, combining theory with hands-on experience—preparing you for the rigors of professional analytics roles.
What Makes an SAS Training Centre Truly “Advanced”?
Not all training centers are created equal. An advanced SAS training centre in Pune focuses on more than just teaching syntax. It immerses students in real business scenarios and advanced concepts like machine learning, clinical trial analysis, and risk modeling.
Look for a curriculum that includes:
Predictive analytics using SAS Enterprise Miner
Data manipulation with advanced PROC SQL and macros
Integration with R and Python for hybrid analytics
Case studies from healthcare, banking, and retail sectors
By covering such expansive topics, these programs help you gain not just proficiency but mastery.
Career Outcomes That Speak for Themselves
Graduating from an advanced SAS training centre in Pune opens doors to a wide array of opportunities. From MNCs to government projects, trained SAS professionals are always in demand. Roles like Data Analyst, Statistical Programmer, and Business Intelligence Consultant await those with proven SAS expertise.
Even better, many Pune-based training centers have strong placement support. Thanks to tie-ups with top firms, students often receive job offers right after course completion. This seamless transition from training to employment is a game-changer in today’s competitive job market.
Making the Right Choice: What to Look For
So, how do you choose the right advanced SAS training centre in Pune? Start with the basics—check for certification programs recognized by SAS Institute. Then, look deeper:
Are the trainers industry experts or just academic professionals?
Is there a capstone project or internship module?
How many hours of practical sessions are included?
What do alumni say about job support and learning experience?
Visit the centres if possible, ask questions, and attend demo sessions. Making an informed decision here will directly influence your career trajectory in the data science world.
Final Thoughts: Your SAS Journey Starts Here
Enrolling in an advanced SAS training centre in Pune could be the smartest move of your career. It’s more than just a course—it’s an investment in a future where data is the new oil and analytics is the engine that powers progress.
0 notes
durgatrainingpune-blog · 9 months ago
Text
"Advanced SAS Techniques: Unlocking the Power of Data Analytics"
Unlocking the power of data analytics with advanced SAS techniques can significantly enhance your analytical capabilities. Here’s how to harness these techniques effectively:
Complex Data Manipulation: Use SAS procedures like PROC SQL and DATA STEP to perform intricate data transformations, merges, and aggregations, allowing you to handle large and complex datasets efficiently.
Advanced Statistical Analysis: Leverage SAS’s robust statistical procedures such as PROC REG for regression analysis, PROC ANOVA for analysis of variance, and PROC LOGISTIC for logistic regression to uncover deep insights and patterns in your data.
Predictive Modelling: Implement predictive modelling techniques using PROC HPFOREST or PROC HPLOGISTIC to develop and validate models that can forecast future trends and behaviours based on historical data.
Custom Reporting: Create customized and dynamic reports with PROC REPORT and PROC TABULATE to present data in meaningful ways that facilitate decision-making.
Automation and Efficiency: Utilize SAS macros to automate repetitive tasks and enhance the efficiency of your data processing and analysis workflows.
Mastering these advanced techniques enables you to unlock the full potential of SAS for sophisticated data analytics and drive impactful business decisions.SAS Online Training Institute, Power BI, Python Pune, India (saspowerbisasonlinetraininginstitute.in)
0 notes
lizclipse · 1 year ago
Text
the thing i find with rust is that things never compile first time (it’s expected so the errors are quite helpful most of the time) but the flow is usually compile to see if you got things right and change if not. however, running first time is downright common, and i love it
3 notes · View notes
0x4468c7a6a728 · 3 months ago
Note
What exactly makes Rust so great? (asking as a newbie who's mostly familiar with C and Python)
i'll answer this purely within the scope of my personal use of it and why i like it
for starters you can basically do any type of programming task in it (although some stuff like gamedev is in pretty early stages and i wouldn't really recommend it unless you really like rust lol), so it's really easy to reach for it instead of another programming language in basically any situation
then the reason i'd pick it over languages is that it's just a really nice programming language to use for too many reasons to list really, it has really good compiler errors, it does nice stuff with memory management, it handles a lot of common stuff like strings really well, it has pretty much the best build system i've used packed in, built in unit testing, good support for functional style code, i love the way it does enums, all sorts of stuff
it's got a bit of a learning curve to start with and probably isn't a great first or even second programming language but once you get used to it it's really quite nice to use
(this isn't to say it doesn't have any problems of course, lack of reflection without hacky proc macro stuff for instance, it just has a lot of really nice stuff)
11 notes · View notes
sanaablog1 · 1 year ago
Text
Assignment 4:
K-means Cluster Analysis in the banking system
Introduction:
A personal equity plan (PEP) was an investment plan introduced in the United Kingdom that encouraged people over the age of 18 to invest in British companies. Participants could invest in shares, authorized unit trusts, or investment trusts and receive both income and capital gains free of tax. The PEP was designed to encourage investment by individuals. Banks engage in data analysis related to Personal Equity Plans (PEPs) for various reasons. They use it to assess the risk associated with these investment plans. By examining historical performance, market trends, and individual investor behavior, banks can make informed decisions about offering PEPs to their clients.
In general, banks analyze PEP-related data to make informed investment decisions, comply with regulations, and tailor their offerings to customer needs. The goal is to provide equitable opportunities for investors while managing risks effectively. 
SAS Code
proc import out=mylib.mydata datafile='/home/u63879373/bank1.csv' dbms=CSV replace;
proc print data=mylib.mydata;
run;
/********************************************************************
DATA MANAGEMENT
*********************************************************************/
data new_clust; set mylib.mydata;
* create a unique identifier to merge cluster assignment variable with
the main data set;
idnum=_n_;
keep idnum age sex region income married children car save_act current_act mortgage pep;
* delete observations with missing data;
 if cmiss(of _all_) then delete;
 run;
ods graphics on;
* Split data randomly into test and training data;
proc surveyselect data=new_clust out=traintest seed = 123
 samprate=0.7 method=srs outall;
run;  
data clus_train;
set traintest;
if selected=1;
run;
data clus_test;
set traintest;
if selected=0;
run;
* standardize the clustering variables to have a mean of 0 and standard deviation of 1;
proc standard data=clus_train out=clustvar mean=0 std=1;
var age sex region income married children car save_act current_act mortgage;
run;
%macro kmean(K);
proc fastclus data=clustvar out=outdata&K. outstat=cluststat&K. maxclusters= &K. maxiter=300;
var age sex region income married children car save_act current_act mortgage;
run;
%mend;
%kmean(1);
%kmean(2);
%kmean(3);
%kmean(4);
%kmean(5);
%kmean(6);
%kmean(7);
%kmean(8);
%kmean(9);
* extract r-square values from each cluster solution and then merge them to plot elbow curve;
data clus1;
set cluststat1;
nclust=1;
if _type_='RSQ';
keep nclust over_all;
run;
data clus2;
set cluststat2;
nclust=2;
if _type_='RSQ';
keep nclust over_all;
run;
data clus3;
set cluststat3;
nclust=3;
if _type_='RSQ';
keep nclust over_all;
run;
data clus4;
set cluststat4;
nclust=4;
if _type_='RSQ';
keep nclust over_all;
run;
data clus5;
set cluststat5;
nclust=5;
if _type_='RSQ';
keep nclust over_all;
run;
data clus6;
set cluststat6;
nclust=6;
if _type_='RSQ';
keep nclust over_all;
run;
data clus7;
set cluststat7;
nclust=7;
if _type_='RSQ';
keep nclust over_all;
run;
data clus8;
set cluststat8;
nclust=8;
if _type_='RSQ';
keep nclust over_all;
run;
data clus9;
set cluststat9;
nclust=9;
if _type_='RSQ';
keep nclust over_all;
run;
data clusrsquare;
set clus1 clus2 clus3 clus4 clus5 clus6 clus7 clus8 clus9;
run;
* plot elbow curve using r-square values;
symbol1 color=blue interpol=join;
proc gplot data=clusrsquare;
 plot over_all*nclust;
 run;
*****************************************************************************
Number of clusters suggested by the elbow curve
*****************************************************************************
*the proposed numbers are: 2,5,7, and 8
* plot clusters for 5 cluster solution;
proc candisc data=outdata5 out=clustcan;
class cluster;
var age sex region income married children car save_act current_act mortgage;
run;
proc sgplot data=clustcan;
scatter y=can2 x=can1 / group=cluster;
run;
* validate clusters on PEP; The categorial target variable
* first merge clustering variable and assignment data with PEP data;
data pep_data;
set clus_train;
keep idnum pep;
run;
proc sort data=outdata5;
by idnum;
run;
proc sort data=pep_data;
by idnum;
run;
data merged;
merge outdata5 pep_data;
by idnum;
run;
proc sort data=merged;
by cluster;
run;
proc means data=merged;
var pep;
by cluster;
run;
proc anova data=merged;
class cluster;
model pep = cluster;
means cluster/tukey;
run;
Dataset
The dataset I used in this assignment contains information about customers in a bank. The Data analysis used will help the bank take know the important features that can affect the PEP of a client from the following features: age, sex, region, income, married, children, car, save_act, current_act and the mortgage.
Id: a unique identification number,
age: age of customer in years (numeric),
income: income of customer (numeric)
sex: 0 for MALE / 1 for FEMALE
married: is the customer married (1 for YES/ 0 for NO)
children: number of children (numeric)
car: does the customer own a car (1 for YES/ 0 for NO)
save_acct: does the customer have a saving account (1 for YES/ 0 for NO)
current_acct: does the customer have a current account (1 for YES/ 0 for NO)
mortgage: does the customer have a mortgage (1 for YES/ 0 for NO)
Figure1: dataset
Tumblr media
K-means Clustering Algorithm
Cluster analysis is an unsupervised learning method used to group or cluster observations into subsets based on the similarity of responses on multiple variables. Observations that have similar response patterns are grouped together to form clusters. The goal is to partition the observations in a data set into a smaller set of clusters and each observation belongs to only one cluster.
Cluster analysis will be used in this assignment to develop individual banks’ customers profiles to target the ones that will benefit from the pep from those who shouldn’t.
With cluster analysis, we want customers within clusters to be more similar to each other than they are to observations in other clusters.
K-means Cluster Analysis
I used the libname statement to call my dataset. All the data is numerical (continues or logical depending on the feature description).
We'll first create a dataset that includes only my clustering variables and the PEP variable which will be used to externally validate the clusters. Then, we will assign each observation a unique identifier so that we can merge the cluster assignment variable back with the main dataset later on.
data new_clust; set mylib.mydata;
idnum=_n_; * create a unique identifier to merge cluster assignment variable with the main data set;
keep age sex region income married children car save_act current_act mortgage pep;
The SURVEYSELECT procedure
ODS graphics is turned on for the SAS to plot graphics. The data set is randomly split into a training data set consisting of 70% of the total observations in the data set, and a test data set consisting of the other 30% of the observations. Data equals, specifies the name of my managed dataset, called new_clust as seen in the figure below.
Figure 2
Tumblr media
Statistics for variables
proc surveyselect data=new_clust out=traintest seed = 123
 samprate=0.7 method=srs outall;
run;  
method = srs specifies that the data are to be split using simple random sampling.
out=traintest to include both the training and test observations in a single output data set that has a new variable called selected.
The selected variable is 1 when an observation belongs to the training data set and 0 when an observation belongs to the test data set.
In cluster analysis, variables with large values contribute more to the distance calculations. Variables measured on different scales should be standardized prior to clustering. So, that the solution is not driven by variables measured on larger scales. We use the following code to standardize the clustering variables to have a mean of zero and a standard deviation of one.
proc standard data=clus_train out=clustvar mean=0 std=1;
var age sex region income married children car save_act current_act mortgage; run;
Figure 3
Tumblr media
The Elbow curve
%macro kmean(K); indicates that the code is part of a Sass macro called knean and the K in parenthesis indicates that the macro will run the procedure code for number of different values of K. the output is then printed and the output data sets for K from 1 to 11 clusters is created.
Figure4
Tumblr media
To view the different R-squared values for each of the k equals 1 to 11, the elbow plot is drawn as shown in the figure 5. We start with the K equals 1 with an R-squared=0 zero because there's no clustering yet. 2 cluster solution accounts for about 13% of the variance. The R-square value increases as more clusters are specified. We are looking for the bend in the elbow that shows where the R-square value might be leveling off. From the graph we can notice that there is a bend at 2 clusters, 5 clusters, 7 clusters, and 10 clusters. To help us figure out which solutions is best, we should further examine the results for the 2, 5, 7, and 10 cluster solutions.
Figure 5
Tumblr media
The Canonical discriminate analysis
We should further examine the results for the 2, 5, 7, and 10 cluster solutions to see whether the clusters overlap or the patterns of means on the clustering variables are unique and meaningful and whether there are significant differences between the clusters on our external validation variable, PEP. We will interpret the result for the 5 cluster solution.
Since we have 10 variables, we will not be able to plot a scatter chart to see whether or not the clusters overlap with each other in terms of their location in the 10-dimensional space. For this, we have to use the canonical discriminate analysis which is a data reduction technique that creates a smaller number of variables that are linear combinations of the 10 clustering variables. Usually, the majority of the variants in the clustering variable will be accounted for by the first couple of canonical variables and those are the variables we can plot.
Figure 6
Tumblr media
Results in Figure 6 show that the 10 variables are now reduced to 4 canonical variables that can be used to visualize the location of the clusters in a two or three dimensional space as shown in Figure 7.
Figure 7
Tumblr media
What this shows is that the observations in cluster 5 is little more spread out, indicating less correlation among the observations and higher within cluster variance. Clusters 2 and 3 are relatively distinct with the exception that some of the observations are closer to each other indicating some overlap with these clusters. The same thing applies to cluster 2 and cluster 4. However, cluster 1 is all over the place. There is some indication of a cluster but the observations are spread out more than the other clusters. This means that the within cluster variance is high as there is less correlation between the observations in this cluster, so we don't really know what's going to happen with that cluster. So, the best cluster solution may have fewer than 5 clusters.
Cluster means table
We will consider for the rest that k=5. We will take a look at the cluster means table to examine the patterns of means on the clustering variables for each cluster which was shown in Figure8.
Figure 8
Tumblr media
The means on the clustering variables show that compared to the other clusters, customers in cluster 2 and 5 have relatively good income, a current and saving accounts with no mortgage while customers in cluster 1 and 3 they have a low income, married and less number of children. Cluster 4 includes customers with a low income, low saving account and a mortgage.
Fit criteria for pep
The last part of this analysis will show how the clusters differ in PEP. We first have to extract the PEP variable from the training data set, then sort both data sets by the unique identifier, ID num which we will use to link the data sets and finally merge it with the data set that includes the cluster assignment variable.
The graph in Figure 9 below shows the mean PEP by cluster. As it was described in the mean table before, customers in cluster 1 and 3 they have a low income, married and less number of children so these customers will be certainly accorded a PEP with 60% while customers in cluster 2 and 5 who have relatively good income, a current and saving accounts with no mortgage will be accorded also a PEP with 40%. However, customers in cluster 4 with a low income, low saving account and a mortgage will be accorded a pep with 25% as this is logic as they already have mortgage.
Figure 9
Tumblr media
The tukey test
The anova procedure is used to test whether there are significant differences between clusters and PEP as follows:
proc anova data=merged;
class cluster;
model pep = cluster;
means cluster/tukey;
run;
The tukey test shows that the clusters differed significantly in mean PEP as shown in figure 10, with the exception of clusters 2 and 3, which did not differ significantly from each other.
Figure 10
Tumblr media
Conclusion
Kmeans is Cluster analysis is an unsupervised learning method used to group or cluster observations into subsets based on the similarity of responses on multiple variables. It is a useful machine learning method that can be applied in any field. However, k-means cluster analysis will have to give us the correct number of clusters and figuring out the correct number clusters that represent the true number of clusters in the population is pretty subjective. Also, if results can change depending on the location of the observations that are randomly chosen as initial centroids. It also assumes that the underlying clusters in the population are spherical, distinct, and are of approximately equal size. As a result, tends to identify clusters with these characteristics. It won't work as well if clusters are elongated or not equal in size.
0 notes
nokarmaunique · 1 year ago
Text
for chillicheff
Hello chillcheff! I have some feedback for you regarding lulu/support. It’s up to you whether you want to read it or to improve. You can ask me a question at any time, and if you disagree with something, you can also let me know and we can go through it together.
your itemisation seemed off during the game. rushing shurelya's might not be ideal for every matchup. Moonstone would have been better in our game together. you can consider dreamweaver and ardent censer instead, especially when you're already following me closely. redemption is good but not always a second item. larger heals/shields from moonstone could have really helped in fights(, but the delay from redemption makes it undesirable). redemption functions better when you have a champ that has multiple hard cc. repositioning with shurelyas is only great in certain scenarios and, again the bonus hp/heal is superior. It is a very matchup dependent item. I understand taking the crown for games against a lot of assassins/burst or strong snowballers. But if you need crown every single game, maybe you are not positioning correctly, and should remember to use q, wards and sweeper to help you clear, and to improve your macro so you can predict enemy movement/positioning. 
you also took guardian, and take that into every matchup. that is not good, because you need to incentivise yourself to poke in lane using aery, as well as the bonus dmg comes from when pix attacks through E. again, this should be matchup based as some champs are obviously inherently stronger in lane e.g. tristana, or versing a super all in jg like jarvan jg and leona supp and thats where you're certain you'd need guardian. The upside to guardian is that as long as you're in range, it procs on 2 champions. 
In that game, i think that aery wouldve been 2x better than guardian, considering. you also took ignite into jhin and lux which are champs that both outrange and out mobilise you, which is terrible because you should never be in range to cast it. The best thing you can do is to take heal/exhaust or even barrier depending on the enemy team comp. ignite kinda sometimes beats those if enemy supp is melee, as well as killable, or versus a soraka. but after the laning phase, it becomes useless and you don't want to take it anyways unless you are certain that in your game, you cannot buy grievous wounds. 
Regarding stats and damage output, enchanters have extremely high damage in the early game. maybe you should consider leveling q first to poke + add pressure/damage for level 2 fight. you can use it to hit the enemy and to hit the wave so that you and your adc can guarantee the lvl 2 first. i think in all scenarios, q works better over e first (obviously, still max E first though).
As I mentioned earlier, enchanters have really high damage in the lane. I would prefer if you would consider tethering a bit more forward. the way you position is useful in the late game where you need to be wary, but in the early game you can really use your damage, e.g. lvl 3, im lulu and i fight the enemy adc, i aa e(them) q, and that's 1/3 of their hp bar which is really good poke, and since they're slowed at 325 with q, you're free to run away.
your roam timer is also off, i'm assuming that you are not familiar with how waves push? because everytime i needed you, you were in another lane when you shouldn't have been. but if you keep an eye on how the wave is, and its general flow, push and pull, you can leave lane safely without sacrificing your lane. theres a lot of videos online on how you can roam as support. it just looks like a bit of weak macro.
also you cast perpetually when your abilities are up, which is not necessarily the worst thing i've seen, but you should be casting on me when i'm starting to poke or already poking them, or trying to clear the wave. i'd prefer you save mana. in a way, because you w/e me, it can enable me to go in, however you should try to focus on when i'm starting the fight, as i will have my cds/hp/mana/summs/wave all in a better spot, and just perpetually spamming them can be detrimental. It can be hard to punish longer ranged adcs. this might be due to a weak reaction time? although i disagree, i think your reaction time is strong, but i'm not sure of the mindset behind spamming. also it's hard to want to poke with aa when you e/w me, as we will do less damage cause you take guardian instead of aery (which again, procs on pix e).
if i were to run lulu in a ranked game, i would go:
heal/flash
Aery: mfb, transcendence, scorch/gs. inspo: boots/biscuits. cosmic
moonstone, lucidity boots, ardent/sfw, locket/redemption/mikaels/shurelyas, situational/wardstone. 
(theres a lot of flexibility on support, so this is not rigid, and again very match up based, and its important to pay attention to the pace/speed of the game as well as everyone's wincons). i feel like, with your playstyle, you will enjoy moonstone/sfw a lot.
1 note · View note
hackernewsrobot · 2 years ago
Text
Practical Procedural Macros in Rust
https://xy2.dev/blog/simple-proc-macro/
0 notes
theskiesareopen · 9 months ago
Text
I got a couple requests to talk more about the metaprogramming and reflection, so that's what this post is about.
To talk about the metaprogramming I first need to build an ontology of compiler architecture to talk about what the metaprogramming features apply to.
The goal of metaprogramming is to save programmers time and cognitive load by making the tools understand the things they want to express while eliminating unnecessary details. To save time they must be modular and fit together well so that importing two libraries at once can't cause a fight in a metaprogram and make code work confusingly. An important design principle in metaprogramming is the principle of least power. Or in other words, you shouldn't have to write a whole compiler for every task, most tasks are better suited to a much smaller approach, which will be more modular, more legible, and more reliable.
So, the ontology is as follows: format, syntax, semantics, evaluation. Please note that this ontology is not intended to be a fully general ontology of language architecture, just of this specific explanation, and some examples I give will not fit in the ontology outside the region I discuss.
Format is the part that takes strings of source code and turns them into a general structured data representing the code. Examples of format metaprogramming are Lisp reader macros and forth parsing words. C macros could start an argument that I don't want to have.
Syntax is the part that takes a structured data of the source code and identifies the programmatic constructs inside. Examples of stuff that works at this layer would be like Rust's proc macros, lean's macro system, or any lisp's macros. These macro systems have some things in common, and we'll see how to build something to get around it later.
Next, semantics. Semantics is inextricably linked to the type system of the language, because it's about the static meanings of the program. Semantics involves assigning meanings to programming constructs, resolving type variables, etc. Some examples of semantic level metaprogramming are Haskell's typeclass metaprogramming, and various proof assistants tactic scripts.
Finally, evaluation. Evaluation concerns the implementation of the semantics to actually perform a computation, building a real object that backs the mathematical meaning with respect to some target. Examples of this kind of metaprogramming are few and far between, and the only good example I know of is haskell's categorifier plugin. Some lisp packages have something kinda like this too, though they have significant shortcomings due to a lack of appropriate structure.
Now that I've set that up, I can talk about features.
I decided not to support format level metaprogramming. It's too unmodular and compromises other desirable properties of the format too much, so I left it out, but made the whole format easily replaceable to permit future development.
Syntax level metaprogramming is provided by a statically typed version of operatives a la the vau calculus. Unlike the previously mentioned syntax macro systems which are source to source, operatives convert the source into computations. In our case this is represented by terms, but in the original paper it was performed by allowing operatives to evaluate directly. With the support of a feature I'll describe later, the only downside to this approach, the loss of having embedded code in a macro that looks like what it generates for readability, can be eliminated, and allow the benefits, like improved hygiene and lack of the "does it evaluate once or twice".
There are a couple connected systems for semantic metaprogramming. The first is a pretty normal trait system almost identical to agda's or lean's, besides the small tweaks required to support subtyping. The more uncommon system is the use of type descriptors. Every type family in the compiler has an accessible representation. For example, the telescopes forming a dependent tuple's type internally are exposed as a family with constructors and such which can be matched on and manipulated. The various type formers take these descriptions and produce a type. This makes it possible to, for example, write a trait that successfully concatenates tuples, by having an implicit parameter of type tuple-desc-type, then taking a tuple formed from that description. Inference will provide the correct description to the argument, and the body of the function can then pattern match on the type description. If the description is static during simplification/monomorphization/compilation, the matching can be constant folded out of existence leaving just static code that operates on the runtime data. There are a few other minor features, but this is already really long. Tactics are not currently supported but we can do a lot of it with a combination of traits and one or two operatives; a full powered tactic system is hopefully to be added in a future version of the language once I get more experience using it practically.
Finally, evaluation level metaprogramming. There is a fully featured effect system in the language, but there is also a second slot in the types, which behaves a lot like an effect, but rather than capturing raised exceptions and IO behavior or whatever, it captures what semantics are necessary to compile the code with respect to a categorical model of the semantics of the programs. Things like does it do an allocation that requires GC, does it assume that mutable arrays are a primitive type, etc. These types allow determining whether or not a specific compiler target supports a given program, for example an FPGA has no heap, no dynamic dispatch, no GC, but it does have lots of arrays and lookup tables. It would be very useful to be able to write high performance code to run on a GPU shader, a digital signal processor chip, etc. In the same source file in the same language with minimal frustration that the proofs, the CPU code, and the networking interfaces (session types!) are written in. This also is what allows recovering the quasiquoting facilities for syntax macros, because we can declare a category "we implement the meanings of this code by constructing terms that means the same thing." This also makes compiler back ends for various targets more maintainable because there's a common interface with rigorously specified semantics that we can formally verify them against, and it permits transporting proofs between different domains with a functor over the compilation categories, for example proving something in a category where the operations that would break an invariant the proof depends on simply don't exist, then transporting that into a proof that the code generated from that proof upholds the invariant in a more complicated setting.
Hi! I've been working on a new dependently typed programming language that's designed to be a Pareto improvement over everything that already exists and it's getting to the point where it's actually usable for practical purposes. I'm really excited about it and want to talk about it so please ask me questions about it!
I've designed a dependently typed language with subtyping and a useful fragment providing universal inference to improve practicality for general purpose scripting and programming. I've been using some original mathematical research to push closer to the impossibility proof boundary than any language has ever gone before, and getting some significant convenience and expressiveness out of it. I'm building a categorical notion of semantics to permit really easy compilation to any target, and hopefully extremely high performance with no UB.
I've developed a new approach to compile time reflection that exposes more of the language to metaprogramming effectively and usefully and safely than prior art, enabling extremely powerful abstractions that don't require syntax macro fuckery. Though just for good measure I developed a new way to approach syntax macros that's nicer too.
I'm integrating a modular effects and coeffects system that should allow better safety and convenience than the rust borrow checker while being a lot more flexible about what it represents and checks, for example one thing I'm excited about are security types, where you can, for example, specify that a piece of data is derived from a user's private data, and that contaminates everything causally linked from that data (except for specific security primitives like a one way hash or a homomorphic computation or whatever) (to the extent that the semantics can represent; making formal proofs of side channels is going to be a very long term project since there are no formal specifications of ISA semantics that capture them and all the hardware instructions to mitigate them are actually broken and don't work as advertised), so then a web response marked with another user's domain statically can't accept private information that doesn't belong to them.
10 notes · View notes