Skip to content
Snippets Groups Projects
Commit ac901959 authored by Rivera Alcalde, Andrés Daniel's avatar Rivera Alcalde, Andrés Daniel
Browse files

Korrektur vom pinned Motor

parent 597d8d0d
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id:c9328cd1 tags: %% Cell type:markdown id:c9328cd1 tags:
# FAIRe Qualitäts-KPIs # FAIRe Qualitäts-KPIs
Autor: Autor:
Datum: Datum:
%% Cell type:markdown id:1c5d41dc tags: %% Cell type:markdown id:1c5d41dc tags:
## Forschungsfrage ## Forschungsfrage
Formulieren Sie eine oder mehrere Forschungsfragen zu der Lerneinheit: Formulieren Sie eine oder mehrere Forschungsfragen zu der Lerneinheit:
%% Cell type:markdown id:14e306b5 tags: %% Cell type:markdown id:14e306b5 tags:
Mit welchen Konfigurationen lässt sich die Qualität eines Elektrofahrzeugs in Bezug auf Aufwand, Verfügbarkeit und Akzeptanz optimieren? Mit welchen Konfigurationen lässt sich die Qualität eines Elektrofahrzeugs in Bezug auf Aufwand, Verfügbarkeit und Akzeptanz optimieren?
%% Cell type:markdown id:de070039 tags: %% Cell type:markdown id:de070039 tags:
## Erstes Fahrzeug ## Erstes Fahrzeug
%% Cell type:markdown id:531d890a tags: %% Cell type:markdown id:531d890a tags:
### Versuchsziel ### Versuchsziel
Formulieren Sie ein Versuchsziel für diesen ersten Versuch: Formulieren Sie ein Versuchsziel für diesen ersten Versuch:
%% Cell type:markdown id:30ddd8dc tags: %% Cell type:markdown id:30ddd8dc tags:
Bestimmen Sie, wie sich verschiedene Elemente des Fahrzeugs (z. B. das Antriebssystem und die Art der Teile) auf die Qualitäts-KPIs auswirken, um das Design in zukünftigen Iterationen zu optimieren. Bestimmen Sie, wie sich verschiedene Elemente des Fahrzeugs (z. B. das Antriebssystem und die Art der Teile) auf die Qualitäts-KPIs auswirken, um das Design in zukünftigen Iterationen zu optimieren.
%% Cell type:markdown id:50dd9ff3 tags: %% Cell type:markdown id:50dd9ff3 tags:
### Versuchsaufbau ### Versuchsaufbau
Bauen Sie ein erstes Fahrzeug aus den gegebenen LEGO-Teilen in der CAD-Software LeoCAD auf. Bauen Sie ein erstes Fahrzeug aus den gegebenen LEGO-Teilen in der CAD-Software LeoCAD auf.
Hierbei gelten die folgenden Rahmenbedingungen: Hierbei gelten die folgenden Rahmenbedingungen:
- Das Fahrzeug muss aus Baugruppen, Bauteilen und Komponenten bestehen. - Das Fahrzeug muss aus Baugruppen, Bauteilen und Komponenten bestehen.
- Es muss mindestens vier Räder besitzen - Es muss mindestens vier Räder besitzen
- Es muss sich durch den elektrischen Antrieb fortbewegen können. - Es muss sich durch den elektrischen Antrieb fortbewegen können.
- Die Verwendung eines Getriebes zwischen Motor und Antriebsachse(n) ist verpflichtend. - Die Verwendung eines Getriebes zwischen Motor und Antriebsachse(n) ist verpflichtend.
- Die Farbe von mindestens einem Teil soll sich von der in LeoCAD hinterlegten Standardfarbe unterscheiden. - Die Farbe von mindestens einem Teil soll sich von der in LeoCAD hinterlegten Standardfarbe unterscheiden.
- Es sind nur die LEGO-Teile zu verwenden, welche sich in den JSON-Dateien bzw. in - Es sind nur die LEGO-Teile zu verwenden, welche sich in den JSON-Dateien bzw. in
der zur Verfügung gestellten Teilebibliothek befinden. der zur Verfügung gestellten Teilebibliothek befinden.
%% Cell type:markdown id:0ebba2d8 tags: %% Cell type:markdown id:0ebba2d8 tags:
Fügen Sie eine Abbildung des fertigen Autos in LeoCAD hinzu (*Hinweise: Ein Bild lässt sich mit \!\[Bildbeschreibung](/Pfad/zum/Bild) hinzufügen. Achten Sie darauf, das Bild später auch in Git hinzuzufügen*): Fügen Sie eine Abbildung des fertigen Autos in LeoCAD hinzu (*Hinweise: Ein Bild lässt sich mit \!\[Bildbeschreibung](/Pfad/zum/Bild) hinzufügen. Achten Sie darauf, das Bild später auch in Git hinzuzufügen*):
%% Cell type:markdown id:935c200c tags: %% Cell type:markdown id:935c200c tags:
%% Cell type:markdown id:05a8eb21 tags: %% Cell type:markdown id:05a8eb21 tags:
Beschreiben Sie kurz und präzise Ihr Fahrzeug: Beschreiben Sie kurz und präzise Ihr Fahrzeug:
%% Cell type:markdown id:df7f1d01 tags: %% Cell type:markdown id:df7f1d01 tags:
%% Cell type:markdown id:e622f83b tags: %% Cell type:markdown id:e622f83b tags:
Bauen Sie das Fahrzeug nun in unserem Software-Framework zusammen. Instanziieren Sie die LEGO-Teile und lesen Sie dabei auch die Eigenschaften ein. Ergänzen Sie zusätzliche Eigenschaften, wie z.B. die Farbe. Referenzieren Sie die Teile aufeinander und erstellen Sie auf diese Weise sinnvolle Bauteile, Baugruppen und das Bauen Sie das Fahrzeug nun in unserem Software-Framework zusammen. Instanziieren Sie die LEGO-Teile und lesen Sie dabei auch die Eigenschaften ein. Ergänzen Sie zusätzliche Eigenschaften, wie z.B. die Farbe. Referenzieren Sie die Teile aufeinander und erstellen Sie auf diese Weise sinnvolle Bauteile, Baugruppen und das
Gesamtsystem. Nutzen Sie die hierfür bereitgestellten Klassendefinitionen und Methoden. Achten Sie auf eine gute Code-Dokumentation. Sie können sich für die Bearbeitung an den zur Verfügung gestellten Code-Zellen orientieren, können hiervon jedoch auch abweichen. Gesamtsystem. Nutzen Sie die hierfür bereitgestellten Klassendefinitionen und Methoden. Achten Sie auf eine gute Code-Dokumentation. Sie können sich für die Bearbeitung an den zur Verfügung gestellten Code-Zellen orientieren, können hiervon jedoch auch abweichen.
*Hinweise: Achten Sie auf die Unterschiede zum Minimalbeispiel. Eine direkte Kopie ist nicht möglich. Achten Sie außerdem darauf, ein Teil (eindeutig identifiziert durch seine UUID) nicht an mehreren Stellen zu verbauen* *Hinweise: Achten Sie auf die Unterschiede zum Minimalbeispiel. Eine direkte Kopie ist nicht möglich. Achten Sie außerdem darauf, ein Teil (eindeutig identifiziert durch seine UUID) nicht an mehreren Stellen zu verbauen*
%% Cell type:code id:690da270 tags: %% Cell type:code id:690da270 tags:
``` python ``` python
import json import json
import pprint import pprint
from functions import calculation_rules from functions import calculation_rules
from functions.classes import * from functions.classes import *
``` ```
%% Cell type:code id:ccaf3043 tags: %% Cell type:code id:ccaf3043 tags:
``` python ``` python
# initialize components # initialize components
with open("datasheets/axles.json") as json_file: with open("datasheets/axles.json") as json_file:
axles_data = json.load(json_file) axles_data = json.load(json_file)
with open("datasheets/motors.json") as json_file: with open("datasheets/motors.json") as json_file:
motors_data = json.load(json_file) motors_data = json.load(json_file)
with open("datasheets/gears.json") as json_file: with open("datasheets/gears.json") as json_file:
gears_data = json.load(json_file) gears_data = json.load(json_file)
with open("datasheets/batteries.json") as json_file: with open("datasheets/batteries.json") as json_file:
batteries_data = json.load(json_file) batteries_data = json.load(json_file)
with open("datasheets/frame.json") as json_file: with open("datasheets/frame.json") as json_file:
frame_data = json.load(json_file) frame_data = json.load(json_file)
with open("datasheets/tires.json") as json_file: with open("datasheets/tires.json") as json_file:
tires_data = json.load(json_file) tires_data = json.load(json_file)
with open("datasheets/rims.json") as json_file: with open("datasheets/rims.json") as json_file:
rims_data = json.load(json_file) rims_data = json.load(json_file)
battery = LegoComponent("battery", batteries_data["8881-1"]) battery = LegoComponent("battery", batteries_data["8881-1"])
green_base = LegoComponent("green base", frame_data["39790"]) green_base = LegoComponent("green base", frame_data["39790"])
motor = LegoComponent("Motor", motors_data["88003-1"]) motor = LegoComponent("Motor", motors_data["88003-1"])
axle_input = LegoComponent("axle input", axles_data["32073"]) axle_input = LegoComponent("axle input", axles_data["32073"])
antrieb_gear = LegoComponent("antrieb gear", gears_data["18575"]) antrieb_gear = LegoComponent("antrieb gear", gears_data["18575"])
abtrieb_gear = LegoComponent("abtrieb gear", gears_data["94925"]) abtrieb_gear = LegoComponent("abtrieb gear", gears_data["94925"])
axle_side_1 = LegoComponent("axle side 1", axles_data["50451"]) axle_side_1 = LegoComponent("axle side 1", axles_data["50451"])
axles=[axle_side_1] axles=[axle_side_1]
for i in range (2,4): for i in range (2,4):
cloned_axle=axle_side_1.clone(f"axle_side_{i}") cloned_axle=axle_side_1.clone(f"axle_side_{i}")
axles.append(cloned_axle) axles.append(cloned_axle)
tire_1 = LegoComponent("tire 1", tires_data["30699"]) tire_1 = LegoComponent("tire 1", tires_data["30699"])
tires=[tire_1] tires=[tire_1]
for i in range (2,5): for i in range (2,5):
cloned_tire=tire_1.clone(f"tire_{i}") cloned_tire=tire_1.clone(f"tire_{i}")
tires.append(cloned_tire) tires.append(cloned_tire)
rim_1 = LegoComponent("rim 1", rims_data["56904"]) rim_1 = LegoComponent("rim 1", rims_data["56904"])
rims=[rim_1] rims=[rim_1]
for i in range (2,5): for i in range (2,5):
cloned_rim=rim_1.clone(f"rim_{i}") cloned_rim=rim_1.clone(f"rim_{i}")
rims.append(cloned_rim) rims.append(cloned_rim)
technic_bush_1 = LegoComponent("technic bush 1", frame_data["32123"]) technic_bush_1 = LegoComponent("technic bush 1", frame_data["32123"])
technic_bushes=[technic_bush_1] technic_bushes=[technic_bush_1]
for i in range (2,7): for i in range (2,7):
cloned_technic_bush=technic_bush_1.clone(f"technic_bush_{i}") cloned_technic_bush=technic_bush_1.clone(f"technic_bush_{i}")
technic_bushes.append(cloned_technic_bush) technic_bushes.append(cloned_technic_bush)
technic_pin_1=LegoComponent("technic pin 1", frame_data["55615"]) technic_pin_1=LegoComponent("technic pin 1", frame_data["55615"])
technic_pins=[technic_pin_1] technic_pins=[technic_pin_1]
for i in range (2,7): for i in range (2,7):
cloned_technic_pin=technic_pin_1.clone(f"technic_pin_{i}") cloned_technic_pin=technic_pin_1.clone(f"technic_pin_{i}")
technic_pins.append(cloned_technic_pin) technic_pins.append(cloned_technic_pin)
``` ```
%% Cell type:code id:36f981df tags: %% Cell type:code id:36f981df tags:
``` python ``` python
# set properties # set properties
color = "Light Grey" color = "Light Grey"
components_teile = [battery, green_base, motor, axle_input, antrieb_gear, abtrieb_gear] + axles + tires + rims + technic_bushes + technic_pins components_teile = [battery, green_base, motor, axle_input, antrieb_gear, abtrieb_gear] + axles + tires + rims + technic_bushes + technic_pins
for component in components_teile: for component in components_teile:
component.properties["color"] = color component.properties["color"] = color
for component in components_teile: for component in components_teile:
pprint.pprint(component.properties) pprint.pprint(component.properties)
green_base.properties["color"] = "Green" green_base.properties["color"] = "Green"
``` ```
%% Cell type:code id:da2d141c tags: %% Cell type:code id:da2d141c tags:
``` python ``` python
# aggregate components # aggregate components
wheels = [] wheels = []
for i in range(4): for i in range(4):
wheel = LegoAssembly(AggregationLayer.SUBASSEMBLY, f"wheel_{i+1}", assembly_method="join lego blocks") wheel = LegoAssembly(AggregationLayer.SUBASSEMBLY, f"wheel_{i+1}", assembly_method="join lego blocks")
wheel.add([rims[i], tires[i]]) wheel.add([rims[i], tires[i]])
wheels.append(wheel) wheels.append(wheel)
entire_drive_motor=LegoAssembly(AggregationLayer.SUBASSEMBLY, "entire drive motor") entire_drive_motor=LegoAssembly(AggregationLayer.SUBASSEMBLY, "entire drive motor")
entire_drive_motor.add([motor, axle_input,antrieb_gear) entire_drive_motor.add([motor, axle_input,antrieb_gear)
pinned_battery=LegoAssembly(AggregationLayer.SUBASSEMBLY, "pinned battery") pinned_battery=LegoAssembly(AggregationLayer.SUBASSEMBLY, "pinned battery")
pinned_battery.add([battery, technic_pins[0],technic_pins[1],technic_pins[2],technic_pins[3]]) pinned_battery.add([battery, technic_pins[0],technic_pins[1],technic_pins[2],technic_pins[3]])
pinned_motor=LegoAssembly(AggregationLayer.SUBASSEMBLY, "pinned motor") pinned_motor=LegoAssembly(AggregationLayer.ASSEMBLY, "pinned motor")
pinned_motor.add([entire_drive_motor, technic_pins[4],technic_pins[5]]) pinned_motor.add([entire_drive_motor, technic_pins[4],technic_pins[5]])
``` ```
%% Cell type:markdown id:c1fef7f0 tags: %% Cell type:markdown id:c1fef7f0 tags:
### Analyse ### Analyse
Bestimmen Sie die Qualität Ihres Fahrzeugs mittels KPIs. Bestimmen Sie die Qualität Ihres Fahrzeugs mittels KPIs.
Die Qualität des Fahrzeugs ist mit mindestens einem KPI je Qualitätsdimension (Aufwand, Verfügbarkeit, Akzeptanz) zu bestimmen. Enwickeln Sie zunächst sinnvolle KPIs, welche mit den gegebenen Daten umsetzbar sind. Halten Sie die Berechnungsvorschriften im Jupyter Notebook fest. Implementieren Sie deren Berechnung für das Gesamtsystem "Fahrzeug" mittels einzelner Funktionen im Skript `calculation_rules`. Sie können zusätzlich Ihre Methoden auch auf die niedrigeren Aggregationsebenen anwenden. Die Qualität des Fahrzeugs ist mit mindestens einem KPI je Qualitätsdimension (Aufwand, Verfügbarkeit, Akzeptanz) zu bestimmen. Enwickeln Sie zunächst sinnvolle KPIs, welche mit den gegebenen Daten umsetzbar sind. Halten Sie die Berechnungsvorschriften im Jupyter Notebook fest. Implementieren Sie deren Berechnung für das Gesamtsystem "Fahrzeug" mittels einzelner Funktionen im Skript `calculation_rules`. Sie können zusätzlich Ihre Methoden auch auf die niedrigeren Aggregationsebenen anwenden.
%% Cell type:markdown id:d5f02096 tags: %% Cell type:markdown id:d5f02096 tags:
Beschreiben Sie den jeweiligen KPI und geben Sie seine Berechnungsvorschrift an: Beschreiben Sie den jeweiligen KPI und geben Sie seine Berechnungsvorschrift an:
%% Cell type:markdown id:a793bce8 tags: %% Cell type:markdown id:a793bce8 tags:
$$ $$
a = \frac{b}{c} + d a = \frac{b}{c} + d
$$ $$
%% Cell type:markdown id:9a21b4ac tags: %% Cell type:markdown id:9a21b4ac tags:
%% Cell type:markdown id:e300a005 tags: %% Cell type:markdown id:e300a005 tags:
%% Cell type:markdown id:2aad773a tags: %% Cell type:markdown id:2aad773a tags:
Halten Sie die berechneten Werte für die KPIs im Notebook Halten Sie die berechneten Werte für die KPIs im Notebook
fest: fest:
%% Cell type:code id:59eabafc tags: %% Cell type:code id:59eabafc tags:
``` python ``` python
# calculate the KPIs for your car # calculate the KPIs for your car
``` ```
%% Cell type:code id:c774b381 tags: %% Cell type:code id:c774b381 tags:
``` python ``` python
# print your KPIs # print your KPIs
``` ```
%% Cell type:markdown id:b89e8fb9 tags: %% Cell type:markdown id:b89e8fb9 tags:
Exportieren Sie schließlich Ihr entworfenes Fahrzeug inklusive der entwickelten KPIs: Exportieren Sie schließlich Ihr entworfenes Fahrzeug inklusive der entwickelten KPIs:
%% Cell type:code id:d518275f tags: %% Cell type:code id:d518275f tags:
``` python ``` python
# export car and its properties # export car and its properties
``` ```
%% Cell type:markdown id:89c75440 tags: %% Cell type:markdown id:89c75440 tags:
## Zweites Fahrzeug ## Zweites Fahrzeug
%% Cell type:markdown id:f8a2e1b0 tags: %% Cell type:markdown id:f8a2e1b0 tags:
### Versuchsziel ### Versuchsziel
%% Cell type:markdown id:80407e7f tags: %% Cell type:markdown id:80407e7f tags:
Setzen Sie sich ein Ziel, welche Qualitätsdimensionen in einem zweiten Fahrzeug verbessert werden sollen und bauen Setzen Sie sich ein Ziel, welche Qualitätsdimensionen in einem zweiten Fahrzeug verbessert werden sollen und bauen
Sie darauf aufbauend ein zweites Fahrzeug aus den gegebenen LEGO-Teilen auf. Sie darauf aufbauend ein zweites Fahrzeug aus den gegebenen LEGO-Teilen auf.
Die Anforderungen an das Fahrzeug sind identisch zum ersten. Wählen Sie die Einzelteile und deren Zusammenspiel entsprechend Ihrer Zielstellung aus. Die Anforderungen an das Fahrzeug sind identisch zum ersten. Wählen Sie die Einzelteile und deren Zusammenspiel entsprechend Ihrer Zielstellung aus.
%% Cell type:markdown id:f4c620ee tags: %% Cell type:markdown id:f4c620ee tags:
Formulieren Sie ein Versuchsziel für diesen Versuch. Beschreiben Sie unter anderem, welche Verbesserung Sie vornehmen möchten: Formulieren Sie ein Versuchsziel für diesen Versuch. Beschreiben Sie unter anderem, welche Verbesserung Sie vornehmen möchten:
%% Cell type:markdown id:e3dc7e29 tags: %% Cell type:markdown id:e3dc7e29 tags:
%% Cell type:markdown id:73c454f2 tags: %% Cell type:markdown id:73c454f2 tags:
### Versuchsaufbau ### Versuchsaufbau
%% Cell type:markdown id:2b381a60 tags: %% Cell type:markdown id:2b381a60 tags:
Fügen Sie eine Abbildung des fertigen Autos in LeoCAD hinzu: Fügen Sie eine Abbildung des fertigen Autos in LeoCAD hinzu:
%% Cell type:markdown id:2b6e7f12 tags: %% Cell type:markdown id:2b6e7f12 tags:
%% Cell type:markdown id:23c19009 tags: %% Cell type:markdown id:23c19009 tags:
Beschreiben Sie kurz und präzise den Aufbau des zweiten Fahrzeugs: Beschreiben Sie kurz und präzise den Aufbau des zweiten Fahrzeugs:
%% Cell type:markdown id:a08bf9cf tags: %% Cell type:markdown id:a08bf9cf tags:
%% Cell type:markdown id:14011b6f tags: %% Cell type:markdown id:14011b6f tags:
Erstellen Sie das Fahrzeug in unserem Softwareframework: Erstellen Sie das Fahrzeug in unserem Softwareframework:
%% Cell type:code id:c35de753 tags: %% Cell type:code id:c35de753 tags:
``` python ``` python
# initialize components # initialize components
``` ```
%% Cell type:code id:0b7336fb tags: %% Cell type:code id:0b7336fb tags:
``` python ``` python
# set properties # set properties
``` ```
%% Cell type:code id:fb445ea0 tags: %% Cell type:code id:fb445ea0 tags:
``` python ``` python
# aggregate components # aggregate components
``` ```
%% Cell type:markdown id:89e54480 tags: %% Cell type:markdown id:89e54480 tags:
### Analyse ### Analyse
Bestimmen Sie die KPIs des zweiten Fahrzeugs Bestimmen Sie die KPIs des zweiten Fahrzeugs
%% Cell type:code id:762a1e93 tags: %% Cell type:code id:762a1e93 tags:
``` python ``` python
# calculate the KPIs for your car # calculate the KPIs for your car
``` ```
%% Cell type:code id:1ed67328 tags: %% Cell type:code id:1ed67328 tags:
``` python ``` python
# print your KPIs # print your KPIs
``` ```
%% Cell type:markdown id:0f11b370 tags: %% Cell type:markdown id:0f11b370 tags:
Exportieren Sie Ihr Fahrzeug inklusive der KPIs: Exportieren Sie Ihr Fahrzeug inklusive der KPIs:
%% Cell type:code id:05d9d6f7 tags: %% Cell type:code id:05d9d6f7 tags:
``` python ``` python
# export car and its properties # export car and its properties
``` ```
%% Cell type:markdown id:e413cd84 tags: %% Cell type:markdown id:e413cd84 tags:
## Diskussion ## Diskussion
### Ergebnisse ### Ergebnisse
Stellen Sie die entwickelten KPIs beider Fahrzeuge gegenüber und wählen Sie hierfür unter anderem eine geeignete Stellen Sie die entwickelten KPIs beider Fahrzeuge gegenüber und wählen Sie hierfür unter anderem eine geeignete
grafische Darstellung. Stellen Sie dabei insbesondere sicher, dass die Datengrundlage ersichtlich ist. Halten Sie grafische Darstellung. Stellen Sie dabei insbesondere sicher, dass die Datengrundlage ersichtlich ist. Halten Sie
auch die Plotbefehle im Notebook fest: auch die Plotbefehle im Notebook fest:
%% Cell type:code id:b0f93e22 tags: %% Cell type:code id:b0f93e22 tags:
``` python ``` python
# plot the data, save diagramm as svg-file # plot the data, save diagramm as svg-file
``` ```
%% Cell type:markdown id:6044de27 tags: %% Cell type:markdown id:6044de27 tags:
Interpretieren Sie Ihre Ergebnisse. Vergleichen Sie die KPIs Ihrer Autos. Konnten Sie Ihre gewünschte Verbesserung erzielen? Welche Schlüsse ziehen Sie aus den Ergebnissen für die Qualität der beiden Interpretieren Sie Ihre Ergebnisse. Vergleichen Sie die KPIs Ihrer Autos. Konnten Sie Ihre gewünschte Verbesserung erzielen? Welche Schlüsse ziehen Sie aus den Ergebnissen für die Qualität der beiden
Fahrzeuge? Fahrzeuge?
%% Cell type:markdown id:0ca884b1 tags: %% Cell type:markdown id:0ca884b1 tags:
%% Cell type:markdown id:4f117169 tags: %% Cell type:markdown id:4f117169 tags:
Diskutieren Sie, inwieweit Ihre entwickelten KPIs die im Skript erläuterten FAIR-Prinzipien erfüllen: Diskutieren Sie, inwieweit Ihre entwickelten KPIs die im Skript erläuterten FAIR-Prinzipien erfüllen:
%% Cell type:markdown id:f8ed82d2 tags: %% Cell type:markdown id:f8ed82d2 tags:
%% Cell type:markdown id:bfed164a tags: %% Cell type:markdown id:bfed164a tags:
## Fazit ## Fazit
%% Cell type:markdown id:5d440f87 tags: %% Cell type:markdown id:5d440f87 tags:
Ziehen Sie ein persönliches Fazit. Was haben Sie Neues gelernt? Ziehen Sie ein persönliches Fazit. Was haben Sie Neues gelernt?
%% Cell type:markdown id:b4151784 tags: %% Cell type:markdown id:b4151784 tags:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment