Diskussion Code-Formatierung für die C und C++ Foren

Lowl3v3l

Mitglied
devCommunity-Experte
Hey zusammen!

da ich gern Syntax-Highlighting für Code-Tags in den C/C++-Foren umsetzen würde, hier mal ein kleines "Konzept" von jemandem der kein Webentwickler ist, es würde mich freuen, wenn Webdevs etwas dazu sagen würden.

Generell würde ich gern clang-format benutzen, da es diverse Vorteile bietet : es hat sich als eines DER Standard-Tools durchgesetzt und es verfügt über solide Standards für C und C++ und unterstützt ggf. auch Java, C# und ObjC, sollten wir das Highlighting ausweiten wollen. Weiterhin ist es online in verschiedenen Tools verfügbar, die wir fürs erste für unser Highlighting benutzen können, die bekanntesten sind wohl https://godbolt.org/ und der online-konfigurator : https://zed0.co.uk/clang-format-configurator/.
Meine Frage an die Webdevs unter uns wäre nun : ist es möglich, in XenForo einen Hook anzulegen, der beim absenden eines Beitrages C(++)-code tags sucht, den Inhalt auf godbolt.org postet, dort das tool clang-format hinzufügt und den Inhalt des Ausgabefensters für clang-format in den Forenbeitrag einfügt? Oder gibt es ggf. andere Ideen? Ich würde gern, zumindest testweise, schon freie Services benutzen wollen, AWS-Buckets oder ähnliches sind schließlich auch nicht kostenlos.

mfg,
Lowl3v3l
 

JR Cologne

Administrator
Teammitglied
Also, erstmal schon mal vielen Dank für deine Bemühungen, @Lowl3v3l!

Die Online-Tools für die automatisierte Formatierung des Codes zu nutzen, wäre glaube ich wenig effizient und auch etwas aufwendiger zu entwickeln, da diese, soweit ich das sehen kann, keine API o.ä. bereitstellen.
Dazu kommt noch, dass wir schlecht einfach alle Codes der Nutzer durch ein fremdes Online-Tool jagen können, wo wir nicht wissen, was mit dem Code dann passiert.

Sehe ich das richtig, das clang-format ein ganz normales Kommandozeilentool ist, das in einer gewöhnlichen Linux-Umgebung laufen würde?
Meine Idee wäre jetzt gewesen, dass wir den Code aus den Code-Tags an eine kleine Webanwendung schicken, welche den Code dann in entsprechenden Dateien abspeichert und anschließend das Kommandozeilentool drüberlaufen lässt.
Danach würde der formatierte Code aus den Dateien wieder extrahiert und als Antwort von der Webanwendung zurückgegeben werden.
Dieser formatierte Code könnte dann wiederum im Forenbeitrag anstatt dem alten Code in den Code-Block eingefügt werden.
So grob. :D

clang-format scheint es sogar als npm-package zu geben. (y) :D
 

Lowl3v3l

Mitglied
devCommunity-Experte
Ja, so kann man clang-format starten, läuft aber auch problemfrei auf windows etc. Und zumindest bei godbolt.org ist ziemlich klar dass er es nicht speichert und das Tool und der Typ ist durchaus auch eine Institution in C++-Kreisen ;)

Sogar der aufruf ist denkbar einfach : "clang-format -style=LLVM -i datei.cpp" formatiert die Datei in-place neu.

Wenn man das auf einem Server einfach ausführen kann wäre es natürlich Ideal, dann kann man das per podman oder docker wegkapseln, hat dadurch auch eine entsprechend neue Version etc. Ich hatte dich nur vorhin so verstanden, dass das lokal laufen lassen nicht ginge, das ist für mich natürlich die erste Wahl.

mfg
 

JR Cologne

Administrator
Teammitglied
Wenn man das auf einem Server einfach ausführen kann wäre es natürlich Ideal, dann kann man das per podman oder docker wegkapseln, hat dadurch auch eine entsprechend neue Version etc. Ich hatte dich nur vorhin so verstanden, dass das lokal laufen lassen nicht ginge, das ist für mich natürlich die erste Wahl.

Es geht nicht lokal auf dem gleichen Server, wo auch das Forum läuft.
Zumindest wüsste ich da nicht wie.
Was man aber hingegen sicher machen kann, ist ein entsprechenden Docker-Container zusammenzustellen, der sowohl eine kleine Webanwendung mit PHP, Node oder Python als auch das installierte clang-format-Tool bereitstellt.
Dann würde ich das irgendwo in der Cloud deployen und fertig.
 

Lowl3v3l

Mitglied
devCommunity-Experte
Ja, so einen Docker- oder Podman-Container zu basteln ist gar kein Problem, nur je nach Webanwendung die das entgegen nehmen soll bräuchte ich einen Webentwickler der mit das abnimmt. Den Container selbst kann ich bauen.

mfg
 

JR Cologne

Administrator
Teammitglied
Ja, so einen Docker- oder Podman-Container zu basteln ist gar kein Problem, nur je nach Webanwendung die das entgegen nehmen soll bräuchte ich einen Webentwickler der mit das abnimmt. Den Container selbst kann ich bauen.
Wenn du einen Docker-Container zusammenstellen könntest, wäre das super. (y)

Wenn niemand anders total heiß drauf ist, würde ich die Webanwendung übernehmen.
Würde in dem Fall dann was mit PHP und Apache werden.
 

Lowl3v3l

Mitglied
devCommunity-Experte
So einfach sieht das auf Fedora-Basis erstmal aus,

Code:
FROM fedora:latest
RUN dnf update -y
RUN dnf install httpd clang-tools-extra -y
ADD site /var/www/html
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
EXPOSE 80
im Verzeichnis mit dem Dockerfile muss natürlich dann auch ein Ordner "site" liegen, der die Inhalte von /var/www/html angibt. HTTPS und Konsorten wäre etwas schwieriger, aber könnte man ggf. auch dazu basteln. Zugriff gibts vor allem über docker-exec, nicht über ssh.

mfg
 

JR Cologne

Administrator
Teammitglied
Und PHP ist bei Fedora standardmäßig in einer halbwegs aktuellen Version installiert?
HTTPS wäre natürlich noch nice.
Inwiefern hat Docker damit dann was zu tun?
Müsste man lediglich die Apache-Konfiguration anpassen, wenn ein entsprechendes Zertifikat vorliegen würde?
Oder ist das mehr?
 

Lowl3v3l

Mitglied
devCommunity-Experte
Ja man muss für https an der config rummachen,das müsste auch im Dockerfile gehen, das traue ich mir ohne nachzulesen aber nicht zu.
Wenn du PHP haben willst muss das in die dnf-install-zeile mit rein, derzeit hat PHP auf Fedora Core 31(aka "latest") die Version 7.3.16.

ich würds erstmal ohne HTTPS zum laufen bringen und das ggf. nachrüsten.

mfg
 

JR Cologne

Administrator
Teammitglied
Folgendes Problem ergibt sich:

Bash:
docker build -t dev-community-code-formatter .
docker run dev-community-code-formatter -d  
C:\Program Files\Docker\Docker\resources\bin\docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-d\": executable file not found in $PATH": unknown.
Irgendeine Idee, was ich da tun kann?
Beim Build-Prozess tauchen jedenfalls keine Fehler auf.

Edit:
Ups, das Problem war offenbar die Reihenfolge des Befehls.
So ist es richtig:
Bash:
docker run -d dev-community-code-formatter
 

Lowl3v3l

Mitglied
devCommunity-Experte
Aber klar doch : die Argumente umdrehen ;)
Bash:
podman run -d dev-community-code-formatter
tut was du denk ich anstellen willst ;) Müsste mit docker genau so klappen.

Der Hintergrund ist : run erwartet als parameter nach dem Container ein Programm das im Container im Path liegt. Wird keins angegeben defaultet es auf das was im Dockerfile mit RUN oder CMD angegeben ist. du versuchst das Programm "-d" zu starten, das nicht im Pfad zu finden ist.

mfg
 

JR Cologne

Administrator
Teammitglied
Ok, nächstes Problem :D:

Ich habe den Ordner site in public umbenannt und den Dockerfile entsprechend angepasst.
Dadurch, dass mir dann im Browser ein 503 Service Unavailable entgegen geflogen ist, wollte ich es stattdessen mal mit einer einfachen HTML-Seite probieren.
Leider bekomme ich die aber nicht in den Container.
Mit docker run -d -p 80:80 -v ./public:/var/www/html dev-community-code-formatter passiert nichts.
Es liegt weiterhin nur die PHP-Datei im Verzeichnis /var/www/html, wenn ich per docker exec -it ... bash nachschaue.
Mit docker build habe ich das Image auch neu erzeugt.

Müsste das nicht eigentlich so funktionieren? :unsure:

Btw, wegen dem Service Unavailable.
Ist ja wahrscheinlich ein Apache-Konfigurationsproblem:

/etc/httpd/logs/error_log
Code:
[Sat Apr 18 17:17:03.881945 2020] [proxy:error] [pid 7:tid 140413564442368] (2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed
[Sat Apr 18 17:17:03.881974 2020] [proxy_fcgi:error] [pid 7:tid 140413564442368] [client 172.17.0.1:53322] AH01079: failed to make connection to backend: httpd-UDS

Edit:
Ich habe das Ganze jetzt basierend auf einem anderen Docker-Setup, das bei mir in letzter Zeit ganz gut funktioniert hat, etwas umstrukturiert.

docker-compose.yml
Code:
version: '3'

services:
  web:
    build:
      context: .
      dockerfile: .docker/web/Dockerfile
    image: dev-community-code-formatter_web
    ports:
      - 80:80
    volumes:
      - .:/var/www/html
.docker/web/Dockerfile
Code:
FROM fedora:latest

RUN dnf update -y
RUN dnf install httpd php clang-tools-extra -y

COPY . /var/www/html
COPY .docker/web/vhost.conf /etc/apache2/sites-available/000-default.conf

WORKDIR /var/www/html

CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
EXPOSE 80
.docker/web/vhost.conf
Apache-Konfiguration:
<VirtualHost *:80>
    DocumentRoot /var/www/html/public

    <Directory "/var/www/html/public">
        AllowOverride all
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Somit habe ich es jetzt schon mal geschafft, dass die "Fedora Webserver Test Page" richtig ausgeliefert wird.
Die wesentliche Frage wäre jetzt, wo ich die Apache-Konfigurationsdatei hinkopieren muss, damit der DocumentRoot passt und was ich ggf. noch tun muss, damit PHP läuft.
 
Zuletzt bearbeitet:

Lowl3v3l

Mitglied
devCommunity-Experte
Ich glaube dein Problem ist, du gibst noch ein extra -v an.
Folgendes geht bei mir :

Dockerfile :
Code:
FROM fedora:latest

RUN dnf update -y
RUN dnf install httpd php clang-tools-extra -y
ADD site /var/www/html
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
EXPOSE 80
site/index.html:
Code:
HELLO WORLD
Bauen und Ausführen:
Code:
podman build -t formatter .
podman run -d -p 8088:80 formatter
Testen:
Code:
curl localhost:8088
> HELLO WORLD
mfg
 

Lowl3v3l

Mitglied
devCommunity-Experte
Die Apache config liefgt, wie üblich, unter : /etc/httpd/conf/httpd.conf. Darin müsstest du den document-root setzen können.

Was mir auffällt : ein VOLUME(per docker-compose) und ein COPY aufs gleiche Verzeichnis ist bestenfalls redundant und geht schlimmstenfalls schief, würde ich darum nicht machen.
 

JR Cologne

Administrator
Teammitglied
Perfekt, jetzt wird schon mal die HTML-Seite richtig angezeigt.
PHP funktioniert allerdings noch nicht.

Im Apache-Error-Log steht weiterhin Folgendes:
Code:
[Sat Apr 18 18:40:13.145332 2020] [proxy:error] [pid 10:tid 140703657092864] (2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed
[Sat Apr 18 18:40:13.145403 2020] [proxy_fcgi:error] [pid 10:tid 140703657092864] [client 172.22.0.1:60918] AH01079: failed to make connection to backend: httpd-UDS
 

JR Cologne

Administrator
Teammitglied
Hm, ich fürchte, dann brauchen wir so langsam von jemand anders Unterstützung.
Ich weiß schon, warum ich kein SysAdmin werde. :D

Die User stimmen überein. Nur die Datei /run/php-fpm/www.conf existiert gar nicht, sodass ich schlecht die Ownership anpassen kann...

Edit:
So sieht die Datei /etc/httpd/conf.d/php.conf aus:
Apache-Konfiguration:
#
# The following lines prevent .user.ini files from being viewed by Web clients.
#
<Files ".user.ini">
    Require all denied
</Files>

#
# Allow php to handle Multiviews
#
AddType text/html .php

#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php

#
# Redirect to local php-fpm (no mod_php in default configuration)
#
<IfModule !mod_php5.c>
  <IfModule !mod_php7.c>
    # Enable http authorization headers
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

    <FilesMatch \.(php|phar)$>
        SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>
  </IfModule>
</IfModule>

#
# mod_php is deprecated as FPM is now used by default with httpd in event mode
# mod_php is only used when explicitly enabled or httpd switch to prefork mode
#
# mod_php options
#
<IfModule  mod_php7.c>
    #
    # Cause the PHP interpreter to handle files with a .php extension.
    #
    <FilesMatch \.(php|phar)$>
        SetHandler application/x-httpd-php
    </FilesMatch>

    #
    # Uncomment the following lines to allow PHP to pretty-print .phps
    # files as PHP source code:
    #
    #<FilesMatch \.phps$>
    #    SetHandler application/x-httpd-php-source
    #</FilesMatch>

    #
    # Apache specific PHP configuration options
    # those can be override in each configured vhost
    #
    php_value session.save_handler "files"
    php_value session.save_path    "/var/lib/php/session"
    php_value soap.wsdl_cache_dir  "/var/lib/php/wsdlcache"

    #php_value opcache.file_cache   "/var/lib/php/opcache"
</IfModule>
 

JR Cologne

Administrator
Teammitglied
Oder aber wir cheaten ein bisschen, und benutzen dieses Image : https://hub.docker.com/_/php/ ;) So wie sich das liest kann das was wir wollen. Die Version php:7.2-apache müsste alles können das wir wollen, denke ich.
Das hatte ich eigentlich auch schon im Rahmen der Umstrukturierungsmaßnahmen probiert.
Kann es sein, dass in der php-apache-Umgebung das Package clang-tools-extra nicht verfügbar ist?
So wurde mir das jedenfalls mitgeteilt.
 
Zuletzt bearbeitet:
Oben Unten