Code Monkey home page Code Monkey logo

Comments (14)

Urfoex avatar Urfoex commented on June 18, 2024

+1
Any news on this one?

from runner.

kazk avatar kazk commented on June 18, 2024

No, but I can start looking into it.

from runner.

Urfoex avatar Urfoex commented on June 18, 2024

Can we help in any way? Some pull-request somewhere?

Library on Debian and similar would be: libfmt-dev
Flags should just be linking flags:

$ pkg-config --cflags --libs fmt
-lfmt

Checking the docker image: https://hub.docker.com/r/qualified/clang
I see you are using some older base version? Ubuntu 18.04.5 LTS (Bionic Beaver) ?
With e.g. Debian testing / bullseye (https://hub.docker.com/_/debian?tab=description) you wouldn't need to build some of the libraries and tools yourself, and could just use the given ones, e.g.:

Clang 9.0 https://packages.debian.org/bullseye/clang
CMake 3.18.4 https://packages.debian.org/bullseye/cmake
Ninja 1.10.1 https://packages.debian.org/bullseye/ninja-build
libfmt-dev 6.1.2 https://packages.debian.org/bullseye/libfmt-dev
libcriterion-dev 2.3.3 https://packages.debian.org/bullseye/libcriterion-dev
librange-v3-dev 0.11.0 https://packages.debian.org/bullseye/librange-v3-dev

But, I have no clue how it would be with Ubuntu 18.04.5 LTS (Bionic Beaver) or newer versions…

from runner.

kazk avatar kazk commented on June 18, 2024

Thanks for looking into it.

you wouldn't need to build some of the libraries and tools yourself, and could just use the given ones

Yeah, it'll be nice if we can avoid building them from the source.

For libtbb (#85), I found a link to a .deb file on https://ubuntu.pkgs.org/20.04/ubuntu-universe-amd64/libtbb-dev_2020.1-2_amd64.deb.html and used that.

Maybe

will work.

We can update to a newer base, but that might be a breaking change for a lot of the existing kata and anything installed on the new one won't be usable until kata are updated to be compatible.

I should be able to have some time tomorrow.

from runner.

kazk avatar kazk commented on June 18, 2024

Here's the current Dockerfile if you're interested. https://gist.github.com/kazk/47e1c3f8eed7919f06145ce5df647f2a

from runner.

Urfoex avatar Urfoex commented on June 18, 2024

Thanks πŸ‘

I checked the docker image
qualified/clang 8 88d924d96fd5 7 months ago 1.02GB
via $ docker history --no-trunc 88d924d96fd5
But die Dockerfile of course is much better and easier to work with πŸ‘

I'll see how far I'll come with that.

from runner.

Urfoex avatar Urfoex commented on June 18, 2024

Oops, I think I overdid it a little πŸ˜…
https://drive.google.com/file/d/1hsuSWflkRNX-TSUA_mIyY2prF4LwcikY

FROM buildpack-deps:focal

ENV LANG=C.UTF-8

RUN set -ex; \
# Specifying user id because the file owner seems to revert to root if the user has
# the same uid (commonly 1000) as the user on host when userns-remap is enabled.
# https://github.com/moby/moby/issues/39169
    useradd --create-home -u 9999 codewarrior; \
    mkdir -p /workspace; \
    chown -R codewarrior:codewarrior /workspace;

ENV PATH=/opt/cmake/bin:$PATH
RUN set -ex; \
    wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - ;\
    echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-11 main" > /etc/apt/sources.list.d/clang-11.list; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
        software-properties-common \
        clang-11 \
        gcc-10 \
        g++-10 \
        ninja-build \
        libtbb-dev \
    ; \
#
# clean up
    apt-get autoremove -y; \
    apt-get clean; \
    rm -rf /var/lib/apt/lists/*;

RUN set -ex; \
# Install newer version of CMake with the official binary release
    mkdir -p /opt/cmake; \
    wget -q -O - https://github.com/Kitware/CMake/releases/download/v3.18.4/cmake-3.18.4-Linux-x86_64.tar.gz | tar xz -C /opt/cmake --strip-components=1; \
    rm -rf /opt/cmake/man /opt/cmake/doc /opt/cmake/bin/cmake-gui; \
#
# Install {fmt}
    cd /tmp; \
    git clone --recursive --depth 1 --branch 7.1.0 https://github.com/fmtlib/fmt.git; \
    mkdir -p fmt/build; \
    cd fmt/build; \
    cmake -GNinja ..; \
    ninja install; \
#
# Install range-v3
    cd /tmp; \
    git clone --recursive --depth 1 --branch 0.11.0 https://github.com/ericniebler/range-v3.git; \
    mkdir -p range-v3/build; \
    cd range-v3/build; \
    cmake -GNinja ..; \
    ninja install; \
#
# Install Criterion
    wget -q -O - https://github.com/Snaipe/Criterion/releases/download/v2.3.3/criterion-v2.3.3-linux-x86_64.tar.bz2 | tar xj -C /usr --strip-components=1; \
#
# Install Igloo
    cd /tmp; \
    git clone --recursive --depth 1 --branch codewars https://github.com/codewars/igloo.git; \
    mkdir -p igloo/build; \
    cd igloo/build; \
    cmake -GNinja ..; \
    ninja install; \
#
# clean up
    rm -rf /tmp/*;

COPY rootfs/opt/runner /opt/runner
RUN set -ex; \
    cd /opt/runner; \
    clang-11 -c criterion-hooks.c -Wall -Wextra;

COPY --chown=codewarrior:codewarrior rootfs/workspace/gtest /workspace/gtest
USER codewarrior
ENV CC=/usr/bin/clang-11 CXX=/usr/bin/clang++-11 LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
RUN set -ex; \
    cd /workspace/gtest; \
    cmake -S . -B build -G Ninja; \
    cmake --build build && ./build/tests/tests; \
    rm -rf ./build/src ./build/tests ./src/lib.cpp ./tests/test_counter.cpp ./include/challenge;

COPY --chown=codewarrior:codewarrior rootfs/testlibraries.cpp /tmp/testlibraries.cpp
RUN set -ex; \
    clang++-11 --std=c++20 -Wall -Wextra -o /tmp/testlibraries /tmp/testlibraries.cpp -ltbb -latomic -lfmt && /tmp/testlibraries; \
    rm -rf /tmp/testlibraries*;

WORKDIR /workspace

testlibraries.cpp

#include <igloo/igloo_alt.h>

#include <fmt/format.h>
#include <range/v3/numeric/accumulate.hpp>
#include <range/v3/to_container.hpp>
#include <range/v3/view/iota.hpp>
#include <range/v3/view/transform.hpp>
#include <range/v3/view/take.hpp>
#include <range/v3/view/take_while.hpp>

#include <algorithm>
#include <execution>
#include <functional>
#include <iostream>
#include <string>
#include <vector>

using namespace std::literals::string_literals;

auto test_fmt() -> void {
    auto const string = fmt::format("{} {}!"s, "Hello"s, "World"s);
    fmt::print("Printing: '{}'\n", string);
}

auto test_range() -> void {
    auto const square = [](uint64_t const n) -> uint64_t {
        return n * n;
    };
    auto const smaller = [](uint64_t const max) -> std::function<auto (uint64_t) -> uint64_t> {
        return [max](uint64_t n) -> bool {
            return n <= max;
        };
    };
    auto const squares = ranges::views::iota(0)
        | ranges::views::transform(square)
        | ranges::views::take_while(smaller(100));
    auto const sum = ranges::accumulate(squares, 0);
    fmt::print("Square Sum = {}\n", sum);
}

auto test_execution() -> void {
    auto const square = [](int64_t const n) -> int64_t {
        return n * n;
    };
    auto const squares = ranges::views::iota(0)
        | ranges::views::transform(square)
        | ranges::views::take(1000)
        | ranges::to<std::vector<int64_t>>();
    auto transformed = std::vector<int64_t>(squares.size());
    std::transform(
        std::execution::par,
        squares.begin(), squares.end(),
        transformed.begin(),
        square
    );
    auto const reduce = [](int64_t const a, int64_t const b) -> int64_t {
        return a + b;
    };
    auto const transform = [](int64_t const n) -> int64_t {
        return std::sqrt(std::sqrt(n));
    };
    auto const res = std::transform_reduce(
        std::execution::par,
        transformed.begin(), transformed.end(),
        static_cast<int64_t>(0),
        reduce,
        transform
    );
    fmt::print("Transformed Sum: {}\n"s, res);
}

auto test_igloo(int argc, char * * argv) -> void {
    igloo::TestRunner::RunAllTests(argc, argv);
}

auto main(int argc, char * * argv) -> int {
    test_fmt();
    test_range();
    test_execution();
    test_igloo(argc, argv);
    return 0;
}

from runner.

kazk avatar kazk commented on June 18, 2024

Thanks, but like I wrote above, I was trying to avoid updating to newer base for compatibility reasons.

If we use Focal and a new compiler versions, we should be able to install relatively new fmt and range-v3 from apt without building from source, right? We can add a separate C++20 version and add these packages there.

Also, I got errors trying to use fmt with Igloo's test because of It (see #87).

from runner.

Urfoex avatar Urfoex commented on June 18, 2024

Yeah, totally understandable.

A C++20 Version would be nice. But checking the current support, there are still things missing in the language and the compilers.
Also, solving the Katas I didn't have the feeling on missing out and much of C++20 yet. Mostly the ranges and formatting things, that could be done with those here mentioned libraries.

(It would be more the clangd-based editor-auto-completion, that I saw on hackerrank, that would be nice to have here too. Or some other kind of quick/easy integration with a local editor…)

For installing the libraries I didn't find official and new packages for 18.04.
But installing them from current releases from souce was no problem with the current Dockerfile you provided.

from runner.

kazk avatar kazk commented on June 18, 2024

Yeah, I'd like to wait a little for C++20.

But installing them from current releases from souce was no problem with the current Dockerfile you provided.

You were able to make it work with bionic? The file I got from your Google Drive has FROM buildpack-deps:focal so I assumed you couldn't.

from runner.

kazk avatar kazk commented on June 18, 2024

It would be more the clangd-based editor-auto-completion, that I saw on hackerrank, that would be nice to have here too.

I didn't know they had Language Server based autocompletion enabled for simple challenges for any user. It's not working for me for some reason, but I see it's trying to connect to a server over WebSocket.

When there's only a single known file like their simple challenges, it's not that difficult to support because you can spawn Language Servers for each connection and let it work in memory. It gets tricky and expensive (financially) to support multiple files because Language Server will need to read from files that was edited.

Not intended for Codewars (maybe in the future), but I'm working on to support Language Servers on Qualified that supports full projects.

Rust Analyzer with CodeMirror client:
image
https://github.com/qualified/lsps

Still work in progress, but it supports any Language Server over WebSocket and also in-browser Language Server in Web Workers.

Not many Language Servers can currently run in browser, so I wrote lsp-ws-proxy that allows editor <-> ws <-> stdio communication with any Language Servers. I'm sure HackerRank is doing something similar with clangd. I'm hoping more Language Servers will be able to run in the browser with WASM and some virtual filesystem though. That will allow us to provide this to more users.

Or some other kind of quick/easy integration with a local editor…

Yeah, we have that for Qualified, but nothing for Codewars. I'd like to eventually support it when Codewars have proper APIs.

from runner.

kazk avatar kazk commented on June 18, 2024

The file I got from your Google Drive has FROM buildpack-deps:focal so I assumed you couldn't.

Sorry, I missed your comment on the other issue. Thanks!

from runner.

Urfoex avatar Urfoex commented on June 18, 2024

Sorry for the confusion πŸ˜…

And a big thanks for being so quick and having done the changes πŸ‘

You are working on some interesting things their.
I'll happily see what will come out of it πŸ‘

from runner.

kazk avatar kazk commented on June 18, 2024

Deployed. @Urfoex Thanks again for your help!

from runner.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.