Browse Source

Merge branch 'master' into fixReadMeLinkList

pull/260/head
LEEDASILVA 5 years ago committed by GitHub
parent
commit
38a5f974a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 29
      docs/bios-configuration.md
  2. 163
      docs/event-management.md
  3. BIN
      docs/img/4.png
  4. BIN
      docs/img/56507169-6505a500-6518-11e9-89bb-04c7fd9b41ca.png
  5. BIN
      docs/img/56507180-6afb8600-6518-11e9-97a5-4dcff8f0a069.png
  6. BIN
      docs/img/56507445-3936ef00-6519-11e9-90c8-d85056e9330b.png
  7. BIN
      docs/img/56517407-cb98bc00-6534-11e9-98d6-a2b1c0193a38.png
  8. BIN
      docs/img/56517421-d0f60680-6534-11e9-86ef-97fb9e59786e.png
  9. BIN
      docs/img/56518936-a1e19400-6538-11e9-81c7-520ffd365cff.png
  10. BIN
      docs/img/6.png
  11. BIN
      docs/img/63525316-64e0da80-c4f5-11e9-9e61-57d5a73da9b1.png
  12. BIN
      docs/img/63525543-c86b0800-c4f5-11e9-8820-60d9ff33994f.png
  13. BIN
      docs/img/63532891-9d87b080-c503-11e9-8ff2-46c7a5b19c12.png
  14. BIN
      docs/img/63533088-02430b00-c504-11e9-9675-bcab7bec825c.png
  15. BIN
      docs/img/63533145-21419d00-c504-11e9-8e80-fb4f53d93b00.png
  16. BIN
      docs/img/63533589-015ea900-c505-11e9-8b77-b45b620cd171.png
  17. BIN
      docs/img/63533613-0facc500-c505-11e9-90e8-94254cef5ce3.png
  18. BIN
      docs/img/63533641-1d624a80-c505-11e9-9cd1-e1d156dd7fc4.png
  19. BIN
      docs/img/7.png
  20. BIN
      docs/img/8.png
  21. BIN
      docs/img/9.png
  22. BIN
      docs/img/add-child-to-parent-object.png
  23. BIN
      docs/img/all-object-page.png
  24. BIN
      docs/img/child-capture.png
  25. BIN
      docs/img/children.png
  26. BIN
      docs/img/document-to-sign-step-example.png
  27. BIN
      docs/img/exam-object-attributes.png
  28. BIN
      docs/img/form-step-example.png
  29. BIN
      docs/img/go-to-objects.png
  30. BIN
      docs/img/object-attributes.png
  31. BIN
      docs/img/object-edit-overview.png
  32. BIN
      docs/img/piscine-object-attributes.png
  33. 0
      docs/img/ubuntu-installation/1.png
  34. 0
      docs/img/ubuntu-installation/2.png
  35. 0
      docs/img/ubuntu-installation/3.png
  36. BIN
      docs/img/ubuntu-installation/4.png
  37. 0
      docs/img/ubuntu-installation/5.png
  38. BIN
      docs/img/ubuntu-installation/6.png
  39. 0
      docs/img/usb-configuration/1.png
  40. 0
      docs/img/usb-configuration/2.png
  41. 0
      docs/img/usb-configuration/3.png
  42. 0
      docs/img/usb-configuration/4.png
  43. 0
      docs/img/usb-configuration/5.png
  44. 0
      docs/img/usb-configuration/6.png
  45. 0
      docs/img/usb-configuration/7.png
  46. 0
      docs/img/usb-configuration/8.png
  47. 0
      docs/img/usb-configuration/9.png
  48. 122
      docs/modular-steps-management.md
  49. 7
      docs/object-attribute-reference.md
  50. 11
      docs/object-attribute-system.md
  51. 49
      docs/object-child-creation.md
  52. 93
      docs/object-creation.md
  53. 6
      docs/object-edit.md
  54. 4
      docs/objects.md
  55. 30
      docs/os-deployment.md
  56. 10
      docs/piscine-go-curriculum.md
  57. 37
      docs/principles.md
  58. 31
      docs/responsibilities.md
  59. 11
      docs/tasks.md
  60. 67
      docs/ubuntu-installation.md
  61. 24
      docs/usb-configuration.md
  62. 1
      scripts/dconfig.txt
  63. 2
      scripts/grub.sh
  64. 60
      scripts/install_client.sh
  65. 48
      scripts/kickstart.sh
  66. 2
      scripts/nodejs.sh
  67. 21
      scripts/preseed.cfg
  68. 7
      scripts/ssh.sh
  69. 2
      scripts/system/etc/gdm3/PostLogin/Default
  70. 4
      scripts/system/etc/gdm3/PostSession/Default
  71. BIN
      scripts/system/usr/share/backgrounds/01/background.png
  72. BIN
      scripts/system/usr/share/backgrounds/01/logo.png
  73. 9
      scripts/ubuntu_tweaks.sh
  74. 6
      subjects/abort.en.md
  75. 6
      subjects/abort.fr.md
  76. 6
      subjects/activebits.en.md
  77. 6
      subjects/activebits.fr.md
  78. 10
      subjects/addprimesum.en.md
  79. 10
      subjects/addprimesum.fr.md
  80. 6
      subjects/advancedsortwordarr.en.md
  81. 6
      subjects/advancedsortwordarr.fr.md
  82. 6
      subjects/any.en.md
  83. 6
      subjects/any.fr.md
  84. 6
      subjects/appendrange.en.md
  85. 6
      subjects/appendrange.fr.md
  86. 6
      subjects/atoi.en.md
  87. 6
      subjects/atoi.fr.md
  88. 6
      subjects/atoibase.en.md
  89. 6
      subjects/atoibase.fr.md
  90. 6
      subjects/basicatoi.en.md
  91. 6
      subjects/basicatoi.fr.md
  92. 6
      subjects/basicatoi2.en.md
  93. 6
      subjects/basicatoi2.fr.md
  94. 6
      subjects/basicjoin.en.md
  95. 6
      subjects/basicjoin.fr.md
  96. 2
      subjects/btreeapplybylevel.en.md
  97. 6
      subjects/btreeapplyinorder.en.md
  98. 6
      subjects/btreeapplyinorder.fr.md
  99. 6
      subjects/btreeapplypostorder.en.md
  100. 6
      subjects/btreeapplypostorder.fr.md
  101. Some files were not shown because too many files changed in this diff diff.show_more

29
docs/bios-configuration.md

@ -0,0 +1,29 @@
# BIOS Configuration
## Steps
<kbd>F10</kbd> (Open Setup)
- _Security_
- _Create BIOS Administrator Password_ → Set password
- _Advanced_
- _Boot Options_
- _USB Storage Boot_ → Disabled
- _Fast Boot_ → Disabled (disturbs network boot)
- _Audio Alerts During Boot_ → Disabled (very noisy)
- _HP Sure Recover_
- _HP Sure Recover_ → Disabled (tries to restore Windows)
- _Secure Boot Configuration_
- _Configure Legacy Support and Secure Boot_ → «Legacy Support Disable and Secure Boot Disable» (**TODO**: use Secure Boot)
<kbd>F10</kbd> → Yes (Save changes & Reboot)
> Enter the code that the BIOS asks to disable the secure boot
## Automation
- Can be automated using Intel vPro/AMT (**TODO**)
- Can be partially automated with a USB programmable keyboard such as :
- [USB Rubber Ducky](https://shop.hak5.org/products/usb-rubber-ducky-deluxe)
- [XK-24 USB Programmable Keypad for Windows or Mac](https://www.amazon.com/gp/product/B003MB780E)
- [Cactus WHID: WiFi HID Injector USB Rubberducky](https://www.tindie.com/products/aprbrother/cactus-whid-wifi-hid-injector-usb-rubberducky/)

163
docs/event-management.md

@ -1,49 +1,55 @@
# Events management # Events management
## Usage ## Usage
> An event is associated to an object when the usage of this object implies:
> * a limited capacity of people
> * a limited time
> Event management require: An event is associated to an object when the usage of this object implies:
> * Edition of the attributes of the object on which the event is based
> * Creation and settings of the event associated to the reference object - a limited capacity of people
- a limited time
Event management require:
- Edition of the attributes of the object on which the event is based
- Creation and settings of the event associated to the reference object
> Events are used for: `piscines`, `check-in`, `exams`, `rushes`, `hackatons`, `conferences`. > Events are used for: `piscines`, `check-in`, `exams`, `rushes`, `hackatons`, `conferences`.
## Settings for the reference object ## Settings for the reference object
> Important indications: Important indications:
> * Objects that doesn't have required attributes for event creation will not be open to event creation.
> | name | fullfillment | - Objects that doesn't have required attributes for event creation will not be open to event creation.
> | -------------------- | --------- |
> | capacity | **required** |
> | eventDuration | **required** |
> | registrationDuration | **required** |
> | description | optionnal |
> | eventStartDelay | optionnal |
> * All the attributes filled in the object are used as values by default for event's creation; it can be overloaded for each event related to the reference object. | name | fullfillment |
> * If the reference object has a child or children which are events itself, settings are also required for each event child. | -------------------- | ------------ |
| capacity | **required** |
| eventDuration | **required** |
| registrationDuration | **required** |
| description | optionnal |
| eventStartDelay | optionnal |
- All the attributes filled in the object are used as values by default for event's creation; it can be overloaded for each event related to the reference object.
- If the reference object has a child or children which are events itself, settings are also required for each event child.
#### Edit the object attributes: #### Edit the object attributes:
> in *Object attributes*
<img width="1073" alt="Capture d’écran 2019-08-22 à 11 40 34" src="https://user-images.githubusercontent.com/35296671/63525316-64e0da80-c4f5-11e9-9e61-57d5a73da9b1.png"> > in _Object attributes_
<img width="1073" alt="Capture d’écran 2019-08-22 à 11 40 34" src="img/63525316-64e0da80-c4f5-11e9-9e61-57d5a73da9b1.png">
* Add a new key **capacity** of type `Number` with the maximum number of persons you want for events related to the object by default - Add a new key **capacity** of type `Number` with the maximum number of persons you want for events related to the object by default
* Add a new key **eventDuration** of type `Number` with the duration in minutes you want for events related to the object by default - Add a new key **eventDuration** of type `Number` with the duration in minutes you want for events related to the object by default
* Add a new key **registrationDuration** of type `Number` with the duration in minutes you want to allow to people to register to the event by default - Add a new key **registrationDuration** of type `Number` with the duration in minutes you want to allow to people to register to the event by default
* Add a new key **eventStartDelay** of type `Number`, if you want a default delay between the end of registration and the beginning of the event. This duration is expressed in minutes. - Add a new key **eventStartDelay** of type `Number`, if you want a default delay between the end of registration and the beginning of the event. This duration is expressed in minutes.
* Add a new key **description** of type `String`, if you need to associate some informations to your event (description, location, access, documents to provide, etc.) - Add a new key **description** of type `String`, if you need to associate some informations to your event (description, location, access, documents to provide, etc.)
#### Edit the children #### Edit the children
> in *Children*
<img width="609" alt="Capture d’écran 2019-08-22 à 15 43 43" src="https://user-images.githubusercontent.com/35296671/63525543-c86b0800-c4f5-11e9-8820-60d9ff33994f.png"> > in _Children_
<img width="609" alt="Capture d’écran 2019-08-22 à 15 43 43" src="img/63525543-c86b0800-c4f5-11e9-8820-60d9ff33994f.png">
* Add a new key **startAfter** of type `Number`, with the default delay you want between the beginning of the event and the beginning of the child event. This duration is expressed in minutes. - Add a new key **startAfter** of type `Number`, with the default delay you want between the beginning of the event and the beginning of the child event. This duration is expressed in minutes.
##### Example ##### Example
@ -53,7 +59,8 @@ Here is an example of the `Piscine Go` settings. It presents the settings of the
**Piscine Go** **Piscine Go**
*Object attributes* _Object attributes_
```json ```json
{ {
"capacity": 400, "capacity": 400,
@ -65,10 +72,11 @@ Here is an example of the `Piscine Go` settings. It presents the settings of the
This piscine object attributes look like this: This piscine object attributes look like this:
![piscine object attributes](https://user-images.githubusercontent.com/35296671/63526946-239dfa00-c4f8-11e9-8272-270c578f3fb8.png) ![piscine-object-attributes](img/piscine-object-attributes.png)
_Children_
*Children* > In the `Piscine Go`, children of type _exam_ and _rush_ have events itself.
> In the `Piscine Go`, children of type *exam* and *rush* have events itself.
> A **startAfter** key has to be defined for each of them, in their parent object `Piscine Go`. For example, the exam-01 gets this key: > A **startAfter** key has to be defined for each of them, in their parent object `Piscine Go`. For example, the exam-01 gets this key:
@ -80,12 +88,14 @@ This piscine object attributes look like this:
This child attributes look like this: This child attributes look like this:
![piscine children attributes](https://user-images.githubusercontent.com/35296671/63525543-c86b0800-c4f5-11e9-8820-60d9ff33994f.png) ![piscine children attributes](img/63525543-c86b0800-c4f5-11e9-8820-60d9ff33994f.png)
**Exam 01** **Exam 01**
> The object `Exam 01`, which is a child of `Piscine Go`, has its own *Object Attributes* filled in the child object.
*Object attributes* > The object `Exam 01`, which is a child of `Piscine Go`, has its own _Object Attributes_ filled in the child object.
_Object attributes_
```json ```json
{ {
"eventDuration": 240, "eventDuration": 240,
@ -93,85 +103,88 @@ This child attributes look like this:
"eventStartDelay": 60 "eventStartDelay": 60
} }
``` ```
> NB: the **capacity** attribute is herited from the parent object `Piscine Go` here. > NB: the **capacity** attribute is herited from the parent object `Piscine Go` here.
This exam object attributes look like this: This exam object attributes look like this:
![exam object attributes](https://user-images.githubusercontent.com/35296671/63527315-c3f41e80-c4f8-11e9-82da-d27c4c367323.png) ![exam-object-attributes](img/exam-object-attributes.png)
## Create the event ## Create the event
### Create a new event for your object ### Create a new event for your object
> (in *Admin* > *Manage events* > *Add new event*)
<img width="788" alt="Capture d’écran 2019-08-22 à 11 37 13" src="https://user-images.githubusercontent.com/35296671/63532891-9d87b080-c503-11e9-8ff2-46c7a5b19c12.png"> > (in _Admin_ > _Manage events_ > _Add new event_)
<img width="789" alt="Capture d’écran 2019-08-22 à 11 37 35" src="https://user-images.githubusercontent.com/35296671/63533088-02430b00-c504-11e9-9675-bcab7bec825c.png">
<img width="787" alt="Capture d’écran 2019-08-22 à 11 38 07" src="https://user-images.githubusercontent.com/35296671/63533145-21419d00-c504-11e9-8e80-fb4f53d93b00.png">
<img width="788" alt="Capture d’écran 2019-08-22 à 11 37 13" src="img/63532891-9d87b080-c503-11e9-8ff2-46c7a5b19c12.png">
<img width="789" alt="Capture d’écran 2019-08-22 à 11 37 35" src="img/63533088-02430b00-c504-11e9-9675-bcab7bec825c.png">
<img width="787" alt="Capture d’écran 2019-08-22 à 11 38 07" src="img/63533145-21419d00-c504-11e9-8e80-fb4f53d93b00.png">
* The **reference object** of your event is the object for which you need to create an event: `Check`, `Piscine Go`, etc. - The **reference object** of your event is the object for which you need to create an event: `Check`, `Piscine Go`, etc.
* The **registration starts at** indicates when registration of the event begins. - The **registration starts at** indicates when registration of the event begins.
* The **registration ends at** indicates when registration of the event ends. - The **registration ends at** indicates when registration of the event ends.
* The **event starts at** indicates when the event begins. - The **event starts at** indicates when the event begins.
> NB: > NB:
> * End of registration can't be before its beginning. >
> * Start of event can't be before end of registration. > - End of registration can't be before its beginning.
> * Date and Time input is not yet working in firefox but should be added soon by mozilla. In the mean while use chrome for adding events > - Start of event can't be before end of registration.
> - Date and Time input is not yet working in firefox but should be added soon by mozilla. In the mean while use chrome for adding events
### Settings for you event ### Settings for you event
> In the event you have created, 3 categories must be checked: > In the event you have created, 3 categories must be checked:
>
> 1. General settings > 1. General settings
> 2. Registration's settings > 2. Registration's settings
> 3. Event's settings > 3. Event's settings
#### General settings #### General settings
<img width="785" alt="Capture d’écran 2019-08-22 à 11 39 26" src="https://user-images.githubusercontent.com/35296671/63533589-015ea900-c505-11e9-8b77-b45b620cd171.png"> <img width="785" alt="Capture d’écran 2019-08-22 à 11 39 26" src="img/63533589-015ea900-c505-11e9-8b77-b45b620cd171.png">
General settings of your event can be set after creation of the event. By default, it is the values indicated in the **reference object**. General settings of your event can be set after creation of the event. By default, it is the values indicated in the **reference object**.
* **Capacity** - **Capacity**
* During the regitration, the capacity doesn't apply. When registration ends, we register the amount defined by the **capacity** to the event *(ordered by registration date)*. - During the regitration, the capacity doesn't apply. When registration ends, we register the amount defined by the **capacity** to the event _(ordered by registration date)_.
* If someone unregister to the event during a registration, it release one place. - If someone unregister to the event during a registration, it release one place.
* During a registration, users can see if their place is guaranteed or if they are in waiting list. - During a registration, users can see if their place is guaranteed or if they are in waiting list.
* If the event has children which are event themselves, they will use by default the capacity of the parent event - If the event has children which are event themselves, they will use by default the capacity of the parent event
if no capacity was defined on this child. if no capacity was defined on this child.
* **Description** (facultative) - **Description** (facultative)
* It can be used to describe the topic of the event, or to add some practical informations: location, documents to provide, accessibility, etc. - It can be used to describe the topic of the event, or to add some practical informations: location, documents to provide, accessibility, etc.
#### Registration #### Registration
<img width="761" alt="Capture d’écran 2019-08-22 à 11 39 37" src="https://user-images.githubusercontent.com/35296671/63533613-0facc500-c505-11e9-90e8-94254cef5ce3.png"> <img width="761" alt="Capture d’écran 2019-08-22 à 11 39 37" src="img/63533613-0facc500-c505-11e9-90e8-94254cef5ce3.png">
* End of registration can't be after start of registration. - End of registration can't be after start of registration.
* Dates can't be updated after it's passed. - Dates can't be updated after it's passed.
* The **registration duration** indicated in the **reference object** is reminded under the inputs to help you fill the informations. - The **registration duration** indicated in the **reference object** is reminded under the inputs to help you fill the informations.
* Same for the **event start delay**. - Same for the **event start delay**.
* The list of users in the registration, pending or accepeted, is accessible by clicking on the link 'N users registered', at the left bottom of this categrory. - The list of users in the registration, pending or accepeted, is accessible by clicking on the link 'N users registered', at the left bottom of this categrory.
#### Event #### Event
<img width="740" alt="Capture d’écran 2019-08-22 à 11 39 49" src="https://user-images.githubusercontent.com/35296671/63533641-1d624a80-c505-11e9-9cd1-e1d156dd7fc4.png"> <img width="740" alt="Capture d’écran 2019-08-22 à 11 39 49" src="img/63533641-1d624a80-c505-11e9-9cd1-e1d156dd7fc4.png">
* End of event can't be after start of event. - End of event can't be after start of event.
* Dates can't be updated after it's passed. - Dates can't be updated after it's passed.
* The **end of event** is calculated by default by adding the **event duration** indicated in the **reference object** to the **start of event** date. - The **end of event** is calculated by default by adding the **event duration** indicated in the **reference object** to the **start of event** date.
* If the event contains other events, the **end of event** can't be before the end of the last child event. - If the event contains other events, the **end of event** can't be before the end of the last child event.
* The **event duration** indicated in the **reference object** is reminded under the inputs to help you fill the informations. - The **event duration** indicated in the **reference object** is reminded under the inputs to help you fill the informations.
* If the event contains other events, the **minimum end of event** is indicated under the inputs to help you fill the informations. - If the event contains other events, the **minimum end of event** is indicated under the inputs to help you fill the informations.
* The list of users selected for the event at its creation is accessible by clicking on the link 'N users registered', at the left bottom of this categrory. - The list of users selected for the event at its creation is accessible by clicking on the link 'N users registered', at the left bottom of this categrory.
#### Children (facultative) #### Children (facultative)
<img width="1009" alt="Capture d’écran 2019-08-22 à 18 24 49" src="https://user-images.githubusercontent.com/35296671/63535788-29044000-c50a-11e9-835c-f8378558962c.png"> <img width="1009" alt="Capture d’écran 2019-08-22 à 18 24 49" src="img/63535788-29044000-c50a-11e9-835c-f8378558962c.png">
This category appears only if the event has children which are events itself. This category appears only if the event has children which are events itself.
* Children settings can't be overloaded. - Children settings can't be overloaded.
* Each event child presents: - Each event child presents:
* Its **Start** and **end** (according to the children settings of the **reference object**) - Its **Start** and **end** (according to the children settings of the **reference object**)
* Its **capacity** - Its **capacity**
* Its **groups size** - Its **groups size**
* Reminder: in `hackatons` or `rushes`, candidates or students registered to the are divided in groups of N persons. - Reminder: in `hackatons` or `rushes`, candidates or students registered to the are divided in groups of N persons.

BIN
docs/img/4.png

diff.bin_not_shown

Before

Width:  |  Height:  |  Size: 18 KiB

BIN
docs/img/56507169-6505a500-6518-11e9-89bb-04c7fd9b41ca.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 147 KiB

BIN
docs/img/56507180-6afb8600-6518-11e9-97a5-4dcff8f0a069.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 10 KiB

BIN
docs/img/56507445-3936ef00-6519-11e9-90c8-d85056e9330b.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 146 KiB

BIN
docs/img/56517407-cb98bc00-6534-11e9-98d6-a2b1c0193a38.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 185 KiB

BIN
docs/img/56517421-d0f60680-6534-11e9-86ef-97fb9e59786e.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 189 KiB

BIN
docs/img/56518936-a1e19400-6538-11e9-81c7-520ffd365cff.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 117 KiB

BIN
docs/img/6.png

diff.bin_not_shown

Before

Width:  |  Height:  |  Size: 13 KiB

BIN
docs/img/63525316-64e0da80-c4f5-11e9-9e61-57d5a73da9b1.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 212 KiB

BIN
docs/img/63525543-c86b0800-c4f5-11e9-8820-60d9ff33994f.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 85 KiB

BIN
docs/img/63532891-9d87b080-c503-11e9-8ff2-46c7a5b19c12.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 145 KiB

BIN
docs/img/63533088-02430b00-c504-11e9-9675-bcab7bec825c.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 88 KiB

BIN
docs/img/63533145-21419d00-c504-11e9-8e80-fb4f53d93b00.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 25 KiB

BIN
docs/img/63533589-015ea900-c505-11e9-8b77-b45b620cd171.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 120 KiB

BIN
docs/img/63533613-0facc500-c505-11e9-90e8-94254cef5ce3.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 85 KiB

BIN
docs/img/63533641-1d624a80-c505-11e9-9cd1-e1d156dd7fc4.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 70 KiB

BIN
docs/img/7.png

diff.bin_not_shown

Before

Width:  |  Height:  |  Size: 22 KiB

BIN
docs/img/8.png

diff.bin_not_shown

Before

Width:  |  Height:  |  Size: 25 KiB

BIN
docs/img/9.png

diff.bin_not_shown

Before

Width:  |  Height:  |  Size: 7.5 KiB

BIN
docs/img/add-child-to-parent-object.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 136 KiB

BIN
docs/img/all-object-page.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 126 KiB

BIN
docs/img/child-capture.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 86 KiB

BIN
docs/img/children.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 53 KiB

BIN
docs/img/document-to-sign-step-example.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 100 KiB

BIN
docs/img/exam-object-attributes.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 135 KiB

BIN
docs/img/form-step-example.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 17 KiB

BIN
docs/img/go-to-objects.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 88 KiB

BIN
docs/img/object-attributes.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 49 KiB

BIN
docs/img/object-edit-overview.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 139 KiB

BIN
docs/img/piscine-object-attributes.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 135 KiB

0
docs/img/1.png → docs/img/ubuntu-installation/1.png

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

0
docs/img/2.png → docs/img/ubuntu-installation/2.png

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

0
docs/img/3.png → docs/img/ubuntu-installation/3.png

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

BIN
docs/img/ubuntu-installation/4.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 21 KiB

0
docs/img/5.png → docs/img/ubuntu-installation/5.png

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

BIN
docs/img/ubuntu-installation/6.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 16 KiB

0
docs/img/usb/1.png → docs/img/usb-configuration/1.png

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 73 KiB

0
docs/img/usb/2.png → docs/img/usb-configuration/2.png

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 74 KiB

0
docs/img/usb/3.png → docs/img/usb-configuration/3.png

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

0
docs/img/usb/4.png → docs/img/usb-configuration/4.png

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

0
docs/img/usb/5.png → docs/img/usb-configuration/5.png

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

0
docs/img/usb/6.png → docs/img/usb-configuration/6.png

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 65 KiB

0
docs/img/usb/7.png → docs/img/usb-configuration/7.png

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

0
docs/img/usb/8.png → docs/img/usb-configuration/8.png

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 84 KiB

0
docs/img/usb/9.png → docs/img/usb-configuration/9.png

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

122
docs/modular-steps-management.md

@ -1,73 +1,80 @@
# Sign up & onboarding's Administration section - Modular steps management # Sign up & onboarding's Administration section - Modular steps management
## Usage ## Usage
> After their first authentication in the app, every candidate has to do his **sign up** and his **onboarding**. The steps that compose the **sign up** and the **administration** section of the onboarding are either:
> * Forms (identification, medical information, etc.) After their first authentication in the app, every candidate has to do his **sign up** and his **onboarding**. The steps that compose the **sign up** and the **administration** section of the onboarding are either:
> * Documents to sign (general conditions, charts, regulations, etc.)
> - Forms (identification, medical information, etc.)
> All the sections are modular: you can add, update, delete and order them as you wish. - Documents to sign (general conditions, charts, regulations, etc.)
>
> This documentation explains how to manage these steps. All the sections are modular: you can add, update, delete and order them as you wish.
This documentation explains how to manage these steps.
## Create your step child object ## Create your step child object
### Create a new object for your step in the admin ### Create a new object for your step in the admin
> Information is available for object's creation: [Object creation](https://github.com/01-edu/public/blob/master/doc/object-creation.md)
* This object must have the same type as its future parent object (*signup* or *onboarding*). > Information is available for object's creation: [Object creation](object-creation.md)
> Your step is then available in the *Admin*. You can find it in the section of its type (*SignUp* or *Onboarding*) or thanks to the search bar of the cursus object's page. - This object must have the same type as its future parent object (_signup_ or _onboarding_).
> Your step is then available in the _Admin_. You can find it in the section of its type (_SignUp_ or _Onboarding_) or thanks to the search bar of the cursus object's page.
### Add this new object as a child of your parent's object ### Add this new object as a child of your parent's object
* Edit the parent object: *Sign up* or *Administration* - Edit the parent object: _Sign up_ or _Administration_
> Information is available for object's creation: [Child object creation](https://github.com/01-edu/public/blob/master/doc/child-object-creation.md) > Information is available for object's creation: [Child object creation](object-child-creation.md)
## Settings for a `form` step ## Settings for a `form` step
> In the step object you have created, 2 attributes must be filled:
> 1. Subtype In the step object you have created, 2 attributes must be filled:
> 2. Form
1. Subtype
2. Form
### Description ### Description
#### Edit the step object you have created : #### Edit the step object you have created :
> in *Object attributes*
<img width="1073" alt="Capture d’écran 2019-04-22 à 15 59 33" src="https://user-images.githubusercontent.com/35296671/56507445-3936ef00-6519-11e9-90c8-d85056e9330b.png"> > in _Object attributes_
<img width="1073" alt="Capture d’écran 2019-04-22 à 15 59 33" src="img/56507445-3936ef00-6519-11e9-90c8-d85056e9330b.png">
* Add a new key **subtype** of type `String` with the exact value 'form-step' - Add a new key **subtype** of type `String` with the exact value 'form-step'
* Add a new key **form** of type `Object` - Add a new key **form** of type `Object`
* Form can have several sections. Each section is displayed with a title, and its inputs. - Form can have several sections. Each section is displayed with a title, and its inputs.
> NB: The submission of the form will check the required inputs of all the sections created for the form. > NB: The submission of the form will check the required inputs of all the sections created for the form.
* To create a section, add a new key to the form object, of type `Object`, that contains: - To create a section, add a new key to the form object, of type `Object`, that contains:
* A **title** key of type `String`. The value of this property will be the title displayed in the top of the form section. - A **title** key of type `String`. The value of this property will be the title displayed in the top of the form section.
> If there is only one section in the form step, and no section title is needed, this property can be ignored. > If there is only one section in the form step, and no section title is needed, this property can be ignored.
* An **inputs** key of type `Object`, which will contain all the inputs of the section. For each wanted input, add a new `Object` element in the "inputs" object. - An **inputs** key of type `Object`, which will contain all the inputs of the section. For each wanted input, add a new `Object` element in the "inputs" object.
> The key of this object will be used as the "name" attribute of your input. > The key of this object will be used as the "name" attribute of your input.
> The values will be considered as the properties of your input. > The values will be considered as the properties of your input.
#### Defining an input: #### Defining an input:
* A **type** key of type `String` must be declared. It defines the type of the input : `tel`, `text`, `date`, `select`, `radio`, `switch`, `checkbox`, `textarea`, `countries`. - A **type** key of type `String` must be declared. It defines the type of the input : `tel`, `text`, `date`, `select`, `radio`, `switch`, `checkbox`, `textarea`, `countries`.
* All other attributes needed for the input can be added to the object, according to the input type: `placeholder`, `id`, `required`, `label`, `items`, `emptyItems`, `index`, etc... - All other attributes needed for the input can be added to the object, according to the input type: `placeholder`, `id`, `required`, `label`, `items`, `emptyItems`, `index`, etc...
#### Important indication: #### Important indication:
* The **index** property is used to order the inputs. It will not be passed onto the input. Be mindful not to set the same index twice.
* The **type** property is required. It will be used to determine the kind of input should be generated. It is passed onto the input only if the input type attribute is required (type 'tel' or 'text' for example, but not for type 'select' - in this case, we will generate a select element) - The **index** property is used to order the inputs. It will not be passed onto the input. Be mindful not to set the same index twice.
- The **type** property is required. It will be used to determine the kind of input should be generated. It is passed onto the input only if the input type attribute is required (type 'tel' or 'text' for example, but not for type 'select' - in this case, we will generate a select element)
* A special type 'countries' has been added to the classicals. It generate a `Select` (containing all the countries) with a search bar. 'Items' property is handled by the app.
* It's recommended to add 'min' and 'max' properties to input type 'date' (no default value are set). - A special type 'countries' has been added to the classicals. It generate a `Select` (containing all the countries) with a search bar. 'Items' property is handled by the app.
* `onChange` prop are ignored as the event is handled by the app. - It's recommended to add 'min' and 'max' properties to input type 'date' (no default value are set).
* For `switch` and `checkbox` input types, the default value has to be set as a boolean property named **value**.
* More information for each inputs is available in the design documentation: - `onChange` prop are ignored as the event is handled by the app.
* [textInput documentation](https://alem.01-edu.org/design/Components/FormInputs/TextInput) - used for inputs type 'text', 'tel', and 'date' - For `switch` and `checkbox` input types, the default value has to be set as a boolean property named **value**.
* [textArea documentation](https://alem.01-edu.org/design/Components/FormInputs/TextArea) - More information for each inputs is available in the design documentation:
* [select documentation](https://alem.01-edu.org/design/Components/FormControls/Select) - [textInput documentation](https://01.alem.school/design/Components/FormInputs/TextInput) - used for inputs type 'text', 'tel', and 'date'
* [radio button documentation](https://alem.01-edu.org/design/Components/FormControls/Radio) - [textArea documentation](https://01.alem.school/design/Components/FormInputs/TextArea)
* [switch documentation](https://alem.01-edu.org/design/Components/FormControls/Switch) - [select documentation](https://01.alem.school/design/Components/FormControls/Select)
* [checkbox documentation](https://alem.01-edu.org/design/Components/FormControls/Checkbox) - [radio button documentation](https://01.alem.school/design/Components/FormControls/Radio)
- [switch documentation](https://01.alem.school/design/Components/FormControls/Switch)
- [checkbox documentation](https://01.alem.school/design/Components/FormControls/Checkbox)
### Examples ### Examples
@ -173,14 +180,14 @@ Here is an example of the form step's attributes. It presents a form with two se
This 'form' step would look like this: This 'form' step would look like this:
![form-step-example](img/form-step-example.png)
![form step example](https://user-images.githubusercontent.com/35296671/56816457-7cf06800-683b-11e9-9003-6f83b4545033.png)
## Settings for a `document to sign` step ## Settings for a `document to sign` step
The newly created child can be customized with these attributes : The newly created child can be customized with these attributes :
| name | fullfillment | | name | fullfillment |
| ---------- | --------- | | ---------- | ------------ |
| subtype | **required** | | subtype | **required** |
| text | **required** | | text | **required** |
| buttonText | optionnal | | buttonText | optionnal |
@ -191,21 +198,21 @@ The newly created child can be customized with these attributes :
#### To set up the child object you have created with these elements: #### To set up the child object you have created with these elements:
1. Edit you step object 1. Edit you step object
2. Go to *Object attributes* 2. Go to _Object attributes_
3. Add the following attributes: 3. Add the following attributes:
* Add a new key **subtype** of type `String` with the exact value 'sign-step' - Add a new key **subtype** of type `String` with the exact value 'sign-step'
* Add a new key **text** of type `String` with the text of your document to sign as value - Add a new key **text** of type `String` with the text of your document to sign as value
* Add a new key **buttonText** of type `String` with the text that you want to display in the submit button of your step. Default value for this attribute is 'Sign'. - Add a new key **buttonText** of type `String` with the text that you want to display in the submit button of your step. Default value for this attribute is 'Sign'.
* Add a new key **checkbox** of type `Object`, if the user has to be forced to click on a checkbox before validating his document (ex: 'I have read and accepted the conditions'). In the checkbox object, the following attributes should be defined: - Add a new key **checkbox** of type `Object`, if the user has to be forced to click on a checkbox before validating his document (ex: 'I have read and accepted the conditions'). In the checkbox object, the following attributes should be defined:
* A **label** key of type `String`, for the text associated to the checkbox - A **label** key of type `String`, for the text associated to the checkbox
* A **required** key of type `Boolean`, set at true if the user has to check it - A **required** key of type `Boolean`, set at true if the user has to check it
* A **name** key of type `String` - A **name** key of type `String`
* All other attributes wanted for the checkbox. - All other attributes wanted for the checkbox.
* Add a new key **link** of type `Object`, if a link must be added to the step (ex: download of a .pdf version of the document to sign). In the link object, the following attributes should be defined: - Add a new key **link** of type `Object`, if a link must be added to the step (ex: download of a .pdf version of the document to sign). In the link object, the following attributes should be defined:
* A **href** key of type `String`, with the link you want to add to the step - A **href** key of type `String`, with the link you want to add to the step
* A **label** key of type `String`, for the text displayed for the link (by default, '> Link to the document' is displayed) - A **label** key of type `String`, for the text displayed for the link (by default, '> Link to the document' is displayed)
* All other attributes wanted for the link. - All other attributes wanted for the link.
### Examples ### Examples
@ -230,9 +237,8 @@ Here is an example of the structure a 'document to sign' step could have:
} }
``` ```
NB : ```target``` & ```download``` are forwarded to the a html element as they are valid html properties NB : `target` & `download` are forwarded to the a html element as they are valid html properties
This 'document to sign' step would look like this: This 'document to sign' step would look like this:
![document to sign step example](https://user-images.githubusercontent.com/35296671/61788887-29c28d00-ae0b-11e9-872c-71a7d1ddbe09.png) ![document-to-sign-step-example](img/document-to-sign-step-example.png)

7
docs/object-attribute-reference.md

@ -1,9 +1,10 @@
# Object Attribute Reference # Object Attribute Reference
## List all **USABLE** preset object attributes ## List all **USABLE** preset object attributes
| Attribute | Type | Value | Description | | Attribute | Type | Value | Description |
|-------------------|-----------|-------|-------------| | ----------------- | -------- | ---------------------------------------------------------------------- | ------------------------------------------------------- |
| `xp` | function | `exerciceExpCalculation`, `examExpCalculation` or `raidExpCalculation` | Amount of exeperience points that an object will give. | | `xp` | function | `exerciceExpCalculation`, `examExpCalculation` or `raidExpCalculation` | Amount of experience points that an object will give. |
| `correctionPrice` | function | `correctionPrice` | Amount of correction points needed to test an exercise. | | `correctionPrice` | function | `correctionPrice` | Amount of correction points needed to test an exercise. |
| `duration` | number | | | | `duration` | number | | |
| `time` | string | | | | `time` | string | | |
@ -12,7 +13,7 @@
## List all **RESERVED** preset object attributes ## List all **RESERVED** preset object attributes
| Attribute | Type | Value | Description | | Attribute | Type | Value | Description |
|-------------------|-----------|-------|-------------| | ------------ | -------- | ----- | ----------- |
| `scopeStart` | function | | | | `scopeStart` | function | | |
| `scopeEnd` | function | | | | `scopeEnd` | function | | |
| `startDay` | function | | | | `startDay` | function | | |

11
docs/object-attribute-system.md

@ -23,7 +23,7 @@ Once created, the new attributes appears right bellow and the ability to associa
Any attribute can be delete by clicking on the 'trash' icon on the right hand of it. Any attribute can be delete by clicking on the 'trash' icon on the right hand of it.
Here an example of how the section looks like. Here an example of how the section looks like.
![object-attributes](https://user-images.githubusercontent.com/15313830/56677487-88675600-66b8-11e9-9781-26dc0ee6301d.png) ![object-attributes](img/object-attributes.png)
## Attributes and RelationShips ## Attributes and RelationShips
@ -49,10 +49,10 @@ The following json shows how the object would be represented:
``` ```
Children Children
![children](https://user-images.githubusercontent.com/15313830/56679319-b189e580-66bc-11e9-8f2a-3d51eb1486d4.png) ![children](img/children.png)
Child Child
![chilld-capture](https://user-images.githubusercontent.com/15313830/56679320-b189e580-66bc-11e9-90ab-c8f69f531876.png) ![child-capture](img/child-capture.png)
## Detailed example ## Detailed example
@ -151,12 +151,15 @@ All done, now when rendering an object, attributes are merged like so:
``` ```
First we apply the **default attributes** from the referenced object. First we apply the **default attributes** from the referenced object.
> Here `duration` and `language` are applied. > Here `duration` and `language` are applied.
Then we apply the **children attributes** to every child. Then we apply the **children attributes** to every child.
> In this case we override every `duration` to 4800 and add the new `xp` attribute. > In this case we override every `duration` to 4800 and add the new `xp` attribute.
After that we apply the **relation attributes**, that are the most specific and as such, After that we apply the **relation attributes**, that are the most specific and as such,
override all others attributes. override all others attributes.
> In this case only the `printalphabet` relation had attributes and so we apply > In this case only the `printalphabet` relation had attributes and so we apply
the given `duration` to the final merged object. > the given `duration` to the final merged object.

49
docs/object-child-creation.md

@ -1,33 +1,40 @@
# Admin object's management - create a child object # Admin object's management - create a child object
## Usage ## Usage
> Objects of the Admin can be configured :
> * By setting particular **attributes** to the object Objects of the Admin can be configured :
> * By associating **children** to the object
> - By setting particular **attributes** to the object
> Children can be added, deleted, reordered in the list. Also, it's possible to configure it in a special way for the parent object, by setting children attributes for all the children. - By associating **children** to the object
>
> This documentation explains how to associate a child to a parent object. Children can be added, deleted, reordered in the list. Also, it's possible to configure it in a special way for the parent object, by setting children attributes for all the children.
This documentation explains how to associate a child to a parent object.
### Create a new object for your child in the admin ### Create a new object for your child in the admin
> Information is available for object's creation: [Modular step management](https://github.com/01-edu/public/blob/master/doc/object-creation.md)
> Information is available for object's creation: [Object Creation](object-creation.md)
### Add this new object as a child of your parent's object ### Add this new object as a child of your parent's object
#### 1. Edit the parent object #### 1. Edit the parent object
<img width="640" alt="Capture d’écran 2019-04-22 à 19 24 23" src="https://user-images.githubusercontent.com/35296671/56517407-cb98bc00-6534-11e9-98d6-a2b1c0193a38.png">
<img width="640" alt="Capture d’écran 2019-04-22 à 19 24 10" src="https://user-images.githubusercontent.com/35296671/56517421-d0f60680-6534-11e9-86ef-97fb9e59786e.png">
#### 2. Go to *Children* > *Add a child* <img width="640" alt="Capture d’écran 2019-04-22 à 19 24 23" src="img/56517407-cb98bc00-6534-11e9-98d6-a2b1c0193a38.png">
![add child to parent object](https://user-images.githubusercontent.com/35296671/56506977-de50c800-6517-11e9-9c71-d19a1ec4e5cd.png) <img width="640" alt="Capture d’écran 2019-04-22 à 19 24 10" src="img/56517421-d0f60680-6534-11e9-86ef-97fb9e59786e.png">
#### 2. Go to _Children_ > _Add a child_
![add-child-to-parent-object](img/add-child-to-parent-object.png)
#### 3. Set up the new child: #### 3. Set up the new child:
* Enter its name in the input "Add a child name"
* Select your step object in the select input - Enter its name in the input "Add a child name"
* Click on "ADD" - Select your step object in the select input
- Click on "ADD"
> Your step is then related to its parent. You can see it in the *Children* section of the parent's object. There, you can now:
> * Delete the child from its parent (the actual object of your child will not be deleted). Your step is then related to its parent. You can see it in the _Children_ section of the parent's object. There, you can now:
> * Reorder it in the children's list, by dragging it to the place you want.
> * Update its original settings by clicking on the eye icon of its reference (redirection to object edit page of the child). - Delete the child from its parent (the actual object of your child will not be deleted).
<img width="1229" alt="Capture d’écran 2019-04-22 à 19 51 12" src="https://user-images.githubusercontent.com/35296671/56518936-a1e19400-6538-11e9-81c7-520ffd365cff.png"> - Reorder it in the children's list, by dragging it to the place you want.
- Update its original settings by clicking on the eye icon of its reference (redirection to object edit page of the child).
<img width="1229" alt="Capture d’écran 2019-04-22 à 19 51 12" src="img/56518936-a1e19400-6538-11e9-81c7-520ffd365cff.png">

93
docs/object-creation.md

@ -1,53 +1,58 @@
# Admin object's management - create an object # Admin object's management - create an object
## Usage ## Usage
> Elements of the app are managed through objects in *Admin*.
> Objects of the Admin are first created and defined: Elements of the app are managed through objects in _Admin_.
> * By their **title**,
> * By their **type**.
> Then it can be configured through: Objects of the Admin are first created and defined:
> * Attributes,
> * Children. - By their **title**,
- By their **type**.
Then it can be configured through:
- Attributes,
- Children.
> This documentation explains how to create an object. > This documentation explains how to create an object.
### Create a new object in the admin ### Create a new object in the admin
> (in *Admin* > *Add new object*)
> (in _Admin_ > _Add new object_)
<img width="664" alt="Capture d’écran 2019-04-22 à 15 57 37" src="https://user-images.githubusercontent.com/35296671/56507169-6505a500-6518-11e9-89bb-04c7fd9b41ca.png">
<img width="450" alt="Capture d’écran 2019-04-22 à 15 58 21" src="https://user-images.githubusercontent.com/35296671/56507180-6afb8600-6518-11e9-97a5-4dcff8f0a069.png"> <img width="664" alt="Capture d’écran 2019-04-22 à 15 57 37" src="img/56507169-6505a500-6518-11e9-89bb-04c7fd9b41ca.png">
<img width="450" alt="Capture d’écran 2019-04-22 à 15 58 21" src="img/56507180-6afb8600-6518-11e9-97a5-4dcff8f0a069.png">
* The **title** of your object will be the title displayed to your candidates. Use an intellegible title for your user. - The **title** of your object will be the title displayed to your candidates. Use an intellegible title for your user.
> NB: you can always edit it in the *Admin*
> NB: you can always edit it in the _Admin_
* The **type** depends on the nature of your object:
* **Campus** is used to declare a school. - The **type** depends on the nature of your object:
* Examples: *Alem*, *Madeira*, etc. - **Campus** is used to declare a school.
* Campus can contains cursus: *Alem* contains for example *01-classical* and *Piscine Go*. - Examples: _Alem_, _Madeira_, etc.
* **Cursus** is used to declare a course. - Campus can contains cursus: _Alem_ contains for example _01-classical_ and _Piscine Go_.
* Examples: *01-classical*, *Piscine Go*, etc. - **Cursus** is used to declare a course.
* Cursuses can contains cursuses: the main cursus *01-classical*, for example, contains cursuses like *Piscine Go*, but also all the branches that the student have access to, as *Web*, *Security*, *Algorythm*, *Design*, etc. - Examples: _01-classical_, _Piscine Go_, etc.
* Cursuses can contains quests: *Piscine Go* of *01-classical* contains quests like *Quest 1* or *Quest 2*. - Cursuses can contains cursuses: the main cursus _01-classical_, for example, contains cursuses like _Piscine Go_, but also all the branches that the student have access to, as _Web_, _Security_, _Algorythm_, _Design_, etc.
* **Quest** is used to declare a project. - Cursuses can contains quests: _Piscine Go_ of _01-classical_ contains quests like _Quest 1_ or _Quest 2_.
* Examples: *Quest 1*, *Quest 2*, etc. - **Quest** is used to declare a project.
* Quest contains exercises: *Quest 1* of *Piscine Go* contains exercises like *printalphabet* or *printcomb*. - Examples: _Quest 1_, _Quest 2_, etc.
* Exercise is used to declare exercises - Quest contains exercises: _Quest 1_ of _Piscine Go_ contains exercises like _printalphabet_ or _printcomb_.
* Examples: *printalphabet*, *printcomb*, *atoi*, etc. - Exercise is used to declare exercises
* Exercises doesn't contains any children. - Examples: _printalphabet_, _printcomb_, _atoi_, etc.
* Signup is used to declare steps of the registration. - Exercises doesn't contains any children.
* Examples: *Using our services*, *Tell us more about you*, etc. - Signup is used to declare steps of the registration.
* One major object *Sign up* contains all the sign up's modular steps : *Using our services*, *Tell us more about you*, etc. - Examples: _Using our services_, _Tell us more about you_, etc.
* Onbaording is used to declare steps of the onbaording. - One major object _Sign up_ contains all the sign up's modular steps : _Using our services_, _Tell us more about you_, etc.
* Examples: *Toad*, *Administration*, *Additional Informations*, *Chart 01*, etc. - Onbaording is used to declare steps of the onbaording.
* Three main objects define the major steps of the onboarding : *Toad*, *Administration*, *Piscine*. - Examples: _Toad_, _Administration_, _Additional Informations_, _Chart 01_, etc.
* *Administration* contains modular steps: *Additional Informations*, *Chart 01*, etc. - Three main objects define the major steps of the onboarding : _Toad_, _Administration_, _Piscine_.
- _Administration_ contains modular steps: _Additional Informations_, _Chart 01_, etc.
> The child object is then available in the *Admin*. It can be found in the section of its type or thanks to the search bar of the cursus object's page.
The child object is then available in the _Admin_. It can be found in the section of its type or thanks to the search bar of the cursus object's page.
> More information is available:
> * for setting attributes of an object: (soon available) More information is available:
> * for setting children of an object: [Child object creation](https://github.com/01-edu/public/blob/master/doc/child-object-creation.md)
> * for creation of modular steps in Sign up and onboarding's Administration object: [Modular step management](https://github.com/01-edu/public/blob/master/doc/modular-steps-management.md) - for setting attributes of an object: (soon available)
- for setting children of an object: [Child object creation](object-child-creation.md)
- for creation of modular steps in Sign up and onboarding's Administration object: [Modular step management](modular-steps-management.md)

6
docs/object-edit.md

@ -4,7 +4,7 @@
## Page Composition ## Page Composition
![object-edit-overview](https://user-images.githubusercontent.com/15313830/56667480-ceff8500-66a5-11e9-98c7-792d598f2394.png) ![object-edit-overview](img/object-edit-overview.png)
### Pin 1 ### Pin 1
@ -28,7 +28,7 @@
- Object Children edition area ; - Object Children edition area ;
- Children Attributes edition area, these attributes impact and overload all the following children. Works the same way as standard attributes ; - Children Attributes edition area, these attributes impact and overload all the following children. Works the same way as standard attributes ;
- Add a child, allows to add a child to the children list, more information here -> [Object Child creation](https://github.com/01-edu/public/blob/master/doc/object-child-creation.md) ; - Add a child, allows to add a child to the children list, more information here -> [Object Child creation](object-child-creation.md) ;
- Children List, allows you to reorganise, delete and edit child. Each child can be overload with its own attributes, the edition works the same way as the original attributes ; - Children List, allows you to reorganise, delete and edit child. Each child can be overload with its own attributes, the edition works the same way as the original attributes ;
More informations about attribute overload system [here] ((https://github.com/01-edu/public/blob/master/doc/object-attribute-overload-system.md) More informations about attribute overload system [here](object-attribute-system.md)

4
docs/objects.md

@ -22,8 +22,8 @@ This is the minimal structure of an object:
To access your Objects, go to the admin dashboard and then click on the _manage object_ link within the "Object" card. To access your Objects, go to the admin dashboard and then click on the _manage object_ link within the "Object" card.
![go-to-objects](https://user-images.githubusercontent.com/15313830/56653756-46bdb780-6686-11e9-98ba-18e382987e9c.png) ![go-to-objects](img/go-to-objects.png)
Objects are sorted by type in different sections. This page offer a search bar that allow you query the objects by name. In the top-right corner, click the _add a new object_ button to create a new object. Fill a name, select a type and click _create_ to validate your creation. You will be redirected to the Object Edition page (document is here). Objects are sorted by type in different sections. This page offer a search bar that allow you query the objects by name. In the top-right corner, click the _add a new object_ button to create a new object. Fill a name, select a type and click _create_ to validate your creation. You will be redirected to the Object Edition page (document is here).
![all-object-page](https://user-images.githubusercontent.com/15313830/56654475-137c2800-6688-11e9-880b-75092397890d.png) ![all-object-page](img/all-object-page.png)

30
docs/os-deployment.md

@ -0,0 +1,30 @@
# OS Deployment
## Image creation steps
- [Installation of Ubuntu](ubuntu-installation.md)
- minimal OS installation (downloads ~200 MB)
- Software installation (downloads ~900 MB)
- Optimization
- improve speed
- reduce image size
- reduce power (CPU) & memory usage
- reduce surface of attack
- reduce bandwidth usage
- Customization
- machine-dependent (drivers, bug workarounds...)
- time zone of the school
- school scripts
- Cleaning
- logs
- temporary files
- histories
- caches
- auto-generated IDs
- Preparation of the disk image
- zero unallocated space of filesystem (~7 GB of data remains)
- (optional) create compressed image with [lz4](https://lz4.github.io/lz4) (the resulting image is ~3.2 GB)
## Network installation
- Boot through PXE [UDPcast](http://udpcast.linux.lu) which allows an efficient transfer of the disk image (using multicast or broadcast)

10
docs/piscine-go-curriculum.md

@ -12,11 +12,11 @@ Notions: basic usage and interaction with a command line terminal.
Videos: Videos:
- 1-2 Curl with the GitHub api and Example of Sh file | https://www.youtube.com/watch?v=A0Mqc215igw - 1-2 `curl` with the GitHub api and Example of shell file | https://www.youtube.com/watch?v=A0Mqc215igw
- 1-3 Touch , Chmod and Echo | https://www.youtube.com/watch?v=21h-vsuXgDU - 1-3 `touch`, `chmod` and `echo` | https://www.youtube.com/watch?v=21h-vsuXgDU
- 1-4 find and grep | https://www.youtube.com/watch?v=7a1JSWHhJlM - 1-4 `find` and `grep` | https://www.youtube.com/watch?v=7a1JSWHhJlM
- 1-5 cut sed and tr | https://www.youtube.com/watch?v=Nil7rVP3eMI - 1-5 `cut`, `sed` and `tr` | https://www.youtube.com/watch?v=Nil7rVP3eMI
- 1-6 jq and wc | https://www.youtube.com/watch?v=cQmcaOseuiA& - 1-6 `jq` and `wc` | https://www.youtube.com/watch?v=cQmcaOseuiA&
Exercices: Exercices:

37
docs/principles.md

@ -0,0 +1,37 @@
# Principles
## Make a simple system (less complexity)
Rationale :
- Reduce the number of potential bugs and problems
- The remaining bugs will be easier to identify/isolate & fix
- Easier maintenance
- Lower human capital required
## Limit security & filtering mechanisms
Especially during the launch, rationale :
- Reduce complexity (see above)
- Alem is a school, not a bank, so the security requirements are lower
- Some students will be able to bypass security systems in all cases
- And they will spread the word quickly
- The only reliable way to identify students will be security cameras and staff attention
- Students will share accounts and USB drives
- They will open connections to the outside and there is no definitive way to prevent this
- We will "hire" the students who have found vulnerabilities using technical skills and creativity
- We cannot anticipate every breach hundreds of students will find & exploit
- Focus on endpoint security rather than network security (firewall on each node)
- Reduce complexity of the network and make it more flexible
## Promote open, neutral network & technologies
Rationale :
- Students will spend more time learning things and exchanging ideas than bypassing censorship
- Students will have more extensive knowledge and skills
- It is better to make them aware of their situation than to try to stop them
- A student's motivation is very much influenced by his or her environment
- An environment with limitations will limit the spectrum of things that stimulate the student's curiosity
- A focus will made on increasing student's empowerement in order to make them feel accountable for their own actions. If the student cheats, he has to understand that he is only hindering his own progress.

31
docs/responsibilities.md

@ -0,0 +1,31 @@
# Responsibilities
## Alem
- Hardware
- Maintenance & replacement of parts
- HP machines
- Inventory (associates MAC address or other ID to the physical location of the machine)
- [BIOS configuration](bios-configuration.md)
- Connected on Ethernet network
- Audio & USB extension cables (to protect the PC ports)
- Computers & cables are physically attached to the table (to prevent stealing or damage)
- Monitor brightness (the default might be too high and it cannot be controlled by software)
- Server (virtualized with at least these dedicated resources)
- CPU : 8 threads
- RAM : 64 GB
- SSD : 512 GB
- NIC : pass-through or bridged ? (see with Vitalii)
- Software
- DHCP
- DNS
- PXE
- Image creation & deployment (with the help of team 01)
## 01
- Software maintenance
- Implement the features requested or identified at the Alem School
- Bug fix
- Technical advice
- Pedagogical support

11
docs/tasks.md

@ -0,0 +1,11 @@
# Tasks
- [x] Install, connect, check the server and the HP clients (_Alem_, _Vitalii_)
- [x] Check the settings of the virtual machine (_01_, _Vitalii_)
- [x] Install the server (_01_, _Vitalii_)
- [x] Tests & benchmark of the server (_01_)
- [x] Test the [OS deployment](https://github.com/01-edu/public/blob/master/docs/os-deployment.md) (_01_, _Vitalii_)
- [ ] Write process documentation (_01_, _Alem_, _Vitalii_)
- [ ] Ensure the tester only works inside the school (_01_, _Alem_)
- [ ] Ensure the exam app works as expected (_01_, _Alem_)
- [ ] Test the entire piscine (_01_, _Alem_)

67
docs/ubuntu-installation.md

@ -6,20 +6,18 @@ Download and boot the [last Ubuntu release](http://releases.ubuntu.com/19.04/ubu
Follow the steps : Follow the steps :
![img1](img/1.png) ![img1](img/ubuntu-installation/1.png)
![img2](img/2.png) ![img2](img/ubuntu-installation/2.png)
![img3](img/3.png) ![img3](img/ubuntu-installation/3.png)
The partitioning is : The partitioning is :
1) 256 MB : EFI partition 1. 256 MB : EFI partition
2) 20 GB : system partition 2. 20 GB : system partition
3) 32 GB : unused partition (will be used later)
4) rest : unused partition (will be used later)
![img4](img/4.png) ![img4](img/ubuntu-installation/4.png)
![img5](img/5.png) ![img5](img/ubuntu-installation/5.png)
![img6](img/6.png) ![img6](img/ubuntu-installation/6.png)
Remove the installation disk and then reboot. Remove the installation disk and then reboot.
@ -27,43 +25,42 @@ Skip the welcoming window.
Don't install updates if Ubuntu asks to. The scripts will. Don't install updates if Ubuntu asks to. The scripts will.
Start the disk utility to name partitions so that OverlayFS can identify them. ## OS customization
3) 32 GB - **Partition 3** : `01-tmp-home` You can overwrite the files of the folder `system` by setting an environment variable named `OVERWRITE` with the format : `Destination folder;Git URL`.
4) rest - **Partition 4** : `01-tmp-system`
The same procedure is required to make USB disk usable for the students, the partition name must be : `01-home` For example to write the content of the repository [github.com/xpetit/custom](https://github.com/xpetit/custom) in the system folder :
![img7](img/7.png) ```shell
![img8](img/8.png) export OVERWRITE='.;https://github.com/xpetit/custom.git'
![img9](img/9.png) ```
## OS configuration ## OS configuration
Run a terminal and type these commands :
```shell ```shell
student@tmp-hostname:~$ wget github.com/01-edu/public/archive/master.zip unset HISTFILE
student@tmp-hostname:~$ unzip master.zip sudo apt-get -y install curl
student@tmp-hostname:~$ cd public-master/scripts bash <(curl -sSL raw.githubusercontent.com/01-edu/public/master/scripts/kickstart.sh)
student@tmp-hostname:~$ sudo ./install_client.sh
[...]
Ask for student user password (will be removed later)
[...]
Ask to set the root password
[...]
Long installation/configuration process
[...]
student@tmp-hostname:~$ cat dconfig.txt | dconf load /
student@tmp-hostname:~$ reboot
``` ```
The script will ask for student user password (which will be deleted after) and then after a long configuration process it will restart the computer.
The system is now read-only, every data is written to a temporary partition. The system is now read-only, every data is written to a temporary partition.
The session is password-less. The session is password-less.
To gain a superuser terminal with read/write access to the filesystem, type these commands: To gain a superuser terminal, use SSH :
```shell ```console
student@tmp-hostname:~$ su - user@remote:~$ ssh -p521 root@IP_ADDRESS
Password: ```
root@tmp-hostname:~# overlayroot-chroot
To gain access with read/write access to the filesystem, use this command :
```console
root@ubuntu:~# overlayroot-chroot
INFO: Chrooting into [/media/root-ro]
root@ubuntu:/#
``` ```

24
docs/usb-configuration.md

@ -2,45 +2,43 @@
Requirements : Requirements :
1) 32 GB 1. 32 GB
3) interface type: 3.0 2. interface type: 3.0
Follow the steps : Follow the steps :
> Execute the "disks" program > Execute the "disks" program
![img1](img/usb/1.png) ![img1](img/usb-configuration/1.png)
> Choose the usb drive to configure and press format disk > Choose the usb drive to configure and press format disk
![img2](img/usb/2.png) ![img2](img/usb-configuration/2.png)
> Choose "Compatible with modern systems and hard disks > 2TB(GPT)" > Choose "Compatible with modern systems and hard disks > 2TB(GPT)"
![img3](img/usb/3.png) ![img3](img/usb-configuration/3.png)
![img4](img/usb/4.png) ![img4](img/usb-configuration/4.png)
> Create new partition (size == all memory) > Create new partition (size == all memory)
![img5](img/usb/5.png) ![img5](img/usb-configuration/5.png)
> Volume name: any > Volume name: any
> Erase: none > Erase: none
> Type: other > Type: other
![img6](img/usb/6.png) ![img6](img/usb-configuration/6.png)
> Choose F2FS > Choose F2FS
![img7](img/usb/7.png) ![img7](img/usb-configuration/7.png)
> Format created partition > Format created partition
![img8](img/usb/8.png) ![img8](img/usb-configuration/8.png)
> The new name must be 01-home > The new name must be 01-home
![img9](img/usb/9.png) ![img9](img/usb-configuration/9.png)

1
scripts/dconfig.txt

@ -67,6 +67,7 @@ default-size-columns=160
[org/gnome/desktop/background] [org/gnome/desktop/background]
show-desktop-icons=false show-desktop-icons=false
picture-uri='file:///usr/share/backgrounds/01/wallpaper.png'
[org/gnome/desktop/peripherals/mouse] [org/gnome/desktop/peripherals/mouse]
accel-profile='flat' accel-profile='flat'

2
scripts/grub.sh

@ -8,8 +8,6 @@ cd $SCRIPT_DIR
DISK=$1 DISK=$1
apt-get -y install grub-efi-amd64
sed -i -e 's/message=/message_null=/g' /etc/grub.d/10_linux sed -i -e 's/message=/message_null=/g' /etc/grub.d/10_linux
cat <<EOF>> /etc/default/grub cat <<EOF>> /etc/default/grub

60
scripts/install_client.sh

@ -9,13 +9,6 @@ SCRIPT_DIR="$(cd -P "$(dirname "$BASH_SOURCE")" && pwd)"
cd $SCRIPT_DIR cd $SCRIPT_DIR
. set.sh . set.sh
# Set root password
passwd root
# Remove user password
passwd -d student
cp /etc/shadow /etc/shadow-
SSH_PORT=521 SSH_PORT=521
DISK=$(lsblk -o tran,kname,hotplug,type,fstype -pr | DISK=$(lsblk -o tran,kname,hotplug,type,fstype -pr |
grep -e nvme -e sata | grep -e nvme -e sata |
@ -24,10 +17,26 @@ DISK=$(lsblk -o tran,kname,hotplug,type,fstype -pr |
sort | sort |
head -n1) head -n1)
systemctl stop unattended-upgrades.service
sgdisk -n0:0:+32G "$DISK"
sgdisk -N0 "$DISK"
sgdisk -c3:01-tmp-home "$DISK"
sgdisk -c4:01-tmp-system "$DISK"
apt-get update apt-get update
apt-get -y upgrade apt-get -y upgrade
apt-get -y autoremove --purge apt-get -y autoremove --purge
# Remove outdated kernels
old_kernels=$(ls -1 /boot/config-* | sed '$d' | xargs -n1 basename | cut -d- -f2,3)
for old_kernel in $old_kernels; do
dpkg -P $(dpkg-query -f '${binary:Package}\n' -W *"$old_kernel"*)
done
apt-get -yf install
. bash_tweaks.sh . bash_tweaks.sh
. ssh.sh . ssh.sh
. firewall.sh . firewall.sh
@ -61,20 +70,51 @@ rm /usr/share/initramfs-tools/hooks/fsck
cp -r system /tmp cp -r system /tmp
cd /tmp/system cd /tmp/system
sed -i -e "s|::DISK::|$DISK|g" etc/udev/rules.d/10-local.rules
apt-get -y install overlayroot # Overwrite with custom files from Git repository
echo overlayroot=\"device:dev=/dev/disk/by-partlabel/01-tmp-system,recurse=0\" >> /etc/overlayroot.conf if test -v OVERWRITE; then
folder=$(echo "$OVERWRITE" | cut -d';' -f1)
url=$(echo "$OVERWRITE" | cut -d';' -f2)
if git ls-remote -q "$url" &>/dev/null; then
tmp=$(mktemp -d)
git clone --depth 1 "$url" "$tmp"
rm -rf "$tmp"/.git
cp -aT "$tmp" "$folder"
rm -rf "$tmp"
fi
fi
# Fix permissions # Fix permissions
find . -type d -exec chmod 755 {} \; find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \; find . -type f -exec chmod 644 {} \;
find . -type f -exec /bin/sh -c "file {} | grep -q 'shell script' && chmod +x {}" \; find . -type f -exec /bin/sh -c "file {} | grep -q 'shell script' && chmod +x {}" \;
find . -type f -exec /bin/sh -c "file {} | grep -q 'public key' && chmod 400 {}" \;
sed -i -e "s|::DISK::|$DISK|g" etc/udev/rules.d/10-local.rules
# Generate wallpaper
cd usr/share/backgrounds/01
test ! -e wallpaper.png && composite logo.png background.png wallpaper.png
cd /tmp/system
cp --preserve=mode -RT . / cp --preserve=mode -RT . /
cd $SCRIPT_DIR cd $SCRIPT_DIR
rm -rf /tmp/system rm -rf /tmp/system
apt-get -y install overlayroot
echo overlayroot=\"device:dev=/dev/disk/by-partlabel/01-tmp-system,recurse=0\" >> /etc/overlayroot.conf
update-initramfs -u update-initramfs -u
# Remove root & user password
passwd -d root
passwd -d student
cp /etc/shadow /etc/shadow-
# Remove user abilities
gpasswd -d student sudo
gpasswd -d student lpadmin
gpasswd -d student sambashare
. clean.sh . clean.sh

48
scripts/kickstart.sh

@ -0,0 +1,48 @@
#!/usr/bin/env bash
# Run me with:
#
# bash <(curl -Ss raw.githubusercontent.com/01-edu/public/master/scripts/kickstart.sh)
# Treat unset variables as an error when substituting.
set -u
# Exit immediately if a command exits with a non-zero status.
set -e
# Set the variable corresponding to the return value of a pipeline is the status
# of the last command to exit with a non-zero status, or zero if no command
# exited with a non-zero status
set -o pipefail
# Separate tokens on newlines only
IFS='
'
# The value of this parameter is expanded like PS1 and the expanded value is the
# prompt printed before the command line is echoed when the -x option is set
# (see The Set Builtin). The first character of the expanded value is replicated
# multiple times, as necessary, to indicate multiple levels of indirection.
# \D{%F %T} prints date like this : 2019-12-31 23:59:59
PS4='-\D{%F %T} '
# Print commands and their arguments as they are executed.
set -x
# Skip dialogs during apt-get install commands
export DEBIAN_FRONTEND=noninteractive # DEBIAN_PRIORITY=critical
gsettings set org.gnome.desktop.session idle-delay 0
gsettings set org.gnome.desktop.screensaver lock-enabled false
cd
wget github.com/01-edu/public/archive/master.zip
unzip master.zip
cd public-master/scripts
sudo -E ./install_client.sh
cat dconfig.txt | dconf load /
cd
rm -rf master.zip public-master
reboot

2
scripts/nodejs.sh

@ -6,5 +6,5 @@ SCRIPT_DIR="$(cd -P "$(dirname "$BASH_SOURCE")" && pwd)"
cd $SCRIPT_DIR cd $SCRIPT_DIR
. set.sh . set.sh
curl -sL https://deb.nodesource.com/setup_10.x | bash - curl -sL https://deb.nodesource.com/setup_12.x | bash -
apt-get -y install nodejs apt-get -y install nodejs

21
scripts/preseed.cfg

@ -0,0 +1,21 @@
# d-i debconf/priority select critical
d-i anna/choose_modules string network-console
d-i preseed/early_command string anna-install network-console
d-i network-console/authorized_keys_url string https://raw.githubusercontent.com/xpetit/.ssh/master/id_ed25519.pub
d-i network-console/password-disabled boolean true
d-i debian-installer/locale string en_US
d-i console-keymaps-at/keymap select us
d-i keyboard-configuration/xkb-keymap select us
d-i mirror/country string manual
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
#d-i netcfg/choose_interface select auto
#d-i netcfg/get_hostname string debian
#d-i netcfg/get_domain string local
d-i hw-detect/load_firmware boolean true

7
scripts/ssh.sh

@ -16,10 +16,3 @@ Port $SSH_PORT
PasswordAuthentication no PasswordAuthentication no
AllowUsers root AllowUsers root
EOF EOF
mkdir -p /root/.ssh
chmod -f 700 /root/.ssh
# echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH30lZP4V26RVWWvAW91jM7UBSN68+xkuJc5cRionpMc' >> /root/.ssh/authorized_keys
chmod -f 600 /root/.ssh/authorized_keys || true
systemctl restart sshd.service

2
scripts/system/etc/gdm3/PostLogin/Default

@ -40,7 +40,7 @@ else
mount -o noatime,nobarrier /dev/disk/by-partlabel/01-tmp-home /mnt mount -o noatime,nobarrier /dev/disk/by-partlabel/01-tmp-home /mnt
fi fi
user_path=/mnt/.01/"$USER" user_path=/mnt/.01/user
temp_path=/mnt/.01/tmp temp_path=/mnt/.01/tmp
mkdir -p "$user_path" "$temp_path" mkdir -p "$user_path" "$temp_path"

4
scripts/system/etc/gdm3/PostSession/Default

@ -16,11 +16,11 @@ PS4='-\D{%F %T} '
# Print commands and their arguments as they are executed. # Print commands and their arguments as they are executed.
set -x set -x
passwd -d $USER passwd -d "$USER" ||:
systemctl stop user@1000.service systemctl stop user@1000.service
# Make sure the mountpoints are free # Make sure the mountpoints are free
kill $(lsof -t "$HOME" /mnt) $(ps --no-headers -u student -o pid) kill $(lsof -t "$HOME" /mnt) $(ps --no-headers -u "$USER" -o pid)
umount "$HOME" /mnt umount "$HOME" /mnt
umount /dev/disk/by-partlabel/01-home ||: umount /dev/disk/by-partlabel/01-home ||:
wipefs -a /dev/disk/by-partlabel/01-tmp-home wipefs -a /dev/disk/by-partlabel/01-tmp-home

BIN
scripts/system/usr/share/backgrounds/01/background.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 249 KiB

BIN
scripts/system/usr/share/backgrounds/01/logo.png

diff.bin_not_shown

After

Width:  |  Height:  |  Size: 8.6 KiB

9
scripts/ubuntu_tweaks.sh

@ -39,13 +39,6 @@ swapoff /swapfile || true
rm -f /swapfile rm -f /swapfile
sed -i '/swapfile/d' /etc/fstab sed -i '/swapfile/d' /etc/fstab
# Network configuration
interface=$(ip route get 1.1.1.1 | head -1 | cut -d' ' -f5)
cat <<EOF>> /etc/network/interfaces
allow-hotplug $interface
iface $interface inet dhcp
EOF
# Purge unused Ubuntu packages # Purge unused Ubuntu packages
PKGS=" PKGS="
@ -62,7 +55,6 @@ gnome-power-manager
gnome-software gnome-software
gnome-software-common gnome-software-common
memtest86+ memtest86+
network-manager*
orca orca
popularity-contest popularity-contest
python3-update-manager python3-update-manager
@ -112,6 +104,7 @@ gnome-calculator
gnome-system-monitor gnome-system-monitor
gnome-tweaks gnome-tweaks
i3lock i3lock
imagemagick
mpv mpv
zenity zenity
" "

6
subjects/abort.en.md

@ -33,8 +33,8 @@ func main() {
And its output : And its output :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
5 5
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/abort.fr.md

@ -33,8 +33,8 @@ func main() {
Et son résultat : Et son résultat :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
5 5
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/activebits.en.md

@ -33,8 +33,8 @@ func main() {
And its output : And its output :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
3 3
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/activebits.fr.md

@ -33,8 +33,8 @@ func main() {
Et son résultat : Et son résultat :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
3 3
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

10
subjects/addprimesum.en.md

@ -9,12 +9,12 @@ Write a program that takes a positive integer as argument and displays the sum o
### Usage ### Usage
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test 5 student@ubuntu:~/piscine-go/test$ ./test 5
10 10
student@ubuntu:~/piscine/test$ ./test 7 student@ubuntu:~/piscine-go/test$ ./test 7
17 17
student@ubuntu:~/piscine/test$ ./test 57 student@ubuntu:~/piscine-go/test$ ./test 57
0 0
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

10
subjects/addprimesum.fr.md

@ -9,12 +9,12 @@
### Utilisation ### Utilisation
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test 5 student@ubuntu:~/piscine-go/test$ ./test 5
10 10
student@ubuntu:~/piscine/test$ ./test 7 student@ubuntu:~/piscine-go/test$ ./test 7
17 17
student@ubuntu:~/piscine/test$ ./test 57 student@ubuntu:~/piscine-go/test$ ./test 57
0 0
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/advancedsortwordarr.en.md

@ -35,8 +35,8 @@ func main() {
And its output : And its output :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
[1 2 3 A B C a b c] [1 2 3 A B C a b c]
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/advancedsortwordarr.fr.md

@ -35,8 +35,8 @@ func main() {
Et son résultat : Et son résultat :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
[1 2 3 A B C a b c] [1 2 3 A B C a b c]
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/any.en.md

@ -40,9 +40,9 @@ func main() {
And its output : And its output :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
false false
true true
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/any.fr.md

@ -40,9 +40,9 @@ func main() {
Et son résultat : Et son résultat :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
false false
true true
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/appendrange.en.md

@ -40,9 +40,9 @@ func main() {
And its output : And its output :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
[5 6 7 8 9] [5 6 7 8 9]
[] []
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/appendrange.fr.md

@ -39,9 +39,9 @@ func main() {
Et son résultat : Et son résultat :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
[5 6 7 8 9] [5 6 7 8 9]
[] []
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/atoi.en.md

@ -63,8 +63,8 @@ func main() {
And its output : And its output :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
12345 12345
12345 12345
0 0
@ -73,5 +73,5 @@ student@ubuntu:~/piscine/test$ ./test
-1234 -1234
0 0
0 0
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/atoi.fr.md

@ -63,8 +63,8 @@ func main() {
Et son résultat : Et son résultat :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
12345 12345
12345 12345
0 0
@ -73,5 +73,5 @@ student@ubuntu:~/piscine/test$ ./test
-1234 -1234
0 0
0 0
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/atoibase.en.md

@ -48,12 +48,12 @@ func main() {
And its output : And its output :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
125 125
125 125
125 125
125 125
0 0
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/atoibase.fr.md

@ -48,12 +48,12 @@ func main() {
Et son résultat : Et son résultat :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
125 125
125 125
125 125
125 125
0 0
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/basicatoi.en.md

@ -48,10 +48,10 @@ func main() {
And its output : And its output :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
12345 12345
12345 12345
0 0
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/basicatoi.fr.md

@ -48,10 +48,10 @@ func main() {
Et son résultat : Et son résultat :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
12345 12345
12345 12345
0 0
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/basicatoi2.en.md

@ -52,11 +52,11 @@ func main() {
And its output : And its output :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
12345 12345
12345 12345
0 0
0 0
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/basicatoi2.fr.md

@ -52,11 +52,11 @@ func main() {
Et son résultat : Et son résultat :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
12345 12345
12345 12345
0 0
0 0
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/basicjoin.en.md

@ -33,8 +33,8 @@ func main() {
And its output : And its output :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
Hello! How are you? Hello! How are you?
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/basicjoin.fr.md

@ -33,8 +33,8 @@ func main() {
Et son résultat : Et son résultat :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
Hello! How are you? Hello! How are you?
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

2
subjects/btreeapplybylevel.en.md

@ -7,7 +7,7 @@ Write a function, `BTreeApplyByLevel`, that applies the function given by `fn` t
### Expected function ### Expected function
```go ```go
func BTreeApplyByLevel(root *TreeNode, fn interface{}) { func BTreeApplyByLevel(root *TreeNode, f func(...interface{}) (int, error)) {
} }
``` ```

6
subjects/btreeapplyinorder.en.md

@ -38,11 +38,11 @@ func main() {
And its output : And its output :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
1 1
4 4
5 5
7 7
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/btreeapplyinorder.fr.md

@ -38,11 +38,11 @@ func main() {
Et son résultat : Et son résultat :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
1 1
4 4
5 5
7 7
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/btreeapplypostorder.en.md

@ -37,11 +37,11 @@ func main() {
And its output : And its output :
```console ```console
student@ubuntu:~/piscine/test$ go build student@ubuntu:~/piscine-go/test$ go build
student@ubuntu:~/piscine/test$ ./test student@ubuntu:~/piscine-go/test$ ./test
1 1
5 5
7 7
4 4
student@ubuntu:~/piscine/test$ student@ubuntu:~/piscine-go/test$
``` ```

6
subjects/btreeapplypostorder.fr.md

@ -37,11 +37,11 @@ func main() {
Et son résultat : Et son résultat :
```console ```console
student@ubuntu:~/piscine/btreeinsertdata$ go build student@ubuntu:~/piscine-go/btreeinsertdata$ go build
student@ubuntu:~/piscine/btreeinsertdata$ ./btreeinsertdata student@ubuntu:~/piscine-go/btreeinsertdata$ ./btreeinsertdata
1 1
5 5
7 7
4 4
student@ubuntu:~/piscine/btreeinsertdata$ student@ubuntu:~/piscine-go/btreeinsertdata$
``` ```

Some files were not shown because too many files changed in this diff diff.show_more

Loading…
Cancel
Save