Olli Graf
5 months ago
19 changed files with 1117 additions and 5 deletions
@ -0,0 +1,26 @@ |
|||
#! /usr/bin/python3 |
|||
|
|||
import argparse |
|||
|
|||
def do_test(): |
|||
print('do_test()') |
|||
|
|||
parser = argparse.ArgumentParser(prog='action',description='Demonstration der Action',epilog='Ende der Hilfe') |
|||
|
|||
parser.add_argument('--update',help='update Hilfe') |
|||
parser.add_argument('--dry-run',help='dry-run Hilfe') |
|||
parser.add_argument('--verbose','-v', action='count') |
|||
parser.add_argument('--true', action='store_true') |
|||
parser.add_argument('-append', action='append', nargs=1) |
|||
parser.add_argument('--false', action='store_false') |
|||
parser.add_argument('--store', action='store') |
|||
parser.add_argument('--const', action = 'store_const', const=19) |
|||
|
|||
parser.add_argument('--delete', action = argparse.BooleanOptionalAction) |
|||
#parser.add_argument('--no-delete', action = argparse.BooleanOptionalAction) |
|||
|
|||
|
|||
args=parser.parse_args() |
|||
print(f'args={args}') |
|||
print(f'verbose={args.verbose}') |
|||
|
@ -0,0 +1,11 @@ |
|||
#! /usr/bin/python3 |
|||
|
|||
import argparse |
|||
|
|||
parser = argparse.ArgumentParser(prog='HILFE',description='Demonstration der Hilfeseite',epilog='Ende der Hilfe im Epilog') |
|||
|
|||
parser.add_argument('--update',help='update Hilfe') |
|||
parser.add_argument('--dry-run',help='dry-run Hilfe') |
|||
|
|||
args=parser.parse_args() |
|||
|
@ -0,0 +1,3 @@ |
|||
bin |
|||
lib |
|||
*.jpg |
@ -0,0 +1,35 @@ |
|||
#! /usr/bin/python |
|||
|
|||
from picamera2 import Picamera2 |
|||
from libcamera import controls |
|||
from time import sleep |
|||
import sys |
|||
|
|||
to_file='' |
|||
picam = Picamera2() |
|||
|
|||
def take_still(filename): |
|||
config = picam.create_preview_configuration() |
|||
picam.configure(config) |
|||
|
|||
picam.start() |
|||
picam.set_controls({"AfMode": controls.AfModeEnum.Continuous}) |
|||
sleep(5) |
|||
picam.capture_file(filename) |
|||
picam.close() |
|||
|
|||
def parseArgs(argv): |
|||
global to_file |
|||
count = 0 |
|||
for arg in argv: |
|||
if arg == '-o': |
|||
to_file = argv[count+1] |
|||
|
|||
count += 1 |
|||
|
|||
if __name__ =='__main__': |
|||
parseArgs(sys.argv) |
|||
print(f'to_file={to_file}') |
|||
take_still(to_file) |
|||
|
|||
|
After Width: | Height: | Size: 66 KiB |
@ -0,0 +1,15 @@ |
|||
from picamera2 import Picamera2 |
|||
from libcamera import controls |
|||
from time import sleep |
|||
|
|||
picam = Picamera2() |
|||
|
|||
config = picam.create_preview_configuration() |
|||
picam.configure(config) |
|||
|
|||
picam.start() |
|||
picam.set_controls({"AfMode": controls.AfModeEnum.Continuous}) |
|||
sleep(2) |
|||
picam.capture_file("/tank/cameratests/terri/test-python.jpg") |
|||
|
|||
picam.close() |
@ -0,0 +1,22 @@ |
|||
# Python Basis-Image |
|||
FROM python:3.8 |
|||
|
|||
# Arbeitsverzeichnis innerhalb des Containers |
|||
WORKDIR /app |
|||
|
|||
# Anwendungsabhängigkeiten in das Container-Image kopieren |
|||
COPY requirements.txt . |
|||
|
|||
# Abhängigkeiten installieren |
|||
RUN pip install --no-cache-dir -r requirements.txt |
|||
|
|||
# Port der Flask-Anwendung |
|||
EXPOSE 8085 |
|||
|
|||
# eigenen Code in das Container-Image kopieren |
|||
COPY fib/*.py /app/ |
|||
COPY fib/static /app/static |
|||
COPY fib/templates /app/templates |
|||
|
|||
# Befehl, der die Anwendung startet |
|||
CMD ["python", "app.py"] |
@ -0,0 +1,45 @@ |
|||
from flask import Flask,render_template,request |
|||
from fib_gen import fib_generator |
|||
import logging |
|||
|
|||
logging.basicConfig( format='%(asctime)-15s [%(levelname)s] %(funcName)s: %(message)s', level=logging.DEBUG) |
|||
app = Flask(__name__) |
|||
|
|||
@app.route('/') |
|||
def index(): |
|||
return render_template('index.html') |
|||
|
|||
@app.route('/fib',methods=['GET','POST']) |
|||
def fib(): |
|||
fibg = fib_generator() |
|||
result = '' |
|||
logging.debug(f'request.method={request.method}') |
|||
if request.method == 'POST': |
|||
element = request.form['element'] |
|||
|
|||
logging.debug(f'berechne Element:{element}') |
|||
|
|||
n= int(element) |
|||
#formel= str(n-2) + '+' + str(n-1) |
|||
formel = '' # Berechnungsformel initialisieren. |
|||
if element != None: |
|||
for i in range(n+1): |
|||
fib = next(fibg) |
|||
if i == n-2: # fib(n-2) zur Berechnungsformel dazu |
|||
|
|||
formel += str(fib) |
|||
if i == n-1: # fib(n-1) mit + Zeichen zur Berechnungsformel dazu |
|||
formel += '+' + str(fib) |
|||
|
|||
logging.debug(f'Fibonacci-Zahl: {fib}') |
|||
logging.debug(f'formel={formel}') |
|||
result=str(fib) |
|||
elif request.method == 'GET': |
|||
logging.debug('GET-Request') |
|||
return render_template('index.html', result=result,formel=formel) |
|||
|
|||
if __name__ == '__main__': |
|||
app.run(host='0.0.0.0',port=8085, debug=True) |
|||
|
|||
|
|||
|
@ -0,0 +1,12 @@ |
|||
import sys |
|||
|
|||
def fib_generator(): |
|||
a,b = 0,1 |
|||
|
|||
while True: |
|||
yield a |
|||
a,b = b, a+b |
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,427 @@ |
|||
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ |
|||
|
|||
/** |
|||
* 1. Set default font family to sans-serif. |
|||
* 2. Prevent iOS text size adjust after orientation change, without disabling |
|||
* user zoom. |
|||
*/ |
|||
|
|||
html { |
|||
font-family: sans-serif; /* 1 */ |
|||
-ms-text-size-adjust: 100%; /* 2 */ |
|||
-webkit-text-size-adjust: 100%; /* 2 */ |
|||
} |
|||
|
|||
/** |
|||
* Remove default margin. |
|||
*/ |
|||
|
|||
body { |
|||
margin: 0; |
|||
} |
|||
|
|||
/* HTML5 display definitions |
|||
========================================================================== */ |
|||
|
|||
/** |
|||
* Correct `block` display not defined for any HTML5 element in IE 8/9. |
|||
* Correct `block` display not defined for `details` or `summary` in IE 10/11 |
|||
* and Firefox. |
|||
* Correct `block` display not defined for `main` in IE 11. |
|||
*/ |
|||
|
|||
article, |
|||
aside, |
|||
details, |
|||
figcaption, |
|||
figure, |
|||
footer, |
|||
header, |
|||
hgroup, |
|||
main, |
|||
menu, |
|||
nav, |
|||
section, |
|||
summary { |
|||
display: block; |
|||
} |
|||
|
|||
/** |
|||
* 1. Correct `inline-block` display not defined in IE 8/9. |
|||
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. |
|||
*/ |
|||
|
|||
audio, |
|||
canvas, |
|||
progress, |
|||
video { |
|||
display: inline-block; /* 1 */ |
|||
vertical-align: baseline; /* 2 */ |
|||
} |
|||
|
|||
/** |
|||
* Prevent modern browsers from displaying `audio` without controls. |
|||
* Remove excess height in iOS 5 devices. |
|||
*/ |
|||
|
|||
audio:not([controls]) { |
|||
display: none; |
|||
height: 0; |
|||
} |
|||
|
|||
/** |
|||
* Address `[hidden]` styling not present in IE 8/9/10. |
|||
* Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. |
|||
*/ |
|||
|
|||
[hidden], |
|||
template { |
|||
display: none; |
|||
} |
|||
|
|||
/* Links |
|||
========================================================================== */ |
|||
|
|||
/** |
|||
* Remove the gray background color from active links in IE 10. |
|||
*/ |
|||
|
|||
a { |
|||
background-color: transparent; |
|||
} |
|||
|
|||
/** |
|||
* Improve readability when focused and also mouse hovered in all browsers. |
|||
*/ |
|||
|
|||
a:active, |
|||
a:hover { |
|||
outline: 0; |
|||
} |
|||
|
|||
/* Text-level semantics |
|||
========================================================================== */ |
|||
|
|||
/** |
|||
* Address styling not present in IE 8/9/10/11, Safari, and Chrome. |
|||
*/ |
|||
|
|||
abbr[title] { |
|||
border-bottom: 1px dotted; |
|||
} |
|||
|
|||
/** |
|||
* Address style set to `bolder` in Firefox 4+, Safari, and Chrome. |
|||
*/ |
|||
|
|||
b, |
|||
strong { |
|||
font-weight: bold; |
|||
} |
|||
|
|||
/** |
|||
* Address styling not present in Safari and Chrome. |
|||
*/ |
|||
|
|||
dfn { |
|||
font-style: italic; |
|||
} |
|||
|
|||
/** |
|||
* Address variable `h1` font-size and margin within `section` and `article` |
|||
* contexts in Firefox 4+, Safari, and Chrome. |
|||
*/ |
|||
|
|||
h1 { |
|||
font-size: 2em; |
|||
margin: 0.67em 0; |
|||
} |
|||
|
|||
/** |
|||
* Address styling not present in IE 8/9. |
|||
*/ |
|||
|
|||
mark { |
|||
background: #ff0; |
|||
color: #000; |
|||
} |
|||
|
|||
/** |
|||
* Address inconsistent and variable font size in all browsers. |
|||
*/ |
|||
|
|||
small { |
|||
font-size: 80%; |
|||
} |
|||
|
|||
/** |
|||
* Prevent `sub` and `sup` affecting `line-height` in all browsers. |
|||
*/ |
|||
|
|||
sub, |
|||
sup { |
|||
font-size: 75%; |
|||
line-height: 0; |
|||
position: relative; |
|||
vertical-align: baseline; |
|||
} |
|||
|
|||
sup { |
|||
top: -0.5em; |
|||
} |
|||
|
|||
sub { |
|||
bottom: -0.25em; |
|||
} |
|||
|
|||
/* Embedded content |
|||
========================================================================== */ |
|||
|
|||
/** |
|||
* Remove border when inside `a` element in IE 8/9/10. |
|||
*/ |
|||
|
|||
img { |
|||
border: 0; |
|||
} |
|||
|
|||
/** |
|||
* Correct overflow not hidden in IE 9/10/11. |
|||
*/ |
|||
|
|||
svg:not(:root) { |
|||
overflow: hidden; |
|||
} |
|||
|
|||
/* Grouping content |
|||
========================================================================== */ |
|||
|
|||
/** |
|||
* Address margin not present in IE 8/9 and Safari. |
|||
*/ |
|||
|
|||
figure { |
|||
margin: 1em 40px; |
|||
} |
|||
|
|||
/** |
|||
* Address differences between Firefox and other browsers. |
|||
*/ |
|||
|
|||
hr { |
|||
-moz-box-sizing: content-box; |
|||
box-sizing: content-box; |
|||
height: 0; |
|||
} |
|||
|
|||
/** |
|||
* Contain overflow in all browsers. |
|||
*/ |
|||
|
|||
pre { |
|||
overflow: auto; |
|||
} |
|||
|
|||
/** |
|||
* Address odd `em`-unit font size rendering in all browsers. |
|||
*/ |
|||
|
|||
code, |
|||
kbd, |
|||
pre, |
|||
samp { |
|||
font-family: monospace, monospace; |
|||
font-size: 1em; |
|||
} |
|||
|
|||
/* Forms |
|||
========================================================================== */ |
|||
|
|||
/** |
|||
* Known limitation: by default, Chrome and Safari on OS X allow very limited |
|||
* styling of `select`, unless a `border` property is set. |
|||
*/ |
|||
|
|||
/** |
|||
* 1. Correct color not being inherited. |
|||
* Known issue: affects color of disabled elements. |
|||
* 2. Correct font properties not being inherited. |
|||
* 3. Address margins set differently in Firefox 4+, Safari, and Chrome. |
|||
*/ |
|||
|
|||
button, |
|||
input, |
|||
optgroup, |
|||
select, |
|||
textarea { |
|||
color: inherit; /* 1 */ |
|||
font: inherit; /* 2 */ |
|||
margin: 0; /* 3 */ |
|||
} |
|||
|
|||
/** |
|||
* Address `overflow` set to `hidden` in IE 8/9/10/11. |
|||
*/ |
|||
|
|||
button { |
|||
overflow: visible; |
|||
} |
|||
|
|||
/** |
|||
* Address inconsistent `text-transform` inheritance for `button` and `select`. |
|||
* All other form control elements do not inherit `text-transform` values. |
|||
* Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. |
|||
* Correct `select` style inheritance in Firefox. |
|||
*/ |
|||
|
|||
button, |
|||
select { |
|||
text-transform: none; |
|||
} |
|||
|
|||
/** |
|||
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` |
|||
* and `video` controls. |
|||
* 2. Correct inability to style clickable `input` types in iOS. |
|||
* 3. Improve usability and consistency of cursor style between image-type |
|||
* `input` and others. |
|||
*/ |
|||
|
|||
button, |
|||
html input[type="button"], /* 1 */ |
|||
input[type="reset"], |
|||
input[type="submit"] { |
|||
-webkit-appearance: button; /* 2 */ |
|||
cursor: pointer; /* 3 */ |
|||
} |
|||
|
|||
/** |
|||
* Re-set default cursor for disabled elements. |
|||
*/ |
|||
|
|||
button[disabled], |
|||
html input[disabled] { |
|||
cursor: default; |
|||
} |
|||
|
|||
/** |
|||
* Remove inner padding and border in Firefox 4+. |
|||
*/ |
|||
|
|||
button::-moz-focus-inner, |
|||
input::-moz-focus-inner { |
|||
border: 0; |
|||
padding: 0; |
|||
} |
|||
|
|||
/** |
|||
* Address Firefox 4+ setting `line-height` on `input` using `!important` in |
|||
* the UA stylesheet. |
|||
*/ |
|||
|
|||
input { |
|||
line-height: normal; |
|||
} |
|||
|
|||
/** |
|||
* It's recommended that you don't attempt to style these elements. |
|||
* Firefox's implementation doesn't respect box-sizing, padding, or width. |
|||
* |
|||
* 1. Address box sizing set to `content-box` in IE 8/9/10. |
|||
* 2. Remove excess padding in IE 8/9/10. |
|||
*/ |
|||
|
|||
input[type="checkbox"], |
|||
input[type="radio"] { |
|||
box-sizing: border-box; /* 1 */ |
|||
padding: 0; /* 2 */ |
|||
} |
|||
|
|||
/** |
|||
* Fix the cursor style for Chrome's increment/decrement buttons. For certain |
|||
* `font-size` values of the `input`, it causes the cursor style of the |
|||
* decrement button to change from `default` to `text`. |
|||
*/ |
|||
|
|||
input[type="number"]::-webkit-inner-spin-button, |
|||
input[type="number"]::-webkit-outer-spin-button { |
|||
height: auto; |
|||
} |
|||
|
|||
/** |
|||
* 1. Address `appearance` set to `searchfield` in Safari and Chrome. |
|||
* 2. Address `box-sizing` set to `border-box` in Safari and Chrome |
|||
* (include `-moz` to future-proof). |
|||
*/ |
|||
|
|||
input[type="search"] { |
|||
-webkit-appearance: textfield; /* 1 */ |
|||
-moz-box-sizing: content-box; |
|||
-webkit-box-sizing: content-box; /* 2 */ |
|||
box-sizing: content-box; |
|||
} |
|||
|
|||
/** |
|||
* Remove inner padding and search cancel button in Safari and Chrome on OS X. |
|||
* Safari (but not Chrome) clips the cancel button when the search input has |
|||
* padding (and `textfield` appearance). |
|||
*/ |
|||
|
|||
input[type="search"]::-webkit-search-cancel-button, |
|||
input[type="search"]::-webkit-search-decoration { |
|||
-webkit-appearance: none; |
|||
} |
|||
|
|||
/** |
|||
* Define consistent border, margin, and padding. |
|||
*/ |
|||
|
|||
fieldset { |
|||
border: 1px solid #c0c0c0; |
|||
margin: 0 2px; |
|||
padding: 0.35em 0.625em 0.75em; |
|||
} |
|||
|
|||
/** |
|||
* 1. Correct `color` not being inherited in IE 8/9/10/11. |
|||
* 2. Remove padding so people aren't caught out if they zero out fieldsets. |
|||
*/ |
|||
|
|||
legend { |
|||
border: 0; /* 1 */ |
|||
padding: 0; /* 2 */ |
|||
} |
|||
|
|||
/** |
|||
* Remove default vertical scrollbar in IE 8/9/10/11. |
|||
*/ |
|||
|
|||
textarea { |
|||
overflow: auto; |
|||
} |
|||
|
|||
/** |
|||
* Don't inherit the `font-weight` (applied by a rule above). |
|||
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X. |
|||
*/ |
|||
|
|||
optgroup { |
|||
font-weight: bold; |
|||
} |
|||
|
|||
/* Tables |
|||
========================================================================== */ |
|||
|
|||
/** |
|||
* Remove most spacing between table cells. |
|||
*/ |
|||
|
|||
table { |
|||
border-collapse: collapse; |
|||
border-spacing: 0; |
|||
} |
|||
|
|||
td, |
|||
th { |
|||
padding: 0; |
|||
} |
@ -0,0 +1,418 @@ |
|||
/* |
|||
* Skeleton V2.0.4 |
|||
* Copyright 2014, Dave Gamache |
|||
* www.getskeleton.com |
|||
* Free to use under the MIT license. |
|||
* http://www.opensource.org/licenses/mit-license.php |
|||
* 12/29/2014 |
|||
*/ |
|||
|
|||
|
|||
/* Table of contents |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– |
|||
- Grid |
|||
- Base Styles |
|||
- Typography |
|||
- Links |
|||
- Buttons |
|||
- Forms |
|||
- Lists |
|||
- Code |
|||
- Tables |
|||
- Spacing |
|||
- Utilities |
|||
- Clearing |
|||
- Media Queries |
|||
*/ |
|||
|
|||
|
|||
/* Grid |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
.container { |
|||
position: relative; |
|||
width: 100%; |
|||
max-width: 960px; |
|||
margin: 0 auto; |
|||
padding: 0 20px; |
|||
box-sizing: border-box; } |
|||
.column, |
|||
.columns { |
|||
width: 100%; |
|||
float: left; |
|||
box-sizing: border-box; } |
|||
|
|||
/* For devices larger than 400px */ |
|||
@media (min-width: 400px) { |
|||
.container { |
|||
width: 85%; |
|||
padding: 0; } |
|||
} |
|||
|
|||
/* For devices larger than 550px */ |
|||
@media (min-width: 550px) { |
|||
.container { |
|||
width: 80%; } |
|||
.column, |
|||
.columns { |
|||
margin-left: 4%; } |
|||
.column:first-child, |
|||
.columns:first-child { |
|||
margin-left: 0; } |
|||
|
|||
.one.column, |
|||
.one.columns { width: 4.66666666667%; } |
|||
.two.columns { width: 13.3333333333%; } |
|||
.three.columns { width: 22%; } |
|||
.four.columns { width: 30.6666666667%; } |
|||
.five.columns { width: 39.3333333333%; } |
|||
.six.columns { width: 48%; } |
|||
.seven.columns { width: 56.6666666667%; } |
|||
.eight.columns { width: 65.3333333333%; } |
|||
.nine.columns { width: 74.0%; } |
|||
.ten.columns { width: 82.6666666667%; } |
|||
.eleven.columns { width: 91.3333333333%; } |
|||
.twelve.columns { width: 100%; margin-left: 0; } |
|||
|
|||
.one-third.column { width: 30.6666666667%; } |
|||
.two-thirds.column { width: 65.3333333333%; } |
|||
|
|||
.one-half.column { width: 48%; } |
|||
|
|||
/* Offsets */ |
|||
.offset-by-one.column, |
|||
.offset-by-one.columns { margin-left: 8.66666666667%; } |
|||
.offset-by-two.column, |
|||
.offset-by-two.columns { margin-left: 17.3333333333%; } |
|||
.offset-by-three.column, |
|||
.offset-by-three.columns { margin-left: 26%; } |
|||
.offset-by-four.column, |
|||
.offset-by-four.columns { margin-left: 34.6666666667%; } |
|||
.offset-by-five.column, |
|||
.offset-by-five.columns { margin-left: 43.3333333333%; } |
|||
.offset-by-six.column, |
|||
.offset-by-six.columns { margin-left: 52%; } |
|||
.offset-by-seven.column, |
|||
.offset-by-seven.columns { margin-left: 60.6666666667%; } |
|||
.offset-by-eight.column, |
|||
.offset-by-eight.columns { margin-left: 69.3333333333%; } |
|||
.offset-by-nine.column, |
|||
.offset-by-nine.columns { margin-left: 78.0%; } |
|||
.offset-by-ten.column, |
|||
.offset-by-ten.columns { margin-left: 86.6666666667%; } |
|||
.offset-by-eleven.column, |
|||
.offset-by-eleven.columns { margin-left: 95.3333333333%; } |
|||
|
|||
.offset-by-one-third.column, |
|||
.offset-by-one-third.columns { margin-left: 34.6666666667%; } |
|||
.offset-by-two-thirds.column, |
|||
.offset-by-two-thirds.columns { margin-left: 69.3333333333%; } |
|||
|
|||
.offset-by-one-half.column, |
|||
.offset-by-one-half.columns { margin-left: 52%; } |
|||
|
|||
} |
|||
|
|||
|
|||
/* Base Styles |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
/* NOTE |
|||
html is set to 62.5% so that all the REM measurements throughout Skeleton |
|||
are based on 10px sizing. So basically 1.5rem = 15px :) */ |
|||
html { |
|||
font-size: 62.5%; } |
|||
body { |
|||
font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */ |
|||
line-height: 1.6; |
|||
font-weight: 400; |
|||
font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; |
|||
color: #222; } |
|||
|
|||
|
|||
/* Typography |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
h1, h2, h3, h4, h5, h6 { |
|||
margin-top: 0; |
|||
margin-bottom: 2rem; |
|||
font-weight: 300; } |
|||
h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} |
|||
h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } |
|||
h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; } |
|||
h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; } |
|||
h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; } |
|||
h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; } |
|||
|
|||
/* Larger than phablet */ |
|||
@media (min-width: 550px) { |
|||
h1 { font-size: 5.0rem; } |
|||
h2 { font-size: 4.2rem; } |
|||
h3 { font-size: 3.6rem; } |
|||
h4 { font-size: 3.0rem; } |
|||
h5 { font-size: 2.4rem; } |
|||
h6 { font-size: 1.5rem; } |
|||
} |
|||
|
|||
p { |
|||
margin-top: 0; } |
|||
|
|||
|
|||
/* Links |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
a { |
|||
color: #1EAEDB; } |
|||
a:hover { |
|||
color: #0FA0CE; } |
|||
|
|||
|
|||
/* Buttons |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
.button, |
|||
button, |
|||
input[type="submit"], |
|||
input[type="reset"], |
|||
input[type="button"] { |
|||
display: inline-block; |
|||
height: 38px; |
|||
padding: 0 30px; |
|||
color: #555; |
|||
text-align: center; |
|||
font-size: 11px; |
|||
font-weight: 600; |
|||
line-height: 38px; |
|||
letter-spacing: .1rem; |
|||
text-transform: uppercase; |
|||
text-decoration: none; |
|||
white-space: nowrap; |
|||
background-color: transparent; |
|||
border-radius: 4px; |
|||
border: 1px solid #bbb; |
|||
cursor: pointer; |
|||
box-sizing: border-box; } |
|||
.button:hover, |
|||
button:hover, |
|||
input[type="submit"]:hover, |
|||
input[type="reset"]:hover, |
|||
input[type="button"]:hover, |
|||
.button:focus, |
|||
button:focus, |
|||
input[type="submit"]:focus, |
|||
input[type="reset"]:focus, |
|||
input[type="button"]:focus { |
|||
color: #333; |
|||
border-color: #888; |
|||
outline: 0; } |
|||
.button.button-primary, |
|||
button.button-primary, |
|||
input[type="submit"].button-primary, |
|||
input[type="reset"].button-primary, |
|||
input[type="button"].button-primary { |
|||
color: #FFF; |
|||
background-color: #33C3F0; |
|||
border-color: #33C3F0; } |
|||
.button.button-primary:hover, |
|||
button.button-primary:hover, |
|||
input[type="submit"].button-primary:hover, |
|||
input[type="reset"].button-primary:hover, |
|||
input[type="button"].button-primary:hover, |
|||
.button.button-primary:focus, |
|||
button.button-primary:focus, |
|||
input[type="submit"].button-primary:focus, |
|||
input[type="reset"].button-primary:focus, |
|||
input[type="button"].button-primary:focus { |
|||
color: #FFF; |
|||
background-color: #1EAEDB; |
|||
border-color: #1EAEDB; } |
|||
|
|||
|
|||
/* Forms |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
input[type="email"], |
|||
input[type="number"], |
|||
input[type="search"], |
|||
input[type="text"], |
|||
input[type="tel"], |
|||
input[type="url"], |
|||
input[type="password"], |
|||
textarea, |
|||
select { |
|||
height: 38px; |
|||
padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ |
|||
background-color: #fff; |
|||
border: 1px solid #D1D1D1; |
|||
border-radius: 4px; |
|||
box-shadow: none; |
|||
box-sizing: border-box; } |
|||
/* Removes awkward default styles on some inputs for iOS */ |
|||
input[type="email"], |
|||
input[type="number"], |
|||
input[type="search"], |
|||
input[type="text"], |
|||
input[type="tel"], |
|||
input[type="url"], |
|||
input[type="password"], |
|||
textarea { |
|||
-webkit-appearance: none; |
|||
-moz-appearance: none; |
|||
appearance: none; } |
|||
textarea { |
|||
min-height: 65px; |
|||
padding-top: 6px; |
|||
padding-bottom: 6px; } |
|||
input[type="email"]:focus, |
|||
input[type="number"]:focus, |
|||
input[type="search"]:focus, |
|||
input[type="text"]:focus, |
|||
input[type="tel"]:focus, |
|||
input[type="url"]:focus, |
|||
input[type="password"]:focus, |
|||
textarea:focus, |
|||
select:focus { |
|||
border: 1px solid #33C3F0; |
|||
outline: 0; } |
|||
label, |
|||
legend { |
|||
display: block; |
|||
margin-bottom: .5rem; |
|||
font-weight: 600; } |
|||
fieldset { |
|||
padding: 0; |
|||
border-width: 0; } |
|||
input[type="checkbox"], |
|||
input[type="radio"] { |
|||
display: inline; } |
|||
label > .label-body { |
|||
display: inline-block; |
|||
margin-left: .5rem; |
|||
font-weight: normal; } |
|||
|
|||
|
|||
/* Lists |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
ul { |
|||
list-style: circle inside; } |
|||
ol { |
|||
list-style: decimal inside; } |
|||
ol, ul { |
|||
padding-left: 0; |
|||
margin-top: 0; } |
|||
ul ul, |
|||
ul ol, |
|||
ol ol, |
|||
ol ul { |
|||
margin: 1.5rem 0 1.5rem 3rem; |
|||
font-size: 90%; } |
|||
li { |
|||
margin-bottom: 1rem; } |
|||
|
|||
|
|||
/* Code |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
code { |
|||
padding: .2rem .5rem; |
|||
margin: 0 .2rem; |
|||
font-size: 90%; |
|||
white-space: nowrap; |
|||
background: #F1F1F1; |
|||
border: 1px solid #E1E1E1; |
|||
border-radius: 4px; } |
|||
pre > code { |
|||
display: block; |
|||
padding: 1rem 1.5rem; |
|||
white-space: pre; } |
|||
|
|||
|
|||
/* Tables |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
th, |
|||
td { |
|||
padding: 12px 15px; |
|||
text-align: left; |
|||
border-bottom: 1px solid #E1E1E1; } |
|||
th:first-child, |
|||
td:first-child { |
|||
padding-left: 0; } |
|||
th:last-child, |
|||
td:last-child { |
|||
padding-right: 0; } |
|||
|
|||
|
|||
/* Spacing |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
button, |
|||
.button { |
|||
margin-bottom: 1rem; } |
|||
input, |
|||
textarea, |
|||
select, |
|||
fieldset { |
|||
margin-bottom: 1.5rem; } |
|||
pre, |
|||
blockquote, |
|||
dl, |
|||
figure, |
|||
table, |
|||
p, |
|||
ul, |
|||
ol, |
|||
form { |
|||
margin-bottom: 2.5rem; } |
|||
|
|||
|
|||
/* Utilities |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
.u-full-width { |
|||
width: 100%; |
|||
box-sizing: border-box; } |
|||
.u-max-full-width { |
|||
max-width: 100%; |
|||
box-sizing: border-box; } |
|||
.u-pull-right { |
|||
float: right; } |
|||
.u-pull-left { |
|||
float: left; } |
|||
|
|||
|
|||
/* Misc |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
hr { |
|||
margin-top: 3rem; |
|||
margin-bottom: 3.5rem; |
|||
border-width: 0; |
|||
border-top: 1px solid #E1E1E1; } |
|||
|
|||
|
|||
/* Clearing |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
|
|||
/* Self Clearing Goodness */ |
|||
.container:after, |
|||
.row:after, |
|||
.u-cf { |
|||
content: ""; |
|||
display: table; |
|||
clear: both; } |
|||
|
|||
|
|||
/* Media Queries |
|||
–––––––––––––––––––––––––––––––––––––––––––––––––– */ |
|||
/* |
|||
Note: The best way to structure the use of media queries is to create the queries |
|||
near the relevant code. For example, if you wanted to change the styles for buttons |
|||
on small devices, paste the mobile query code up in the buttons section and style it |
|||
there. |
|||
*/ |
|||
|
|||
|
|||
/* Larger than mobile */ |
|||
@media (min-width: 400px) {} |
|||
|
|||
/* Larger than phablet (also point when grid becomes active) */ |
|||
@media (min-width: 550px) {} |
|||
|
|||
/* Larger than tablet */ |
|||
@media (min-width: 750px) {} |
|||
|
|||
/* Larger than desktop */ |
|||
@media (min-width: 1000px) {} |
|||
|
|||
/* Larger than Desktop HD */ |
|||
@media (min-width: 1200px) {} |
@ -0,0 +1,26 @@ |
|||
<!DOCTYPE html> |
|||
|
|||
<html lang='en'> |
|||
<head> |
|||
<meta charset='utf-8' /> |
|||
<link href='static/css/skeleton.css' rel='stylesheet' type='text/css' /> |
|||
<title>Fibonacci Zahlen berechnen</title> |
|||
</head> |
|||
|
|||
<body> |
|||
<h2>Fibonacci Generator </h2 |
|||
<!--FORM --> |
|||
<form action='fib' method='post'> |
|||
<label> Folgen Element</label> |
|||
<input |
|||
type='text' |
|||
placeholder='Fibonacci Element' |
|||
name='element' |
|||
value='{{request.form.element}}' |
|||
</input><br /> |
|||
<button type='submit'>Berechnen</button> |
|||
<p>Formel: {{formel}} </p> |
|||
<p>Fibonacci-Zahl: {{result}} </p> |
|||
</form> |
|||
</body> |
|||
</html> |
@ -0,0 +1,8 @@ |
|||
home = /usr/bin |
|||
implementation = CPython |
|||
version_info = 3.11.2.final.0 |
|||
virtualenv = 20.17.1+ds |
|||
include-system-site-packages = false |
|||
base-prefix = /usr |
|||
base-exec-prefix = /usr |
|||
base-executable = /usr/bin/python3 |
@ -0,0 +1,7 @@ |
|||
blinker==1.7.0 |
|||
click==8.1.7 |
|||
Flask==3.0.1 |
|||
itsdangerous==2.1.2 |
|||
Jinja2==3.1.3 |
|||
MarkupSafe==2.1.3 |
|||
Werkzeug==3.0.1 |
@ -0,0 +1,17 @@ |
|||
|
|||
class Name: |
|||
def __init__(self,vorname,name): |
|||
self.vorname = vorname |
|||
self.name = name |
|||
|
|||
def __getattr__(self,attr): |
|||
if attr == 'fullname': |
|||
return self.vorname + ' ' + self.name |
|||
elif attr == 'sortname': |
|||
return self.name + ',' + self.vorname |
|||
else: |
|||
raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{attr}'") |
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,28 @@ |
|||
import unittest |
|||
import logging |
|||
from name import Name |
|||
|
|||
__LOGLEVEL__ = logging.DEBUG |
|||
|
|||
logging.basicConfig( format='%(asctime)-15s [%(levelname)s] %(funcName)s: %(message)s', level=__LOGLEVEL__) |
|||
|
|||
class TestName(unittest.TestCase): |
|||
|
|||
def setUp(self): |
|||
logging.debug('setting up test') |
|||
self.name = Name('Homer', 'Simpson') |
|||
|
|||
def test_getattr(self): |
|||
fullname = self.name.fullname |
|||
sortname = self.name.sortname |
|||
|
|||
|
|||
self.assertEqual('Homer Simpson', fullname) |
|||
self.assertEqual('Simpson,Homer', sortname) |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
logging.debug('Test startet.') |
|||
unittest.main() |
|||
|
|||
|
@ -0,0 +1,7 @@ |
|||
|
|||
|
|||
def square(x): |
|||
return x** 2 |
|||
|
|||
sq5 = square(5) |
|||
print(f'{sq5}') |
@ -0,0 +1,5 @@ |
|||
|
|||
|
|||
|
|||
square = lambda x: x** 2 |
|||
print(f'{square(5)}') |
Loading…
Reference in new issue