2020.04.14 19:59 FireNRGTales from the Flip - Imgflip being Imgflip
Imgflip is a meme generator primarily used for impact font image macros. While its meme generator is commonly used, its userbase is something not talked about often. Imgflip is loaded with awful right-wing boomer memes, poorly made memes made by kids new to the internet, and downright bizarre and messed up things if you do enough digging. This is a sub for horrible memes found there, strange interactions, and maybe some chat about the site itself. You get the idea.
2024.06.09 13:46 Complete_Ad7038Using python module to generate font file. It can properly access the .svg files, but throws this error: I'm sorry this file is too complex for me to understand (or is erroneous)
current_milo_surf = milo_surf # Default to normal image game_over = False collision = False while True:
for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() if not game\_over:
keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: milo_rect.x -= 5 animation_frame += animation_speed if animation_frame >= 2: animation_frame = 0 milo_surf = milo_flipped_surf if int(animation_frame) == 0 else milo_flipped_surf # Use flipped image when moving left if keys[pygame.K_RIGHT]: milo_rect.x += 5 animation_frame += animation_speed if animation_frame >=2: animation_frame = 0 milo_surf = current_milo_surf if int(animation_frame) == 0 else milo_surf # Use normal image when moving right if keys[pygame.K_UP] and milo_rect.bottom >= 600: milo_gravity = -13
# Wall boundary if milo\_rect.left < -460: milo\_rect.left = -460 screen.blit(backdrop\_surface,(0,0)) screen.blit(text\_surface,(330,20)) screen.blit(ball\_surface, (ball\_x\_pos, ball\_y\_pos)) screen.blit(milo\_surf,milo\_rect) # Milo gravity milo\_gravity += 1 milo\_rect.y += milo\_gravity if milo\_rect.bottom >= 600: milo\_rect.bottom = 600 # Update ball position ball\_y\_pos += 3 if ball\_y\_pos > screen.get\_height(): # Reset ball position after it leaves the screen
ball_y_pos = -400 ball_x_pos = random.randint(-450, screen_width - ball_surface_width) # Randomize horizontal position print(f'Ball reset to new position: x={ball_x_pos}, y={ball_y_pos}')
# Collision if ball\_rect.colliderect(milo\_rect): print('Please work') # draw all our elements # update everything pygame.display.update() clock.tick(60)
This is a code for my game. Im trying to make it when Milo( a monkey) collides with the ball, it would print collision(please work), but as soon as the ball goes on screen, or near milo, but not touching him, it prints collision. Im not sure whats wrong. Please help
2024.06.09 07:18 AlchemicCyborgDeck Validates, but the visual editor claims that it doesn't
so I'm putting together a card game for my final project in one of my classes, and have been using nanDeck to generate the cards. I've successfully made the cards without artwork so I could test the game, and what not, now that I've found some graphics that I want to use, I'm running in to two problems. Initially I can open the visual editor, and define the image box for the artwork, but when I go to build the deck, it doesn't place the artwork, and when I try to go back into the visual editor, it tells me that the deck can't validate, but the validate deck button doesn't kick back any errors. below is the script for the deck of cards I'm working on
I know I don't need to have the in to cm conversion variables, but I was testing how variables, and they work just fine. the only thing that is different from the card layout is that the images are jpgs, but I feel like that shouldn't. Not all of my cards have artwork right now, I just need a few of them for my class, so I wonder if that is where the trouble is. I'm going to play around with it, but I figured I would put some feelers out just in case I can't figure it out. TLDR; the artwork in my spreadsheet isn't being built onto my cards, and my visual editor says that my script doesn't validate when it actually does. edit: this isn't going to be a problem for my project, I've got a work around that will be acceptable for the moment. I mostly just want to know what I'm doing wrong so I can avoid it for my next project this summer.
I was playing on this modpack that I created just fine until it just started crashing on startup one day. I use modrinth and I get a yellow box indicating there was a crash and to check the logs that I've never seen before regarding a crashing issue. It didn't provide me with a crash log that I could see so I copied the log. Most of the errors are at the bottom of the long log so, but I wanted to post the entire thing just incase it helps with anything. [22:17:06] [main/INFO]: Loading Minecraft 1.20.1 with Fabric Loader 0.15.11 [22:17:06] [main/INFO]: Loading 286 mods:
-- com_akuleshov7_ktoml-core-jvm 0.5.1 -- dev_isxander_settxi_settxi-core 2.10.6 \-- dev_isxander_settxi_settxi-kotlinx-serialization 2.10.6 [22:17:07] [main/INFO]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=file:/C:/Users/{COMPUTER_USERNAME}/AppData/Roaming/com.modrinth.theseus/meta/libraries/net/fabricmc/sponge-mixin/0.13.3+mixin.0.8.5/sponge-mixin-0.13.3+mixin.0.8.5.jar Service=Knot/Fabric Env=CLIENT [22:17:07] [main/INFO]: Compatibility level set to JAVA_17 [22:17:07] [main/WARN]: Reference map 'BetterFurnaces-fabric-refmap.json' for betterfurnaces.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/WARN]: Reference map 'cobblemonintegrations-fabric-refmap.json' for cobblemonintegrations.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/WARN]: Reference map 'codec-config-api-refmap.json' for codec-config-api.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/WARN]: Reference map 'ctov-fabric-fabric-refmap.json' for ctov.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/WARN]: Reference map 'ctov-common-common-refmap.json' for ctov-common.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/WARN]: Reference map 'JustEnoughResources-Fabric-1.20.1-refmap.json' for jeresources.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/INFO]: Loaded configuration file for Lithium: 115 options available, 0 override(s) found [22:17:07] [main/WARN]: Reference map 'monolib.refmap.json' for monolib.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/WARN]: Reference map 'monolib.refmap.json' for monolib.fabric.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/WARN]: Reference map 'newshieldvariants.refmap.json' for fabric-newshieldvariants.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/WARN]: Reference map 'newshieldvariants.refmap.json' for fabric-newshieldvariants.fabric.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/INFO]: Loaded configuration file for Sodium: 42 options available, 3 override(s) found [22:17:07] [main/INFO]: Loaded configuration file for Sodium Extra: 34 options available, 0 override(s) found [22:17:07] [main/WARN]: Reference map 'supermartijn642configlib.mixins.refmap.json' for supermartijn642configlib.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/WARN]: Reference map 'witherskeletonnds-fabric-refmap.json' for fabric-wsnds.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/WARN]: Reference map 'witherskeletonnds-common-refmap.json' for fabric-wsnds-common.mixins.json could not be read. If this is a development environment you can ignore this message [22:17:07] [main/WARN]: Error loading class: io/vram/frex/base/renderecontext/rendeEntityBlockRenderContext (java.lang.ClassNotFoundException: io/vram/frex/base/renderecontext/rendeEntityBlockRenderContext) [22:17:07] [main/WARN]: @Mixin target io.vram.frex.base.renderer.context.render.EntityBlockRenderContext was not found porting_lib_base.mixins.json:client.frex.EntityBlockRenderContextMixin from mod porting_lib_base [22:17:07] [main/WARN]: Error loading class: juuxel/adorn/block/variant/BlockVariantSets (java.lang.ClassNotFoundException: juuxel/adorn/block/variant/BlockVariantSets) [22:17:07] [main/WARN]: @Mixin target juuxel.adorn.block.variant.BlockVariantSets was not found mixins.cobblemon-common.json:invoker.AdornRegisterInvoker from mod cobblemon [22:17:08] [main/WARN]: Error loading class: fcatcore/servetranslations/api/resource/language/SystemDelegatedLanguage (java.lang.ClassNotFoundException: fcatcore/servetranslations/api/resource/language/SystemDelegatedLanguage) [22:17:08] [main/WARN]: Force-disabling mixin 'features.render.entity.CuboidMixin' as rule 'mixin.features.render.entity' (added by mods [iris]) disables it and children [22:17:08] [main/WARN]: Force-disabling mixin 'features.render.entity.ModelPartMixin' as rule 'mixin.features.render.entity' (added by mods [iris]) disables it and children [22:17:08] [main/WARN]: Force-disabling mixin 'features.render.entity.cull.EntityRendererMixin' as rule 'mixin.features.render.entity' (added by mods [iris]) disables it and children [22:17:08] [main/WARN]: Force-disabling mixin 'features.render.entity.shadows.EntityRenderDispatcherMixin' as rule 'mixin.features.render.entity' (added by mods [iris]) disables it and children [22:17:08] [main/WARN]: Force-disabling mixin 'features.render.gui.font.GlyphRendererMixin' as rule 'mixin.features.render.gui.font' (added by mods [iris]) disables it and children [22:17:08] [main/WARN]: Force-disabling mixin 'features.render.world.sky.BackgroundRendererMixin' as rule 'mixin.features.render.world.sky' (added by mods [iris]) disables it and children [22:17:08] [main/WARN]: Force-disabling mixin 'features.render.world.sky.ClientWorldMixin' as rule 'mixin.features.render.world.sky' (added by mods [iris]) disables it and children [22:17:08] [main/WARN]: Force-disabling mixin 'features.render.world.sky.WorldRendererMixin' as rule 'mixin.features.render.world.sky' (added by mods [iris]) disables it and children [22:17:08] [main/INFO]: Searching for graphics cards... [22:17:08] [main/INFO]: Initializing MixinExtras via com.llamalad7.mixinextras.service.MixinExtrasServiceImpl(version=0.3.5). [22:17:09] [main/INFO]: Found graphics card: GraphicsAdapterInfo[vendor=NVIDIA, name=NVIDIA GeForce RTX 3060 Ti, version=DriverVersion=32.0.15.5599] [22:17:09] [main/WARN]: Sodium has applied one or more workarounds to prevent crashes or other issues on your system: [NVIDIA_THREADED_OPTIMIZATIONS] [22:17:09] [main/WARN]: This is not necessarily an issue, but it may result in certain features or optimizations being disabled. You can sometimes fix these issues by upgrading your graphics driver. [22:17:10] [main/WARN]: @Inject(@At("INVOKE")) Shift.BY=3 on golemfirststonemod.mixins.json:MixinMinecraftClient from mod golemfirststonemod::handler$ceh000$golemfirststonemod$inject_doAttack_swingDandoriItem exceeds the maximum allowed value: 0. Increase the value of maxShiftBy to suppress this warning. [22:17:10] [main/WARN]: @Inject(@At("INVOKE")) Shift.BY=2 on porting_lib_entity.mixins.json:common.LivingEntityMixin from mod porting_lib_entity::handler$eal000$porting_lib_entity$port_lib$onFinishUsing exceeds the maximum allowed value: 0. Increase the value of maxShiftBy to suppress this warning. [22:17:14] [Datafixer Bootstrap/INFO]: 188 Datafixer optimizations took 110 milliseconds [22:17:15] [main/WARN]: Method overwrite conflict for method_8183 in maxenchantx.mixins.json:LuckMixin from mod maxenchantx, previously written by com.zyga.maxenchantx.mixin.LootingMixin. Skipping method. [22:17:17] [Render thread/INFO]: Environment: authHost='https://authserver.mojang.com', accountsHost='https://api.mojang.com', sessionHost='https://sessionserver.mojang.com', servicesHost='https://api.minecraftservices.com', name='PROD' [22:17:17] [Render thread/INFO]: Setting user: {MINECRAFT_USERNAME}
2024.06.09 02:37 Either_Knowledge_269Error when querying with python and like()/ilike()
Hey guys, I’m new to supabase and wanted to use it with Python first. I’ve created a table “songs” with two entries like this: https://preview.redd.it/1v9i8aofvf5d1.png?width=1533&format=png&auto=webp&s=f5e2d97b269925fe4636719036f1dbd8576ea3a3 The problem I run into: When I query the database via the genre to get back the first song it only works with the eq() function and an exact match but it doesn’t work with like() or ilike(), no matter what I try (of course I didn’t use x and y but the real url and api key):
2024.06.09 02:26 Jaybee-94Whey Protein Options with Histamine Intolerance
Hey Guys Just a a quick overview, I am a South Asian male with diagnosed histamine intolerance with the allergy test done. I have been dealing with it since 2017. It was completely gone for almost 5 years and then after covid vaccine in 2022, It suddenly came back with vengeance and after a brief period of headaches, my lips started swelling and ever since I am taking a third generation anti-histamine. Now, being with poor muscle building traits from South Asian community combined with the restrictions from the SIGHI chart, I am more or left with the only option of whey protein to help me build muscle. However, being skeptic of the sensitivity, I tried to go with Vegan whey protein as it had no added L-Histidine. I bought it this morning and took it 3hrs after taking my daily Quercetin tablet. There was a very mild reaction on my face, with some redness and a mild rash. I checked the ingredients and the fine font said that it contains fermented rice protein and fermented pea protein. I can still replace the protein with some other brand but I don't want to go through the hit and trial as I don't want to roam around with lips like Pamela Anderson. Another question, is there any good good book that can help me really understand the underlying mechanisms? I really want to know what tools I have on hand to control it without altering my life much as I don't want to get stuck on anti-histamine tablets for the rest of my life. I tried using the Vitamin C but bought the ascorbic acid one and had a bad reaction. So I guess, researching it is the only thing I can do right now as the doctor simply said that they are not going to do any further testing as my symptoms are controllable with the antihistamines. That being said genetic testing is very expensive if I have to pay out of pocket. I will heartily appreciate any suggestions.
I'm looking to commission someone to generate wall art with the Six Feet Under quote, "You can't take a picture of this. It's already gone." 20×30 (to be hung vertically), off-white/ivory burlap, with some sort of light/rose pink floral accents in two or four of the corners. I'm not sure what colostyle of font would look best, but something romantic and not too boxy. I'll be framing it myself. Name your price, as I have no clue what a project of this type will cost.
2024.06.08 23:16 Fabulous_Session3993UI events getting triggered only some of the times
Reaching out after spending at least 20 hours on this. I am trying to use nicegui with langgraph streaming responses. On the terminal, I am able to the responses from langgraph, but they appear on nicegui only some of the times. Here's the code for nicegui (relevant part inside the for loop, async for event in supervisor_main(question)):
def main(): messages = Messages(messages=[]) @ui.refreshable def show_messages(): ui.notify("Showing messages", color="yellow") with ui.column(): ui.label("Messages").props("text-align='center' text-size='xl'") for message in messages.messages: ui.chat_message(text=message.content, name=message.name).props("bg-color='red' text-color='white'") async def send() -> None: question = text.value messages.add_message(content=question, name='You') show_messages.refresh() text.value = '' with message_container: ui.chat_message(text=question, name='You', sent=True).props("bg-color='blue' text-color='white'") response_message = ui.chat_message(name='Bot', sent=False) spinner = ui.spinner(type='dots') response = '' # events = supervisor_main(question) with message_container: # HELP NEEDED HERE async for event in supervisor_main(question): # I CAN SEE THE EVENT ON THE TERMINAL, BUT UI.NOTIFY TRIGGERS SOME OF THE TIMES print(f"Received event: {event}") ui.notify(f"Got event") # Debug: Notify the received event # for key in event: # if 'messages' in event[key]: # for message in event[key]['messages']: # response += message.content + '\n\n' response += str(event) + '\n\n' response_message.clear() with response_message: ui.markdown(response) messages.add_message(content=response, name='Bot') show_messages.refresh() if any(isinstance(value, dict) and value.get('next') == 'FINISH' for value in event.values()): print("Generator has finished.") ui.notify("Generator has finished", color='purple') break message_container.remove(spinner) ui.add_css(r'a:link, a:visited {color: inherit !important; text-decoration: none; font-weight: 500}') ui.query('.q-page').classes('flex') ui.query('.nicegui-content').classes('w-full') with ui.tabs().classes('w-full') as tabs: chat_tab = ui.tab('Chat') logs_tab = ui.tab('Logs') with ui.tab_panels(tabs, value=chat_tab).classes('w-full max-w-2xl mx-auto flex-grow items-stretch'): message_container = ui.tab_panel(chat_tab).classes('items-stretch') with message_container: show_messages() with ui.tab_panel(logs_tab): log = ui.log().classes('w-full h-full') with ui.footer().classes('bg-white'), ui.column().classes('w-full max-w-3xl mx-auto my-6'): with ui.row().classes('w-full no-wrap items-center'): placeholder = 'message' if os.environ['OPENAI_API_KEY'] != 'not-set' else \ 'Please provide your OPENAI key in the Python script first!' text = ui.input(placeholder=placeholder).props('rounded outlined input-class=mx-3') \ .classes('w-full self-center').on('keydown.enter', send) Relevant part of the langgraph code: async def supervisor_main(human_message: str, thread_id: str = "2"): config = {"configurable": {"thread_id": thread_id}} graph = compiled_graph # Use the pre-compiled graph for s in graph.stream( { "messages": [ HumanMessage(content=human_message) ] }, config ): print("Yielding") ui.notify("Yielding") yield s
at com.mojang.authlib.exceptions.MinecraftClientException.toAuthenticationException(MinecraftClientException.java:31) ~[authlib-5.0.47.jar:?] at com.mojang.authlib.yggdrasil.YggdrasilUserApiService.fetchProperties(YggdrasilUserApiService.java:163) ~[authlib-5.0.47.jar:?] at com.mojang.authlib.yggdrasil.YggdrasilUserApiService.(YggdrasilUserApiService.java:53) ~[authlib-5.0.47.jar:?] at com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService.createUserApiService(YggdrasilAuthenticationService.java:55) ~[authlib-5.0.47.jar:?] at net.minecraft.client.MinecraftClient.createUserApiService(MinecraftClient.java:787) ~[client-intermediary.jar:?] at net.minecraft.client.MinecraftClient.(MinecraftClient.java:451) ~[client-intermediary.jar:?] at net.minecraft.client.main.Main.main(Main.java:214) ~[1.20.2-0.15.3.jar:?] at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:470) ~[fabric-loader-0.15.3.jar:?] at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:74) ~[fabric-loader-0.15.3.jar:?] at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23) ~[fabric-loader-0.15.3.jar:?] Caused by: com.mojang.authlib.exceptions.MinecraftClientException: Failed to read value Service unavailable
2024.06.08 17:14 jeremyromausaSocial Media Strategies by Jeremy Roma_ Leveraging Platforms for Brand Awareness and Growth
In today's digital age, social media has emerged as a powerful tool for entrepreneurs to connect with their audience, build brand awareness, and drive business growth. With billions of active users across various platforms, social media offers entrepreneurs unprecedented access to a global audience and a plethora of opportunities to engage with customers, showcase their products or services, and foster meaningful relationships. In this blog, we'll explore effective social media strategies that entrepreneurs can leverage to maximize brand awareness and propel their businesses to new heights.
Understanding Your Audience: Tailoring Content to Fit
The foundation of any successful social media strategy lies in understanding your target audience – their demographics, interests, preferences, and behaviors. By conducting thorough market research and audience analysis, entrepreneurs can gain valuable insights into who their audience is and what resonates with them. Armed with this knowledge, entrepreneurs can tailor their content and messaging to fit the preferences and interests of their audience, ensuring that every post, tweet, or video is relevant and engaging.
Moreover, understanding your audience allows entrepreneurs to identify the most effective social media platforms for reaching and engaging with their target demographic. Whether it's Instagram for visually appealing content, LinkedIn for professional networking, or TikTok for reaching younger audiences, choosing the right platforms to focus on maximizes the impact of your social media efforts. By understanding your audience and tailoring your content to fit their preferences, entrepreneurs like Jeremy Roma create a compelling social media presence that resonates with their target demographic and drives engagement and growth.
Establishing a Consistent Brand Identity: Building Trust and Recognition
Consistency is key to building a strong brand presence on social media. Entrepreneurs must establish a consistent brand identity across all social media platforms, including logos, colors, fonts, and messaging, to ensure that their brand is easily recognizable and memorable. By maintaining a cohesive brand identity, entrepreneurs can build trust and credibility with their audience, reinforcing their brand values and positioning themselves as reliable and trustworthy.
Moreover, consistency extends beyond visual elements to include tone of voice, posting frequency, and content themes. Entrepreneurs should develop a content calendar and posting schedule to ensure regular and consistent updates across their social media channels. This not only keeps followers engaged and informed but also reinforces the brand's presence in the minds of consumers. By establishing a consistent brand identity and posting schedule, visionary leaders such as Jeremy Roma build trust and recognition with their audience, driving brand awareness and fostering loyalty over time.
Engaging with Your Audience: Fostering Meaningful Interactions
Social media is inherently social, and successful entrepreneurs understand the importance of engaging with their audience in meaningful ways. Responding promptly to comments, messages, and mentions shows that you value your audience's input and are attentive to their needs. Moreover, entrepreneurs can foster engagement by asking questions, soliciting feedback, and encouraging user-generated content, such as reviews, testimonials, or user-generated photos and videos.
Furthermore, leveraging interactive features such as polls, quizzes, and live streams can create opportunities for real-time engagement and interaction with your audience. By facilitating two-way communication and dialogue, industry leaders including Jeremy Roma strengthen relationships with their audience, humanize their brand, and foster a sense of community and belonging. Additionally, engaging with your audience allows entrepreneurs to gather valuable insights, feedback, and market intelligence that can inform product development, marketing strategies, and business decisions.
Creating Compelling Content: Capturing Attention and Interest
Compelling content is the lifeblood of any successful social media strategy. Entrepreneurs must create content that captures the attention and interest of their audience, compelling them to stop scrolling and engage with their posts. This could include a variety of content types, such as eye-catching visuals, informative videos, engaging stories, or thought-provoking articles, tailored to fit the preferences and interests of your audience.
Moreover, entrepreneurs should strive to create content that provides value to their audience, whether it's educational, entertaining, or inspiring. By sharing valuable insights, tips, or behind-the-scenes glimpses into your business, entrepreneurs like Jeremy Roma position themselves as industry experts and thought leaders, building credibility and trust with their audience. Additionally, incorporating storytelling techniques into your content can create emotional connections with your audience, making your brand more relatable and memorable.
Leveraging Influencer Partnerships: Amplifying Reach and Credibility
Influencer partnerships can be a powerful strategy for expanding your brand's reach and credibility on social media. Collaborating with influencers who have a relevant and engaged following allows entrepreneurs to tap into their audience and leverage their credibility and influence to promote their products or services. Whether it's sponsored posts, product reviews, or influencer takeovers, partnering with influencers can expose your brand to new audiences and drive traffic, engagement, and sales.
Furthermore, influencers can provide valuable social proof and endorsement for your brand, lending credibility and authenticity to your products or services. Consumers are more likely to trust recommendations from influencers they follow than traditional advertising, making influencer partnerships an effective way to build trust and credibility with your target audience. By leveraging influencer partnerships, visionary leaders such as Jeremy Roma amplify their brand's reach, enhance their credibility, and drive growth and conversion on social media.
Social media strategies are indispensable tools for entrepreneurs to maximize brand awareness and drive business growth in today's digital age. By understanding their audience, establishing a consistent brand identity, engaging with their audience, creating compelling content, and leveraging influencer partnerships, entrepreneurs can unlock the full potential of social media to connect with their audience, build trust and credibility, and propel their businesses to new heights. As entrepreneurs continue to innovate and adapt their social media strategies, they can capitalize on the vast opportunities that social media platforms offer to achieve their business objectives and create lasting impact in their industries.
""" # Write the HTML content to a file with open('top_100_songs.html', 'w') as file: file.write(html_content) # Open the HTML file in the default web browser webbrowser.open('top_100_songs.html')
2024.06.08 15:44 AlexSand_Working without Godot editor
Hi, I sometimes hear from other gamedevs that they avoid engines because they prefer a "code first" approach. Thus I'd like to present the way I work with Godot, using almost only code. By that I mean this:
I basically have a single empty main "scene"
all nodes are fully defined and instantiated from code.
I'm using C#, and when defining node trees I make heavy use of extension methods, to make the nodes configuration more compact and I believe easier to read (at least for me - you will tell me :) ) To make this more concrete, here a (fake) sample of some UI code instantiating a few nodes: ``` // A pannel with a title and two buttons vertically aligned public class MyTestPanel: PanelContainer { public MyTestPanel(string title) // Not a scene; I don't need parameterless constructor ! { var vbox = new VBoxContainer() .SetSeparator(15); // SetSeparator is an extension method, I let you guess what it does
new Label() .WithTxt(title) // WithTxt is an extension method, which just does what you think and allows one-liners. .SetFont(GobFont.SmallTitle) // another extension method .SetFontColor(Colors.Red) // ... .AsChildOf(vbox); // equivalent to vbox.Addchild(label). But this way I don't even need a variable name for this label new DoStuffButton(OnButton1, "Button 1") // custom subclass of button which connects to the action I pass as parameter .AsChildOf(vbox) .SetLayoutAndFlags(LayoutPreset.TopRight); // aligning to the right new DoStuffButton(OnButton2, "Exit ") .AsChildOf(vbox) .SetLayoutAndFlags(LayoutPreset.TopRight); vbox.WrapInMarginsContainer(20) // puts vbox ina margin container and returns the margin container .AsChildOf(this); // finally adding vbox to the scene } void OnButton1() => GD.Print("hello"); void OnButton2() => this.GetTree().Quit();
} // empty placeholder scene for testing -- here I have a tscn file in the editor, refering to this script and containing nothing else. public class TestScene : Control { public TestScene() { this.SetTheme(); this.RectMinSize = new Vector2(1920, 1080);
new MyTestPanel("My test panel title") // class defined belows .AsChildOf(this) // adding it to the tree .SetLayoutAndFlags(LayoutPreset.Center); // and centering it }
} ``` ( Result here: https://imgur.com/yv44cBI ) Of course this is just a dummy example; if you really want to see what kind of game I'm making this way (spoiler alert: with goblins and silly quest)you can have a look to my steam page (and we are between devs - I know you're not here for that; but I don't need to explain you why wishlisting would help me ;) ) Reasons why I mostly do not use the editor Of course, you may wonder why I work this way. The main answer could be summarised as "personal preferences", but here are some more argumented reasons. Please note here that I'm not saying you should not use the editor!! These are just the reasons why I'm * personnally * more confortable working this way. Scene refactoring Quite often, I will want to make a new "scene" which has strong similarities to another already defined scene. With my code-only approach, a "scene" is only a subclass of some kind of node, it is quite easy to either extract a base abstract class and make two concrete subclasses, or to extract some components or function to reuse. When I tried working with the editor, my experience trying to refactor one scene in two similar subscenes was less good. No magic strings well, when I see code like this.GetNode("some_magic_name"); my eyes cry. Indeed, with the structure of the scene defined in the editor, changes to this scructure will require to change the code; I find this just difficult to maintain. the same thing goes with signals: for a custom signal, I can write something like: public const string _signaWithMeaningVariableName = "whatever_string_I_dont_care"; this.Connect(_signaWithMeaningVariableName, targetNode, nameof(OnSomeEventMethod)); I am never scared about renaming the signal or a method, because I know that there's nothing in some config file somewhere relying on this exact name. No parameter-less constructors Most of my node subclasses require some parameters to be correctly instanciated. I much prefer having all these parameters directly in the constructor, and since these nodes are not editor defined scene I just don't need a parameterless constructor. Generated world Another reason why I'm not so much using the editor is that my game content is for a large part procedurally generated. I don't have "predefined" characters, or locations, tilemap, ... to put in the editor, they are all procedurally generated from code. That was my "initial" reason for trying to work without the editor. But once I got used to this code-only approach, I used it also for part of the game where this argument is not really valid, such as the game ui. (no my UI is not procedurally generated, I'm not that crazy yet : ). And what about the drawbacks? Well, obviously once in a while I would prefer to just click in the editor to correct some missplaced ui component than having to guess the right number of pixels and recompile :) For me, this is not enough to outbalance the reasons above why I prefer skipping the editor; but once again that's just personal preferences. But here we arrive to what I believe is a very strong point of Godot: I can mix working 99.9% from code and once in a while use the editor !! I actually use it a bit to quickly load a scene difficult to reach from the game (making an empty test scene) , and I use it also for animations and particles. Making animations. Ok, disclaimer here; animations are not my strong point. But I still use a few animations for my characters and enemies, and here I did use the editor to define these animations. What's tre trick if I don't have scenes? The sub tree I wanted to animate is made of a few sprites, with a structure like this: character root -- foot (Node2d) -- head (Node2d) -- body (Node2d) -- shield (Node2d) -- weapon (Node2d) -- AnimationPlayer ... plus tons of other subnodes irrelevant to the animation. So I made a scene in the editor with an exact copy of sub tree above. In the editor I added some sprites below these node2ds to view what happens, defined the animations in the animation editor, and exported the animations as standalone resources files. After that, I can just load the animations from code on the code defined scene and it works. The only constraint for this to work is that I have to keep the same tree structure and node names in this "fake" scene and in my code. Since it is just one single scene, this was not really an issue. To summarize, I really like the fact that Godot does not enforce using the editor, and is perfectly usable this way. I hope this post will motivate "code first" to try godot, which I believe provides a lot of value even in this less usual workflow.
2024.06.08 09:58 Competitive-Jello924Revolutionizing Web Design: Why Tailwind CSS is a Game-Changer
Tailwind CSS: The Future of Utility-First CSS Frameworks in Web Development If you've been anywhere near the web development scene, chances are you've heard about Tailwind CSS. It's not just another CSS framework; it’s a paradigm shift in crafting modern web applications. Let's break down why Tailwind CSS is making waves and how it’s transforming the way we style web interfaces. Utility-First Approach Tailwind CSS takes a utility-first approach to styling. Instead of writing custom CSS for each element, you leverage predefined classes directly in your HTML. This might sound like a recipe for chaos, but it's surprisingly elegant.
No more hunting down CSS files.
Keep your styles consistent and easily maintainable.
Quick prototyping with predictable class names.
Customizability and Theme Expansion Tailwind offers unparalleled customizability. Using its configuration file, you can tweak everything from color palettes to breakpoints. Plus, you can extend its utility classes to fit any project’s needs. javascript // tailwind.config.js module.exports = { theme: { extend: { colors: { primary: { light: '#3d84f7', DEFAULT: '#3b82f6', dark: '#1e40af', }, }, }, }, } Performance & Clean CSS You might worry about performance implications of utility-first styles, but Tailwind's JIT (Just-In-Time) mode proves otherwise. This feature generates only the necessary styles on-the-fly, resulting in minimal CSS payloads. Configuring JIT mode: javascript // tailwind.config.js module.exports = { mode: 'jit', purge: [ './src/**/*.html', './src/**/*.js', './src/**/*.jsx', ], // other configurations } Flexibility & Scalability Tailwind can handle projects of all sizes—from small websites to large-scale applications. Since the framework is just a set of utilities, you can easily integrate it with JavaScript frameworks like React, Vue, or Angular. Example with React: ```jsx import React from 'react'; const Button = () => ( ); export default Button; ``` Component-Based Design Tailwind encourages a component-based design approach. Through the use of tools like @apply directive, you can minimize repetition and keep your code DRY (Don't Repeat Yourself). css /* styles.css */ .btn-primary { @apply bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded; } Community & Ecosystem The Tailwind CSS community is growing rapidly, offering a rich ecosystem of plugins, presets, and pre-built components. Resources like Tailwind UI and Heroicons can accelerate your development without compromising quality. Final Thoughts Tailwind CSS shifts the traditional styling paradigm, harmonizing utility-first principles with unparalleled flexibility. Whether you're a seasoned developer or a newcomer, incorporating Tailwind into your toolkit can streamline your workflow and elevate your web projects. What’s been your experience with Tailwind CSS? Any tips or favorite plugins to share? Let's get the conversation going!
Running 'gradlew :app:bundleRelease' in /home/expo/workingdibuild/android Downloading https://services.gradle.org/distributions/gradle-8.6-all.zip 10 %. 20% 30% 40% 50%. 60 %. 70 %. 80% 90% 100% Welcome to Gradle 8.6! Here are the highlights of this release:
Configurable encryption key for configuration cache
Checking the license for package NDK (Side by side) 26.1.10909125 in /home/expo/Android/Sdk/licenses License for package NDK (Side by side) 26.1.10909125 accepted. Preparing "Install NDK (Side by side) 26.1.10909125 v.26.1.10909125". "Install NDK (Side by side) 26.1.10909125 v.26.1.10909125" ready. Installing NDK (Side by side) 26.1.10909125 in /home/expo/Android/Sdk/ndk/26.1.10909125 "Install NDK (Side by side) 26.1.10909125 v.26.1.10909125" complete. "Install NDK (Side by side) 26.1.10909125 v.26.1.10909125" finished.
Configure project :expo
Using expo modules
[32mexpo-application[0m (5.9.1)
[32mexpo-asset[0m (10.0.7)
[32mexpo-constants[0m (16.0.2)
[32mexpo-device[0m (6.0.2)
[32mexpo-file-system[0m (17.0.1)
[32mexpo-font[0m (12.0.6)
[32mexpo-image-loader[0m (4.7.0)
[32mexpo-image-picker[0m (15.0.5)
[32mexpo-keep-awake[0m (13.0.2)
[32mexpo-location[0m (17.0.1)
[32mexpo-modules-core[0m (1.12.13)
[32mexpo-notifications[0m (0.28.7)
Checking the license for package Android SDK Build-Tools 34 in /home/expo/Android/Sdk/licenses License for package Android SDK Build-Tools 34 accepted. Preparing "Install Android SDK Build-Tools 34 v.34.0.0". "Install Android SDK Build-Tools 34 v.34.0.0" ready. Installing Android SDK Build-Tools 34 in /home/expo/Android/Sdk/build-tools/34.0.0 "Install Android SDK Build-Tools 34 v.34.0.0" complete. "Install Android SDK Build-Tools 34 v.34.0.0" finished. Checking the license for package Android SDK Platform 34 in /home/expo/Android/Sdk/licenses License for package Android SDK Platform 34 accepted. Preparing "Install Android SDK Platform 34 (revision 3)". "Install Android SDK Platform 34 (revision 3)" ready. Installing Android SDK Platform 34 in /home/expo/Android/Sdk/platforms/android-34 "Install Android SDK Platform 34 (revision 3)" complete. "Install Android SDK Platform 34 (revision 3)" finished. WARNING: The specified Android SDK Build Tools version (33.0.0) is ignored, as it is below the minimum supported version (34.0.0) for Android Gradle Plugin 8.2.1. Android SDK Build Tools 34.0.0 will be used. To suppress this warning, remove "buildToolsVersion '33.0.0'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools. WARNING: The specified Android SDK Build Tools version (33.0.0) is ignored, as it is below the minimum supported version (34.0.0) for Android Gradle Plugin 8.2.1. Android SDK Build Tools 34.0.0 will be used. To suppress this warning, remove "buildToolsVersion '33.0.0'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools. Path for java installation '/uslib/jvm/openjdk-17' (Common Linux Locations) does not contain a java executable
The NODE_ENV environment variable is required but was not specified. Ensure the project is bundled with Expo CLI or NODE_ENV is set. Proceeding without mode-specific .env
provider#expo.modules.filesystem.FileSystemFileProvider@android:authorities was tagged at AndroidManifest.xml:6 to replace other declarations but no other declaration present
meta-data#com.facebook.soloader.enabled@android:value was tagged at AndroidManifest.xml:8 to replace other declarations but no other declaration present
package="com.rnmaps.maps" found in source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/react-native-maps/android/src/main/AndroidManifest.xml. Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported, and the value is ignored. Recommendation: remove package="com.rnmaps.maps" from the source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/react-native-maps/android/src/main/AndroidManifest.xml.
package="com.reactnativecommunity.geolocation" found in source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/@react-native-community/geolocation/android/src/main/AndroidManifest.xml. Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported, and the value is ignored. Recommendation: remove package="com.reactnativecommunity.geolocation" from the source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/@react-native-community/geolocation/android/src/main/AndroidManifest.xml.
package="com.reactnativecommunity.asyncstorage" found in source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/@react-native-async-storage/async-storage/android/src/main/AndroidManifest.xml. Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported, and the value is ignored. Recommendation: remove package="com.reactnativecommunity.asyncstorage" from the source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/@react-native-async-storage/async-storage/android/src/main/AndroidManifest.xml.
package="com.reactnativenavigation" found in source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/react-native-navigation/lib/android/app/src/main/AndroidManifest.xml. Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported, and the value is ignored. Recommendation: remove package="com.reactnativenavigation" from the source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/react-native-navigation/lib/android/app/src/main/AndroidManifest.xml.
package="com.th3rdwave.safeareacontext" found in source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/react-native-safe-area-context/android/src/main/AndroidManifest.xml. Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported, and the value is ignored. Recommendation: remove package="com.th3rdwave.safeareacontext" from the source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/react-native-safe-area-context/android/src/main/AndroidManifest.xml.
package="com.swmansion.rnscreens" found in source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/react-native-screens/android/src/main/AndroidManifest.xml. Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported, and the value is ignored. Recommendation: remove package="com.swmansion.rnscreens" from the source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/react-native-screens/android/src/main/AndroidManifest.xml.
package="com.brentvatne.react" found in source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/react-native-video/android/src/main/AndroidManifest.xml. Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported, and the value is ignored. Recommendation: remove package="com.brentvatne.react" from the source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/react-native-video/android/src/main/AndroidManifest.xml.
package="com.oblador.vectoricons" found in source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/react-native-vector-icons/android/src/main/AndroidManifest.xml. Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported, and the value is ignored. Recommendation: remove package="com.oblador.vectoricons" from the source AndroidManifest.xml: /home/expo/workingdibuild/node_modules/react-native-vector-icons/android/src/main/AndroidManifest.xml.
/home/expo/workingdibuild/node_modules/@react-native-async-storage/async-storage/android/src/main/java/com/reactnativecommunity/asyncstorage/AsyncStorageModule.java:84: warning: [removal] onCatalystInstanceDestroy() in NativeModule has been deprecated and marked for removal public void onCatalystInstanceDestroy() { ^ Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: /home/expo/workingdibuild/node_modules/@react-native-async-storage/async-storage/android/src/javaPackage/java/com/reactnativecommunity/asyncstorage/AsyncStoragePackage.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 1 warning
warning: Bundler cache is empty, rebuilding (this may take a minute) Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Task :expo-modules-core:compileReleaseKotlin
w: file:///home/expo/workingdibuild/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/permissions/PermissionsService.kt:20:26 'Promise' is deprecated. AsyncFunction will crash when called. Use expo.modules.kotlin.Promise instead w: file:///home/expo/workingdibuild/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/permissions/PermissionsService.kt:63:51 'Promise' is deprecated. AsyncFunction will crash when called. Use expo.modules.kotlin.Promise instead w: file:///home/expo/workingdibuild/node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/permissions/PermissionsService.kt:90:54 'Promise' is deprecated. AsyncFunction will crash when called. Use expo.modules.kotlin.Promise instead w: file:///home/expo/workingdibuild/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/defaultmodules/CoreModule.kt:6:34 'ReactFeatureFlags' is deprecated. Deprecated in Java w: file:///home/expo/workingdibuild/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/defaultmodules/CoreModule.kt:71:12 'ReactFeatureFlags' is deprecated. Deprecated in Java w: file:///home/expo/workingdibuild/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/events/KModuleEventEmitterWrapper.kt:97:7 'constructor Event>!>(Int)' is deprecated. Deprecated in Java w: file:///home/expo/workingdibuild/node_modules/expo-modules-core/android/src/main/java/expo/modules/kotlin/types/JSTypeConverterHelper.kt:44:17 'get(String!): Any?' is deprecated. Deprecated in Java
Task :app:createBundleReleaseJsAndAssets
Writing bundle output to: /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle Writing sourcemap output to: /home/expo/workingdibuild/android/app/build/intermediates/sourcemaps/react/release/index.android.bundle.packager.map Copying 46 asset files Done writing bundle output Done writing sourcemap output /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:763:63: warning: Direct call to eval(), but lexical scope is not supported. ...typeof expo === "undefined" ? eval("require") : function (moduleId) { ^~~~~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:3412:16: warning: the variable "SharedArrayBuffer" was not declared in function "from" if (typeof SharedArrayBuffer !== 'undefined' && (isInstance(value, Shared... ^~~~~~~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:7413:18: warning: the variable "DebuggerInternal" was not declared in function "__shouldPauseOnThrow" typeof DebuggerInternal !== 'undefined' && ^~~~~~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:19724:7: warning: the variable "setTimeout" was not declared in function "logCapturedError" setTimeout(function () { ^~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:17834:31: warning: the variable "nativeFabricUIManager" was not declared in anonymous function " 371#" var _nativeFabricUIManage = nativeFabricUIManager, ^~~~~~~~~~~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:17862:21: warning: the variable "clearTimeout" was not declared in anonymous function " 371#" cancelTimeout = clearTimeout; ^~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:22492:30: warning: the variable "__REACT_DEVTOOLS_GLOBAL_HOOK__" was not declared in anonymous function " 371#" if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:24052:5: warning: the variable "setImmediate" was not declared in function "handleResolved" setImmediate(function () { ^~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:28105:5: warning: the variable "fetch" was not declared in anonymous function " 582#" fetch, ^~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:28106:5: warning: the variable "Headers" was not declared in anonymous function " 582#" Headers, ^~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:28107:5: warning: the variable "Request" was not declared in anonymous function " 582#" Request, ^~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:28108:5: warning: the variable "Response" was not declared in anonymous function " 582#" Response ^~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:28265:24: warning: the variable "FileReader" was not declared in function "readBlobAsArrayBuffer" var reader = new FileReader(); ^~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:28316:36: warning: the variable "Blob" was not declared in anonymous function " 593#" } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { ^~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:28318:40: warning: the variable "FormData" was not declared in anonymous function " 593#" } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { ^~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:28320:44: warning: the variable "URLSearchParams" was not declared in anonymous function " 593#" ...e if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body... ^~~~~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:28439:26: warning: the variable "AbortController" was not declared in anonymous function " 599#" var ctrl = new AbortController(); ^~~~~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:28572:23: warning: the variable "XMLHttpRequest" was not declared in anonymous function " 603#" var xhr = new XMLHttpRequest(); ^~~~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:28118:71: warning: the variable "self" was not declared in anonymous function " 585#" ...undefined' && globalThis typeof self !== 'undefined' && self ^~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:32155:27: warning: the variable "performance" was not declared in anonymous function " 760#" if ("object" === typeof performance && "function" === typeof performance.no... ^~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:32178:26: warning: the variable "navigator" was not declared in anonymous function " 760#" "undefined" !== typeof navigator && undefined !== navigator.scheduling && u... ^~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:32288:37: warning: the variable "MessageChannel" was not declared in anonymous function " 760#" };else if ("undefined" !== typeof MessageChannel) { ^~~~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:32303:34: warning: the variable "nativeRuntimeScheduler" was not declared in anonymous function " 760#" ... = "undefined" !== typeof nativeRuntimeScheduler ? nativeRuntimeScheduler.... ^~~~~~~~~~~~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:44100:34: warning: the variable "requestAnimationFrame" was not declared in function "start 9#" ... this._animationFrame = requestAnimationFrame(this.onUpdate.bind(this)); ^~~~~~~~~~~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:148052:56: warning: the variable "document" was not declared in anonymous function " 3685#" ...(e = e ("undefined" != typeof document ? document : undefined))) return... ^~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:148329:42: warning: the variable "Element" was not declared in function "equal" ...f (hasElementType && a instanceof Element && b instanceof Element) return ... ^~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:172403:76: warning: the variable "Buffer" was not declared in function "convertValue" ... 'function' ? new Blob([value]) : Buffer.from(value); ^~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:178620:23: warning: the property "height" was set multiple times in the object definition. height: _reactNative.Dimensions.get("screen").width * 0.2 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /home/expo/workingdibuild/android/app/build/generated/assets/createBundleReleaseJsAndAssets/index.android.bundle:178619:23: note: The first definition was here. ... height: _reactNative.Dimensions.get("screen").height * 0.2, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':react-native-navigation:compileReactNative71ReleaseKotlin'.
Inconsistent JVM-target compatibility detected for tasks 'compileReactNative71ReleaseJavaWithJavac' (17) and 'compileReactNative71ReleaseKotlin' (1.8).
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Get more help at https://help.gradle.org. BUILD FAILED in 3m 28s 238 actionable tasks: 238 executed Error: Gradle build failed with unknown error. See logs for the "Run gradlew" phase for more information.
Since recent banlist already implemented, it's time for us to claim our dust(s) base on rarity.
King Calamity is now banned (from unlimited or 3 going to zero) so we need to change the regulation from 'Standard' (usual setting) to 'Unlimited' to display all banned cards in search filter which is already in MD database. (As seen in picture 1 type in the keyword).
Then choose the desired card to be dismantle. In the second picture, you can see a green arrow and it goes like this 1/0/0. This means the number of cards you own in its finish type. Normal/Glossy/Royal. So from the example I only have 1 King Calamity and its only in Normal finish.
Please take note that regardless of rarity finish the dismantle bonus is always fixed. Normal - no bonus Glossy - plus 5 material bonus Royal - plus 20 material bonus Recent banlist dismantle bonus - plus 20 material bonus (refer to picture 3 first underlined red font text on the number of cards applicable)
Click the 'Dismantle' button and it will prompt you to another screen. You do not need to worry clicking since it won't dismantle right away. (Picture 2 reference)
From here (as in picture 3) you will notice the red text depicting that subjected card is recently included on the banlist and since King Calamity is from 3 to zero, dismantle bonus of 20 material is applicable up to 3 times the card copy until July 11, 2024 only (take note of the deadline). So meaning if you have 1 normal / 1 glossy / 1 royal dismantling all would yield:
1 normal = 10 mats + 20 bonus mats = 30 mats 1 glossy = 10 mats + 20 bonus mats + 5 bonus mats = 35 mats 1 royal = 10 mats + 20 bonus mats + 20 bonus mats = 50 mats Add them up = 30 + 35 + 50 = 115 material dust. In my case I only have 1 copy of King Calamity and Normal finish only so I can only obtain 30 material dust refund.
Lastly, click the Dismantle (picture 3) to claim your dust refund.
Tricks: since I only have 1 King Calamity, I can generate 2 copies of it hoping for a glossy or royal finish in order to have additional dismantling material bonus although this one is based purely on luck.
2024.06.07 20:21 Robot_EnvyDesigning and selling your own fonts?
Has anyone had any success designing and selling their own fonts? Is there a set process you use (e.g., FontForge) or something else to generate a font type and then sell it on the open market? I just wanted to know if it's something worth pursuing as a possible revenue stream, especially in the "free for personal use, but license for XYZ..." market.
2024.06.07 18:35 guangyyLessons learned from our YouTube thumbnail redesign journey
After giving up on using short videos to promote our video podcast almost 2 months ago, I decided to instead double down on YouTube as a distribution channel. Since then, we’ve seen a 30% increase in subs last month, thanks to our efforts to improve video quality, particularly the thumbnails. As the YouTube guru Ali Abdaal points out, the 3 most important parts of a video that noobs like myself often overlook are:
thumbnail
title
the first 30 seconds of the video
Out of the three, thumbnail is the most intimidating because I can't draw a stick figure to save my life. But anyways, here are the four stages of our thumbnail redesign journey and what I’ve learned along the way: The v0 We’ve actually been on YouTube since our podcast’s inception three years ago. We used our publishing platform's auto-repurposing feature, as you can imagine, it’s pretty basic - just an audio track with a static image of our logo. screenshot: https://imgur.com/a/BcNyhaW The v1 After a hiatus, about a year ago we started recording the podcast in video mode instead of audio-only. At this point, we started using custom thumbnails based on the guest’s picture - still looks like a potato but moving in the right direction. screenshot: https://imgur.com/zLR77js Around this time we needed to use a background remover - after trying a few different options, I’ve found this site to have the best value - free, no size limit and good enough results: https://img-cut.aishoot.co/cut) The prettier v1 After our podcast's rebrand, we introduced a new color palette that's easier on the eyes. We also stole an idea from our friends at metacastapp, adding headshots from our recording sessions to make the thumbnail more lively. However, as my co-host Ronak pointed out, our videos still looked like a presentation deck from college. 😂😂🤡 screenshot: https://imgur.com/xd0sK4S At this stage, Canva was a nice tool to get comfortable with for quickly iterating on these Today After deciding to take YouTube more seriously, we researched what fancy podcasters in our niche (software engineering/tech) do. Surprisingly, many well-known podcasts with hundreds of episodes haven't made a serious effort on YouTube, resulting in meager view counts. After broadening my search, I discovered two channels that excel at adapting podcasts to YouTube:
Their styles differ, but it was clear what we needed to change.
Guests' faces need to be much larger
Text should have much bigger fonts and be aligned to one side
Font style should be readable, not just fun (while we didn’t have comic sans 🤡, it was tough to read)
Quotes in thumbnails shouldn't repeat the title (a lost opportunity for a second hook)
For SEO in the description, instead of spammy hashtags, use very fine grained chapters to both help viewers jump around and improve SEO (DOAC videos have up to 40 chapters for a 2 hour video 😱 but I think this is very smart)
“interesting frame picker”: now that we use image of the guest from the actual recording, I needed to find frames of the video that had interesting facial expressions but not blurry. This sometimes took up to 15 mins to create, traversing the video a few frames at a time. So I created a small tool that loops through frames of the video while applying an open source facial-emotion-detector and a blurriness threshold to extract good candidates
segment generator: to generate the fine grained chapters, I made a LLM prompt to extract the starting timestamp, chapter title and an interesting quote for context as a draft for me to edit.
hope this helps fellow beginners and if you have pro-tips i'd love to hear them :D
2024.06.07 18:06 thedeepestofstatesA quick and dirty Google Sheet scraping bookmarklet
If you're on a site and see dynamic content you might want to scrape, this bookmarklet will generate an importXML Google Sheet formula and copy it to the clipboard. Then all you need to do is ctrl+v into an empty Google Sheet cell. If you execute the script with nothing selected, you can use the mouse to hover over the element you want to scrape. Clicking on the element will copy the formula to your clipboard. You can also highlight the content and then execute the script which will directly generate the formula and copy it to the clipboard. Happy scraping! javascript:(function() { let hoverElement, highlightDiv, messageDiv, backgroundDiv, coffeeDiv, cancelScript; function getXPath(element) { if (element.id !== '') { return '//*[@id=\'' + element.id.replace(/'/g, "\\'") + '\']'; } if (element === document.body) { return '/' + element.tagName.toLowerCase(); } let ix = 0; let siblings = element.parentNode.childNodes; for (let i = 0; i < siblings.length; i++) { let sibling = siblings[i]; if (sibling === element) { return getXPath(element.parentNode) + '/' + element.tagName.toLowerCase() + '[' + (ix + 1) + ']'; } if (sibling.nodeType === 1 && sibling.tagName === element.tagName) { ix++; } } } function getSelectedXPath() { let selection = window.getSelection(); if (selection.rangeCount > 0) { let range = selection.getRangeAt(0); let container = range.commonAncestorContainer; if (container.nodeType !== 1) { container = container.parentNode; } return getXPath(container); } return null; } function copyFormulaToClipboard(formula) { let dummy = document.createElement("textarea"); document.body.appendChild(dummy); dummy.value = formula; dummy.select(); document.execCommand("copy"); document.body.removeChild(dummy); showMessage("Formula copied to clipboard: " + formula); } function showMessage(text) { messageDiv = document.createElement("div"); messageDiv.textContent = text; messageDiv.style.position = "fixed"; messageDiv.style.top = "25px"; messageDiv.style.left = "50%"; messageDiv.style.transform = "translateX(-50%)"; messageDiv.style.fontSize = "24pt"; messageDiv.style.color = "#cc3333"; messageDiv.style.fontFamily = "'Lucida Console', Monaco, monospace"; messageDiv.style.fontWeight = "bold"; messageDiv.style.zIndex = "9999"; messageDiv.style.opacity = "0"; messageDiv.style.transition = "opacity 0.5s"; messageDiv.style.textShadow = "0.5px 0.5px 2px rgb(50, 25, 25)"; document.body.appendChild(messageDiv); let messageRect = messageDiv.getBoundingClientRect(); backgroundDiv = document.createElement("div"); backgroundDiv.style.position = "fixed"; backgroundDiv.style.top = %60${messageRect.top - 15}px%60; backgroundDiv.style.left = "50%"; backgroundDiv.style.transform = "translateX(-50%)"; backgroundDiv.style.width = %60${messageRect.width + 30}px%60; backgroundDiv.style.height = %60${messageRect.height + 30}px%60; backgroundDiv.style.backgroundColor = "rgba(100, 100, 100, 0.3)"; backgroundDiv.style.borderRadius = "15px"; backgroundDiv.style.backdropFilter = "blur(5px)"; backgroundDiv.style.zIndex = "9998"; backgroundDiv.style.opacity = "0"; backgroundDiv.style.transition = "opacity 0.5s"; document.body.appendChild(backgroundDiv); coffeeDiv = document.createElement("div"); coffeeDiv.style.position = "fixed"; coffeeDiv.style.fontFamily = "'Lucida Console', Monaco, monospace"; coffeeDiv.style.fontSize = "6pt"; coffeeDiv.style.top = "10px"; coffeeDiv.style.right = "10px"; coffeeDiv.style.zIndex = "9999"; coffeeDiv.style.cursor = "pointer"; coffeeDiv.style.opacity = "0"; coffeeDiv.style.transition = "opacity 0.5s"; coffeeDiv.innerHTML = %60
Buy me a coffee
%60; coffeeDiv.addEventListener('click', function(event) { event.stopPropagation(); window.open('https://account.venmo.com/pay?recipients=oddmedium', '_blank'); }); document.body.appendChild(coffeeDiv); setTimeout(() => { messageDiv.style.opacity = "1"; backgroundDiv.style.opacity = "1"; coffeeDiv.style.opacity = "1"; }, 0); setTimeout(() => { messageDiv.style.opacity = "0"; backgroundDiv.style.opacity = "0"; if (!cancelScript) { setTimeout(() => { document.body.removeChild(messageDiv); document.body.removeChild(backgroundDiv); }, 500); } }, 3500); } function removeEventListeners() { document.removeEventListener("mousemove", onMouseMove); document.removeEventListener("click", onClick, true); document.removeEventListener("keydown", onKeyDown); } function onMouseMove(event) { if (cancelScript) return; let target = event.target; if (target !== hoverElement && !coffeeDiv.contains(target) && target !== messageDiv && target !== backgroundDiv) { hoverElement = target; let rect = hoverElement.getBoundingClientRect(); highlightDiv.style.width = rect.width + "px"; highlightDiv.style.height = rect.height + "px"; highlightDiv.style.left = rect.left + window.scrollX + "px"; highlightDiv.style.top = rect.top + window.scrollY + "px"; } } function onClick(event) { if (cancelScript) return; if (!coffeeDiv.contains(event.target)) { event.preventDefault(); event.stopImmediatePropagation(); if (hoverElement) { let xpath = getXPath(hoverElement).replace(/"/g, "'"); let url = window.location.href; let formula = %60=importxml("${url}", "${xpath}")%60; copyFormulaToClipboard(formula); document.body.removeChild(highlightDiv); removeCoffeeAndHighlight(); } } } function onKeyDown(event) { if (event.key === "Escape") { cancelScript = true; if (highlightDiv) { document.body.removeChild(highlightDiv); } fadeOutCoffeeAndHighlight(); } } function removeCoffeeAndHighlight() { setTimeout(() => { if (coffeeDiv) { coffeeDiv.style.opacity = "0"; setTimeout(() => { document.body.removeChild(coffeeDiv); }, 500); } removeEventListeners(); }, 0); } function fadeOutCoffeeAndHighlight() { if (coffeeDiv) { coffeeDiv.style.opacity = "0"; setTimeout(() => { document.body.removeChild(coffeeDiv); }, 500); } removeEventListeners(); } function initializeSelectionTool() { hoverElement = null; highlightDiv = document.createElement("div"); highlightDiv.style.position = "absolute"; highlightDiv.style.border = "2px solid red"; highlightDiv.style.background = "rgba(255, 0, 0, 0.1)"; highlightDiv.style.pointerEvents = "none"; document.body.appendChild(highlightDiv); cancelScript = false; document.addEventListener("mousemove", onMouseMove); document.addEventListener("click", onClick, true); document.addEventListener("keydown", onKeyDown); showMessage("Hover over elements to highlight. Click to copy XPath."); } let xpath = getSelectedXPath(); if (xpath) { let url = window.location.href; let formula = %60=importxml("${url}", "${xpath}")%60; copyFormulaToClipboard(formula); } else { initializeSelectionTool(); }})();
2024.06.07 16:55 CISO_Series_ProducerTop cybersecurity stories for the week of 06-03-24 to 06-07-24
Below are some of the stories we’ve been reporting this week on Cyber Security Headlines. If you’d like to watch and participate in a discussion about them, the CISO Series does a live 20-minute show every Friday at 12:30pm PT/3:30pm ET. Each week we welcome a different cyber practitioner to offer some color to the week's stories. Our guest this week is Andrew Wilder, CISO, Community Veterinary Partners. To get involved you can watch live and participate in the discussion on YouTube Live https://youtube.com/live/NwCSdYT6zpw or you can subscribe to the Cyber Security Headlines podcast and get it into your feed. Here are the stories we plan to cover, time permitting: Experts say new Windows AI feature could be a security ‘disaster’Microsoft is about to launch a new AI-powered Recall feature that screenshots everything a user does on their PC and allows them to search and retrieve anything in seconds. Recall is part of the new Copilot Plus PCs that are debuting on June 18. Security researcher, Kevin Beaumont, who helped test the feature, discovered that the feature stores data locally in plain text which could allow an attacker to use malware to easily extract the database and its contents. Further, Recall doesn’t hide sensitive info like passwords or financial account numbers in its screenshots. Microsoft points out that stored Recall information is encrypted using Bitlocker while stored locally. But that would only protect the data from theft from a physically stolen device. Beaumont said he’s withholding technical details to give Microsoft time to take action. The UK’s Information Commissioner’s Office has also stepped in to make inquiries with Microsoft over its use of the AI-powered feature. (The Verge) Ticketmaster hack affects 560 million customers, third-party denies liabilityThe attack, which occurred on May 20, has been confirmed by its parent company, Live Nation, as having been the result of “unauthorized activity within a third-party cloud database environment containing company data.” A week later the threat actor ShinyHunters offered the data, which is alleged to contain PII and partial payment details of up to 560 million customers up for sale if a ransom payment of over $500,000 is not made. This is the same threat actor group who breached the Spanish bank Santander around the same time. Meanwhile, the third-party vendor in question, cloud storage provider Snowflake has denied that its products were to blame for the Ticketmaster breach, or the Santander Bank, for that matter. According to a since- removed post on the website of security firm Hudson Rock, “the intruders were able to sign into a Snowflake employee’s ServiceNow account using stolen credentials, and from there were able to generate session tokens,” however Snowflake, while acknowledging that a former employee’s demo account was accessed through stolen credentials, said it did not contain sensitive data, and that there was “no pathway for customers’ credentials to be accessed and exfiltrated from the Snowflake production environment.”(The Guardian and The Record) HHS changes tack, allows Change Healthcare to file breach notifications for othersThis reversal from the Department of Health and Human Services is an update from an April 19 FAQ page that stated every organization affected by the Change Healthcare hack would have to file their own breach notices with federal and state regulators. This had apparently angered the staff of thousands of hospitals, clinics and doctor’s offices who are still working through the damage caused by the attack. The new statement, sent by Melanie Fontes Rainer, director of HHS’s Office for Civil Rights says, “affected covered entities that want Change Healthcare to provide breach notifications on their behalf should contact Change Healthcare. All of the required HIPAA breach notifications may be performed by Change Healthcare.” (The Record) FBI says it has 7,000 LockBit ransomware decryption keysSpeaking at the 2024 Boston Conference on Cyber Security, Bryan Vorndran, assistant director of the FBI’s Cyber Division, said the agency is offering help to victims whose data was encrypted by the LockBit ransomware. The victims are encouraged to contact the FBI’s Internet Crime Complaint Center. There have been more than 1,800 LockBit encryption attacks in the United States. (Security Week) 3 billion records stolen from background check firmThe criminal gang named USDoD appears to be selling just under 3 billion records on nearly all US, Canadian, and British citizens for $3.5 million on a Dark Web forum. The data was allegedly stolen from Florida-based background check firm, National Public Data. It’s believed that USDoD is acting as a broker for the gang that actually stole the data (using the handle SXUL) which included full names, address history, social security numbers, and names of parents, siblings, and relatives. According to the VX-Underground team, there is a small silver lining, which is that “The database DOES NOT contain information from individuals who use data opt-out services.” (The Register) Utah student floods hackers with false info to thwart PhishingA Davis County high school junior, Charles Mortensen, developed a program dubbed VEGA (Victims’ Empowerment Guard against Attacks), which aims to take down phishing sites by flooding them with fake usernames and passwords. Mortensen said the program can send about half a million requests to a hacker site within a night, typically taking the site offline by the morning. Mortensen was motivated to create VEGA when a friend residing in foster care fell victim to an Instagram phishing attempt, jeopardizing her only means of contacting her mom. Mortensen said VEGA has enabled him to take down thirty phishing sites within a month. He is seeking a sponsor to help him to scale the operation to potentially dismantle much larger volumes of phishing sites. (The Cyber Express) US research using psychology against threat actorsThe Intelligence Advanced Research Projects Activity, IARPA, picked five research teams to look into threat actor behavior, hoping to boost cybersecurity measures by better understanding motives and possibly predict future actions. Roughly 150 people will work on the research, with teams from Raytheon, Peraton Labs, Charles River Analytics, SRI International, and GrammaTech. The teams will take different approaches, like monitoring security researchers for biases that could apply to threat actors and designing fake networksto waste threat actors’ time. Program manager Kimberly Ferguson-Walter said threat actors routinely take advantage of known human biases, and defenders should attempt to do the same. (Bloomberg) EU Probes Microsoft 365 Education Over Privacy ConcernsThe European Union is investigating Microsoft’s education-focused suite after a non-profit privacy rights group filed two complaints over concerns about how the data from the Microsoft 365 Education platform was being used. The privacy campaign group, noyb, alleges that minors’ data is being processed unlawfully and the company is being “consistently vague” about how the children’s information is being used. Noyb also claims Microsoft installs cookies without consent to track user behavior, affecting thousands of EU and EEA students. Noyb argues schools are not in a position to comply with EU law’s transparency requirements or data access rights. In a statement to TechCrunch, Microsoft said, “M365 for Education complies with GDPR and other applicable privacy laws.” (Techcrunch), (The Register)
CodelyX Hey iOSProgramming, I’m excited to share the first demo of my upcoming project: CodelyX, an autonomous Xcode assistant https://www.youtube.com/watch?v=P6kfhpoPkXA (Demo video) In the video, CodelyX creates an iOS AI chatbot in less than 3 minutes from issuing commands to a fully running app. I’m selecting a few people from the waitlist at codely-ai.com to test the app. If you’re interested in testing CodelyX or want to be notified when it launches, please sign up! Here's how CodelyX works: You specify a task, and the app generates a plan and executes it. You can customize how often you want to confirm each step, ensuring you’re always in control. Once you confirm the plan, the changes are applied to your project. Key features include:
Autonomous Project Editing: Executes your commands autonomously.
Error Resolution: Identifies and fixes errors in your project.
Code Review: Edit the code before applying changes.
Code Completion: Suggests and completes code for you.
AI Chat: Interact with an AI chatbot for assistance.
I’d be happy to receive any feedback on the video and suggestions for the app.
2024.06.07 14:18 linkbuildingexpertsSouth Africa's Graphic Design Courses at Oakfields College
Unleash your creativity and step into the dynamic world of graphic design. Whether you're a mature student looking to reignite your creative spark or a young enthusiast aiming to carve out a successful career, graphic design courses could be your perfect springboard. From the basics of design to advanced concepts, these courses are designed to equip you with the skills and confidence to produce work that prompts the ultimate reaction - WOW! With a range of courses from foundational to degree level, you're sure to find a programme that fits your aspirations and paves the way for an exciting and creative career within the field of graphic design. So, are you ready to shape your future and potentially influence the design landscape? Let's delve deeper into the world of graphic design courses and discover how they can transform your passion into a profession.
Key Takeaways
Graphic design courses cover a broad scope, from basic drawing techniques to employing graphic design theories and creating impactful visuals for various mediums like advertising campaigns, ensuring learners acquire a holistic understanding of the field.
Besides technical skills, these courses foster creative thinking, critical analysis and a strong comprehension of principles of design, making individuals market ready in the graphic design sector.
With the ever-evolving digital world, opportunities abound for graphic design professionals, with a mounting demand not just in South Africa but worldwide.
Studying graphic design need not restrict your course of learning. Programmes offer flexibility, allow you to opt for a full-time course or one that aligns with your daily routine.
On a practical level, these course programmes incorporate real-world projects, industry interaction through studio visits and work placements, providing learners with a valuable industry perspective and exposure.
Successful completion of these courses opens up numerous career avenues, in sectors varying from branding, typography, freelance design consultancy and brand strategy, and even further study at postgraduate level.
Why Choose Graphic Design?
Choosing a career path isn't a casual process - it’s a critical life decision that shapes your future journey. As an individual craving creativity and innovation, graphic design coursesmight be your ideal choice. Graphic design courses offer complete flexibility, allowing you to mould your learning environment according to your convenience. Opt for a full-time course that serves as a comprehensive learning experience, or a work-week compatible option, allowing you to continue with your daily regular activities. Acquiring a proper education in graphic design boosts your employability, regardless of the industry or sector. Companies constantly seek talented and trained graphic designers to elevate their brand's visual presence. Furthermore, by undertaking a graphic design course, you open doors to a versatile career portfolio - from animation and typography to advertising and game design, the choice is yours. You're not just acquiring a skill but investing in the silver bullet that future-proofs your career. Take note, graphic design courses are not merely about mastering technical skills. They're about understanding the principles of design and the ability to apply them practically. It's a learning journey that matures your critical thinking and problem-solving abilities. With the digital world evolving rapidly, there's an increasing demand for graphic design professionals in South Africa and beyond. This demand offers you a unique opportunity to turn your creativity into a purposeful and rewarding profession. Remember, it's not solely about where your graphic design journey begins. It's about who guides you through that path. With expert tutors at your side, you're not just learning - you're growing. So why wait? Accelerate your creative journey, enrol in a graphic design course, and set sail towards a bright, inventive future.
What You Will Learn in Our Graphic Design Courses
In our diversified range of graphic design courses, you can expect to gain a holistic understanding of this dynamic field. Let's delve into detailing the learning outcomes of undertaking graphic design studies.
Gain Proficiency in Basic Drawing Techniques Start your journey with an in-depth focus on fundamental drawing practices. Grasp the nitty-gritty of sketches, shapes, shading, and perspectives, serving as a primordial step in your design evolution.
Master Composition and Layout Skills Composition, a significant aspect of design, guides the visual flow of your work. You'll uncover principles that enhance the organised allocation of elements, creating a harmonious layout in your designs.
Dive into Graphic Design Theories and Specialisms Beyond being an artistic pursuit, graphic design sees entwined complex theories and specialisms. Understanding these fundamental facets provides a deeper comprehension of their underlying influence on design aesthetics.
Unearth the Art of Lettering and Typography Fonts speak louder than words; indeed, even the minutest shift in typography can significantly alter the message's tone. Learn to choreograph the type, whirling it into a dance of meaningful resonance.
Concieve Engaging Logos and Packaging Designs Steering towards the commercial universe, logo and packaging design hold a paramount place. You'll learn the art of translating a brand's identity into captivating visual embodiments.
Experiment with Cartooning and Illustration Unleash your creativity and characterisation skills with the extra joyous domain of cartooning. Simultaneously, hone your illustration skills, transposing imagination onto paper, or digital platforms.
Create Impactful Poster, Book Jacket, and CD Designs Get hands-on experience crafting various media types, ranging from posters to book jackets and CD designs. Each brings its unique challenges and opportunities to flaunt your skills.
Formulate Effective Advertising Campaigns Marrying artistry with commercial insight, ad creation forms an integral part of our curriculum. It's here where your designs act as silent salespersons, driving business growth.
Secure Industry-Ready Skills Finally, remember this – You're not just learning, but preparing for an exciting career in design. The full-time course offerings arm you with industry-specific skills, setting you up for a successful career in South Africa and beyond.
Course Structure and Duration
Graphic design courses tend to be comprehensive, focusing intently on fostering creativity and technical skills. It's a journey marked by significant emphasis on generating a broad variety of ideas. Then, these ideas, through careful nurturing, are refined into successful design solutions. You'll find a deep focus on creating concepts using traditional drawing materials such as pencil, pen, ink, paint, and collage. And yes, experimentation is not just welcomed but encouraged! This full-time course, structured sensibly, guides you towards progressing your ideas on paper. However, if you're leaning more towards illustrating your finished designs digitally, you have the freedom to submit your work completed on a computer. Contrary to common belief, these courses lean more towards teaching the artistic side of graphic design rather than merely focusing on the utilisation of computer software. The graphic design courses in South Africa could be the path for you if you are looking for a well-structured, guided learning experience. The course work entails sending in your designs at seven distinct points in the course duration, with each submission requiring between 2 and 5 pieces. Throughout this journey, you'll receive insightful feedback from adept tutors, further enhancing your learning and practical skills. Remember, studying graphic design isn't just about mastering the tools. It's about opening your perception to a world of ideas, refining them, and ultimately transforming your abstract sketches into successful design solutions. By doing so, you are equipped to contribute valuable, visually appealing designs to a digital world in perpetual need of skilled graphic designers.
Benefits of Studying at Oakfields College
Expanding your horizons in the field of graphic design involves engaging with realistic design briefs at Oakfields College. This full-time graphic design course emphasises broad idea generation, where you are tasked with transforming abstract concepts into tangible design solutions. A strong focus is laid on familiarising students with traditional drawing materials like pencil, pen, ink, paint, and artistic collages, all standard components of professional Graphic design courses in South Africa. One noteworthy aspect of studying at Oakfields College is the encouragement to experiment across media types, thereby fostering your creativity. This process taps into the artistic side of graphic design, rather taking a software-driven approach. However, that doesn't rule out the role of technology in your learning journey. You have the liberty to infuse your design work with digital elements, enhancing your output while gaining a grip on modern design tools. Aligned with the course’s structure, a tutor-guided submission protocol is in place. You submit work at seven specific stages throughout the course tenure, contributing between two to five pieces per submission. Not only does this test your ability to work within deadlines but also helps in gauging your evolving artistic prowess. A dedicated tutor facilitates constructive feedback for each submission, conducive to enhancing your expertise and moulding you into a versatile designer. A distinctive unit integrated into this Graphic design course is dedicated to honing crucial virtues of critical thinking, creativity, and technical skills. Tasked to work with large chunks of text, the unit instils expertise required for the intricate task of typographic presentation, a vital skill in the growing universe of editorial design. The full-time Graphic design course at Oakfields College are not just about building technical prowess. It's about broadening your perspective, improvising your creative skills, opening your mind to a universe of interpretive possibilities, and preparing you for the challenges of becoming an internationally recognised designer. So, if you are pondering, why should I study graphic design – consider Oakfields College, where we blend creativity with technology to shape your design journey. Let's transform simple texts into engaging designs and make your talent stand out on the global map. You've delved into the world of graphic design education at Oakfields College and seen the emphasis on creativity, technical prowess, and critical thinking. You've learned about successful alumni who've made their mark in companies like Apple and Lego, and the potential of postgraduate study for career advancement. You've also got an insight into the application process, portfolio submissions, and payment options. It's clear that studying graphic design at Oakfields College isn't just about academic learning. It's a gateway to global creative opportunities. So, are you ready to take the plunge and explore your creativity? The world of graphic design awaits you!
Frequently Asked Questions
What is the graphic design education like at Oakfields College?
The graphic design education at Oakfields College emphasises on creativity, technical skills, and critical thinking. The institution equips its students with practical skills and knowledge of the industry, boasting alumni in illustrious companies like Apple and Lego.
Does the article promote postgraduate study in graphic design?
Yes, the article suggests that postgraduate study can enhance career prospects in graphic design. It underscores the significance of advanced learning and specialisation within the field.
How is the application process for graphic design courses outlined in the article?
The article details the process of applying for full-time graphic design courses at Oakfields College. It mentions the requirements of portfolio submission, payment options, along with highlighting the solid industry network prospective students can gain.
Can studying graphic design lead to global opportunities?
Absolutely. The article portrays studying graphic design not just as academic learning but a direct pathway to expansive creative opportunities worldwide.
Is there industry exposure provided in the graphic design courses at Oakfields College?
The article underscores that Oakfields College provides significant industry exposure. Noteworthy is the mention of its impressive industry network that students can leverage upon for their career advancement.
2024.06.07 07:32 Artistic_Pear1834Survey is out from Amazon -- here's things I would love to see changed.
13 items on the list so far (tx for contributing all!).
Do not delete the text of any rejected reviews. Allow the original text to stay, so I can just edit the review, instead of having to rewrite the whole review. Reviews take a long time to write, so help us by not deleting all the hard work we put in, and simplify the process of rewriting a review.
Please notify WHY a review has been rejected. Sometimes it's impossible to understand why a review has been rejected. Reviews take a long time to write, so help us to understand Amazon's issue with a review.
Create a 'shortlist' tab to reserve items for 5 minutes, before returning those items to the AI Queue. Allow me to select up to 5 items, removed from the Vine queue, that can sit in my shortlist tab for 5 minutes, so I can read the item description before ordering or 'releasing' them back to AI or RFY queue. They are auto-released into AI queue after 5 minutes. Items disappear too quickly, so often I have to select an item before being able to read the product information carefully. This would improve the quality of reviews by Viners, because it's hard to write a quality review about an item I didn't actually want and only ordered because I didn't have time to read the product description before ordering it.
Increase the font size/ box of the review form. It is impossibly small font, and makes it very difficult to write quality reviews on mobile devices. This makes it very hard to find time to write quality reviews, as typing errors are hard to see, tapping inside the box to edit a sentence is difficult etc etc. If you want quality reviews, give us better tools to use. Otherwise we have to find the time during the day to be seated in front of a computer. Help us to write better reviews, faster, by making it easier to write reviews on mobile devices.
Please remove the THOUSANDS of 'ghost'/ dud/ unorderable items. It takes hours to search through all the listings - most of the listings are UNORDERABLE. Time spent clicking on 'dead' listings is time I am not spending writing quality reviews.
Anyone else have some good ideas that I could include when filling out the survey? I think if we're all sending similar items to be improved, it would make it easier for the survey analysts to build a 'voting' count for changes. Edits:
increase number of items in RFY in UK Vine, so people not able to refresh all day (nor use bots to pick items) don't give up on Vine. This would increase the number of people able to select items of interest to them/ broaden the demographic of reviewers. In the UK we rarely get more than a few items added to our RFY on the majority of days.
Increase frequency of 'drops' during the day. The once or twice a day drop, is beneficial only to the lucky people who are able to stop everything and quickly participate in the drop. Increasing the drops to multiple times a day would increase participation by a broader spectrum of Viners.
Be stricter about reviews of unopened items, fake reviews, create a ‘report bad actors link’. It is utterly demoralising to spend time carefully testing and reviewing a product, just to see or read other Viner reviews that are clearly of unopened items/ not utilised items (chat gpt generated reviews of items unused by the reviewer). A 'Report bad actors links' specifically for reporting spotted chatGPT reviews and bad actors who ruin Vine’s reputation with consumers and vendors.
Fixing the merging of product variations, which penalises Viners with 'unreviewable' items outstanding. This negatively affects a Viners review count, if they have selected variants of the same item, or a vendor merges listings. Resolving this would reduce support burden - customer service requests to remove items from the review queue-, reduce Vine member angst and address the disinclination by Viners to review certain products (often less expensive or obviously new product lines by bulk vendors or resellers) for fear of the merge issue negatively impacting their review count. If merging two items as variants of a single listing is too hard to disambiguate automatically, then a system to ask a reviewer to pick the relevant variant if reviewing an item with an ASIN of an item that redirects to one already reviewed.
Improved ability to cancel items and regain your ‘pick’ for the day, or create a 'swap pool'. People sometimes click on an item, then after reading the description realise the item is not compatible for their intended purpose/ for their needs. Note, due to the set-up of Vine, people don’t have time to read product descriptions before selecting an item. (Thus a ‘shortlist’ function to reserve items for 5 minutes would address this issue). But, currently, we cannot get a Vine pick/ selection returned if we cancel the order. For example. Ordering a security camera, only to find out in the fine-print that it only works with a dedicated video box, not already owned by the Viner -ie: unusable & there is no way for a reasonable review to be provided by the Viner. That kind of thing happens all the time. So either, create a temporary shortlist, or improve the to ability to cancel an item & reverse the allocated Vine pick, or proffer it to a ‘swap pool’, so you can swap your accidentally allocated pick to another Viner in your country, who may have their own accidental order. It is better to have Viners engaged, reviewing items they can actually use, for higher quality reviews and deepening Viner engagement resulting in better reviews for vendor products.
A 'not interested' button. An interface to exclude items of no interest, because time spent scrolling through items of no interest is time I can't spend writing good reviews. eg: I have no pets, don't show me pet category items. I have no children, exclude Children's items.
Consider increasing the number of tiers available - beyond just silver and gold in a manner that reflects the quality of reviewers efforts. Ie: bronze, silver and gold, or T4, T3, T2, T1.
Address the issue of automated bots auto-selecting items of high value, by Viners who subsequently do not review items truthfully nor accurately (ie: unopened items) and are professional resellers.