• Walksnail Goggles X solve a problem

    The Walksnail Avatar FPV system just got a huge upgrade. The Goggles X, as the next generation of Avatar goggles are called, solve a few major problems known from previous model. You get HDMI and Analog input. It’s possible to use Goggles X with Walksnail, Analog FPV and even HDZero. Only if you figure out how to attach receivers to those goggles.

    New goggles have a user replaceable video receivers. If in the future Walksnail releases upgraded video link (and they stated they want to do it in 2024) you will be able to just swap the receiver board instead of buying new goggles. On top of that, SD Card slot is finally in easily accessible place and goggles fit into case with antennas installed. OK, you maybe loose power switch, but new changes are a very nice step forward! I’m looking forward to the summer 2024 when Caddx Walksnail should present new receivers and video transmitters.

    Read more...
  • Deity VO-7U USB microphone for streamers

    Deity VO-7U is a great example of a quality dynamic microphone made for content creators. The fact that it’s USB connected simplifies the setup as it does not require any XLR interface. But the main question remains: is the Deity VO-7U a good dynamic microphone? Is it worth it? After all, for $170 it’s not the cheapest mic ever. Not the most expensive, but not cheap for sure!

    Read more...
  • How to record good audio for YouTube

    Recording good audio with cheap microphone is not a trivial task. Here are some tips on how to improve quality of you audio recording on a cheap. The first 3 tips are 100% free. For the bonus one, you might have to buy some pillows and a rug. But the most important advice is just to move your mouth closer to the microphone. Everything will sound so much better!

    Read more...
  • Are cheap mics worth the money?

    Introduction

    When it comes to capturing high-quality audio in various professional settings, shotgun microphones have become an indispensable tool for filmmakers, broadcasters, and audio enthusiasts alike. These microphones excel at capturing focused sound from a specific direction while minimizing unwanted noise from the surroundings. However, the market offers a wide range of shotgun microphones at vastly different price points, leaving consumers wondering about the quality differences between cheap and expensive options. In this article, we will explore and dissect the disparities in quality, performance, and features between affordable and high-end contender shotgun microphones.

    Build Quality

    One of the most noticeable discrepancies between cheap and expensive shotgun microphones lies in their build quality. High-end contenders often boast superior construction materials, robust designs, and meticulous attention to detail. Expensive microphones typically feature durable metal bodies, reinforced shock mounts, and reliable connectors. Conversely, cheaper alternatives tend to be made from plastic or lower-grade materials, making them more susceptible to damage and wear over time.

    Read more...
  • Boya BY-BM6060 shotgun microphone review

    In today’s digital era, high-quality audio is essential for various applications, including film production, broadcasting, and podcasting. A reliable shotgun microphone can make a significant difference in capturing clear and professional-grade audio. In this blog post, we will provide a detailed review of the Boya BY-BM6060 XLR shotgun microphone, focusing on its features, performance, and usability.

    Overview: The Boya BY-BM6060 is a shotgun microphone designed for use with video cameras, audio recorders, and other devices that support XLR input.

    • Super-Cardioid Polar Pattern: This microphone utilizes a super-cardioid polar pattern, allowing it to focus on capturing sound from the front while rejecting unwanted noise from the sides and rear. This directional sensitivity ensures excellent isolation and minimizes background distractions.

    • Wide Frequency Response: The microphone offers a wide frequency response range, typically covering the audible spectrum of human hearing (20Hz to 20kHz). This range ensures accurate reproduction of sound across different frequencies, resulting in clear and natural audio recordings.

    • Phantom Power Compatibility: The BY-BM6060 is phantom power compatible, requiring +48V phantom power to operate. This feature enables seamless integration with various professional audio recording devices that provide phantom power, ensuring optimal performance.

    Read more...
  • How to check if YouTube video is a SHORT

    YouTube and Google do not allow to check if a YouTube video is a Short or a long form video in a simple way. Even the YouTube Data V3 does not provide this information. Yes, you can get a video length (ISO8601 formatted duration) and assume that videos shorter then 60 seconds are Shorts. But what if you have a horizontal video of 59 seconds length? A problem.

    Luckily, there is a relatively simple way of checking that only if you know the YouTube video ID. Bear in mind, this is an unofficial hack and might stop working without any warning. But when I’m writing those words it works just fine.

    The trick is to make a HEAD request to https://www.youtube.com/shorts/{id} . If you get HTTP response code 303 (See Other) then video is not a Short, but other long for video. HTTP response status 200 (OK) means it is a YouTube Short.

    The code that does this check with Apache Http Client looks like this:

    package com.quadmeup;
    
    import java.io.IOException;
    import java.security.GeneralSecurityException;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpHead;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClientBuilder;
    
    public class IsShort {
        public static void main(String[] args) throws GeneralSecurityException, IOException, InterruptedException {
    
            try (CloseableHttpClient client = HttpClientBuilder.create().disableRedirectHandling().build()) {
                HttpHead request = new HttpHead("https://www.youtube.com/shorts/HnqJKThLEWg");
    
                HttpResponse response = client.execute(request);
    
                if (response.getStatusLine().getStatusCode() == 303) {
                    System.out.println("Not short");
                } else {
                    System.out.println("Short");
                }
            }
        }
    }
    
    Read more...
  • All about Lomo Smena 8M vintage camera

    The Smena 8M is a Soviet-era 35mm film camera that was first produced in the early 1970s by LOMO, a camera manufacturer based in St. Petersburg, Russia. Despite its relatively simple design and budget price, the Smena 8M has become a popular choice among film photographers for its compact size, ease of use, and versatility.

    Smena 8M

    Smena 8M

    One of the standout features of the Smena 8M is its size and weight. At just 120 grams, it is one of the lightest film cameras on the market, making it an ideal choice for photographers who want a compact and portable option. Despite its small size, the Smena 8M is still built with a robust metal body, providing a durable and reliable option for photographers.

    Step 1: Load the film To load film into the Smena 8M, first, make sure that the camera’s back is open. Then, insert the film into the film chamber, making sure that the sprockets on the film line up with the teeth on the take-up spool. Wind the film advance lever several times to make sure that the film is properly tensioned, then close the back of the camera.

    Step 2: Set the ISO The Smena 8M does not have a built-in light meter, so you will need to determine the ISO for your film. You can usually find this information on the film box or on the film’s packaging. Once you have the ISO, set the ISO dial on the top of the camera to the correct setting.

    Step 3: Focus The Smena 8M has a fixed-focus lens, so you do not need to adjust the focus. The lens is set to focus at a distance of around 3 meters, so it is best suited for portraits and landscapes.

    Step 4: Adjust the aperture The Smena 8M has a simple aperture control system, with two settings - f/8 and f/11. To adjust the aperture, simply rotate the aperture control ring until the desired setting is lined up with the white dot on the lens.

    Smena 8M

    Step 5: Take the photo Once you have set the ISO, focused, and adjusted the aperture, you are ready to take a photo. Make sure that the camera is steady, and press the shutter button to take the photo. Wind the film advance lever to the next frame, and you are ready to take another photo.

    Step 6: Rewind the film When you have used up the entire roll of film, rewind the film by turning the rewind knob on the bottom of the camera. This will rewind the film back into its canister, and you can remove it from the camera.

    Read more...
  • Meike 8mm f2.8 for MFT review

    Ultra wide, non fish-eye lenses are a type of camera lens that have a wider field of view than standard lenses, but do not produce the distortion often associated with fish-eye lenses. These lenses are ideal for landscape photography, architectural photography, and other types of photography where a wide field of view is desired. And , in some cases, for videography. Especially when you are running a YouTube channel and filming yourself sitting at your desk! Try to work with standard lens in such conditions! And here comes the Meike 8mm F2.8 for Micro Four Thirds (Olympus and Panasonic) that not only is wide, but also extremely sharp and optically corrected!

    Meike 8mm F2.8 for MFT

    One of the main benefits of ultra wide, non fish-eye lenses is that they allow photographers to capture more of the scene in front of them. This can be especially useful when shooting in tight spaces or when trying to capture a panoramic view. These lenses also allow for a greater sense of depth and perspective in photos, which can help to make them more visually interesting and dynamic.

    Another benefit of ultra wide, non fish-eye lenses is that they do not produce the distortion often associated with fish-eye lenses. Fish-eye lenses have a very wide field of view, but they also produce a distortion known as “barrel distortion,” which can make straight lines appear curved. This can be problematic for certain types of photography, such as architectural photography, where straight lines are important. Ultra wide, non fish-eye lenses do not produce this distortion, making them a better choice for these types of photography.

    When choosing an ultra wide, non fish-eye lens, there are a few things to consider. First, consider the focal length of the lens. Ultra wide lenses typically have a shorter focal length than standard lenses, which means that they are more “zoomed out.” This can be beneficial for capturing a wide field of view, but it can also make it more difficult to capture details in the distance.

    Next, consider the aperture of the lens. Aperture is the size of the lens opening, and it controls the amount of light that enters the camera. A wider aperture (such as f/2.8) will allow more light to enter the camera, making it possible to shoot in lower light conditions. However, it will also make the depth of field shallower, meaning that only the subject of the photo will be in focus and the background will be more blurry.

    Lastly, consider the build quality and image stabilization feature. Lenses with a high build quality and image stabilization feature will produce sharper images even in low light and when shooting with a low shutter speed.

    If you want to know what I think about Meike 8mm F2.8 for MFT and how it changed my YouTube Studio and my Panasonic Lumix GH5 mart II, watch the video!

    Read more...
  • Hibernate could not initialize proxy - no Session

    The org.hibernate.LazyInitializationException: could not initialize proxy error is a common issue that can occur when working with the Hibernate ORM (Object-Relational Mapping) framework in a Spring Boot application. This error occurs when Hibernate is unable to initialize a proxy object, which is an object that is used to lazily load data from the database.

    When a proxy object is created, it does not contain any data and is only used to load the data when it is accessed. This is known as lazy loading. However, if the data is not loaded before the session is closed, the proxy object will not be able to load the data and will throw the org.hibernate.LazyInitializationException: could not initialize proxy error.

    There are a few common causes of this error:

    1. The session is closed before the proxy object is accessed: This can happen if the session is closed before the proxy object is accessed, for example, by closing the entity manager or the transaction too early. To fix this issue, make sure the session is open when the proxy object is accessed.

    2. The proxy object is accessed outside of a transaction: Hibernate requires a transaction to be active when initializing a proxy object. If the proxy object is accessed outside of a transaction, the org.hibernate.LazyInitializationException: could not initialize proxy error will be thrown.

    3. The fetch mode is set to lazy: By default, Hibernate uses lazy loading for all associations. If you want to load the associated data immediately, you can set the fetch mode to “eager”.

    4. The EntityGraph is not correctly configured: When using an EntityGraph, it is important to configure it correctly. If the EntityGraph is not correctly configured, the org.hibernate.LazyInitializationException: could not initialize proxy error will be thrown.

    The fix

    To fix the org.hibernate.LazyInitializationException: could not initialize proxy error, you need to make sure that the session is open when the proxy object is accessed, the proxy object is accessed within a transaction, the fetch mode is set to eager, and the EntityGraph is correctly configured. Additionally, you can use the OpenSessionInView pattern which keeps the session open throughout the entire request-response cycle, allowing the proxy objects to be initialized properly.

    With a simple configuration change

    Configure Hibernate with

    <property name="hibernate.enable_lazy_load_no_trans" value="true"/>

    or when using Spring, add the following property to your application.properties file:

    spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

    There is a price to pay, as it will cause a performance hit. Hibernate will now initialize all lazy loaded objects, even if they are not accessed.

    With a FetchType.EAGER

    Instead of doing

    @NotNull
    @ManyToOne
    @JoinColumn(name="video_id")
    private VideoEntity video;
    

    do

    @NotNull
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="video_id")
    private VideoEntity video;
    

    With a EAGER fetching when using Criteria

    Just set Criteria fetch mode to FetchMode.EAGER

    Criteria criteria = session.createCriteria(VideoScoreEntity.class);
    criteria.setFetchMode("video", FetchMode.EAGER);
    
    Read more...
  • How to create and register Spring Boot custom request filter

    Creating a custom request filter in Spring Boot is a relatively simple process that can be accomplished by following a few basic steps.

    • Create a new class that extends the OncePerRequestFilter class. This ensures that the filter will be executed only once per incoming request.

    • In your filter class, override the doFilter method. This method is called for each request that is sent to your application. In this method, you can perform any logic you want to execute for the filter, such as logging, authentication, or validation.

    • Annotate your filter class with @Component so that Spring Boot can automatically discover and register it as a filter.

    • Use the @Order annotation to specify the order in which the filter should be executed relative to other filters. Filters with a lower order value will be executed first.

    @Component
    @Order(1)
    public class MyCustomFilter extends OncePerRequestFilter {
    
        @Override
        protected void doFilterInternal(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain filterChain
        ) throws ServletException, IOException {
        
            // do some stuff
    
            filterChain.doFilter(request, response);
        }
    }
    

    To apply the filter to specific URLs, use a @Bean annotation to assign the filter only to request that meet criteria. For example, the code below attaches the MyCustomFilter.class only to request that match the /api/* patch pattern.

    @Component
    @Order(1)
    public class MyCustomFilter extends OncePerRequestFilter {
    
        @Override
        protected void doFilterInternal(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain filterChain
            ) throws ServletException, IOException {
        
            // do some stuff
    
            filterChain.doFilter(request, response);
        }
        
        @Bean
        public FilterRegistrationBean<MyCustomFilter> myCustomerFilter()
        {
            FilterRegistrationBean<MyCustomFilter> bean = new FilterRegistrationBean<>();
     
            bean.setFilter(new MyCustomFilter());
            bean.addUrlPatterns("/api/*");
     
            return bean;
        }
    
    }
    
    Read more...
  • 1
  • 2
Paweł Spychalski

I'm Paweł Spychalski and I do things. Mainly software development, FPV drones and amateur cinematography. Here are my YouTube channels: