Merge branch 'master' of git.qabel.de:Qabel/schickmacher
This commit is contained in:
commit
220057750b
11 changed files with 274 additions and 48 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -183,6 +183,7 @@ typings/
|
|||
# Gradle:
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
.idea/
|
||||
|
||||
# CMake
|
||||
cmake-build-debug/
|
||||
|
|
|
@ -275,19 +275,12 @@ COMPRESS_PRECOMPILERS = (
|
|||
# ------------------------------------------------------------------------------
|
||||
MARKDOWNX_MARKDOWN_EXTENSIONS = [
|
||||
'markdown.extensions.extra',
|
||||
'markdown.extensions.abbr',
|
||||
'markdown.extensions.attr_list',
|
||||
'markdown.extensions.def_list',
|
||||
'markdown.extensions.fenced_code',
|
||||
'markdown.extensions.footnotes',
|
||||
'markdown.extensions.tables',
|
||||
'markdown.extensions.admonition',
|
||||
'markdown.extensions.codehilite',
|
||||
'markdown.extensions.meta',
|
||||
'markdown.extensions.nl2br',
|
||||
'markdown.extensions.sane_lists',
|
||||
'markdown.extensions.smarty',
|
||||
'markdown.extensions.toc',
|
||||
'markdown.extensions.wikilinks',
|
||||
'mdx_truly_sane_lists',
|
||||
]
|
||||
|
||||
|
|
|
@ -20,7 +20,8 @@ djangorestframework==3.10.2 # https://github.com/encode/django-rest-framework
|
|||
coreapi==2.3.3 # https://github.com/core-api/python-client
|
||||
|
||||
django-markdownx==2.0.28
|
||||
WeasyPrint==49
|
||||
mdx_truly_sane_lists==1.2
|
||||
WeasyPrint==50
|
||||
django-weasyprint==0.5.4
|
||||
whitenoise==4.1.3
|
||||
Pygments==2.4.2
|
||||
|
|
|
@ -6,6 +6,7 @@ from markdownx.fields import MarkdownxFormField
|
|||
|
||||
class RendererForm(forms.Form):
|
||||
title = forms.CharField(label=_('Title'), required=False)
|
||||
show_title = forms.BooleanField(label=_('Show Title'), required=False)
|
||||
date = forms.DateField(label=_('Date'),
|
||||
initial=lambda: timezone.now().strftime('%Y-%m-%d'),
|
||||
widget=forms.TextInput(
|
||||
|
@ -14,3 +15,7 @@ class RendererForm(forms.Form):
|
|||
render_content = MarkdownxFormField(
|
||||
label=_('Content'),
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields['show_title'].initial = True
|
||||
|
|
|
@ -24,3 +24,23 @@ class TestRendererFormView:
|
|||
assert b'Example' in response.content
|
||||
assert response.content.startswith(b'%PDF')
|
||||
|
||||
def test_html_render(self, client: Client):
|
||||
response = client.post('/renderer/renderhtml', data={
|
||||
'title': 'Sample Title',
|
||||
'date': '2009-11-15',
|
||||
'render_content': '# Example',
|
||||
'show_title': 'on',
|
||||
})
|
||||
assert b'Sample Title' in response.content
|
||||
assert b'<h1>Sample Title</h1>' in response.content
|
||||
assert b'Example' in response.content
|
||||
|
||||
def test_hiding_title(self, client: Client):
|
||||
response = client.post('/renderer/renderhtml', data={
|
||||
'title': 'Sample Title',
|
||||
'date': '2009-11-15',
|
||||
'render_content': '# Example'
|
||||
})
|
||||
assert b'Sample Title' in response.content
|
||||
assert b'<h1>Sample Title</h1>' not in response.content
|
||||
assert b'Example' in response.content
|
||||
|
|
|
@ -21,6 +21,7 @@ class HtmlRenderView(TemplateView):
|
|||
if form.is_valid():
|
||||
return {
|
||||
'date': form.cleaned_data['date'],
|
||||
'show_title': form.cleaned_data['show_title'],
|
||||
'content': markdownify(form.cleaned_data['render_content']),
|
||||
'title': form.cleaned_data['title']
|
||||
}
|
||||
|
|
|
@ -34,6 +34,16 @@ $red: #b94a48;
|
|||
color: $red;
|
||||
}
|
||||
|
||||
.markdownx {
|
||||
display: flex;
|
||||
column-gap: 2.5em;
|
||||
}
|
||||
|
||||
.markdownx-editor {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.markdownx-preview {
|
||||
width: 50%;
|
||||
@import 'render';
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
@bottom-center {
|
||||
content: 'qabel.de';
|
||||
font-weight: bold;
|
||||
color: $orange;
|
||||
}
|
||||
|
||||
@top-center {
|
||||
|
@ -32,13 +33,15 @@
|
|||
z-index: 10;
|
||||
color:white;
|
||||
white-space: nowrap;
|
||||
//font-size: 1.4em;
|
||||
/*content filled in template*/
|
||||
}
|
||||
|
||||
@top-left {
|
||||
z-index: 10;
|
||||
white-space: nowrap;
|
||||
color:white;
|
||||
width: 75%;
|
||||
color:white;;
|
||||
font-size: 1.4em;
|
||||
padding-left: 50pt;
|
||||
/*content filled in template*/
|
||||
}
|
||||
|
@ -115,24 +118,14 @@ hr{
|
|||
border-top: 1px solid black;
|
||||
}
|
||||
|
||||
/*
|
||||
ul {
|
||||
list-style: none;
|
||||
|
||||
> li:before {
|
||||
content: "";
|
||||
border-color: transparent $orange;
|
||||
border-style: solid;
|
||||
border-width: 0.35em 0 0.35em 0.6em;
|
||||
margin-top: -0.7em;
|
||||
display: block;
|
||||
height: 0;
|
||||
width: 0;
|
||||
left: -1em;
|
||||
top: 1em;
|
||||
position: relative;
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse:collapse;
|
||||
}
|
||||
|
||||
tr:nth-child(even) {
|
||||
background-color: #f2f2f2
|
||||
}
|
||||
}*/
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
|
|
|
@ -17,7 +17,5 @@
|
|||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
</form>
|
||||
<div class="preview">
|
||||
{{ form.media }}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -25,9 +25,11 @@
|
|||
<body>
|
||||
|
||||
<div class="container">
|
||||
{% if show_title %}
|
||||
<div class="header">
|
||||
<h1>{{ title }}</h1>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="document">
|
||||
{{ content | safe }}
|
||||
</div>
|
||||
|
|
224
test.md
224
test.md
|
@ -1,3 +1,167 @@
|
|||
# Lead Developer
|
||||
- Jahrgang: 1988
|
||||
- Ausbildung: Bachelor of Science Informatik, Leibniz Universität Hannover
|
||||
|
||||
## Fachkenntnisse
|
||||
### Softwareentwicklung
|
||||
#### Kernkompetenzen
|
||||
- Agile Development, Test-Driven-Development
|
||||
- Reactive Design, Microservices
|
||||
- Clean Architecture, Domain Driven Development
|
||||
- OpenSource Lizenzen im kommerziellen Einsatz
|
||||
|
||||
#### Tiefgreifende Erfahrung
|
||||
- Testmanagement und -automatisierung (xUnit, Selenium, pytest, Espresso, etc)
|
||||
- Logisches Datenbankdesign, relational und NoSQL (PostgreSQL, MySQL / MariaDB, SQLite, MongoDB, Redis, Elasticsearch)
|
||||
- Android App-Entwicklung (RxJava, MVVM, Jetpack, Architecture Components, USB-CDC)
|
||||
- Python (Django, Django-Rest-Framework, Tornado), Kotlin, Java (Spring Boot), PHP (Yii, Zend Framework 3), Ruby (Rails)
|
||||
- Web-Frontends mit Angular (Material Design, Redux), jQuery, TypeScript, JavaScript
|
||||
|
||||
#### Grundlegende Erfahrung
|
||||
- Oracle DB, C++ (embedded development), .NET, C#, Haskell, Go
|
||||
|
||||
### Infrastruktur
|
||||
- Deployment und Integration bei Amazon Web Services (S3, EC2) und Firebase
|
||||
- Git, SVN, Mercurial
|
||||
- JetBrains Toolchain (Hub, YouTrack, Teamcity, Upsource), Jenkins, Jira, GoCD, Redmine
|
||||
- Linux Server, nginx, Docker, Docker-Compose
|
||||
|
||||
### Datenschutz/Datensicherheit
|
||||
- Privacy by Design in der Praxis, DSGVO-Zusammenhänge
|
||||
- Implementation intern entwickelter Kryptographieprotokolle, Entwicklung und Review von Kryptographieprotokollen
|
||||
- Auditierung von Full-Stack Webanwendungen
|
||||
|
||||
### Wissensvermittlung
|
||||
- Konzeption von Präsentationen und Vorträgen, Durchführung von Präsentationen und Vorträgen
|
||||
- Entwicklerschulungen, Beratung für Software-Architektur, Security by Design und Teamleitung
|
||||
|
||||
## Weitere Kenntnisse
|
||||
### Branchen
|
||||
- Universitäten
|
||||
- Veranstaltungsbranche
|
||||
- Medizinbranche
|
||||
- Büroelektronik
|
||||
- Telekommunikationsbranche
|
||||
|
||||
### Sprachen
|
||||
- Deutsch (Muttersprache)
|
||||
- Englisch (fließend)
|
||||
|
||||
## Ausgewählte Projekte
|
||||
### 2019
|
||||
#### Niedersächsische Tierseuchenkasse, Hannover
|
||||
Diverse Module einer Website mit Integration von Services Dritter
|
||||
|
||||
Technologien
|
||||
- PHP 7.2, Zend Framework 3, PHPUnit
|
||||
- Bootstrap 3, jQuery
|
||||
- Docker
|
||||
- MySQL/MariaDB
|
||||
|
||||
|
||||
### 2019
|
||||
#### Arconic Fastening Systems, Hildesheim
|
||||
Informationsflussanalyse und Erarbeitung von Optimierungspotenzialen im Kontext von Industrie 4.0 in einem
|
||||
Hauptfertigungsstandort anhand von Interviews und bestehender Dokumentation
|
||||
- Interdisziplinäre Zusammenarbeit mit dem Institut für Integrierte Produktion Hannover
|
||||
|
||||
### 2018
|
||||
#### Büroelektronik Konzern, Hannover
|
||||
Implementierung eines Mock-Ups zur Demonstration eines neuen kryptographischen
|
||||
Konzepts und seiner Anwendungsmöglichkeiten
|
||||
- Entwicklung eines Mock-Ups
|
||||
Technologien
|
||||
- Angular, Clarity Design
|
||||
|
||||
#### Büroelektronik Konzern, Hannover
|
||||
Privacy Firewall zur Einstufung personenbezogener Daten in
|
||||
Unternehmensnetzwerken als Teil eines Großprojekts
|
||||
- Entwicklung einer Server Applikation
|
||||
- Beratung in den Bereichen Natural Language Processing und KI
|
||||
- Review der Gesamtarchitektur mit Bezug auf IT-Security und Performance / Skalierung
|
||||
|
||||
Technologien
|
||||
- Python, MQTT
|
||||
- spaCy - Industrial Streng Natural Language Processing
|
||||
|
||||
### 2017 - 2018
|
||||
#### Softwareentwicklungsbranche, Hannover
|
||||
Entwicklung einer sicheren Telekommikationslösung mit IoT-Komponenten
|
||||
- Software-Entwicklung (Android, Embedded, Webserver)
|
||||
- Leitung eines verteilten und interdisziplinären Teams
|
||||
|
||||
Technologien
|
||||
- C++ auf ARM32
|
||||
- Kotlin, Python, Django
|
||||
- Angular, Typescript, Clarity Design
|
||||
- WebSockets, WebRTC
|
||||
- USB-CDC mit Android Device als USB-Host
|
||||
- Protobuf, serielle Protokolle
|
||||
- Docker
|
||||
|
||||
### 2017
|
||||
#### Frankiermaschinenhersteller, Berlin
|
||||
Auditing einer umfangreichen online Software für digitale Signaturen
|
||||
- Durchführung der Auditierung
|
||||
- Coaching der Teamleitung (insb. Testing, Teamführung und Kommunikation
|
||||
mit der Projektleitung)
|
||||
- Beratung bzgl. Verbesserung der vorhanden Entwicklungsprozesse
|
||||
hinsichtlich agile Development
|
||||
|
||||
#### Büroelektronik Konzern, Hannover
|
||||
Entwicklung eines Demonstrators für eine smarte Arbeitsumgebung unter
|
||||
Berücksichtigung von Privacy-by-design and default Vorgaben
|
||||
- Software Entwicklung
|
||||
|
||||
Technologien
|
||||
- MQTT, IoT
|
||||
- Windows 10 C# .NET App
|
||||
|
||||
#### Büroelektronik Konzern, Hannover
|
||||
Entwicklung eines Demonstrators zum Einsatz von Attribute-Based-Credentials zur anonymen Authentifizierung und Authorisierung von Mitarbeitern mithilfe von Smart Devices
|
||||
- Software-Entwicklung
|
||||
- Konzept-Entwicklung - Attribute-Based-Credentials im Enterprise Umfeld
|
||||
|
||||
Technologien
|
||||
- Python, Flask
|
||||
- Angular, Material Design
|
||||
- Android, Kotlin, AndroidWear (Smartwatches), NFC
|
||||
|
||||
### 2015 - 2016
|
||||
#### Qabel GmbH (internes Projekt), Hannover
|
||||
Kryptographie-Plattform zur sicheren Kommunikation mit Ende-zu-Ende Verschlüsselung und Dokumentenablage in der Amazon Cloud mit Client-Anwendungen für Android und Windows/Mac/Linux
|
||||
|
||||
Technologien
|
||||
- Java, Kotlin, Android
|
||||
- Python, Django
|
||||
- Docker
|
||||
- Angular
|
||||
- PostgreSQL, SQLite
|
||||
|
||||
### 2011 - 2014
|
||||
#### Event Software Hersteller, Hannover
|
||||
Entwicklung einer modularen und skalierbaren Webanwendung zur Organisation von Veranstaltungen wie beispielsweise Messen
|
||||
- Performance-optimiertes ORM auf Basis von MongoDB und Redis
|
||||
- Massen-Email-Versand in Hintergrundprozessen
|
||||
|
||||
Technologien
|
||||
- Python
|
||||
- PHP, Yii-Framework
|
||||
- MongoDB, Redis
|
||||
- HTML 5, CSS3, jQuery, DataTables
|
||||
|
||||
### 2008 - 2012
|
||||
#### Juristische Fakultät, Leibniz Universität Hannover
|
||||
Administration, Webentwicklung und Druck-Layouting
|
||||
|
||||
Technologien
|
||||
- PHP
|
||||
- Python
|
||||
- LaTeX
|
||||
- MySQL
|
||||
|
||||
***
|
||||
|
||||
# <a name="top"></a>Markdown Test Page
|
||||
|
||||
* [Headings](#Headings)
|
||||
|
@ -132,24 +296,62 @@ Ad amet irure est magna id mollit Lorem in do duis enim. Excepteur velit nisi ma
|
|||
|
||||
Et fugiat ad nisi amet magna labore do cillum fugiat occaecat cillum Lorem proident. In sint dolor ullamco ad do adipisicing amet id excepteur Lorem aliquip sit irure veniam laborum duis cillum. Aliqua occaecat minim cillum deserunt magna sunt laboris do do irure ea nostrud consequat ut voluptate ex.
|
||||
|
||||
```go
|
||||
package main
|
||||
### Bash
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
)
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
func handler(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
|
||||
cd $ROOT_DIR
|
||||
DOT_FILES="lastpass weechat ssh Xauthority"
|
||||
|
||||
for dotfile in $DOT_FILES; do conform_link "$DATA_DIR/$dotfile" ".$dotfile"; done
|
||||
```
|
||||
|
||||
|
||||
### C
|
||||
|
||||
```c
|
||||
#define UNICODE
|
||||
#include <windows.h>
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
int speed = 0, speed1 = 0, speed2 = 0; // 1-20
|
||||
|
||||
if (argc == 1) return 0;
|
||||
if (argc >= 2) sscanf(argv[1], "%d", &speed1);
|
||||
if (argc >= 3) sscanf(argv[2], "%d", &speed2);
|
||||
|
||||
if (argc == 2) // set speed to first value
|
||||
speed = speed1;
|
||||
else if (speed == speed1 || speed == speed2) // alternate
|
||||
speed = speed1 + speed2 - speed;
|
||||
else
|
||||
speed = speed1; // start with first value
|
||||
|
||||
SystemParametersInfo(SPI_SETMOUSESPEED, 0, speed, 0);
|
||||
SystemParametersInfo(SPI_GETMOUSESPEED, 0, &speed, 0);
|
||||
printf("New speed: %2d\n", speed);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
func main() {
|
||||
http.HandleFunc("/", handler)
|
||||
http.ListenAndServe(":8080", nil)
|
||||
|
||||
### CSS
|
||||
|
||||
```css
|
||||
/* CSS Comment */
|
||||
#some-id .some-class {
|
||||
float: left;
|
||||
width: 100px;
|
||||
}
|
||||
```
|
||||
|
||||
### HTML
|
||||
|
||||
```html
|
||||
<a name="Inline"></a>Inline elements
|
||||
```
|
||||
|
||||
Ex amet id ex aliquip id do laborum excepteur exercitation elit sint commodo occaecat nostrud est. Nostrud pariatur esse veniam laborum non sint magna sit laboris minim in id. Aliqua pariatur pariatur excepteur adipisicing irure culpa consequat commodo et ex id ad.
|
||||
|
||||
[[Top]](#top)
|
||||
|
|
Loading…
Reference in a new issue