• WWW.DIGITALTRENDS.COM
    Latest aurora seen from space is a real stunner
    Ask any astronaut about the pleasures of spending time aboard the International Space Station (ISS) and one of the responses will surely be the incredible views that they get to enjoy from 250 miles above Earth.The scenery can include everything from remarkable vistas of places far below, sunrises and sunsets every 90 minutes, astonishing views of thunderstorms, and, far beyond Earth, stunning scenery that includes the moon and even the Milky Way.Recommended VideosTheyre also regularly treated to aurora, an amazing natural light display caused by the interaction of solar winds with Earths magnetic field. NASA astronaut Don Pettit, an ISS crewmember who always seems to have a camera at hand, has just shared a couple of video clips showing recent aurora as the orbital outpost passed overhead.RelatedThese are by no means the first aurora to be captured from the space station, but this first video seems unlike many of the other aurora clips weve seen in recent years, with the lush green colors, described by Pettit as vaporous turbulence, sweeping through the shot in dramatic fashion.The second video features a wider angle that also includes the curvature of Earth, with the captured footage no less dramatic.Pettit has been in orbit since September last year, and in that time hes been dazzling earthlings with a steady stream of images and videos captured from way above Earth.One of his most striking shots shows rivers in the Amazon Basin. Taken at night, Pettit said the picture reminded him of flowing silver snakes. He also shared a remarkable image showing Blue Origins maiden launch of the New Glenn rocket, with the vehicles second stage seen streaking across the image, which also includes lots of star trails.Pettits impressive photography work follows in the footsteps of other astronauts with a keen eye, including Frenchman Thomas Pesquet, who focused more on capturing beautiful Earth shots as the space station passed overhead.Editors Recommendations
    0 Commentarios 0 Acciones 84 Views
  • WWW.BUSINESSINSIDER.COM
    I'm Thai and have been watching 'The White Lotus.' There are references and Easter eggs foreigners might be missing.
    Parisa Pichitmarn is Thai, lives in Bangkok, and noticed things in 'The White Lotus' that foreigners are missing. Parisa Pichitmarn 2025-04-06T23:14:02Z SaveSaved Read in app This story is available exclusively to Business Insider subscribers. Become an Insider and start reading now.Have an account? Parisa Pichitmarn is Thai, lives in Bangkok, and watches "The White Lotus."She points out details that foreigners are missing.This story contains spoilers for season 3 of 'The White Lotus.'I'm Thai, grew up both in Bangkok and abroad, and remember American classmates confusing Thailand with Taiwan.This is why, when Parker Posey's character in the third season of "The White Lotus" said, "You want to live in Taiwan?!" in response to her daughter's plan to spend a year in Thailand, it felt spot-on.The third season, set mostly in Koh Samui and Bangkok, incorporates cultural nuances and clichs. As a local, a few details stood out in the show that foreigners may have missed. Lek Patravadi on season three of "The White Lotus." Fabio Lovino/HBO The hotelier character is based on a real personA well-known Thai actor, Lek Patravadi, plays the hotel owner Sritala on the show. The character was inspired by Kamala Sukosol, Thailand's real-life singing hotelier.A fixture in Thai high society and the matriarch of the Sukosol Group, the 86-year-old is as well known for her jazz performances as she is for her award-winning hotels.Her boutique hotel, The Siam, by the Chao Phraya River in Bangkok, was previously scouted as a potential shooting location for the third season of "The White Lotus."In October, during an interview on "Trends" for TravelDailyNews, Sukosol said she met Mike White when he visited her hotel and spoke to her about possibly acting in the show."He said, 'Khun Kamala, do you act?' I said, no way. He said, 'You sure you can't act?' I said, I'm positive, I'm a singer," Sukosol told David Barret, the show's host. She went on to explain that White continued trying to convince her for the next few months."He wanted me to act as me, as the singing hotelier," she said.In February, her hotel posted a photo on Instagram of Mike White with both Patravadi and Sukosol. "Step behind the scenes with Khun Kamala, the heart and soul of The Siam, whose legendary performances inspired the character Sritala in The White Lotus Season 3."Some of the song lyrics are tied to the show's plotSeason three's Thai soundtrack includes national bangers as well as more folksy sounds from all regions of the country. In several instances, the lyrics have emphasized or foreshadowed what happens next.Atchariya Pinitsanpirom, the show's Thai producer, told Business Insider that she originally sent the sound director a playlist of around 50 Thai"I translated for them when we watched the final cut because I wanted them to know it fits perfectly," Pinitsanpirom said of matching song lyrics to plot developments.In episode 7 of "The White Lotus," Sritala shows Frank (Sam Rockwell) a video of her younger self performing "Lamthad,"On the TV, the actor is shown in her younger years singing the word "lamthad" repeatedly and making a chopping hand motion. This matches well with Rick's (Walton Goggins) inner turmoil and a decision he is on the brink of.The song also includes the phrase "wing gun utlalood," which translates to "run their asses off" which in turn lines up with Rick and Frank's actions in the episode. Lalisa Manobal and Tayme Thapthimthong on season three of "The White Lotus." Fabio Lovino/HBO The security guard doesn't speak Thai clearlyThe security guard, Gaitok (Tayme Thapthimthong) has a foreign accent when he speaks Thai. That's because the actor was born and grew up in the UK."When I speak Thai with others, I tend to throw in English words when I can't think of the Thai word in time. In one scene, I answered, 'Yeah,' and the team's feedback was, 'Okay, you just revealed clearly that you're not a Thai security guard!'" Thapthimthong told theStandard Pop last month.I also found him a little too international to be portraying a shy, provincial security guard.Lalisa Manobal, also known as Blackpink's Lisa, plays Mook, the security guard's love interest who also works as a hotel staff member. She pronounces Thai well despite moving to South Korea when she was 14 to become a K-pop trainee.Thapthimthong credited Lisa for helping him out with his lines. "Lisa and her assistant helped me out so much and I'm really thankful for it," he said.Another character appears to be inspired by an American-born Thai businessmanWhile much of the show was filmed at Four Seasons Resort Koh Samui, additional hotel scenes were filmed at three Anantara properties in Phuket and Koh Samui.This luxury hotel chain is owned by William Heinecke, an American-born business magnate whose company, Minor, oversees over 500 hotels and resorts.The name "Minor" is fitting Heinecke started an advertising business and an office cleaning company in Bangkok at age 17. He later gave up his US citizenship to become Thai, a move that let him own land in Thailand.With a net worth of $1.5 billion, Heinecke ranked 17 on Forbes' 2024 list of Thailand's 50 Richest.Although Heinecke is not married to Sukosol in real life, his persona appears to have influenced the character of Sritala's American husband, Jim Hollinger."I think Mike drew from a lot of prominent people like Jim Thompson and William Heinecke. This character is a mix of all those figures," Pinitsanpirom,Jim Thompson was an American entrepreneur who revived Thailand's silk industry in the mid-20th century and mysteriously disappeared in Malaysia in the 1960s. Walton Goggins and Aimee Lou Wood on season three of "The White Lotus." Fabio Lovino/HBO Two details in the show didn't add upDuring a scene setLochlan Ratliff (Sam Nivola) says the tsunami happened on a nearby beach. However, the 2004 tsunami affected only Thailand's westernIn one episode, Rick and Chelsea (Goggins and Aimee Lou Wood) catch a ride on a tuk-tuk to a snake farm. However, unlike other parts of Thailand, tuk-tuks are not a common mode of transportation on Samui. Due to the island's many hilly roads, the three-wheeled motorized rickshaws are not ideal. Instead, songthaews shared pickup truck taxis are the more typical means of getting around.Commenting on this detail, Pinitsanpirom said, "It is impossible to be 100% accurate, but in the end, the factual inaccuracies are not too off. Narratively speaking, Rick and Chelsea are in a rush to go out, but using a taxi would be too boring. We had to think of visuals and the tuk-tuk gives a more dramatic flair."Recommended video
    0 Commentarios 0 Acciones 81 Views
  • METRO.CO.UK
    Best new mobile games on iOS and Android April 2025 round-up
    Best new mobile games on iOS and Android April 2025 round-upNick GillettNick GillettPublished April 7, 2025 1:10am Mo.co is a change of pace for Supercell (Supercell)This months new smartphone gaming apps include a new game from Supercell, a prequel to The Electric State, and murder mystery Expelled!Aprils batch of new mobile game releases include the touchscreen versions of Songs Of Conquest and Dredge, along with the spiritual successor to Overboard!, clever new puzzle game The Valley Of The Architects, and a very cheap new tower defence game.Songs Of Conquest MobileiOS & Android, 11.99 (Coffee Stain)Originally released on PC last year, the mobile version of Songs Of Conquest feels like coming home, its turn-based interactions and pixel art feeling just right on a phone or iPad.Its tale of warring fantasy characters may not have much of a sense of humour but the mix of light exploration to gather buffs and new weapons, and capture farms and cities for your cause, is interspersed with engaging Final Fantasy Tactics-style battles.Given its cute good looks its surprisingly tough, with fights easily able to blindside you when spell-casting enemy Wielders are involved. If you dont mind a few retries, and make sure you scour the countryside for power-ups, this will keep you busy for weeks.Score: 7/10The Valley Of The ArchitectsiOS, 3.99 (Whaleo)The intriguingly entitled Valley Of The Architects is a puzzle game involving getting passengers to their correct destinations using a series of lifts that operate autonomously.Your job is to set the floor each lift starts on and adjust stoppers that they bounce off when they reach certain floors, to get everyone to the right place while avoiding an expanding array of obstacles along the way.Completing levels tends to mean a fascinating few minutes head scratching as you set everything up, testing and tweaking as you go, followed by a final run where each passenger weaves their way to their final goal via the artful sequence of lifts youve arranged for them.Its enormously satisfying, its elegant design and perfectly minimalist interface, music and sound effects creating just the right accompaniment to your puzzle solving.Score: 8/10Mo.coiOS & Android, Free (Supercell)A new MMO from Clash Of Clans maker Supercell, that adds you to the staff roster at a monster hunting start-up business.Unlike recent hit Brawl Stars, and the rather less successful Squad Busters, Mo.co is pure PvE, so your character can only turn his or her increasing firepower on the cartoon monsters youre all battling, and never on fellow players.Hopping into a glowing portal you choose which level to attack depending on time limited events and available objectives, and while the first few hours feel fairly primitive in gameplay terms hold down attack when youre near an enemy things get more interesting as you get nearer the endgame.Once youre sufficiently levelled there are challenges for four players where each takes on a specific role, and others where dozens of hunters club together to defeat super-bosses. Whether it has the staying power Supercell traditionally aims for remains to be seen, but its an interesting new direction for the studio.Score: 7/10PBJ: The MusicaliOS, 3.99 (Philipp Stollenmayer)Delivering its zany food-based reinterpretation of some of Shakespeares works through the medium of song, accompanied by visuals that use old cut up recipe books animated in a charming Terry Gilliam style, this is not your typical mobile game.Its characters are snacks with googly eyes stuck on them, that you have to nudge and drag through dioramas depicting the plot as you listen to each of its 10 songs, all of which have a secret remix to unlock. It doesnt really involve skill but it does prove mildly diverting.Made by mobile game designing legend Philipp Stollenmayer, with songs written and sung by Britains Got Talent finalist Lorraine Bowen, we have to concede her brand of quirkiness leaves us completely cold, as unfortunately does this musical but if you enjoy its very particular type of cheerful silliness you might find something here to love.Score: 5/10DredgeiOS & Android, Free 24.99 Full game unlock (Black Salt Games)While Dredge is notionally a fishing-based role-playing game, its Lovecraftian milieux and sinister clutch of characters instantly place it apart from more typical fare.Borrowing a trawler, you set out to plumb the depths for saleable marine life, as well as dredging up crafting materials and a fair number of eldritch horrors, which fortunately you can sell to the fishmonger for extra cash.With a downbeat art style and a plot that gradually reveals all that lurks beneath, theres plenty of exploration and ship upgrading to undertake on your way to finding out whats going on. It felt a bit too slim on consoles and PC but while it works better on mobile the price tag is more than most are likely to pay for the full thing.Score: 7/10 DunCreate is not quite free (Obscure)DunCreateiOS & Android, 29p (Obscure)Tower defence games are far from a rarity on the Google Play and App Stores, but these days many of them are free to play, which tends to make them endlessly long and just slightly unbalanced to encourage you to cough up your savings.DunCreates 2D take on the genre is a bit more honest. Its also resolutely old school, even if its difficulty level progresses so slowly it can occasionally feel like a freemium game in the sheer scale of content to plough through.While it may not have the panache of Ironsides classic Kingdom Rush series its straightforward interface is ideal for mobile and does at least scratch the same itch as its more costly genre alternatives.Score: 6/10Expelled!iOS, 5.99 (Inkle)Youre Verity Amersham, scholarship student and all round good girl; its the last day of term, at Miss Mulligatawneys School for Promising Girls, and Louisa Hardcastle has just been shoved through a stained glass window apparently by you.That gives you just over eight hours to clear your name before the holidays start and youre expelled. You need to scout locations, harvest gossip, and gather evidence to identify the real culprit in what amounts to a text adventure, albeit one thats been lavishly illustrated, with some of its speech voiced, making it feel lively and involving throughout.Repeatedly looping back through the brief period of your investigation you need to be assiduous in your evidence gathering, because Miss Mulligatawney doesnt suffer fools gladly, and anything less than complete proof will see your accusations loftily dismissed. Its fun, and its script wonderfully acerbic.Score: 8/10The Electric State: Kid CosmoiOS & Android, Included with Netflix subscription (Netflix)More TrendingBased on the Simon Stlenhag graphic novel, The Electric State movie cost over $300 million to make, stars Chris Pratt, and is currently languishing at 15% on Rotten Tomatoes.The game Electric State: Kid Cosmo is a playable prequel to the film, set in the decade leading up to its events. Gameplay revolves around an 8-bit Kid Cosmo handheld game, which your character and his sister play as world events escalate in the background.The way it layers plot and characters around playing the made-up handheld which at one point you have to repair when it breaks works beautifully, the physicality of the handheld brilliantly realised on your phone screen, even if the simulated Kid Cosmo game itself is only okay.Score: 7/10Emailgamecentral@metro.co.uk, leave a comment below,follow us on Twitter, andsign-up to our newsletter.To submit Inbox letters and Readers Features more easily, without the need to send an email, just use ourSubmit Stuff page here.For more stories like this,check our Gaming page.GameCentralSign up for exclusive analysis, latest releases, and bonus community content.This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply. Your information will be used in line with our Privacy Policy
    0 Commentarios 0 Acciones 89 Views
  • GIZMODO.COM
    Microsoft Hooked the Government on Its Products With Freebies. Could Elon Musks Starlink Be Doing the Same?
    This story was originally published by ProPublica. ProPublica is a Pulitzer Prize-winning investigative newsroom. Sign up for The Big Story newsletter to receive stories like this one in your inbox. A few weeks ago, my colleague Doris Burke sent me a story from The New York Times that gave us both deja vu. The piece reported that Starlink, the satellite internet provider operated by Elon Musks SpaceX, had, in the words of Trump administration officials, donated internet service to improve wireless connectivity and cell reception at the White House. The donation puzzled some former officials quoted in the story. But it immediately struck us as the potential Trump-era iteration of a tried-and-true business maneuver wed spent months reporting on last year. In that investigation, we focused on deals between Microsoft and the Biden administration. At the heart of the arrangements was something that most consumers intuitively understand: Free offers usually have a catch. Microsoft began offering the federal government free cybersecurity upgrades and consulting services in 2021, after President Joe Biden pressed tech companies to help bolster the nations cyber defenses. Our investigation revealed that the ostensibly altruistic White House Offer, as it was known inside Microsoft, belied a more complex, profit-driven agenda. The company knew the proverbial catch was that, once the free trial period ended, federal customers who had accepted the offer and installed the upgrades would effectively be locked into keeping them because switching to a competitor at that point would be costly and cumbersome. Former Microsoft employees told me the companys offer was akin to a drug dealer hooking users with free samples. If we give you the crack, and you take the crack, youll enjoy the crack, one said. And then when it comes time for us to take the crack away, your end users will say, Dont take it away from me. And youll be forced to pay me.What Microsoft predicted internally did indeed come to pass. When the free trials ended, vast swaths of the federal government kept the upgrades and began paying the higher subscription fees, unlocking billions in future sales for the company. Microsoft has said all agreements with the government were pursued ethically and in full compliance with federal laws and regulations and that its only goal during this period was to enhance the security posture of federal agencies who were continuously being targeted by sophisticated nation-state threat actors.But experts on government contracting told me the companys maneuvers were legally tenuous. They circumvented the competitive bidding process that is a bedrock of government procurement, shutting rivals out of competition for lucrative federal business and, by extension, stifling innovation in the industry. After reading the Times story about Starlinks donation to the White House, I checked back in with those experts. It doesnt matter if it was Microsoft last year or Starlink today or another company tomorrow, said Jessica Tillipman, associate dean for government procurement law studies at George Washington University Law School. Anytime youre doing this, its a back door around the competition processes that ensure we have the best goods and services from the best vendors.Typically, in a competitive bidding process, the government solicits proposals from vendors for the goods and services it wants to buy. Those vendors then submit their proposals to the government, which theoretically chooses the best option in terms of quality and cost. Giveaways circumvent that entire process. Yet, to hear Commerce Secretary Howard Lutnick tell it, the Trump administration wants to not only normalize such donations but encourage them across Washington. Last month, during an appearance on the Silicon Valley podcast All-In, he floated his concept of a gratis vendor who gives product to the government. In the episode, released just a few days after The New York Times published its Starlink story, Lutnick said such a donor would not have to go through the whole process of becoming a proper vendor because youre giving it to us. Later, he added: You dont have to sign the conflict form and all this stuff because youre not working for the government. Youre just giving stuff to the government. You are literally giving of yourself. Youre not looking for anything. Youre not taking any money.Since President Donald Trump took office in January, Musk, who is classified as an unpaid special government employee, has made a show of providing his services to the president and products from his companies to the government at no cost to the taxpayer. The White House donation was just the latest move. In February, he directed his company SpaceX to ship 4,000 terminals, at no cost, to the Federal Aviation Administration for installation of its Starlink satellite internet service. During our Microsoft investigation, salespeople told me that within the company the explicit end game was converting government users to paid upgraded subscriptions after the free trial and ultimately gaining market share for Azure, its cloud platform. Its unclear what the end game is for Musk and Starlink. Neither responded to emailed questions. Federal law has long attempted to restrict donations to the government, in large part to maintain oversight on spending.At least as far back as the 19th century, executive branch personnel were entering into contracts without seeking the necessary funding from Congress, which was supposed to have the power of the purse. Lawmakers didnt want taxpayers to be on the hook for spending that Congress hadnt appropriated, so they passed the Antideficiency Act, a version of which remains in effect today. One portion restricted voluntary services to guard against a supposed volunteer later demanding government payment. But in 1947, the General Accounting Office (now called the Government Accountability Office), which offers opinions on fiscal laws, made an exemption: Providing what became known as gratuitous services would be allowed as long as the parties agree in writing and in advance that the donor waives payment. Microsoft used that exemption to transfer the consulting services it valued at $150 million to its government customers, entering into so-called gratuitous services agreements. To give away the actual cybersecurity products, the company provided existing federal customers with a 100% discount for up to a year. It is unclear whether gratuitous services agreements were in place for Musks giveaways. The White House and the FAA did not respond to written questions. Neither did SpaceX. An official told The New York Times last month that a lawyer overseeing ethics issues in the White House Counsels Office had vetted the Starlink donation to the White House.For the experts I consulted, the written agreements might help companies comply with the letter of the law, but certainly not with the spirit of it. Just because something is technically legal does not make it right, said Eve Lyon, an attorney who worked for four decades as a procurement specialist in the federal government. The consequences of accepting a giveaway, no matter how its transferred, can be far reaching, Lyon said, and government officials might not grasp the perniciousness at the outset.Tillipman agreed, saying the risk for ballooning obligations is particularly pronounced when it comes to technology and IT. Users become reliant on one provider, leading to vendor lock-in, she said. Its too soon to tell what will come of Starlinks donations, but Microsofts White House Offer provides a preview of whats possible. In line with its goal at the outset, the worlds biggest software company continues to expand its footprint across the federal government while sidestepping competition. A source from last years Microsoft investigation recently called to catch up. He told me that, with the government locked into Microsoft, rivals continue to be shut out of federal contracting opportunities. When I asked for an example, he shared a 2024 document from the Defense Information Systems Agency, or DISA, which handles IT for the Department of Defense. The document described an exception to fair opportunity in the procurement of a variety of new IT services, saying the $5.2 million order will be issued directly to Microsoft Corporation.The justification? Switching from Microsoft to another provider would result in additional time, effort, costs, and performance impacts. DISA did not respond to emailed questions. Doris Burke contributed research.
    0 Commentarios 0 Acciones 94 Views
  • WWW.REDDIT.COM
    Morning Puff
    submitted by /u/MirMeetsW0rld [link] [comments]
    0 Commentarios 0 Acciones 90 Views
  • MEDIUM.COM
    Amplifying Creativity: Building an AI-Powered Content Creation AssistantPart 3
    Amplifying Creativity: Building an AI-Powered Content Creation Assistant Part 315 min readJust now--Photo by israel palacio / UnsplashWelcome to part 3 of this series. In the previous post, we adapted our Jupyter Notebook implementation from part 1 into a FastAPI server that can serve users. We learned how to set up FastAPI and configure settings, as well as how to trigger workflows from REST endpoints.Previously, we identified some limitations in our solution. Users will have to wait for the response after the workflow is completed. We have also been saving our content in a local folder. While this is okay for quick experimenting, we will expand this solution to send progress events and use an appropriate storage mechanism in this post.In addition to improving our solution, we will continue to abstract our code into succinct modules and pin our dependencies to ensure build reproducibility.SeriesWhat to expectStream progress events to users throughout a workflowHow to use SQLAlchemy ORM to interact with PostgresRunning migrations with AlembicSaving images to MinioRun multiple Docker applications together with Docker-ComposeConfigure the WebSocket endpoint in the FastAPI applicationCode Structure README.md alembic README env.py script.py.mako versions alembic.ini docker-compose.yml infrastructure init-db.sh pyproject.toml requirements requirements-dev.txt requirements.txt src content api.py models prompts repositories schemas services workflows core api.py database.py logs.py middleware.py main.py settings config.pyCompared to the previous post, the overall structure of our projects has expanded. We have a few top-level directories:Alembic We will discuss this more in the SQLAlchemy section below, but this directory contains our database migrations. A migration essentially changes the structure of the database. These files are auto-generated, and we only need to modify env.py and alembic.ini.Alembic.ini is an auto-generated related config file. We only need to remove one line from it, as most of the configuration is set up in env.pydocker-compose.yml contains configuration to run Postgres and Minio in containers on the same network with provisioned storage using volumesInfrastructure: Our database models use UUIDs for GUIDS. This directory contains a script to enable the uuid.ossp extension the first time Postgres runsPyproject.toml is a configuration file for packaging-related tools.Requirements: This holds our production and development dependencies pinned by version. The setting up dependencies section provides more on this.Source DirectoryThe source directory contains the bulk of the source code. The code is structured around domains consisting of core and content. The core domain includes files that impact the server holistically (middleware) or contain logic to be used in other domains, such as database sessions, logging function, and a health check for later k8s deployment. The content domain uses DDD tactical patterns: Repository and Services to cleanly abstract code. Each domain (next up will be users) will follow the same general structure:Models: SQLAlchemy models that define the database schema.Schema: Pydantic models which handle input and output data validation and serialization.Repositories: The repositories are responsible for data access. Separating data access logic, ensuring easier testing and maintenance.Services: coordinates business logic, interfacing between application logic and data access logic (repository)Content domain specifically has:Prompts: a central place to store prompts. For now, other tools later in the series will address prompt versioning and a more robust approach.Workflows: stores all workflows.Dependencies SetupIn part 2, we set up our virtual environment using Conda and installed all our dependencies through the command line. This works initially, but the underlying dependencies can change, breaking the source code. In this project, we introduce pyproject.toml, which has become the de facto standard for configuring Python applications.[build-system]requires = ["setuptools", "wheel"]build-backend = "setuptools.build_meta"pyt[project]name = "content_assistant"authors = [{ name = "Markell Richards" }]version = "0.0.1"requires-python = ">=3.12"readme = "README.md"dependencies = [ "fastapi", "uvicorn[standard]", "tenacity", "asyncio", "llama-index-core", "llama-index-llms-openai", "tavily-python", "openai", "pydantic-settings", "minio", "JSON-log-formatter", "sqlalchemy", "alembic", "psycopg2-binary", "boto3", "asyncpg",][project.optional-dependencies]dev = ["ruff", "black"]With our application metadata and dependencies defined, we need to create a requirements.txt for pip to install. We will use pip-tools which consist of pip-compile and pip-sync. pip-compile pins the dependencies so pip knows how to resolve them and which versions to install. Great dependency management revolves around dependency resolving and dependency locking. These two concepts allow us to have deterministic builds. Ensuring the app is built the same regardless of where and when.To generate the hashes and lock versions, we use the following commands:pip-compile --generate-hashes -o requirements/requirements.txt pyproject.toml pip-compile --extra dev -o requirements/requirements-dev.txt pyproject.tomlWe use requirements-dev for local development as it will include additional dependencies defined in the dev section of our pyproject.toml. These aren't needed for the production build and are excluded from requirements.txt.To install the dependencies, we use:pip-sync requirements/requirements.txt requirements/requirements-dev.txtpip-sync installs dependencies based on the output of our pip-compile.APIsEach domain has its own api.py with a set of routes. These are defined as routers and are included in our main.py, as shown here:app = FastAPI(version=version)app.include_router(core_router)app.include_router(content_router)Core routerIn part 6 of this series, we will deploy our full-stack application to Kubernetes. Typically, the containers in Kubernetes pods should have a way to check the health of an application. More on this will be covered later, but for now, we defined a simple health check endpoint that returns the version of our API (version is specified in pyproject.toml):from fastapi import APIRouter, statusfrom fastapi.requests import Requestrouter = APIRouter(tags=["Core Endpoints"])@router.get("/health", status_code=status.HTTP_200_OK)async def healthcheck(request: Request) -> dict: return {"version": request.app.version}Content RouterWe establish a WebSocket connection to provide users with real-time updates as a workflow proceeds through its steps. This is a minimal and simple example of streaming updates using a WebSocket connection. It will need to be improved before being used in production.router = APIRouter(tags=["Content Endpoints"])@router.websocket("/content")async def advancedContentFlow(websocket: WebSocket, db: Session = Depends(get_db), settings: Settings = Depends(get_settings)): await websocket.accept() s3_client = boto3.client( 's3', endpoint_url=settings.MINIO_ENDPOINT, aws_access_key_id=settings.AWS_ACCESS_KEY_ID, aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY, region_name='us-east-1', # Disable SSL verification if using HTTP config=boto3.session.Config(signature_version='s3v4') ) workflow_repository = WorkflowRepository(db) blog_repository = BlogRepository(db) social_media_repository = SocialMediaRepository(db) image_repository = ImageRepository(db) workfow_service = WorkflowService(workflow_repository) blog_service = BlogService(blog_repository) social_media_service = SocialMediaService(social_media_repository) image_service = ImageService(image_repository=image_repository, s3_client=s3_client) workflow = AdvancedWorkflow(settings, db, workfow_service=workfow_service, blog_service=blog_service, social_media_service=social_media_service, image_service=image_service) try: data = await websocket.receive_json() logger.info(data) handler: WorkflowHandler = workflow.run(topic=data["topic"], research=data["research"]) async for event in handler.stream_events(): if isinstance(event, ProgressEvent): await websocket.send_json({ "type": "progress_event", "payload": str(event.msg) }) result = await handler await websocket.send_json({ "type": "results", "payload": result }) except Exception as e: await db.rollback() await websocket.send_json({ "type": "error", "payload": "Something went wrong" }) logger.error(e) finally: await websocket.close()Stepping through the code:Using dependency injection, we inject a database session and settings object into each connection.Accept an incoming WebSocket connection.Minio is an S3 Compatible object storage. We use the AWS boto SDK to interact with Minio. We create an s3_client to pass into our image_service which contains the logic to upload images.We create instances of each repository and service type: workflow, blog, social media, and image.We create an instance of AdvanceWorkflow and pass in settings, db session, and every service.We accept a JSON payload containing a content topic and research boolean flag.We run our workflow and listen for ProgressEvent. As the workflow progresses, each step will publish a ProgressEvent with a msg that will be sent to the client.Once the workflow finishes, the user gets a result payload signifying the workflow as completed or failed.Error handling in the event something goes wrongFinally, we close the WebSocket connection.SqlAlchemy and AlembicAs mentioned, we added Postgres and Minio to the project to persist in storing entities created throughout the workflows for later retrieval. Above is a simple entity relationship diagram (ERD) of how the tables map together. This is subject to change, but at this point, this structure gives us some general access patterns:Each blog and social media post belongs to one workflow. If we fetch a workflow, we can grab all related entities.In a single workflow, blog and social media posts share the same image generated. However, later, the user can change the media used through the interface.A user can edit the content of blog and social media post in later enhancements. Theres a situation that arises where images will be orphaned. How would you do the cleanup process? (will be revealed later in the series)To facilitate the interaction with the database and management of its structure, we use SqlAlchemy and Alembic. SQLAlchemy is an object-relational mapper (ORM) that helps you interact with databases using Python. It offers various patterns that make managing data easier and more efficient. SQLAlchemy is designed for high performance, allowing quick access to database information using simple and clear Python.Alembic is a lightweight database migration tool built to be used with SqlAlchemy. It performs migrations to change the structure of the database. By change, this includes adding tables, updating models, etc.Each SqlAlchemy model follows the same pattern so I will show just one example. See the source code for the rest of the entities.import uuidfrom src.core.database import Basefrom sqlalchemy.dialects.postgresql import UUIDfrom sqlalchemy import types, ForeignKey, func, DateTime, Columnfrom sqlalchemy.orm import relationshipclass BlogPosts(Base): __tablename__ = 'blog_posts' id = Column(types.INTEGER, primary_key=True, autoincrement=True) guid = Column(UUID(as_uuid=True), primary_key=False, unique=True, nullable=False, server_default=func.uuid_generate_v4(), default=uuid.uuid4) title = Column(types.String) content = Column(types.TEXT) created_at = Column(DateTime, default=func.now(), nullable=False) updated_at = Column(DateTime, default=func.now(), onupdate=func.now(), nullable=False) workflow_guid = Column(ForeignKey("workflows.guid")) image_guid = Column(ForeignKey("images.guid")) image = relationship("Images")Here, we define our blog_posts table, which is shown in the ERD. We define each column and its associated type. Postgres built-in function uuid_generate_v4() generates a unique identifier for the guid column. func.now generates the timestamp for created_at and updated_at columns. Then define our workflow and image relationships using ForeignKey. Lastly, we use the relationship module to allow easy access to images related to a blog post using the ORM.To use the uuid_generate_v4() function with Postgres, we must ensure the extension is enabled in our database.set -epsql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL CREATE EXTENSION IF NOT EXISTS "uuid-ossp";EOSQLThis script is passed into our docker instance running Postgres and will enable the extension.Now that our model is defined and extension is configured, lets create a migration.In the root directory, youll run the following command:alembic init alembicThis will generate the following files:/versions directory: contains each migration generatedenv.py: used to configure alembicREADME.md: generic information from alembicscript.py.makoalembic.iniAfter these files are generated, we need to modify alembic.ini and env.py. In alembic.ini, remove the following line:sqlalchemy.url =Next, we modify a few lines in env.py:## import necessary source codefrom src.core.database import Basefrom src.settings.config import Settingsfrom src.content.models.workflows import Workflowfrom src.content.models.blog_posts import BlogPostsfrom src.content.models.social_media_post import SocialMediaPostsfrom src.content.models.images import Images# alembic generated codetarget_metadata = Base.metadatasettings = Settings()config.set_main_option("sqlalchemy.url", settings.DATABASE_URL)# rest of alembic generated codeThe models must be imported into this file for the migrations to run. We also import Base from our database.pyfrom sqlalchemy.ext.asyncio import create_async_engine, AsyncSessionfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmakerfrom src.core.logs import loggerfrom src.settings import settingsBase = declarative_base()# for alembicsync_engine = create_engine(settings.DATABASE_URL, echo=True)async_engine = create_async_engine(settings.ASYNC_DATABASE_URL, echo=True, future=True)AsyncSessionFactory = sessionmaker( bind=async_engine, class_=AsyncSession, expire_on_commit=False, autocommit=False, autoflush=False,)async def get_db(): async with AsyncSessionFactory() as session: yield sessionBase contains the metadata of our models, which each of our SqlALchemy models inherits. Alembic is synchronous by nature compared to FastAPI, which is asynchronous. I defined two database engines to avoid overcomplicating the alembic configuration to be async. One synchronous that uses a different URL is used by Alembic, and FastAPI uses another async URL. Here is an example of their URLs:ASYNC_DATABASE_URL=postgresql+asyncpg://postgres-user:postgres-pw@localhost:5432/demo # EXAMPLEDATABASE_URL=postgresql://postgres-user:postgres-pw@localhost:5432/demo #EXAMPLEWith everything configured, we can run the following two commands to generate a migration and update our database:alembic revision --autogenerate -m "Initial migration" alembic upgrade head # updates database tables & schemasWorkflowfrom llama_index.core.workflow import Workflow, Event, StartEvent, StopEvent, Context, stepfrom sqlalchemy.orm import Sessionfrom src.content.services.workflow_service import WorkflowServicefrom src.content.services.blog_service import BlogServicefrom src.content.services.social_media_service import SocialMediaServicefrom src.content.services.image_service import ImageServicefrom src.content.schemas.workflow import WorkflowStatusType, WorkflowCreate, WorkflowUpdatefrom src.content.schemas.blog_posts import BlogCreate, BlogUpdatefrom src.content.schemas.social_media_post import SocialMediaCreate, PlatformType, SocialMediaUpdatefrom src.content.schemas.tavily_search import TavilySearchInputfrom src.content.schemas.images import ImageCreatefrom src.content.prompts.prompts import *from src.content.services.tavily_search_service import tavily_searchfrom llama_index.llms.openai import OpenAI as LlamaOpenAIfrom openai import OpenAIfrom src.core.logs import loggerclass ResearchEvent(Event): topic: str research: boolclass BlogEvent(Event): topic: str research: bool research_material: strclass SocialMediaEvent(Event): blog: strclass SocialMediaCompleteEvent(Event): passclass IllustratorEvent(Event): blog: strclass IllustratorCompleteEvent(Event): url: strclass ProgressEvent(Event): msg: strclass RetryEvent(Event): passclass WorkflowFailedEvent(Event): error: strclass AdvancedWorkflow(Workflow): def __init__(self, settings, db: Session, workfow_service: WorkflowService, blog_service: BlogService, social_media_service: SocialMediaService, image_service: ImageService, timeout=None, verbose=None): super().__init__(timeout, verbose) self.settings = settings self.db = db self.workflow_service = workfow_service self.blog_service = blog_service self.social_media_service = social_media_service self.image_service = image_service @step async def start_event(self, ev: StartEvent, ctx: Context) -> ResearchEvent | BlogEvent | WorkflowFailedEvent: ctx.write_event_to_stream(ProgressEvent(msg="Starting content creation workflow")) workflow_data = WorkflowCreate(status=WorkflowStatusType.INPROGRESS) try: workflow = await self.workflow_service.create_workflow(workflow_data=workflow_data) await ctx.set(key="workflow_id", value=workflow.id) await ctx.set(key="workflow_guid", value=workflow.guid) if ev.research: return ResearchEvent(topic=ev.topic, research=ev.research) return BlogEvent(topic=ev.topic, research=ev.research, research_material="None") except Exception as e: return WorkflowFailedEvent(error=f"{e}") @step async def research_event(self, ev: ResearchEvent, ctx: Context) -> BlogEvent | WorkflowFailedEvent: ctx.write_event_to_stream(ProgressEvent(msg=f"Searching internet for information about {ev.topic}")) try: search_input = TavilySearchInput( query=ev.topic, max_results=3, search_depth="basic" ) research_material = await tavily_search(search_input, api_key=self.settings.TAVILY_SEARCH_API_KEY) return BlogEvent(topic=ev.topic, research= ev.research, research_material=research_material) except Exception as e: return WorkflowFailedEvent(error=f"{e}") @step async def blog_event(self, ev: BlogEvent, ctx: Context) -> SocialMediaEvent | WorkflowFailedEvent: ctx.write_event_to_stream(ProgressEvent(msg="Writing blog post")) prompt_template = "" workflow_guid = await ctx.get("workflow_guid") try: if(ev.research): prompt_template = BLOG_AND_RESEARCH_TEMPLATE.format(query_str=ev.topic, research=ev.research_material) else: prompt_template = BLOG_TEMPLATE.format(query_str=ev.topic) llm = LlamaOpenAI(model=self.settings.OPENAI_MODEL, api_key=self.settings.OPENAI_API_KEY) response = await llm.acomplete(prompt_template) blog_data = BlogCreate(title=ev.topic, content=response.text, workflow_guid=workflow_guid) blog_post = await self.blog_service.create_blog(blog_data=blog_data) await ctx.set(key="blog_id", value=blog_post.id) ctx.send_event(SocialMediaEvent(blog=blog_data.content)) except Exception as e: return WorkflowFailedEvent(error=f"{e}") @step async def social_media_event(self, ev: SocialMediaEvent, ctx: Context) -> SocialMediaCompleteEvent | IllustratorEvent | WorkflowFailedEvent: ctx.write_event_to_stream(ProgressEvent(msg="Writing social media post")) worklflow_guid = await ctx.get("workflow_guid") try: prompt_template = LINKED_IN_TEMPLATE.format(blog_content=ev.blog) llm = LlamaOpenAI(model=self.settings.OPENAI_MODEL, api_key=self.settings.OPENAI_API_KEY) response = await llm.acomplete(prompt_template) sm_data = SocialMediaCreate(content=response.text, platform_type=PlatformType.LINKEDIN, workflow_guid=worklflow_guid) sm_post = await self.social_media_service.create_social_media_post(social_media_data=sm_data) await ctx.set(key="sm_id", value=sm_post.id) ctx.send_event(IllustratorEvent(blog=ev.blog)) return SocialMediaCompleteEvent() except Exception as e: return WorkflowFailedEvent(error=f"{e}") @step async def illustration_event(self, ev: IllustratorEvent, ctx: Context) -> IllustratorCompleteEvent | WorkflowFailedEvent: ctx.write_event_to_stream(ProgressEvent(msg="Drawing illustration for content")) try: llm = LlamaOpenAI(model=self.settings.OPENAI_MODEL, api_key=self.settings.OPENAI_API_KEY) image_prompt_instructions_generator = IMAGE_GENERATION_TEMPLATE.format(blog_post=ev.blog) image_prompt = await llm.acomplete(image_prompt_instructions_generator, formatted=True) openai_client = OpenAI(api_key=self.settings.OPENAI_API_KEY) file_name = await self.image_service.generate_and_upload_image(bucket=self.settings.MINIO_BUCKET_NAME, openai_client=openai_client, image_prompt=image_prompt.text) url = f"{self.settings.MINIO_ENDPOINT}/{self.settings.MINIO_BUCKET_NAME}/{file_name}" image_data = ImageCreate(url=url) image = await self.image_service.create_image(image_data=image_data) await ctx.set("image_guid", image.guid) return IllustratorCompleteEvent(url=url) except Exception as e: return WorkflowFailedEvent(error=f"{e}") @step async def step_workflow_success(self, ev:SocialMediaCompleteEvent | IllustratorCompleteEvent, ctx: Context) -> StopEvent | WorkflowFailedEvent: if ( ctx.collect_events( ev, [SocialMediaCompleteEvent, IllustratorCompleteEvent] ) is None ) : return None workflow_id = await ctx.get("workflow_id") image_guid = await ctx.get("image_guid") blog_id = await ctx.get("blog_id") sm_id = await ctx.get("sm_id") workflow_update_data = WorkflowUpdate(id=workflow_id, status=WorkflowStatusType.COMPLETE) blog_update_data = BlogUpdate(id=blog_id, image_guid=image_guid) sm_update_data = SocialMediaUpdate(id=sm_id, image_guid=image_guid) try: await self.workflow_service.update_workflow(workflow_id, workflow_update_data) await self.blog_service.update_blog(blog_id=blog_id, blog_data=blog_update_data) await self.social_media_service.update_social_media_post(sm_id=sm_id, sm_data=sm_update_data) return StopEvent(result="Done") except Exception as e: return WorkflowFailedEvent(error=f"{e}") @step async def step_workflow_failed(self, ev: WorkflowFailedEvent, ctx: Context) -> StopEvent: try: workflow_id = await ctx.get("workflow_id") workflow_update_data = WorkflowUpdate(id=workflow_id, status=WorkflowStatusType.FAILED) await self.workflow_service.update_workflow(workflow_id, workflow_update_data) return StopEvent(result="Failed") except: logger.error(ev.error) return StopEvent(result="Failed")Our workflow has mostly stayed the same, except for the addition of using services to handle logic related to managing entities in Postgres and Minio. We also added a failure step in case anything goes wrong. To note, social media workflow is now calling the illustration step. This avoids the same session performing two operations simultaneously, causing a collision. In the future, we can pass in a session factory to enable parallel processing, but I did not for the sake of time.Services and RepositoriesIn Domain-Driven Design (DDD), tactical patterns are essential design guidelines that effectively organize and structure code within a bounded context. We implement the repository and service pattern described above in our code base. The patterns are repeatable, so like before, I show one example, in this case for Images, as they include additional logic for generating and uploading images.First, we define an interface with images that the ImageRepository must implement.from abc import ABC, abstractmethodfrom src.content.schemas.images import ImageCreate, Imageclass IImagesRepository(ABC): @abstractmethod async def create_image(self, image_data: ImageCreate) -> Image: passThen we define the ImageRepositoy:from src.content.repositories.images.images_repository_interface import IImagesRepositoryfrom src.content.schemas.images import Image, ImageCreatefrom src.content.models.images import Imagesfrom sqlalchemy.ext.asyncio import AsyncSessionclass ImageRepository(IImagesRepository): def __init__(self, async_db_session: AsyncSession): self.db = async_db_session async def create_image(self, image_data) -> Image: if not isinstance(image_data, ImageCreate): raise ValueError("Expected instance of ImageCreate") try: new_image_data = Images(url=image_data.url) self.db.add(new_image_data) await self.db.commit() await self.db.refresh(new_image_data) return Image( id=new_image_data.id, guid=new_image_data.guid, url=new_image_data.url ) except: await self.db.rollback() raiseThe interface defined one create_image method. The ImageRepositoy implements this method by checking if the data passed in matches the Pydantic schema ImageCreate. If it is a valid payload, it creates a new Images instance passing in the URL generated from the Minio address upload (see service file). The id, guid, created_at, and updated_at are auto-generated. It then uses the session methods to add and commit the entity to the database. Then, the image is returned to the caller for further processing. In this case, the guid will be used to map the relationship between blog_posts and social_media_posts image_guid fields.Lastly, we define the ImageService file:import uuidimport requestsfrom io import BytesIOfrom src.content.repositories.images.images_repository import ImageRepositoryfrom src.content.schemas.images import ImageCreate, Image as ImageSchemafrom src.content.models.images import Imagesfrom PIL import Image as PilImagefrom botocore.exceptions import NoCredentialsError, ParamValidationErrorfrom tenacity import retry, wait_random_exponential, stop_after_attemptfrom openai import OpenAIfrom src.core.logs import loggerclass ImageService(ImageRepository): def __init__(self, image_repository: ImageRepository, s3_client): self.repository = image_repository self.s3_client = s3_client async def create_image(self, image_data: ImageCreate) -> ImageSchema: image = await self.repository.create_image(image_data) return ImageSchema.model_validate(image) @retry(wait=wait_random_exponential(min=1, max=15), stop=stop_after_attempt(3)) async def generate_image(self, client: OpenAI, prompt: str): try: response = client.images.generate( model="dall-e-3", # will make configurable in future prompt=prompt, size="1024x1024", # will make configurable in future quality="standard", # will make configurable in future n=1 ) return response except: raise Exception("Failed to generate image") async def generate_and_upload_image(self, bucket, openai_client: OpenAI, image_prompt): try: generated_image = await self.generate_image(client=openai_client, prompt=image_prompt) image_url = generated_image.data[0].url response = requests.get(image_url) image = PilImage.open(BytesIO(response.content)) image_bytes = BytesIO() image.save(image_bytes, format='PNG') image_bytes.seek(0) file_name = f"test_{uuid.uuid4()}.png" await self.upload_to_minio(bucket, image_bytes.getvalue(), file_name) return file_name except: raise Exception("Failed to upload to minio or create database entry") async def upload_to_minio(self, bucket, file_data, filename): try: self.s3_client.put_object(Bucket=bucket, Key=filename, Body=file_data) logger.error(msg=f"Uploaded {filename} to MinIO bucket successfully!") except NoCredentialsError: logger.error(msg="Credentials not available.") except ParamValidationError as e: logger.error(msg=f"Parameter validation failed: {e}")The ImageService class defines four methods:create_image: uses the ImageRepositoy to save images to the database.generate_image: uses the OpenAI API and dall-e-3 to generate an image. It's wrapped by the tenacity decorator to perform exponential backoff and retry. The image generation API tends to be finicky, which helps retry when errors are thrown for no apparent reason besides issues on the API end.generate_and_upload_image: This method calls the generate_image and upload_to_minio methods to create an image based on the blog post and upload the generated image to Minio.upload_to_minio: uploads files to Minio using the s3_client.These layers of abstraction allow us to separate application logic from business (services) and data access (repositories). Allowing for easier maintenance and testing.Some may argue that these pattern impacts performance. This is typically negligible and wont be a cause of concern for small to mid size applications. The improved maintainability is typically worth it in my opinion until a performance refactor is justifiable.Docker ComposeWe will run Postgres and Minio in Docker containers to experiment with them. Later in the series, Ill show my home lab setup, where I run Postgres in Kubernetes and Minio on my NAS (using TrueNAS applications).version: "3"services: postgres: image: postgres:16 hostname: postgres ports: - "5432:5432" environment: POSTGRES_USER: postgres-user # EXAMPLE ONLY CHANGE POSTGRES_PASSWORD: postgres-pw #EXAMPLE ONLY CHANGE POSTGRES_DB: demo volumes: - ./data:/var/lib/postgresql/data - ./infrastructure/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh:ro minio: image: quay.io/minio/minio command: server /data --console-address :9001 restart: unless-stopped ports: - "9000:9000" - "9001:9001" environment: MINIO_ACCESS_KEY: minioadmin # EXAMPLE CHANGE MINIO_SECRET_KEY: minioadmin # EXAMPLE ONLY CHANGE MINIO_ROOT_USER: minioadmin # EXAMPLE ONLY CHANGE MINIO_ROOT_PASSWORD: minioadmin #EXAMPLE ONLY CHANGE volumes: - minio_data:/datavolumes: pgdata: minio_data:For each service, we define:image: postgres16 | quay.io/minio/minio(optional) commandportsenvironment: list of environment variables.volumes: used to persist data in the local directoryTo start these containers, ensure you have the docker run time installed and run the following command:docker-compose up -dThis will launch Postgres and Minio in the background.You can check to ensure the services are running correctly using:docker psLook for output similar to:SummaryIn this post, we enhanced our FastAPI application with real-time communication capabilities and improved data management. Key improvements include integrating WebSocket connections to stream progress events through a workflow. Introduced SQLAlchemy and Alembic for database interactions and migrations using Postgres. Expanded our code structure using Domain-Driven Design patterns, separating core and content functionality. Improved our dependency management with pyproject.toml and pip-tools.Whats NextThank you for tuning into part 3 of the GenAI Content Creator series. For part 4, we will add a user interface, allow users to interact with the workflow throughout its lifecycle, and update their content using a rich markdown editor.
    0 Commentarios 0 Acciones 97 Views
  • WWW.RESETERA.COM
    Minecraft Movie shattered box office records with $157 million domestic and $301m globally the biggest debut ever for a video game movie adaptation
    SmitchThe Unshakable Resolve of "this guy are sick"MemberApr 21, 20224,718 MattBPokmon Master Uncle Works at NintendoAvengerOct 25, 20173,673Nicely done! Hope fans of it enjoyed it.Mattmo831Featuring Mattmo831 from the Apple v Epic caseMemberOct 26, 20206,296Yall really underestimated the box office impact "I am Steve" and "Chicken Jockey" really havelouisacommieMemberOct 25, 201717,781New JerseyWhat is next Among us? Fortnite?Desma"This guy are sick"MemberOct 27, 20176,646Chicken JockeyFabsMemberAug 22, 20192,593Surprised but not really this was bigger than MarioBecks'MemberDec 7, 20179,028CanadaDesma said:Chicken JockeyClick to expand...Click to shrink...Flint and SteelDalUncle Works at NintendoMemberAug 18, 20242,042Minecraft and Fortnite are the two biggest IPs in gaming, just wait until the latter gets a movie.CloseTalkerSister in the CraftMemberOct 25, 201737,603Worth noting that Mario had already been out for two days and made almost $60mil before its first opening weekend tally of $144mil. If it didn't open on a wednesday, It would have well cleared this number.Not to say this isn't also a gargantuan success, but it's a bit of a "biggest opening for a videogame movie*" with a big asterisk situationDustC H A O SMemberOct 25, 201740,049He truly was Steve. louiedogMemberOct 25, 20178,771This weekend it truly became Ourcraft.otyMemberFeb 28, 20235,467we're gonna get so many video game adaptations, surely. critical reception of this movies has mostly been, atleast what i've seen, "it's so bad it's good" and it's making bank like this lollouisacommieMemberOct 25, 201717,781New JerseyFabs said:Surprised but not really this was bigger than MarioClick to expand...Click to shrink...Mario had a five day opening weekend so the comparison is not exact but makes sense mario and Minecraft would be the two biggest video game movies.GTA could maybe compete but being R rated and that it be kinda a generic crime thriller makes it weird to think off.BesiktasMemberSep 2, 2024735I hate when shitty products gets undeservedly succesfull. We had amazing adaptations that didn't make this much of success but horray this abomination gets huge moneyOnionPowderMemberOct 25, 201710,712Orlando, FLwill probably be seeing this with my daughter this week. Honestly, the crowd stuff sounds like it'd be a hoot.MidnightCowboyMemberOct 27, 20173,974Fully in my old man yells at cloud moment. All the videos of teenagers filming the screen and losing their shit at Chicken Jockeythe only thing more depressing is the state of our nation's politics. But to be honest, I believe they are connected.AudibleeMemberMar 14, 2025417Remember when people said MS overpaid for Minecraft? Jesus that thing prints money.BlthannaMemberFeb 15, 20231,038IrelandThe children truly do yearn to mine and craft.yallasamaMemberDec 7, 2022473Even fans who played the game thought at least the trailers made it seem awful. Not sure what the actual movie is supposed to be, but not sure if you're not a fan of the game that you could be even remotely entertained.Vincent AlexanderMemberOct 26, 201721,207yallasama said:Even fans who played the game thought at least the trailers made it seem awful. Not sure what the actual movie is supposed to be, but not sure if you're not a fan of the game that you could be even remotely entertained.Click to expand...Click to shrink...My son and his friends play Minecraft, thought it looked awful, and all went to go see it yesterday. So being awful in this case doesn't seem to be stopping people from seeing. They claimed it was bad, but the movie was packed and they still had a good time. DustC H A O SMemberOct 25, 201740,049There is also circus at McDonald's over those Minecraft collectibles. It's a perfect Minecraft shitstorm alongside this movie.Vincent AlexanderMemberOct 26, 201721,207Dust said:There is also circus at McDonald's over those Minecraft collectibles. It's a perfect Minecraft shitstorm alongside this movie.Click to expand...Click to shrink...Haha. Yep. After the movie we took them to McDonalds too......It's wild.Canas RenvallMemberMar 4, 20183,186Besiktas said:I hate when shitty products gets undeservedly succesfull.We had amazing adaptations that didn't make this much of success but horray this abomination gets huge moneyClick to expand...Click to shrink...Cope harder. Movie was a fun time, lol.zedoxMemberOct 28, 20175,302We In Da Buildin! Love to see this success. I enjoyed it with my wife and kids. Laughed a bunch of times cuz of Jack Black and Jason. Good stuff. Also, there's a Live Event that features areas from the movie (and the DLC)! It's fun and there only a day and some change left. You can earn the YEARN cape!DarkLordOtakuMemberJun 6, 20241,099Upper Marlboro, MarylandThis is wild to me.Mahaveer RaGOATnatanMemberJan 18, 20211,472Damn thats crazy.Didnt seem to have much hype here and seemed like it would flopThe_R3medyMemberJan 22, 20183,654WisconsinDoesn't shock me at all. As long as it was crowd pleasing and didn't try to differentiate too much from the world, it would be successful. Good for them, though. Hope Hess, Black, Mamoa, and the whole cast get huge backend paydays from this.poklaneMemberOct 25, 201731,530the NetherlandsMahaveer RaGOATnatan said:Damn thats crazy.Didnt seem to have much hype here and seemed like it would flopClick to expand...Click to shrink...It's almost like this is a movie aimed at kids, and there's little to none of them here.Kratos2098MemberFeb 18, 20222,652People going to see it because of the name alone. Shame shit movies like this do this well while much better adaptations don't because they aren't as well known.AstronaughtEMemberNov 26, 201712,757poklane said:It's almost like this is a movie aimed at kids, and there's little to none of them here.Click to expand...Click to shrink...And like maybe a dozen minecraft fans. Lots of parents who seem somewhat happy though! carlsojoShinra EmployeeMemberOct 28, 201736,715San FranciscoCouldn't be happier for Emma Myers (and the rest of the cast too!)big_zMemberNov 2, 20178,221Jack black is going to be nothing but a beard in the sequel.chainlinkspiralMemberOct 25, 201712,394louisacommie said:What is next Among us? Fortnite?Click to expand...Click to shrink...Yes. Where we dropping. Among Us has an animated show.bionic77MemberOct 25, 201732,847Mahaveer RaGOATnatan said:Damn thats crazy.Didnt seem to have much hype here and seemed like it would flopClick to expand...Click to shrink...This place trends extremely male and middle aged. It's very out of touch for certain things. My teens and their friends were into this even though they thought it looked bad. That buzz usually translates to money. surprised how big PCs are getting with the kids too.XterrianMemberApr 20, 20183,467People really underestimate how much of a cultural touchstone Minecraft is for anyone who grew up from 2009 onward.KanjoBazooie Legend AvengerOct 26, 201732,226Chicagolouisacommie said:What is next Among us? Fortnite?Click to expand...Click to shrink...Fortnite is a no brainer at this pointI'm not too familiar with Roblox but that couldn't be turned into a movie could it? Seems more like a platform than a game.HMDMemberOct 26, 20173,311Hopefully it drops off, it was a terrible movie that I hope doesn't turn into a franchise.I can't believe it's reviewing as badly well as the Super Mario movie when that one actually had a lot of soul and was a visual treat.OhlandoMemberAug 24, 2024993Audiblee said:Remember when people said MS overpaid for Minecraft? Jesus that thing prints money.Click to expand...Click to shrink...I had no idea the value of that purchase and it didn't make any sense at all to me.Max|PayneMemberOct 27, 20179,501Portugallouisacommie said:What is next Among us? Fortnite?Click to expand...Click to shrink...RobloxGiantEnemyCrabMemberOct 28, 20174,127louisacommie said:What is next Among us? Fortnite?Click to expand...Click to shrink...Roblox giancarlo123xOne Winged SlayerMemberOct 25, 201727,598Besiktas said:I hate when shitty products gets undeservedly succesfull.We had amazing adaptations that didn't make this much of success but horray this abomination gets huge moneyClick to expand...Click to shrink...Whats the amazing ones that you speak of?ALowTierHeroMemberMay 1, 2024231I work in a cinema and yeah. It is crazy right now. A week ago we had 4 admits a day, and since Friday we are hitting 700 daily.Knightbat05MemberNov 7, 20224,023Mahaveer RaGOATnatan said:Damn thats crazy.Didnt seem to have much hype here and seemed like it would flopClick to expand...Click to shrink...I mean, Minecraft as a game is barely talked about on era in general. It actually barely gets spoken about on here at all.Knightbat05MemberNov 7, 20224,023louisacommie said:What is next Among us? Fortnite?Click to expand...Click to shrink...Roblox!UzzyGabes little helperMemberOct 25, 201733,703Hull, UKPattern Recognition makes big bucks. Yeah I'm grumpy old woman yelling at clouds here, but jeez. Even Minecraft fans deserve a better movie than a cynical cash grab, but clearly that's all that's needed now.poptireAvatar Wrecking CrewThe FallenOct 25, 201714,478Besiktas said:I hate when shitty products gets undeservedly succesfull.We had amazing adaptations that didn't make this much of success but horray this abomination gets huge moneyClick to expand...Click to shrink...The sanctity of Minecraft's epic gritty storytelling has been fouled by this product for childrenZerpetteMemberJun 23, 20231,992MidnightCowboy said:Fully in my old man yells at cloud moment. All the videos of teenagers filming the screen and losing their shit at Chicken Jockeythe only thing more depressing is the state of our nation's politics. But to be honest, I believe they are connected.Click to expand...Click to shrink...There were riots at the premiere of Stravinsky's Le Sacre du printemps over a century ago. Sometimes experiencing a great work of art provokes a visceral reaction in the audience.YappaMemberOct 25, 20177,359Hamburg/GermanyAnyone here who watched it without "Went with kid" excuse?King DodongoMemberOct 27, 20177,695Thanks JackBlack and Emma.DekumanMemberOct 27, 201720,459Jack Black with another WI'm girding myself for the age of Video game adaptations, but glad to see some varierty with B.O. again, instead of just nonstop Marvel and Disney stuff
    0 Commentarios 0 Acciones 106 Views
  • WCCFTECH.COM
    A Tesla Uber-Bull Analyst Cuts His Price Target For The Stock By ~50 Percent, While Declaring That Darker Days Are Ahead
    This is not investment advice. The author has no position in any of the stocks mentioned. Wccftech.com has a disclosure and ethics policy.Tesla shares are now down around 40 percent so far this year, hammered by a fierce competition wave out of China and politically motivated boycotts in the US and the EU. Now, a Tesla uber-bull analyst seems to have read the proverbial writing on the wall by slashing his erstwhile sky-high stock price target by nearly half.To wit, Wedbush's Dan Ives has now slashed his price target for Tesla shares by 42.7 percent from $550 to $315, while retaining an overall 'Outperform' rating on the stock.Even though Ives asserts that his "long-standing bull view of Tesla remains," he adds a qualifier by conceding that "this is a pivotal moment of truth for Musk to turn things around...or darker days are ahead."Ives goes on to note:"We have been one of the biggest supporters of Musk and Tesla over the last decade....but this situation is not sustainable and the brand of Tesla is suffering by the day as a political symbol."In what constitutes a sooting salve for the frayed nerves of Tesla investors, the Wedbush analyst notes that "Musk has been with his back against the wall many times and every time Tesla came out of it and was stronger on the other side...this may be one of his biggest challenges yet to turn around."As mentioned earlier, Tesla sales have struggled lately in the face of stiff competition out of China and politically motivated boycotts in the EU and the US. Elon Musk recently alienated a large segment of the German population by vigorously supporting the far-right AfD party in recent elections. Meanwhile, in the US, Musk's DOGE-related activities continue to drive a political wedge into Tesla's brand image.And, now we have solid numbers to back assertions of ongoing brand damage. As we reported last week, Tesla's deliveries cratered to multi-year lows in the first quarter of 2025, with the EV giant managing to record sales of just 336,681 units in the recently-concluded quarter against expectations of 377,600 units (IR-compiled consensus estimate).What's more, Tesla's inventory level soared from 77,330 units at the end of Q4 2024 to 103,264 units at the end of Q1 2025, despite a retooling-driven extended halt across the EV giant's production lines ahead of the launch of the Model Y Juniper.While some analysts, including Future Fund's Gary Black, continue to expect a gradual reset in the prevailing narrative around Tesla as the upcoming launch of unsupervised FSD in Austin draws near, we have yet to see any material evidence of such a paradigm shift.Deal of the Day
    0 Commentarios 0 Acciones 105 Views
  • GAMERANT.COM
    The Longest-Reigning Kage In Naruto
    Being Hokage has always been Naruto Uzumaki's dream, and something he finally achieves after the birth of his son, Boruto, in a peaceful age after a wartorn era. While the Borutoseries shows that new threats are on the horizon after the age of peace ushered by the end of Naruto, fans are also shown just how the Kagesof the Hidden Villages will work hard to preserve the new joyful era they all helped bring forth during Naruto's journey.
    0 Commentarios 0 Acciones 88 Views
  • GAMEDEV.NET
    More crashes with try/catch
    Back in 2023, we had this issue: https://www.gamedev.net/forums/topic/714882-crash-in-trycatch-blocks/5459220/?page=1I am now running into a very similar issue:class Bar {}class Foo { Bar@ Bar; }void Main() {Foo@ f;for (int i = 0; i < 1000; i++) {try {auto foo = f.Bar;} catch { }}}When executing this, we get:<
    0 Commentarios 0 Acciones 89 Views