Net Core 2.0, Openiddict 2.0 and social providers User.Identity.IsAuthenticated is always false

Hello! When I updated project to net core 2.0 and openiddict 2.0 I get error when trying login with social provider. I get all data but still not authorized. User.Identity.IsAuthenticated is always return false. This happened only with social prover. Internal login work fine.
Statrup.cs
namespace Altair.Web
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();

            Configuration = builder.Build();

            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .WriteTo.RollingFile(Path.Combine(@"C:\Altair\logs\", "log-{Date}.txt"))
                .CreateLogger();
        }

        public IConfigurationRoot Configuration { get; }

        public bool UseInMemoryProvider { get; set; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(options =>
                        options.Filters.Add(new RequireHttpsAttribute())
                )
                .AddJsonOptions(options =>
                {
                    options.SerializerSettings.ContractResolver =
                        new Newtonsoft.Json.Serialization.DefaultContractResolver();
                    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                    options.SerializerSettings.Formatting = Formatting.Indented;
                });

            var sqlConnectionString = Configuration["Data:DefaultConnection:ConnectionString"];
            try
            {
                UseInMemoryProvider = bool.Parse(Configuration["AppSettings:InMemoryProvider"]);
            }
            catch
            {

            }

            services.AddDbContext<AltairDbContext>(options =>
            {
                switch (UseInMemoryProvider)
                {
                    case true:
                        options.UseInMemoryDatabase(Configuration["AppSettings:DataBaseName"]);
                        break;
                    default:
                        options.UseSqlServer(sqlConnectionString,
                            b => b.MigrationsAssembly("Altair.Web"));
                        break;
                }
                options.UseOpenIddict<int>();
            });

            services.AddScoped<Repositories.ILanguageRepository, LanguageRepository>();
            services.AddScoped<Repositories.IMenuRepository, MenuRepository>();
            services.AddScoped<Repositories.IMessageRepository, MessageRepository>();

            var lockoutOptions = new LockoutOptions
            {
                AllowedForNewUsers = true,
                DefaultLockoutTimeSpan =
                    TimeSpan.FromMinutes(double.Parse(Configuration["LockoutUserOptions:LockoutTime"])),
                MaxFailedAccessAttempts = int.Parse(Configuration["LockoutUserOptions:MaxFailedAccessAttempts"])
            };

            services.AddIdentity<Person, Role>(config =>
            {
                config.Lockout = lockoutOptions;
                config.SignIn.RequireConfirmedEmail = true;
                config.User.RequireUniqueEmail = true;
                config.Password.RequireNonAlphanumeric = false;
            }).AddEntityFrameworkStores<AltairDbContext>()
            .AddDefaultTokenProviders();

            services.Configure<IdentityOptions>(options =>
            {
                options.ClaimsIdentity.UserNameClaimType = OpenIdConnectConstants.Claims.Name;
                options.ClaimsIdentity.UserIdClaimType = OpenIdConnectConstants.Claims.Subject;
                options.ClaimsIdentity.RoleClaimType = OpenIdConnectConstants.Claims.Role;
            });

            services.AddAuthentication(options =>
                {
                    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                })
                .AddFacebook(o =>
                {
                    o.AppId = Configuration["Authentication:Facebook:AppId"];
                    o.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
                    o.CallbackPath = "/signin-facebook";
                })
                .AddGoogle(o =>
                {
                    o.ClientId = Configuration["Authentication:Google:ClientId"];
                    o.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
                    o.CallbackPath = "/signin-google";
                })
                .AddTwitter(o =>
                {
                    o.ConsumerKey = Configuration["Authentication:Twitter:ConsumerKey"];
                    o.ConsumerSecret = Configuration["Authentication:Twitter:ConsumerSecret"];
                    o.CallbackPath = "/signin-twitter";
                })
                .AddJwtBearer(o =>
                {
                    o.RequireHttpsMetadata = true;
                    o.Authority = Configuration["Authentication:OpenIddict:Authority"];
                    o.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuer = false,
                        ValidateAudience = false
                    };
                });

            services.AddOpenIddict<int>(options =>
            {
                options.AddEntityFrameworkCoreStores<AltairDbContext>();

                options.AddMvcBinders();

                options.EnableTokenEndpoint(Configuration["Authentication:OpenIddict:TokenEndPoint"]);

                options.EnableAuthorizationEndpoint(Configuration["Authentication:OpenIddict:AuthorizationEndPoint"]);

                options.AllowPasswordFlow();

                options.AllowAuthorizationCodeFlow();
                options.AllowImplicitFlow();

                options.AllowRefreshTokenFlow();

                options.RequireClientIdentification();

                options.EnableRequestCaching();

                options.SetAccessTokenLifetime(TimeSpan.FromSeconds(300));

                options.UseJsonWebTokens();

                options.AddEphemeralSigningKey();
            });

            services.AddTransient<IEmailSender, AuthMessageSender>();
            services.AddTransient<ISmsSender, AuthMessageSender>();
            services.Configure<AuthMessageSenderOptions>(Configuration);
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
                {
                    HotModuleReplacement = true
                });
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            loggerFactory.AddSerilog();

            app.UseStaticFiles(new StaticFileOptions
            {
                OnPrepareResponse = context =>
                {
                    context.Context.Response.Headers["Cache-Control"] =
                        Configuration["StaticFiles:Headers:Cache-Control"];
                    context.Context.Response.Headers["Pragma"] = Configuration["StaticFiles:Headers:Pragma"];
                    context.Context.Response.Headers["Expires"] = Configuration["StaticFiles:Headers:Expires"];
                }
            });

            app.UseAuthentication();

            app.UseMvc(routes =>
            {
                routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");

                routes.MapWebApiRoute("Altair API v1.0", "api/{controller}/{action?}/{provider?}/{id?}");

                routes.MapRoute("spa-fallback", "{*anything}", new {controller = "Home", action = "Index"});
            });
        }
    }
}

PersonsController.cs
#region External Authentication Providers

        [HttpGet]
        [AllowAnonymous]
        public IActionResult ExternalLogin(string provider, string returnUrl = null)
        {
            switch (provider.ToLower())
            {
                case "facebook":
                case "google":
                case "twitter":
                    var redirectUrl = Url.Action("ExternalLoginCallback", "Persons", new {ReturnUrl = returnUrl});
                    var properties = SignInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
                    return new ChallengeResult(provider, properties);
                default:
                    return BadRequest(new ErrorViewModel
                    {
                        Error = GetTranslatedMessage("errorCode"),
                        ErrorDescription = string.Format("Провейдер '{0}' не поддерживается.", provider)
                    });
            }
        }

        [HttpGet]
        [AllowAnonymous]
        public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
        {
            try
            {
                if (remoteError != null)
                {
                    return StatusCode(500, new ErrorViewModel
                    {
                        Error = "Error external provider.",
                        ErrorDescription = remoteError
                    });
                }

                var info = await SignInManager.GetExternalLoginInfoAsync();
                if (info == null)
                {
                    return StatusCode(500, new ErrorViewModel
                    {
                        Error = "Error external provider.",
                        ErrorDescription = "Нет доступной информации для входа"
                    });
                }

                var user = await UserManager.FindByLoginAsync(info.LoginProvider, info.ProviderKey);
                if (user == null)
                {
                    const string emailKey = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress";
                    var email = info.Principal.FindFirst(emailKey).Value;

                    user = await UserManager.FindByEmailAsync(email);
                    if (user == null)
                    {
                        var now = DateTime.Now;

                        const string idKey = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier";
                        var username = string.Format("{0}{1}", info.LoginProvider,
                            info.Principal.FindFirst(idKey).Value);
                        user = new Person
                        {
                            UserName = username,
                            Email = email,
                            DisplayName = email,
                            CreatedDate = now,
                            LastModifiedDate = now,
                            AdditionalData = "External"
                        };

                        await UserManager.CreateAsync(user, RandomPassword.Generate());

                        user.EmailConfirmed = true;
                        user.LockoutEnabled = false;
                    }

                    await UserManager.AddLoginAsync(user, info);

                    await DbContext.SaveChangesAsync();
                }

                if (UserManager.SupportsUserLockout && user.LockoutEnabled)
                {
                    return BadRequest(new ErrorViewModel
                    {
                        Error = OpenIdConnectConstants.Errors.InvalidGrant,
                        ErrorDescription = "Not allow login."
                    });
                }

                var auth = new
                {
                    type = "External",
                    providerName = info.LoginProvider,
                    providerKey = User.Identity.IsAuthenticated
                };

                return Content("<script type=\"text/javascript\">" +
                               "window.opener.externalProviderLogin(" +
                               JsonConvert.SerializeObject(auth) + ");" +
                               "window.close();" +
                               "</script>",
                    "text/html");
            }
            catch (Exception ex)
            {
                return BadRequest(new ErrorViewModel
                {
                    Error = GetTranslatedMessage("errorCode"),
                    ErrorDescription = ex.Message
                });
            }
        }

        /// <summary>
        /// POST: api/Account/Logout
        /// </summary>
        [HttpPost]
        [AllowAnonymous]
        public IActionResult Logout()
        {
            if (HttpContext.User.Identity.IsAuthenticated)
            {
                SignInManager.SignOutAsync().Wait();
            }
            return Ok();
        }

        #endregion External Authentication Providers

Can you tell me what might be the problem? Me was told that the problem may be that for external providers only the cookies are needed. But I do not know where to add them. At the same time, it worked in net core 1.1.
Thank You!

Calling both AddIdentity and
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}

is likely your issue, as Identity also sets these defaults. Try removing your defaults.

Thanks for answering. But I already tried to remove it. User.Identity.IsAuthenticated is still false, for the external provider and stops working, the internal login (User.Identity.IsAuthenticated is false too). This project I use jwt.

@PinpointTownes is this a scenario you have a sample for?

@Tratcher not really. The OpenIddict samples that include both cookies authentication (for interactive views) and token authentication (for API controllers) don't override the default schemes set by Identity because it's totally unusable in practice (e.g the antiforgery service relies on HttpContext.User and all the actions protected by [ValidateAntiforgeryToken] throw an exception stating that the cookie was issued to a different user).
My recommendation is to avoid changing the default schemes when using Identity. Instead, the API controllers can be decorated with [Authorize(AuthenticationSchemes = "Bearer")].
Alternatively, it's possible to create a custom scheme provider to emulate route-based authentication (which worked fine in 1.x):
public class CustomAuthenticationSchemeProvider : AuthenticationSchemeProvider
{
    private readonly IHttpContextAccessor httpContextAccessor;

    public CustomAuthenticationSchemeProvider(
        IHttpContextAccessor httpContextAccessor,
        IOptions<AuthenticationOptions> options)
        : base(options)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    private Task<AuthenticationScheme> GetDefaultSchemeAsync()
    {
        var request = httpContextAccessor.HttpContext?.Request;
        if (request == null)
        {
            throw new ArgumentNullException("The HTTP request cannot be retrieved.");
        }

        // For API requests, use authentication tokens.
        if (request.Path.StartsWithSegments("/api"))
        {
            return GetSchemeAsync(OAuthValidationDefaults.AuthenticationScheme);
        }

        // For the other requests, use authentication cookies.
        return GetSchemeAsync(IdentityConstants.ApplicationScheme);
    }

    public override Task<AuthenticationScheme> GetDefaultAuthenticateSchemeAsync() =>
        GetDefaultSchemeAsync();

    public override Task<AuthenticationScheme> GetDefaultChallengeSchemeAsync() =>
        GetDefaultSchemeAsync();

    public override Task<AuthenticationScheme> GetDefaultForbidSchemeAsync() =>
        GetDefaultSchemeAsync();

    public override Task<AuthenticationScheme> GetDefaultSignInSchemeAsync() =>
        GetDefaultSchemeAsync();

    public override Task<AuthenticationScheme> GetDefaultSignOutSchemeAsync() =>
        GetDefaultSchemeAsync();
}

services.AddSingleton<IAuthenticationSchemeProvider, CustomAuthenticationSchemeProvider>();

I've just tried to create a custom schema provider for emulating routing authentication, as @PinpointTownes said and remove defaults
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}

But for a social provider this does not work whatever. Internal login work fine.
When i try login via external provider i got exception:

        public async Task<string> GetCurrentUserId()
        {
            if (!User.Identity.IsAuthenticated)
                throw new NotSupportedException();
            var info = await SignInManager.GetExternalLoginInfoAsync();
            if (info == null)
                // Internal provider
                return User.FindFirst(ClaimTypes.NameIdentifier).Value;

            // External provider
            var user = await UserManager.FindByLoginAsync(
                info.LoginProvider,
                info.ProviderKey);
            if (user == null) throw new NotSupportedException();
            return user.Id.ToString();
        }

Exception thrown on
if (!User.Identity.IsAuthenticated)
                throw new NotSupportedException();

As it was before.

Social logins don't automatically end up on HttpContext.User.  Which is why User.Identity.IsAuthenticated is false.  They end up on the "Identity.External" cookie by default.
You probably can just eliminate that check for IsAuthenticated and then the external flow will just work

@HaoK Thank you! After remove User.Identity.IsAuthenticated external flow work fine.

Sorry, but the [Authorize] attribute still does not work for an external provider. I received a 401 error (Unauthorized)

It won't, because that also works against HttpContext.User by default, how the templates normally work, is external login callback given the external identity, looks up the associated user with that external login in identity, and logs in via the normal application cookie, which [Authorize] will see.

Sorry. but I do not quite understand. I use the CustomAuthenticationSchemeProvider, it uses the auth cookie for the external provider. Or should I use the information received from an external prvider for this user, and authenticate it as internal?

I'm not completely clear on how you have everything configured, but the gist of it is [Authorize] looks at context.User by default, and for the same reason that User.Identity.IsAuthenticated == false, [Authorize] also won't work.  As @PinpointTownes mentioned, you probably need to specify exactly what scheme you are trying to authorize against: [Authorize(AuthenticationSchemes = "Bearer")].

I try set [Authorize(AuthenticationSchemes = "Bearer")] - for external provider. does not work. I use jwt for internal login.

After add in my controller await UserManager.AddLoginAsync(user, info);  attribute [Authorize] work fine. Thanks @HaoK. But main  problem is still.
Example I have action in controller decorated [Authorize] attribute
[HttpGet]
[Authorize]
        public HttpContext Test()
        {
            return _httpContextAccessor.HttpContext;
        }

How can I access this action if I login internal (jwt) and external (google, facebook, etc) providers?

To be honest, I have absolutely no idea what you're trying to do.
The external cookie (that holds the external provider details) is a temporary thing: the ultimate objective is to convert it to an application cookie and eventually, to an access token if your authorization server implements an interactive flow like code or implicit.
If you use Identity.Application, then you must send the application cookie. If you use Bearer, then you must send an access token. Whether the user was authenticated using a local account or an external provider is totally irrelevant for your application controllers.

I use bearer (jwt) and just trying to make an authorization through an external provider. How should I pass the access token to the application?
@PinpointTownes you say me:

Since DefaultAuthenticateScheme is configured to point to JwtBearerDefaults.AuthenticationScheme, > User.Identity will never be populated with the cookies identity. Instead, use > HttpContext.AuthenticateAsync(IdentityConstants.ApplicationScheme) to retrieve the application cookie identity.

I'm confused. For this need cookie?

Marking as a discussion because it isn't clear what the issue is here, or if there's a bug in ASP.NET Core.

Any update?

I also want to sign in with External Privideers (e.g. Facebook, Google) in Asp.Net Core (2.x) + Web API + OpenIddict

@a-patel Yes, I solved this problem. As say @PinpointTownes:

The external cookie (that holds the external provider details) is a temporary thing: the ultimate objective is to convert it to an application cookie and eventually, to an access token if your authorization server implements an interactive flow like code or implicit.

So, I use access token.
I create custom identity token in appsettings.json
"Authentication": {
    "OpenIddict": {
      ...
      "CustomIdentityToken": "external_identity_token",
      ...
    },

Then I register his in Startup.cs
 services.AddOpenIddict<int>(options =>
            {
               ...
               options.AllowCustomFlow(Configuration["Authentication:OpenIddict:CustomIdentityToken"]);
               ...
            });

And finally I add in AuthorizationController.cs
  [HttpPost]
        [AllowAnonymous]
        public async Task<IActionResult> Token(OpenIdConnectRequest request)
        {
	    ...
            if (request.GrantType == "external_identity_token")
            {
                // Reject the request if the "assertion" parameter is missing.
                if (string.IsNullOrEmpty(request.Assertion))
                {
                    return BadRequest(new OpenIdConnectResponse
                    {
                        Error = OpenIdConnectConstants.Errors.InvalidRequest,
                        ErrorDescription = "The mandatory 'assertion' parameter was missing."
                    });
                }

                // check if there's an user with the given username
                var user = await UserManager.FindByNameAsync(request.Username);

                // fallback to support e-mail address instead of username
                if (user == null && request.Username.Contains("@"))
                    user = await UserManager.FindByEmailAsync(request.Username);

                if (user == null)
                {
                    return BadRequest(new OpenIdConnectResponse
                    {
                        //Error = OpenIdConnectConstants.Errors.InvalidGrant,
                        ErrorDescription = GetTranslatedMessage("invalidGrantCode")
                    });
                }

                if (UserManager.SupportsUserLockout && await UserManager.GetAccessFailedCountAsync(user) > 0 &&
                    !await UserManager.IsLockedOutAsync(user))
                {
                    await UserManager.ResetAccessFailedCountAsync(user);
                    await UserManager.SetLockoutEnabledAsync(user, false);
                }

                // Create a new authentication ticket.
                var ticket = await CreateTicketAsync(request, user);

                return SignIn(ticket.Principal, ticket.Properties, ticket.AuthenticationScheme);
            }
            ...
        }

Now this works. I apologize for taking so long to answer. It was necessary to write this much earlier.


Withdraw + flashloan permissions

Beautiful starter, congrats @mrdavey !
Few additions from my flashloan projects as you suggested to be ready for mainnet

Add withdraw function to recover funds
Add a modifier onlyOwner to flashloan function
Few stuff for developer experience (ignore artifact folder, add truffle as devdep)

This is great @emilianobonassi .
One of the reasons why I included the OpenZeppelin files individually (instead of importing them from git) was to make it easier for beginners to copy+paste the entire directory and run it however they wanted (i.e. via Remix if they wanted).
I think this PR will break that feature right? Is there a way to make it easily copy+pasteable to an IDE like Remix and have it import all the correct contracts?

Chiming in with an experience here :sweat_smile:
I'm a real beginner in regards to sol and all these smart-contract things and I learned a lot, but just reading your readme and playing around with the repo (thx for that :+1:)

I feel to make any reasonable use of flashloans you have to interact with some protocols eventually so you won't get around learning how these things work(as they are likely to ship their stuff via npm) - so i'd personally prefer the node_modules approach and a link in the readme to read up on how to deploy this.

Sorry for the slowness. I've had a think about this and agree, it's a good way to go about it as this template requires the dev to install and use Truffle anyway.

@mrdavey you don't need to sorry, I appreciated that you take the time to think more, it's better a slow right decision that a fast not so right one 👍
Thanks @sakulstra for your opinion, IMHO it was essential to understand what's the feedback of a potential user of this repo!
I am willing to go ahead with other improvements and sharing 😎


Add blog 2020-08-04-wechaty-guangzhou-gathering.

ake sure these boxes are checked before creating your pull request -- thank you!

[x] Add Blog Header, including title, author, date.
e.g.

---
title: "'Score Your Face Photo' a ML&Wechaty practice"
author: huyingxi
image: /assets/2020/your-blog-title/teaser.jpg
---

YOUR_FIRST_SENTENCE_SHOULD_BE_A_SUMMARY_FOR_YOUR_POST

[x] Keep all filenames & url as lowercase, and use - to connect words instead of space. e.g. 2017-10-06-wechat-pc-impactor instead of 2017-10-06-WeChat PC Impactor,
[x] Embed the photo & video before publishing, save all external file to the blog /assets/2020 directory.
[x] Add teaser image for the blog
[x] Add your self as an author to the author data file at https://github.com/wechaty/wechaty.js.org/blob/master/_developers/YOUR_GITHUB_USERNAME.yml with your GitHub username. And please also remember to reference yourself with the Github username in your blog post, so that we can have nice author information besides your blog after we published it!

See more

Thanks for your good blog!
Please make GitHub action green and then I can review your blog.

ping @fish-ball

ping @fish-ball

ping @fish-ball . Please make CI green, so we can merge this pr.

Thank you very much for sharing this great post, the blog is online with URL https://wechaty.js.org/2020/08/04/wechaty-guangzhou-gathering


Added Ruby 3.3.0 to RubyRequirementSetter version requirements

Added Ruby 3.3.0 to RubyRequirementSetter version requirements.

Think this will fix the Dependabot::Bundler::FileUpdater::RubyRequirementSetter::RubyVersionNotFound error raised in https://github.com/dependabot/dependabot-core/issues/8739

I just deployed this change, feel free to give it a try!

@deivid-rodriguez working as expected again 👍🏻

Thanks guys! Works great!


Ryujinx has been removed.  Need to decide next steps.

Issue description
The owner of the Ryujinx organization has deleted the org and all data.  According to riperiperi on the discord:
Yesterday, gdkchan was contacted by Nintendo and offered an agreement to stop working on the project, remove the organization and all related assets he's in control of. While awaiting confirmation on whether he would take this agreement, the organization has been removed, so I think it's safe to say what the outcome is.

This is a hard block to building ryujinx anymore.  Like Yuzu before, something needs to be decided here, though in this case this is not a DMCA take down, so existing license applies.  Might make just as much sense to find a valid fork in the not too distant future.
Maintainers
@06kellyjac
@artemist

I'll follow the fork situation. There were some active devs other than gdkchan and it's possible some of them work on a maintained fork, though a few have posted in the ryujinx discord guild that they will not be continuing to work on switch stuff.
The source code for 1.1.1401 is still in the nix substituter so building after an stdenv or c# change should not be a problem.

I tend to be against removing software just because it's no longer maintained. If there's a security vulnerability, mark it as such, but I don't see any reason to remove ryujinx before there's a suitable replacement

Could point it to https://github.com/ryujinx-mirror/ryujinx for now? (until a proper fork appears)

@artemist There was a similar discussion about Yuzu when it was removed, starting with this comment: https://github.com/NixOS/nixpkgs/pull/293312#issuecomment-1978456686
I think, sadly, the logical conclusion is to remove Ryujinx from nixpkgs, until a well-supported and -maintained fork pops up. Those who continue to rely on Ryujinx (to which I count myself) will have to build it from source. I'll work on a flake for that in the meantime, which I will publish on my personal git instance sometime this week: https://git.naxdy.org/NaxdyOrg/Ryujinx/

This is different from the Yuzu situation tho since it's not a legal takedown, just a repo deletion.

The reasons for the takedown don't matter. Upstream is gone, the expressions no longer compile without binary cache. Refer to the thread I linked to (you'll have to expand the comments), where all of this has already been discussed at length. The DMCA wasn't even part of the reason to remove it from nixpkgs.
I don't like it either, but there's no point in keeping software in nixpkgs that has no upstream.

As an update for everyone, I added an easy-to-use flake to keep Ryujinx in your configs to my repo of it. I don't plan on maintaining it at all however (not even updating dependencies), so it will essentially just be a snapshot of the last available version, until some other fork comes around.
 I feel like this behavior should be discouraged.

I'm sorry you feel that way. The purpose of the flake is not to take anything over, but rather a short-term solution to provide a starting point for people who wish to continue building Ryujinx from source after its inevitable removal from nixpkgs, until a proper fork emerges.
Yuzu & Citra were removed from nixpkgs extremely quickly after their takedown from upstream, and the lack of alternatives both in nixpkgs and otherwise was a pretty big blocker for me personally, so my intent was to avoid others from having to go through the same hassle of sourcing recently removed build scripts, fixing the source inputs, and integrating them into their config, as I have done with Citra (a mirror of which I also host, here https://git.naxdy.org/Mirror/citra - just without the flake)

Yuzu and Citra were as a result of a lawsuit from Nintendo (which was to some extent justified given the profiting).
Ryujinx is a slightly different edge-case and I think it's generally a better idea to take the maintainers perspective here, which is to leave the package alone. However if a suitable fork can't be found, I believe the best choice would be to simply mark as broken. This way can indicate to all affected users that this binary is no buildable for the time being.

I tend to be against removing software just because it's no longer maintained.

First, there is RFC 180 discussing that issue.
Second, let's be more accurate here.
This is not a mere "no longer maintained" abandonware situation (as in, say, Jikes), but a takedown: the original, pristine source simply disappeared.

RFC180 does not cover upstream situations, only our downstream situation. It explicitly defines "unmaintained" packages as packages that do not have Nixpkgs maintainers listed.
We also don't really know what spurred the takedown yet. As far as we can tell, no legal action was involved, so it's not like we can expect mirrors to be taken down (as was the case with Yuzu).

I think it should use a mirror and disable updates, or be removed. There's no point marking it as broken if it's never going to be fixed.

As someone who has slowly been building my own private binary cache (internet here is garbage, and being unable to do any config changes for hours can leave me unable to do any work), leaving broken package in purely on the idea of "well the binary cache still has it" has left me stranded in the past.  Idk what the solution actually is, since rapidly removing a package isn't a great option either, but if nixpkgs isn't actually building correctly, that seems like a bug to me.  Since changing the source for a package involves forking nixpkgs, that seems like a quick way to lose sanity, vs nixpkgs actually being valid and reproducible.

Why don't we just follow what the AUR did? Any mirror pointed at the same commit hash would suffice. Then we just drop passthru.updateScript and the script file itself.

Doing what @MathiasSven suggests seems like the best option until something about the situation changes. Source unavailability, while certainly not a major issue, is a serious problem and using a mirror would be an immediate band-aid for that.
If the package were to break due to dependency changes in the future and the maintainers didn't want to vendor a fix, the package would then be marked as broken and could be removed (probably in accordance with RFC180 at that point). I don't expect that to happen any time soon though.
If a new upstream appears, we can simply switch to that and make ryujinx an alias for it if it's under a different name.

Thanks for adding the archive.org mirror. I've been busy for the past few days I was planning on using the mirror used in the AUR today, but the Internet Archive seems like a better choice.

Yeah, they won't go anywhere there :)
The git repo I got from archive.org from which I regenerated the tarballs seems 99.94% pristine (SHA256: b4e3aa518a05ce44c33298b83829f2ce27b98fcc3d5774ed7479cc9679782b82).
Thanks to your maintenance efforts and the package's SHA256 hashes, we can be reasonably confident that the repository history up to 1.1.1401 is untampered, leaving us with merely two commits to audit if we're paranoid.
* a2c00350 (HEAD -> master, tag: 1.1.1403, origin/master, origin/HEAD) Update audio renderer to REV13: Add support for compressor statistics and volume reset (#7372)
* 7d158acc (tag: 1.1.1402) Do not try to create a texture pool if shader does not use textures (#7379)
* 5dbba07e (tag: 1.1.1401) sdl: set app name (#7370)

21 files changed, 353 insertions(+), 89 deletions(-)

Of course, we wouldn't even need to question anything had the commits been cryptographically signed.
I can't thank you enough for resisting this anti-consumer intimidation against a brilliant piece of engineering.
I don't want my games nor all these years of effort to go to waste, and mirroring Atemu's thoughts, am hoping maintenance on this solid software will be smooth sailing for years to come.
Heck, I hope I'd be able to lend a hand in case stuff breaks.
Can we please defuse the removal PR ? :)

Pardon me for bringing this up, but I find it really puzzling that the first reaction to stable software getting orphaned is to remove it from a distribution, rather than mirroring it and tending to it as our maintainers are willing to do.
Has the software industry at large conditioned people to think that if you look away for a mere second, software will inevitably bit rot ?
Most software I ever wrote can be rebuilt and run without modification years after the fact (maybe less so for moving targets like Blender addons or the web ecosystem, which I'm picky about).
Technologies like .NET, SDL, Rust, the Linux kernel, or Wine (90s SDKs are still alive and kicking) care deeply about backwards compatibility. Even a standard HTML5 website can work just fine on a Dreamcast if you do the right thing and progressively enhance it.
This results in timeless, predictable software, and happy developers and maintainers.
Conversely, eagerly removing a perfectly working package contributes to said churn as all users relying on it would be startled as soon as they upgrade NixOS and be forced to needlessly fix their configuration, either removing it or looking for an out-of-tree replacement, with all the inconveniences that comes with that (no binary caching, etc.).
It doesn't sound like a good time for anyone involved, so why do it ?
It made me wonder if I would've lost access to this software had I not stumbled on the news in time.

I have the opinion that we should put those things on NUR.

Technologies like ...  Rust ... care deeply about backwards compatibility.

Ehr, Rust introduced breaking changes recently.

Has the software industry at large conditioned people to think that if you look away for a mere second, software will inevitably bit rot ?

Nixpkgs maintenance has conditioned me to think that :/
A modern emulator like Ryujinx especially has quite a lot of moving parts. Hopefully someone will pick up maintenance, although it seems like there aren’t many qualified maintainers to continue with these kinds of projects after the original teams call it quits. I wouldn’t be surprised if an FFmpeg update or similar breaks it otherwise.

@AndersonTorres Could you provide any rationale on why this package should suddenly be downgraded and break all users' installation when nothing happened to the source code and maintainers are there to support it ?
As for Rust, one unforseen issue should not discredit the stellar stability guarantees they've upheld for such a long time. It certainly doesn't compare to some other software ecosystems.
But yeah, this strongly makes me question why I still have it in me to swim against the current in seeking real software engineering. I'll see what I can do to keep this one alive though.

First, "nothing happened to the source code" is at least a doubtful sentence. The original repo disappeared, the best we have is a backup.
And, since at least the xz-incident, second-hand source code is less reliable.
Second, NUR is just a migration, not a huge downgrade.
Third, IMnsHO Nixpkgs is a database for scripting and metadata for fresh and pristine software. "Fresh" is a bit malleable - the monorepo has some useful abandonware -, on the other hand "pristine" has a more clear cut definition.
When the source code disappears, arguably it can no longer be treated as pristine.
This conclusion can be  drawn from the recent guidelines for adding packages: https://github.com/NixOS/nixpkgs/tree/master/pkgs#quick-start-to-adding-a-package

Is the package ready for general use? We don't want to include projects that are too immature or are going to be abandoned immediately. In case of doubt, check with upstream.

Bold mine.
Further I have written at length about this months ago: https://github.com/NixOS/nixpkgs/pull/295587

Without speaking to the general point of abandonware in Nixpkgs –

First, "nothing happened to the source code" is at least a doubtful sentence. The original repo disappeared, the best we have is a backup. And, since at least the xz-incident, second-hand source code is less reliable.

We have a git archive tarball hosted on archive.org that matches the exact NAR hash from GitHub; there’s really no question about its authenticity and any mismatch would be immediately caught. We have plenty of web.archive.org in the tree serving a similar purpose.

Thank you for explaining this.
No offense, but it hurts inside when someone in a position of power does not seem to grasp the basics, but I'm willing to believe I'm misunderstanding.
It doubly hurt when I wished to reach out and offer my help to improve a distribution I love so that users don't get turned off by the churn, only to be taken down.
But that is okay. I'm certainly not blaming anyone for my own feelings. I'm more likely to just walk away.
There is a reason Nix trusts these cryptographic hashes that it systematically puts them on all packages.
An xz would be hard to pull off there. I too hate malware.
Combined with how git hashes its commits to assure you that their ancestors are pure (the buzzword is "blockchain"), along with multiple tree archives that pretty much match bit-for-bit with results we already know, we can safely assume nobody evil had the time to poison any mirrors converging on that truth.
Please see Wikipedia:

The Git history is stored in such a way that the ID of a particular version (a commit in Git terms) depends upon the complete development history leading up to that commit. Once it is published, it is not possible to change the old versions without it being noticed. The structure is similar to a Merkle tree, but with added data at the nodes and leaves.

Lastly, handwaving away a respected systems programming language on the basis of a single mistake is disheartening when they work so hard to make people's lives easier.
I kindly wish you the best.

While I have mixed feelings about both removing software because of Nintendo’s meddling and keeping unmaintained software in Nixpkgs, I feel I ought to point out that @AndersonTorres is a non‐committer contributor, like you, and his word doesn’t necessarily carry any more or less weight in this discussion than yours.

While personally, I don't have a strong opinion on what to do in these situations (remove, switch to mirror, do nothing), I do think that we should have a proper guideline with regards to what should happen in the case of a sudden upstream disappearing magic act.
In the meantime, I opened https://github.com/NixOS/nixpkgs/pull/346797 to mark Ryujinx as known vulnerable, to let users know what they're installing is not developed or maintained by upstream.

We have a git archive tarball [. . .]

I am speaking about this in general terms.
A better rewording would be "a backup/mirror/copy/etc. is no more reliable than the original Git repo".
(Although, if we would be more paranoid about this, the tarball generated from fetchFromGitHub discards at least the .git dir. But let's not dig this conversation even more.)

No offense, but it hurts inside when someone in a position of power does not seem to grasp the basics, but I'm willing to believe I'm misunderstanding.

I have no power here.
At best I can complain about bad code (or good code), but ultimately I do not have the last word.

There is a reason Nix trusts these cryptographic hashes that it systematically puts them on all packages.

Most of what I have written is not restricted to Nixpkgs, at least in principle.
This is just about a script that expects an input - and that input disappeared.
What should we do?
I think it makes few to no sense to keep this piece eating cycles on Hydra.

It's important to remember that this isn't like Yuzu, the author likely took a check and closed the project. They were not stuck with a dmca, it should be space to host it in nixpkgs.

Even the case of Yuzu is unclear.
We just provide the script, the inputs for the script are up to you.

Thats true, I agree. Thats exactly what I did in my pr that involves assets in #342365.

It's important to remember that this isn't like Yuzu, the author likely took a check and closed the project. They were not stuck with a dmca, it should be space to host it in nixpkgs.

Either a check, or an agreement not to sue/harass, we don't know the exact details rn.  Either way Nintendo isn't using the legal system to claim the license on the code is invalid, so it, in theory, is still safe to have in nixpkgs, just needs an actual source backing it somewhere.

The mirror suggests this fork now

The mirror suggests this fork now

I think that adding this to nixpkgs, perhaps as a different package would suit this situation, as it is has already become extremely popular (over 3.6K stars) as me writing this.

We can just pretend this is the official channel of distribution. No need for that truckload of renames, aliases and the like.

For all intents and purposes, it appears to be the upstream now. Maintenance is explicitly limited to QoL fixes and I'd assume things like incompat too but that's good enough for now I think.
They also appear to be doing proper releases and everything.
I don't maintain this package but I'd be in favour of switching upstream to https://github.com/GreemDev/Ryujinx/ and then consider this issue resolved.

So there are two QoL projects, I would assume GreemDev is better than the mirror. Depending on what others think we could have an example of xmrig and xmrig-mo where we can just have both.

Greemdev variant is packaged and the original package is reserved. I think this can be closed.


API

We migrated the API from the developer toolkit to django-napse, for quicker development and ease of use.

:tada: This PR is included in version 1.8.0 :tada:
The release is available on GitHub release
Your semantic-release bot :package::rocket:


Support SOCKS5 proxy with username/password authentication

Hi all,
I'm trying to configure async http client to use SOCKS proxy with authentication.
IOReactorConfig.Builder config = IOReactorConfig.custom()
                            .setSocksProxyAddress(inetSocketAddress)
                            .setSocksProxyUsername(proxyOptions.getUsername())
                            .setSocksProxyPassword(proxyOptions.getPassword());
httpAsyncClientBuilder.setIOReactorConfig(config.build());

But it's doesn't work.
I used wireshark to capture packets and got the following results, it seems that the authentication method was not passed correctly.

@ok2c Can someone give a review?

@yndu13 Looks correct to me. I am still trying to test the fix locally.

@yndu13 Looks correct to me. I am still trying to test the fix locally.

Thanks, you can use this socks server to verify this problem.
The following is the result of my test:

Thanks, you can use this socks server to verify this problem.

@yndu13 I tested it with Dante.


very particular behaviour with some tables in R

Hi
I checked that the "zonas" table from the chilean census is not permanently written into a new duckdb DB, but other tables are.
Example:
wget https://github.com/pachamaltese/censo2017/releases/download/v0.1/censo2017.sqlite.bz2
bzip2 censo2017.sqlite.bz2

library(duckdb)
library(RSQLite)

con <- dbConnect(SQLite(), "data-raw/censo2017.sqlite")

d <- dbReadTable(con, "zonas")

drv <- duckdb()
con2 <- dbConnect(drv, "censo2017.duckdb")
dbWriteTable(con2, "zonas", d, append = T, temporary = F)
dbDisconnect(con2, shutdown = TRUE)

I'm using duckdb 0.2.3

Indeed you are right, I can't see that table either! Not good.

Indeed you are right, I can't see that table either! Not good.

The culprit seems to be the append=T flag there. Things seem to work well if I don't set it. Any particular reason you are setting that flag?

The culprit seems to be the append=T flag there. Things seem to work well if I don't set it. Any particular reason you are setting that flag?

Which OS is this? Windows/Linux?

Which OS is this? Windows/Linux?

Linux (Ubuntu 20.04)
I'll try from Windows
On Fri, Jan 29, 2021, 5:18 AM Hannes Mühleisen<EMAIL_ADDRESS>wrote:

Which OS is this? Windows/Linux?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/cwida/duckdb/issues/1344#issuecomment-769653054, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/ACM7UONRRDVJX3ZOGBEJKVDS4JVNVANCNFSM4WXGOTMA
.

Linux (Ubuntu 20.04)
I'll try from Windows
On Fri, Jan 29, 2021, 5:18 AM Hannes Mühleisen<EMAIL_ADDRESS>wrote:

Which OS is this? Windows/Linux?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/cwida/duckdb/issues/1344#issuecomment-769653054, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/ACM7UONRRDVJX3ZOGBEJKVDS4JVNVANCNFSM4WXGOTMA
.

That was because I created empty tables before, with pre defined col types
and indexes
On Fri, Jan 29, 2021, 6:23 AM Mauricio Vargas<EMAIL_ADDRESS>wrote:

Linux (Ubuntu 20.04)
I'll try from Windows
On Fri, Jan 29, 2021, 5:18 AM Hannes Mühleisen<EMAIL_ADDRESS>wrote:

Which OS is this? Windows/Linux?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/cwida/duckdb/issues/1344#issuecomment-769653054, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/ACM7UONRRDVJX3ZOGBEJKVDS4JVNVANCNFSM4WXGOTMA
.

That was because I created empty tables before, with pre defined col types
and indexes
On Fri, Jan 29, 2021, 6:23 AM Mauricio Vargas<EMAIL_ADDRESS>wrote:

Linux (Ubuntu 20.04)
I'll try from Windows
On Fri, Jan 29, 2021, 5:18 AM Hannes Mühleisen<EMAIL_ADDRESS>wrote:

Which OS is this? Windows/Linux?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/cwida/duckdb/issues/1344#issuecomment-769653054, or
unsubscribe
https://github.com/notifications/unsubscribe-auth/ACM7UONRRDVJX3ZOGBEJKVDS4JVNVANCNFSM4WXGOTMA
.

no luck on windows either, even when not using append
could you please send me your code chunk and duckdb version?
On Fri, Jan 29, 2021 at 6:28 AM Mauricio Vargas<EMAIL_ADDRESS>wrote:

That was because I created empty tables before, with pre defined col types
and indexes
On Fri, Jan 29, 2021, 6:23 AM Mauricio Vargas<EMAIL_ADDRESS>wrote:

Linux (Ubuntu 20.04)
I'll try from Windows
On Fri, Jan 29, 2021, 5:18 AM Hannes Mühleisen<EMAIL_ADDRESS>wrote:

Which OS is this? Windows/Linux?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/cwida/duckdb/issues/1344#issuecomment-769653054,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ACM7UONRRDVJX3ZOGBEJKVDS4JVNVANCNFSM4WXGOTMA
.

no luck on windows either, even when not using append
could you please send me your code chunk and duckdb version?
On Fri, Jan 29, 2021 at 6:28 AM Mauricio Vargas<EMAIL_ADDRESS>wrote:

That was because I created empty tables before, with pre defined col types
and indexes
On Fri, Jan 29, 2021, 6:23 AM Mauricio Vargas<EMAIL_ADDRESS>wrote:

Linux (Ubuntu 20.04)
I'll try from Windows
On Fri, Jan 29, 2021, 5:18 AM Hannes Mühleisen<EMAIL_ADDRESS>wrote:

Which OS is this? Windows/Linux?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/cwida/duckdb/issues/1344#issuecomment-769653054,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ACM7UONRRDVJX3ZOGBEJKVDS4JVNVANCNFSM4WXGOTMA
.

@hannesmuehleisen still no luck, how can I contribute to fix this? otherwise I might need to rollback and use SQLite again

I was not able to reproduce this yet regrettable. Will try again later today.

thanks @hannesmuehleisen
I've tried again with a lighter schema
step 1: download the SQLite database
wget https://github.com/pachamaltese/censo2017/releases/download/v0.1/censo2017.sqlite.bz2
bzip2 censo2017.sqlite.bz2

step 2: create schema with indexes, and append the data to the tables
# packages ----

library(DBI)
library(duckdb)
library(RSQLite)

# connections ----

con <- dbConnect(SQLite(), "data-raw/censo2017.sqlite")
tablas <- dbListTables(con)

con2 <- dbConnect(duckdb(), "data-raw/censo2017.duckdb")

# comunas ----

dbSendQuery(con2, "DROP TABLE IF EXISTS comunas")

dbSendQuery(
  con2,
  "CREATE TABLE comunas (
	comuna_ref_id INTEGER NOT NULL,
	provincia_ref_id INTEGER NULL,
	idcomuna VARCHAR NULL,
	redcoden VARCHAR(5) NOT NULL,
	nom_comuna VARCHAR NULL)"
)

# hogares ----

dbSendQuery(con2, "DROP TABLE IF EXISTS hogares")

dbSendQuery(
  con2,
  "CREATE TABLE hogares (
	hogar_ref_id INTEGER NOT NULL,
	vivienda_ref_id INTEGER NULL,
	nhogar INTEGER NULL,
	tipo_hogar INTEGER NULL,
	ncu_yern_nuer INTEGER NULL,
	n_herm_cun INTEGER NULL,
	nuc_herm_cun INTEGER NULL,
	num_sueg_pad_abu INTEGER NULL,
	nuc_pad_sueg_abu INTEGER NULL,
	num_otros INTEGER NULL,
	nuc_otros INTEGER NULL,
	num_no_par INTEGER NULL,
	nuc_no_par INTEGER NULL,
	tot_nucleos INTEGER NULL)"
)

# mapa comunas ----

dbSendQuery(con2, "DROP TABLE IF EXISTS mapa_comunas")

dbSendQuery(
  con2,
  "CREATE TABLE mapa_comunas (
	geometry VARCHAR NULL,
	region VARCHAR(2) NULL,
	provincia VARCHAR(3) NULL,
	comuna VARCHAR(5) NOT NULL)"
)

# mapa provincias ----

dbSendQuery(con2, "DROP TABLE IF EXISTS mapa_provincias")

dbSendQuery(
  con2,
  "CREATE TABLE mapa_provincias (
	geometry VARCHAR NULL,
	region VARCHAR(2) NULL,
	provincia VARCHAR(3) NOT NULL)"
)

# mapa regiones ----

dbSendQuery(con2, "DROP TABLE IF EXISTS mapa_regiones")

dbSendQuery(
  con2,
  "CREATE TABLE mapa_regiones (
	geometry VARCHAR NULL,
	region VARCHAR(2) NOT NULL);"
)

# mapa zonas ----
dbSendQuery(con2, "DROP TABLE IF EXISTS mapa_zonas")

dbSendQuery(
  con2,
  "CREATE TABLE mapa_zonas (
	geometry VARCHAR NULL,
	region INTEGER NULL,
	provincia INTEGER NULL,
	comuna INTEGER NULL,
	geocodigo VARCHAR(11) NOT NULL)"
)

# personas ----

dbSendQuery(con2, "DROP TABLE IF EXISTS personas")

dbSendQuery(
  con2,
  "CREATE TABLE personas (
	persona_ref_id INTEGER NULL,
	hogar_ref_id INTEGER NULL,
	personan INTEGER NULL,
	p07 INTEGER NULL,
	p08 INTEGER NULL,
	p09 INTEGER NULL,
	p10 INTEGER NULL,
	p10comuna INTEGER NULL,
	p10pais INTEGER NULL,
	p10pais_grupo INTEGER NULL,
	p11 INTEGER NULL,
	p11comuna INTEGER NULL,
	p11pais INTEGER NULL,
	p11pais_grupo INTEGER NULL,
	p12 INTEGER NULL,
	p12comuna INTEGER NULL,
	p12pais INTEGER NULL,
	p12pais_grupo INTEGER NULL,
	p12a_llegada INTEGER NULL,
	p12a_tramo INTEGER NULL,
	p13 INTEGER NULL,
	p14 INTEGER NULL,
	p15 INTEGER NULL,
	p15a INTEGER NULL,
	p16 INTEGER NULL,
	p16a INTEGER NULL,
	p16a_otro INTEGER NULL,
	p16a_grupo INTEGER NULL,
	p17 INTEGER NULL,
	p18 VARCHAR NULL,
	p19 INTEGER NULL,
	p20 INTEGER NULL,
	p21m INTEGER NULL,
	p21a INTEGER NULL,
	escolaridad INTEGER NULL,
	rec_parentesco INTEGER NULL)"
)

# provincias ----

dbSendQuery(con2, "DROP TABLE IF EXISTS provincias")

dbSendQuery(
  con2,
  "CREATE TABLE provincias (
	provincia_ref_id INTEGER NULL,
	region_ref_id INTEGER NULL,
	idprovincia INTEGER NULL,
	redcoden VARCHAR(3) NOT NULL,
	nom_provincia VARCHAR NULL)"
)

# regiones ----

dbSendQuery(con2, "DROP TABLE IF EXISTS regiones")

dbSendQuery(
  con2,
  "CREATE TABLE regiones (
	region_ref_id INTEGER NOT NULL,
	censo_ref_id INTEGER NULL,
	idregion VARCHAR NULL,
	redcoden VARCHAR(2) NOT NULL,
	nom_region VARCHAR NULL)"
)

# viviendas ----

dbSendQuery(con2, "DROP TABLE IF EXISTS viviendas")

dbSendQuery(
  con2,
  "CREATE TABLE viviendas (
	vivienda_ref_id INTEGER NOT NULL,
	zonaloc_ref_id INTEGER NULL,
	nviv INTEGER NULL,
	p01 INTEGER NULL,
	p02 INTEGER NULL,
	p03a INTEGER NULL,
	p03b INTEGER NULL,
	p03c INTEGER NULL,
	p04 INTEGER NULL,
	p05 INTEGER NULL,
	cant_hog INTEGER NULL,
	cant_per INTEGER NULL,
	ind_hacin DOUBLE NULL,
	ind_hacin_rec INTEGER NULL,
	ind_material INTEGER NULL)"
)

# zonas ----

dbSendQuery(con2, "DROP TABLE IF EXISTS zonas")

dbSendQuery(
  con2,
  "CREATE TABLE zonas (
	zonaloc_ref_id INTEGER NOT NULL,
	geocodigo VARCHAR NOT NULL,
	observacion VARCHAR NULL)"
)

# disconnect ----

duckdb::dbDisconnect(con2, shutdown = TRUE)
gc()

# metadata ----

metadata <- data.frame(duckdb_version = packageVersion("duckdb"), modification_date = Sys.Date())
metadata$duckdb_version <- as.character(metadata$duckdb_version)
metadata$modification_date <- as.character(metadata$modification_date)

# connect, copy table, disconnect and repeat ----

for (t in c(tablas, "metadata")) {
  message(t)
  if(t != "metadata") {
    d <- dbReadTable(con, t)
  } else {
    d <- metadata
  }

  con2 <- dbConnect(duckdb(), "data-raw/censo2017.duckdb")
  dbWriteTable(con2, t, d, append = T, temporary = F)
  dbDisconnect(con2, shutdown = TRUE)

  gc()
  rm(d)
}

gc()
dbDisconnect(con)

# create indexes ----

con2 <- dbConnect(duckdb(), "data-raw/censo2017.duckdb")

dbSendQuery(con2, "CREATE UNIQUE INDEX comunas_redcoden ON comunas (redcoden)")
dbSendQuery(con2, "CREATE UNIQUE INDEX provincias_redcoden ON provincias (redcoden)")
dbSendQuery(con2, "CREATE UNIQUE INDEX regiones_redcoden ON regiones (redcoden)")

dbSendQuery(con2, "CREATE UNIQUE INDEX hogares_hogar_ref_id ON hogares (hogar_ref_id)")
dbSendQuery(con2, "CREATE UNIQUE INDEX viviendas_vivienda_ref_id ON viviendas (vivienda_ref_id)")

dbSendQuery(con2, "CREATE UNIQUE INDEX zonas_zonaloc_ref_id ON zonas (zonaloc_ref_id)")
dbSendQuery(con2, "CREATE UNIQUE INDEX zonas_geocodigo ON zonas (geocodigo)")

dbSendQuery(con2, "CREATE INDEX mapa_comunas_comuna ON mapa_comunas (comuna)")
dbSendQuery(con2, "CREATE INDEX mapa_provincias_provincia ON mapa_provincias (provincia)")
dbSendQuery(con2, "CREATE INDEX mapa_regiones_region ON mapa_regiones (region)")
dbSendQuery(con2, "CREATE INDEX mapa_zonas_geocodigo ON mapa_zonas (geocodigo)")

dbDisconnect(con2, shutdown = TRUE)

# test ----

for (t in tablas) {
  message(t)

  con <- dbConnect(SQLite(), "data-raw/censo2017.sqlite")
  d <- dbReadTable(con, t)
  d <- c(nrow(d), ncol(d))
  dbDisconnect(con)

  con2 <- dbConnect(duckdb(), "data-raw/censo2017.duckdb")
  d2 <- dbReadTable(con2, t)
  d2 <- c(nrow(d2), ncol(d2))
  dbDisconnect(con2, shutdown = TRUE)
  stopifnot(d[1] == d2[1])
  stopifnot(d[2] == d2[2])

  message(paste(paste0("r", d[1], " c", d[2]), "vs", paste0("r", d2[1], " c", d2[2])))
}

Thanks running this now!

I ran this script with the latest DuckDB from CRAN on both OSX and Linux (twice) and all worked as expected. Could you double-check that your RAM and hard disk are working correctly or try on another computer?

@hannesmuehleisen thanks a lot !! I'll try on the windows laptop
if that's the case, there's an issue with ubuntu
the problem here is that I have to create the bz2 for censo2017, and one table remains in the wal file

here's my session info
R version 4.0.3 (2020-10-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Pop!_OS 20.04 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/liblapack.so.3

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8
 [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] RSQLite_2.2.3    duckdb_0.2.3     DBI_1.1.1        arrow_<IP_ADDRESS>00

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.6       digest_0.6.27    assertthat_0.2.1 R6_2.5.0         magrittr_2.0.1
 [6] rlang_0.4.10     blob_1.2.1       vctrs_0.3.6      tools_4.0.3      bit64_4.0.5
[11] glue_1.4.2       purrr_0.3.4      bit_4.0.4        compiler_4.0.3   pkgconfig_2.0.3
[16] memoise_1.1.0    tidyselect_1.1.0

@hannesmuehleisen
It works ok on Windows !! I did something more expensive in terms of RAM usage by not disconnecting and connecting each time I copy a table:
for (t in c(tablas, "metadata")) {
  message(t)
  if(t != "metadata") {
    d <- dbReadTable(con, t)
  } else {
    d <- metadata
  }

  dbWriteTable(con2, t, d, append = T, temporary = F)

  gc()
  rm(d)
}

dbDisconnect(con)
dbDisconnect(con2, shutdown = TRUE)

This creates a 3.8GB wal file. Then I clear the workspace in RStudio, restart the R session and open a new connection with:
con2 <- dbConnect(duckdb(), "data-raw/censo2017.duckdb")

Which takes a few second and the .duckdb file increases from 12KB to 4GB, and the wal changes from 3.8GB to 10B.
It is weird enough that on Linux, the duckdb file is an 8GB file, and on Windows is around 50% of it :S

Again, I suggest you check your disk and RAM for hardware errors on the Ubuntu box.

I found another funny issue.
On Windows, I wanted to alter the region and commune columns in the mapa_zonas table (4000 rows, there is another 20,000,000 rows table named personas in this db). After doing a DROP TABLE mapa_zonas and then dbWriteTable, it works ok, but the .duckdb file doubles its size (from 4 to 8 GB).
I opted for recreating the complete file from zero (delete it and re-import from the SQLite file), which kept itself to 4 GB and I was able to alter the two columns to make a change of the form region 1,2,...,16 -> region "01","02",...,16.
The Windows machine is a different machine (a desktop), and the Ubuntu laptop worked well when trying to do the same with SQLite, which makes this mysterious

SQLite uses far less memory than DuckDB so its easily possible an hardware issue was not triggered. The freeing space is a known issue #1099

thanks! I'm closing this issue now
please let me know if you need anything from my side which helps to improve duckdb.... the speedup is convenient for census data compared to sqlite

Pull Request #1356 also addresses the issue of the WAL being present still and adds a feature to explicitly CHECKPOINT the database.


Parse and add icons to each program in EPG guides

Description
I've recently discovered this awesome project and I moved all my EPG mapping to use these guides. I love having them without the need to have my own program running, but I miss a huge feature compared to when I was using webgrabplus: there are no icons parsed for the programs, so the guide shows all the programs with an empty image.
Are there any plans on adding the images/icons of the tv programs?
The xml format I've seen in your files is like:
<programme start="20221003184000 +0000" stop="20221003184100 +0000" channel="France24Espanol.fr">
  <title lang="es">Rappel des titres</title>
  <category lang="es">Información</category>
</programme>

Adding the icon would require an additional icon tag:
<programme start="20221003184000 +0000" stop="20221003184100 +0000" channel="France24Espanol.fr">
  <title lang="es">Rappel des titres</title>
  <category lang="es">Información</category>
  <icon src="http://programacion-tv.elpais.com/imagenes/programas/227485.jpg" />
</programme>

And most websites where the information is grabbed have these images (it could also be a feature only for those sites having images defined ofc).

Normally images/icons will be included where they were part of the source data. For programacion-tv.elpais.com, they aren't.
https://programacion-tv.elpais.com/data/parrilla_05102022.json
{ "id": "CF161483086", "idCanal": "3", "iniDate": "2022-10-05 00:25:00", "endDate": "2022-10-05 01:10:00", "idSection": "3", "txtSection": "Informativos", "name": "", "title": "Comando Actualidad", "description": "Los consumidores somos los que más desperdicio alimentario generamos.", "recommended": "0", "id_programa": "CF5811787", "idCellnex": "202210050025", "duracion": "004500", "rating": "3" }
Looking at how their website guide works, it's bring in extra details from a secondary source which contains all programs for a single channel.
https://programacion-tv.elpais.com/data/programas/3.json (replace 3 with the channel number)
{ "id_programa": "CF5811787", "id_section": "3", "txt_section": "Informativos", "title": "Comando Actualidad", "description": "Los consumidores somos los que más desperdicio alimentario generamos.", "duration": "45", "artistic": "0", "commercial": "0", "id_genre": "09", "txt_genre": "Informativo", "id_subgenre": "192", "txt_subgenre": "Reportajes", "id_parental": "3", "txtParental": "No recomendado para menores de 7 años (7)", "season": "16", "episode": "6", "episode_title": "Más usar y menos tirar", "episode_description": "Salsas, carnes congeladas y legumbres son los alimentos que más tiramos los españoles a la basura. Desechamos más de 28 kilos de comida por persona y año.", "total_episodes": "0", "country": "España", "year": "2022", "director": "Raúl García, César Pérez, Daniel Galindo, Silvia Sánchez", "script": "", "actors": "", "producer": "", "production": "", "presented_by": "", "photography": "", "music": "", "creator": "", "guest_actors": "", "image": "imagenes/programas/466248.jpg", "poster": "imagenes/programas/466248.jpg", "paisISO": "ESP", "imagenPadre": "466248", "posterPadre": "466248", "seriado": false, "multievento": false }
It picks out the relevant program details by matching the id_programa
There's no date/time in that second source so the only way would be to grab the two URLs and try to merge the data. That might be one for someone else to pick up as I can't get my head around how best to approach it. Looks like the second URL might show programs for more than the current day ( yesterday + today + tomorrow ?) but without dates/times it's not easy to check that

Images and the cast of shows have been added to the guide.
https://iptv-org.github.io/epg/guides/es/programacion-tv.elpais.com.epg.xml.gz

They aren't for the movistar guide either, which is actually the one I'm using. Sorry I used an example image from elpais.com which may have caused the confusion.
I may switch my guide source tho, now that the one from elpais.com has the icons properly parsed 😅


Detect SQLite keywords in column names

When the CSV file has column names that are keywords in SQLite the CSV silently fails to load.
In my case, the CSV had a column named index. When I changed it to idx the file loaded correctly. Perhaps you could add a tail to column names that are keywords so, for instance, a column name of index would be imported as index_. That would avoid the collision and stop the error that blocks loading the data. If you need test data, I was using the organizations-10000.csv file from here.

Thanks for reporting this. Really made my day, happy to see people checking out my code.
I agree with your suggestion, better to avoid using the keywords as it could either prevent from creating table or cause problem at some other time. Like when i tested the keyword abort and cascade, it did create table. But I think it might create issues when we run some queries against those columns.
I can give it a shot when I get a chance or would you be interested in writing a PR for this?


Edge vsphere image type

This adds the edge-vsphere image type for x86_64 and
aarch64. It is based on the 'edge-raw-image' but produces
a .vmdk image in order to upload the artifact to vSphere.
This image has Ignition support.
This pull request includes:

[x] adequate testing for the new functionality or fixed issue
[ ] adequate documentation informing people about the change such as

[ ] submit a PR for the guides repository if this PR changed any behavior described there: https://www.osbuild.org/guides/

WIP stuff:

Hitting an issue with the manifest generation on aarch64, it is trying to pull the grub2-pc, grub2-efi-x64 and shim-x64 packages, which do not make sense from my POV.
I've set a 10GB defaultSize in the image type, but the artifact is just 1.6GB, setting 2GB gave me a runtime error regarding LVM stages having  insufficient free space. So don't know if this setting is OK.

@7flying
I created a vmdk image and uploaded to vsphere, but failed to boot it, the error message is "Unsupported or invalid disk type 2 for 'scsi0:0'. Ensure that the disk has been imported."
Then I used vmkfstools in vsphere to convert the image again: vmkfstools -i original.vmdk -d thin new.vmdk
And I can boot with new vmdk image.

@7flying I created a vmdk image and uploaded to vsphere, but failed to boot it, the error message is "Unsupported or invalid disk type 2 for 'scsi0:0'. Ensure that the disk has been imported." Then I used vmkfstools in vsphere to convert the image again: vmkfstools -i original.vmdk -d thin new.vmdk And I can boot with new vmdk image.

I haven't had that issue.
When you are creating the VM you need to add a new (existing) hard disk, add the .vmdk there, and then delete the original one. Then you edit the new hard disk and select the Virtual Device Node that has the New Hard Disk words on it, sometimes it's SCSI(0:0) other times IDE(0:0) and so on.

@7flying I created a vmdk image and uploaded to vsphere, but failed to boot it, the error message is "Unsupported or invalid disk type 2 for 'scsi0:0'. Ensure that the disk has been imported." Then I used vmkfstools in vsphere to convert the image again: vmkfstools -i original.vmdk -d thin new.vmdk And I can boot with new vmdk image.

I haven't had that issue. When you are creating the VM you need to add a new (existing) hard disk, add the .vmdk there, and then delete the original one. Then you edit the new hard disk and select the Virtual Device Node that has the New Hard Disk words on it, sometimes it's SCSI(0:0) other times IDE(0:0) and so on.

I tried again as you suggested.
I deleted original disk and added my vmdk image as existing hard disk, and the virtual device node has the 'New hard disk' words. I tried SCSI(0:0) and SCSI(0:1), both failed to boot with same error message, but IDE(0:0) can boot.
Will contact you later for this issue.

Made changes on VMDK so that the NewVMDK function also takes a imgOstreePipeline *RawOSTreeImage, and changed the VMDK struct accordingly to accommodate that (it has a Pipeline instead of a RawImage) + cleanups related to that.
On ostree_raw we explicitly fail if a compression type is specified with the VMDK format.
Moving this to  the images repo.

Added vmdk test script  test/cases/ostree-vsphere.sh, uses govc to upload image and test script passed in local env.

Added vmdk test script test/cases/ostree-vsphere.sh, uses govc to upload image and test script passed in local env.

This PR should have been closed, please create a new one...

The support landed in the images repo https://github.com/osbuild/images/pull/24


Type Error in U2FAuthenticator

The TwoFactorInterface defines getU2FKeys with the return type of array, but the U2FAuthenticator calls toArray() on that.
This results in the following error:

Uncaught Symfony\Component\Debug\Exception\FatalThrowableError: Call to a member function toArray() on array

I can fix this in #35. TwoFactorInterface::getU2FKeys should return Collection instead of array
What about replacing \Symfony\Component\Security\Core\User\UserInterface by \R\U2FTwoFactorBundle\Model\U2F\TwoFactorInterface in \R\U2FTwoFactorBundle\Security\TwoFactor\Provider\U2F\U2FAuthenticator?

Yes, good idea. Thank you.

@stephanvierkant Yes, that should be the TwoFactorInterface instead of the UserInterface. I see you already did this in #35.


Add Maven-Central badge to README

https://shields.io/ should be our friend.
https://blog.softwaremill.com/maven-badges-the-app-5c1bdcceca29 explains how to do it.

Done!


Test images with Docker Composer

Closes #41
This PR adds a basic system test which I find helpful to use locally too (see documentation).
However, this extra test jobs build the images just like the next one which double the build time.
I'm really not happy about that part, but the only way to avoid it is to merge both jobs and stop using matrix strategy.
Unfortunately, I feel like this would be a is rather bigger change (more time needed).
I hope this new simple test is worth the duplicated build, at least for a while...

Damn it: the test does not fail when it should!
Need to explicitly get the exit codes of the services...

This should now work as expected: the test fail if any of the 4 containers exits with anything else than 0.
Though, using a test framework and comparing the msg send and receive would be a nice (future) improvement.


disable launch of VScode when installing with /verysilent

I am performing an unattended install of VS code on windows server 2016 using a PowerShell script which continues to install other tools that are dependent on VS code. The relevant script to install VS code is
Start-Process ".\VSCode.exe" -ArgumentList "/verysilent /norestart" -wait
This command installs VS code in silent mode, however, it launch VS code after installation is complete, hence my script, which is waiting for the installation to complete, continues to wait and cannot proceed to install other tools depended on vs code.
Launching the VS code after installation in an interactive install is a great idea, however, it should be disabled in the silent install.
My setup:

VSCode Version: 1.8.1
OS Version: Windows Server 2016

Have you tried /silent?

/mergetasks=!runcode works great, I use it in an installation script.

Yes. Confirmed that /mergetasks=!runcode works
By itself /silent still launches the editor
On Jan 25, 2017 11:42 AM, "David Wilson"<EMAIL_ADDRESS>wrote:
/mergetasks=!runcode works great, I use it in an installation script.
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/Microsoft/vscode/issues/19319#issuecomment-275178368,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AFZbwnUE96LCx0QiG2fk4-yHNZr8_ayAks5rV4mYgaJpZM4Ls-hr
.


Example how to use export function

Hello, can someone help me how to add button that call to the export function to csv file.
I saw the function but I don’t know how to use it in the table when I add a button.
Please help.

There's no built-in export of any kind, you will have to implement it yourself.
You may use this declined PR as a starting point: https://github.com/vitmalina/w2ui/pull/777/files

Yes I saw that function already.
Can you give me example of code how to use it with button?

I was looking for a CSV export function for the grid object. Since I couldn't find one, I created one.
w2grid.prototype.toCSV=function() {   let records=[{}].concat(this.records);   Object.keys(records[1]).forEach(key => { if (this.getColumn(key)) { records[0][key]=this.getColumn(key).text; } } );   return records.map(row => {     Object.keys(row).forEach(key => {       if (!this.getColumn(key)) { delete row[key]; }       else if (this.getColumn(key).render) { if (this.getColumn(key).render.startsWith("float")) { row[key]=row[key].replace(".",","); } } } );     return Object.values(row).map(value => { return typeof value === 'string' ? JSON.stringify(value) : value } ).toString() } ).join('\r\n'); }

Closing the issue as there are suggestions how to do it.


⚠ Bofrost.es has degraded performance

In aee28b8, Bofrost.es (https://www.bofrost.es) experienced degraded performance:

HTTP code: 200
Response time: 1537 ms

Resolved: Bofrost.es performance has improved in 538f61e after 6 minutes.


emoticon

I would like to be able to put any emoticon in the game and in the chat, and that comes out with its color

This is partially client sided isn't it?

Yes

U hace Windows 10 or fonts updated?

Can't you just use the basic alt emoticons? (☺)

Alt emoticons are ready out of the box and are easy to process through.


CAMEL-16179: prevent a NPE on the MongoDB component if unable to resolve the DB connection

[x] Make sure there is a JIRA issue filed for the change (usually before you start working on it).  Trivial changes like typos do not require a JIRA issue.  Your pull request should address just this issue, without pulling in other changes.
[x] Each commit in the pull request should have a meaningful subject line and body.
[x] If you're unsure, you can format the pull request title like [CAMEL-XXX] Fixes bug in camel-file component, where you replace CAMEL-XXX with the appropriate JIRA issue.
[x] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
[x] Run mvn clean install -Psourcecheck in your module with source check enabled to make sure basic checks pass and there are no checkstyle violations. A more thorough check will be performed on your pull request automatically.
Below are the contribution guidelines:
https://github.com/apache/camel/blob/master/CONTRIBUTING.md

It would be good to make this autowried = true so the component will auto configure it present
https://github.com/apache/camel/blob/6377a997c2a831ab8fc80cf5eca7d552c94bc18a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbComponent.java#L43

It would be good to make this autowried = true so the component will auto configure it present
https://github.com/apache/camel/blob/6377a997c2a831ab8fc80cf5eca7d552c94bc18a/components/camel-mongodb/src/main/java/org/apache/camel/component/mongodb/MongoDbComponent.java#L43

Thanks Claus, let me give it a try with that instead.

Oh just mind that the autowried will just do this once. You NPE fix is also correct, in case there was no mongodb client at all.

Oh just mind that the autowried will just do this once. You NPE fix is also correct, in case there was no mongodb client at all.

Ahh, thanks for the clarification. I will keep the original changes + the autowired.


MAINTAINERS: remove eyakubovich, add dgonyeo

Eugene is sadly no longer with CoreOS, so remove his handle from
the list of maintainers. He will be gladly welcomed back if he
decides to continue contributing to the project.
In happier news, Derek has joined us as an active and effective
contributor, so add him to the maintainers.

LFAD.


Chore: add issues to project board workflow

Closes #8
I think the only missing part for this PR is creating the GH_PROJECTS_TOKEN secret. I haven't been able to find a way to do this, maybe I'm missing permissions @thekaveman ? Or if you can create it from your account that works too.

@thekaveman We've been chatting about the permissions in Slack: https://compilerla.slack.com/archives/C04BN95SH0S/p1719505167402449?thread_ts=1719442336.376809&cid=C04BN95SH0S - let us know if you think we should go a different direction from what we discussed there

Thanks @angela-tran , I was about to comment but the Slack link is great 😁


how to setup backup or disaster recover plan

Hi Elton
I have a question about backup and disaster recovery plan
Is there any sugesstion to backup or setup disaster recovery whole site for prevent lose user data.
we have just occured wrong configuration to cause site down,and have no idea to recover user data and repair openedx shortly.
Lookin forward to your reply , Thanks

We have built-in support for backups. This is the only stateful part of the setup. With your backups available, you can re-provision the site and restore your databases in the worst case disaster recovery scenario. I personally don't think it's necessary to back-up the VMSS especially when you can easily re-provision them. The entire cluster can be re-provisioned in 2hrs. However, if you feel like you'd like to do this, that's also possible via the azure portal.
Our latest solution however (guidance is pending), has native support for point in time restore for Mysql and regular backups for MongoDB.


Added embedded spotify tracks to webapp

https://www.loom.com/share/e4b057c113f6467a9e54081e6fad8c20

@devinowen, this demo looks absolutely amazing! And thank you for taking the time to make the demo video, that was seriously impressive collaborator correspondence. I agree we'll need to tune the copy a bit but OMG WOW!!! I am a huge fan of the track display with album art below the search. I would love to see what these tracks look like tiled, maybe into a 3x4 panel or something? My brain is buzzing... seeing this demo got me thinking about all kinds of things we could do with this "venue display" page to better support the venues too... So stoked to build on this!!
Thanks for cleaning up the comments and hard coded values from the python code. I think most all of the changes you made to the routes.py file I also made on my end for my upcoming PR. As you'll see, I also did some restructuring to declutter that file and make functions more useful. Stay tuned, and in the meantime, I'll merge this! Amazing work, as always.


Specified Character Types

GIVEN I need a new, secure password
WHEN asked for character types to include in the password
THEN I confirm whether or not to include lowercase, uppercase, numeric, and/or special characters

This was included within the "prompt" branch and addressed in issue 1, currently addressing the following:

Storing each of the users responses within a variable
Find a way to take the stored variables to determine how a password is generated to the users specifications


Chaos Rings Ω [PCSG00499]

App summary

App name: Chaos Rings Ω
App serial: PCSG00499
App version: 1.00

Vita3K summary

Version: v0.1.5
Build number: 2668
Commit hash: https://github.com/vita3k/vita3k/commit/01948553
CPU backend: Dynarmic

Test environment summary

Tested by: gymzatan
OS: Windows 11
CPU: AMD Ryzen 7 5800H
GPU: AMD Radeon(TM) Graphics
RAM: 16 GB

Issues
Game runs at full speed (20 FPS). No issue detected.
Screenshots

Log
vita3k.log
Recommended labels

Playable

Status: game crash on launch
Vita3K Summary:

Version: v0.1.9
Build number: 3338
CPU backend: Dynarmic

Environment Summary:

Tested by: me (dennisdinhhung)
OS: MacOS Ventura 13.4.1
CPU: M1
RAM: 16GB


Add min to BaseComputationModel

Codecov Report
All modified and coverable lines are covered by tests :white_check_mark:

Project coverage is 100.00%. Comparing base (c0e3497) to head (3b366ff).

Additional details and impacted files
@@            Coverage Diff            @@
##              main       #39   +/-   ##
=========================================
  Coverage   100.00%   100.00%
=========================================
  Files           29        29
  Lines          571       581   +10
  Branches        51        52    +1
=========================================
+ Hits           571       581   +10

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.


discourse in read only mode

Hi folks, I was just about to ask a question on https://bpftrace.discourse.group/ but the site is in read only mode. Is that no longer active?
Thanks,
Rafael

@danobi, did you get any emails about this? I can't login or do anything.

Here's the email I got:
Hi,

I’m writing to you about your free Discourse site on bpftrace.discourse.group.

If you have concrete plans to kick start the forum anytime soon, let us know. We plan to go ahead and decommission your site in 7 days from now and in case you’d like a backup of your site before that, you can grab one by cancelling service from your admin dashboard or from Admin > Backups.

Maybe we should enable the github forum thing instead?

https://github.com/iovisor/bpftrace/discussions .

Sounds ok to me. I always forgot to check discourse anyway (and am worse at email), github I check more often.

Cool, thanks. Here's a quick PR to fix the README.md link
https://github.com/iovisor/bpftrace/pull/1691


Reduce excessive steps to editing/publishing a page

This is a civicus change but probably requires a glitter change too.
When creating a news post the user has to do an additional step to choose the template for the new Page (there is always one) and then click 'Edit' to begin editing it.
We want the following:
-go to edit view NewsPost in admin
-choose an unpublished/new NewsPost
-click 'view on site'
-we get a view to choose the Page template, this should now happen behind the scenes as there is always only one selection
-user is redirected to the news post with the glitter edit button already selected

Updated the title for this to reflect the problem.
Some other thoughts:
Even if there's multiple templates available to choose from, it might be a good idea to go with a default choice to reduce the number of steps. However we'd need to figure out what the default template is for a particular content type.
Some types of content you might not want to edit them at all (events seems to be a recurring one for this), so going through the whole edit+publish process is excessive, although the UI would need to make it clear that you're immediately publishing something.


Existing UUIDs are not used

Hi!
I tried to migrate my data from an existing site into the db following the instructions from the readme.
It seems like the UuidEntryModel creates new Ids? That, to me, fails the purpose of preserving existing relations.
I replaced line 17
$entry->{$entry->getKeyName()} = (string) Str::uuid();

with
$entry->{$entry->getKeyName()} = (string) $entry->getAttribute('id');

and now its fine.
Is this a bug or did I miss something?

Yep ran in to the same issue and put a pull request in for this - messes with simple-commerce shopping cart.

Great, I hope it will be merged soon. Having the same issue.

Fixed in https://github.com/statamic/eloquent-driver/pull/19.