Restart repo
445
LICENSE.md
Normal file
@@ -0,0 +1,445 @@
|
|||||||
|
# GNU Free Documentation License
|
||||||
|
|
||||||
|
Version 1.3, 3 November 2008
|
||||||
|
|
||||||
|
Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation,
|
||||||
|
Inc. <https://fsf.org/>
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies of this
|
||||||
|
license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
#### 0. PREAMBLE
|
||||||
|
|
||||||
|
The purpose of this License is to make a manual, textbook, or other
|
||||||
|
functional and useful document "free" in the sense of freedom: to
|
||||||
|
assure everyone the effective freedom to copy and redistribute it,
|
||||||
|
with or without modifying it, either commercially or noncommercially.
|
||||||
|
Secondarily, this License preserves for the author and publisher a way
|
||||||
|
to get credit for their work, while not being considered responsible
|
||||||
|
for modifications made by others.
|
||||||
|
|
||||||
|
This License is a kind of "copyleft", which means that derivative
|
||||||
|
works of the document must themselves be free in the same sense. It
|
||||||
|
complements the GNU General Public License, which is a copyleft
|
||||||
|
license designed for free software.
|
||||||
|
|
||||||
|
We have designed this License in order to use it for manuals for free
|
||||||
|
software, because free software needs free documentation: a free
|
||||||
|
program should come with manuals providing the same freedoms that the
|
||||||
|
software does. But this License is not limited to software manuals; it
|
||||||
|
can be used for any textual work, regardless of subject matter or
|
||||||
|
whether it is published as a printed book. We recommend this License
|
||||||
|
principally for works whose purpose is instruction or reference.
|
||||||
|
|
||||||
|
#### 1. APPLICABILITY AND DEFINITIONS
|
||||||
|
|
||||||
|
This License applies to any manual or other work, in any medium, that
|
||||||
|
contains a notice placed by the copyright holder saying it can be
|
||||||
|
distributed under the terms of this License. Such a notice grants a
|
||||||
|
world-wide, royalty-free license, unlimited in duration, to use that
|
||||||
|
work under the conditions stated herein. The "Document", below, refers
|
||||||
|
to any such manual or work. Any member of the public is a licensee,
|
||||||
|
and is addressed as "you". You accept the license if you copy, modify
|
||||||
|
or distribute the work in a way requiring permission under copyright
|
||||||
|
law.
|
||||||
|
|
||||||
|
A "Modified Version" of the Document means any work containing the
|
||||||
|
Document or a portion of it, either copied verbatim, or with
|
||||||
|
modifications and/or translated into another language.
|
||||||
|
|
||||||
|
A "Secondary Section" is a named appendix or a front-matter section of
|
||||||
|
the Document that deals exclusively with the relationship of the
|
||||||
|
publishers or authors of the Document to the Document's overall
|
||||||
|
subject (or to related matters) and contains nothing that could fall
|
||||||
|
directly within that overall subject. (Thus, if the Document is in
|
||||||
|
part a textbook of mathematics, a Secondary Section may not explain
|
||||||
|
any mathematics.) The relationship could be a matter of historical
|
||||||
|
connection with the subject or with related matters, or of legal,
|
||||||
|
commercial, philosophical, ethical or political position regarding
|
||||||
|
them.
|
||||||
|
|
||||||
|
The "Invariant Sections" are certain Secondary Sections whose titles
|
||||||
|
are designated, as being those of Invariant Sections, in the notice
|
||||||
|
that says that the Document is released under this License. If a
|
||||||
|
section does not fit the above definition of Secondary then it is not
|
||||||
|
allowed to be designated as Invariant. The Document may contain zero
|
||||||
|
Invariant Sections. If the Document does not identify any Invariant
|
||||||
|
Sections then there are none.
|
||||||
|
|
||||||
|
The "Cover Texts" are certain short passages of text that are listed,
|
||||||
|
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
|
||||||
|
the Document is released under this License. A Front-Cover Text may be
|
||||||
|
at most 5 words, and a Back-Cover Text may be at most 25 words.
|
||||||
|
|
||||||
|
A "Transparent" copy of the Document means a machine-readable copy,
|
||||||
|
represented in a format whose specification is available to the
|
||||||
|
general public, that is suitable for revising the document
|
||||||
|
straightforwardly with generic text editors or (for images composed of
|
||||||
|
pixels) generic paint programs or (for drawings) some widely available
|
||||||
|
drawing editor, and that is suitable for input to text formatters or
|
||||||
|
for automatic translation to a variety of formats suitable for input
|
||||||
|
to text formatters. A copy made in an otherwise Transparent file
|
||||||
|
format whose markup, or absence of markup, has been arranged to thwart
|
||||||
|
or discourage subsequent modification by readers is not Transparent.
|
||||||
|
An image format is not Transparent if used for any substantial amount
|
||||||
|
of text. A copy that is not "Transparent" is called "Opaque".
|
||||||
|
|
||||||
|
Examples of suitable formats for Transparent copies include plain
|
||||||
|
ASCII without markup, Texinfo input format, LaTeX input format, SGML
|
||||||
|
or XML using a publicly available DTD, and standard-conforming simple
|
||||||
|
HTML, PostScript or PDF designed for human modification. Examples of
|
||||||
|
transparent image formats include PNG, XCF and JPG. Opaque formats
|
||||||
|
include proprietary formats that can be read and edited only by
|
||||||
|
proprietary word processors, SGML or XML for which the DTD and/or
|
||||||
|
processing tools are not generally available, and the
|
||||||
|
machine-generated HTML, PostScript or PDF produced by some word
|
||||||
|
processors for output purposes only.
|
||||||
|
|
||||||
|
The "Title Page" means, for a printed book, the title page itself,
|
||||||
|
plus such following pages as are needed to hold, legibly, the material
|
||||||
|
this License requires to appear in the title page. For works in
|
||||||
|
formats which do not have any title page as such, "Title Page" means
|
||||||
|
the text near the most prominent appearance of the work's title,
|
||||||
|
preceding the beginning of the body of the text.
|
||||||
|
|
||||||
|
The "publisher" means any person or entity that distributes copies of
|
||||||
|
the Document to the public.
|
||||||
|
|
||||||
|
A section "Entitled XYZ" means a named subunit of the Document whose
|
||||||
|
title either is precisely XYZ or contains XYZ in parentheses following
|
||||||
|
text that translates XYZ in another language. (Here XYZ stands for a
|
||||||
|
specific section name mentioned below, such as "Acknowledgements",
|
||||||
|
"Dedications", "Endorsements", or "History".) To "Preserve the Title"
|
||||||
|
of such a section when you modify the Document means that it remains a
|
||||||
|
section "Entitled XYZ" according to this definition.
|
||||||
|
|
||||||
|
The Document may include Warranty Disclaimers next to the notice which
|
||||||
|
states that this License applies to the Document. These Warranty
|
||||||
|
Disclaimers are considered to be included by reference in this
|
||||||
|
License, but only as regards disclaiming warranties: any other
|
||||||
|
implication that these Warranty Disclaimers may have is void and has
|
||||||
|
no effect on the meaning of this License.
|
||||||
|
|
||||||
|
#### 2. VERBATIM COPYING
|
||||||
|
|
||||||
|
You may copy and distribute the Document in any medium, either
|
||||||
|
commercially or noncommercially, provided that this License, the
|
||||||
|
copyright notices, and the license notice saying this License applies
|
||||||
|
to the Document are reproduced in all copies, and that you add no
|
||||||
|
other conditions whatsoever to those of this License. You may not use
|
||||||
|
technical measures to obstruct or control the reading or further
|
||||||
|
copying of the copies you make or distribute. However, you may accept
|
||||||
|
compensation in exchange for copies. If you distribute a large enough
|
||||||
|
number of copies you must also follow the conditions in section 3.
|
||||||
|
|
||||||
|
You may also lend copies, under the same conditions stated above, and
|
||||||
|
you may publicly display copies.
|
||||||
|
|
||||||
|
#### 3. COPYING IN QUANTITY
|
||||||
|
|
||||||
|
If you publish printed copies (or copies in media that commonly have
|
||||||
|
printed covers) of the Document, numbering more than 100, and the
|
||||||
|
Document's license notice requires Cover Texts, you must enclose the
|
||||||
|
copies in covers that carry, clearly and legibly, all these Cover
|
||||||
|
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
|
||||||
|
the back cover. Both covers must also clearly and legibly identify you
|
||||||
|
as the publisher of these copies. The front cover must present the
|
||||||
|
full title with all words of the title equally prominent and visible.
|
||||||
|
You may add other material on the covers in addition. Copying with
|
||||||
|
changes limited to the covers, as long as they preserve the title of
|
||||||
|
the Document and satisfy these conditions, can be treated as verbatim
|
||||||
|
copying in other respects.
|
||||||
|
|
||||||
|
If the required texts for either cover are too voluminous to fit
|
||||||
|
legibly, you should put the first ones listed (as many as fit
|
||||||
|
reasonably) on the actual cover, and continue the rest onto adjacent
|
||||||
|
pages.
|
||||||
|
|
||||||
|
If you publish or distribute Opaque copies of the Document numbering
|
||||||
|
more than 100, you must either include a machine-readable Transparent
|
||||||
|
copy along with each Opaque copy, or state in or with each Opaque copy
|
||||||
|
a computer-network location from which the general network-using
|
||||||
|
public has access to download using public-standard network protocols
|
||||||
|
a complete Transparent copy of the Document, free of added material.
|
||||||
|
If you use the latter option, you must take reasonably prudent steps,
|
||||||
|
when you begin distribution of Opaque copies in quantity, to ensure
|
||||||
|
that this Transparent copy will remain thus accessible at the stated
|
||||||
|
location until at least one year after the last time you distribute an
|
||||||
|
Opaque copy (directly or through your agents or retailers) of that
|
||||||
|
edition to the public.
|
||||||
|
|
||||||
|
It is requested, but not required, that you contact the authors of the
|
||||||
|
Document well before redistributing any large number of copies, to
|
||||||
|
give them a chance to provide you with an updated version of the
|
||||||
|
Document.
|
||||||
|
|
||||||
|
#### 4. MODIFICATIONS
|
||||||
|
|
||||||
|
You may copy and distribute a Modified Version of the Document under
|
||||||
|
the conditions of sections 2 and 3 above, provided that you release
|
||||||
|
the Modified Version under precisely this License, with the Modified
|
||||||
|
Version filling the role of the Document, thus licensing distribution
|
||||||
|
and modification of the Modified Version to whoever possesses a copy
|
||||||
|
of it. In addition, you must do these things in the Modified Version:
|
||||||
|
|
||||||
|
- A. Use in the Title Page (and on the covers, if any) a title
|
||||||
|
distinct from that of the Document, and from those of previous
|
||||||
|
versions (which should, if there were any, be listed in the
|
||||||
|
History section of the Document). You may use the same title as a
|
||||||
|
previous version if the original publisher of that version
|
||||||
|
gives permission.
|
||||||
|
- B. List on the Title Page, as authors, one or more persons or
|
||||||
|
entities responsible for authorship of the modifications in the
|
||||||
|
Modified Version, together with at least five of the principal
|
||||||
|
authors of the Document (all of its principal authors, if it has
|
||||||
|
fewer than five), unless they release you from this requirement.
|
||||||
|
- C. State on the Title page the name of the publisher of the
|
||||||
|
Modified Version, as the publisher.
|
||||||
|
- D. Preserve all the copyright notices of the Document.
|
||||||
|
- E. Add an appropriate copyright notice for your modifications
|
||||||
|
adjacent to the other copyright notices.
|
||||||
|
- F. Include, immediately after the copyright notices, a license
|
||||||
|
notice giving the public permission to use the Modified Version
|
||||||
|
under the terms of this License, in the form shown in the
|
||||||
|
Addendum below.
|
||||||
|
- G. Preserve in that license notice the full lists of Invariant
|
||||||
|
Sections and required Cover Texts given in the Document's
|
||||||
|
license notice.
|
||||||
|
- H. Include an unaltered copy of this License.
|
||||||
|
- I. Preserve the section Entitled "History", Preserve its Title,
|
||||||
|
and add to it an item stating at least the title, year, new
|
||||||
|
authors, and publisher of the Modified Version as given on the
|
||||||
|
Title Page. If there is no section Entitled "History" in the
|
||||||
|
Document, create one stating the title, year, authors, and
|
||||||
|
publisher of the Document as given on its Title Page, then add an
|
||||||
|
item describing the Modified Version as stated in the
|
||||||
|
previous sentence.
|
||||||
|
- J. Preserve the network location, if any, given in the Document
|
||||||
|
for public access to a Transparent copy of the Document, and
|
||||||
|
likewise the network locations given in the Document for previous
|
||||||
|
versions it was based on. These may be placed in the "History"
|
||||||
|
section. You may omit a network location for a work that was
|
||||||
|
published at least four years before the Document itself, or if
|
||||||
|
the original publisher of the version it refers to
|
||||||
|
gives permission.
|
||||||
|
- K. For any section Entitled "Acknowledgements" or "Dedications",
|
||||||
|
Preserve the Title of the section, and preserve in the section all
|
||||||
|
the substance and tone of each of the contributor acknowledgements
|
||||||
|
and/or dedications given therein.
|
||||||
|
- L. Preserve all the Invariant Sections of the Document, unaltered
|
||||||
|
in their text and in their titles. Section numbers or the
|
||||||
|
equivalent are not considered part of the section titles.
|
||||||
|
- M. Delete any section Entitled "Endorsements". Such a section may
|
||||||
|
not be included in the Modified Version.
|
||||||
|
- N. Do not retitle any existing section to be Entitled
|
||||||
|
"Endorsements" or to conflict in title with any Invariant Section.
|
||||||
|
- O. Preserve any Warranty Disclaimers.
|
||||||
|
|
||||||
|
If the Modified Version includes new front-matter sections or
|
||||||
|
appendices that qualify as Secondary Sections and contain no material
|
||||||
|
copied from the Document, you may at your option designate some or all
|
||||||
|
of these sections as invariant. To do this, add their titles to the
|
||||||
|
list of Invariant Sections in the Modified Version's license notice.
|
||||||
|
These titles must be distinct from any other section titles.
|
||||||
|
|
||||||
|
You may add a section Entitled "Endorsements", provided it contains
|
||||||
|
nothing but endorsements of your Modified Version by various
|
||||||
|
parties—for example, statements of peer review or that the text has
|
||||||
|
been approved by an organization as the authoritative definition of a
|
||||||
|
standard.
|
||||||
|
|
||||||
|
You may add a passage of up to five words as a Front-Cover Text, and a
|
||||||
|
passage of up to 25 words as a Back-Cover Text, to the end of the list
|
||||||
|
of Cover Texts in the Modified Version. Only one passage of
|
||||||
|
Front-Cover Text and one of Back-Cover Text may be added by (or
|
||||||
|
through arrangements made by) any one entity. If the Document already
|
||||||
|
includes a cover text for the same cover, previously added by you or
|
||||||
|
by arrangement made by the same entity you are acting on behalf of,
|
||||||
|
you may not add another; but you may replace the old one, on explicit
|
||||||
|
permission from the previous publisher that added the old one.
|
||||||
|
|
||||||
|
The author(s) and publisher(s) of the Document do not by this License
|
||||||
|
give permission to use their names for publicity for or to assert or
|
||||||
|
imply endorsement of any Modified Version.
|
||||||
|
|
||||||
|
#### 5. COMBINING DOCUMENTS
|
||||||
|
|
||||||
|
You may combine the Document with other documents released under this
|
||||||
|
License, under the terms defined in section 4 above for modified
|
||||||
|
versions, provided that you include in the combination all of the
|
||||||
|
Invariant Sections of all of the original documents, unmodified, and
|
||||||
|
list them all as Invariant Sections of your combined work in its
|
||||||
|
license notice, and that you preserve all their Warranty Disclaimers.
|
||||||
|
|
||||||
|
The combined work need only contain one copy of this License, and
|
||||||
|
multiple identical Invariant Sections may be replaced with a single
|
||||||
|
copy. If there are multiple Invariant Sections with the same name but
|
||||||
|
different contents, make the title of each such section unique by
|
||||||
|
adding at the end of it, in parentheses, the name of the original
|
||||||
|
author or publisher of that section if known, or else a unique number.
|
||||||
|
Make the same adjustment to the section titles in the list of
|
||||||
|
Invariant Sections in the license notice of the combined work.
|
||||||
|
|
||||||
|
In the combination, you must combine any sections Entitled "History"
|
||||||
|
in the various original documents, forming one section Entitled
|
||||||
|
"History"; likewise combine any sections Entitled "Acknowledgements",
|
||||||
|
and any sections Entitled "Dedications". You must delete all sections
|
||||||
|
Entitled "Endorsements".
|
||||||
|
|
||||||
|
#### 6. COLLECTIONS OF DOCUMENTS
|
||||||
|
|
||||||
|
You may make a collection consisting of the Document and other
|
||||||
|
documents released under this License, and replace the individual
|
||||||
|
copies of this License in the various documents with a single copy
|
||||||
|
that is included in the collection, provided that you follow the rules
|
||||||
|
of this License for verbatim copying of each of the documents in all
|
||||||
|
other respects.
|
||||||
|
|
||||||
|
You may extract a single document from such a collection, and
|
||||||
|
distribute it individually under this License, provided you insert a
|
||||||
|
copy of this License into the extracted document, and follow this
|
||||||
|
License in all other respects regarding verbatim copying of that
|
||||||
|
document.
|
||||||
|
|
||||||
|
#### 7. AGGREGATION WITH INDEPENDENT WORKS
|
||||||
|
|
||||||
|
A compilation of the Document or its derivatives with other separate
|
||||||
|
and independent documents or works, in or on a volume of a storage or
|
||||||
|
distribution medium, is called an "aggregate" if the copyright
|
||||||
|
resulting from the compilation is not used to limit the legal rights
|
||||||
|
of the compilation's users beyond what the individual works permit.
|
||||||
|
When the Document is included in an aggregate, this License does not
|
||||||
|
apply to the other works in the aggregate which are not themselves
|
||||||
|
derivative works of the Document.
|
||||||
|
|
||||||
|
If the Cover Text requirement of section 3 is applicable to these
|
||||||
|
copies of the Document, then if the Document is less than one half of
|
||||||
|
the entire aggregate, the Document's Cover Texts may be placed on
|
||||||
|
covers that bracket the Document within the aggregate, or the
|
||||||
|
electronic equivalent of covers if the Document is in electronic form.
|
||||||
|
Otherwise they must appear on printed covers that bracket the whole
|
||||||
|
aggregate.
|
||||||
|
|
||||||
|
#### 8. TRANSLATION
|
||||||
|
|
||||||
|
Translation is considered a kind of modification, so you may
|
||||||
|
distribute translations of the Document under the terms of section 4.
|
||||||
|
Replacing Invariant Sections with translations requires special
|
||||||
|
permission from their copyright holders, but you may include
|
||||||
|
translations of some or all Invariant Sections in addition to the
|
||||||
|
original versions of these Invariant Sections. You may include a
|
||||||
|
translation of this License, and all the license notices in the
|
||||||
|
Document, and any Warranty Disclaimers, provided that you also include
|
||||||
|
the original English version of this License and the original versions
|
||||||
|
of those notices and disclaimers. In case of a disagreement between
|
||||||
|
the translation and the original version of this License or a notice
|
||||||
|
or disclaimer, the original version will prevail.
|
||||||
|
|
||||||
|
If a section in the Document is Entitled "Acknowledgements",
|
||||||
|
"Dedications", or "History", the requirement (section 4) to Preserve
|
||||||
|
its Title (section 1) will typically require changing the actual
|
||||||
|
title.
|
||||||
|
|
||||||
|
#### 9. TERMINATION
|
||||||
|
|
||||||
|
You may not copy, modify, sublicense, or distribute the Document
|
||||||
|
except as expressly provided under this License. Any attempt otherwise
|
||||||
|
to copy, modify, sublicense, or distribute it is void, and will
|
||||||
|
automatically terminate your rights under this License.
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your license
|
||||||
|
from a particular copyright holder is reinstated (a) provisionally,
|
||||||
|
unless and until the copyright holder explicitly and finally
|
||||||
|
terminates your license, and (b) permanently, if the copyright holder
|
||||||
|
fails to notify you of the violation by some reasonable means prior to
|
||||||
|
60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, receipt of a copy of some or all of the same material does
|
||||||
|
not give you any rights to use it.
|
||||||
|
|
||||||
|
#### 10. FUTURE REVISIONS OF THIS LICENSE
|
||||||
|
|
||||||
|
The Free Software Foundation may publish new, revised versions of the
|
||||||
|
GNU Free Documentation License from time to time. Such new versions
|
||||||
|
will be similar in spirit to the present version, but may differ in
|
||||||
|
detail to address new problems or concerns. See
|
||||||
|
<https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Each version of the License is given a distinguishing version number.
|
||||||
|
If the Document specifies that a particular numbered version of this
|
||||||
|
License "or any later version" applies to it, you have the option of
|
||||||
|
following the terms and conditions either of that specified version or
|
||||||
|
of any later version that has been published (not as a draft) by the
|
||||||
|
Free Software Foundation. If the Document does not specify a version
|
||||||
|
number of this License, you may choose any version ever published (not
|
||||||
|
as a draft) by the Free Software Foundation. If the Document specifies
|
||||||
|
that a proxy can decide which future versions of this License can be
|
||||||
|
used, that proxy's public statement of acceptance of a version
|
||||||
|
permanently authorizes you to choose that version for the Document.
|
||||||
|
|
||||||
|
#### 11. RELICENSING
|
||||||
|
|
||||||
|
"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
|
||||||
|
World Wide Web server that publishes copyrightable works and also
|
||||||
|
provides prominent facilities for anybody to edit those works. A
|
||||||
|
public wiki that anybody can edit is an example of such a server. A
|
||||||
|
"Massive Multiauthor Collaboration" (or "MMC") contained in the site
|
||||||
|
means any set of copyrightable works thus published on the MMC site.
|
||||||
|
|
||||||
|
"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
|
||||||
|
license published by Creative Commons Corporation, a not-for-profit
|
||||||
|
corporation with a principal place of business in San Francisco,
|
||||||
|
California, as well as future copyleft versions of that license
|
||||||
|
published by that same organization.
|
||||||
|
|
||||||
|
"Incorporate" means to publish or republish a Document, in whole or in
|
||||||
|
part, as part of another Document.
|
||||||
|
|
||||||
|
An MMC is "eligible for relicensing" if it is licensed under this
|
||||||
|
License, and if all works that were first published under this License
|
||||||
|
somewhere other than this MMC, and subsequently incorporated in whole
|
||||||
|
or in part into the MMC, (1) had no cover texts or invariant sections,
|
||||||
|
and (2) were thus incorporated prior to November 1, 2008.
|
||||||
|
|
||||||
|
The operator of an MMC Site may republish an MMC contained in the site
|
||||||
|
under CC-BY-SA on the same site at any time before August 1, 2009,
|
||||||
|
provided the MMC is eligible for relicensing.
|
||||||
|
|
||||||
|
### ADDENDUM: How to use this License for your documents
|
||||||
|
|
||||||
|
To use this License in a document you have written, include a copy of
|
||||||
|
the License in the document and put the following copyright and
|
||||||
|
license notices just after the title page:
|
||||||
|
|
||||||
|
Copyright (C) YEAR YOUR NAME.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
If you have Invariant Sections, Front-Cover Texts and Back-Cover
|
||||||
|
Texts, replace the "with … Texts." line with this:
|
||||||
|
|
||||||
|
with the Invariant Sections being LIST THEIR TITLES, with the
|
||||||
|
Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
|
||||||
|
|
||||||
|
If you have Invariant Sections without Cover Texts, or some other
|
||||||
|
combination of the three, merge those two alternatives to suit the
|
||||||
|
situation.
|
||||||
|
|
||||||
|
If your document contains nontrivial examples of program code, we
|
||||||
|
recommend releasing these examples in parallel under your choice of
|
||||||
|
free software license, such as the GNU General Public License, to
|
||||||
|
permit their use in free software.
|
||||||
16
README.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
Documentation Unix Your Brain
|
||||||
|
=============================
|
||||||
|
|
||||||
|
La Documentation Unix Your Brain est générée par l'outil [Sphinx](https://www.sphinx-doc.org/en/master/#). [Le dépot Git de cette documentation](https://git.unixyourbrain.org/doc.git/) ne contient que les sources de la documentation.
|
||||||
|
|
||||||
|
Pour en savoir plus sur le fonctionnement de sphinx, vous trouverez toute la documentation nécessaire sur leur [site officiel](https://www.sphinx-doc.org/en/master/#).
|
||||||
|
|
||||||
|
Pour l'installation et la configuration de sphinx sous debian 11, j'ai créé un tuto mémo sur la documentation Unix Your Brain à [l'adresse suivante](https://docs.unixyourbrain.org/index.html)
|
||||||
|
|
||||||
|
Licence
|
||||||
|
-------
|
||||||
|
|
||||||
|
Sphinx est distrubué sous [licence BSD](https://github.com/sphinx-doc/sphinx/blob/master/LICENSE).
|
||||||
|
|
||||||
|
Sauf indication contraire, chaque document est distribué sous Licence [GNU FDLv3](https://www.gnu.org/licenses/fdl-1.3.html). Vous trouverez
|
||||||
|
une copie de la licence dans le fichier LICENSE.md ou dans la section GNU Free Documentation License.
|
||||||
21
_static/custom.css
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/* Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License". */
|
||||||
|
|
||||||
|
.rst-content pre.literal-block, .rst-content div[class^="highlight"] {
|
||||||
|
background: #282c34;
|
||||||
|
color: #abb2bf;
|
||||||
|
border: 1px solid #333842;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content div.highlight span.linenos {
|
||||||
|
border-right: 1px solid #333842;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content div[class^="highlight"] pre .hll {
|
||||||
|
background-color: #13533b;
|
||||||
|
}
|
||||||
41
conf.py
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Configuration file for the Sphinx documentation builder.
|
||||||
|
#
|
||||||
|
# For the full list of built-in configuration values, see the documentation:
|
||||||
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
||||||
|
|
||||||
|
# -- Project information -----------------------------------------------------
|
||||||
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
|
||||||
|
|
||||||
|
project = 'Documentation Unix Your Brain'
|
||||||
|
copyright = '2023, Jeremie Salvi <docs@unixyourbrain.org>. This documentation is published under GNU FDL License'
|
||||||
|
author = 'Jeremie Salvi <docs@unixyourbrain.org>'
|
||||||
|
release = '0.1'
|
||||||
|
|
||||||
|
# -- General configuration ---------------------------------------------------
|
||||||
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
|
||||||
|
|
||||||
|
extensions = [
|
||||||
|
# 'sphinxemoji.sphinxemoji',
|
||||||
|
'myst_parser'
|
||||||
|
]
|
||||||
|
source_suffix = {
|
||||||
|
'.rst': 'restructuredtext',
|
||||||
|
'.txt': 'markdown',
|
||||||
|
'.md': 'markdown',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
templates_path = ['_templates']
|
||||||
|
exclude_patterns = []
|
||||||
|
|
||||||
|
root_doc = 'index'
|
||||||
|
language = 'fr'
|
||||||
|
|
||||||
|
# -- Options for HTML output -------------------------------------------------
|
||||||
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
|
||||||
|
|
||||||
|
html_theme = 'sphinx_rtd_theme'
|
||||||
|
# html_static_path = ['_static']
|
||||||
|
# html_css_files = [
|
||||||
|
# 'custom.css',
|
||||||
|
# ]
|
||||||
8
docs.code-workspace
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"folders": [
|
||||||
|
{
|
||||||
|
"path": "."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"settings": {}
|
||||||
|
}
|
||||||
24
esp32/index.rst
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
Programmation d'un ESP32
|
||||||
|
========================
|
||||||
|
|
||||||
|
Ici je vais poser toutes mes astuces pour la programmation et le débugage d'un ESP32,
|
||||||
|
ainsi qu'une présentation de mes projets. Je tiens à noter que je suis passé sous
|
||||||
|
ArchLinux, l'installation et la configuration va donc légèrement changer par rapport à Debian.
|
||||||
|
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
installation.rst
|
||||||
|
vscodium_integration.rst
|
||||||
|
qemu_emulation.rst
|
||||||
|
qemu_ethernet.rst
|
||||||
163
esp32/installation.rst
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
Installation de l'environnement sous ArchLinux
|
||||||
|
==============================================
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
|
||||||
|
Tout d'abord je tiens à vous rassurer, cela doit fonctionner sur la majorité des distributions.
|
||||||
|
Je vais utiliser vscodium (fork de visual studio code sans la télémétrie microsoft),
|
||||||
|
un framework basé sur electron, donc compatible multi OS et multi distributions.
|
||||||
|
L'emulateur basé sur QEMU sera compilé à la main, donc ça devrait passer sur n'importe quel linux 😊.
|
||||||
|
|
||||||
|
.. warning:: Je suis passé en root pour ne pas m'encombrer avec ``sudo``, pensez y si nécessaire
|
||||||
|
|
||||||
|
Pour plus d'infos en général, allez faire un tour sur `La documentation officielle de l'esp 32 <https://docs.espressif.com/projects/esp-idf/en/latest/esp32/>`_
|
||||||
|
|
||||||
|
Installation de vscodium
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Vscodium n'est pas disponible dans les paquets officiels ArchLinux, il faut donc aller sur les ArchLinux User Repositories (AUR.)
|
||||||
|
|
||||||
|
`Dépot AUR des binaires vscodium <https://aur.archlinux.org/packages/vscodium-bin>`_
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
:caption: installation de vscodium
|
||||||
|
|
||||||
|
cd /opt
|
||||||
|
git clone https://aur.archlinux.org/vscodium-bin.git
|
||||||
|
cd vscodium-bin/
|
||||||
|
makepkg
|
||||||
|
pacman -U vscodium-bin-1.72.2.22289-1-x86_64.pkg.tar.zst
|
||||||
|
|
||||||
|
.. warning:: Si vous êtes en root pour programmer, il faut utiliser les arguments suivants pour
|
||||||
|
lancer vscodium : ``codium --no-sandbox --user-data-dir ~/.config/vscodium``
|
||||||
|
|
||||||
|
Pour le confort de développement, nous allons installer une extension pour améliorer
|
||||||
|
l'autocompletion en C/C++. Elle n'est pas disponible sur le marketplace vscodium, il faut l'installer
|
||||||
|
manuellement. On la télécharge `ici <https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools>`_.
|
||||||
|
|
||||||
|
On l'installe depuis le menu des extensions comme ci dessous.
|
||||||
|
|
||||||
|
.. image:: ../images/esp32/ms_cpp_extension.png
|
||||||
|
:width: 400
|
||||||
|
|
||||||
|
Nous allons aussi utiliser l'extension native debug pour l'intégration du debugeur.
|
||||||
|
Elle se trouve dans le store. Pour l'utilistation, on verra ça dans la partie
|
||||||
|
`création d'un environnement vscodium </esp32/vscode_integration.html#configurer-le-debugeur>`_.
|
||||||
|
|
||||||
|
.. image:: ../images/esp32/native_debug_extension.png
|
||||||
|
:width: 400
|
||||||
|
|
||||||
|
Installation des prérequis pour l'esp-idf (Espressif IoT Development Framework)
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
La commande est directement fournie dans la documentation, il suffit de la copier coller :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
pacman -S --needed gcc git make flex bison gperf python cmake ninja dfu-util ccache libusb
|
||||||
|
|
||||||
|
Installation et configuration de l'esp-idf
|
||||||
|
------------------------------------------
|
||||||
|
|
||||||
|
Dans un premier temps, on récupère les dépots :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
mkdir -p /opt/esp
|
||||||
|
cd /opt/esp
|
||||||
|
git clone --recursive https://github.com/espressif/esp-idf.git
|
||||||
|
|
||||||
|
Il faut ensuite installer les outils. Par defaut ils sont installés dans ``$HOME/.espressif``.
|
||||||
|
On peut changer cet emplacement grâce à la variable d'environnement ``IDF_TOOLS_PATH``.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
export IDF_TOOLS_PATH=/opt/esp/esp-idf/.espressif
|
||||||
|
cd esp-idf
|
||||||
|
./install.sh esp32
|
||||||
|
|
||||||
|
L'environnement utilise un paquets d'outils, il est dur de mémoriser tout
|
||||||
|
les chemins et les variables d'environnement. Heureusement on nous fournit aussi un sctipt
|
||||||
|
qui rend tout ça accessible depuis la console. Pour ça il faut le charger :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
. /opt/esp/esp-idf/export.sh
|
||||||
|
|
||||||
|
Comme il faut l'appeller dans chaque nouveau terminal, on
|
||||||
|
se créer un alias pour faciliter l'accès :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
alias esp_idf_import=". /opt/esp/esp-idf/export.sh"
|
||||||
|
|
||||||
|
On colle cette ligne dans notre .bashrc ou notre .profile. Pour vérifier qu'on
|
||||||
|
a bien tout importé, on tappe la commande env, et on devrait avoir les infos
|
||||||
|
suivantes :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
env
|
||||||
|
>> ESP_IDF_VERSION="5.1"
|
||||||
|
>> ESP_ROM_ELF_DIR="/opt/esp/esp-idf/.espressif/tools/esp-rom-elfs/20220823/"
|
||||||
|
>> IDF_DEACTIVATE_FILE_PATH="/tmp/tmpxj9n6nndidf_46523"
|
||||||
|
>> IDF_PATH="/opt/esp/esp-idf"
|
||||||
|
>> IDF_PYTHON_ENV_PATH="/opt/esp/esp-idf/.espressif/python_env/idf5.1_py3.10_env"
|
||||||
|
>> IDF_TOOLS_EXPORT_CMD="/opt/esp/esp-idf/export.sh"
|
||||||
|
>> IDF_TOOLS_INSTALL_CMD="/opt/esp/esp-idf/install.sh"
|
||||||
|
>> IDF_TOOLS_PATH="/opt/esp/esp-idf/.espressif"
|
||||||
|
>> OPENOCD_SCRIPTS="/opt/esp/esp-idf/.espressif/tools/openocd-esp32/v0.11.0-esp32-20221026/openocd-esp32/share/openocd/scripts"
|
||||||
|
>> PATH="/opt/esp/esp-idf/components/esptool_py/esptool:/opt/esp/esp-idf/components/espcoredump:/opt/esp/esp-idf/components/partition_table:/opt/esp/esp-idf/components/app_update:/opt/esp/esp-idf/.espressif/tools/xtensa-esp-elf-gdb/12.1_20221002/xtensa-esp-elf-gdb/bin:/opt/esp/esp-idf/.espressif/tools/xtensa-esp32-elf/esp-2022r1-11.2.0/xtensa-esp32-elf/bin:/opt/esp/esp-idf/.espressif/tools/esp32ulp-elf/2.35_20220830/esp32ulp-elf/bin:/opt/esp/esp-idf/.espressif/tools/openocd-esp32/v0.11.0-esp32-20221026/openocd-esp32/bin:/opt/esp/esp-idf/.espressif/python_env/idf5.1_py3.10_env/bin:/opt/esp/esp-idf/tools:/usr/local/sbin:/usr/local/bin:/usr/bin"
|
||||||
|
|
||||||
|
Si l'on à pas les chemins ``/opt/esp/esp-idf`` dans le path et les variables d'environnement ``IDF_``, les outils fournis
|
||||||
|
dans l'ESP-IDF ne fonctionneront tout simplement pas.
|
||||||
|
|
||||||
|
Compilation de qemu-system-xtensa patché pour les esp32
|
||||||
|
-------------------------------------------------------
|
||||||
|
|
||||||
|
Espressif, l'entreprise qui concoit les ESP32, nous fournit un fork de QEMU modifié pour emmuler celui ci.
|
||||||
|
On le trouve à l'addresse suivante : `GitHub du fork QEMU <https://github.com/espressif/qemu>`_.
|
||||||
|
Toute la procédure est expliquée ici : `Wiki du dépot <https://github.com/espressif/qemu>`_.
|
||||||
|
|
||||||
|
Je ne vais pas tout réexpliquer ici, ce qu'il faut savoir c'est que nous ne voulons pas
|
||||||
|
recompiler tout qemu, juste le binaire qemu-system-xtensa modifié pour esp32. Je vais donc
|
||||||
|
refaire la compilation en désactivant un maximum de fonctionnalités inutiles. On trouve la
|
||||||
|
liste des fonctionnalités dans le fichier ``configure`` du dépot.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
:caption: compilation de QEMU pour esp32
|
||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
cd /opt
|
||||||
|
git clone https://github.com/espressif/qemu.git
|
||||||
|
cd qemu
|
||||||
|
./configure --target-list=xtensa-softmmu \
|
||||||
|
--enable-gcrypt \
|
||||||
|
--enable-debug --enable-sanitizers \
|
||||||
|
--disable-strip --disable-user \
|
||||||
|
--disable-capstone --disable-vnc \
|
||||||
|
--disable-sdl --disable-gtk \
|
||||||
|
--disable-opengl --disable-vfio-user-server
|
||||||
|
ninja -C build
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
307
esp32/qemu_emulation.rst
Normal file
@@ -0,0 +1,307 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
Premiers tests et emulation QEMU
|
||||||
|
================================
|
||||||
|
|
||||||
|
Espressif fournit une version de QEMU modifiée pour tester du code. Cela peut avoir
|
||||||
|
plusieurs avantages :
|
||||||
|
|
||||||
|
* Commencer à coder sans attendre la livraison de notre ESP.
|
||||||
|
* Tester du code plus rapidement sans avoir à flasher notre ESP.
|
||||||
|
* Coder toute la partie web en local sur notre machine.
|
||||||
|
* Attacher un debugeur, utiliser des berakpoints, et débuger plus facilement.
|
||||||
|
|
||||||
|
Pour cela, nous reprendront le `code de la partie précédente </esp32/vscodium_integration.html#configuration-de-l-extension-c-c>`_.
|
||||||
|
|
||||||
|
Première Execution
|
||||||
|
------------------
|
||||||
|
|
||||||
|
On reprend le projet vu dans l'intégration vscodium. Pout lancer QEMU il nous faut construire la mémonire
|
||||||
|
flash pour la donner à QEMU qu'elle puisse démarrer dessus.
|
||||||
|
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
python /opt/esp/esp-idf/components/esptool_py/esptool/esptool.py \
|
||||||
|
--chip esp32 merge_bin --output flash_img.bin \
|
||||||
|
--fill-flash-size 4MB --flash_mode dio --flash_size keep --flash_freq 40m \
|
||||||
|
0x1000 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0x10000 build/new_project.bin
|
||||||
|
|
||||||
|
Voilà, il ne nous reste plus qu'à lancer QEMU à partir de cette image !
|
||||||
|
|
||||||
|
Emulation du système dans une machine QEMU
|
||||||
|
------------------------------------------
|
||||||
|
|
||||||
|
Il suffit maintenant de lancer notre machine QEMU à partir de la flash que l'on vient de créer :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
/opt/qemu/build/qemu-system-xtensa -nographic -machine esp32 \
|
||||||
|
-drive file=flash_img.bin,if=mtd,format=raw
|
||||||
|
|
||||||
|
Et voilà, on emule la machine et on à la sortie série qui s'affiche. Pour quitter QEMU, on utilise
|
||||||
|
``Ctrl-A x``
|
||||||
|
|
||||||
|
Flasher ou monitorer en emulant un port série
|
||||||
|
---------------------------------------------
|
||||||
|
|
||||||
|
Cela ne va pas beaucoup nous servir, puisqu'il suffit de relancer qemu avec notre nouvelle
|
||||||
|
image du flash, mais il faut savoir que c'est possible en emulant les GPIO de notre ESP.
|
||||||
|
|
||||||
|
on à deux configurations :
|
||||||
|
|
||||||
|
* ``-global driver=esp32.gpio,property=strap_mode,value=0x12`` pour monitorer la sortie.
|
||||||
|
* ``-global driver=esp32.gpio,property=strap_mode,value=0xf`` pour flasher la carte.
|
||||||
|
|
||||||
|
Attention, le port série ne peut pas recevoir deux connexions en même temps, il faut donc
|
||||||
|
couper le moniteur pour flasher et vice versa.
|
||||||
|
|
||||||
|
Monitorer QEMU
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
On commence par lancer QEMU avec le port série en mode monitor.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
/opt/qemu/build/qemu-system-xtensa -nographic -machine esp32 \
|
||||||
|
-drive file=flash_img.bin,if=mtd,format=raw \
|
||||||
|
-global driver=esp32.gpio,property=strap_mode,value=0x12 \
|
||||||
|
-serial tcp::5555,server,nowait
|
||||||
|
|
||||||
|
On lance ensuite le moniteur
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
idf.py --port socket://localhost:5555 monitor
|
||||||
|
|
||||||
|
Flasher QEMU
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
On commence par lancer QEMU avec le port série en mode flash.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
/opt/qemu/build/qemu-system-xtensa -nographic -machine esp32 \
|
||||||
|
-drive file=flash_img.bin,if=mtd,format=raw \
|
||||||
|
-global driver=esp32.gpio,property=strap_mode,value=0xf \
|
||||||
|
-serial tcp::5555,server,nowait \
|
||||||
|
|
||||||
|
On flash ensuite notre machine
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
idf.py --port socket://localhost:5555 flash
|
||||||
|
|
||||||
|
Debuger grâce de QEMU avec gdb
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Pour attacher GDB, on lance la commande avec ``-s -S`` qui va nous ouvrir un socket tcp sur le port 1234.
|
||||||
|
pour changer de port, on utilise : ``-gdb tcp::1235``
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
/opt/qemu/build/qemu-system-xtensa -nographic -machine esp32 \
|
||||||
|
-drive file=flash_img.bin,if=mtd,format=raw \
|
||||||
|
-gdb tcp:localhost:1235 -S
|
||||||
|
|
||||||
|
On peut ensuite lancer le debugeur fourni avec l'API, mettre des breakpoints, etc.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
/root/.espressif/tools/xtensa-esp-elf-gdb/12.1_20221002/xtensa-esp-elf-gdb/bin/xtensa-esp32-elf-gdb build/main.elf
|
||||||
|
|
||||||
|
(gdb) b app_main
|
||||||
|
# >> Breakpoint 1 at 0x400d5170: file /root/test/sample_project/main/main.c, line 7.
|
||||||
|
(gdb) target remote :1235
|
||||||
|
# >> Remote debugging using :1235
|
||||||
|
# >> 0x40000400 in ?? ()
|
||||||
|
(gdb) c
|
||||||
|
# Continuing.
|
||||||
|
# Thread 1 hit Breakpoint 1, app_main () at /root/test/sample_project/main/main.c:7
|
||||||
|
(gdb) n
|
||||||
|
# >> 8 int count = 0;
|
||||||
|
(gdb) n
|
||||||
|
# >> 11 ESP_LOGI("FIRST TRY", "Test loop pass n° %d", count++);
|
||||||
|
(gdb) b
|
||||||
|
# >> Breakpoint 2 at 0x400d5175: file /root/test/sample_project/main/main.c, line 11.
|
||||||
|
(gdb) c
|
||||||
|
# >> Continuing.
|
||||||
|
# >> Thread 1 hit Breakpoint 2, app_main () at /root/test/sample_project/main/main.c:11
|
||||||
|
# >> 11 ESP_LOGI("FIRST TRY", "Test loop pass n° %d", count++);
|
||||||
|
(gdb) c
|
||||||
|
# >> Continuing.
|
||||||
|
# >> Thread 1 hit Breakpoint 2, app_main () at /root/test/sample_project/main/main.c:11
|
||||||
|
# >> 11 ESP_LOGI("FIRST TRY", "Test loop pass n° %d", count++);
|
||||||
|
(gdb) print count
|
||||||
|
# >> $1 = 2
|
||||||
|
(gdb) set count=100
|
||||||
|
(gdb) c
|
||||||
|
# >> Continuing.
|
||||||
|
# >> Thread 1 hit Breakpoint 2, app_main () at /root/test/sample_project/main/main.c:11
|
||||||
|
# >> 11 ESP_LOGI("FIRST TRY", "Test loop pass n° %d", count++);
|
||||||
|
(gdb) quit
|
||||||
|
|
||||||
|
.. image:: ../images/esp32/QEMU_gdb_example.png
|
||||||
|
:width: 400
|
||||||
|
|
||||||
|
Voilà. On va voir plus tard comment configurer cela dans vscodium
|
||||||
|
|
||||||
|
|
||||||
|
Intégration dans vscodium
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
On arrive ici à ce qui pour moi donne une vraie utilité à configurer un environnement QEMU.
|
||||||
|
On va pouvoir à partir de vscode gérer nos breakpoint, naviguer dans le code, avoir sous
|
||||||
|
les yeux les variables et les call stack, etc.
|
||||||
|
|
||||||
|
Création des tâches
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Je ne réexplique pas tout, on à déjà vu le fonctionnement dans la
|
||||||
|
`partie précédente </esp32/vscodium_integration.html#configurer-des-taches>`_
|
||||||
|
On rajoute quelques fonctions suivantes à notre script et on ajoute les tâches pour
|
||||||
|
lancer le débug et l'execution avec QEMU.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
function kill_qemu {
|
||||||
|
for i in $(ps -elf | grep 'qemu-system-xtensa' | awk '{print $4}')
|
||||||
|
do
|
||||||
|
echo "found process $i"
|
||||||
|
kill $i
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function qemu_execute {
|
||||||
|
kill_qemu
|
||||||
|
python /opt/esp/esp-idf/components/esptool_py/esptool/esptool.py \
|
||||||
|
--chip esp32 merge_bin --output flash_img.bin \
|
||||||
|
--fill-flash-size 4MB --flash_mode dio --flash_size keep --flash_freq 40m \
|
||||||
|
0x1000 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin \
|
||||||
|
0x10000 build/new_project.bin
|
||||||
|
/opt/qemu/build/qemu-system-xtensa -nographic -machine esp32 \
|
||||||
|
-drive file=flash_img.bin,if=mtd,format=raw
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function qemu_debug {
|
||||||
|
kill_qemu
|
||||||
|
python /opt/esp/esp-idf/components/esptool_py/esptool/esptool.py \
|
||||||
|
--chip esp32 merge_bin --output flash_img.bin \
|
||||||
|
--fill-flash-size 4MB --flash_mode dio --flash_size keep --flash_freq 40m \
|
||||||
|
0x1000 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin \
|
||||||
|
0x10000 build/new_project.bin
|
||||||
|
/opt/qemu/build/qemu-system-xtensa -nographic -machine esp32 \
|
||||||
|
-drive file=flash_img.bin,if=mtd,format=raw -s -S
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################
|
||||||
|
# Main
|
||||||
|
#######################
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
kill_idf)
|
||||||
|
echo "Killing all idf process"
|
||||||
|
kill_idf
|
||||||
|
;;
|
||||||
|
kill_qemu)
|
||||||
|
echo "Killing all idf process"
|
||||||
|
kill_qemu
|
||||||
|
;;
|
||||||
|
qemu_execute)
|
||||||
|
echo "Execute with QEMU"
|
||||||
|
qemu_execute
|
||||||
|
;;
|
||||||
|
qemu_debug)
|
||||||
|
echo "Debug with QEMU"
|
||||||
|
qemu_debug
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Missing args"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
{
|
||||||
|
"label": "Execute with QEMU",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "${workspaceFolder}/.scripts/tasks.sh",
|
||||||
|
"args": [
|
||||||
|
"qemu_execute"
|
||||||
|
],
|
||||||
|
"presentation": {
|
||||||
|
"reveal": "always",
|
||||||
|
"panel": "new",
|
||||||
|
"close": true
|
||||||
|
},
|
||||||
|
"problemMatcher": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Debug with QEMU",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "${workspaceFolder}/.scripts/tasks.sh",
|
||||||
|
"args": [
|
||||||
|
"qemu_debug"
|
||||||
|
],
|
||||||
|
"presentation": {
|
||||||
|
"reveal": "always",
|
||||||
|
"panel": "new",
|
||||||
|
"close": true
|
||||||
|
},
|
||||||
|
"problemMatcher": []
|
||||||
|
},
|
||||||
|
|
||||||
|
Intégration de gdb dans vscodium
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Pour cela, il faut éditer le fichier ``.vscode/launch.json``
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
{
|
||||||
|
"configurations": [
|
||||||
|
|
||||||
|
{
|
||||||
|
"type": "gdb",
|
||||||
|
"gdbpath": "/root/.espressif/tools/xtensa-esp-elf-gdb/12.1_20221002/xtensa-esp-elf-gdb/bin/xtensa-esp32-elf-gdb",
|
||||||
|
"postDebugTask": "kill QEMU process",
|
||||||
|
"request": "attach",
|
||||||
|
"name": "Attach to QEMU",
|
||||||
|
"executable": "${workspaceFolder}/build/main.elf",
|
||||||
|
"target": ":1234",
|
||||||
|
"remote": true,
|
||||||
|
"cwd": "${workspaceRoot}",
|
||||||
|
"valuesFormatting": "parseText"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
Voilà, on n'a plus qu'à lancer la tâche ``Debug with QEMU`` et de lancer le débugeur.
|
||||||
|
|
||||||
|
.. image:: ../images/esp32/debug.png
|
||||||
|
:width: 600
|
||||||
|
|
||||||
|
On se retrouve avec les breakpoints, les call stacks, les variables et la sortie tous affichés sans notre
|
||||||
|
environnement de travail 💪.
|
||||||
|
|
||||||
|
Prochaine étape
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Les interactions avec l'électronique devant être faites avec un vrai ESP, le développement
|
||||||
|
sous QEMU ne nous sert à rien si on ne peut pas coder la partie réseau et communications depuis le PC.
|
||||||
|
Prochaine étape donc, faire tourner l'emulation avec une interface réseau pour coder notre serveur web
|
||||||
|
embarqué.
|
||||||
203
esp32/qemu_ethernet.rst
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
Interface ethernet avec QEMU
|
||||||
|
============================
|
||||||
|
|
||||||
|
Y a pas à dire, j'ai bien galéré pour cette partie 😅. Bon, faut dire q'il y avait des choses qui
|
||||||
|
ne fonctionnent pas. J'y refient à la fin de cette section.
|
||||||
|
|
||||||
|
Après pas mal de tatonnements entre la doc et les exemples fournis par espressif, j'ai finalement
|
||||||
|
réussi à interagir entre firefox et la machine QEMU. Il y a plusieures choses à bien comprendre
|
||||||
|
dans la façon dont fonctionne l'IDF, notament comment sont gérées les
|
||||||
|
`différentes couches du modèle OSI <https://fr.wikipedia.org/wiki/Mod%C3%A8le_OSI>`_.
|
||||||
|
|
||||||
|
Principes
|
||||||
|
---------
|
||||||
|
|
||||||
|
dans l'ESP, il y à trois étapes principales pour le réseau :
|
||||||
|
|
||||||
|
#. La partie physique (couches physique + mac),
|
||||||
|
#. La partie network (couches network + transport),
|
||||||
|
#. La partie link entre physique et network.
|
||||||
|
|
||||||
|
La partie physique
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
C'est la couche physique plus la couche mac. On la configure, on la démare, et ensuite on
|
||||||
|
la link à la partie network. Côté wifi, comme le driver de la carte est toujours le même,
|
||||||
|
on à la fonction ``esp_netif_create_default_wifi_sta()`` qui gère tout, elle créer tout.
|
||||||
|
Elle gère la partie physique, la link à la partie network, et nous retourne un handle de la
|
||||||
|
partie network.
|
||||||
|
|
||||||
|
Pour l'ethernet, c'est différent, comme plusieurs extensions ethernet sont disponible pour
|
||||||
|
l'esp32, il y a plusieurs drivers disponibles, il nous faut donc choisir le bon, et configurer ça à la main.
|
||||||
|
|
||||||
|
Dans notre cas, pour QEMU, le driver à utiliser est le driver openeth. (`cf wiki qemu <https://github.com/espressif/qemu/wiki>`_)
|
||||||
|
La configuration de la partie physique se fait à l'aide des fonctions suivantes :
|
||||||
|
|
||||||
|
.. code-block:: cpp
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
// Pysical layer configuration
|
||||||
|
eth_phy_config_t phy_config = ETH_PHY_DEFAULT_CONFIG();
|
||||||
|
phy_config.phy_addr = -1;
|
||||||
|
phy_config.reset_gpio_num = -1;
|
||||||
|
phy_config.autonego_timeout_ms = 4000;
|
||||||
|
s_phy = esp_eth_phy_new_dp83848(&phy_config);
|
||||||
|
// Data link layer configuration
|
||||||
|
eth_mac_config_t mac_config = ETH_MAC_DEFAULT_CONFIG();
|
||||||
|
mac_config.rx_task_stack_size = 4096;
|
||||||
|
mac_config.rx_task_prio = 20;
|
||||||
|
s_mac = esp_eth_mac_new_openeth(&mac_config);
|
||||||
|
// Install Ethernet driver
|
||||||
|
esp_eth_config_t config = ETH_DEFAULT_CONFIG(s_mac, s_phy);
|
||||||
|
esp_eth_driver_install(&config, &esp_eth_handle);
|
||||||
|
|
||||||
|
La partie network
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Can cette partie, on gère la couche ip et la couche transport (TCP/UDP/ICMP). Espressif nous donne pour ça tout un tas
|
||||||
|
de fonctions, qui sont un wrapper des librairies opensource `lwIP <https://fr.wikipedia.org/wiki/LwIP>`_ (lightweight IP).
|
||||||
|
|
||||||
|
Elle nous permet d'initialiser ces couches, de gérer l'attribution de l'adressage ip (statique ou DHCP.)
|
||||||
|
|
||||||
|
Cette couche s'implémente avec les fonctions suivantes :
|
||||||
|
|
||||||
|
.. code-block:: cpp
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
// Initialize TCP/IP layers
|
||||||
|
esp_netif_init();
|
||||||
|
esp_event_loop_create_default();
|
||||||
|
esp_netif_config_t esp_netif_config = ESP_NETIF_DEFAULT_ETH();
|
||||||
|
esp_netif_t *eth_netif = esp_netif_new(&esp_netif_config);
|
||||||
|
|
||||||
|
// Set static ip
|
||||||
|
// esp_netif_dhcpc_stop(eth_netif);
|
||||||
|
// esp_netif_ip_info_t esp_netif_ip_info;
|
||||||
|
// esp_netif_ip_info.ip.addr = ESP_IP4TOUINT32(11,2,168,192);
|
||||||
|
// esp_netif_ip_info.netmask.addr = ESP_IP4TOUINT32(0,255,255,255);
|
||||||
|
// esp_netif_ip_info.gw.addr = ESP_IP4TOUINT32(1,2,168,192);
|
||||||
|
// esp_err_t ret2 = esp_netif_set_ip_info(eth_netif, &esp_netif_ip_info);
|
||||||
|
// ESP_ERROR_CHECK(ret2);
|
||||||
|
|
||||||
|
Lien entre les deux premières couches
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
On peut configurer les deux parties précédentes dans l'ordre de notre choix, mais c'est seulement une fois que
|
||||||
|
ces deux étapes sont réalisées qu'on peut attacher la couche TCP/IP à la couche physique/MAC.
|
||||||
|
|
||||||
|
Assez simple à faire, il suffit d'utiliser le code suivant :
|
||||||
|
|
||||||
|
.. code-block:: cpp
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
// Bind TCP/IP to Phy+MAC
|
||||||
|
esp_eth_netif_glue_handle = esp_eth_new_netif_glue(esp_eth_handle);
|
||||||
|
esp_netif_attach(eth_netif, esp_eth_netif_glue_handle);
|
||||||
|
|
||||||
|
On peut ensuite démarrer ethernet avec la fonction suivante :
|
||||||
|
|
||||||
|
.. code-block:: cpp
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
// Start ethernet
|
||||||
|
esp_eth_start(esp_eth_handle);
|
||||||
|
|
||||||
|
La partie applicative
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Ici, on aura l'implémentation de notre serveur web. Ça se fait à partir de la librairie ``esp_http_server``
|
||||||
|
Rien de bien complexe ici quand on connait bien le fonctionnement de ce protocole.
|
||||||
|
|
||||||
|
Le code est le suivant :
|
||||||
|
|
||||||
|
.. code-block:: cpp
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
esp_err_t get_handler(httpd_req_t *req)
|
||||||
|
{
|
||||||
|
/* Send a simple response */
|
||||||
|
const char resp[] = "URI GET Response\n";
|
||||||
|
httpd_resp_send(req, resp, HTTPD_RESP_USE_STRLEN);
|
||||||
|
ESP_LOGI(TAG, "good");
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
httpd_uri_t uri_get = {
|
||||||
|
.uri = "/uri",
|
||||||
|
.method = HTTP_GET,
|
||||||
|
.handler = get_handler,
|
||||||
|
.user_ctx = NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
Une fois ces trois étapes franchies, on peut démarrer QEMU avec la commande suivante :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
/opt/qemu/build/qemu-system-xtensa -m 128 -nographic -machine esp32 \
|
||||||
|
-drive file=flash_img.bin,if=mtd,format=raw \
|
||||||
|
-net nic,model=open_eth \
|
||||||
|
-net user,host=192.168.2.1,net=192.168.2.0/24,hostfwd=tcp::80-:80 \
|
||||||
|
-net tap,script=no,downscript=no
|
||||||
|
|
||||||
|
On teste avec un simple ``curl http://127.0.0.1/uri`` et on voit que ça marche.
|
||||||
|
|
||||||
|
.. image:: ../images/esp32/QEMU_http_response.png
|
||||||
|
:width: 600
|
||||||
|
|
||||||
|
Ce qui ne marche pas
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
L'IPv6
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
|
Ne marche pas ni en wifi avec SLAAC, en wifi avec une ip statique,
|
||||||
|
ni avec QEMU. C'est ce qui m'a le plus fait perdre de temps.
|
||||||
|
En m'acharnant, je suis tombé sur ça 😤 🤬:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
esp_err_t esp_netif_add_ip6_address(esp_netif_t *esp_netif, const esp_ip6_addr_t *addr, uint8_t preference)
|
||||||
|
{
|
||||||
|
return ESP_ERR_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
Il manque clairement du travail du côté d'espressif pour implémenter la couche IPv6. C'est embêtant, ça nous
|
||||||
|
oblige à faire pleins de routes dans notre box, alors qu'on pourrait tout simplement pinger notre domotique de
|
||||||
|
l'extérieur avec du v6
|
||||||
|
|
||||||
|
.. note:: Il n'y a que la librairie loobback.c qui manque d'implémentation, dans
|
||||||
|
components/lwip/lwip/src/core/netif.c on trouve
|
||||||
|
``netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chosen_idx)``
|
||||||
|
qui est bel et bien implémentée. J'ai perdu du temps dessus, ça sera un NAT v4 pour l'instant.
|
||||||
|
Si à l'avenir j'arrive à faire marcher l'IPv6, je le documenterai.
|
||||||
|
|
||||||
|
L'interface tun0 et le bridging
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
auand je lance ma commande QEMU, j'ai deux moyens d'accéder à mon ``http_server`` :
|
||||||
|
Soit via le ``hostfwd=tcp::80-:80``, soit via ``-net tap,script=no,downscript=no``.
|
||||||
|
|
||||||
|
Je fait un ``ip link set tap0 up et brctl addif br0 tap0`` pour que mon tap0 soit
|
||||||
|
pingable depuis le bridge en 192.168.2.15.
|
||||||
|
|
||||||
|
Et bien, un ``curl http://127.0.0.1/uri`` marche très bien, un ``curl http://192.168.2.15/uri``
|
||||||
|
ne parche pas, on à une erreur ``W (476492) opencores.emac: emac_opencores_isr_handler: RX frame dropped (0x14)``
|
||||||
|
J'ai essayé de mettre au max les buffers RX, testé toutes les configurations possible et imaginables,
|
||||||
|
impossible de passer par le bridge sans avoir un frame_drop. Grace au mod débug, j'arrive ici :
|
||||||
|
|
||||||
|
``components/esp_eth_src/esp_eth_mac_openeth.c``
|
||||||
|
|
||||||
|
.. image:: ../images/esp32/openeth_busy.png
|
||||||
|
:width: 600
|
||||||
|
|
||||||
313
esp32/vscodium_integration.rst
Normal file
@@ -0,0 +1,313 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
Création d'un environnement vscodium
|
||||||
|
====================================
|
||||||
|
|
||||||
|
Le but ici va être d'automatiser un maximum d'actions, comme par exemple la compilation, le débug,
|
||||||
|
tout en les intégrant dans vscodium. Nous allons aussi configurer l'autocomplétion, la navigation
|
||||||
|
dans les fonctions et les librairies, et tout ce qui peut rendre notre IDE plus ergonomique.
|
||||||
|
|
||||||
|
Je vais essayer de maintenir cette section à jour au fur et à mesure que j'améliore
|
||||||
|
le projet.
|
||||||
|
|
||||||
|
.. warning:: pensez à importer les variables d'environnement avec esp_idf_import
|
||||||
|
comme vu dans l'installation si nécessaire.
|
||||||
|
|
||||||
|
Créer un nouveau project
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
On commence par créer un projet a l'aide le l'utilitaire IDF :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
idf.py create-project new_project
|
||||||
|
|
||||||
|
On peut ensuite ouvrir vscodium et ouvrir ce dossier ``Ctrl+O`` ou ``File -> Open Folder``.
|
||||||
|
|
||||||
|
|
||||||
|
Déclarer le $PATH et les variables d'environnement pour le terminal
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
|
||||||
|
Si on lance notre terminal vscode et qu'on fait un ``export``, on ne retrouve pas les variables
|
||||||
|
d'environnement nécessaires à bon fonctionnement des outils IDF. Pour cela, il faut les renseigner
|
||||||
|
dans notre espace de travail.
|
||||||
|
|
||||||
|
Pour cela, on fait ``F1`` et on cherche settings.json.
|
||||||
|
|
||||||
|
.. image:: ../images/esp32/settings.json.png
|
||||||
|
:width: 600
|
||||||
|
|
||||||
|
Il va nous ouvrir le fichier ``.vscode/settings.json`` qui va contenir nos paramètres
|
||||||
|
propre au projet. Dans celui ci, on va renseigner toutes les variables d'environnement
|
||||||
|
qu'on à après un ``esp_idf_import`` comme vu dans la partie
|
||||||
|
`installation </esp32/installation.html#installation-et-configuration-de-l-esp-idf>`_.
|
||||||
|
|
||||||
|
On ajoute les lignes suivantes :
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
{
|
||||||
|
"C_Cpp.intelliSenseEngine": "Tag Parser",
|
||||||
|
"terminal.integrated.cwd": "/root/test/new_project",
|
||||||
|
// environnement variables needeed by ESP_IDF
|
||||||
|
"terminal.integrated.env.linux": {
|
||||||
|
"ESP_IDF_VERSION": "5.1",
|
||||||
|
"ESP_ROM_ELF_DIR": "/opt/esp/esp-idf/.espressif/tools/esp-rom-elfs/20220823/",
|
||||||
|
"IDF_DEACTIVATE_FILE_PATH": "/tmp/tmpxj9n6nndidf_46523",
|
||||||
|
"IDF_PATH": "/opt/esp/esp-idf",
|
||||||
|
"IDF_PYTHON_ENV_PATH": "/opt/esp/esp-idf/.espressif/python_env/idf5.1_py3.10_env",
|
||||||
|
"IDF_TOOLS_EXPORT_CMD": "/opt/esp/esp-idf/export.sh",
|
||||||
|
"IDF_TOOLS_INSTALL_CMD": "/opt/esp/esp-idf/install.sh",
|
||||||
|
"IDF_TOOLS_PATH": "/opt/esp/esp-idf/.espressif",
|
||||||
|
"OPENOCD_SCRIPTS": "/opt/esp/esp-idf/.espressif/tools/openocd-esp32/v0.11.0-esp32-20221026/openocd-esp32/share/openocd/scripts",
|
||||||
|
"PATH": "/opt/esp/esp-idf/components/esptool_py/esptool:/opt/esp/esp-idf/components/espcoredump:/opt/esp/esp-idf/components/partition_table:/opt/esp/esp-idf/components/app_update:/opt/esp/esp-idf/.espressif/tools/xtensa-esp-elf-gdb/12.1_20221002/xtensa-esp-elf-gdb/bin:/opt/esp/esp-idf/.espressif/tools/xtensa-esp32-elf/esp-2022r1-11.2.0/xtensa-esp32-elf/bin:/opt/esp/esp-idf/.espressif/tools/esp32ulp-elf/2.35_20220830/esp32ulp-elf/bin:/opt/esp/esp-idf/.espressif/tools/openocd-esp32/v0.11.0-esp32-20221026/openocd-esp32/bin:/opt/esp/esp-idf/.espressif/python_env/idf5.1_py3.10_env/bin:/opt/esp/esp-idf/tools:/usr/local/sbin:/usr/local/bin:/usr/bin"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
Configuration de l'extension C/C++
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
Commencons par un simple code pour vérifier que tout fonctionne :
|
||||||
|
|
||||||
|
.. code-block:: c
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <esp_log.h>
|
||||||
|
#include <freertos/FreeRTOS.h>
|
||||||
|
#include <freertos/task.h>
|
||||||
|
|
||||||
|
void app_main(void)
|
||||||
|
{
|
||||||
|
int count=0;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
ESP_LOGI("NEW PROJECT", "my first test %d", count++);
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
On teste notre code avec les commandes suivantes :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
idf.py set-target esp32
|
||||||
|
idf.py build
|
||||||
|
idf.py flash
|
||||||
|
idf.py monitor
|
||||||
|
|
||||||
|
Pour quitter le moniteur, il suffit d'un ``Ctrl+]``.
|
||||||
|
|
||||||
|
Ok, une fois que tout marche, on peut quitter le terminal.
|
||||||
|
On voit que vscodium affiche des erreurs au niveau des include qu'il ne trouve pas. Réglons tout ça.
|
||||||
|
|
||||||
|
En appuyant sur ``F1`` et en cherchant ``C/C++ configuration`` on trouve soit l'interface utilisateur soit un
|
||||||
|
racourci pour créer et renseigner le fichier ``.vscode/c_cpp_properties.json``.
|
||||||
|
Pour que la recherche intelligente foncrionne, il faut configurer l'extension pour qu'elle
|
||||||
|
sache ou chercher les librairies fournies par l'IDE. Des templates sont déjà disponibles
|
||||||
|
sur `le github d'espressif <https://github.com/espressif/vscode-esp-idf-extension/tree/master/templates/.vscode>`_.
|
||||||
|
|
||||||
|
|
||||||
|
.. image:: ../images/esp32/c_cpp_config.png
|
||||||
|
:width: 600
|
||||||
|
|
||||||
|
En m'inspirant de ce qu'esperssif fournit pour son extension vscodium,
|
||||||
|
voilà à quoi je suis arrivé pour que tout fonctionne bien :
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
{
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "ESP_IDF",
|
||||||
|
"includePath": [
|
||||||
|
"${workspaceFolder}/**",
|
||||||
|
"/opt/esp/esp-idf/components/**",
|
||||||
|
"/opt/esp/esp-idf/.espressif/tools/**"
|
||||||
|
],
|
||||||
|
"defines": [],
|
||||||
|
"compilerPath": "",
|
||||||
|
"cStandard": "c11",
|
||||||
|
"cppStandard": "c++17",
|
||||||
|
"intelliSenseMode": "linux-gcc-x64",
|
||||||
|
"browse": {
|
||||||
|
"path": [
|
||||||
|
"${workspaceFolder}/**",
|
||||||
|
"/opt/esp/esp-idf/components/**",
|
||||||
|
"/opt/esp/esp-idf/.espressif/tools/**"
|
||||||
|
],
|
||||||
|
"limitSymbolsToIncludedHeaders": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": 4
|
||||||
|
}
|
||||||
|
|
||||||
|
Voilà, ça c'est pour que vscode et intellisense trouvent toutes les ressources dont ils ont besoin.
|
||||||
|
|
||||||
|
|
||||||
|
Configurer des tâches
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
C'est ici, à mon sens, la fonctionnalié qui donne le plus de confort et qui va nous faire gagner un temps précieux.
|
||||||
|
Dans vscodium, on peut définir des tâches personnalisées pour le projet en cours, et les executer rapidement avec un raccourci clavier.
|
||||||
|
|
||||||
|
Dans un premier temps, je créer un script dans ``.scripts/tasks.sh`` que je rend executable, et dans lequel je vais coder toutes les actions
|
||||||
|
que je vais répéter souvent, comme builder le code, flasher l'esp, lancer QEMU pour débuger, etc. Voici le code, il est améliorable bien
|
||||||
|
entendu et on va y rajouter toutes les fonctionnalités que nous voudrons par la suite.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function kill_idf {
|
||||||
|
for i in $(ps -elf | grep 'idf.py' | awk '{print $4}')
|
||||||
|
do
|
||||||
|
echo "found process $i"
|
||||||
|
kill $i
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function build {
|
||||||
|
$IDF_PATH/tools/idf.py build
|
||||||
|
}
|
||||||
|
|
||||||
|
function flash {
|
||||||
|
kill_idf
|
||||||
|
|
||||||
|
$IDF_PATH/tools/idf.py flash
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
function monitor {
|
||||||
|
kill_idf
|
||||||
|
$IDF_PATH/tools/idf.py monitor
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#######################
|
||||||
|
# Main
|
||||||
|
#######################
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
kill_idf)
|
||||||
|
echo "Killing all idf process"
|
||||||
|
kill_idf
|
||||||
|
;;
|
||||||
|
build)
|
||||||
|
echo "Building project"
|
||||||
|
build
|
||||||
|
;;
|
||||||
|
flash)
|
||||||
|
echo "Flashing memory"
|
||||||
|
flash
|
||||||
|
;;
|
||||||
|
monitor)
|
||||||
|
echo "Monitoring output"
|
||||||
|
monitor
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Missing args"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
Voilà, une fois ce script fait, on va y assigner des tâches vscodium. Je vais aller vite sur les explications, je
|
||||||
|
vous met un lien vers `la documentation officielle du fichier tasks.json <https://code.visualstudio.com/docs/editor/tasks>`_.
|
||||||
|
|
||||||
|
On créer un fichier ``.vscode/tasks.json`` et on y renseigne le code suivant :
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "kill idf.py process",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "${workspaceFolder}/.scripts/tasks.sh",
|
||||||
|
"args": [
|
||||||
|
"kill_idf"
|
||||||
|
],
|
||||||
|
"presentation": {
|
||||||
|
"reveal": "always",
|
||||||
|
"panel": "shared",
|
||||||
|
"close": false
|
||||||
|
},
|
||||||
|
"problemMatcher": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "build project",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "${workspaceFolder}/.scripts/tasks.sh",
|
||||||
|
"args": [
|
||||||
|
"build"
|
||||||
|
],
|
||||||
|
"presentation": {
|
||||||
|
"reveal": "always",
|
||||||
|
"panel": "shared",
|
||||||
|
"close": false
|
||||||
|
},
|
||||||
|
"problemMatcher": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "flash esp memory",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "${workspaceFolder}/.scripts/tasks.sh",
|
||||||
|
"args": [
|
||||||
|
"flash"
|
||||||
|
],
|
||||||
|
"presentation": {
|
||||||
|
"reveal": "always",
|
||||||
|
"panel": "shared",
|
||||||
|
"close": false
|
||||||
|
},
|
||||||
|
"problemMatcher": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "monitor",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "${workspaceFolder}/.scripts/tasks.sh",
|
||||||
|
"args": [
|
||||||
|
"monitor"
|
||||||
|
],
|
||||||
|
"presentation": {
|
||||||
|
"reveal": "always",
|
||||||
|
"panel": "new",
|
||||||
|
"close": true
|
||||||
|
},
|
||||||
|
"problemMatcher": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "build, flash, and monitor",
|
||||||
|
"dependsOrder": "sequence",
|
||||||
|
"dependsOn": ["build project", "flash esp memory", "monitor"],
|
||||||
|
"problemMatcher": []
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
Et voilà, comme vous pouvez le voir, vous avez toutes les tâches de compilation, execution, et debug imtégrées à
|
||||||
|
vscodium. on peut y accéder en tappant ``F1 -> run task``, et pour gagner du temps, on peut même définir un raccourci clavier
|
||||||
|
Pour gagner encore une étape.
|
||||||
|
|
||||||
|
.. image:: ../images/esp32/run_tasks.png
|
||||||
|
:width: 600
|
||||||
|
|
||||||
|
Et voilà, un appui sur ``Ctrl+F1`` me donne accès à autant de tâches que je voidrai en créer.
|
||||||
|
|
||||||
|
.. image:: ../images/esp32/tasks.png
|
||||||
|
:width: 600
|
||||||
BIN
images/atom_dark_theme_extension.png
Normal file
|
After Width: | Height: | Size: 174 KiB |
BIN
images/emoji_extension.png
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
images/esp32/QEMU_gdb_example.png
Normal file
|
After Width: | Height: | Size: 174 KiB |
BIN
images/esp32/QEMU_http_response.png
Normal file
|
After Width: | Height: | Size: 249 KiB |
BIN
images/esp32/c_cpp_config.png
Normal file
|
After Width: | Height: | Size: 123 KiB |
BIN
images/esp32/debug.png
Normal file
|
After Width: | Height: | Size: 159 KiB |
BIN
images/esp32/include_error.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
images/esp32/include_error_2.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
images/esp32/ms_cpp_extension.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
images/esp32/native_debug_extension.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
images/esp32/openeth_busy.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
images/esp32/run_tasks.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
images/esp32/settings.json.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
images/esp32/tasks.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
images/example_image.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
images/reStructuredText_extension.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
126
index.rst
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:hidden:
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
sphinx/index.rst
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:hidden:
|
||||||
|
:caption: Configuration côté utilisateur
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
xorg/*
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:hidden:
|
||||||
|
:caption: Configuration côté serveur
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
server/*
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:hidden:
|
||||||
|
:caption: Programmation
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
esp32/index.rst
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:hidden:
|
||||||
|
:caption: Sheat Sheet
|
||||||
|
:glob:
|
||||||
|
|
||||||
|
sheatsheet/*
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
:hidden:
|
||||||
|
:caption: Licence
|
||||||
|
|
||||||
|
README.md
|
||||||
|
LICENSE.md
|
||||||
|
|
||||||
|
|
||||||
|
Bienvenue sur la documentation d'UnixYourBrain !
|
||||||
|
================================================
|
||||||
|
|
||||||
|
Je vais avec ce site créer une doc pour toutes mes manip et bidouilles informatiques.
|
||||||
|
|
||||||
|
Le passage à l'ipv6 :
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Bien que de nombreux sites soient accessibles en ipv6, ce n'est pas le cas de tous.
|
||||||
|
Un ``host qwant.com`` ou ``host startpage.com`` nous montrent que des sites suffisament populaires ou fréquentés ne sont toujours pas passés à l'ipv6.
|
||||||
|
De plus, certains opérateurs, comme free pour sa 4g, ne le prennent pas complètement en charge, voir pas du tout.
|
||||||
|
Cela mène généralement à des configurations mixtes ipv4/ipv6 souvent mal maitrisées, complexes et brouillon.
|
||||||
|
Je vais donc m'imposer quelques règles de conduite pour configurer proprement, tout comprendre comme il faut, et l'expliquer dans cette documentation.
|
||||||
|
|
||||||
|
Ipv6 first
|
||||||
|
~~~~~~~~~~
|
||||||
|
|
||||||
|
Que ça soit pour la configuration IP, ou des services, je vais d'abbord configurer l'ipv6, en ipv6 only autant que possible.
|
||||||
|
Côté client :
|
||||||
|
|
||||||
|
* Je configurerai d'abord l'ipv6, et une fois que je me serai assuré qu'elle marche bien, j'ajouterai l'ipv4 pour les sites / serveurs qui ne la gèrent pas encore.
|
||||||
|
* Je configurerai mes bridges et mes machines virtuelles en ipv6 only.
|
||||||
|
|
||||||
|
Côté serveur :
|
||||||
|
|
||||||
|
* Pour la configuration IP, je procèderai de la même manière que pour le côté client.
|
||||||
|
* pour les services personnels et d'administration, je les configuerai uniquement en ipv6
|
||||||
|
* Pour les services publics, je les configurerai en ipv6 first
|
||||||
|
|
||||||
|
Machine virtuelles et test :
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Pour tester mes différentes configurations, je vais utiliser une machine virtuelle.
|
||||||
|
Tout ce qui sera vu dans cette documentation sera testé sur une machine virtuelle locale.
|
||||||
|
Vous pourrez le reporoduire chez vous sans poséder d'IP publique, de serveur ou quoi que ce soit d'autre.
|
||||||
|
|
||||||
|
Rappels :
|
||||||
|
---------
|
||||||
|
|
||||||
|
Avant de commencer, je vais faire un rappel des points suivants :
|
||||||
|
|
||||||
|
Ipv6
|
||||||
|
~~~~
|
||||||
|
|
||||||
|
Je vais bien entendu faire un rappel de l'ipv6, de ce que j'en ai compris.
|
||||||
|
J'étofferai au fur et à mesure de mes découvertes et de mes trouvailles.
|
||||||
|
Étant abonné freebox, je vais aussi expliquer comment free gère et met en place l'ipv6.
|
||||||
|
|
||||||
|
La documentation avec Sphinx
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Cette documentation est faite à l'aide du framework `Sphinx <https://www.sphinx-doc.org/fr/master/>`_.
|
||||||
|
C'est un outil qui permet d'écrire de la documentation simplement au format
|
||||||
|
`reStructuredText (.rst) <https://docutils.sourceforge.io/rst.html>`_.
|
||||||
|
Il dispose aussi d'un plugin pour la syntaxe `Markdown (.md) <https://daringfireball.net/projects/markdown/>`_
|
||||||
|
Je ferai donc une brève documentation de ces syntaxes,
|
||||||
|
et je créerai peut être une documentation sur comment installer et utiliser Sphinx.
|
||||||
|
|
||||||
|
Configuration IP
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Sur un Linux récent, nous avons deux moyens de gérer la configuration IP : networking et systemd-networkd.
|
||||||
|
Pour la configuration, côté client comme serveur, je vais abandonner le service networking pour utiliser uniquement systemd-networkd.
|
||||||
|
|
||||||
|
Iptables
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
Tout au long des manipulations, je vais créer les règles iptables pour sécuriser les outils que je mettrai en place.
|
||||||
|
Tout ce qu'il y a à connaitre sera reporté dans une documentation consacrée à iptables
|
||||||
4
live-reload.sh
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
rm -fr /tmp/sphinx-livereload/
|
||||||
|
sphinx-reload --build-dir /tmp/sphinx-livereload/ ./
|
||||||
161
server/gitlist.rst
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
Installation de GitList
|
||||||
|
=======================
|
||||||
|
|
||||||
|
GitList est une interface web simple et légère écrite en PHP qui permet
|
||||||
|
de visionner l'ensemble de nos dépots git sur un serveur.
|
||||||
|
|
||||||
|
.. warning:: la version 2.0.0 contient un bug qui empèche de
|
||||||
|
parcourir les différents dépots, nous installeront donc la
|
||||||
|
version 1.1.1
|
||||||
|
|
||||||
|
.. note:: J'ai installé GitList sous Debian 11, pour d'autres distributions il
|
||||||
|
faudra adapter quelques paramètres, comme par exemple sous ArchLinux :
|
||||||
|
|
||||||
|
- l'utilisateur apache est ``http`` et non ``www-data``,
|
||||||
|
- le home directory de l'utilisateur apache est ``/srv/http`` et non ``/var/www``.
|
||||||
|
|
||||||
|
configuration d'apache
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
On va configurer un simple vhost, en suivant les `recommendations
|
||||||
|
fournies par le développeur <https://github.com/klaussilveira/gitlist/wiki/Configuring-Gitlist-in-CENTOS7>`_.
|
||||||
|
|
||||||
|
On créer le vhost ``/etc/apache2/sites-available/gitlist.conf`` :
|
||||||
|
|
||||||
|
.. code-block:: apache
|
||||||
|
|
||||||
|
<IfModule mod_ssl.c>
|
||||||
|
<VirtualHost *:443>
|
||||||
|
ServerAdmin webmaster@yourdomain.domain
|
||||||
|
ServerName gitlist.yourdomain.domain
|
||||||
|
DocumentRoot /var/www/gitlist
|
||||||
|
|
||||||
|
<Directory /var/www/gitlist/>
|
||||||
|
Options FollowSymLinks
|
||||||
|
AllowOverride All
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
ErrorLog ${APACHE_LOG_DIR}/gitlist-error.log
|
||||||
|
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||||
|
|
||||||
|
# enable HTTP/2, if available
|
||||||
|
Protocols h2 http/1.1
|
||||||
|
|
||||||
|
SSLEngine on
|
||||||
|
SSLCertificateFile /etc/letsencrypt/live/gitlist.yourdomain.domain/cert.pem
|
||||||
|
SSLCertificateKeyFile /etc/letsencrypt/live/gitlist.yourdomain.domain/privkey.pem
|
||||||
|
SSLCertificateChainFile /etc/letsencrypt/live/gitlist.yourdomain.domain/chain.pem
|
||||||
|
</VirtualHost>
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
Installation de gitlist
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
On se place dans notre repertoire root, on télécharge le zip, on l'extrait :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
cd /var/www/gitlist
|
||||||
|
wget https://github.com/klaussilveira/gitlist/releases/download/1.1.1/gitlist-1.1.1.zip
|
||||||
|
unzip gitlist-1.1.1.zip
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Quand on ouvre notre navigateur, on fait face a plusieurs messages d'erreur.
|
||||||
|
Configurons notre serveur pour que tout fonctionne correctement :
|
||||||
|
|
||||||
|
on créer un dossier ``cache`` et on attribue les droits du répertoire racine à l'utilisateur
|
||||||
|
apache (``www-data``).
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
mkdir cache
|
||||||
|
chown -R www-data:www-data ./
|
||||||
|
|
||||||
|
On créer ensuite le fichier ``config.ini`` à partir du fichier ``config.ini-example`` fourni :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
cp config.ini-example config.ini
|
||||||
|
vi config.ini
|
||||||
|
|
||||||
|
On modifie la ligne suivante pour indiquer le chemin des dépots :
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
repositories[] = '/home/git/repositories/'
|
||||||
|
|
||||||
|
Et voilà, on à la liste de nos dépots. Il reste une erreur quand on essaye de
|
||||||
|
parcourir un dépot. cela est du au fait que l'utilisateur ``www-data`` qui utilise la
|
||||||
|
commande git n'as pas les droits sur le dossier du dépot. Git renvoie l'erreur suivante :
|
||||||
|
``fatal: detected dubious ownership in repository at '/home/git/repositories/doc.git' To add an exception for this directory, call: git config --global --add safe.directory /home/git/repositories/doc.git``.
|
||||||
|
La solution est dans le message, on execute la commande suivante pour chaque dépot :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sudo -u www-data git config --global --add safe.directory /home/git/repositories/doc.git
|
||||||
|
|
||||||
|
.. warning:: git créer un fichier .gitconfig dans le home directory pour stocker ces paramètres.
|
||||||
|
il faut s'assurer que l'utilisateur apache à bien accès en écriture à son home directory.
|
||||||
|
|
||||||
|
|
||||||
|
Sous debian, ``www-data`` utilise ``/var/www`` comme home directory. on le rend accessible en
|
||||||
|
écriture :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
chown www-data:www-data /var/www
|
||||||
|
|
||||||
|
Rendre les dépots clonable par https (en téléchargement uniquement)
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
|
||||||
|
Pour que git puisse cloner un dépot, il besoin de traitements spéciaux côté serveur.
|
||||||
|
Heureusement, git est foutni avec un binaire ``git-http-backend``, qui fait ce traitement.
|
||||||
|
Il suffit de le passer comme script cgi à apache.
|
||||||
|
|
||||||
|
|
||||||
|
On commence à activer les mods nécessaires pour apache :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
a2enmod cgi alias env
|
||||||
|
|
||||||
|
On ajoute ensuite la configuration suivante à notre vhost :
|
||||||
|
|
||||||
|
.. code-block:: apache
|
||||||
|
|
||||||
|
SetEnv GIT_PROJECT_ROOT /data/git
|
||||||
|
SetEnv GIT_HTTP_EXPORT_ALL
|
||||||
|
|
||||||
|
ScriptAlias /git /usr/lib/git-core/git-http-backend
|
||||||
|
|
||||||
|
<Directory "/usr/lib/git-core/">
|
||||||
|
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
Alias /git /data/git
|
||||||
|
|
||||||
|
Pour terminer, on ajouste le config.ini de notre site, notament le http_url_subdir.
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
; http remote
|
||||||
|
show_http_remote = true ; display remote URL for HTTP
|
||||||
|
http_host = '' ; host to use for cloning via HTTP (default: none => uses gitlist web host)
|
||||||
|
use_https = true ; generate URL with https://
|
||||||
|
http_url_subdir = 'git/' ; if cloning via HTTP is triggered using virtual dir (e.g. https://example.com/git/repo.git)
|
||||||
|
; has to end with trailing slash
|
||||||
|
http_user = '' ; user to use for cloning via HTTP (default: none)
|
||||||
|
http_user_dynamic = false ; when enabled, http_user is set to $_SERVER['PHP_AUTH_USER']
|
||||||
330
server/rutorrent.rst
Normal file
@@ -0,0 +1,330 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
Installation de ruTorrent
|
||||||
|
=========================
|
||||||
|
|
||||||
|
Prérequis
|
||||||
|
---------
|
||||||
|
|
||||||
|
Pour l'installation de ruTorrent, il faut au minimum avoid les paquets suivants s'installés :
|
||||||
|
|
||||||
|
- apache 2.4.x
|
||||||
|
- rtorrent 0.9.7
|
||||||
|
- libtorrent 0.13.7
|
||||||
|
- ruTorrent 3.10
|
||||||
|
|
||||||
|
Installation de rtorrent
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Créer un home directory :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
mkdir /data/rtorrent
|
||||||
|
cd /data/rtorrent
|
||||||
|
|
||||||
|
Configurer rtorrent avec le script du développeur : `<https://github.com/rakshasa/rtorrent/wiki/CONFIG-Template>`_
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
curl -Ls "https://raw.githubusercontent.com/wiki/rakshasa/rtorrent/CONFIG-Template.md" \
|
||||||
|
| sed -ne "/^######/,/^### END/p" \
|
||||||
|
| sed -re "s:/home/USERNAME:$HOME:" > ./.rtorrent.rc
|
||||||
|
|
||||||
|
Éditer la config :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
## On modifie les chemins
|
||||||
|
method.insert = cfg.basedir, private|const|string, (cat,"/data/rtorrent/")
|
||||||
|
method.insert = cfg.watch, private|const|string, (cat,(cfg.basedir),"torrent/")
|
||||||
|
...
|
||||||
|
## Commenter les lignes suivantes
|
||||||
|
#execute.throw = sh, -c, (cat,\
|
||||||
|
# "mkdir -p \"",(cfg.download),"\" ",\
|
||||||
|
# "\"",(cfg.logs),"\" ",\
|
||||||
|
# "\"",(cfg.session),"\" ",\
|
||||||
|
# "\"",(cfg.watch),"/load\" ",\
|
||||||
|
# "\"",(cfg.watch),"/start\" ")
|
||||||
|
...
|
||||||
|
## Maxer l'utilisation de la ram
|
||||||
|
pieces.memory.max.set = 1000M
|
||||||
|
...
|
||||||
|
## Loguer les connexions RPC
|
||||||
|
log.xmlrpc = (cat, (cfg.logs), "xmlrpc.log")
|
||||||
|
...
|
||||||
|
## Umask pour du 755/644
|
||||||
|
system.umask.set = 0022
|
||||||
|
...
|
||||||
|
## On démarre le téléchargement pour tout les torrents déposés dans le dossier
|
||||||
|
## Add torrent
|
||||||
|
#schedule2 = watch_load, 11, 10, ((load.verbose, (cat, (cfg.watch), "*.torrent")))
|
||||||
|
## Add & download straight away
|
||||||
|
schedule2 = watch_start, 10, 10, ((load.start_verbose, (cat, (cfg.watch), "*.torrent")))
|
||||||
|
...
|
||||||
|
## On lance le socket unix pour la communication avec ruTorrent, en 777 pour qu apache puisse s'y connecter
|
||||||
|
#system.daemon.set = true
|
||||||
|
network.scgi.open_local = (cat,(session.path),rpc.socket)
|
||||||
|
execute.nothrow = chmod,777,(cat,(session.path),rpc.socket)
|
||||||
|
|
||||||
|
Créer les répertoires :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
mkdir {download,log,.session,torrent}
|
||||||
|
|
||||||
|
Ajouter un utilisateur rtorrent :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
adduser --disabled-login --disabled-password --home /data/rtorrent/ --system rtorrent
|
||||||
|
|
||||||
|
Affecter les bons droits :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
chown -R rtorrent:www-data /data/rtorrent/
|
||||||
|
|
||||||
|
Lancer rtorrent pour tester la config :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sudo -u rtorrent rtorrent
|
||||||
|
|
||||||
|
Configuration d'apache
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
On créer le vhost ``/etc/apache2/sites-available/rutorrent.conf`` :
|
||||||
|
|
||||||
|
.. code-block:: Apacheconf
|
||||||
|
|
||||||
|
<VirtualHost 192.168.1.100:8083>
|
||||||
|
ServerAdmin webmaster@localhost
|
||||||
|
DocumentRoot /var/www/html
|
||||||
|
|
||||||
|
<Directory /var/www/html/>
|
||||||
|
Options Indexes Includes FollowSymLinks MultiViews
|
||||||
|
AllowOverride all
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||||
|
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||||
|
</VirtualHost>
|
||||||
|
|
||||||
|
On ouvre le port dans ``/etc/apache2/ports.conf`` :
|
||||||
|
|
||||||
|
.. code-block:: Apacheconf
|
||||||
|
|
||||||
|
Listen 8083
|
||||||
|
|
||||||
|
On charge la configuration et on redémarre apache :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
a2ensite rutorrent.conf
|
||||||
|
systemctl restart apache2
|
||||||
|
|
||||||
|
Installation de ruTorrent
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
On trouve la dernière version stable `ici <https://github.com/Novik/ruTorrent/releases>`_ :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
cd /var/wwww
|
||||||
|
wget https://github.com/Novik/ruTorrent/archive/v3.10.zip
|
||||||
|
unzip v3.10.zip
|
||||||
|
mv ruTorrent-3.10/ html
|
||||||
|
rm v3.10.zip
|
||||||
|
chown -R www-data:www-data html
|
||||||
|
|
||||||
|
On modifie la configuration de rutorrent : ``conf/config.php`` :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
// On commente le chemin socket ip, et on file le soket unix
|
||||||
|
//$scgi_port = 5000;
|
||||||
|
//$scgi_host = "127.0.0.1";
|
||||||
|
|
||||||
|
// For web->rtorrent link through unix domain socket
|
||||||
|
// (scgi_local in rtorrent conf file), change variables
|
||||||
|
// above to something like this:
|
||||||
|
//
|
||||||
|
$scgi_port = 0;
|
||||||
|
$scgi_host = "unix:///data/rtorrnet/.session/rpc.socket";
|
||||||
|
|
||||||
|
Améliorations
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Si on veut mettre des limites de connection, on rajoute au ``.rtorrent.rc`` :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# Global upload and download rate in KiB.
|
||||||
|
# "0" for unlimited
|
||||||
|
throttle.global_down.max_rate.set_kb = 1000
|
||||||
|
throttle.global_up.max_rate.set_kb = 1000
|
||||||
|
|
||||||
|
Si on veut que rtorrent arrête le téléchargement en cas d'espace disque faible :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# Close torrents when disk-space is low.
|
||||||
|
schedule2 = low_diskspace,5,60,close_low_diskspace=5000M
|
||||||
|
|
||||||
|
Si on veut que le plugin mediainfo fonctionne :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
apt install mediainfo
|
||||||
|
|
||||||
|
Si on veut que le plugin spectrogram fonctionne :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
aptitude install sox
|
||||||
|
|
||||||
|
Si on veut que le pluggin unpack marche :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
apt install unrar
|
||||||
|
|
||||||
|
Pour optimiser les downloads avec peu de seed :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
## Tracker-less torrent and UDP tracker support
|
||||||
|
## (conservative settings for 'private' trackers, change for 'public')
|
||||||
|
dht.mode.set = on
|
||||||
|
# port for DTH (default 6881)
|
||||||
|
#dht.port.set = 6881
|
||||||
|
# Use peer exchange
|
||||||
|
protocol.pex.set = yes
|
||||||
|
# DTH use udp by default
|
||||||
|
trackers.use_udp.set = yes
|
||||||
|
|
||||||
|
Pour avoir le pays des peers, il faut installer GeoIP :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
apt install php-geoip geoip-database
|
||||||
|
systemctl restart apache2.service
|
||||||
|
systemctl restart php7.3-fpm.service
|
||||||
|
|
||||||
|
Iptables
|
||||||
|
--------
|
||||||
|
|
||||||
|
On Ajoute les règles suivantes dans notre firewall :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
ip6tables -A INPUT -i enp1s0 -p tcp --dport 50000 -j ACCEPT
|
||||||
|
ip6tables -A INPUT -i enp1s0 -p udp --dport 6881 -j ACCEPT
|
||||||
|
iptables -A INPUT -i enp1s0 -p tcp --dport 50000 -j ACCEPT
|
||||||
|
iptables -A INPUT -i enp1s0 -p udp --dport 6881 -j ACCEPT
|
||||||
|
|
||||||
|
Script de gestion
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Si on ne veut pas que rtorrent se lance automatiquement au démarrage via systemd,
|
||||||
|
on peut faire un script tout simple qui démarre rtorrent en mode daemon
|
||||||
|
et configure les règles iptables.
|
||||||
|
|
||||||
|
.. important:: Pour cela, il faut d'abord aller dans ``/data/rtorrent/.rtorrent.rc`` et modifier le paramètre : ``system.daemon.set = true``
|
||||||
|
|
||||||
|
Voici le script qui permet de démarrer ou arrêter rtorrent.
|
||||||
|
|
||||||
|
.. warning:: Attention, rtorrent met du temps à s'arrêter, il à beaucoup de connections à fermer.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function start {
|
||||||
|
ps -elf | grep /usr/bin/rtorrent | grep -v "sudo\|grep"
|
||||||
|
if (( $? == 0 )); then
|
||||||
|
printf "rtorrent alerady started\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
printf "starting rtorrent...\n"
|
||||||
|
sudo -u rtorrent nohup /usr/bin/rtorrent &
|
||||||
|
ip6tables -A INPUT -i enp1s0 -p tcp --dport 50000 -j ACCEPT
|
||||||
|
ip6tables -A INPUT -i enp1s0 -p udp --dport 6881 -j ACCEPT
|
||||||
|
iptables -A INPUT -i enp1s0 -p tcp --dport 50000 -j ACCEPT
|
||||||
|
iptables -A INPUT -i enp1s0 -p udp --dport 6881 -j ACCEPT
|
||||||
|
}
|
||||||
|
|
||||||
|
function stop {
|
||||||
|
ps -elf | grep /usr/bin/rtorrent | grep -v "sudo\|grep"
|
||||||
|
if (( $? == 1 )); then
|
||||||
|
printf "rtorrent alerady stoped\n"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
printf "stoping rtorrent...\n"
|
||||||
|
kill $(cat /data/rtorrent/.session/rtorrent.pid)
|
||||||
|
ip6tables -D INPUT -i enp1s0 -p tcp --dport 50000 -j ACCEPT
|
||||||
|
ip6tables -D INPUT -i enp1s0 -p udp --dport 6881 -j ACCEPT
|
||||||
|
iptables -D INPUT -i enp1s0 -p tcp --dport 50000 -j ACCEPT
|
||||||
|
iptables -D INPUT -i enp1s0 -p udp --dport 6881 -j ACCEPT
|
||||||
|
}
|
||||||
|
|
||||||
|
function usage {
|
||||||
|
cat <<EOF
|
||||||
|
rtorrent.sh
|
||||||
|
|
||||||
|
start or stop rtorrent
|
||||||
|
|
||||||
|
-h --help : Print this help
|
||||||
|
-s --start : Start rtorrent
|
||||||
|
--stop : Stop rtorrent
|
||||||
|
EOF
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
##################
|
||||||
|
# MAIN
|
||||||
|
##################
|
||||||
|
|
||||||
|
if [[ -z $1 ]]; then
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
options=$(getopt -o sh -l start,stop,help -- "$@")
|
||||||
|
if [ $? != 0 ]
|
||||||
|
then
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
eval set -- "$options"
|
||||||
|
while true; do
|
||||||
|
case "$1" in
|
||||||
|
-s|--start)
|
||||||
|
start
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
--stop)
|
||||||
|
stop
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage
|
||||||
|
shift
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
exit 0;
|
||||||
122
sheatsheet/git.rst
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
Git Sheatsheet
|
||||||
|
==============
|
||||||
|
|
||||||
|
Initialisation d'un dépot
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
``git init (-b master branch name) (--bare pour un dépot distant sans work area)``
|
||||||
|
|
||||||
|
Clonage, synchronisation et update
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
Clonage
|
||||||
|
|
||||||
|
``git clone <url>``
|
||||||
|
|
||||||
|
Pousser un dépot local sur un dépot distant qui vient d'être initalisé
|
||||||
|
|
||||||
|
``git remote add origin ssh://user@git-server/path/to/myrepo.git``
|
||||||
|
``git push --set-upstream origin master``
|
||||||
|
|
||||||
|
Synchronisation
|
||||||
|
|
||||||
|
``git fetch``
|
||||||
|
|
||||||
|
``git pull <remote(origin)> <branch(master)>``
|
||||||
|
|
||||||
|
Update
|
||||||
|
|
||||||
|
``git push <remote(origin)> <branch(master)>``
|
||||||
|
|
||||||
|
Versionning
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Pour versionner, il faut utiliser git tag.
|
||||||
|
|
||||||
|
``git tag (-a vx.x.x-rcx) (-m "comment")``
|
||||||
|
|
||||||
|
Pour synchroniser le tag avec le dépot distant,
|
||||||
|
il faut un push spécifique pour la version :
|
||||||
|
|
||||||
|
``git push branch(origin) tag(vx.x.x-rcx)``
|
||||||
|
|
||||||
|
pour supprimer un tag
|
||||||
|
|
||||||
|
``git tag -d vx.x.x``
|
||||||
|
|
||||||
|
Et pour le supprimer sur le dépot distant
|
||||||
|
|
||||||
|
``git push --delete origin v1.1.0``
|
||||||
|
|
||||||
|
Commit
|
||||||
|
------
|
||||||
|
|
||||||
|
``git commit (-a all modified files) (-m message)``
|
||||||
|
|
||||||
|
Navigation
|
||||||
|
----------
|
||||||
|
|
||||||
|
``git ls-tree``
|
||||||
|
|
||||||
|
Merge des commit
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Git créer un snapshot à chaque commit, cela améliore les
|
||||||
|
performances par rapport à d'autres systèmes de versionning,
|
||||||
|
mais cela prend vite aussi beaucoup de place.
|
||||||
|
Pour alléger cela, on peut merger une suite de commit en
|
||||||
|
un seul avant de push sur le serveur. On utilise la commande suivante :
|
||||||
|
|
||||||
|
``git rebase -i(--interactive) <merge-after-this-commit>``
|
||||||
|
|
||||||
|
et on remplace les derniers "pick" dans le shell interactif par squash.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
pick 309769c updating .Xressources configuration
|
||||||
|
squash 39a45ab updating .Xressources configuration
|
||||||
|
squash 76f1543 updating .Xressources configuration
|
||||||
|
|
||||||
|
|
||||||
|
example :
|
||||||
|
|
||||||
|
``git rebase -i HEAD~5``
|
||||||
|
|
||||||
|
``git rebase -i 6919b24b1285f00b59eae416faf7ccfba0987843``
|
||||||
|
|
||||||
|
``git rebase -i origin/master`` (pour push un seul commit depuis la dernièrebase
|
||||||
|
synchronisation avec la branche master de notre dépot distant)
|
||||||
|
|
||||||
|
|
||||||
|
Configuration générale
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
``git config --global init.defaultBranch master``
|
||||||
|
|
||||||
|
``git config --global user.email "you@example.com"``
|
||||||
|
|
||||||
|
``git config --global user.name "Your Name"``
|
||||||
|
|
||||||
|
Workflow
|
||||||
|
--------
|
||||||
|
|
||||||
|
``git pull``
|
||||||
|
|
||||||
|
aussi souvent que nmécessaire
|
||||||
|
|
||||||
|
- ``git add``
|
||||||
|
- ``git commit``
|
||||||
|
|
||||||
|
``git rebase -i origin/master``
|
||||||
|
|
||||||
|
``git push``
|
||||||
21
sphinx/documentation.rst
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
Création et organisation de la documentation
|
||||||
|
============================================
|
||||||
|
|
||||||
|
L'arborescence de notre documentation se fera directement dans les fichiers index.rst via
|
||||||
|
l'attribut ``.. toctree::``
|
||||||
|
|
||||||
|
Les différents attributs pour ce bloc sont documentés ici : `Directives toctree <https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html>`_
|
||||||
|
Je vous conseille de faire un tour sur ce lien qui vous montre toutes les spécificités de ce que peut inclure sphinx dans votre documentation grace
|
||||||
|
à la syntaxe rst.
|
||||||
|
|
||||||
|
J'utilise notament la directive :hidden dans mon indec pour ne pas que le bloc toctree s'affiche sur la page mais soit bien pris en compte par le menu
|
||||||
|
|
||||||
18
sphinx/index.rst
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
La documentation avec Sphinx
|
||||||
|
============================
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
installation.rst
|
||||||
|
documentation.rst
|
||||||
|
syntax.rst
|
||||||
270
sphinx/installation.rst
Normal file
@@ -0,0 +1,270 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
Installation de Sphinx
|
||||||
|
======================
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
|
||||||
|
`Sphinx <https://www.sphinx-doc.org/fr/master/>`_ est un framework écrit en `Python <https://www.python.org/>`_
|
||||||
|
qui va parser notre documentation dans la syntaxe `ReSrtucturedText <https://docutils.sourceforge.io/rst.html>`_
|
||||||
|
et la compiler au format html. Le dossier pourra donc être ensuite utilisé par un serveur web comme apache ou nginx
|
||||||
|
pour accéder en ligne à cette documentation. Sphinx porpose aussi d'autres formats de sortie,
|
||||||
|
comme le PDF, l'ePub, le manpage, etc. Sphynx est aussi capable d'utiliser des librairies tiers pour
|
||||||
|
lire d'autres syntaxes comme le MarkDown.
|
||||||
|
|
||||||
|
.. important:: Le dossier de travail pour la suite de cette page sera ``/var/www/html``
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
Toutes les librairies nécessaires sont disponible dans le gestionnaire de paquets debian.
|
||||||
|
Il suffit d'un ``apt install``.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
apt install apache2 python3 python3-sphinx python3-sphinx-autobuild python3-sphinx-rtd-theme python3-pip build-essential
|
||||||
|
|
||||||
|
Création d'un nouveau projet
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
On commence par se placer dans notre dossier html, et on initialise le projet :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
cd /var/www/html
|
||||||
|
sphinx-quickstart
|
||||||
|
|
||||||
|
Et on répond aux questions posées :
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
:emphasize-lines: 11,14,15,16,24
|
||||||
|
|
||||||
|
Welcome to the Sphinx 4.2.0 quickstart utility.
|
||||||
|
|
||||||
|
Please enter values for the following settings (just press Enter to
|
||||||
|
accept a default value, if one is given in brackets).
|
||||||
|
|
||||||
|
Selected root path: .
|
||||||
|
|
||||||
|
You have two options for placing the build directory for Sphinx output.
|
||||||
|
Either, you use a directory "_build" within the root path, or you separate
|
||||||
|
"source" and "build" directories within the root path.
|
||||||
|
> Separate source and build directories (y/n) [n]: y
|
||||||
|
|
||||||
|
The project name will occur in several places in the built documentation.
|
||||||
|
> Project name: Unixyourbrain Documentation
|
||||||
|
> Author name(s): beastie
|
||||||
|
> Project release []: 0.1
|
||||||
|
|
||||||
|
If the documents are to be written in a language other than English,
|
||||||
|
you can select a language here by its language code. Sphinx will then
|
||||||
|
translate text that it generates into that language.
|
||||||
|
|
||||||
|
For a list of supported codes, see
|
||||||
|
https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-language.
|
||||||
|
> Project language [en]: fr
|
||||||
|
|
||||||
|
Creating file /var/www/test/source/conf.py.
|
||||||
|
Creating file /var/www/test/source/index.rst.
|
||||||
|
Creating file /var/www/test/Makefile.
|
||||||
|
Creating file /var/www/test/make.bat.
|
||||||
|
|
||||||
|
Finished: An initial directory structure has been created.
|
||||||
|
|
||||||
|
You should now populate your master file /var/www/test/source/index.rst and create other documentation
|
||||||
|
source files. Use the Makefile to build the docs, like so:
|
||||||
|
make builder
|
||||||
|
where "builder" is one of the supported builders, e.g. html, latex or linkcheck.
|
||||||
|
|
||||||
|
Sphinx nous a automatiquement créé un dossier source dans lequel sera organisé notre documentation.
|
||||||
|
Il créer aussi un Makefile pour générer le site. Dans le dossier source, on retrouve deux fichiers
|
||||||
|
qui vont nous intéresser, le fichier conf.py, qui contient la configuration propre à sphinx, et
|
||||||
|
un fichier index.rst qui sera le point d'entrée de notre documentation.
|
||||||
|
|
||||||
|
Configuration du thème ReadTheDocs
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
dans le fichier ``source/conf.py`` il faut modifier le paramètre ``html_theme``
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
html_theme = 'sphinx_rtd_theme'
|
||||||
|
|
||||||
|
on peut aussi ajouter quelques options pour plus de confort
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
html_theme_options = {
|
||||||
|
'collapse_navigation': False,
|
||||||
|
'prev_next_buttons_location': 'both',
|
||||||
|
}
|
||||||
|
|
||||||
|
Les options du thème sont documentées
|
||||||
|
`ici <https://sphinx-rtd-theme.readthedocs.io/en/stable/configuring.html>`_
|
||||||
|
|
||||||
|
Modification du CSS
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Le thème readthedocs ne propose pas les blocs de code sur fond sombre. Heureusement,
|
||||||
|
sphinx nous permet de rajouter du css et du javascript personnalisé. Pour ça, on créer le fichier
|
||||||
|
``source/_static/css/custom.css``. On y ajoute les lignes suivantes :
|
||||||
|
|
||||||
|
.. code-block:: css
|
||||||
|
|
||||||
|
.rst-content pre.literal-block, .rst-content div[class^="highlight"] {
|
||||||
|
background: #212121;
|
||||||
|
color: #fff;
|
||||||
|
border: 1px solid #3a3a3a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content div.highlight span.linenos {
|
||||||
|
border-right: 1px solid #3a3a3a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rst-content div[class^="highlight"] pre .hll {
|
||||||
|
background-color: #13533b;
|
||||||
|
}
|
||||||
|
|
||||||
|
Une fois le CSS créé, il faut le renseigner dans la configuration de sphinx.
|
||||||
|
On édite le fichier ``soucre/conf.py`` et on ajoute après les lignes 3 à 5 après le
|
||||||
|
paramètre ``html_static_path``
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
html_static_path = ['_static']
|
||||||
|
|
||||||
|
html_css_files = [
|
||||||
|
'css/custom.css',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
Si vous modifiez le CSS après avoir lancé un liveserveur, celui ci ne sera pas automatiquement
|
||||||
|
pris en compte. Il faudra supprimer le dossier ``_build``.
|
||||||
|
(cf. `Utilisation d'un liveserveur <#utilisation-d-un-liveserveur>`__)
|
||||||
|
|
||||||
|
Utilisation d'un liveserveur
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
Pour faclilter l'édition de la documentation, sphinx nous fournit le paquet
|
||||||
|
``python3-sphinx-autobuild``. Dans le dossier ``/var/www/html``,
|
||||||
|
il suffit de lancer la commande suivante :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
sphinx-autobuild source/ _build/
|
||||||
|
|
||||||
|
On peut désormais se connecter à l'adresse suivante : `<http://127.0.0.1:8000>`_. À chaque sauvegarde
|
||||||
|
d'un fichier de documentation, le liveserveur va régénérer les fichiers html, et recharger
|
||||||
|
la page automatiquement.
|
||||||
|
|
||||||
|
.. attention::
|
||||||
|
|
||||||
|
le liveserveur ne régénère pas automatiquement le menu. lors d'un changement dans le
|
||||||
|
menu il faut supprimer notre dossier _build
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
rm -fr _build
|
||||||
|
|
||||||
|
Compilation et mise en ligne
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
Pour mettre en ligne notre documentation, il faut d'abbord générer l'arborescence
|
||||||
|
html à l'aide de sphinx. On le fait à l'aide de la commande make fournie par
|
||||||
|
le paquet build-essential.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
make html
|
||||||
|
|
||||||
|
Sphinx créer un dossier build pour générer la documentation.
|
||||||
|
on retrouve dans ce dossier un dossier html contenant le site de notre documentation.
|
||||||
|
C'est ce dossier que l'on va présenter comme racine du site web.
|
||||||
|
|
||||||
|
Pour le mettre en ligne, il suffit de configurer un vhost apache avec la configuration
|
||||||
|
suivante :
|
||||||
|
|
||||||
|
.. code-block:: apacheconf
|
||||||
|
|
||||||
|
<VirtualHost *:80>
|
||||||
|
ServerAdmin webmaster@localhost
|
||||||
|
DocumentRoot /var/www/html/build/html
|
||||||
|
|
||||||
|
<Directory /var/www/html/build/html/>
|
||||||
|
Options -Indexes -FollowSymLinks
|
||||||
|
AllowOverride none
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||||
|
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||||
|
</VirtualHost>
|
||||||
|
|
||||||
|
Création d'un venv
|
||||||
|
------------------
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Depuis peu on ne peut plus unstaller des paquets avec pip en global sur notre
|
||||||
|
distribution, il va donc falloir créer un environnement virtuel python.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
python -m venv .venv
|
||||||
|
source .venv/bin/activate
|
||||||
|
pip install sphinx_rtd_theme
|
||||||
|
|
||||||
|
Prise en charge du format MarkDown
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
Pour interpréter le MarkDown, Sphinx utilise la librairie python `MyST <https://myst-parser.readthedocs.io/en/latest/>`_
|
||||||
|
On l'installe à partir du gestionnaire de paquets python `pip <http://link>`_
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
pip install --upgrade myst-parser
|
||||||
|
|
||||||
|
On ajoute ensuite les lignes suivantes dans ``soucre/conf.py``
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
extensions = [
|
||||||
|
'myst_parser'
|
||||||
|
]
|
||||||
|
source_suffix = {
|
||||||
|
'.rst': 'restructuredtext',
|
||||||
|
'.txt': 'markdown',
|
||||||
|
'.md': 'markdown',
|
||||||
|
}
|
||||||
|
|
||||||
|
Ajout su support pour les emoji
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
Pour ça il faut unstaller le package python ``sphinxemoji``
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
pip install --upgrade sphinxemoji
|
||||||
|
|
||||||
|
On configure ensuite sphinx afin qu'il utilise l'extension :
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
extensions = [
|
||||||
|
'sphinxemoji.sphinxemoji',
|
||||||
|
]
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
Ce module n'est pas compatible avec ``sphinx-autobuild``, il faut
|
||||||
|
donc désactiver cette option dans la configuration pour pouvoir
|
||||||
|
utiliser le live serveur.
|
||||||
|
|
||||||
|
Voilà, c'est fini, vous trouverez toutes les emoji et toutes les explications `ici <https://sphinxemojicodes.readthedocs.io/en/stable/>`_ |:smile:|
|
||||||
214
sphinx/syntax.rst
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
La syntaxe reStructuredText
|
||||||
|
===========================
|
||||||
|
|
||||||
|
Les titres
|
||||||
|
----------
|
||||||
|
|
||||||
|
Les liens
|
||||||
|
---------
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
`ReSrtucturedText <https://docutils.sourceforge.io/rst.html>`_
|
||||||
|
|
||||||
|
Resultat :
|
||||||
|
|
||||||
|
`ReSrtucturedText <https://docutils.sourceforge.io/rst.html>`_
|
||||||
|
|
||||||
|
Les listes
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
Bullet lists:
|
||||||
|
|
||||||
|
- This is item 1
|
||||||
|
- This is item 2
|
||||||
|
|
||||||
|
Resultat :
|
||||||
|
|
||||||
|
Bullet lists:
|
||||||
|
|
||||||
|
- This is item 1
|
||||||
|
- This is item 2
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
Enumerated lists:
|
||||||
|
|
||||||
|
3. This is the first item
|
||||||
|
4. This is the second item
|
||||||
|
#. Auto ennumerated item
|
||||||
|
|
||||||
|
Resultat :
|
||||||
|
|
||||||
|
Enumerated lists:
|
||||||
|
|
||||||
|
3. This is the first item
|
||||||
|
4. This is the second item
|
||||||
|
#. Auto ennumerated item
|
||||||
|
|
||||||
|
Plus d'infos `ici <https://docutils.sourceforge.io/docs/user/rst/quickref.html#bullet-lists>`_.
|
||||||
|
|
||||||
|
Les blocs
|
||||||
|
---------
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
.. error:: text
|
||||||
|
|
||||||
|
Resultat :
|
||||||
|
|
||||||
|
.. error:: text
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
.. warning:: text
|
||||||
|
|
||||||
|
Resultat :
|
||||||
|
|
||||||
|
.. warning:: text
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
.. note:: text
|
||||||
|
|
||||||
|
Resultat :
|
||||||
|
|
||||||
|
.. note:: text
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
.. tip:: text
|
||||||
|
|
||||||
|
Resultat :
|
||||||
|
|
||||||
|
.. tip:: text
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
.. important:: text
|
||||||
|
|
||||||
|
Resultat :
|
||||||
|
|
||||||
|
.. important:: text
|
||||||
|
|
||||||
|
Les Maths
|
||||||
|
---------
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
(a + b)^2 = a^2 + 2ab + b^2 \\
|
||||||
|
= a^2 - 2ab + b^2
|
||||||
|
|
||||||
|
Resultat :
|
||||||
|
|
||||||
|
.. math::
|
||||||
|
(a + b)^2 = a^2 + 2ab + b^2 \\
|
||||||
|
= a^2 - 2ab + b^2
|
||||||
|
|
||||||
|
Plus d'infos sur ce bloc `ici <https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#math>`_.
|
||||||
|
|
||||||
|
Le code
|
||||||
|
-------
|
||||||
|
|
||||||
|
analysé avec la librairie `Pygments <https://pygments.org/>`_. Pour en
|
||||||
|
savoir plus sur son utilisation et les langages supportés, c'est `ici <https://pygments.org/languages/>`_
|
||||||
|
|
||||||
|
Code "inline"
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Le code "inline" est un génère un objet html <inline> qui s'intègre dans le texte comme ``ceci``
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
``code``
|
||||||
|
|
||||||
|
Resultat :
|
||||||
|
|
||||||
|
``code``
|
||||||
|
|
||||||
|
Code "block"
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Le code "block" génère un bojet html <block>. La syntaxe rst est la suivante :
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
:lineno-start: 5
|
||||||
|
:caption: caption
|
||||||
|
:name: a label
|
||||||
|
:emphasize-lines: 2,6
|
||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
function start() {
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
discord --no-sandbox $1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
:linenos:
|
||||||
|
:lineno-start: 5
|
||||||
|
:caption: a caption
|
||||||
|
:name: a label
|
||||||
|
:emphasize-lines: 2,6
|
||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
function start() {
|
||||||
|
while :
|
||||||
|
do
|
||||||
|
discord --no-sandbox $1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
| Les paramètres ne sont pas très compliqués :
|
||||||
|
| ``:lineos:`` : affiche les numéros de ligne
|
||||||
|
| ``:linestart: number`` : affiche les numéros de ligne
|
||||||
|
| ``:caption: string`` : affiche un titre au bloc de code
|
||||||
|
| ``:name: string`` : ???
|
||||||
|
| ``:emphasize-lines: number list coma separated`` : met en surbrillance les lignes renseignées par cette option
|
||||||
|
|
||||||
|
Inclure un fichier de Code
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
On peut avec Sphinx inclure un fichier de code dans in bloc.
|
||||||
|
Ici, j'inclus le code de cette page dans un bloc de code rst
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
.. literalinclude:: syntax.rst
|
||||||
|
:language: rst
|
||||||
|
|
||||||
|
Resultat :
|
||||||
|
|
||||||
|
.. literalinclude:: syntax.rst
|
||||||
|
:language: rst
|
||||||
|
|
||||||
|
Les images
|
||||||
|
----------
|
||||||
|
|
||||||
|
.. code-block:: rst
|
||||||
|
|
||||||
|
.. image:: ../images/example_image.png
|
||||||
|
:width: 400
|
||||||
|
:alt: Alternative text
|
||||||
|
|
||||||
|
Resultat :
|
||||||
|
|
||||||
|
.. image:: ../images/example_image.png
|
||||||
|
:width: 400
|
||||||
|
:alt: Alternative text
|
||||||
146
xorg/urxvt.rst
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
Installation de rxvt unicode
|
||||||
|
============================
|
||||||
|
|
||||||
|
Rxvt-unicore ou urxvt est un terminal léger, configurable et facile d'accès. C'est
|
||||||
|
une bonne alternative a xterm, il est plus puissant tout en restant aussi simple,
|
||||||
|
et évite d'installer des terminaux trop lourds comme ceux fournis avec les plus
|
||||||
|
grosses interfaces graphiques.
|
||||||
|
|
||||||
|
Prérequis
|
||||||
|
---------
|
||||||
|
|
||||||
|
Aucun, sous arch, il suffit d'ouvrir un shell et de l'installer.
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
pacman -S rxvt-unicode
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
|
||||||
|
La configuration se fait depuis .Xresources, soit depuis ``/etc/X11/xinit/`` pour la configuration globale,
|
||||||
|
ou depuis ``~/.Xresources`` pour la surdéfinition des paramètres par l'utilisateur.
|
||||||
|
voici les paramètres généraux que j'utilise, plus d'infos dans le manpage (ou via un moteur de recherche |:smile:|)
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
!-------------------------
|
||||||
|
! Global Term Parameters
|
||||||
|
!-------------------------
|
||||||
|
|
||||||
|
*.foreground:#abb2bf
|
||||||
|
*.foreground-dark:#5c6370
|
||||||
|
*.background:#282c34
|
||||||
|
*.background-light:#333842
|
||||||
|
*.background-dark:#21252b
|
||||||
|
*.cursorColor:#98c379
|
||||||
|
*.scrollBar:false
|
||||||
|
*.saveLines:65535
|
||||||
|
*.termName:rxvt-unicode
|
||||||
|
*.font:xft:DejaVu Sans Mono:style=Regular:size=12:antialias=true
|
||||||
|
*.boldFont:xft:DejaVu Sans Mono:style=Bold:size=12:antialias=true
|
||||||
|
!*.font:xft:Material Icons:style=Regular:size=14:antialias=true
|
||||||
|
!*.boldFont:xft:Iosevka Nerd Font Mono:style=Bold:size=14:antialias=true
|
||||||
|
!*.letterSpace:-4
|
||||||
|
*.intensityStyles:true
|
||||||
|
*.iconFile:/usr/share/icons/ePapirus/96x96/apps/urxvt.svg
|
||||||
|
*.cutchars:"()<>=[]{}|\"\`'*"
|
||||||
|
*.iso14755:false
|
||||||
|
*.utf8:true
|
||||||
|
*.geometry:87x27
|
||||||
|
|
||||||
|
!-------------------------
|
||||||
|
! One Dark theme colors
|
||||||
|
!-------------------------
|
||||||
|
|
||||||
|
!Black & grey
|
||||||
|
!*color0:#21252b
|
||||||
|
!*color8:#282c34
|
||||||
|
!Red & lightred
|
||||||
|
*color1:#e06c75
|
||||||
|
*color9:#e06c75
|
||||||
|
!Green & lightgreen
|
||||||
|
*color2:#98c379
|
||||||
|
*color10:#98c379
|
||||||
|
!Yellow & lightyellow
|
||||||
|
*color3:#ffd766
|
||||||
|
*color11:#ffd766
|
||||||
|
!Blue & lightblue
|
||||||
|
*color4:#61afef
|
||||||
|
*color12:#61afef
|
||||||
|
!Magenta & lightmagenta
|
||||||
|
*color5:#c678dd
|
||||||
|
*color13:#c678dd
|
||||||
|
!Cyan & lightcyan
|
||||||
|
*color6:#56b6c2
|
||||||
|
*color14:#56b6c2
|
||||||
|
!Lightgrey & white
|
||||||
|
!*color7:#333842
|
||||||
|
!*color15:#d7dae0
|
||||||
|
|
||||||
|
!-------------------------
|
||||||
|
! Rxvt Only
|
||||||
|
!-------------------------
|
||||||
|
URxvt.perl-ext:-confirm-paste
|
||||||
|
|
||||||
|
! Pseudo Transparency
|
||||||
|
!URxvt.transparent: true
|
||||||
|
!URxvt.shading: 50
|
||||||
|
!URxvt.blurRadius: 20
|
||||||
|
|
||||||
|
! True Transparency (works only with a composite manager like xcompmgr !)
|
||||||
|
!URxvt.depth: 32
|
||||||
|
!URxvt.background:[50]#282c34
|
||||||
|
!URxvt.background:rgba:2800/2c00/3400/F000
|
||||||
|
|
||||||
|
Utilisation des extensions perl
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
Le point fort d'urxvt c'est de pouvoir charger des extensions en perl et le rendre hautement configurable.
|
||||||
|
sous arch, il y en a installées par defaut dans ``/usr/lib/urxvt/perl``. Si vous ne trouvez pas la votre,
|
||||||
|
il faudra la télécharger dans ce dossier.
|
||||||
|
|
||||||
|
Pour les configuer, toujours dans ``.Xresources`` il faut ajouter les lignes suivantes :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
URxvt.perl-lib:/usr/lib/urxvt/perl
|
||||||
|
URxvt.perl-ext-common:tabbed,resize-font,matcher
|
||||||
|
|
||||||
|
!Configure font size extension :
|
||||||
|
URxvt.keysym.C-Up: resize-font:bigger
|
||||||
|
URxvt.keysym.C-Down: resize-font:smaller
|
||||||
|
URxvt.keysym.C-equal: resize-font:reset
|
||||||
|
URxvt.keysym.C-slash: resize-font:show
|
||||||
|
|
||||||
|
!Configure Url Launcher
|
||||||
|
URxvt.url-launcher: firefox
|
||||||
|
URxvt.matcher.button: C-1
|
||||||
|
URxvt.keysym.C-u: perl:matcher:select
|
||||||
|
|
||||||
|
!Configure tabbed extension according terminal.sexy
|
||||||
|
!*.color0: #101010
|
||||||
|
!*.color1: #008800
|
||||||
|
*.tabbed.tabbar-bg: 0
|
||||||
|
*.tabbed.tab-fg: 0
|
||||||
|
*.tabbed.tab-bg: 1
|
||||||
|
*.tabbed.tabbar-fg: 1
|
||||||
|
|
||||||
|
Choisir son jeu de couleur
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Voici un lien sympa qui nous aide à choisir nos couleurs pour avoir des contrastes qui rendent l'interface
|
||||||
|
accessible : `terminal sexy <https://terminal.sexy/#DwoY0svhGRIlIxoyNipKUD9tcVqXk4C0ua7P5OHtda7C2rzJarecg8mwZ6SPuq3T0YSqcLOb>`_.
|
||||||
|
|
||||||
|
Notes
|
||||||
|
-----
|
||||||
|
Le copier coller se fait avec ``Ctrl+Alt+C`` et ``Ctrl+Alt+V``.
|
||||||
66
xorg/vscodium.rst
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
..
|
||||||
|
Copyright (C) 2023 Jeremie Salvi.
|
||||||
|
Permission is granted to copy, distribute and/or modify this document
|
||||||
|
under the terms of the GNU Free Documentation License, Version 1.3
|
||||||
|
or any later version published by the Free Software Foundation;
|
||||||
|
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
|
||||||
|
A copy of the license is included in the section entitled "GNU
|
||||||
|
Free Documentation License".
|
||||||
|
|
||||||
|
Configuration de VSCodium
|
||||||
|
=========================
|
||||||
|
|
||||||
|
VSCodium est un fork de l'environnement de développement créé par windows, mais qui
|
||||||
|
suprime la télémétrie Microsoft, et remplace les quelques portions sous licence du
|
||||||
|
logiciel, comme l'icone et le logo par exemple. Il n'a malheureusement plus accès à
|
||||||
|
la bibliothèque en ligne d'extensions, il en utilise une alternative plutôt bien fournie,
|
||||||
|
mais certaines extensions devront ête téléchargées et installées à la main.
|
||||||
|
|
||||||
|
je vais documenter ici ma configuration, les astuces pour utliser l'environnement, et les
|
||||||
|
extensions générales que j'utilise. Pour celles propre à des projets ou des langages, je
|
||||||
|
le documenterai dans la section en conséquence.
|
||||||
|
|
||||||
|
Prérequis
|
||||||
|
---------
|
||||||
|
|
||||||
|
Codium est basé sur electron, il est donc multi-plateforme. Pour les prérequis, ils sont
|
||||||
|
listés sur `AUR (Arch User Repositories) <https://aur.archlinux.org/packages/vscodium-bin>`_.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
On l'installe comme n'importe quel paquet AUR :
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
cd /opt
|
||||||
|
git clone https://aur.archlinux.org/vscodium-bin.git
|
||||||
|
cd vscodium-bin/
|
||||||
|
makepkg
|
||||||
|
pacman -U vscodium-bin-1.72.2.22289-1-x86_64.pkg.tar.zst
|
||||||
|
|
||||||
|
Extensions
|
||||||
|
----------
|
||||||
|
|
||||||
|
Atom One Dark Theme
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Un thème sombre mais avec des contrastes meilleurs que celui de base.
|
||||||
|
C'est le thème de base de l'éditeur Atom.
|
||||||
|
Il est dans le store, il suffit de tapper dark thème
|
||||||
|
|
||||||
|
.. image:: ../images/atom_dark_theme_extension.png
|
||||||
|
|
||||||
|
reStructuredText Syntax highlighting
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
Très pratique pour la documentation avec Sphinx. Disponible dans le store.
|
||||||
|
|
||||||
|
.. image:: ../images/reStructuredText_extension.png
|
||||||
|
|
||||||
|
emojisense
|
||||||
|
~~~~~~~~~~
|
||||||
|
Très pratique à utiliser avec sphinx pour agrémenter notre documentation de
|
||||||
|
petits emoji 😃. on lance l'intellisense avec ``Ctrl+i``.
|
||||||
|
|
||||||
|
.. image:: ../images/emoji_extension.png
|
||||||
|
|
||||||