mirror of https://github.com/kianby/blog
init
parent
0538f61b5a
commit
ac45ac1b6c
@ -1,104 +1,8 @@
|
|||||||
# Byte-compiled / optimized / DLL files
|
_site
|
||||||
__pycache__/
|
*.pyc
|
||||||
*.py[cod]
|
__pycache__
|
||||||
*$py.class
|
|
||||||
|
|
||||||
# C extensions
|
|
||||||
*.so
|
|
||||||
|
|
||||||
# Distribution / packaging
|
|
||||||
.Python
|
|
||||||
build/
|
|
||||||
develop-eggs/
|
|
||||||
dist/
|
|
||||||
downloads/
|
|
||||||
eggs/
|
|
||||||
.eggs/
|
|
||||||
lib/
|
|
||||||
lib64/
|
|
||||||
parts/
|
|
||||||
sdist/
|
|
||||||
var/
|
|
||||||
wheels/
|
|
||||||
*.egg-info/
|
|
||||||
.installed.cfg
|
|
||||||
*.egg
|
|
||||||
MANIFEST
|
|
||||||
|
|
||||||
# PyInstaller
|
|
||||||
# Usually these files are written by a python script from a template
|
|
||||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
||||||
*.manifest
|
|
||||||
*.spec
|
|
||||||
|
|
||||||
# Installer logs
|
|
||||||
pip-log.txt
|
|
||||||
pip-delete-this-directory.txt
|
|
||||||
|
|
||||||
# Unit test / coverage reports
|
|
||||||
htmlcov/
|
|
||||||
.tox/
|
|
||||||
.coverage
|
.coverage
|
||||||
.coverage.*
|
htmlcov
|
||||||
.cache
|
*.sw?
|
||||||
nosetests.xml
|
.DS_Store
|
||||||
coverage.xml
|
venv
|
||||||
*.cover
|
|
||||||
.hypothesis/
|
|
||||||
.pytest_cache/
|
|
||||||
|
|
||||||
# Translations
|
|
||||||
*.mo
|
|
||||||
*.pot
|
|
||||||
|
|
||||||
# Django stuff:
|
|
||||||
*.log
|
|
||||||
local_settings.py
|
|
||||||
db.sqlite3
|
|
||||||
|
|
||||||
# Flask stuff:
|
|
||||||
instance/
|
|
||||||
.webassets-cache
|
|
||||||
|
|
||||||
# Scrapy stuff:
|
|
||||||
.scrapy
|
|
||||||
|
|
||||||
# Sphinx documentation
|
|
||||||
docs/_build/
|
|
||||||
|
|
||||||
# PyBuilder
|
|
||||||
target/
|
|
||||||
|
|
||||||
# Jupyter Notebook
|
|
||||||
.ipynb_checkpoints
|
|
||||||
|
|
||||||
# pyenv
|
|
||||||
.python-version
|
|
||||||
|
|
||||||
# celery beat schedule file
|
|
||||||
celerybeat-schedule
|
|
||||||
|
|
||||||
# SageMath parsed files
|
|
||||||
*.sage.py
|
|
||||||
|
|
||||||
# Environments
|
|
||||||
.env
|
|
||||||
.venv
|
|
||||||
env/
|
|
||||||
venv/
|
|
||||||
ENV/
|
|
||||||
env.bak/
|
|
||||||
venv.bak/
|
|
||||||
|
|
||||||
# Spyder project settings
|
|
||||||
.spyderproject
|
|
||||||
.spyproject
|
|
||||||
|
|
||||||
# Rope project settings
|
|
||||||
.ropeproject
|
|
||||||
|
|
||||||
# mkdocs documentation
|
|
||||||
/site
|
|
||||||
|
|
||||||
# mypy
|
|
||||||
.mypy_cache/
|
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
BSD 2-Clause License
|
|
||||||
|
|
||||||
Copyright (c) 2019, Yax
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -0,0 +1,22 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
=====================
|
||||||
|
Copyright (c) 2018 Sunaina Pai
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@ -0,0 +1,75 @@
|
|||||||
|
site:
|
||||||
|
./makesite.py
|
||||||
|
|
||||||
|
serve: site
|
||||||
|
cd _site && python -m SimpleHTTPServer 2> /dev/null || python3 -m http.server
|
||||||
|
|
||||||
|
venv2:
|
||||||
|
virtualenv ~/.venv/makesite
|
||||||
|
echo . ~/.venv/makesite/bin/activate > venv
|
||||||
|
. ./venv && pip install commonmark coverage
|
||||||
|
|
||||||
|
venv: FORCE
|
||||||
|
python3 -m venv ~/.venv/makesite
|
||||||
|
echo . ~/.venv/makesite/bin/activate > venv
|
||||||
|
. ./venv && pip install commonmark coverage
|
||||||
|
|
||||||
|
test: FORCE
|
||||||
|
. ./venv && python -m unittest -bv
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
. ./venv && coverage run --branch --source=. -m unittest discover -bv; :
|
||||||
|
. ./venv && coverage report -m
|
||||||
|
. ./venv && coverage html
|
||||||
|
|
||||||
|
clean:
|
||||||
|
find . -name "__pycache__" -exec rm -r {} +
|
||||||
|
find . -name "*.pyc" -exec rm {} +
|
||||||
|
rm -rf .coverage htmlcov
|
||||||
|
|
||||||
|
REV = cat /tmp/rev.txt
|
||||||
|
example:
|
||||||
|
#
|
||||||
|
# Remove existing output directories.
|
||||||
|
rm -rf _site /tmp/_site
|
||||||
|
#
|
||||||
|
# Create params.json for makesite-demo.
|
||||||
|
echo '{ "base_path": "/makesite-demo", "site_url":' \
|
||||||
|
'"https://tmug.github.io/makesite-demo" }' > params.json
|
||||||
|
#
|
||||||
|
# Generate the website.
|
||||||
|
. ./venv && ./makesite.py
|
||||||
|
rm params.json
|
||||||
|
#
|
||||||
|
# Get current commit ID.
|
||||||
|
git rev-parse --short HEAD > /tmp/rev.txt
|
||||||
|
#
|
||||||
|
# Write a README for makesite-demo repository.
|
||||||
|
echo makesite.py demo > _site/README.md
|
||||||
|
echo ================ >> _site/README.md
|
||||||
|
echo This is the HTML/CSS source of an example static >> _site/README.md
|
||||||
|
echo website auto-generated with [sunainapai/makesite][makesite] >> _site/README.md
|
||||||
|
echo "([$$($(REV))][commit])". >> _site/README.md
|
||||||
|
echo >> _site/README.md
|
||||||
|
echo Visit "<https://tmug.github.io/makesite-demo>" to >> _site/README.md
|
||||||
|
echo view the example website. >> _site/README.md
|
||||||
|
echo >> _site/README.md
|
||||||
|
echo [makesite]: https://github.com/sunainapai/makesite >> _site/README.md
|
||||||
|
echo [commit]: https://github.com/sunainapai/makesite/commit/$$($(REV)) >> _site/README.md
|
||||||
|
echo [demo]: https://tmug.github.io/makesite-demo >> _site/README.md
|
||||||
|
#
|
||||||
|
# Publish makesite-demo.
|
||||||
|
mv _site /tmp
|
||||||
|
cd /tmp/_site && git init
|
||||||
|
cd /tmp/_site && git config user.name Makesite
|
||||||
|
cd /tmp/_site && git config user.email makesite@example.com
|
||||||
|
cd /tmp/_site && git add .
|
||||||
|
cd /tmp/_site && git commit -m "Auto-generated with sunainapai/makesite - $$($(REV))"
|
||||||
|
cd /tmp/_site && git remote add origin https://github.com/tmug/makesite-demo.git
|
||||||
|
cd /tmp/_site && git log
|
||||||
|
cd /tmp/_site && git push -f origin master
|
||||||
|
|
||||||
|
loc:
|
||||||
|
grep -vE '^[[:space:]]*#|^[[:space:]]*$$|^[[:space:]]*"""' makesite.py | wc -l
|
||||||
|
|
||||||
|
FORCE:
|
@ -0,0 +1,413 @@
|
|||||||
|
makesite.py
|
||||||
|
===========
|
||||||
|
Take full control of your static website/blog generation by writing your
|
||||||
|
own simple, lightweight, and magic-free static site generator in
|
||||||
|
Python. That's right! Reinvent the wheel, fellas!
|
||||||
|
|
||||||
|
[![View Source][SOURCE-BADGE]](makesite.py)
|
||||||
|
[![View Demo][DEMO-BADGE]](https://tmug.github.io/makesite-demo)
|
||||||
|
[![MIT License][LICENSE-BADGE]](LICENSE.md)
|
||||||
|
|
||||||
|
[SOURCE-BADGE]: https://img.shields.io/badge/view-source-brightgreen.svg
|
||||||
|
[DEMO-BADGE]: https://img.shields.io/badge/view-demo-brightgreen.svg
|
||||||
|
[LICENSE-BADGE]: https://img.shields.io/badge/license-MIT-blue.svg
|
||||||
|
|
||||||
|
|
||||||
|
Contents
|
||||||
|
--------
|
||||||
|
* [Introduction](#introduction)
|
||||||
|
* [But Why?](#but-why)
|
||||||
|
* [Get Started](#get-started)
|
||||||
|
* [The Code](#the-code)
|
||||||
|
* [Layout](#layout)
|
||||||
|
* [Content](#content)
|
||||||
|
* [Credits](#credits)
|
||||||
|
* [License](#license)
|
||||||
|
* [Support](#support)
|
||||||
|
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
This repository contains the source code of an example website
|
||||||
|
containing two static blogs and a few static pages. The website can be
|
||||||
|
generated by running [makesite.py](makesite.py). The output looks like
|
||||||
|
[this](https://tmug.github.io/makesite-demo). That's it!
|
||||||
|
|
||||||
|
So go ahead, fork this repository, replace the [content](content) with
|
||||||
|
your own, and generate your static website. It's that simple!
|
||||||
|
|
||||||
|
You are [free](LICENSE.md) to copy, use, and modify this project for
|
||||||
|
your blog or website, so go ahead and fork this repository and make it
|
||||||
|
your own project. Change the [layout](layout) if you wish to, improve
|
||||||
|
the [stylesheet](static/css/style.css) to suit your taste, enhance
|
||||||
|
[makesite.py](makesite.py) if you need to, and develop your website/blog
|
||||||
|
just the way you want it.
|
||||||
|
|
||||||
|
|
||||||
|
But Why?
|
||||||
|
--------
|
||||||
|
For fun and profit! Okay, maybe not for profit, but hopefully for fun.
|
||||||
|
|
||||||
|
Have you used a popular static site generator like Jekyll to generate
|
||||||
|
your blog? I have too. It is simple and great. But then did you yearn
|
||||||
|
to use something even simpler to generate your blog? Do you like Python?
|
||||||
|
Perhaps the thought of writing your own static site generator crossed
|
||||||
|
your mind but you thought it would be too much work? If you answered
|
||||||
|
"yes" to these questions, then this project is for you.
|
||||||
|
|
||||||
|
With [makesite.py](makesite.py), you are in full control. There is no
|
||||||
|
hidden magic! There is no need to read any documentation to understand
|
||||||
|
how it works. There is no need to learn how to write configuration files
|
||||||
|
to produce some desired effect.
|
||||||
|
|
||||||
|
With [makesite.py](makesite.py):
|
||||||
|
|
||||||
|
- The code is the documentation.
|
||||||
|
- The code is the configuration.
|
||||||
|
|
||||||
|
Everything is laid out as plain and simple Python code for you to read
|
||||||
|
and enhance. It is less than 130 lines of code (excluding comments,
|
||||||
|
docstrings, and blank lines). It gets you off the ground pretty quickly.
|
||||||
|
You only need to execute `makesite.py`.
|
||||||
|
|
||||||
|
You can develop a decent website/blog within a few minutes and then you
|
||||||
|
can begin tinkering with the [source code](makesite.py), the
|
||||||
|
[layout](layout), and the [stylesheet](static/css/style.css) to
|
||||||
|
customize the look and feel of your website to your satisfaction.
|
||||||
|
|
||||||
|
|
||||||
|
Get Started
|
||||||
|
-----------
|
||||||
|
This section provides some quick steps to get you off the ground as
|
||||||
|
quickly as possible.
|
||||||
|
|
||||||
|
1. For a quick demo on your local system, just enter this command:
|
||||||
|
|
||||||
|
make serve
|
||||||
|
|
||||||
|
If you don't have `make` but have Python 3.x, enter this command:
|
||||||
|
|
||||||
|
python3 makesite.py
|
||||||
|
cd _site
|
||||||
|
python3 -m http.server
|
||||||
|
|
||||||
|
Note: In some environments, you may need to use `python` instead of
|
||||||
|
`python3` to invoke Python 3.x.
|
||||||
|
|
||||||
|
If you only have Python 2.7, enter this command:
|
||||||
|
|
||||||
|
python makesite.py
|
||||||
|
cd _site
|
||||||
|
python -m SimpleHTTPServer
|
||||||
|
|
||||||
|
Then visit http://localhost:8000/. It should look like
|
||||||
|
[this](https://tmug.github.io/makesite-demo).
|
||||||
|
|
||||||
|
Note: You can run [makesite.py](makesite.py) with Python 2.7 or
|
||||||
|
Python 3.x.
|
||||||
|
|
||||||
|
2. You may see a few `Cannot render Markdown` warning messages in the
|
||||||
|
output of the previous command. This is due to the fact that an
|
||||||
|
example [blog](content/blog) in this project has a few posts written
|
||||||
|
in Markdown. To render them correctly, install the `commonmark`
|
||||||
|
package with this command:
|
||||||
|
|
||||||
|
pip install commonmark
|
||||||
|
|
||||||
|
Then try the previous step again.
|
||||||
|
|
||||||
|
3. For an Internet-facing website, you would be hosting the static
|
||||||
|
website/blog on a hosting service and/or with a web server such as
|
||||||
|
Apache HTTP Server, Nginx, etc. You probably only need to generate
|
||||||
|
the static files and know where the static files are and move them
|
||||||
|
to your hosting location.
|
||||||
|
|
||||||
|
If you have the `make` command, enter this command to generate your
|
||||||
|
website:
|
||||||
|
|
||||||
|
make site
|
||||||
|
|
||||||
|
If you don't have `make` but have `python3`, enter this command:
|
||||||
|
|
||||||
|
python3 makesite.py
|
||||||
|
|
||||||
|
Note: In some environments, you may need to use `python` instead of
|
||||||
|
`python3` to invoke Python 3.x.
|
||||||
|
|
||||||
|
If you only have `python`, enter this command:
|
||||||
|
|
||||||
|
python makesite.py
|
||||||
|
|
||||||
|
The `_site` directory contains the entire generated website. The
|
||||||
|
content of this directory may be copied to your website hosting
|
||||||
|
location.
|
||||||
|
|
||||||
|
|
||||||
|
The Code
|
||||||
|
--------
|
||||||
|
Now that you know how to generate the static website that comes with
|
||||||
|
this project, it is time to see what [makesite.py](makesite.py) does.
|
||||||
|
You probably don't really need to read the entire section. The source
|
||||||
|
code is pretty self-explanatory but just in case, you need a detailed
|
||||||
|
overview of what it does, here are the details:
|
||||||
|
|
||||||
|
1. The `main()` function is the starting point of website generation.
|
||||||
|
It calls the other functions necessary to get the website generation
|
||||||
|
done.
|
||||||
|
|
||||||
|
2. First it creates a fresh new `_site` directory from scratch. All
|
||||||
|
files in the [static directory](static) are copied to this
|
||||||
|
directory. Later the static website is generated and written to this
|
||||||
|
directory.
|
||||||
|
|
||||||
|
3. Then it creates a `params` dictionary with some default parameters.
|
||||||
|
This dictionary is passed around to other functions. These other
|
||||||
|
functions would pick values from this dictionary to populate
|
||||||
|
placeholders in the layout template files.
|
||||||
|
|
||||||
|
Let us take the `subtitle` parameter for example. It is set
|
||||||
|
to our example website's fictitious brand name: "Lorem Ipsum". We
|
||||||
|
want each page to include this brand name as a suffix in the title.
|
||||||
|
For example, the [about page](https://tmug.github.io/makesite-demo/about/)
|
||||||
|
has "About - Lorem Ipsum" in its title. Now take a look at the
|
||||||
|
[page layout template](layout/page.html) that is used as the layout
|
||||||
|
for all pages in the static website. This layout file uses the
|
||||||
|
`{{ subtitle }}` syntax to denote that it is a placeholder that
|
||||||
|
should be populated while rendering the template.
|
||||||
|
|
||||||
|
Another interesting thing to note is that a content file can
|
||||||
|
override these parameters by defining its own parameters in the
|
||||||
|
content header. For example, take a look at the content file for
|
||||||
|
the [home page](content/_index.html). In its content header, i.e.,
|
||||||
|
the HTML comments at the top with key-value pairs, it defines a new
|
||||||
|
parameter named `title` and overrides the `subtitle` parameter.
|
||||||
|
|
||||||
|
We will discuss the syntax for placeholders and content headers
|
||||||
|
later. It is quite simple.
|
||||||
|
|
||||||
|
4. It then loads all the layout templates. There are 6 of them in this
|
||||||
|
project.
|
||||||
|
|
||||||
|
- [layout/page.html](layout/page.html): It contains the base
|
||||||
|
template that applies to all pages. It begins with
|
||||||
|
`<!DOCTYPE html>` and `<html>`, and ends with `</html>`. The
|
||||||
|
`{{ content }}` placeholder in this template is replaced with
|
||||||
|
the actual content of the page. For example, for the about page,
|
||||||
|
the `{{ content }}` placeholder is replaced with the the entire
|
||||||
|
content from [content/about.html](content/about.html). This is
|
||||||
|
done with the `make_pages()` calls further down in the code.
|
||||||
|
|
||||||
|
- [layout/post.html](layout/post.html): It contains the template
|
||||||
|
for the blog posts. Note that it does not begin with `<!DOCTYPE
|
||||||
|
html>` and does not contain the `<html>` and `</html>` tags.
|
||||||
|
This is not a complete standalone template. This template
|
||||||
|
defines only a small portion of the blog post pages that are
|
||||||
|
specific to blog posts. It contains the HTML code and the
|
||||||
|
placeholders to display the title, publication date, and author
|
||||||
|
of blog posts.
|
||||||
|
|
||||||
|
This template must be combined with the
|
||||||
|
[page layout template](layout/page.html) to create the final
|
||||||
|
standalone template. To do so, we replace the `{{ content }}`
|
||||||
|
placeholder in the [page layout template](layout/page.html) with
|
||||||
|
the HTML code in the [post layout template](layout/post.html) to
|
||||||
|
get a final standalone template. This is done with the
|
||||||
|
`render()` calls further down in the code.
|
||||||
|
|
||||||
|
The resulting standalone template still has a `{{ content }}`
|
||||||
|
placeholder from the [post layout template](layout/post.html)
|
||||||
|
template. This `{{ content }}` placeholder is then replaced
|
||||||
|
with the actual content from the [blog posts](content/blog).
|
||||||
|
|
||||||
|
- [layout/list.html](layout/list.html): It contains the template
|
||||||
|
for the blog listing page, the page that lists all the posts in
|
||||||
|
a blog in reverse chronological order. This template does not do
|
||||||
|
much except provide a title at the top and an RSS link at the
|
||||||
|
bottom. The `{{ content }}` placeholder is populated with the
|
||||||
|
list of blog posts in reverse chronological order.
|
||||||
|
|
||||||
|
Just like the [post layout template](layout/post.html) , this
|
||||||
|
template must be combined with the
|
||||||
|
[page layout template](layout/page.html) to arrive at the final
|
||||||
|
standalone template.
|
||||||
|
|
||||||
|
- [layout/item.html](layout/item.html): It contains the template
|
||||||
|
for each blog post item in the blog listing page. The
|
||||||
|
`make_list()` function renders each blog post item with this
|
||||||
|
template and inserts them into the
|
||||||
|
[list layout template](layout/list.html) to create the blog
|
||||||
|
listing page.
|
||||||
|
|
||||||
|
- [layout/feed.xml](layout/feed.xml): It contains the XML template
|
||||||
|
for RSS feeds. The `{{ content }}` placeholder is populated with
|
||||||
|
the list of feed items.
|
||||||
|
|
||||||
|
- [layout/item.xml](layout/item.xml): It contains the XML template for
|
||||||
|
each blog post item to be included in the RSS feed. The
|
||||||
|
`make_list()` function renders each blog post item with this
|
||||||
|
template and inserts them into the
|
||||||
|
[layout/feed.xml](layout/feed.xml) template to create the
|
||||||
|
complete RSS feed.
|
||||||
|
|
||||||
|
5. After loading all the layout templates, it makes a `render()` call
|
||||||
|
to combine the [post layout template](layout/post.html) with the
|
||||||
|
[page layout template](layout/page.html) to form the final
|
||||||
|
standalone post template.
|
||||||
|
|
||||||
|
Similarly, it combines the [list layout template](layout/list.html)
|
||||||
|
template with the [page layout template](layout/page.html) to form
|
||||||
|
the final list template.
|
||||||
|
|
||||||
|
6. Then it makes two `make_pages()` calls to render the home page and a
|
||||||
|
couple of other site pages: the [contact page](content/contact.html)
|
||||||
|
and the [about page](content/about.html).
|
||||||
|
|
||||||
|
7. Then it makes two more `make_pages()` calls to render two blogs: one
|
||||||
|
that is named simply [blog](content/blog) and another that is named
|
||||||
|
[news](content/news).
|
||||||
|
|
||||||
|
Note that the `make_pages()` call accepts three positional
|
||||||
|
arguments:
|
||||||
|
|
||||||
|
- Path to content source files provided as a glob pattern.
|
||||||
|
- Output path template as a string.
|
||||||
|
- Layout template code as a string.
|
||||||
|
|
||||||
|
These three positional arguments are then followed by keyword
|
||||||
|
arguments. These keyword arguments are used as template parameters
|
||||||
|
in the output path template and the layout template to replace the
|
||||||
|
placeholders with their corresponding values.
|
||||||
|
|
||||||
|
As described in point 2 above, a content file can override these
|
||||||
|
parameters in its content header.
|
||||||
|
|
||||||
|
8. Then it makes two `make_list()` calls to render the blog listing
|
||||||
|
pages for the two blogs. These calls are very similar to the
|
||||||
|
`make_pages()` calls. There are only two things that are different
|
||||||
|
about the `make_list()` calls:
|
||||||
|
|
||||||
|
- There is no point in reading the same blog posts again that were
|
||||||
|
read by `make_pages()`, so instead of passing the path to
|
||||||
|
content source files, we feed a chronologically reverse-sorted
|
||||||
|
index of blog posts returned by `make_pages()` to `make_list()`.
|
||||||
|
- There is an additional argument to pass the
|
||||||
|
[item layout template](layout/item.html) as a string.
|
||||||
|
|
||||||
|
9. Finally it makes two more `make_list()` calls to generate the RSS
|
||||||
|
feeds for the two blogs. There is nothing different about these
|
||||||
|
calls than the previous ones except that we use the feed XML
|
||||||
|
templates here to generate RSS feeds.
|
||||||
|
|
||||||
|
To recap quickly, we create a `_site` directory to write the static site
|
||||||
|
generated, define some default parameters, load all the layout
|
||||||
|
templates, and then call `make_pages()` to render pages and blog posts
|
||||||
|
with these templates, call `make_list()` to render blog listing pages
|
||||||
|
and RSS feeds. That's all!
|
||||||
|
|
||||||
|
Take a look at how the `make_pages()` and `make_list()` functions are
|
||||||
|
implemented. They are very simple with less than 20 lines of code each.
|
||||||
|
Once you are comfortable with this code, you can begin modifying it to
|
||||||
|
add more blogs or reduce them. For example, you probably don't need a
|
||||||
|
news blog, so you may delete the `make_pages()` and `make_list()` calls
|
||||||
|
for `'news'` along with its content at [content/news](content/news).
|
||||||
|
|
||||||
|
|
||||||
|
Layout
|
||||||
|
------
|
||||||
|
In this project, the layout template files are located in the [layout
|
||||||
|
directory](layout). But they don't necessarily have to be there. You can
|
||||||
|
place the layout files wherever you want and update
|
||||||
|
[makesite.py](makesite.py) accordingly.
|
||||||
|
|
||||||
|
The source code of [makesite.py](makesite.py) that comes with this
|
||||||
|
project understands the notion of placeholders in the layout templates.
|
||||||
|
The template placeholders have the following syntax:
|
||||||
|
|
||||||
|
{{ <key> }}
|
||||||
|
|
||||||
|
Any whitespace before `{{`, around `<key>`, and after `}}` is ignored.
|
||||||
|
The `<key>` should be a valid Python identifier. Here is an example of
|
||||||
|
template placeholder:
|
||||||
|
|
||||||
|
{{ title }}
|
||||||
|
|
||||||
|
This is a very simple template mechanism that is implemented already in
|
||||||
|
the [makesite.py](makesite.py). For a simple website or blog, this
|
||||||
|
should be sufficient. If you need a more sophisticated template engine
|
||||||
|
such as [Jinja2](http://jinja.pocoo.org/) or
|
||||||
|
[Cheetah](https://pythonhosted.org/Cheetah/), you need to modify
|
||||||
|
[makesite.py](makesite.py) to add support for it.
|
||||||
|
|
||||||
|
|
||||||
|
Content
|
||||||
|
-------
|
||||||
|
In this project, the content files are located in the [content
|
||||||
|
directory](content). Most of the content files are written in HTML.
|
||||||
|
However, the content files for the blog named [blog](content/blog) are
|
||||||
|
written in Markdown.
|
||||||
|
|
||||||
|
The notion of headers in the content files is supported by
|
||||||
|
[makesite.py](makesite.py). Each content file may begin with one or more
|
||||||
|
consecutive HTML comments that contain headers. Each header has the
|
||||||
|
following syntax:
|
||||||
|
|
||||||
|
<!-- <key>: <value> -->
|
||||||
|
|
||||||
|
Any whitespace before, after, and around the `<!--`, `<key>`, `:`,
|
||||||
|
`<value>`, and `-->` tokens are ignored. Here are some example headers:
|
||||||
|
|
||||||
|
<!-- title: About -->
|
||||||
|
<!-- subtitle: Lorem Ipsum -->
|
||||||
|
<!-- author: Admin -->
|
||||||
|
|
||||||
|
It looks for the headers at the top of every content file. As soon as
|
||||||
|
some non-header text is encountered, the rest of the content from that
|
||||||
|
point is not checked for headers.
|
||||||
|
|
||||||
|
By default, placeholders in content files are not populated during
|
||||||
|
rendering. This behaviour is chosen so that you can write content freely
|
||||||
|
without having to worry about makesite interfering with the content,
|
||||||
|
i.e., you can write something like `{{ title }}` in the content and
|
||||||
|
makesite would leave it intact by default.
|
||||||
|
|
||||||
|
However if you do want to populate the placeholders in a content file,
|
||||||
|
you need to specify a parameter named `render` with value of `yes`. This
|
||||||
|
can be done in two ways:
|
||||||
|
|
||||||
|
- Specify the parameter in a header in the content file in the
|
||||||
|
following manner:
|
||||||
|
|
||||||
|
<!-- render: yes -->
|
||||||
|
|
||||||
|
- Specify the parameter as a keyword argument in `make_pages` call.
|
||||||
|
For example:
|
||||||
|
|
||||||
|
blog_posts = make_pages('content/blog/*.md',
|
||||||
|
'_site/blog/{{ slug }}/index.html',
|
||||||
|
post_layout, blog='blog', render='yes',
|
||||||
|
**params)
|
||||||
|
|
||||||
|
Credits
|
||||||
|
-------
|
||||||
|
Thanks to:
|
||||||
|
|
||||||
|
- [Susam Pal](https://github.com/susam) for the initial documentation
|
||||||
|
and the initial unit tests.
|
||||||
|
- [Keith Gaughan](https://github.com/kgaughan) for an improved
|
||||||
|
single-pass rendering of templates.
|
||||||
|
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
This is free and open source software. You can use, copy, modify,
|
||||||
|
merge, publish, distribute, sublicense, and/or sell copies of it,
|
||||||
|
under the terms of the [MIT License](LICENSE.md).
|
||||||
|
|
||||||
|
This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
express or implied. See the [MIT License](LICENSE.md) for details.
|
||||||
|
|
||||||
|
|
||||||
|
Support
|
||||||
|
-------
|
||||||
|
To report bugs, suggest improvements, or ask questions, please visit
|
||||||
|
<https://github.com/sunainapai/makesite/issues>.
|
@ -0,0 +1,28 @@
|
|||||||
|
<!-- title: Lorem Ipsum -->
|
||||||
|
<!-- subtitle: Dolor Sit -->
|
||||||
|
<h1>Lorem Ipsum</h1>
|
||||||
|
<p>
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nibh
|
||||||
|
tellus, vehicula ut maximus sed, fringilla a justo. Nunc vitae efficitur
|
||||||
|
nisl. Ut sapien erat, pretium et commodo nec, rutrum bibendum magna. Sed
|
||||||
|
ut massa massa. Etiam euismod neque lacus, id tincidunt risus iaculis a.
|
||||||
|
Aliquam porta venenatis bibendum. Nam id varius nulla. Sed vitae purus
|
||||||
|
ac odio ornare vestibulum vitae tempor arcu. Nunc non venenatis purus.
|
||||||
|
Duis a augue at nulla congue egestas. Morbi mattis felis sit amet tortor
|
||||||
|
euismod, fringilla viverra est elementum.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Suspendisse vestibulum sed massa eu tincidunt. Pellentesque cursus, nisl
|
||||||
|
at gravida suscipit, odio quam placerat mi, in iaculis nunc risus eu
|
||||||
|
sapien. Suspendisse potenti. Nullam fermentum, tellus vel faucibus
|
||||||
|
dictum, arcu ante rutrum nisi, ut iaculis eros felis a lectus. Etiam vel
|
||||||
|
maximus nulla, sed mattis lectus. Aliquam commodo est massa, at
|
||||||
|
vestibulum diam commodo vehicula. Nullam et tristique tortor. Praesent
|
||||||
|
luctus, leo id mattis mattis, ex dui dapibus dolor, nec ultrices turpis
|
||||||
|
nibh in sem. In efficitur, velit ut bibendum interdum, libero turpis
|
||||||
|
mattis odio, non pharetra metus leo nec arcu. Maecenas auctor laoreet
|
||||||
|
maximus. Donec metus massa, scelerisque a lacinia et, viverra eget
|
||||||
|
metus. Aenean vitae tellus vehicula, mattis metus in, facilisis purus.
|
||||||
|
In purus erat, fringilla ut diam et, convallis convallis nunc. Morbi
|
||||||
|
sagittis interdum ipsum sit amet fringilla.
|
||||||
|
</p>
|
@ -0,0 +1,23 @@
|
|||||||
|
<!-- title: About -->
|
||||||
|
<h1>About</h1>
|
||||||
|
<p>
|
||||||
|
Quisque quam nisl, egestas nec convallis vitae, fringilla nec mauris.
|
||||||
|
Sed et cursus lacus, a pharetra ex. Pellentesque rhoncus malesuada elit
|
||||||
|
at sodales. In ut elit lectus. Phasellus et hendrerit odio, ac hendrerit
|
||||||
|
ante. Pellentesque habitant morbi tristique senectus et netus et
|
||||||
|
malesuada fames ac turpis egestas. Quisque sem nibh, auctor vel dictum
|
||||||
|
eu, pharetra sit amet nunc. Integer suscipit suscipit dapibus.
|
||||||
|
Suspendisse vulputate sed mauris eget tempus. Etiam rhoncus, leo nec
|
||||||
|
cursus elementum, massa lorem fermentum nisi, non convallis nisl dolor
|
||||||
|
vel ipsum.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Aliquam imperdiet vel purus sed facilisis. Mauris condimentum vel nulla
|
||||||
|
ac tempor. In non venenatis arcu. Nam in sapien purus. Suspendisse
|
||||||
|
faucibus, erat et fringilla vestibulum, ligula nisi porta odio, ut
|
||||||
|
tristique dui ante eu nisi. Mauris vitae vulputate lorem. Proin tortor
|
||||||
|
nisl, vehicula sed justo sed, volutpat bibendum purus. Phasellus luctus
|
||||||
|
fringilla augue ac sodales. Aenean ac nisi sit amet neque pulvinar
|
||||||
|
tincidunt ut nec ipsum. Aliquam purus tellus, dignissim a augue
|
||||||
|
placerat, aliquet semper turpis. Fusce id lacinia quam, vel porta quam.
|
||||||
|
</p>
|
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Premier billet
|
||||||
|
category: Humeur
|
||||||
|
---
|
||||||
|
|
||||||
|
Bien que je navigue quotidiennement sur la Toile depuis des années je n'avais
|
||||||
|
jamais envisagé de démarrer un blog. <!-- more --> Mais la récession m'ayant donné un coup
|
||||||
|
de pouce, je devrais avoir du temps ; aussi j'ai ouvert cet espace sur un coup
|
||||||
|
de tête. Il ne me reste plus qu'à définir ce que je veux en faire ;-)
|
@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Mobilité quand tu nous tiens
|
||||||
|
category: Mobilité
|
||||||
|
---
|
||||||
|
|
||||||
|
Poussé par un engouement certain pour les netbooks et une lecture enthousiaste
|
||||||
|
de l'actualité de ce marché (merci [Blogeee](http://www.blogeee.net/) pour la
|
||||||
|
qualité de vos articles) je me suis lancé et j'ai acheté un Asus 1000HE blanc :
|
||||||
|
très très bel objet.... Maryse ;-) <!-- more --> Il est très bien fini, le touchpad est
|
||||||
|
le plus agréable que j'ai pu tester sur un portable, le clavier est
|
||||||
|
suffisamment espacé (j'ai d'ailleurs retrouvé ma vitesse de frappe habituelle
|
||||||
|
sans problème) et il est agréable à la frappe. Bref je n'ai que des
|
||||||
|
compliments sur la qualité du matériel.
|
||||||
|
|
||||||
|
Il me restait à valider si je pourrais en avoir une utilisation polyvalente et
|
||||||
|
ne pas être bloqué par la petite taille d'écran ou de faibles performances.
|
||||||
|
Hé bien après deux semaines d'utilisation, je suis toujours enthousiaste :-)
|
||||||
|
L'autonomie annoncée tient ses promesses : plus de 5 heures 30 à fond les
|
||||||
|
manettes et c'est la première fois que j'utilise réellement un portable en
|
||||||
|
nomade toute une journée sans loucher sur l'indicateur de batterie. Du coup,
|
||||||
|
cela booste son utilisation, on l'emmène un peu partout car il est léger et
|
||||||
|
autonome.
|
||||||
|
|
||||||
|
C'est vrai qu'on scrolle beaucoup dès qu'il faut lire des PDF, des docs
|
||||||
|
OpenOffice ou naviguer sur Internet (merci Firefox pour le plein écran avec F11
|
||||||
|
cela arrange la sauce) mais c'est supportable. Ma première impulsion a été de
|
||||||
|
virer Windows XP et d'installer Ubuntu Netbook Remix et c'est un vrai bonheur.
|
||||||
|
L'interface a été bien pensée, le bureau devient un méga-lanceur de toutes
|
||||||
|
les applications regroupées par catégorie. C'est beau, bien pensé et sous le
|
||||||
|
capot c'est mon système fétiche. Néanmoins, à refaire je conserverais XP et
|
||||||
|
je partirais sur un dual-boot. Il y a suffisamment de disque pour se le
|
||||||
|
permettre et on a de temps en temps besoin d'un Windows pour des applications
|
||||||
|
spécifiques (upgrader un TomTom par exemple). Je reverrais cela dans la durée.
|
||||||
|
Mais pour l'instant mon Ubuntu est pleinement opérationnel, bien configuré et
|
||||||
|
toutes les fonctions de l'asus sont correctement gérées. J'ai même installé
|
||||||
|
une JVM et Eclipse pour voir ce que cela pouvait donner sur ce genre de machine :
|
||||||
|
ben c'est pas pire qu'avec un Celeron 2 années en arrière :-)
|
||||||
|
|
||||||
|
Que du bonheur on vous dit :-)
|
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Karmic Koala
|
||||||
|
category: GNU/Linux
|
||||||
|
---
|
||||||
|
|
||||||
|
J-1 avant la sortie de [Ubuntu 9.10](http://www.ubuntu.com/). Comme beaucoup de
|
||||||
|
monde je l'attends avec impatience pour ses nouveautés et pour résoudre
|
||||||
|
quelques problèmes de la 9.04.
|
@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Karmic est dans la place
|
||||||
|
category: GNU/Linux
|
||||||
|
---
|
||||||
|
|
||||||
|
J'ai installé Karmic Koala Desktop 64 bits sur mon Toshiba Portégé M800 en
|
||||||
|
dual-boot avec Vista 32 bits. <!-- more --> J'ai d'abord restauré le MBR avec le "Vista
|
||||||
|
Recovery Disk'" afin de bénéficier de l'installation de Grub 2. Puis j'ai
|
||||||
|
supprimé ma partition ext3 et j'ai créé une nouvelle partition ext4 pour
|
||||||
|
Karmic.
|
||||||
|
|
||||||
|
L'installation n'a pas posé de problème. Par contre, le démarrage prenait
|
||||||
|
plus d'une minute et le réseau ne fonctionnait pas : ni le port réseau ni le
|
||||||
|
Wifi ne sont reconnus. C'est d'autant plus bizarre que tout fonctionnait avec la
|
||||||
|
9.04. Heureusement la communauté Ubuntu est large et très active : le
|
||||||
|
problème vient du kernel 2.6.31-14 et d'une incompatibilité avec
|
||||||
|
[ACPI](http://fr.wikipedia.org/wiki/ACPI) ; une modification des paramètres de
|
||||||
|
boot dans Grub (rajout de acpi=off) contourne le problème : ça boote en moins
|
||||||
|
de 30 secondes et le réseau fonctionne. Le revers de la médaille est la perte
|
||||||
|
de la gestion de l'énergie ; donc aucun indicateur du niveau de la batterie.
|
||||||
|
C'est embêtant pour un laptop ;-) Mais je suis sûr qu'une mise à jour rapide
|
||||||
|
du kernel va résoudre le problème.
|
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Ubuntu 9.10 Kernel
|
||||||
|
category: GNU/Linux
|
||||||
|
---
|
||||||
|
|
||||||
|
L'incompatibilité du kernel 2.6.31-14 avec ACPI est un problème connu depuis
|
||||||
|
août mais sa résolution n'a pas pu être intégrée à la version finale de
|
||||||
|
Ubuntu 9.10. <!-- more --> Le bug peut-être suivi sur [https://bugs.launchpad.net/ubuntu/+sou
|
||||||
|
rce/linux/+bug/418933](https://bugs.launchpad.net/ubuntu/+source/linux/+bug/4189
|
||||||
|
33)
|
||||||
|
|
||||||
|
Une solution éprouvée consiste à revenir un peu en arrière et installer le
|
||||||
|
kernel 2.6.31-12 disponible ici : [http://people.canonical.com/~apw/lp386468-kar
|
||||||
|
mic/](http://people.canonical.com/%7Eapw/lp386468-karmic/).
|
||||||
|
|
||||||
|
C'est ce que j'ai fait : j'ai installé la version 64 bits et cela résoud tous
|
||||||
|
mes soucis : la gestion de l'énergie est de retour (en enlevant le param
|
||||||
|
acpi=off de Grub bien sûr) et le réseau fonctionne.
|
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Mon bureau
|
||||||
|
category: GNU/Linux
|
||||||
|
---
|
||||||
|
|
||||||
|
Juste pour le fun, un snapshot de mon bureau.<!-- more -->
|
||||||
|
|
||||||
|
![Mon bureau](/images/00x/mydesktop.jpg)
|
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Voix sur IP avec SIP
|
||||||
|
categories: Mobilité
|
||||||
|
---
|
||||||
|
|
||||||
|
J'utilise Skype occasionnellement depuis 2 ans pour des appels de PC à PC mais
|
||||||
|
aussi de PC à téléphone fixe ainsi qu'en mode conférence et bon jour...
|
||||||
|
mauvais jour ça marche pas mal.<!-- more -->
|
||||||
|
|
||||||
|
Néanmoins j'ai eu envie de tester le standard SIP et j'ai choisi l'opérateur
|
||||||
|
IPPI. J'ai opté pour une formule sans abonnement avec un crédit que je
|
||||||
|
recharge au fur et à mesure des besoins par Paypal. Le processus d'inscription
|
||||||
|
est limpide et l'interface du site très sympathique à mon goût. Dans la même
|
||||||
|
veine, la page "Mon compte" est très claire et rappelle la configuration, les
|
||||||
|
appels reçus et passés, le crédit restant et j'en passe.
|
||||||
|
|
||||||
|
En une petite heure, j'avais créé mon compte, configuré le client SIP de mon téléphone Nokia E61i, configuré le
|
||||||
|
client Ekiga sous Ubuntu et testé les appels dans les 2 sens en me référant
|
||||||
|
essentiellement à la documentation fournie sur le site IPPI.
|
||||||
|
|
||||||
|
Bilan : concernant la qualité, les coupures et tout ce qui fait le sel de la
|
||||||
|
voix sur IP il me faudra quelques semaines de tests pour me faire une opinion
|
||||||
|
mais les premiers tests sont très concluants. J'ai beaucoup apprécié la
|
||||||
|
présentation du numéro quand j'appelle, c'est quelque chose qui n'existe pas
|
||||||
|
avec Skype (sauf erreur de ma part).
|
@ -0,0 +1,79 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Nouvelle année, nouvelle distrib
|
||||||
|
category: Archlinux
|
||||||
|
---
|
||||||
|
|
||||||
|
Comme j'ai toujours beaucoup de temps libre, je l'ai passé sur la planète
|
||||||
|
Linux ces dernières semaines<!-- more --> : quelques révisions de base, des lectures de
|
||||||
|
blogs (issus de [Planet Libre](http://www.planet-libre.org/) en autre).
|
||||||
|
|
||||||
|
La lecture de l'excellent blog de [Frédéric
|
||||||
|
Bezier](http://frederic.bezies.free.fr/blog) et de certains articles tendance
|
||||||
|
comme " [Ubuntu which directions are you
|
||||||
|
heading?](http://www.dedoimedo.com/computers/ubuntu-direction.html) " m'ont
|
||||||
|
donné envie de m'orienter vers une "rolling release" distrib pour :
|
||||||
|
|
||||||
|
* rajouter du fun : Ubuntu marche trop bien "out of the box"
|
||||||
|
* mettre les mains dans le cambouis
|
||||||
|
* vérifier sur la durée si le concept est valide : on reste à jour et on ne
|
||||||
|
réinstalle pas tous les 6 mois. Pour ce dernier point il est un peu tôt pour
|
||||||
|
répondre :-)
|
||||||
|
|
||||||
|
Ma machine est un portable Toshiba Portégé M800, core 2 Duo, chipset vidéo et
|
||||||
|
Wifi signés Intel, disque de 250 Go en dual boot avec Windows 7.
|
||||||
|
|
||||||
|
![Gentoo](https://assets.gentoo.org/tyrian/site-logo.svg)
|
||||||
|
|
||||||
|
J'ai commencé une install de Gentoo sous VirtuaBox sous
|
||||||
|
Ubuntu pendant 1/2 journée pour appréhender les concepts puis je me suis
|
||||||
|
lancé : suppression des partitions et installation grandeur nature. En 2
|
||||||
|
grosses journées j'avais un environnement Gnome fonctionnel et une grande
|
||||||
|
fierté (c'est moi qui l'ai compilé).
|
||||||
|
|
||||||
|
Ce que j'ai apprécié :
|
||||||
|
|
||||||
|
* ça fait cliché forcément mais... c'est la force de la Gentoo : les options de
|
||||||
|
compilations fines pour mon processeur, la richesse des fameuses options USE
|
||||||
|
pour désactiver certaines fonctionalités / dépendances des paquets.
|
||||||
|
* me traîner dans le cambouis : ça m'a permis de me remettre à jour sur la
|
||||||
|
config d'un serveur X post-an 2000 (ben oui j'avais pas fait ça depuis des
|
||||||
|
années), d'un serveur Pulse Audio, de recompiler 10 fois mon kernel pour
|
||||||
|
affiner / rajouter des options.
|
||||||
|
|
||||||
|
Ce que je n'ai pas trouvé génial :
|
||||||
|
|
||||||
|
* là aussi c'est cliché : les temps de compilation (attends tu vas voir,
|
||||||
|
j'installes... attends reviens ça compile).
|
||||||
|
* la fraîcheur relative des paquets : bien sûr il y a les overlays, ces extra-
|
||||||
|
repository mais ça mène souvent à des conflits.
|
||||||
|
|
||||||
|
Je pense que la gentoo est géniale pour faire vivre une install stable
|
||||||
|
(serveur ou desktop) mais pas adaptée à un forcené comme moi qui installe un
|
||||||
|
truc nouveau tous les jours et le vire 3 jours après.
|
||||||
|
|
||||||
|
![Arch](http://www.archlinux.fr/commun/images/titlelogo.png)
|
||||||
|
|
||||||
|
J'ai donc basculé après quelques jours de Gentoo sur
|
||||||
|
Archlinux : toujours le concept de la "rolling release" qu'on n'installe qu'une
|
||||||
|
fois mais avec paquets binaires. De plus la communauté anglophone et française
|
||||||
|
semble très active.
|
||||||
|
|
||||||
|
Ce que j'ai apprécié :
|
||||||
|
|
||||||
|
* la facilité d'installation : 1 petite journée pour installer, rapatrier mes
|
||||||
|
données, et configurer le système au poil. Tout fonctionne : virtual box,
|
||||||
|
bluetooth, dropbox...
|
||||||
|
* la grande cohérence de l'environnement Gnome installé (j'avais eu des soucis
|
||||||
|
de polkit avec la Gentoo)
|
||||||
|
* les gestionnaires de paquets ont des noms rigolos (pacman et yaourt) mais g
|
||||||
|
èrent-ils vraiment bien les dépendances et la cohérence du système. Et bien
|
||||||
|
pour l'instant la réponse est OUI.
|
||||||
|
* la gestion très fine des dépendances : c'est la 1ère distrib ou j'installe
|
||||||
|
tout gnome et je peux ensuite désinstaller epiphany / evolution sans tout
|
||||||
|
casser.
|
||||||
|
* la vitesse de démarrage : très similaire à Ubuntu.
|
||||||
|
|
||||||
|
Ce que je n'ai pas trouvé génial :
|
||||||
|
|
||||||
|
* pour le moment je suis sous le charme :-)
|
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Tchao Mano
|
||||||
|
category: Humeur
|
||||||
|
---
|
||||||
|
|
||||||
|
Mano Solo nous a quitté ! Cela me touche beaucoup c'était un artiste que
|
||||||
|
j'admirais pour son courage et dont j'aimais la musique.
|
@ -0,0 +1,47 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Transports en commun et développement personnel
|
||||||
|
category: Mobilité
|
||||||
|
---
|
||||||
|
|
||||||
|
La semaine prochaine sera un gros changement de rythme, je commence un nouveau
|
||||||
|
job à Marseille. Et, chose qui ne m'est pas arrivé depuis mes années
|
||||||
|
d'étudiant, je n'utiliserais pas ma voiture mais le train... <!-- more --> parce que c'est
|
||||||
|
enfin possible. Je m'en réjouis car après des années à passer le trajet en
|
||||||
|
écoutant seulement la radio, j'ai enfin l'opportunité de mettre ce temps à
|
||||||
|
profit au lieu de le subir. Je pense flux RSS, Podcasts et eBooks.
|
||||||
|
|
||||||
|
Pour les flux RSS, c'est rôdé depuis longtemps, j'ai un peu étoffé mes
|
||||||
|
abonnements et je consommerais depuis mon Nokia E61i avec Opera Mini / Google
|
||||||
|
Reader.
|
||||||
|
|
||||||
|
Pour la musique et les podcasts j'ai d'abord eu le stigmate du consommateur en
|
||||||
|
période de soldes : j'ai envisagé investir dans un lecteur mp3/mp4. A la
|
||||||
|
réflexion, ce sont des frais en plus, un 2ème appareil à recharger le soir,
|
||||||
|
une synchronisation avec l'ordinateur quotidienne, un certain nombre
|
||||||
|
d'inconvénients. J'ai alors regardé ce Nokia E61i sous Symbian 3 acheté
|
||||||
|
d'occasion l'année dernière : il n'est certes pas tendance au regard de la
|
||||||
|
marée iPhone / Android qui déferle, mais il répond à 100% de mes besoins :
|
||||||
|
|
||||||
|
- gérer les couriels de mon compte Gmail en Imap (avec Profimail qui fournit un
|
||||||
|
logiciel de grande qualité pour un prix raisonnable),
|
||||||
|
- naviguer sur des sites pas trop complexes (merci Opera Mini ),
|
||||||
|
- envoyer des SMS avec un vrai clavier AZERTY.
|
||||||
|
|
||||||
|
Et je me suis dit que je ne l'avais pas encore poussé dans ses retranchements.
|
||||||
|
Après quelques heures de recherche, j'ai rajouté :
|
||||||
|
|
||||||
|
* un excellent lecteur audio sous licence GPL qui lit les formats mp3 et ogg :
|
||||||
|
OggPlay
|
||||||
|
* une grande découverte pour moi malgré que ce soit sorti depuis un bout de
|
||||||
|
temps : un vrai logiciel de gestion de podcasts, Nokia Podcasting, capable de
|
||||||
|
gérer les abonnements et les téléchargements par Wifi de manière autonome..
|
||||||
|
un vrai bijou.
|
||||||
|
* le classique des lecteurs d'eBooks MobiReader qui fait bien son travail : on
|
||||||
|
peut jouer sur la taille des polices, lire en plein écran (important vu sa
|
||||||
|
taille modeste). Ce que je cherche maintenant c'est une manière de convertir
|
||||||
|
quelques PDF au format LRC depuis GNU/Linux bien sûr :-) si quelqu'un a une
|
||||||
|
bonne technique merci de me laisser un commentaire :-)
|
||||||
|
|
||||||
|
Je pense être paré, il me reste à alimenter mes nouveaux logiciels avec du
|
||||||
|
bon contenu pour transformer ces temps de transport en temps profitable.
|
@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Les trajets, premier bilan
|
||||||
|
category: Mobilité
|
||||||
|
---
|
||||||
|
|
||||||
|
Après une semaine à utiliser le train pour mes trajets professionnels il est
|
||||||
|
temps de faire un premier bilan.<!-- more -->
|
||||||
|
|
||||||
|
Sur le plan personnel, c'est très agréable ; j'enchaîne des bonnes journées
|
||||||
|
mais je ne ressens pas la fatigue nerveuse liée aux embouteillages marseillais
|
||||||
|
; je pratique la marche rapide (pour attraper les correspondances) et mon corps
|
||||||
|
me dit merci :-)
|
||||||
|
|
||||||
|
Sur le plan technique, j'ai fait le bon choix. Un netbook aurait été trop
|
||||||
|
encombrant et pas toujours utilisable ; un lecteur MP4 n'aurait pas fait plus
|
||||||
|
que mon vieux Nokia E61i. Le matin, j'écoute plutôt les podcasts... en fin de
|
||||||
|
parcours, je gère mes emails perso. Le soir, je fais un premier tri des news
|
||||||
|
grâce à Google Reader, j'active le suivi pour les articles qui vont
|
||||||
|
déclencher une action (bookmark delicious, recherche approfondie) plus tard
|
||||||
|
dans la soirée et je lis un peu de l'eBook.
|
||||||
|
|
||||||
|
J'ai dû renoncer à Nokia Podcasting, c'est fonctionnel mais la mise à jour
|
||||||
|
par Wifi prend trop de temps et vide la batterie alors qu'un soir sur deux je
|
||||||
|
dois plutôt la recharger. Je suis donc revenu à une solution plus classique de
|
||||||
|
synchronisation avec mon laptop par le biais de [gPodder](http://gpodder.org/)
|
||||||
|
sur ma distrib Archlinux. Gpodder peut mémoriser la destination de la synchro,
|
||||||
|
en l'occurrence la carte SD du téléphone quand je connecte par USB. Ca ne
|
||||||
|
prend donc que quelques secondes, rien de pénible.
|
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Grosse mise à jour de ArchLinux
|
||||||
|
category: Archlinux
|
||||||
|
---
|
||||||
|
|
||||||
|
Je viens de faire la plus grosse mise à jour de
|
||||||
|
[ArchLinux](http://archlinux.fr/) depuis ma récente installation : 105 paquets<!-- more -->
|
||||||
|
et pas des moindres, puisqu'on trouve le serveur Xorg, une partie de Gnome,
|
||||||
|
beaucoup de librairies et de daemons, le dernier Firefox.
|
||||||
|
|
||||||
|
Ca s'est téléchargé (476 Mo compressés) et installé tranquillement ; j'ai
|
||||||
|
redémarré et tout fonctionne au poil. Je suis conforté dans le choix d'une
|
||||||
|
rolling-release qui permet de rester à jour rapidement, sans attendre un
|
||||||
|
changement de version semestrielle. Ce n'est pas un choix adéquat pour tout un
|
||||||
|
chacun car il faut aimer metttre les mains dans le cambouis de temps en temps,
|
||||||
|
ce n'est pas adapté au monde de l'entreprise où l'on veut maîtriser les mise
|
||||||
|
à jour mais ça reste un terrain de jeu fabuleux pour les linuxiens qui ne
|
||||||
|
veulent pas du clef en main.
|
@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Clonage NTFS
|
||||||
|
category: GNU/Linux
|
||||||
|
---
|
||||||
|
|
||||||
|
La vie est pleine d'imprévus :-) Je change de job après un mois et je vais
|
||||||
|
rebasculer sur Ms Windows du moins professionnellement (sic!). Je vais utiliser
|
||||||
|
pour un temps mon laptop Toshiba avec son Windows 7 en dual boot avec ArchLinux.<!-- more -->
|
||||||
|
Je ne mets plus les pieds côté Ms Windows depuis 6 mois excepté pour jouer à
|
||||||
|
quelques [FPS](http://fr.wikipedia.org/wiki/First-person_shooter) avec mon fils.
|
||||||
|
Mais il y aura un certain nombre de logiciels d'entreprise à installer Je me
|
||||||
|
suis donc posé le problème de faire une sauvegarde de ma partition Windows 7
|
||||||
|
en vue de la restaurer dans quelques semaines dans son état initial.
|
||||||
|
|
||||||
|
Mon premier réflexe à été celui d'un Ouinedozien de base,comme penserait
|
||||||
|
[Eglantine](http://eelo.lgm.free.fr/) : j'ai appelé un copain IT et je lui ai
|
||||||
|
demandé quelle version de Norton Ghost gère Windows 7. Mon second réflexe a
|
||||||
|
été de chercher des alternatives gratuites sur Google. J'ai repéré deux
|
||||||
|
logiciels freeware pour Windows qui nécessitaient d'utiliser bartPE pour créer
|
||||||
|
un CD-Room bootable. Pourquoi pas même si c'est pas super simple... puis j'ai
|
||||||
|
orienté mes recherches sur des alternatives du monde Libre. J'ai quand même un
|
||||||
|
Linux en dual boot cela devrait faciliter les choses.
|
||||||
|
|
||||||
|
Quelques clics plus tard je tombais sur cet [article](http://guides-
|
||||||
|
info.org/linux/admin/cloner.php) détaillant les méthodes d'archivage / clonage
|
||||||
|
/ restauration depuis Linux. NTFSClone semble tout indiqué pour ce que je veux
|
||||||
|
faire et il fait partie du repository Extra d'ArchLinux. A l'heure où j'écris
|
||||||
|
ce billet, ntfsclone sauvegarde ma partition NTFS sur un disque externe USB.
|
@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Ubuntu est au détour du chemin
|
||||||
|
category: GNU/Linux
|
||||||
|
---
|
||||||
|
|
||||||
|
Aujourd'hui grande victoire : je pensais ne pas couper à un retour sous XP
|
||||||
|
professionnellement mais deux voies se sont ouvertes<!-- more --> :
|
||||||
|
|
||||||
|
- Virtualiser GNU/Linux dans Ms Windows
|
||||||
|
- Virtualiser Ms Windows dans GNU/Linux
|
||||||
|
|
||||||
|
La solution 1 est la la plus prisée : Ms Windows est l'environnement de
|
||||||
|
développement et de déploiement et GNU/Linux est une autre cible de
|
||||||
|
déploiement.
|
||||||
|
|
||||||
|
La solution 2 est moins répandue car il faut trouver des alternatives /
|
||||||
|
solutions à certains logiciels propriétaires obligatoires imposés. Je suis
|
||||||
|
néanmoins parti dans cette voie car la vie n'est rien sans le *fun* ;-)
|
||||||
|
|
||||||
|
Au niveau du choix, deux distributions étaient plus évidentes : **Fedora** et
|
||||||
|
**Ubuntu.** Car elles reconnaissent le matériel *out-of-the-box*,
|
||||||
|
l'environnement est pré-configuré et parce que les problèmes cités sont
|
||||||
|
connus pour avoir été résolus. C'est à dire que que c'est probablement
|
||||||
|
possible sur d'autres distributions mais vu le temps qui m'est imparti, il vaut
|
||||||
|
mieux tirer parti de l'expérience d'une communauté. J'ai donc choisi
|
||||||
|
**Ubuntu** car j'ai pratiqué quelques mois.
|
||||||
|
|
||||||
|
Il me faudra résoudre sous quelques jours le support de Juniper Connect sous
|
||||||
|
Linux 64 bits, l'émulation de XP 64 bits et la connexion à messagerie
|
||||||
|
instantanée d'entreprise de Microsoft (mais non pas MSN... l'autre... la
|
||||||
|
sérieuse). Cela sera l'occasion d'un autre billet.
|
@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Renaissance de PC et switch d'utilisatrice
|
||||||
|
category: GNU/Linux
|
||||||
|
---
|
||||||
|
|
||||||
|
J'ai été amené récemment à dépanner ma voisine qui avait des problèmes
|
||||||
|
avec du vieux matériel : un Pentium II à 266 Mhz avec 256 Mo de mémoire et 40
|
||||||
|
Go de disque dur et une version de Windows Me. <!-- more -->Certains sites Web ne
|
||||||
|
s'affichaient pas correctement, ma voisine désirait configurer Outlook pour
|
||||||
|
s'abstenir du WebMail et se plaignait de ne pouvoir installer aucun nouveau
|
||||||
|
logiciel car la version minimale supportée est XP. Nous avons effectué les
|
||||||
|
mises à jour du système et il y en avait un certain nombre, concernant
|
||||||
|
essentiellement Internet Explorer, ce qui est tout à l'honneur de Microsoft.
|
||||||
|
Mais aucune chance d'installer un navigateur plus récent qu'IE 6 sur un
|
||||||
|
système obsolète depuis longtemps. Nous avons essayé d'installer Firefox mais
|
||||||
|
pas de version pour Windows Me... système en fin de vie, plus de nouveaux
|
||||||
|
logiciels. Nous étions dans l'impasse !
|
||||||
|
|
||||||
|
J'ai fait une présentation de ma distribution Arch Linux sur mon portable en
|
||||||
|
apportant toutes les réserves possibles : une version existait forcément pour
|
||||||
|
son matériel mais graphiquement ce serait différent... probablement moins
|
||||||
|
beau. Et il faudrait s'adapter mais on retrouverait les mêmes concepts et on
|
||||||
|
pourrait avoir un navigateur aux normes actuelles pour surfer sur les sites
|
||||||
|
actuels en sécurité, un logiciel de mail et des équivalents aux applications
|
||||||
|
bureautiques. C'est la première fois à vrai dire que je prêche GNU/Linux pour
|
||||||
|
quelqu'un qui n'a jamais connu que Ms Windows ; c'est un pari risqué mais je
|
||||||
|
sentais beaucoup de curiosité de la part de mon interlocutrice, ses questions
|
||||||
|
étaient pertinentes et elle m'avait prouvé par le passé qu'elle abordait les
|
||||||
|
problèmes avec son ordinateur de manière très rationnelle. Nous nous sommes
|
||||||
|
donc lancés ; nous avons fait toutes les sauvegardes de données nécessaires
|
||||||
|
et j'ai embarqué la machine pour le week-end.
|
||||||
|
|
||||||
|
Néanmoins, trouver une distribution francisée qui fonctionne sur ce genre de
|
||||||
|
matériel n'est pas une mince affaire. Bon nombre de versions légères de
|
||||||
|
distributions majeures s'avèrent ne plus fonctionner sur un PII : enfin elles
|
||||||
|
tournent mais ce n'est pas exploitable... trop lent. Après plusieurs tests
|
||||||
|
infructueux je suis tombé sur la pépite : [Slitaz](http://www.slitaz.org/)
|
||||||
|
|
||||||
|
Une distribution suisse super légère mais sans compromis au niveau de la
|
||||||
|
couverture des applications fournies. Le logiciel de mail
|
||||||
|
[Sylpheed](http://sylpheed.sraoss.jp/en/) ne dépayse pas et il gère le
|
||||||
|
protocol IMAP. Pour la lecture des documents Word,
|
||||||
|
[Abiword](http://www.abisource.com/) est parfait, et
|
||||||
|
[GNUmeric](http://projects.gnome.org/gnumeric/) a pu relire sans problèmes les
|
||||||
|
documents Excel 97 sauvegardés. En renfort et au cas où, j'ai installé
|
||||||
|
[OpenOffice](http://fr.openoffice.org/) mais le lancement est vraiment lent. Il
|
||||||
|
sera utilisé occasionnellement pour visualiser les documents PowerPoint
|
||||||
|
humoristiques envoyées par les copines :-) Pour le Web, Slitaz est fourni avec
|
||||||
|
une mouture 3.x de Firefox ; c'est un peu lent au démarrage mais cela reste
|
||||||
|
très correct.
|
||||||
|
|
||||||
|
Le premier ressenti de ma voisine au lancement fut "Oh c'est beau !". Et c'est
|
||||||
|
vrai que la distrib a un look sympa et cohérent. Et puis quand on passe de
|
||||||
|
Windows Me à Slitaz, on a gagné 10 ans d'ergonomie sans changer de matériel.
|
||||||
|
Quand à la machine c'est une nouvelle naissance, elle démarre vite, toutes les
|
||||||
|
applications se lancent sans pop-up d'erreur. Après 1 heure de revue du
|
||||||
|
système j'ai laissé ma voisine découvrir par elle-même. Depuis, j'ai eu
|
||||||
|
quelques courriels de questions auxquelles il a été aisé de répondre... tout
|
||||||
|
fonctionne de son point de vue à elle. Nous referons un point dans quelques
|
||||||
|
temps et nous en profiterons pour finaliser certains détails : gravure,
|
||||||
|
installation des pilotes pour une imprimante HP Deskjet.
|
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Le logiciel libre, comment ça marche ?
|
||||||
|
category: Humeur
|
||||||
|
---
|
||||||
|
|
||||||
|
L'[APRIL](http://www.april.org/) a produit un fabuleux poster qui explique
|
||||||
|
simplement ce qu'est le Logiciel Libre<!-- more --> (le cycle de vie et les intervenants).
|
||||||
|
C'est un bon support pour l'expliquer aussi bien à des programmeurs qu'à des
|
||||||
|
utilisateurs. Il est fourni sous triple license [licence Art
|
||||||
|
libre](http://artlibre.org/licence/lal), [Creative Commons By
|
||||||
|
Sa](http://creativecommons.org/licenses/by-sa/2.0/fr/) et
|
||||||
|
[GFDL](http://www.gnu.org/copyleft/fdl.html) et dans différents formats.
|
||||||
|
|
||||||
|
![Logiciel libre](/images/02x/logiciel_libre_comment_ca_marche.png)
|
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Découvrir LaTeX
|
||||||
|
category: GNU/Linux
|
||||||
|
---
|
||||||
|
|
||||||
|
Dans la série *"Apprenons quelque chose de neuf",* j'ai investi quelques heures
|
||||||
|
à me familiariser avec [LaTeX](http://fr.wikipedia.org/wiki/LaTeX).<!-- more --> J'avoue
|
||||||
|
avoir toujours été intimidé par sa complexité apparente et je ne voyais pas
|
||||||
|
l'intérêt par rapport à n'importe quel traitement de texte
|
||||||
|
[WYSIWYG](http://fr.wikipedia.org/wiki/WYSIWYG). Pratiquement, je me suis
|
||||||
|
attelé à la réécriture de mon CV : c'est un document d'une seule page, un
|
||||||
|
peu court pour tirer gros avantage du temps passé à définir la forme du
|
||||||
|
document mais intéressant pour sa complexité.
|
||||||
|
|
||||||
|
Pour apprendre la syntaxe, je suis parti de la documentation du site
|
||||||
|
[lestuteurs](http://www.tuteurs.ens.fr/logiciels/latex/) où j'ai trouvé
|
||||||
|
l'essentiel. Pour quelques problème mineurs j'ai trouvé la solution sur
|
||||||
|
[StackOverFlow](http://stackoverflow.com/) en googlant :-) Au niveau des outils
|
||||||
|
je suis resté simple : pas d'éditeur dédié à la composition LaTeX, GEdit
|
||||||
|
avec le greffon LaTeX pour lancer la compilation et la visualisation DVI / PDF
|
||||||
|
en un clic fait l'affaire. Au préalable il faut bien sûr [installer les
|
||||||
|
paquets LaTeX](http://wiki.archlinux.org/index.php/LaTeX) sous ArchLinux.
|
||||||
|
|
||||||
|
En 2 demi-journées je suis arrivé à migrer mon CV depuis OpenOffice. Le
|
||||||
|
résultat est très plaisant :
|
||||||
|
|
||||||
|
- la mise en forme est plus aérée grâce à la mise en forme au pixel près quel'on peut appliquer au document,
|
||||||
|
- la fonte par défaut est très agréable,
|
||||||
|
- la génération en PDF est parfaite.
|
||||||
|
|
||||||
|
Rajouter du contenu est rapide car la mise en forme est en place ; c'est le gros
|
||||||
|
atout de LaTeX et j'imagine facilement le temps gagné sur des rapport quand le
|
||||||
|
travail de mise en forme est effectué. Le terme *"système logiciel de
|
||||||
|
composition de documents"* prend tout son sens.
|
@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Envie de vitesse
|
||||||
|
category: Archlinux
|
||||||
|
---
|
||||||
|
|
||||||
|
Après presque une année avec Archlinux j'ai eu envie de booster un peu mon
|
||||||
|
pingouin : rien à reprocher à Gnome mais un OS opérationnel en moins de 2
|
||||||
|
minutes serait sympa.<!-- more -->
|
||||||
|
|
||||||
|
D'abord j'ai optimisé le temps de boot grâce aux recommandations du [Wiki
|
||||||
|
d'Arch](http://wiki.archlinux.org/index.php/Improve_Boot_Performance). Ensuite,
|
||||||
|
j'ai remplacé Gnome par [OpenBox](http://openbox.org/) couplé avec
|
||||||
|
[Tint2](http://code.google.com/p/tint2/) pour avoir une barre de tâches
|
||||||
|
minimaliste et une systray. La configuration d'OpenBox est simple, un fichier
|
||||||
|
autostart.sh déclare ce qu'il faut lancer au démarrage. Le package MenuMaker
|
||||||
|
permet de générer un menu complet, qu'on peut ensuite facilement épurer avec
|
||||||
|
un éditeur de texte.
|
||||||
|
|
||||||
|
Au final j'ai divisé le temps de boot par 2 et je suis authentifié tellement
|
||||||
|
vite (merci [Slim](http://slim.berlios.de/) ) que le Wifi n'est pas encore
|
||||||
|
connecté... le comble ;-)
|
@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Vidéo pour PSP avec ffmpeg
|
||||||
|
category: GNU/Linux
|
||||||
|
---
|
||||||
|
|
||||||
|
La Jackson-mania n'est pas prête de s'éteindre ;-) Mon fils m'a demandé
|
||||||
|
d'installer des clips Youtube de Michael sur sa PSP. <!-- more -->Pour télécharger du
|
||||||
|
YouTube il n'y a que l'embarras du choix : de l'extension Firefox à l'outil en
|
||||||
|
ligne de commande. Mon choix s'est porté sur ClipGrab qui permet de choisir la
|
||||||
|
qualité de vidéo désirée.
|
||||||
|
|
||||||
|
[<img class="alignnone size-medium wp-image-288" title="clipgrab"
|
||||||
|
src="/images/03x/clipgrab-300x176.png" alt="" width="300" height="176" />
|
||||||
|
](/images/03x/clipgrab.png)
|
||||||
|
|
||||||
|
Pour convertir au format PSP j'avais utilisé PSPVC disponible sur
|
||||||
|
[AUR](http://aur.archlinux.org/index.php?setlang=fr) mais il ne fonctionne plus
|
||||||
|
depuis le passage d'Arch à Python2. J'ai donc fouillé du côté des forums
|
||||||
|
pour voir ce qu'on pouvait faire avec les 2 ténors de la conversion vidéo sur
|
||||||
|
GNU/Linux : mencoder et ffmpeg. La [documentation Ubuntu](http://doc.ubuntu-
|
||||||
|
fr.org/ffmpeg) pour ffmpeg apporte l'essentiel de la solution à part une
|
||||||
|
coquille sur un paramètre et le nom des librairies h264 qu'il faut adapter. La
|
||||||
|
commande ultime est donc :
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
ffmpeg -i [input_file] -r 29.97 -vcodec libx264 -s 640x480 -aspect 16:9 -flags +loop -cmp
|
||||||
|
+chroma -deblockalpha 0 -deblockbeta 0 -b 768k -maxrate 1500k -bufsize 4M -bt 256k
|
||||||
|
-refs 1 -bf 3 -coder 1 -me_method umh -me_range 16 -subq 7
|
||||||
|
-partitions parti4x4+parti8x8+partp8x8+partb8x8 -g 250 -keyint_min 25 -level 30
|
||||||
|
-qmin 10 -qmax 51 -qcomp 0.6 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -acodec aac
|
||||||
|
-ab 112k -ar 48000 -ac 2 -s 480x272 -aspect 4:3 -strict experimental [output_file.MP4]
|
||||||
|
```
|
@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Tiny Tiny RSS
|
||||||
|
categories: Android GNU/Linux Hébergement
|
||||||
|
---
|
||||||
|
|
||||||
|
J'ai découvert récemment une alternative à Google Reader : [Tiny Tiny
|
||||||
|
RSS](http://tt-rss.org/). <!-- more -->L'avantage par rapport à un simple client de flux
|
||||||
|
c'est d'avoir un serveur qui actualise les flux périodiquement et qui offre une
|
||||||
|
interface Web pour la consultation. J'ai pu installer facilement Tiny Tiny RSS
|
||||||
|
sur mon hébergement [O2Switch](http://www.o2switch.fr/). Basé sur PHP et MySQL
|
||||||
|
l'installation chez un hébergeur ne pose pas de souci. Le point délicat est la
|
||||||
|
synchronisation des flux. Le Wiki de Tiny Tiny propose trois solutions. Dans le
|
||||||
|
cas d'un hébergement, on ne peut généralement pas installer le daemon mais on
|
||||||
|
peut lancer le rapatriement des flux par une commande sous Cron.
|
||||||
|
|
||||||
|
Mon utilisation au quotidien alterne l'utilisation Desktop et Mobile ; par
|
||||||
|
chance un projet cousin [ttrss-reader-fork](http://code.google.com/p/ttrss-
|
||||||
|
reader-fork/) propose une application cliente pour Android qui se connecte à un
|
||||||
|
serveur Tiny Tiny RSS. C'est une application de qualité sous licence GPL dont
|
||||||
|
le développeur Nils Braden est très actif. J'ai posé un bug jeudi dernier, il
|
||||||
|
était corrigé moins de 2 jours après :-)
|
||||||
|
|
||||||
|
![Image TT-RSS](/images/04x/CAP201012251832.jpg)
|
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Nouvelle année et bonnes résolutions
|
||||||
|
category: Humeur
|
||||||
|
---
|
||||||
|
|
||||||
|
Je vais essayer de placer cette nouvelle année sous le signe de la cohérence
|
||||||
|
et du partage. <!-- more -->Cohérence avec moi-même d'abord : plus d'harmonie entre mes
|
||||||
|
idées et mes actions :)- Sans devenir un barbu intraitable, je partage une
|
||||||
|
large part des idées véhiculées par le Libre : nécessité de préserver
|
||||||
|
l'indépendance de son informatique, de contrôler l'utilisation de ses
|
||||||
|
données. J'irais même jusqu'à voir le Libre comme un microcosme du monde
|
||||||
|
réel. Dans cet optique, il est temps que je sois plus actif, plus participatif
|
||||||
|
afin d'apporter ma pierre à l'édifice. Dans l'immédiat je me forme à la
|
||||||
|
maintenance de paquets AUR, j'ai repéré un projet intéressant qui ne fait pas
|
||||||
|
encore partie du dépôt. A court/moyen terme, j'ai un projet de développement
|
||||||
|
à taille humaine qui ira dans le sens du contrôle de ses données avec un
|
||||||
|
tiers serveur qu'on peut héberger facilement et une application cliente
|
||||||
|
Android.
|
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Sortie de Chive 0.4.1
|
||||||
|
category: Archlinux
|
||||||
|
---
|
||||||
|
|
||||||
|
Une version mineure de [Chive](http://www.chive-project.com/), l'outil
|
||||||
|
d'administration mySQL, est sortie la semaine dernière<!-- more --> ; elle corrige un
|
||||||
|
certains nombre de bugs. Voici le change log officiel.
|
||||||
|
|
||||||
|
Chive 0.4.1 is out, a minor bug-fix release for the 0.4 series.
|
||||||
|
Bug-Fixes in this release:
|
||||||
|
- FileImport broken
|
||||||
|
- Explain not working with groupby
|
||||||
|
- no server infos without selecting a schema first
|
||||||
|
- class HttpRequest conflict with pecl http module
|
||||||
|
- get error after login of version 0.4.0
|
||||||
|
- it is better to use class CJSON instead of json_encode/json_decode
|
||||||
|
|
||||||
|
J'ai mis à jour le [paquet AUR](http://aur.archlinux.org/packages.php?ID=45734)
|
||||||
|
correspondant pour Archlinux :-)
|
@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Retour en auto-hébergement
|
||||||
|
category: Hébergement
|
||||||
|
---
|
||||||
|
|
||||||
|
Le virus de l'auto-hébergement m'a repris. Je n'ai pas (encore) de matériel
|
||||||
|
dédié <!-- more -->; je suis très intéressé par les plug computer à basse consommation,
|
||||||
|
on verra quand le budget sera là :-) En attendant j'ai redonné vie à moindre
|
||||||
|
coût à un ancestral portable équipé d'un céléron. C'est un compromis
|
||||||
|
acceptable, j'espère qu'il tiendra quelques mois en 24/24 ;-)
|
||||||
|
|
||||||
|
Tant qu'à rapatrier ses services il aurait été dommage de ne pas repenser
|
||||||
|
tous les choix techniques, en tenant compte des performances du futur serveur
|
||||||
|
qui seront probablement modestes (low-watt => low-perf).
|
||||||
|
|
||||||
|
Le système est donc une Debian Squeeze. Fi de l'originalité ce qui compte
|
||||||
|
c'est l'éthique de cette distribution, sa stabilité et son adaptation aux
|
||||||
|
matériels récents et anciens ainsi que son énorme logithèque. Pour le
|
||||||
|
serveur HTTP j'ai choisi [Nginx](http://wiki.nginx.org/NginxFr), parce que j'ai
|
||||||
|
lu quelques articles à son propos, que c'est beaucoup plus léger. La
|
||||||
|
documentation est encore légère mais on trouve des bons blogs pour le reste
|
||||||
|
(comme installer et configurer [php-fm avec
|
||||||
|
Nginx](http://blog.nicolargo.com/2011/01/installation-automatique-de-nginx-php-
|
||||||
|
fpm-memcached-sous-debian.html) ).
|
||||||
|
|
||||||
|
La pièce principale de mes services et aussi la plus publique est bien sûr ce
|
||||||
|
blog qui a été migré vers [PluXml](http://pluxml.org/). J'en parlerais plus
|
||||||
|
en détail dans le prochain article.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Gnome 3, une belle rupture
|
||||||
|
category: GNU/Linux
|
||||||
|
---
|
||||||
|
|
||||||
|
Depuis plusieurs semaines l'actu déborde de comparatifs entre
|
||||||
|
[Gnome](http://gnome3.org/) 3 et [Unity](http://unity.ubuntu.com/)<!-- more --> et de retours
|
||||||
|
d'expérience (souvent négatifs) envers ces deux évolutions majeures.
|
||||||
|
Utilisateur d'[Archlinux](http://archlinux.fr/) je n'ai pas considéré Unity
|
||||||
|
mais je me suis intéressé à Gnome 3. J'ai noté deux doléances : les super-
|
||||||
|
productifs qui gèrent quasiment tout au clavier et qui ont dû mal à recréer
|
||||||
|
le même niveau d'optimisation et ceux qui apprécient la nouvelle ergonomie qui
|
||||||
|
met un coup de jeune mais qui ont l'impression d'avoir une version inachevée
|
||||||
|
car ils ont perdu la plupart des applets Gnome ainsi que certaines possibilités
|
||||||
|
de personnalisation visuelle.
|
||||||
|
|
||||||
|
Franchement on sent l'interface pensée pour les ordinateurs mais aussi pour les
|
||||||
|
tablettes ; on a donc simplifié, retiré certaines personnalisations et le
|
||||||
|
résultat reste à l'appréciation de chacun. Je l'utilise occasionnellement
|
||||||
|
depuis trois semaines et je m'y suis à peu près habitué. Néanmoins deux
|
||||||
|
aspects me semblent rédhibitoires pour un usage professionnel :
|
||||||
|
|
||||||
|
- Ne pas voir l'ensemble des tâches ouvertes libère une place appréciable sur
|
||||||
|
mon 13''3 mais dans le cadre d'un usage professionnel avec beaucoup
|
||||||
|
d'applications lancés simultanément ça peut gêner, même si l'affichage des
|
||||||
|
vignettes en un éclair avec une touche est attrayant.
|
||||||
|
- Ne pas voir la systray est gênant car le système de notification n'est pas
|
||||||
|
encore implémenté par toutes les applications et il est furtif.
|
||||||
|
|
||||||
|
Le premier point a peu de chance de changer car c'est le plus gros changement
|
||||||
|
ergonomique : passer d'une application à l'autre différemment et supprimer le
|
||||||
|
concept de minimisation des fenêtres. Quant au second point il évoluera au fur
|
||||||
|
et à mesure que les applications seront mises à jour et peut-être qu'une
|
||||||
|
extension permettra de rendre visible la systray quand une notification n'est
|
||||||
|
pas consommée (si cela existe déjà merci de m'en faire part).
|
||||||
|
|
||||||
|
En conclusion, je dirais que l'évolution de Gnome est sympathique et rend plus
|
||||||
|
attrayant le pingouin ; cela peut séduire des habitués de Ms Windows et MacOSX
|
||||||
|
et je crois qu'il était important de faire un bond en avant côté ergonomie.
|
||||||
|
Dans le cadre personnel je vais continuer à l'utiliser pour voir comment cela
|
||||||
|
va évoluer. Pour des usages professionnels et pour ceux qui ne refusent cette
|
||||||
|
refonte ergonomique, les projets [XFCE](http://www.xfce.org/) et
|
||||||
|
[LXDE](http://lxde.org/) gagnent en intérêt : au delà de proposer des
|
||||||
|
environnement plus légers et plus rapides que Gnome ou KDE ils proposent une
|
||||||
|
alternative Desktop classique (certains taquins diraient "old school").
|
@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Personnalisation de Gnome 3
|
||||||
|
categories: GNU/Linux Archlinux
|
||||||
|
---
|
||||||
|
|
||||||
|
Pour faire suite à l'article précédent, j'ai effectué des recherches sur la
|
||||||
|
personnalisation de Gnome 3. <!-- more -->Le fait est que c'est très flexible et accessible
|
||||||
|
à beaucoup de personnes car l'interface est basée sur JavaScript et CSS.
|
||||||
|
L'idée n'est pas de modifier l'installation elle-même mais d'écrire des
|
||||||
|
extensions dans son répertoire local.local/share/gnome-shell/extensions.
|
||||||
|
L'inconnue c'est la pérennité de ces bouts de JavaScript qui s'appuient sur
|
||||||
|
les API de Gnome 3 au fil des versions.
|
||||||
|
|
||||||
|
L'article de référence que je vous recommande est sur le [blog de Finnbarr P.
|
||||||
|
Murphy](http://blog.fpmurphy.com/2011/05/more-gnome-shell-customization.html).
|
||||||
|
L'auteur va très loin, du rajout d'un menu d'application discret sur le panel
|
||||||
|
au déplacement des icônes de la systray vers le panel... exactement ce que je
|
||||||
|
cherchais pour ne plus rater les notifications de Choqok, Empathy et Dropbox.
|
||||||
|
|
||||||
|
[<img src="/images/04x/systray2panel.jpg" alt="déplacer les apps systray
|
||||||
|
vers le panel" width="600" style="margin: 0px 20px" />
|
||||||
|
](/images/04x/systray2panel.jpg)
|
||||||
|
|
||||||
|
Je vous conseille aussi la lecture des trucs et astuces Gnome 3 parus sur [Tux-
|
||||||
|
Planet](http://www.tux-planet.fr/toutes-les-astuces-pour-gnome-shell/) et la
|
||||||
|
page Gnome 3 sur le [Wiki
|
||||||
|
d'Archlinux](https://wiki.archlinux.org/index.php/GNOME_3) qui est enrichie
|
||||||
|
régulièrement.
|
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Sortie de Chive 0.4.2
|
||||||
|
category: Archlinux
|
||||||
|
---
|
||||||
|
|
||||||
|
[Chive](https://launchpad.net/chive), l'outil d'administration MySQL est passé
|
||||||
|
en version 0.4.2 <!-- more -->; c'est une version mineure qui corrige beaucoup de bugs et
|
||||||
|
ajoute la possibilité d ['intégrer Chive à des outils
|
||||||
|
externes](https://blueprints.launchpad.net/chive/+spec/direct-auth). J'ai mis à
|
||||||
|
jour le [paquet AUR](http://aur.archlinux.org/packages.php?ID=45734) pour
|
||||||
|
Archlinux.
|
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Beau cadeau pour la fête des pères
|
||||||
|
category: Matériel
|
||||||
|
---
|
||||||
|
|
||||||
|
J'avais envie de changer de souris
|
||||||
|
depuis un petit bout de temps <!-- more -->avec deux critères en tête : une forme moins
|
||||||
|
bondée qui ne casse pas le poignet et un modèle filaire. Hé bien je dois
|
||||||
|
être difficile en matière de mulot car aucune souris ne m'a satisfait sur une
|
||||||
|
dizaine de modèles en exposition au magasin. Deux modèles Cyborg étaient sur
|
||||||
|
les rayons mais pas exposés. Néanmoins, la forme ne me déplaisait pas.
|
||||||
|
N'étant pas *gamer* je ne savais rien sur les produits Cyborg... un peu de
|
||||||
|
recherche sur le Net pour découvrir ce qui se cachait derrière ce look
|
||||||
|
futuriste et j'étais séduit par les possibilités d'adaptation à sa
|
||||||
|
morphologie (ajout de poids, ajustement de la longueur). Je suis reparti avec
|
||||||
|
une souris Cyborg R.A.T. 5 après avoir vérifié rapidement qu'elle
|
||||||
|
fonctionnerait sur nos OS alternatifs.
|
||||||
|
|
||||||
|
![Cyborg](/images/05x/cyborg-rat5.jpg)
|
@ -0,0 +1,57 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Support des souris Cyborg
|
||||||
|
categories: GNU/Linux Matériel
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
On trouve de l'information contradictoire et pas très à jour sur le support
|
||||||
|
des souris Cyborg sous GNU/Linux. Je résume donc ce que j'ai mis en oeuvre pour
|
||||||
|
le support du modèle R.A.T. 5 sous ArchLinux. <!-- more -->D'abord il faut indiquer ses
|
||||||
|
caractéristiques pour Xorg. j'ai rajouté un fichier 10-cyborg-rat-mouse.conf
|
||||||
|
dans **/etc/X11/xorg.conf.d**.
|
||||||
|
|
||||||
|
Section "InputClass"
|
||||||
|
Identifier "Mouse Remap"
|
||||||
|
MatchProduct "Saitek Cyborg R.A.T.5 Mouse"
|
||||||
|
MatchDevicePath "/dev/input/event*"
|
||||||
|
Option "ButtonMapping" "1 2 3 4 5 6 7 2 9 10 11 12 0 0 0 16 17 18 19 20 21"
|
||||||
|
EndSection
|
||||||
|
|
||||||
|
La souris a été pensée pour les jeux sous Ms Windows pour lequel un CD
|
||||||
|
spécifique permet de définir des macros pour automatiser certaines actions. Un
|
||||||
|
bouton mode à 3 couleurs permet de passer d'un jeu de macros à un autre. Dans
|
||||||
|
chaque mode, on peut définir le rôle de la molette arrière, des 2 boutons sur
|
||||||
|
le côté gauche. Je crois que le bouton rouge rajoute de la précision lors des
|
||||||
|
visées dans les FPS.
|
||||||
|
|
||||||
|
Même si on n'est pas joueur il serait dommage ne pas profiter de ces boutons
|
||||||
|
supplémentaires pour se configurer des actions spécifiques. Sous Arch on peut
|
||||||
|
installer les paquets AUR xbindkeys et xmacro. Le premier permet d'associer des
|
||||||
|
commandes aux boutons tandis que le second permet de capturer (avec xmacrorec2)
|
||||||
|
et d'envoyer des keystrokes (xmacroplay). D'emblée on constate que le bouton
|
||||||
|
mode n'est pas reconnu et que le bouton arrière gauche est assimilé au bouton
|
||||||
|
de la molette principale. Je ne sais pas si c'est une limitation de xmacro ou si
|
||||||
|
la reconnaissance de la souris sous X est perfectible. Néanmoins, cela nous
|
||||||
|
donne 2 boutons et une molette supplémentaires à configurer. Pour cela, il
|
||||||
|
faut lancer xbindkeys au démarrage (le rajouter dans gnome-session-properties
|
||||||
|
fait l'affaire), et créer un fichier de configuration **~/.xbindkeysrc**.
|
||||||
|
|
||||||
|
A titre d'exemple, voici le fichier.xbindkeysrc que j'utilise actuellement :
|
||||||
|
|
||||||
|
#Ctrl-PgDn (move to previous tab): Thumbwheel right
|
||||||
|
"echo -e 'KeyStrPress Control_L\nKeyStrPress Page_Down\nKeyStrRelease Page_Down\nKeyStrRelease
|
||||||
|
Control_L' | xmacroplay :0"
|
||||||
|
m:0x0 + b:10
|
||||||
|
#Ctrl-PgUp (shift to next tab): Thumbwheel left
|
||||||
|
"echo -e 'KeyStrPress Control_L\nKeyStrPress Page_Up\nKeyStrRelease Page_Up\nKeyStrRelease
|
||||||
|
Control_L' | xmacroplay :0"
|
||||||
|
m:0x0 + b:11
|
||||||
|
#Alt-F4 (close application)): Red "Snipe" button
|
||||||
|
"echo -e 'KeyStrPress Alt_L\nKeyStrPress F4\nKeyStrRelease F4\nKeyStrRelease Alt_L'
|
||||||
|
| xmacroplay :0"
|
||||||
|
m:0x0 + b:12
|
||||||
|
#Ctrl-W (close window): Front thumb button
|
||||||
|
"echo -e 'KeyStrPress Control_L\nKeyStrPress w\nKeyStrRelease w\nKeyStrRelease Control_L'
|
||||||
|
| xmacroplay :0"
|
||||||
|
m:0x0 + b:9
|
@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Le vertige
|
||||||
|
category: Humeur
|
||||||
|
---
|
||||||
|
|
||||||
|
Je ne voyais jusqu'ici que des avantages à Archlinux et à son mode de mise à
|
||||||
|
jour quasi temps réel. <!-- more -->C'est fabuleux d'avoir les dernières nouveautés en
|
||||||
|
quelques jours. Mais si je n'ai eu aucun problème sérieux lors des mises à
|
||||||
|
jour, les changements actuels (passage à Gnome 3, deux changements de version
|
||||||
|
majeure de Firefox en 2 mois) donnent un peu le vertige. Pour Gnome 3, c'est une
|
||||||
|
révolution des habitudes que j'apprécie ; par contre on essuie un peu les
|
||||||
|
plâtres au niveau stabilité et j'ai installé XFCE en parallèle pour
|
||||||
|
l'utilisation dans le cadre du travail. Dès sa sortie j'ai adoré Firefox 4 et
|
||||||
|
les optimisations de performance qui l'accompagnent mais à peine ai-je refait
|
||||||
|
fonctionner toutes mes extensions que la version 5 est là. Du coup, c'est une
|
||||||
|
période un peu instable où l'on passe plus de temps à bidouiller sa machine
|
||||||
|
qu'à l'utiliser... mais après tout c'est qui nous plait :-)
|
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Chive 0.5.1
|
||||||
|
category: Archlinux
|
||||||
|
---
|
||||||
|
|
||||||
|
[Chive](https://launchpad.net/chive), l'outil d'administration MySQL est passé
|
||||||
|
en version 0.5.1. <!-- more -->La liste des changements est accessible sur [leur
|
||||||
|
site](https://launchpad.net/chive/+announcements). Le [paquet
|
||||||
|
AUR](http://aur.archlinux.org/packages.php?ID=45734) pour Archlinux est à jour.
|
@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Switcher dans le monde de l'entreprise
|
||||||
|
category: GNU/Linux
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Dans beaucoup d'entreprises il
|
||||||
|
est interdit de s'écarter de l'OS officiellement supporté, dans d'autres c'est
|
||||||
|
toléré mais généralement sans filet (ne comptez pas sur le [support
|
||||||
|
IT](http://fr.wikipedia.org/wiki/Services_d%27assistance) ) <!-- more -->; celles où règne
|
||||||
|
le libre choix sont rares. J'ai eu la chance de travailler pour l'une d'entre
|
||||||
|
elles ces derniers 18 mois. Ce qui rend le switch difficile ce sont les
|
||||||
|
applications sans alternative. Heureusement elles sont de moins en moins
|
||||||
|
nombreuses. Les clefs [RSA SecurID](http://www.youtube.com/watch?v=bI6IKsCs8WY)
|
||||||
|
ont longtemps été un problème insurmontable plus spécialement sous 64 bits
|
||||||
|
mais ce n'est plus le cas. La messagerie d'entreprise Exchange est accessible
|
||||||
|
depuis un bail grâce à un connecteur pour Evolution. Quant à la messagerie
|
||||||
|
instantanée d'entreprise Communicator, le [plugin
|
||||||
|
SIPE](http://sipe.sourceforge.net/) pour Pidgin permet d'accéder à la fonction
|
||||||
|
tchat (pour la communication voix il faudra convaincre vos interlocuteurs que
|
||||||
|
Skype ou n'importe quel service
|
||||||
|
[SIP](http://fr.wikipedia.org/wiki/Session_Initiation_Protocol) est bien
|
||||||
|
supérieur). Pour les cas récalcitrant ou des applications "maison" pour
|
||||||
|
Microsoft Windows il reste la possibilité d'utiliser
|
||||||
|
[Wine](http://www.winehq.org/). Ce n'est pas ma tasse de thé je préfère
|
||||||
|
cloisonner les choses et dans ce cas utiliser périodiquement une machine
|
||||||
|
virtuelle. Pour gagner énormément de temps, on peut convertir sa machine
|
||||||
|
physique en machine virtuelle VMware en deux coups de cuillère à pot en
|
||||||
|
utilisant l'outil gracieusement mis à disposition : [VMware vCenter
|
||||||
|
Converter](http://www.vmware.com/fr/products/datacenter-
|
||||||
|
virtualization/converter).
|
||||||
|
|
||||||
|
![Chat sans filet](/images/05x/chat-sans-filet.jpg)
|
||||||
|
|
||||||
|
Au final on réalise que les barrières qui empêchent GNU/Linux de dépasser la
|
||||||
|
barre des 1% de part de marché sur le Desktop ne sont pas techniques.
|
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Bonne rentrée à tous
|
||||||
|
category: Hébergement
|
||||||
|
---
|
||||||
|
|
||||||
|
La fièvre [Minecraft](http://www.minecraft.net/) a atteint mon fils et quelques
|
||||||
|
uns de ses copains depuis deux mois. Il est amusant de voir qu'un jeu avec des
|
||||||
|
graphismes *old-school* provoque autant d'engouement.<!-- more --> Comme quoi c'est l'aspect
|
||||||
|
ludique qui prime... plutôt rassurant en ces temps où la poudre aux yeux est
|
||||||
|
souvent auto-suffisante. Du coup, j'héberge un modeste serveur Minecraft pour
|
||||||
|
leur permettre de s'ébattre sur la même carte. Inutile de détailler
|
||||||
|
l'installation sur une Debian c'est très bien documenté. Il est juste dommage
|
||||||
|
que ce soit du JAVA, c'est assez lourd pour mon céléron.
|
||||||
|
|
||||||
|
![Adventure update](/images/05x/adventure_update.tb.png)
|
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Surveiller son blog
|
||||||
|
categories: Hébergement Blog
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Quand on héberge son blog à la maison se pose la question de savoir s'il est
|
||||||
|
bien accessible de l'extérieur <!-- more -->car un problème de
|
||||||
|
[DNS](http://fr.wikipedia.org/wiki/Domain_Name_System), une mauvaise
|
||||||
|
configuration de la box de son fournisseur ou bien un coup de mou de celle-ci
|
||||||
|
peuvent rendre le site inaccessible sans qu'on le sache. La première chose est
|
||||||
|
d'avoir un test périodique lancé depuis l'Internet qui nous prévient en cas
|
||||||
|
de problème. Plusieurs sites proposent cela gratuitement. Pour ma part
|
||||||
|
j'utilise [UptimeRobot](http://www.uptimerobot.com) mais il y en a d'autres. Le
|
||||||
|
point crucial c'est d'être notifié, ce qui suppose qu'on utilise une adresse
|
||||||
|
de courriel extérieure à son serveur ou Twitter.
|
||||||
|
|
||||||
|
![Surveullance](/images/05x/horse-monitoring.tb.jpg)
|
||||||
|
|
||||||
|
Il est aussi important de valider que le contenu est correct. Pour cela
|
||||||
|
j'utilise un [vérificateur de liens](http://www.brokenlinkcheck.com/) en ligne.
|
||||||
|
Il peut y avoir des liens cassés car les ressources pointées n'existent plus
|
||||||
|
ou bien parce qu'on a mal défini son lien vers des ressources locales et cela
|
||||||
|
ne fonctionne pas depuis l'Internet. En fait, il est important de se mettre dans
|
||||||
|
les même conditions quand on accède à son blog depuis le réseau local donc
|
||||||
|
d'avoir une résolution du nom de domaine qui nous permet d'accéder au blog
|
||||||
|
avec la même URL. La résolution
|
||||||
|
[DNS](http://fr.wikipedia.org/wiki/Domain_Name_System) nous pointera sur
|
||||||
|
l'adresse extérieure de la box ADSL mais la résolution
|
||||||
|
[NAT](http://fr.wikipedia.org/wiki/Network_address_translation) ne sera pas
|
||||||
|
effectuée car on vient du réseau local et non pas de l'Internet.
|
||||||
|
|
||||||
|
Il faut donc modifier la résolution des noms pour le réseau local ;
|
||||||
|
différentes possibilités s'offrent à nous :
|
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Le moteur de blog PluXml évolue
|
||||||
|
category: Blog
|
||||||
|
---
|
||||||
|
|
||||||
|
La version 5.1.3 de [PluXml](http://pluxml.org/) est sortie ! Elle contient un
|
||||||
|
joli [lot de corrections et
|
||||||
|
d'évolutions](http://telechargements.pluxml.org/changelog) <!-- more -->dont je n'ai pas
|
||||||
|
fait le tour complet (mais j'apprécie le repli de la zone chapô lors de la
|
||||||
|
création d'un article et la re-génération des miniatures dans la gestion des
|
||||||
|
médias). La mise à jour s'est passée sans problème :
|
||||||
|
|
||||||
|
- on sauvegarde le répertoire data qui contient les articles, les médias et les
|
||||||
|
commentaires,
|
||||||
|
- on extrait la nouvelle archive en écrasant les fichiers existants,
|
||||||
|
- on se connecte au blog et on accepte la mise à jour.
|
@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Installation de Gnome 3.2, au secours !
|
||||||
|
category: Archlinux
|
||||||
|
---
|
||||||
|
|
||||||
|
Enfin la sortie de Gnome 3.2 ! Je m'en fais une joie depuis 1 semaine. <!-- more -->J'ai
|
||||||
|
résisté à la tentation de passer sous testing et j'ai attendu son arrivée
|
||||||
|
dans le dépôt stable. La mise à jour est énorme : j'installe, je relance
|
||||||
|
et... je n'ai que le fond d'écran sous GDM. Vu le peu de configuration
|
||||||
|
utilisateur je n'hésite pas à supprimer tous les répertoires de paramètres :
|
||||||
|
.gnome2,.config. Rien n'y fait. Je soupçonne une blague de GDM. Je le supprime
|
||||||
|
et je démarre directement avec startx. Raté je n'ai toujours que le fond
|
||||||
|
d'écran. Bon faisons propre me dis-je ! je supprime tous les paquets Gnome, je
|
||||||
|
traque tous les fichiers affilié à Gnome ou GDM qui pourraient rester dans le
|
||||||
|
système. Puis je réinstalle tout en [suivant le Wiki à la
|
||||||
|
lettre](https://wiki.archlinux.org/index.php/GNOME_3). J'arrive au même
|
||||||
|
problème. J'analyse les logs, l'occasion de corriger des problèmes annexes
|
||||||
|
(conflit de network manager, dépendances bluetooth manquantes) puis je pense
|
||||||
|
avoir identifié le problème lié à ma carte graphique ou à X je ne sais pas
|
||||||
|
trop :
|
||||||
|
|
||||||
|
Error:org.freedesktop.ColorManager.Failed:
|
||||||
|
failed to obtain org.freedesktop.color-manager.create-device auth
|
||||||
|
|
||||||
|
C'est étonnant puisque la 3.0 a fonctionné des mois. Je force Gnome en mode
|
||||||
|
fallback et effectivement ça démarre. Au passage le mode fallback n'est pas
|
||||||
|
qu'une version limitée graphiquement, il a son lot de défauts spécifiques
|
||||||
|
(pas de support du microphone USB par exemple). Là j'en suis à ma deuxième
|
||||||
|
soirée *"je répare mon Gnome"* et je commence à être à court d'idée. Je
|
||||||
|
relance, un peu désespéré, la machine sous le kernel 3.0 (j'utilisais le
|
||||||
|
2.6.32-LTS) et Gnome démarre en mode normal. Je n'ai pas encore d'explication,
|
||||||
|
mes paramètres de kernel sont identiques... j'espère trouver une explication
|
||||||
|
plus tard.
|
||||||
|
|
||||||
|
Pour l'instant c'est la découverte de la 3.2... Empathy se lance mais je ne
|
||||||
|
peux pas créer de compte :-( Bon on verra demain soir... à chaque jour son
|
||||||
|
défi ;-)
|
@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Bilan de 6 mois d'auto-hébergement
|
||||||
|
category: Hébergement
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Revenu à l'auto-hébergement depuis 6 mois, il est temps de faire un bilan.<!-- more -->
|
||||||
|
D'abord le domaine est passé de rognac.co.cc à madyanne.fr car [Google a exclu
|
||||||
|
co.cc](http://www.generation-nt.com/google-spam-phishing-domaine-co-cc-
|
||||||
|
desindexe-actualite-1229651.html) de son moteur de recherche. Je ne cours pas
|
||||||
|
après la popularité mais de là à devenir invisible... J'ai donc acheté un
|
||||||
|
domaine chez [Gandi](http://www.gandi.net/) et j'ai profité du pack Mail offert
|
||||||
|
pour leur confier mon adresse principale. Suite à de multiples soucis d'ADSL,
|
||||||
|
j'estime que le mail est trop critique pour être auto-hébergé.
|
||||||
|
|
||||||
|
Les principaux attraits de l'auto-hébergement sont :
|
||||||
|
|
||||||
|
* la mise à disposition de ses services quand on est mobilité,
|
||||||
|
* la liberté de faire tourner des services atypiques (hors du cadre LAMP ) qui
|
||||||
|
exigeraient un serveur dédié en hébergement classique,
|
||||||
|
* le contrôle de ses données,
|
||||||
|
* l'apprentissage de l'administration système.
|
||||||
|
|
||||||
|
Aujourd'hui j'héberge [PluXml](http://pluxml.org/) (moteur de blog),
|
||||||
|
[Piwik](http://fr.piwik.org/) (statistiques sur la fréquentation du blog),
|
||||||
|
[Tiny Tiny RSS](http://tt-rss.org/redmine/) (lecteur de flux RSS),
|
||||||
|
[Prosody](http://prosody.im/) (Jabber), [Subsonic](http://www.subsonic.org)
|
||||||
|
(streaming audio), [Shaarli](http://sebsauvage.net/wiki/doku.php?id=php:shaarli)
|
||||||
|
(partage des favoris), [Minecraft](http://www.minecraft.net/) (limité à 5
|
||||||
|
utilisateurs simultanés) et ses
|
||||||
|
[Mods](http://fr.wikipedia.org/wiki/Mod_%28jeu_vid%C3%A9o%29), [Mozilla
|
||||||
|
Sync](http://docs.services.mozilla.com/howtos/run-sync.html) (synchronisation
|
||||||
|
Firefox).
|
||||||
|
|
||||||
|
Au niveau administration j'apprends peu à peu. Je fais tourner
|
||||||
|
[logwatch](http://www.debianhelp.co.uk/logwatch1.htm) pour recevoir une analyse
|
||||||
|
journalière des logs par mail et depuis récemment
|
||||||
|
[fail2ban](http://www.fail2ban.org) qui scrute les logs et ajoute dynamiquement
|
||||||
|
des règles au firewall pour bannir des adresses qui tentent des accès non
|
||||||
|
autorisés. Je suis suffisamment en confiance pour avoir placé le serveur en
|
||||||
|
pseudo [DMZ](http://fr.wikipedia.org/wiki/Zone_d%C3%A9militaris%C3%A9e_%28inform
|
||||||
|
atique%29) (car j'ai un plan d'adressage unique) et autoriser un accès SSH à
|
||||||
|
distance. Bon j'ai aussi un système de sauvegarde à jour en cas de pépin ;-)
|
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Gnome 3 pour un usage professionnel ?
|
||||||
|
category: Archlinux
|
||||||
|
---
|
||||||
|
|
||||||
|
Depuis que ma machine ArchLinux / Gnome 3 est devenue ma machine de travail
|
||||||
|
principale, j'ai un peu la nostalgie de Gnome 2. <!-- more -->J'ai greffé une barre de
|
||||||
|
tâches [Tint2](http://code.google.com/p/tint2/), activé l'extension qui
|
||||||
|
rajoute le menu des applications. Bref on se débrouille pour améliorer sa
|
||||||
|
productivité ! Je suis curieux de voir [la couche MGSE de Linux
|
||||||
|
Mint](http://blog.linuxmint.com/?p=1851) qui va sortir sous peu. Si ça comble
|
||||||
|
les manques de Gnome 3 on peut rêver d'un portage AUR sur Arch. De toute
|
||||||
|
façon, revenir en arrière ne me semble pas une bonne idée : le [fork
|
||||||
|
Mate](https://github.com/Perberos/Mate-Desktop-Environment) va introduire son
|
||||||
|
lot de bugs et il n'a pas vocation à évoluer. Je reste attaché à Gnome, mes
|
||||||
|
expériences XFCE et LXDE ont été passagères. Mais je vais changer de machine
|
||||||
|
sous peu et je pèse le choix entre Archlinux avec un Gnome 3 "amélioré" et
|
||||||
|
une Debian, ce qui laisserait plusieurs mois à Gnome 3 pour grandir et combler
|
||||||
|
ses lacunes. A cogiter...
|
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Chive a mûri
|
||||||
|
category: Archlinux
|
||||||
|
---
|
||||||
|
|
||||||
|
[Chive](http://www.chive-project.com/), l'outil d'administration MySQL est
|
||||||
|
sorti en version 1.0, preuve qu'il atteint une maturité certaine au yeux de ses
|
||||||
|
développeurs. <!-- more -->Beaucoup de bugs ont été corrigé depuis la version 0.5 et des
|
||||||
|
nouvelles fonctionnalités ont vu le jour comme le support des commandes de
|
||||||
|
maintenance de table et l'affichage du temps de calcul des requêtes. Pour ne
|
||||||
|
rien gâter, c'est l'interface d'administration la plus conviviale de sa
|
||||||
|
catégorie (merci
|
||||||
|
[Ajax](http://fr.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML) ). Le
|
||||||
|
paquet [AUR](http://aur.archlinux.org/packages.php?ID=45734) est disponible pour
|
||||||
|
[Archlinux](http://archlinux.fr/).
|
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: La version Noël de Tiny Tiny RSS
|
||||||
|
category: Hébergement
|
||||||
|
---
|
||||||
|
|
||||||
|
L'excellent [logiciel d'aggrégation de flux RSS](http://tt-rss.org)
|
||||||
|
est sorti en version 1.5.8.1 peu avant Noël. <!-- more -->Quelques bugs sont
|
||||||
|
corrigés et la version mobile "classic", classée obsolète depuis quelques
|
||||||
|
versions, a été enlevé. C'est facheux car si elle ne brillait pas par son
|
||||||
|
look and feel, elle apportait le même niveau de fonctionalités que la version
|
||||||
|
Web standard. En lot de consolation, on a la version mobile "tout court", qui a
|
||||||
|
certes un super look *à la iphone* mais aucune fonctionalité avancée. On peut
|
||||||
|
juste ouvrir les flux un par par un avec un superbe effet de glissement vers la
|
||||||
|
droite, aucune possibilité de marquer une catégorie entière comme lue, pas
|
||||||
|
d'entrée "tous les articiles". je suppose que l'équipe mise sur les
|
||||||
|
applications mobiles pour Android et iPhone et fait le minimum sur la version
|
||||||
|
Web mobile. Donc méfiance si vous utilisez la version mobile classic, il vaut
|
||||||
|
mieux rester sur Tiny Tiny RSS 1.5.6.
|
||||||
|
|
||||||
|
![Avertissement](/images/06x/signal_sncf_avertissement.tb.jpg)
|
@ -0,0 +1,85 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Installation de Jenkins CI
|
||||||
|
category: Développement
|
||||||
|
tag: planet
|
||||||
|
excerpt: L'intégration continue s'inscrit dans la méthodologie Agile ; Son objectif est de garantir que le projet est stable tout au long du développement
|
||||||
|
---
|
||||||
|
|
||||||
|
<img src="/images/06x/jenkins-logo.png" alt="Jenkins CI" title="Jenkins
|
||||||
|
CI" style="float:left; margin: 0px 20px" checked="true" /> L'intégration
|
||||||
|
continue s'inscrit dans [la méthodologie
|
||||||
|
Agile](http://fr.wikipedia.org/wiki/M%C3%A9thode_agile) ; Son objectif est de
|
||||||
|
garantir que le projet est stable tout au long du développement et qu'on peut
|
||||||
|
livrer le projet à tout moment. Cela implique que les développeurs ne publient
|
||||||
|
que des fonctionnalités ou des micro-fonctionnalités complètes (dans le sens
|
||||||
|
entièrement implémentées et utilisables) dans le dépôt de sources et qu'on
|
||||||
|
peut à tout moment construire le projet dans son intégralité et le déployer,
|
||||||
|
généralement sur des environnements de tests pour que l'Assurance Qualité
|
||||||
|
puisse tester tout au long du cycle de développement, ou bien en tant que
|
||||||
|
version intermédiaire planifiée (milestone, alpha, beta).
|
||||||
|
|
||||||
|
Ici je vais décrire l'installation du logiciel d'intégration continue [Jenkins
|
||||||
|
CI](http://jenkins-ci.org/) dans le conteneur de Servlet
|
||||||
|
[Tomcat](http://tomcat.apache.org/) sous Ubuntu Server 10.4. D'abord on installe
|
||||||
|
Tomcat 6 avec le système de paquets :
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
sudo apt-get install tomcat6
|
||||||
|
```
|
||||||
|
|
||||||
|
Ensuite on installe manuellement le WAR de Jenkins CI :
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
# move to tomcat webapps dir
|
||||||
|
cd /var/lib/tomcat6/webapps
|
||||||
|
sudo wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
|
||||||
|
```
|
||||||
|
|
||||||
|
Si Tomcat était lancé, Jenkins va être déployé et disponible en quelques
|
||||||
|
secondes. Sinon démarrez Tomcat :
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
sudo /etc/init.d/tomcat6 start
|
||||||
|
```
|
||||||
|
|
||||||
|
Jenkins est accessible ici : [http://<nom du
|
||||||
|
serveur>:8080/jenkins](http://localhost:8080/jenkins)
|
||||||
|
|
||||||
|
Par défaut la sécurité n'est pas activée et tout le monde peut accéder et
|
||||||
|
administrer Jenkins. Nous allons remédier à cela en modifiant les paramètres
|
||||||
|
de sécurité dans la partie administration qu'on accède en cliquant sur le
|
||||||
|
lien *[Administrer Jenkins](http://localhost:8080/jenkins/manage)* puis *[Configurer le système](http://localhost:8080/jenkins/configure)*.
|
||||||
|
|
||||||
|
![Sécurité](/images/06x/jenkins-security.png)
|
||||||
|
|
||||||
|
Après enregistrement, un bouton *S'identifier* fait son apparition dans la
|
||||||
|
bannière en haut à droite. Jenkins a délégué à Tomcat la gestion des
|
||||||
|
utilisateurs, il faut donc créer, au minimum, un administrateur Jenkins. Editez
|
||||||
|
le fichier /var/lib/tomcat6/conf/tomcat-users.xml avec votre éditeur favori et
|
||||||
|
ajoutez le rôle 'admin' et un administrateur, par exemple :
|
||||||
|
|
||||||
|
```
|
||||||
|
<role rolename="admin">
|
||||||
|
<user username="jenkins" password="jenkins" roles="admin">
|
||||||
|
```
|
||||||
|
|
||||||
|
Ensuite redémarrez Tomcat pour prendre en compte la création de l'utilisateur
|
||||||
|
et identifiez-vous à Jenkins en tant qu'administrateur. Attention,
|
||||||
|
l'utilisateur anonyme a encore accès à tout. Si votre intégration continue
|
||||||
|
tourne sur un serveur publique, vous voudrez probablement que l'utilisateur
|
||||||
|
anonyme n'ait aucune visibilité sur les projets. Modifions à nouveau la
|
||||||
|
sécurité ; on choisit la sécurité basée sur une matrice de droits, et on
|
||||||
|
rajoute l'utilisateur **jenkins** avec tous les droits cochés.
|
||||||
|
|
||||||
|
![Matrice de sécurité](/images/06x/jenkins-matrix.png)
|
||||||
|
|
||||||
|
Si vous avez joué de malchance et que vous n'avez pas affecté de droit à
|
||||||
|
l'administrateur avant de sauver, vous ne pouvez plus accéder à Jenkins :-)
|
||||||
|
Heureusement les développeurs ont prévu le coup et il faut réinitialiser la
|
||||||
|
sécurité en suivant [cette procédure du Wiki](https://wiki.jenkins-
|
||||||
|
ci.org/display/JENKINS/Disable+security).
|
||||||
|
|
||||||
|
A ce stade Jenkins est opérationnel avec une sécurité basique qui suffira
|
||||||
|
dans beaucoup de cas, prêt à gérer des projets, ce qui fera l'occasion d'un
|
||||||
|
prochain article.
|
@ -0,0 +1,83 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Quelle distribution 'Gnome 2' choisir en 2012 ?
|
||||||
|
category: Humeur
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Le titre est un peu provoc mais c'est une vraie question [que je me posais
|
||||||
|
déjà en Novembre
|
||||||
|
dernier](http://blogduyax.madyanne.fr/index.php?article60/gnome-3-pour-un-usage-
|
||||||
|
professionnel). Comment retrouver un niveau de productivité correct après
|
||||||
|
l'ouragan Gnome 3 / Unity dans le cadre professionnel<!-- more --> avec du matos récent (en
|
||||||
|
l'occurrence un core i7 avec de la RAM à gogo et une carte NVIDIA Optimus
|
||||||
|
achetés en décembre) ? J'ai posé deux contraintes : **une stabilité des
|
||||||
|
paquets sur 1 an** (hors mise à jour de Mozilla et patchs de sécurité bien
|
||||||
|
sûr) et **une distribution proche de Debian**. Pour ces raisons j'ai écarté
|
||||||
|
Archlinux, bien ce que soit mon coup de coeur depuis 2 ans.
|
||||||
|
|
||||||
|
<img xmlns="http://www.w3.org/1999/xhtml" src="images/06x/gnome-
|
||||||
|
logo.png" alt="Gnome logo" title="Gnome logo" style="margin: 0px 20px; float:
|
||||||
|
right; width: 118px; height: 160px;" checked="true" align="right" /> Mon grand
|
||||||
|
espoir était d'utiliser une [Debian](http://www.debian.org/) stable, ce qui
|
||||||
|
m'aurait laissé encore 1 an de tranquillité sous Gnome 2. Mais j'ai déchanté
|
||||||
|
! Après installation à partir des beaux DVD "Squeeze" récemment reçus j'ai
|
||||||
|
réalisé que la version stable embarque un kernel 2.6.32, trop ancien pour
|
||||||
|
gérer le chipset Wifi et que les versions de Mozilla sont vraiment anciennes.
|
||||||
|
Les [backports officiels](http://backports-master.debian.org/) n'ont pas aidé
|
||||||
|
à résoudre ces points. La perspective de *tweaker* manuellement la
|
||||||
|
distribution m'a effleuré. J'ai plutôt modifié les dépôts pour passer en
|
||||||
|
Testing. Ce que j'ai gagné c'est le passage à Gnome 3 et une gestion du Wifi
|
||||||
|
boiteuse. De plus Testing évolue continuellement. L'objectif initial n'étant
|
||||||
|
pas de passer à une pseudo-rolling release, j'ai quitté Debian avec quelques
|
||||||
|
regrets.
|
||||||
|
|
||||||
|
Sur le coup, mon raisonnement fut "tant qu'à faire une croix sur Gnome 2,
|
||||||
|
autant installer une distribution récente". Ce fut donc Ubuntu 11.10 avec Unity
|
||||||
|
ou Gnome 3. Bon Gnome 3 je connais, je l'ai utilisé presque 1 an à la maison.
|
||||||
|
C'est mignon, bien pensé mais pas adapté à mon usage où je papillonne toute
|
||||||
|
la journée parmi une vingtaine d'applications lancées. Du coup, j'ai donné sa
|
||||||
|
chance à Unity et j'ai tenu 2 semaines :-) Mais le bilan n'est pas si négatif.
|
||||||
|
J'ai beaucoup apprécié l'espace gagné sur l'écran grâce à la barre de menu
|
||||||
|
unique (comme dans le monde des pommes). Ce qui me déplait fortement c'est la
|
||||||
|
difficulté à trouver une application dans le panel. Quelle idée marketing
|
||||||
|
tordue de mixer les applications installées et celles disponibles dans l'Ubuntu
|
||||||
|
store!!! On peut contourner le problème en rajoutant le [Classic Menu
|
||||||
|
Indicator](http://www.webupd8.org/2011/06/use-classic-menu-in-unity-
|
||||||
|
classicmenu.html) mais le problème de basculement parmi une vingtaine
|
||||||
|
d'applications lancées reste entier.
|
||||||
|
|
||||||
|
Las j'ai transformé mon Ubuntu en Xubuntu. Ce que je peux dire sur XFCE a été
|
||||||
|
lu ou dit ailleurs : avec des efforts de personnalisation on arrive à recréer
|
||||||
|
un Gnome 2-like (en moins beau, moins bien intégré). On a une vraie barre des
|
||||||
|
tâches qui peut regrouper intelligemment les applications lancées et le menu
|
||||||
|
n'est pas une porte ouverte sur une boutique d'applications. Par contre le
|
||||||
|
gestionnaire de fichier Thunar est moins bien que Nautilus (notamment il manque
|
||||||
|
la gestion des onglets) et **on a le goût amer d'avoir quelque chose de presque
|
||||||
|
aussi bien qu'en... 2010** ;-) L'année 2010 c'est Ubuntu 10.04 juste avant que
|
||||||
|
Canonical n'entame le grand chantier Unity et que l'équipe Gnome ne démarre sa
|
||||||
|
révolution pour ouvrir Gnome aux tablettes et aux netbooks (en oubliant les
|
||||||
|
gens qui utilisent leur machine pour travailler). Bref 2010 c'est l'avant
|
||||||
|
dernière version "Gnome 2" sortie par Canonical dans [une version LTS maintenue
|
||||||
|
jusqu'en avril 2013](http://doc.ubuntu-fr.org/lucid). D'un coup il y a eu
|
||||||
|
déclic ! Serait-il possible que cette version avec un support étendu soit
|
||||||
|
capable de gérer mon matériel acheté en fin d'année 2011 ?
|
||||||
|
|
||||||
|
Et bien la réponse est positive, avec quelques ajustements mineurs :
|
||||||
|
|
||||||
|
* l'activation des dépôts officiels "lucid-backports" et "lucid-proposed" pour
|
||||||
|
passer au plus récent kernel proposé en 2.6.x, à savoir le 2.6.38-13 (si
|
||||||
|
nécessaire on peut aller jusqu'au 3.0.0-15) et bénéficier de Firefox 9.
|
||||||
|
* l'ajout du dépôt Ubuntuzilla pour bénéficier de Thunderbird 9 car la version
|
||||||
|
3.x fournie par défaut ne propose pas l'extension Lightning.
|
||||||
|
* La désactivation du driver Nouveau (encore expérimental en 10.04) -
|
||||||
|
blacklisté dans /etc/modprobe.d/blacklist.conf - l'utilisation de la carte
|
||||||
|
Intel est bien suffisante pour mon usage.
|
||||||
|
|
||||||
|
Tous les outils que j'utilise quotidiennement pour le travail fonctionnent
|
||||||
|
parfaitement (Eclipse, JAVA, VMWare Player, Skype), l'environnement de bureau
|
||||||
|
est un bonheur retrouvé. Pour info, Ubuntu 10.04 démarre et s'arrête 2 fois
|
||||||
|
plus vite qu'une version 11.10. Que fait Canonical depuis 3 versions ? - ah oui
|
||||||
|
ils focalisent sur l'environnement de bureau :-( Après un mois d'errements,
|
||||||
|
j'ai enfin l'impression d'avoir la distribution qu'il me faut pour cette
|
||||||
|
machine. J'aurais pu intituler cet article "Retour vers le futur".
|
@ -0,0 +1,106 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Surveiller sa ligne ADSL avec Munin
|
||||||
|
category: Hébergement
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Je me suis intéressé à la supervisition de ma box ADSL afin de grapher la
|
||||||
|
bande passante montante et descendante ainsi que les valeurs de bruit et
|
||||||
|
d'atténuation<!-- more -->, ceci dans le but de vérifier la stabilité des valeurs dans le
|
||||||
|
temps et de corréler des impressions de dégradation avec des mesures
|
||||||
|
concrètes.
|
||||||
|
|
||||||
|
La première étape nécessite de trouver un protocole fournissant les
|
||||||
|
informations nécessaires. Etant abonné Orange je suis équipé d'une livebox 2
|
||||||
|
qui fournit un service [HTTP](http://fr.wikipedia.org/wiki/HTTP) et un service
|
||||||
|
[TELNET](http://fr.wikipedia.org/wiki/TELNET). Sur l'ancienne génération le
|
||||||
|
mot de passe du compte root était connu et on pouvait tirer les informations
|
||||||
|
nécessaires depuis le service TELNET. De ce que j'ai lu dans les forums, le mot
|
||||||
|
de passe est inconnu sur la nouvelle génération et la seule option reste
|
||||||
|
l'interface HTTP, pas vraiment le protocole idéal pour de la supervision. Fort
|
||||||
|
heureusement, un script PERL pour piloter la box a été écrit par
|
||||||
|
[teebeenator](http://www.forum-orange.com/forums/profile.php?id=29572) et
|
||||||
|
sympathiquement fourni à la communauté des utilisateurs. Ce script est
|
||||||
|
téléchargeable [ici](http://www.forum-
|
||||||
|
orange.com/forums/viewtopic.php?id=32420).
|
||||||
|
|
||||||
|
<img style="width: 305px; height: 80px;" alt="Munin" src="/images/06x/munin-logo.png" align="right" /> La deuxième étape consiste à choisir un
|
||||||
|
outil de supervision capable de collecter des valeurs et de créer des graphes,
|
||||||
|
un outil de la famille [MRTG](http://fr.wikipedia.org/wiki/MRTG) : après un
|
||||||
|
test de [Cacti](http://www.cacti.net/) qui est un bon outil mais que j'ai jugé
|
||||||
|
trop complexe par rapport à mon besoin initial, mon choix s'est porté sur
|
||||||
|
[Munin](http://munin-monitoring.org/) : un outil simple (voire rustique) écrit
|
||||||
|
en PERL, aucune interface graphique d'administration, une interface Web 1.0
|
||||||
|
(sans JavaScript) qui présente des graphes à la journée, consolidés à la
|
||||||
|
semaine, au mois et à l'année générés statiquement en tant qu'images
|
||||||
|
bitmap. L'installation est triviale et correctement documéntée pour Debian sur
|
||||||
|
[le Wiki de Munin](http://munin-monitoring.org/wiki/Documentation). Dans mon
|
||||||
|
cas, je déploie sur mon petit serveur Debian Squeeze et j'utilise
|
||||||
|
[NginX](http://fr.wikipedia.org/wiki/Nginx) en tant que serveur HTTP. Faire un
|
||||||
|
lien symbolique de /var/www/... vers le répertoire www de Munin
|
||||||
|
(/var/cache/munin/www) est suffisant pour lier le serveur Web à Munin.
|
||||||
|
|
||||||
|
La troisième et dernière étape consiste à étendre Munin en créant des
|
||||||
|
plugins. D'abord on collecte les données, c'est réalisé par un shell script
|
||||||
|
qui appelle le script PERL de teebeenator et qui sauve les donnée dans un
|
||||||
|
fichier texte. Cette collecte est réalisée toutes les 5 minutes grâce à
|
||||||
|
CRON.
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
perl livebox.pl --user=admin --pass=<VotreMotDePasse>
|
||||||
|
-page=infosys_main -v 2>/dev/null | html2text >/adsl_stats.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
Je sauve les données dans un fichier texte car 3 plugins Munin vont les
|
||||||
|
consommer :
|
||||||
|
|
||||||
|
* un plugin qui graphe la bande passante descendante (download) en kb/s
|
||||||
|
* un plugin qui graphe la bande passante montante (upload) en kb/s
|
||||||
|
* un plugin qui graphe le bruit montant / descendant ainsi que l'atténuation
|
||||||
|
montante / descendante en dB.
|
||||||
|
|
||||||
|
Un plugin est un exécutable (Bash, Perl, Python, ce que vous préférez) qui
|
||||||
|
doit répondre à deux types de requêtes :
|
||||||
|
|
||||||
|
- avec l'argument 'config' il renvoie la configuration du graphe : titre, les
|
||||||
|
unités, le libellé de chaque variable graphée
|
||||||
|
|
||||||
|
- sans argument il renvoie une nouvelle valeur pour chaque variable du graphe.
|
||||||
|
|
||||||
|
Voici shell script du plugin adsl_download qui collecte la valeur de la bande
|
||||||
|
passante descendante :
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
if [ $# = 1 ]; then
|
||||||
|
echo "graph_title Bandwidth - Download"
|
||||||
|
echo "graph_category ADSL"
|
||||||
|
echo "graph_vlabel kb/s"
|
||||||
|
echo "down.label download"
|
||||||
|
else
|
||||||
|
grep "bit descendant maximum" adsl_stats.txt | cut -s -d: -f2
|
||||||
|
| sed 's/\s*\([0-9]\+\).*/down.value \1/'
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
L'enregistrement du plugin auprès de Munin est très simple :
|
||||||
|
|
||||||
|
- on rajoute l'exécutable ou un lien symbolique dans /etc/munin/plugins
|
||||||
|
- on configure les droits d'exécutions dans /etc/munin/plugin-conf.d/munin-node
|
||||||
|
|
||||||
|
Mes plugins s'appellent adsl_download, adsl_upload et adsl_noise, j'ai donc
|
||||||
|
rajouté la section suivante à /etc/munin/plugin-conf.d/munin-node :
|
||||||
|
|
||||||
|
```
|
||||||
|
[adsl*]
|
||||||
|
user root
|
||||||
|
```
|
||||||
|
|
||||||
|
Le séquenceur de Munin appelle chaque plugin toutes les 5 minutes.
|
||||||
|
|
||||||
|
Voici le genre de graphe qu'on obtient :
|
||||||
|
|
||||||
|
![ADSL Download](/images/06x/download.png)
|
||||||
|
|
||||||
|
L'ensemble des fichiers qui composent les plugins sont disponibles [dans cette
|
||||||
|
archive](/documents/munin.zip).
|
@ -0,0 +1,128 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Gérer un projet de développement avec Jenkins CI
|
||||||
|
category: Développement
|
||||||
|
tag: planet
|
||||||
|
excerpt: Faisant suite à l'article décrivant l'installation de Jenkins CI, nous allons voir comment gérer un projet
|
||||||
|
---
|
||||||
|
|
||||||
|
<img style="width: 96px; height: 96px;" alt="Jenkins CI logo"
|
||||||
|
src="/images/06x/jenkins-logo.png" align="left" /> Faisant suite à
|
||||||
|
[l'article décrivant l'installation de Jenkins
|
||||||
|
CI](http://blogduyax.madyanne.fr/index.php?article63/installation-de-jenkins-
|
||||||
|
ci), nous allons voir comment gérer un projet en reprenant la configuration
|
||||||
|
déployée sous Tomcat avec Ubuntu 10.04 serveur. Pour rappel, [Jenkins
|
||||||
|
CI](http://fr.wikipedia.org/wiki/Jenkins_%28informatique%29) permet de mettre en
|
||||||
|
place une intégration continue afin de traquer d'éventuelles régressions d'un
|
||||||
|
projet logiciel pendant le cycle de développement. En pratique, il sait
|
||||||
|
accéder à la plupart des gestionnaires de sources et s'interface avec la
|
||||||
|
plupart des système de build. Son rôle principal consiste à recompiler le
|
||||||
|
projet périodiquement, dérouler les tests unitaires et produire des
|
||||||
|
notifications si quelque chose va de travers.
|
||||||
|
|
||||||
|
Mon projet d'exemple est représentatif de mes activités de ces derniers mois :
|
||||||
|
le développement d'un logiciel écrit en Java qui utilise le système de build
|
||||||
|
[Apache Maven](http://fr.wikipedia.org/wiki/Apache_Maven) pour construire le
|
||||||
|
projet. D'abord il faut installer Maven
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
$ apt-get install maven2
|
||||||
|
```
|
||||||
|
|
||||||
|
Maven est géré nativement par Jenkins (sans l'ajout de plugin). On accède à
|
||||||
|
la configuration de l'outil Maven depuis la page d'administration globale :
|
||||||
|
|
||||||
|
![Configure Maven tool](/images/06x/configure-maven-tool.png)
|
||||||
|
|
||||||
|
A l'exécution, Jenkins cherche les données relatives à Maven dans
|
||||||
|
/usr/share/tomcat6 car il s'exécute dans le conteneur de servlet Tomcat en tant
|
||||||
|
qu'application Web. Si le projet nécessite un fichier de configuration Maven
|
||||||
|
particulier, il faut le copier dans **/usr/share/tomcat6/.m2/settings.xml** et
|
||||||
|
il faut s'assurer que l'utilisateur tomcat6 possède tous les droits sur le
|
||||||
|
répertoire.m2.
|
||||||
|
|
||||||
|
Maintenant, nous sommes prêts à créer un nouveau Projet. Les projets de type
|
||||||
|
Maven ont leur propre type de projet :
|
||||||
|
|
||||||
|
![New Project](/images/06x/new-project.png)
|
||||||
|
|
||||||
|
Peu d'informations sont nécessaires pour définir un projet de type Maven :
|
||||||
|
* l'interaction avec le gestionnaire de sources,
|
||||||
|
* le chemin du fichier POM.XML qui contient la description du build Maven,
|
||||||
|
* les "goals" de compilation du projet.
|
||||||
|
|
||||||
|
Dans mon exemple, le gestionnaire de source est Subversion (SVN pour les
|
||||||
|
proches) et il est supporté en standard, de même que CVS. La liste est
|
||||||
|
restreinte mais ne paniquez pas, une quantité de plugins permettent de
|
||||||
|
supporter à peu près tout ce qui existe (Bazaar, GIT, ClearCase,
|
||||||
|
Mercurial,...). Cerise sur le gâteau la gestion des plugins n'est pas
|
||||||
|
bidouillesque. Les plugins sont supportés officiellement, listés et
|
||||||
|
installables depuis l'interface d'administration de Jenkins.
|
||||||
|
|
||||||
|
Configurer SVN pour le projet se borne à définir l'URL du projet et configurer
|
||||||
|
l'authentification.
|
||||||
|
|
||||||
|
![Configure SVN](/images/06x/configure-repository.png)
|
||||||
|
|
||||||
|
Une section Maven définit les "goals" à exécuter et le chemin du fichier de
|
||||||
|
build POM.XML. Les "goals" 'clean' 'install' sont les cibles classiques pour
|
||||||
|
nettoyer puis reconstruire tout le projet.
|
||||||
|
|
||||||
|
![Maven Goals](/images/06x/maven-goals.png)
|
||||||
|
|
||||||
|
Le build peut être déclenché de plusieurs manières: manuellement ou
|
||||||
|
automatiquement. Dans ce dernier cas, ce peut être sur changement des sources
|
||||||
|
dans le gestionnaire de sources, indirectement dans le cas de multi-projets
|
||||||
|
ayant des dépendances (où l'on recompile le projet B chaque fois que le projet
|
||||||
|
A est construit). Il y a d'autres cas plus spécifiques, voire très
|
||||||
|
particuliers :-) gérés par des plugins.
|
||||||
|
|
||||||
|
Dans notre exemple je reste simple et je définis un déclenchement de build du
|
||||||
|
projet sur modification du gestionnaire de source. De manière similaire à
|
||||||
|
l'outil CRON, on peut définir le mot-clef '@hourly' qui signifie qu'une fois
|
||||||
|
par heure Jenkins regarde si quelque chose à changé sur SVN (c'est à dire si
|
||||||
|
un développeur a publié du nouveau code).
|
||||||
|
|
||||||
|
![Trigger Build](/images/06x/trigger-build.png)
|
||||||
|
|
||||||
|
Dans le cas de mon projet dont la compilation prend une vingtaine de minutes
|
||||||
|
c'est une valeur sensée. Quand l'intégration continue est présentée aux
|
||||||
|
développeurs, il prennent rapidement leur marque par rapport au fait que le
|
||||||
|
projet est vérifié chaque début d'heure et ils évitent quelques pièges :
|
||||||
|
|
||||||
|
* morceler des 'commits' qui ne compilent pas (ce qui est une mauvaise pratique en
|
||||||
|
soi) et pire, publier un peu avant l'heure entière ce qui augmente le risque de
|
||||||
|
casser le build de l'intégration continue pendant la prochaine heure,
|
||||||
|
* publier en fin d'heure, ce qui limite les chances de rattraper le coup en cas de
|
||||||
|
problème inattendu.
|
||||||
|
|
||||||
|
Le dernier point restant à voir pour boucler l'exemple, c'est la notification
|
||||||
|
des développeurs quand l'intégration continue échoue. Là aussi on peut
|
||||||
|
élaborer un système complexe, toute une catégorie de plugins existe pour
|
||||||
|
s'interfacer avec des systèmes existants (SCM, Messengers) ou rester basique et
|
||||||
|
envoyer une notification par email.
|
||||||
|
|
||||||
|
![Notification](/images/06x/notify-build-errors.png)
|
||||||
|
|
||||||
|
Jenkins CI conserve un certain nombre de builds et il affiche une météo du
|
||||||
|
build en fonction de la stabilité des derniers résultats. En cas d'erreur, il
|
||||||
|
envoie les parties pertinentes. Si cela ne suffit pas à identifier la cause de
|
||||||
|
l'erreur, toutes les traces de console sont conservées et attachées à chaques
|
||||||
|
build.
|
||||||
|
|
||||||
|
Jenkins CI peut être mis en œuvre en moins d'une journée sur un projet simple
|
||||||
|
et ainsi apporter les bénéfices d'une intégration continue à une équipe de
|
||||||
|
développeurs et de testeurs. Mais l'outil est d'une telle richesse qu'il peut
|
||||||
|
apporter beaucoup plus :
|
||||||
|
|
||||||
|
* support de projets complexes par une architecture maître/esclave pour
|
||||||
|
déléguer la construction de sous-parties du projet,
|
||||||
|
* support de langages / systèmes de builds / gestionnaires de sources très
|
||||||
|
étendu,
|
||||||
|
* déclenchement de tâches post-build pour générer des rapports (analyse de la
|
||||||
|
qualité du code, couverture du code par des tests), déployer les versions
|
||||||
|
produites automatiquement.
|
||||||
|
|
||||||
|
Né du fork de Hudson l'année dernière (suite à un différent avec Oracle),
|
||||||
|
Jenkins CI est un projet open source (sous licence MIT) en plein essor, ce que
|
||||||
|
confirme le rythme régulier des sorties et l'activité de son forum.
|
@ -0,0 +1,51 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Mes applications pour Blackberry
|
||||||
|
category: Mobilité
|
||||||
|
---
|
||||||
|
|
||||||
|
Après une longue période sous Android j'ai migré vers Blackberry.<!-- more --> Certes,
|
||||||
|
Android est ce qui s'approche le plus d'un OS libre (on peut même le
|
||||||
|
[degoogler](http://blogduyax.madyanne.fr/index.php?article41/syncml) ) mais j'ai
|
||||||
|
eu envie de découvrir autre chose : d'abord un système non tactile, ça peut
|
||||||
|
sembler à un retour en arrière mais ça me correspond bien (ça me rappelle
|
||||||
|
mon Nokia E61), une vraie bouffée d'air frais même après une période à
|
||||||
|
subir les erreurs de jeunesse d'Android. On dit souvent "terminal Blackberry" et
|
||||||
|
j'ai compris ce terme à l'utilisation : on est plus face à un téléphone
|
||||||
|
ultra-communiquant qu'une tablette avec option téléphone. C'est d'ailleurs mon
|
||||||
|
principal grief contre l'Android d'aujourd'hui : qu'on ait laissé autant de
|
||||||
|
liberté aux applications de dégrader le système voire le planter. Bon
|
||||||
|
attention, ce n'est pas un article pro-blackberry Mais j'apprécie la cohérence
|
||||||
|
de son système (même s'il est rustique), sa stabilité et son autonomie
|
||||||
|
(grâce à la technologie Push). Le point faible est bien sûr le nombre
|
||||||
|
d'applications disponibles, ce qui devrait s'améliorer les mois à venir.
|
||||||
|
Néanmoins, si on a des besoins limités et orientés professionnel on trouve
|
||||||
|
son bonheur. Voici la sélection des applications qui me sont indispensables :
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* Imo Instant Messenger : comme Meebo c'est un service Web 2.0 qui permet de
|
||||||
|
créer un compte unique chez eux pour accéder à ses comptes Jabber, Skype, et
|
||||||
|
autres. Mais il permet aussi de se connecter individuellement à ses comptes
|
||||||
|
multi-protocoles et il propose une application pour Blackberry, officiellement
|
||||||
|
en bêta mais qui fonctionne très bien et n'inonde pas de publicité. Vu la
|
||||||
|
pauvreté des clients Jabber dans le BlackBerry Store c'est une aubaine.
|
||||||
|
* BBSSH : un fabuleux client SSH sous licence GPL.
|
||||||
|
* mProductive : une applications commerciale de gestion du temps qui centralise
|
||||||
|
intelligemment les évènements du calendrier, les tâches et les mémos. Après
|
||||||
|
avoir testé toutes celles du BB Store en essai gratuit je me suis résolu à
|
||||||
|
investir 5$ dans mProductive Lite et je ne le regrette pas, je l'utilise
|
||||||
|
quotidiennement.
|
||||||
|
* Poynt : un classique qui permet de trouver des points d'intérêt proches de
|
||||||
|
vous (restaurants, pharmacies...)
|
||||||
|
* FidMe : un autre classique qui existe pour d'autres plateformes, permettant de
|
||||||
|
stocker vos cartes de fidélité.
|
||||||
|
* France 24 : une des rares applications permettant de visionner le journal TV. On
|
||||||
|
la trouve sur le BB Store.
|
||||||
|
|
||||||
|
Si vous avez quelques perles à partager n'hésitez pas à laisser un
|
||||||
|
commentaire.
|
||||||
|
|
||||||
|
Je rassure ceux qui me connaissent je nage toujours dans l'Android : j'ai
|
||||||
|
installé une pre-Cyanogen 9 sur une tablette Nook et Cyanogen 7.1 sur un
|
||||||
|
Motorola Defy la semaine dernière :-)
|
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Chive passe en version 1.1
|
||||||
|
category: Archlinux
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Le gestionnaire de base MySQL alternative crédible et sexy à phpMyAdmin, le
|
||||||
|
bien nommé [Chive](http://www.chive-project.com/) est sorti en version 1.1.<!-- more -->
|
||||||
|
|
||||||
|
C'est une version considérée majeure par ses développeurs qui apporte deux
|
||||||
|
fonctionnalités :
|
||||||
|
|
||||||
|
* la première passe inaperçue pour l'utilisateur lambda que je suis : la
|
||||||
|
possibilité d'empaqueter Chive en tant qu' archive Phar. C'est utile à ceux
|
||||||
|
qui déploient Chive le temps d'un développement sur un serveur Web tiers - qui
|
||||||
|
a dit "squat moderne" ;-) - car on ne déploie qu'une archive et PHP l'exécute
|
||||||
|
sans l'extraire.
|
||||||
|
* la seconde est le remplacement de l'éditeur de code SQL "maison" par l'éditeur
|
||||||
|
ACE, projet soutenu par la fondation Mozilla. C'est un changement qui sera
|
||||||
|
bénéfique pour le produit en terme de maintenabilité et de qualité du code.
|
||||||
|
|
||||||
|
Rajoutez à ces deux changements quelques correctifs et on obtient le
|
||||||
|
millésimé 1.1 de ce beau projet. J'ai mis à jour le paquet
|
||||||
|
[AUR](http://en.wikipedia.org/wiki/Arch_Linux#Arch_User_Repository) pour la
|
||||||
|
distribution [ArchLinux](http://www.archlinux.org/).
|
@ -0,0 +1,35 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Ranger son cartable
|
||||||
|
category: Humeur
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Les vacances approchent ! Avant d'aller construire des châteaux de sable, c'est
|
||||||
|
le bon moment pour mettre de l'ordre dans ses dossiers, faire le point sur
|
||||||
|
l'année professionnelle écoulée et... tenir à jour son curriculum vitae.<!-- more --> [La
|
||||||
|
dernière fois que je m'étais prêté à
|
||||||
|
l'exercice](http://blogduyax.madyanne.fr/index.php?article25/decouvrir-latex)
|
||||||
|
avait été l'occasion de me familiariser avec LaTeX, d'apprécier la clarté du
|
||||||
|
langage et la qualité du rendu en PDF avec pdflatex. J'ai décidé de continuer
|
||||||
|
sur la même voie, avec l'objectif de produire une mise en page moins austère
|
||||||
|
à défaut de pouvoir rajeunir le candidat ;-)
|
||||||
|
|
||||||
|
<img src="/images/06x/trollface_cv.png" width="50%" height="50%" alt="CV
|
||||||
|
de Jean Code" style="float:left; margin: 0px 20px;" /> En cherchant des idées
|
||||||
|
de mise en forme j'ai découvert [moderncv](http://www.ctan.org/pkg/moderncv),
|
||||||
|
une classe de document LaTeX qui permet de structurer le document par des
|
||||||
|
commandes supplémentaires (définir les données personnelles, définir une
|
||||||
|
entrée d'expérience,...) et choisir une mise en forme (casual, classic) en
|
||||||
|
fonction des goûts.
|
||||||
|
|
||||||
|
J'ai utilisé la version 1.0 sortie cette année avec Tex 2012. Sous Fedora 17,
|
||||||
|
ma nouvelle distribution, les paquets Tex sont anciens. J'ai tenté
|
||||||
|
l'installation expérimentale de Tex 2012 évoquée sur le Wiki de Fedora mais
|
||||||
|
elle semble incomplète. Le mieux c'est de se référer à [la distribution Tex
|
||||||
|
Live](http://www.tug.org/texlive/) et d'utiliser [l'installateur
|
||||||
|
léger](http://www.tug.org/texlive/acquire-netinstall.html) qui télécharge et
|
||||||
|
installe Tex depuis le réseau.
|
||||||
|
|
||||||
|
Pour inspirer ceux qui se veulent se lancer sans partir de zéro, le CV complet
|
||||||
|
de Jean Code est téléchargeable [ici](/documents/moderncv.zip).
|
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Bonne rentrée
|
||||||
|
category: Humeur
|
||||||
|
---
|
||||||
|
|
||||||
|
Le blog n'est pas mort même si son auteur passe beaucoup de temps à regarder
|
||||||
|
la série Walking Dead ces dernières semaines ;-)<!-- more --> Comme chaque année, entre
|
||||||
|
les vacances et la rentrée, GNU/Linux est passé en priorité basse. Mais
|
||||||
|
l'envie reste intacte et un récent changement professionnel (oui encore) me
|
||||||
|
permet d'explorer de nouveaux usages et d'utiliser de nouveaux projets libres
|
||||||
|
qui devraient inspirer des articles les semaines à venir.
|
@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Compilation de Tuxboot sur Fedora 17
|
||||||
|
category: GNU/Linux
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Tuxboot est un fork de Unetbootin qui permet de créer une version USB de
|
||||||
|
**Clonezilla live** et **GParted live**, <!-- more -->ainsi que DRBL live et Tux2live. C'est
|
||||||
|
l'outil recommandé par Clonezilla pour créer une clef USB Clonezilla Live. Ils
|
||||||
|
fournissent des paquets pour Debian et les sources. Etant sur Fedora 17, j'ai
|
||||||
|
opté pour la compilation à partir des sources :
|
||||||
|
|
||||||
|
* Récupérer les sources sur le site de Tuxboot (http://tuxboot.org) :
|
||||||
|
tuxboot-0.4.src.tar.gz
|
||||||
|
* Installer les outils de développement QT nécessaires à la compilation : yum
|
||||||
|
install qt-devel
|
||||||
|
* Installer les paquets 7z recommandés pour l'exécution : yum install p7zip
|
||||||
|
p7zip-plugins
|
||||||
|
* Décompresser l'archive dans un répertoire de travail : tar xvf
|
||||||
|
tuxboot-0.4.src.tar.gz
|
||||||
|
* Suivre la procédure du fichier INSTALL fourni en adaptant les noms des
|
||||||
|
exécutables pour Fedora
|
||||||
|
|
||||||
|
Voici le source du fichier INSTALL
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
cp tuxboot.pro tuxboot-pro.bak
|
||||||
|
sed -i '/^RESOURCES/d' tuxboot.pro
|
||||||
|
lupdate-qt4 tuxboot.pro
|
||||||
|
lrelease-qt4 tuxboot.pro
|
||||||
|
qmake-qt4 "DEFINES += NOSTATIC CLONEZILLA" "RESOURCES -= tuxboot.qrc"
|
||||||
|
make
|
||||||
|
mv tuxboot-pro.bak tuxboot.pro
|
||||||
|
```
|
||||||
|
|
||||||
|
Si la compilation se passe bien, l'exécutable tuxboot est créé.
|
@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Eclipse Juno sous GNU/Linux
|
||||||
|
category: Développement
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
La dernière version d'Eclipse, sortie en juin dernier, a pour nom de code
|
||||||
|
**Juno**. Eclipse c'est un [IDE](http://fr.wikipedia.org/wiki/Environnement_de_d
|
||||||
|
%C3%A9veloppement_int%C3%A9gr%C3%A9) pour le développement Java <!-- more -->bâti sur une
|
||||||
|
plateforme ouverte, extensible à au possible par le biais de plugins. Du coup,
|
||||||
|
Eclipse est livré sous licence EPL (Eclipse Public License), une licence
|
||||||
|
reconnue libre par la FSF mais moins contraignante que la GPL avec laquelle est
|
||||||
|
est incompatible d'ailleurs, afin de permettre à des éditeurs de bâtir des
|
||||||
|
logiciels propriétaires (ou privateurs selon les termes de Richard Stallman) en
|
||||||
|
s'appuyant sur sa plateforme.
|
||||||
|
|
||||||
|
Selon sa distribution (Debian-based, Fedora, Arch ou autre), on peut utiliser le
|
||||||
|
système de paquets pour installer Eclipse mais je trouve préférable
|
||||||
|
d'installer manuellement en téléchargeant depuis [le site
|
||||||
|
officiel](http://www.eclipse.org/) car la plateforme est décomposée en un
|
||||||
|
certain nombre de sous-projets et différents assemblages peuvent téléchargés
|
||||||
|
depuis le site (Eclipse for Java EE, Eclipse for Java, Eclipse Classic). En
|
||||||
|
installant manuellement on s'évitera les problèmes de mise à jour non
|
||||||
|
maîtrisés et les problèmes de dépendances manquantes entre sous-projets.
|
||||||
|
|
||||||
|
Après avoir démarré Juno, deux éléments visuels m'ont choqué : le
|
||||||
|
dégradé de la barre d'outil et la taille de fonte excessive de certains
|
||||||
|
titres.
|
||||||
|
|
||||||
|
![Juno](/images/07x/eclipse-ui.png)
|
||||||
|
|
||||||
|
Personnaliser l'apparence d'Eclipse a toujours été un peu casse-tête. Le menu
|
||||||
|
apparence dans les préférences regorge d'options pour modifier l'apparence des
|
||||||
|
différents éditeurs de code (Java, XML,...) mais rien pour certains aspects
|
||||||
|
globaux comme ceux qui dérangent justement.
|
||||||
|
|
||||||
|
Dans ce cas, la solution vient d'une extension qui permet de modifier la CSS
|
||||||
|
définissant ces aspects de l'interface. Pour cela, il faut installer le plugin
|
||||||
|
**E4 CSS Editor** depuis le site suivant : [http://download.eclipse.org/e4/updat
|
||||||
|
es/0.12](http://download.eclipse.org/e4/updates/0.12).
|
||||||
|
|
||||||
|
![CSS](/images/07x/css-editor.png)
|
||||||
|
|
||||||
|
Une fois l'éditeur CSS installé, il s'active quand on ouvre l'option
|
||||||
|
Préférences / Apparence dans le menu Windows. Pour diminuer la fonte et
|
||||||
|
harmoniser le style de la barre d'outils avec le reste de l'interface, il faut
|
||||||
|
appliquer la modification suivante (la version modifiée est à droite) :
|
||||||
|
|
||||||
|
![Diff](/images/07x/css-diff.png)
|
@ -0,0 +1,118 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Installer SABnzbd derrière Nginx
|
||||||
|
category: Hébergement
|
||||||
|
---
|
||||||
|
|
||||||
|
[SABnzbd](http://sabnzbd.org/), comme son nom ne l'indique pas vraiment, est un
|
||||||
|
lecteur de news binaires. <!-- more -->Il permet de récupérer des fichiers depuis
|
||||||
|
[Usenet](http://fr.wikipedia.org/wiki/Usenet). C'est une application serveur,
|
||||||
|
qu'on héberge derrière un serveur Web, et qui offre une interface de gestion
|
||||||
|
depuis un navigateur. Il faut bien sûr l'associer à un compte chez un
|
||||||
|
fournisseur Usenet. Je ne détaille pas plus l'utilisation de l'outil, le site
|
||||||
|
officiel est suffisamment documenté, mais plutôt son installation dans le
|
||||||
|
cadre de l'auto-hébergement avec le serveur Web Nginx en frontal et non pas le
|
||||||
|
traditionnel Apache.
|
||||||
|
|
||||||
|
Depuis [la page de téléchargement](http://sabnzbd.org/download/) on peut
|
||||||
|
télécharger les sources Python. Les manipulations suivantes sont réalisées
|
||||||
|
sur une Debian 6 avec Python, Nginx et OpenSSH installés.
|
||||||
|
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
# on installe sous /srv
|
||||||
|
cd /srv
|
||||||
|
wget http://sourceforge.net/projects/sabnzbdplus/files/sabnzbdplus/0.7.6/
|
||||||
|
SABnzbd-0.7.6-src.tar.gz/download -O SABnzbd-0.7.6-src.tar.gz
|
||||||
|
tar xvf SABnzbd-0.7.6-src.tar.gz && rm -f SABnzbd-0.7.6-src.tar.gz
|
||||||
|
# on crée un lien symbolique /srv/sabnzbd pour gérer aisément les futures mises à jour
|
||||||
|
ln -s SABnzbd-0.7.6 sabnzbd
|
||||||
|
```
|
||||||
|
|
||||||
|
L'étape suivante consiste à démarrer SABnzbd pour définir sa configuration
|
||||||
|
générale et **aussi restreindre l'adresse d'écoute** à l'interface localhost
|
||||||
|
(127.0.0.1) pour forcer le passage par Nginx et son authentification que nous
|
||||||
|
allons mettre en place par la suite. On peut automatiser le démarrage en
|
||||||
|
rajoutant un script sabnzbd sous /etc/init.d tel que celui-ci :
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: sabnzd
|
||||||
|
# Required-Start: $local_fs $remote_fs
|
||||||
|
# Required-Stop: $local_fs $remote_fs
|
||||||
|
# Should-Start: $all
|
||||||
|
# Should-Stop: $all
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# Short-Description: Start/stop Sabnzbd
|
||||||
|
# Description: Start/stop Sabnzbd
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||||
|
|
||||||
|
. /lib/lsb/init-functions
|
||||||
|
|
||||||
|
if [ "$#" -ne 1 ]; then
|
||||||
|
log_failure_msg "Usage: /etc/init.d/sabnzd" \
|
||||||
|
"{start|stop}"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
python /srv/sabnzbd/SABnzbd.py -d -f /root/.sabnzbd/sabnzbd.ini
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
/usr/bin/wget -q --delete-after "http://localhost:7777/sabnzbd/api?mode=shutdown
|
||||||
|
&apikey;=24be83f61210daad59aa0e90223ccd4f"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_failure_msg "Usage: /etc/init.d/sabnzbd" \
|
||||||
|
"{start|stop}"
|
||||||
|
exit 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
log_failure_msg "Unexpected failure, please file a bug."
|
||||||
|
exit 1
|
||||||
|
```
|
||||||
|
|
||||||
|
On active ce script sous Debian avec update-rc.d sabnzbd defaults. Finalement on
|
||||||
|
configure Nginx comme proxy. Je me suis borné à un accès HTTP protégé par
|
||||||
|
une authentification utilisateur / mot de passe mais HTTPS est recommandé.
|
||||||
|
|
||||||
|
``` nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name www.yourserver.yourdomain;
|
||||||
|
root /var/www/www;
|
||||||
|
access_log /var/log/nginx/www.access.log;
|
||||||
|
error_log /var/log/nginx/www.error.log;
|
||||||
|
|
||||||
|
location /sabnzbd {
|
||||||
|
auth_basic "Restricted area";
|
||||||
|
auth_basic_user_file /var/www/htpasswd;
|
||||||
|
proxy_set_header X-Forwarded-Host $host;
|
||||||
|
proxy_set_header X-Forwarded-Server $host;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_pass http://127.0.0.1:7777/sabnzbd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Pour la création du fichier d'authentification **htpasswd** je vous renvoie à
|
||||||
|
la [FAQ de Nginx](http://wiki.nginx.org/Faq#How_do_I_generate_an_htpasswd_file_w
|
||||||
|
ithout_having_Apache_tools_installed.3F) car plusieurs méthodes sont possibles.
|
||||||
|
Gare à sécuriser son accès et à le placer hors des répertoires servis par
|
||||||
|
Nginx. A ce stade SABnzbd fonctionne à moitié :-) En effet SABnzbd ne va pas
|
||||||
|
servir toutes les ressources (HTML / CSS) et il faut les lier statiquement à
|
||||||
|
Nginx.
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
# on lie les ressources statiques du thème Plush
|
||||||
|
mkdir -p /var/www/www/sabnzbd
|
||||||
|
ln -s /srv/sabnzbd/interfaces/Plush/templates/static /var/www/www/sabnzbd/static
|
||||||
|
ln -s /srv/sabnzbd/interfaces/Config/templates/staticcfg /var/www/www/sabnzbd/staticcfg
|
||||||
|
```
|
@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Bilan de l'année 2012
|
||||||
|
category: Humeur
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
L'année a été bien remplie ! Au niveau de mon implication dans le logiciel
|
||||||
|
Libre, je n'ai pas réalisé tout ce que j'avais en tête, par manque de temps,
|
||||||
|
mais je me suis vraiment fait plaisir.<!-- more --> Après un premier semestre où j'avais
|
||||||
|
carte blanche pour le choix des outils de l'équipe et où j'ai mis en place le
|
||||||
|
serveur de développement (Debian, Subversion, Redmine, Jenkins, Sonar), j'ai
|
||||||
|
intégré une nouvelle société avec une double casquette développeur Java /
|
||||||
|
admin système GNU/Linux qui m'amène à mettre en place des solutions de Haute
|
||||||
|
Disponibilité.
|
||||||
|
|
||||||
|
<img src="/images/07x/calendar.png" style="float:left; margin: 0px 20px;"
|
||||||
|
/> Sinon ma belle découverte de l'année c'est Fedora que j'utilise au travail et
|
||||||
|
à la maison depuis 6 mois. Alors que j'ai surtout utilisé des distributions
|
||||||
|
basées sur Debian hormis ArchLinux par le passé, j'ai été enchanté par le
|
||||||
|
spin XFCE de Fedora 17. Mon portable relativement récent est correctement
|
||||||
|
géré *"out of the box"*, les dépôts Fedora sont plutôt complets et
|
||||||
|
généralement on trouve une version RPM des logiciels moins libres. L'outil de
|
||||||
|
gestion de paquets Yum est bluffant par sa rapidité grâce à un système de
|
||||||
|
téléchargement différentiel qui permet d'économiser de la bande passante.
|
||||||
|
Vivement Fedora 18 :-)
|
||||||
|
|
||||||
|
Bonnes fêtes de fin d'année à tous !
|
@ -0,0 +1,81 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Marre des aquariums
|
||||||
|
category: Humeur
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Deux expériences récentes m'ont conforté dans l'importance de supporter le
|
||||||
|
Libre et rappelé que la bataille ne se joue pas que dans la sphère
|
||||||
|
professionnelle, bien au contraire.<!-- more -->
|
||||||
|
|
||||||
|
Par confort (et la faiénantise n'est jamais loin), j'avais acheté un boitier
|
||||||
|
multimédia il y a 3 ans à l'époque ou le Media Player de mon fournisseur
|
||||||
|
Internet montrait ses limites à streamer certains formats vidéo du PC à la
|
||||||
|
TV. Le boitier a bien rempli son rôle, on l'allume en même temps que la TV, il
|
||||||
|
démarre en 3s et il décode quasiment tout. Simple comme un téléphone à
|
||||||
|
compote ;-) Seulement deux ans plus tard, on est passé de "il décode quasiment
|
||||||
|
tout" à "il décode pas mal de trucs". Confiant, je saute sur mon panda roux
|
||||||
|
pour naviguer sur la toile, me disant qu'il existe probablement des mise à jour
|
||||||
|
de firmware chez le constructeur ou mieux un firmwware alternatif développé
|
||||||
|
par des passionnés qui rajoute des fonctionnalités. Et bien choux blanc ! Le
|
||||||
|
constructeur préfère sortir des nouveaux modèles que rallonger la durée de
|
||||||
|
vie des anciens. Rien d'étrange à cela, il s'agit d'une société commerciale
|
||||||
|
dont l'objectif premier est de réaliser du chiffre d'affaire. Quant aux
|
||||||
|
passionnés, ils existent certainement mais soit le boitier multimédia est
|
||||||
|
très bien verrouillé, soit le challenge attire moins les foules que craquer la
|
||||||
|
dernière console à la mode. Au final, je me retrouve avec un boitier
|
||||||
|
multimédia en fin de vie car son logiciel n'a pas évolué depuis 2010.
|
||||||
|
Sanction méritée ! J'ai clairement manqué de nez en choississant un
|
||||||
|
constructeur qui ne déverrouille pas ses firmware, qui n'anime pas une
|
||||||
|
communauté de passionnés de ses produits. A refaire aujourd'hui, je miserai
|
||||||
|
sur un mini PC avec une GeeXboX ou un truc du genre, en tout cas une solution
|
||||||
|
plus pérenne où le logiciel n'est pas fermé.
|
||||||
|
|
||||||
|
La deuxième expérience ou plutôt désillusion concerne la nouvelle console
|
||||||
|
portable de Sony. C'est Noël et l'unique cadeau que désire mon fils c'est une
|
||||||
|
Vita. C'est cher mais toute la famille met la main à la poche et on achète le
|
||||||
|
fantasme. La console est offerte avec deux jeux. Première chose qui me fait
|
||||||
|
tiquer, pas de jeu dans le carton mais deux coupons pour les télécharger sur
|
||||||
|
le Store. Adieu donc la possibilité de les revendre à la boutique d'occasion
|
||||||
|
du coin quand on en sera lassé afin d'acheter un autre titre. Etant moi-même
|
||||||
|
un joueur occasionnel sur PC avec un compte Steam je digère l'info : on (et je
|
||||||
|
m'inclus) a tué le marché de l'occasion PC, celui des consoles va suivre et
|
||||||
|
nous crèverons avec nos identifiants en emportant nos téléchargements dans la
|
||||||
|
tombe (je vous renvoie à la chanson 'Société Anonyme' d'Eddy Mitchell). En
|
||||||
|
bon parent, nous suivons les règles établies : j'ai un compte principal car je
|
||||||
|
suis majeur et je crée un compte secondaire pour un enfant de 10 ans qui est
|
||||||
|
associé à la console. Et là, la blague commence. On peut autoriser de jouer
|
||||||
|
un titre interdit aux -18 ans dont on a la cartouche par l'application contrôle
|
||||||
|
parental de la console, mais on ne peut pas télécharger depuis le Store un des
|
||||||
|
deux jeux offerts interdit aux -12 ans. Pour cela il n'y a aucun paramètre. On
|
||||||
|
pourrait s'attendre à un système de notification du compte principal qui
|
||||||
|
pourrait approuver ou non, après tout ils ont nos emails, en plus de nos âges
|
||||||
|
et nos adresses :-( Mais visiblement, Sony s'est protégé à fond et a nivelé
|
||||||
|
par le bas en mettant en place une politique de sécurité dure et identique
|
||||||
|
pour tous les continents. Donc au final que fait-on ? Et bien on ment en
|
||||||
|
conséquence de cause. On crée un autre compte secondaire en augmentant l'âge
|
||||||
|
de son enfant afin qu'il puisse jouer à son jeu. Le constructeur de la console
|
||||||
|
est tranquille, il a rempli son devoir de garde chiourme et c'est le parent qui
|
||||||
|
prend la décision de tricher pour biaiser le système de protection mal pensé.
|
||||||
|
|
||||||
|
Que faut-il en conclure ? Et bien plusieurs choses je crois:
|
||||||
|
|
||||||
|
* Qu'il n'y a pas que des OS de la banquise chez moi. Par facilité, par manque
|
||||||
|
d'alternative et parce que, comme le disait récemment Cyrille on ne peut pas
|
||||||
|
imposer de force nos idées à nos proches, on fait entrer des objets connectés
|
||||||
|
non libres du 21ème siècle dans la maison.
|
||||||
|
* Avec le sourire et en tendant la carte bleue nous sommes en train de nous
|
||||||
|
enfermer volontairement dans des beaux aquariums multicolores, où nager est un
|
||||||
|
plaisir des yeux jusqu'à ce qu'on s'écrase le nez sur la vitre. C'est le point
|
||||||
|
le plus inquiétant pour moi : la multiplication des Store auquels on se soumet
|
||||||
|
avec la satisfaction imbécile d'appartenir à son siècle et de participer au
|
||||||
|
progrès.
|
||||||
|
* A chacun de balayer devant sa porte. Pour ma part, je vais engager l'année avec
|
||||||
|
l'esprit des deux dernières années : en restreignant les besoins artificiels,
|
||||||
|
en réfléchissant d'abord à l'adéquation entre le besoin et l'objet lors d'un
|
||||||
|
achat ainsi qu'à la pérennité de la solution. La sphère familiale et ludique
|
||||||
|
ne doit pas être sous-estimée c'est là que se jouent maintenant les batailles
|
||||||
|
qui définiront nos libertés demain.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,55 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Mise à jour de Fedora 17 vers Fedora 18
|
||||||
|
category: GNU/Linux
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
15 Janvier 2013 : c'est la sortie officielle de la Fedora 18, très attendue car
|
||||||
|
sa sortie fût décalée plusieurs fois, ce qui est à l'honneur des
|
||||||
|
développeurs<!-- more --> : sortir quand le niveau de qualité est atteint malgré le fait
|
||||||
|
qu'on soit une distribution mainstream très attendue. Je vous renvoie à
|
||||||
|
[l'article très complet posté par Renault sur LinuxFR pour la liste des
|
||||||
|
nouveautés.](http://linuxfr.org/news/sortie-de-fedora-18-alias-spherical-cow).
|
||||||
|
Moi je faire un retour d'expérience rapide sur une mise à jour réussie depuis
|
||||||
|
le Spin XFCE de Fedora 17.
|
||||||
|
|
||||||
|
[FedUp](http://fedoraproject.org/wiki/FedUp) est le nouvel outil pour gérer
|
||||||
|
les mises à jour de Fedora 17 et ultérieur. Voici les étapes que j'ai suivi
|
||||||
|
pour mettre à jour ma distribution :
|
||||||
|
|
||||||
|
* s'assurer que le système est à jour : yum upgrade. Puis redémarrer la machine
|
||||||
|
si le Kernel a été mis à jour.
|
||||||
|
* installer FedUp : yum --enablerepo=updates-testing install fedup
|
||||||
|
* désactiver tous les dépôts tiers définis tels que RPM Fusion. En ligne de
|
||||||
|
commande, cela consiste à rajouter enabled=0 aux fichiers.repo que l'on trouve
|
||||||
|
sous /etc/yum.repos.d.
|
||||||
|
* se déconnecter graphiquement et lancer FedUp en tant que root ou avec sudo
|
||||||
|
depuis un VTY : fedup-cli --network 18 --debuglog fedupdebug.log
|
||||||
|
* s'armer de patience, les téléchargements des paquets F18 commencent. Quand
|
||||||
|
c'est terminé, FedUp demande de redémarrer la machine. C'est au redémarrage
|
||||||
|
que le processus de mise à jour est effectué. Je ne sais pas exactement
|
||||||
|
combien de temps cela prend, j'ai dormi ;-)
|
||||||
|
|
||||||
|
Si tout se passe bien, on se retrouve avec une Fedora 18 opérationnelle. La
|
||||||
|
commande **uname -r** indique qu'on est passé en kernel 3.7.2-201.fc18.x86_64.4
|
||||||
|
Pour être complet, on peut aussi mettre à jour Grub 2 manuellement [comme
|
||||||
|
indiqué sur la page Wiki de FedUp](http://fedoraproject.org/wiki/FedUp#How_Can_
|
||||||
|
I_Upgrade_My_System_with_FedUp.3F).
|
||||||
|
|
||||||
|
**[EDIT]** J'ai remarqué que le nouveau pare-feu ne fonctionnait plus même
|
||||||
|
après l'installation des paquets firewall-config et firewall-applet. Le service
|
||||||
|
démarre, on peut modifier la configuration mais elle n'est pas prise en compte.
|
||||||
|
Il semble qu'un coup de **yum -y distro-sync** finalise la mise à jour en
|
||||||
|
supprimant les paquets obsolètes. Le pare-feu est opérationnel au
|
||||||
|
redémarrage. Ce nouveau pare-feu mériterait d'ailleurs un article : plus
|
||||||
|
simple et plus clair à configurer, gestion de 2 configurations (la courante et
|
||||||
|
la stockée).
|
||||||
|
|
||||||
|
Certains paquets obsolètes peuvent rester. Les [conseils de
|
||||||
|
llaumgui](http://www.llaumgui.com/post/fedora-17-in-da-place) restent
|
||||||
|
d'actualité.
|
||||||
|
|
||||||
|
J'ai aussi eu un problème avec la gestion de l'énergie interceptée par
|
||||||
|
systemd avant XFCE. C'est résolu [dans ce
|
||||||
|
post.](http://comments.gmane.org/gmane.linux.redhat.fedora.general/423516)
|
@ -0,0 +1,57 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Migration du blog sous Pelican
|
||||||
|
categories: Blog Hébergement
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Et oui, un de plus à migrer son blog sous [Pelican](http://docs.getpelican.com) !<!-- more -->
|
||||||
|
J'ai lu plusieurs récits de migration depuis trois mois, ce qui dénote un
|
||||||
|
engouement certain pour ce moteur de blog par... essentiellement des développeurs.
|
||||||
|
La perspective de gérer ses articles comme du code, avec un
|
||||||
|
article par fichier, de construire le blog avec une commande 'make' et
|
||||||
|
publier dans un gestionnaire de source nous ramène en terrain familier.
|
||||||
|
|
||||||
|
Les points suivants ont achevé de me convaincre :
|
||||||
|
|
||||||
|
* l'écriture dans une syntaxe simplifiée (un markup langage) ; j'ai opté pour
|
||||||
|
[Markdown](http://daringfireball.net/projects/markdown/). Je peux commencer
|
||||||
|
l'écriture d'un article depuis n'importe quel équipement, même l'application mémo
|
||||||
|
de mon téléphone.
|
||||||
|
* la possibilité de tout gérer depuis un terminal en mode texte, de
|
||||||
|
l'écriture d'un article à sa publication. Ce qui me permet de travailler
|
||||||
|
facilement depuis n'importe où avec une connexion SSH sur mon serveur
|
||||||
|
* La génération de pages statiques. Adieu PHP, on peut héberger encore plus
|
||||||
|
facilement.
|
||||||
|
|
||||||
|
En fait c'est le prolongement du raisonnement qui m'avait fait passer de
|
||||||
|
WordPress à [PluXml](http://www.pluxml.org).
|
||||||
|
|
||||||
|
L'import depuis PluXml est faisable par l'import RSS mais la conversion en Markdown est
|
||||||
|
approximative. J'ai donc écrit un outil de migration dédié en langage Python. Ce
|
||||||
|
qu'il apporte c'est une mise en forme plus fidèle lors de la conversion en
|
||||||
|
Markdown, une gestion des catégories **et des tags**. Il ne couvre peut-être
|
||||||
|
pas tous les cas mais il m'a permis de migrer mes articles sans retouche
|
||||||
|
manuelle. Cet outil est disponible sur mon compte GitHub :
|
||||||
|
[PluXml2Pelican](http://github.com/kianby/pelican)
|
||||||
|
|
||||||
|
Pour les thèmes c'est selon les goûts de chacun. Pelican fournit un langage de
|
||||||
|
templating Python [Jinja 2](http://jinja.pocoo.org).
|
||||||
|
A chacun de voir s'il veut un thème simple ou un thème plus dynamique avec du
|
||||||
|
JavaScript. Quelques thèmes d'exemple sont fournis sur
|
||||||
|
[GitHub](http://github.com/getpelican/pelican-themes). Pour ma part, Je suis parti d'un thème
|
||||||
|
basé sur [Bootstrap](http://twitter.github.com/bootstrap), le kit CSS qui permet
|
||||||
|
facilement de faire du Responsive Design afin d'avoir un site qui s'adapte à
|
||||||
|
tous les périphériques Web (ordinateurs de bureau, tablettes, téléphones) et je
|
||||||
|
l'ai adapté à ma sauce.
|
||||||
|
|
||||||
|
En résumé, Pelican est un très beau projet. Sous le capot, on trouve un outil
|
||||||
|
bien pensé, dans l'esprit du langage Python. Il est possible de développer des
|
||||||
|
plugins qui effectueront des actions à différentes phases de la génération des
|
||||||
|
pages HTML. Le seul point manquant, c'est le support des commentaires.
|
||||||
|
Normal pour un outil qui génère des pages statiques. La solution proposée consiste
|
||||||
|
à déléguer cette tâche à Disqus, un service Web privé. Cela ne me convient pas du tout,
|
||||||
|
je me suis auto-hébergé pour garder la main sur mes données. J'ai gardé les
|
||||||
|
commentaires de tous les articles et je cogite à une solution alternative....
|
||||||
|
En attendant, j'ai ouvert un email pour le blog qu'on peut utiliser pour
|
||||||
|
échanger : <i class="icon-envelope"></i> blogduyax at madyanne.fr
|
@ -0,0 +1,260 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Haute Disponibilité avec Corosync et Pacemaker
|
||||||
|
category: Cluster
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
La Haute Disponibilité désigne toutes les techniques permettant d'améliorer
|
||||||
|
la disponibilité d'un système ou de services et d'augmenter la tolérance aux pannes<!-- more --> :
|
||||||
|
la redondance matérielle, les clusters, la réplications des données à chaud
|
||||||
|
physiquement (RAID 1 et RAID 5) ou logiciellement (Snapshots, DRBD), les scénarios
|
||||||
|
de crise (mode dégradés, plan de secours). Dans une grande entreprise, cela
|
||||||
|
peut donner lieu à un poste à responsabilité à plein temps. Mon activité professionnelle
|
||||||
|
m'a amené à mettre en oeuvre une facette de cette problématique : un cluster
|
||||||
|
actif / passif qui assure la disponibilité d'un service applicatif.
|
||||||
|
|
||||||
|
Pour GNU/Linux, j'ai expérimenté deux logiciels permettant de gérer une infrastructure
|
||||||
|
de cluster :
|
||||||
|
|
||||||
|
* Heartbeat qui a fait ses preuves mais qui est limité : pas de cluster à plus de 2 noeuds,
|
||||||
|
pas de gestion très fine des ressources et des règles pour basculer d'un noeud sur l'autre.
|
||||||
|
* [Corosync](http://www.corosync.org) et [Pacemaker](http://clusterlabs.org/wiki/Main_Page) :
|
||||||
|
c'est le choix de la distribution Red Hat et celui que je vais détailler dans la suite de cet article.
|
||||||
|
|
||||||
|
J'ai monté une maquette assez représentative composée de deux machines virtuelles Debian Wheezy
|
||||||
|
(en version presque finale) avec 4 interfaces réseaux chacune qui font tourner un service Apache
|
||||||
|
qu'on accède par une adresse IP gérée par le cluster.
|
||||||
|
|
||||||
|
Voici un diagramme réseau de la maquette :
|
||||||
|
|
||||||
|
![maquette](/images/2013/maquette-cluster.png)
|
||||||
|
|
||||||
|
Les interfaces eth0 et eth1 font partie d'une agrégation logique de liens et
|
||||||
|
servent au cluster pour vérifier l'état des autres noeuds. Elles constituent un
|
||||||
|
réseau privé avec l'autre noeud dans le réseau 10.20.13.0/255.255.255.252.
|
||||||
|
Les interfaces eth2 et eth3 font partie d'une autre agrégation logique,
|
||||||
|
elles fournissent le service à l'extérieur dans le réseau 192.168.1.0/24.
|
||||||
|
|
||||||
|
L'agrégation logique (appelé aussi bonding) fournit une redondance supplémentaire. Si
|
||||||
|
l'adaptateur réseau eth0 grille, le trafic transite encore grâce à eth1. On
|
||||||
|
peut la configurer en mode actif/passif ou bien en mode load-balancing.
|
||||||
|
|
||||||
|
Voici la configuration des interfaces sur la machine vm-node1 dans **/etc/network/interfaces/** :
|
||||||
|
|
||||||
|
auto bond0
|
||||||
|
iface bond0 inet static
|
||||||
|
address 10.20.13.1
|
||||||
|
netmask 255.255.255.252
|
||||||
|
bond_mode active-backup
|
||||||
|
bond_miimon 100
|
||||||
|
bond_downdelay 200
|
||||||
|
bond_updelay 200
|
||||||
|
slaves eth0 eth1
|
||||||
|
|
||||||
|
auto bond1
|
||||||
|
iface bond1 inet static
|
||||||
|
address 192.168.1.61
|
||||||
|
netmask 255.255.255.0
|
||||||
|
gateway 192.168.1.1
|
||||||
|
bond_mode active-backup
|
||||||
|
bond_miimon 100
|
||||||
|
bond_downdelay 200
|
||||||
|
bond_updelay 200
|
||||||
|
slaves eth2 eth3
|
||||||
|
|
||||||
|
et la configuration du bonding dans **/etc/modprobe.d/bonding** :
|
||||||
|
|
||||||
|
alias bond0 bonding
|
||||||
|
alias bond1 bonding
|
||||||
|
|
||||||
|
La configuration réseau de la machine vm-node2 est symétrique avec bond0 en
|
||||||
|
10.20.13.2 et bond1 en 192.168.1.62.
|
||||||
|
|
||||||
|
Quand la configuration réseau est ok, on peut s'occuper du cluster. D'abord il faut installer
|
||||||
|
Corosync et Pacemaker, c'est trivial sous Debian :
|
||||||
|
|
||||||
|
apt-get install corosync pacemaker
|
||||||
|
|
||||||
|
Ensuite il faut configurer Corosync. Il gère l'infrastructure de cluster, c'est à dire l'état des noeuds et
|
||||||
|
leur fonctionnement en groupe. Pour cela, on doit générer une clef d'authenfication qui sera partagée par tous
|
||||||
|
les noeuds du cluster. L'utilitaire **corosync-keygen** permet de générer cette clef à partir d'entrées clavier
|
||||||
|
pseudo-aléatoires qu'il faut ensuite sécuriser et copier sur les autres noeuds.
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
# génération de la clef depuis vm-node1
|
||||||
|
corosync-keygen
|
||||||
|
mv authkey /etc/corosync/authkey
|
||||||
|
chown root:root /etc/corosync/authkey
|
||||||
|
chmod 400 /etc/corosync/authkey
|
||||||
|
|
||||||
|
# copie de la clef sur vm-node2
|
||||||
|
scp /etc/corosync/authkey root@10.20.13.2:/etc/corosync/authkey
|
||||||
|
```
|
||||||
|
|
||||||
|
Corosync propose le concept d'anneaux de connexion pour assurer la communication entre noeuds. Dans le cadre de
|
||||||
|
la maquette je définis deux anneaux : **ring0**, l'anneau de communication par défaut qui utilise le réseau privé et
|
||||||
|
**ring1** un anneau de secours qui transite par l'intermédiaire des commutateurs (ou switchs) avec le reste du trafic.
|
||||||
|
C'est une sécurité de plus pour le cas improbable où les deux liens eth0 et eth1 soient cassés. Corosync
|
||||||
|
permet de définir les anneaux en terme de réseau IP / masque réseau plutôt que de définir les adresses IP.
|
||||||
|
C'est appréciable car le même fichier de configuration peut être déployé sur tous les noeuds sans rien changer.
|
||||||
|
|
||||||
|
totem {
|
||||||
|
version: 2
|
||||||
|
|
||||||
|
# How long before declaring a token lost (ms)
|
||||||
|
token: 3000
|
||||||
|
|
||||||
|
# How many token retransmits before forming a new configuration
|
||||||
|
token_retransmits_before_loss_const: 10
|
||||||
|
|
||||||
|
# How long to wait for join messages in the membership protocol (ms)
|
||||||
|
join: 60
|
||||||
|
|
||||||
|
# How long to wait for consensus to be achieved before starting
|
||||||
|
#a new round of membership configuration (ms)
|
||||||
|
consensus: 3600
|
||||||
|
|
||||||
|
# Turn off the virtual synchrony filter
|
||||||
|
vsftype: none
|
||||||
|
|
||||||
|
# Number of messages that may be sent by one processor on receipt of the token
|
||||||
|
max_messages: 20
|
||||||
|
|
||||||
|
# Limit generated nodeids to 31-bits (positive signed integers)
|
||||||
|
clear_node_high_bit: yes
|
||||||
|
|
||||||
|
# Disable encryption
|
||||||
|
secauth: off
|
||||||
|
|
||||||
|
# How many threads to use for encryption/decryption
|
||||||
|
threads: 0
|
||||||
|
|
||||||
|
# Optionally assign a fixed node id (integer)
|
||||||
|
# nodeid: 1234
|
||||||
|
|
||||||
|
# This specifies the mode of redundant ring, which may be none, active, or passive.
|
||||||
|
rrp_mode: passive
|
||||||
|
|
||||||
|
interface {
|
||||||
|
ringnumber: 0
|
||||||
|
bindnetaddr: 10.20.13.0
|
||||||
|
mcastaddr: 226.94.1.1
|
||||||
|
mcastport: 5405
|
||||||
|
}
|
||||||
|
interface {
|
||||||
|
ringnumber: 1
|
||||||
|
bindnetaddr: 192.168.1.0
|
||||||
|
mcastaddr: 226.94.1.1
|
||||||
|
mcastport: 5407
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
amf {
|
||||||
|
mode: disabled
|
||||||
|
}
|
||||||
|
|
||||||
|
service {
|
||||||
|
# Load the Pacemaker Cluster Resource Manager
|
||||||
|
ver: 0
|
||||||
|
name: pacemaker
|
||||||
|
}
|
||||||
|
|
||||||
|
aisexec {
|
||||||
|
user: root
|
||||||
|
group: root
|
||||||
|
}
|
||||||
|
|
||||||
|
logging {
|
||||||
|
fileline: off
|
||||||
|
to_stderr: yes
|
||||||
|
to_logfile: no
|
||||||
|
to_syslog: yes
|
||||||
|
syslog_facility: daemon
|
||||||
|
debug: off
|
||||||
|
timestamp: on
|
||||||
|
logger_subsys {
|
||||||
|
subsys: AMF
|
||||||
|
debug: off
|
||||||
|
tags: enter|leave|trace1|trace2|trace3|trace4|trace6
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
A ce stade, l'infrastructure de cluster est en place mais elle ne gère aucune ressource. Ca c'est le
|
||||||
|
rôle de Pacemaker.
|
||||||
|
|
||||||
|
On impose les contraintes de fonctionnement suivantes :
|
||||||
|
|
||||||
|
1. les ressources (le service Apache et l'adresse IP du cluster) tournent sur le serveur vm-node1 dans le cas normal.
|
||||||
|
2. le service Apache et l'adresse IP du cluster doivent tourner sur le même serveur sinon notre service est injoignable.
|
||||||
|
3. si le service Apache se crashe sur le serveur primaire, on bascule sur le serveur secondaire.
|
||||||
|
4. si le serveur primaire ne joint plus la passerelle Internet, on bascule sur le serveur secondaire.
|
||||||
|
|
||||||
|
Pacemaker fournit quelques utilitaires en mode texte pour interagir.
|
||||||
|
|
||||||
|
* **crm** permet de gérer tout l'aspect configuration.
|
||||||
|
* **crm_mon** affiche l'état du cluster.
|
||||||
|
|
||||||
|
D'abord on définit la configuration globale. On désactive le **STONITH** (Shoot The Other Node In The Head) et
|
||||||
|
le **quorum**. Le Stonith est la possibilité de *tuer* l'autre noeud s'il ne répond plus par l'infra de cluster.
|
||||||
|
C'est faisable sur des vrais serveurs par [IPMI](http://fr.wikipedia.org/wiki/IPMI) par exemple.
|
||||||
|
Quant au quorum, il n'a pas de sens sur un cluster à moins de 3 noeuds.
|
||||||
|
|
||||||
|
property stonith-enabled=false
|
||||||
|
property no-quorum-policy=ignore
|
||||||
|
|
||||||
|
On peut maintenant définir notre première ressource : l'adresse IP du cluster attaché au noeud actif.
|
||||||
|
|
||||||
|
primitive vip ocf:heartbeat:IPaddr2 params ip=192.168.1.60 cidr_netmask=24 nic="bond1" op monitor interval="10s"
|
||||||
|
|
||||||
|
Puis la ressource Apache, le service critique qu'on veut fournir dans cette maquette :
|
||||||
|
|
||||||
|
primitive httpd ocf:heartbeat:apache params configfile="/etc/apache2/apache2.conf" statusurl="http://localhost/server-status" op start timeout="60s" op stop timeout="60s" op monitor timeout="20s"
|
||||||
|
|
||||||
|
Le démarrage et l'arrêt d'Apache sont maintenant gérés par le cluster. Il faut fonc enlever le démarrage
|
||||||
|
automatique du service. Sous Debian c'est avec update-rc.d :
|
||||||
|
|
||||||
|
update-rc.d -f remove apache2
|
||||||
|
|
||||||
|
Vous remarquerez qu'on va plus loin que la définition d'une ressource Apache. L'attribut **statusurl** permet à
|
||||||
|
Pacemaker d'utiliser la page de statut d'Apache pour décider d'une bascule. Il ne faut donc pas oublier de
|
||||||
|
configurer cette URL dans Apache pour que cela fonctionne :
|
||||||
|
|
||||||
|
``` apache
|
||||||
|
<Location /server-status>
|
||||||
|
SetHandler server-status
|
||||||
|
Order deny,allow
|
||||||
|
Deny from all
|
||||||
|
Allow from 127.0.0.1
|
||||||
|
</Location>
|
||||||
|
```
|
||||||
|
|
||||||
|
Comme on a construit la configuration pas à pas, **crm_mon** remonte peut-être des erreurs sur certaines
|
||||||
|
ressources car elle n'étaient pas opérationnelles. Il y a un compteur d'échec qui lève un message d'avertissement.
|
||||||
|
on peut remettre ce compteur à zéro comme ceci pour la ressource http :
|
||||||
|
|
||||||
|
crm resource cleanup httpd
|
||||||
|
|
||||||
|
A ce stade on a une adresse de cluster et une ressource HTTP, mais pas forcément sur le même noeud.
|
||||||
|
la ressource **vip** va basculer si le noeud tombe. La ressource **httpd** va basculer si le noeud tombe
|
||||||
|
ou si le service apache tombe (surveillance par l'URL /server-status).
|
||||||
|
|
||||||
|
C'est sympa mais pas très utile :-) On va aller plus loin et forcer les deux ressources à tourner sur le
|
||||||
|
même noeud C'est faisable grâce au concept de la colocation :
|
||||||
|
|
||||||
|
colocation httpd-with-vip inf: httpd vip
|
||||||
|
|
||||||
|
Et on voudrait que dans le cas normal, les ressources tournent sur vm-node1, notre noeud primaire :
|
||||||
|
|
||||||
|
location preferred-node vip 100: vm-node1
|
||||||
|
|
||||||
|
Enfin, on rajoute une condition de bascule. Si le noeud ne joint plus la passerelle Internet, on veut basculer les
|
||||||
|
ressources sur l'autre noeud Pour cela on définit une ressource de type *ping* qui tourne sur tous les noeuds
|
||||||
|
(grâce au concept de ressource clonée). Puis on rajoute une règle de location pour basculer si le noeud actif
|
||||||
|
ne voit plus la passerelle.
|
||||||
|
|
||||||
|
primitive ping-gateway ocf:pacemaker:ping params host_list="192.168.1.1" multiplier="1000" op monitor interval="10s"
|
||||||
|
clone cloned-ping-gateway ping-gateway
|
||||||
|
location vip-needs-gateway vip rule -inf: not_defined pingd or pingd lte 0
|
||||||
|
|
||||||
|
Voilà notre maquette est opérationnelle.
|
@ -0,0 +1,99 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Enfin le silence
|
||||||
|
category: GNU/Linux
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
J'ai effectué la mise à jour de mon *véloce serveur* <i class="icon-smile"></i>
|
||||||
|
(un Dell latitude D610 sous Céléron) vers Debian Wheezy.<!-- more --> Ca s'est plutôt bien passé
|
||||||
|
en suivant [les conseils de Nicolargo](http://blog.nicolargo.com/2013/05/de-squeeze-a-wheezy.html).
|
||||||
|
J'ai seulement eu quelques problèmes avec l'interpréteur PERL, je me suis retrouvé
|
||||||
|
avec un mix : l'interpréteur 5.16.3 de Wheezy et d'anciens modules PERL.
|
||||||
|
Peut-être que j'avais installé ces librairies manuellement, je ne me souviens
|
||||||
|
pas trop. Ca c'est résolu avec un ménage à la mano des modules obsolètes et une
|
||||||
|
réinstallation propre avec CPAN. Désormais, tout est fonctionnel !
|
||||||
|
|
||||||
|
Jusqu'à aujourd'hui je limitais la charge processeur la nuit en stoppant
|
||||||
|
certains services pour éviter la nuisance sonore, typiquement, le serveur
|
||||||
|
Minecraft en JAVA qui consomme 3% de CPU quand personne n'est connecté.
|
||||||
|
J'utilise depuis longtemps le paquet **cpufrequtils** qui permet de moduler la
|
||||||
|
fréquence du processeur par un module du noyau selon une politique **on demand**
|
||||||
|
qui fait varier la fréquence du Celeron entre 800 Mhz et 1,6 Ghz. Mais j'ai
|
||||||
|
réalisé que malgré une charge minimale, la machine était souvent bruyante à cause du
|
||||||
|
ventilateur. Il devrait être régulé en fonction de la fréquence du
|
||||||
|
processeur, or ce n'est pas le cas.
|
||||||
|
|
||||||
|
En faisant des recherches sur le sujet, on
|
||||||
|
apprend que la partie régulation du processeur est souvent réalisée par ACPI,
|
||||||
|
une norme répandue de contrôle de la gestion de l'énergie par l'OS grâce à un
|
||||||
|
support ACPI dans le BIOS mais que la gestion du ventilateur n'est pas souvent
|
||||||
|
incluse. Cela va dépendre de l'implémentation ACPI d'un constructeur à l'autre.
|
||||||
|
[La documentation
|
||||||
|
ArchLinux](https://wiki.archlinux.org/index.php/Fan_Speed_Control) décrit
|
||||||
|
certaines méthodes qui vont dépendre du matériel et j'ai découvert **i8kmon** pour
|
||||||
|
mon petit Dell. Ca tourne en daemon dans le système et ça régule la vitesse du
|
||||||
|
ventilateur proportiennellement à la vitesse du processeur. Pour la
|
||||||
|
configuration, j'ai utilisé les seuils proposés dans le [post de ce
|
||||||
|
forum](http://forum.tinycorelinux.net/index.php?topic=10736.0) :
|
||||||
|
|
||||||
|
Fichier **/etc/i8kmon** :
|
||||||
|
|
||||||
|
```
|
||||||
|
# Kernel I8K status file
|
||||||
|
set config(proc_i8k) /proc/i8k
|
||||||
|
|
||||||
|
# Kernel APM status file
|
||||||
|
set config(proc_apm) /proc/apm
|
||||||
|
|
||||||
|
# Kernel ACPI status file
|
||||||
|
set config(proc_acpi) /proc/acpi/ac_adapter/0/status
|
||||||
|
|
||||||
|
# External program to control the fans
|
||||||
|
set config(i8kfan) /usr/bin/i8kfan
|
||||||
|
|
||||||
|
# Applet geometry, override with --geometry option
|
||||||
|
set config(geometry) {}
|
||||||
|
|
||||||
|
# Run as daemon, override with --daemon option
|
||||||
|
set config(daemon) 1
|
||||||
|
|
||||||
|
# Automatic fan control, override with --auto option
|
||||||
|
set config(auto) 1
|
||||||
|
|
||||||
|
# Report status on stdout, override with --verbose option
|
||||||
|
set config(verbose) 0
|
||||||
|
|
||||||
|
# Status check timeout (seconds), override with --timeout option
|
||||||
|
set config(timeout) 5
|
||||||
|
|
||||||
|
# Temperature display unit (C/F), override with --unit option
|
||||||
|
set config(unit) C
|
||||||
|
|
||||||
|
# Temperature threshold at which the temperature is displayed in red
|
||||||
|
set config(t_high) 80
|
||||||
|
|
||||||
|
# Minimum expected fan speed
|
||||||
|
set config(min_speed) 1800
|
||||||
|
|
||||||
|
# Temperature thresholds: {fan_speeds low_ac high_ac low_batt high_batt}
|
||||||
|
# These were tested on the I8000. If you have a different Dell laptop model
|
||||||
|
# you should check the BIOS temperature monitoring and set the appropriate
|
||||||
|
# thresholds here. In doubt start with low values and gradually rise them
|
||||||
|
# until the fans are not always on when the cpu is idle.
|
||||||
|
set config(0) { {- 0} -1 52 -1 52}
|
||||||
|
set config(1) { {- 1} 44 60 44 60}
|
||||||
|
set config(2) { {- 2} 60 80 60 80}
|
||||||
|
set config(3) { {- 2} 70 128 75 128}
|
||||||
|
```
|
||||||
|
|
||||||
|
Fichier **/etc/default/i8kmon**
|
||||||
|
|
||||||
|
```
|
||||||
|
# Change to one to enable i8kmon
|
||||||
|
ENABLED = 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Le résultat est au rendez-vous. Quand la CPU est basse, le volume sonore de la
|
||||||
|
machine est inaudible. Il reste à vérifier que les seuils sont adaptés et que
|
||||||
|
le processeur ne fond pas dans les prochaines semaines <i class="icon-smile"></i>
|
@ -0,0 +1,74 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Ma vie de sysadmin en semi-pro (1)
|
||||||
|
category: GNU/Linux
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Par goût personnel et par nécessité professionnelle, je rajoute progressivement le rôle
|
||||||
|
d'administrateur système à mon métier de base qui est le développement de logiciels.<!-- more --> Doté de
|
||||||
|
bonnes bases UNIX et réseau, je découvre petit à petit les bon outils et les bonnes pratiques
|
||||||
|
pour faire le job, le simplifier voire l'automatiser. Et parfois j'enverrais volontiers une
|
||||||
|
caisse de bières à l'auteur d'un outil qui m'a sauvé plusieurs heures fastidieuses :-)
|
||||||
|
|
||||||
|
Dans cette série d'articles *ma vie de sysadmin en semi-pro* je parlerais épisodiquement de mes
|
||||||
|
avancées et de mes découvertes dans le domaine de l'administration système.
|
||||||
|
|
||||||
|
Tout d'abord la console est ta seule amie. Sur ton PC de bureau, la console est un choix. Dans
|
||||||
|
le monde des serveurs c'est un passage obligé car ils sont rarement installés avec une interface
|
||||||
|
graphique et on les accède généralement par SSH. Les outils de base sont connus mais il faut
|
||||||
|
apprendre à les maîtriser.
|
||||||
|
|
||||||
|
Ce qui propulse la console c'est un shell UNIX compatible Bourne Shell. Il y a plusieurs variantes :
|
||||||
|
le Bourne Shell d'origine (sh), le Bourne Again Shell (bash), Korn Shell (ksh), Z Shell (zsh). Des
|
||||||
|
experts sont capables de discuter de tel avantage de zsh par rapport à ksh. A mon niveau, maîtriser
|
||||||
|
**sh** et **Bash** qui est le choix par défaut d'un grand nombre de systèmes GNU/Linux est le choix
|
||||||
|
de la raison. On trouve beaucoup de littérature sur le sujet (le Bourne Shell existe depuis 1978 et
|
||||||
|
le Bourne Again Shell depuis 1989 ), ma référence est le guide **Advanced Bash-Scripting Guide** sur
|
||||||
|
[le site du Linux Document Project](http://www.tldp.org/guides.html). Ensuite il est bien sûr
|
||||||
|
important de connaître les programmes en ligne de commande nécessaires pour les tâches de tous les
|
||||||
|
jours : grep, find, locate, chmod, chown, cp, mv, mkdir, rm, rmdir, touch, top, kill, ps ... la
|
||||||
|
liste est loin d'être exhaustive.
|
||||||
|
|
||||||
|
Un autre élément important est éditeur de texte en mode console. Il doit être polyvalent, léger,
|
||||||
|
capable de traiter des fichiers de centaines de milliers de lignes. Deux candidats se détachent du
|
||||||
|
peloton : **Vim** et **Emacs**. Les deux sont beaucoup plus que de simples éditeurs de texte. Ayant
|
||||||
|
des rudiments de **Vi** depuis 20 ans, je me suis lancé à corps perdu dans l'apprentissage des
|
||||||
|
fonctions avancées de **Vim** Que du bonheur ! Voici quelques liens :
|
||||||
|
|
||||||
|
* [Vim FAQ](https://github.com/chrisbra/vim_faq)
|
||||||
|
* [Vimcasts - Vim podcasts](http://vimcasts.org)
|
||||||
|
* [Vundle - Vim Plugin manager](https://github.com/gmarik/vundle)
|
||||||
|
|
||||||
|
Quand on passe beaucoup de temps sur la console, on est à l'affut des manières de la rendre plus
|
||||||
|
attractive et plus puissante
|
||||||
|
|
||||||
|
* Le prompt du shell par défaut est minimaliste. Pourquoi ne pas l'enrichir avec des informations
|
||||||
|
utiles comme la charge processeur ou les infos de gestion de version (SVN, GIT) du répertoire
|
||||||
|
courant ? C'est ce que propose [le projet
|
||||||
|
LiquidPrompt](https://github.com/nojhan/liquidprompt).
|
||||||
|
* Le choix des couleurs est important quand on passe beaucoup d'heures devant une console. Je ne
|
||||||
|
parle pas de choisir une palette *cool* mais bien de préserver sa vue. J'ai fait le choix [du
|
||||||
|
schéma de couleur Solarized](https://github.com/altercation/solarized). Ca peut sembler un peu
|
||||||
|
pâlot au début mais je me suis vité habitué et je l'utilise dans chaque programme où c'est
|
||||||
|
possible. Dans le même registre, j'utilise [le projet RedShift](https://launchpad.net/redshift)
|
||||||
|
pour gérer la température des couleurs en fonction de l'heure de la journée et de votre
|
||||||
|
emplacement géographique. Les deux premiers jours, on a l'impression que la luminosité est trop
|
||||||
|
basse, ensuite on trouve cela normal. Et on se sent agressé quand on utilise une autre machine
|
||||||
|
que la sienne.
|
||||||
|
* On se retrouve vite à ouvrir quantité de terminaux et à jongler entre eux. J'ai utilisé
|
||||||
|
[Terminator](http://www.tenshu.net/p/terminator.html) un temps puis j'ai pris confiance et j'ai
|
||||||
|
eu besoin de multiplier les terminaux depuis une même session SSH et de lancer des traitements
|
||||||
|
qui tournent en tâche de fond. Du coup, j'ai pris le temps d'apprendre
|
||||||
|
[Tmux](http://tmux.sourceforge.net) et c'est un très bon investissement ! Un bon article pour
|
||||||
|
démarrer est [accessible
|
||||||
|
ici](http://blog.hawkhost.com/2010/06/28/tmux-the-terminal-multiplexer).
|
||||||
|
* Quand on *provisionne* des serveurs régulièrement, il est intéressant de déployer sa
|
||||||
|
configuration du shell, de l'éditeur de texte, ses outils afin de retrouver son environnement et
|
||||||
|
ses habitudes. On peut installer ses fichiers manuellement depuis un point central [comme son
|
||||||
|
GitHub](https://github.com/kianby/dotfiles), ou mieux on peut carrément automatiser cette partie
|
||||||
|
en utilisant un outil comme [Fabric](https://github.com/fabric/fabric).
|
||||||
|
|
||||||
|
Le choix des outils présentés dans cet articles est personnel. Ce qui est intéressant, c'est la
|
||||||
|
puissance de la console dans une utilisation quotidienne, la pléthore d'outils et le sentiment de
|
||||||
|
maîtrise de ce qu'on fait.
|
@ -0,0 +1,55 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: La rentrée 2013
|
||||||
|
category: Humeur
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Le blog n'est pas abandonné ! C'est drôle, j'ai annoncé la même chose il y a
|
||||||
|
un an après la période d'inactivité qui accompagne l'été.<!-- more --> Ce n'est pas un blog
|
||||||
|
d'humeurs ou d'actualité mais plutôt un bloc-note de mes expérimentations autour
|
||||||
|
de GNU/Linux et du Libre. Donc pour écrire, il me faut un sujet que j'ai approfondi,
|
||||||
|
mis en oeuvre, à raconter. J'ai écrit très peu de billets depuis l'année dernière
|
||||||
|
mais je suis satisfait de leur qualité : distribution Fedora, migration du blog
|
||||||
|
sous Pelican, administration système. On va tenter de rester sur la même voie
|
||||||
|
cette année...
|
||||||
|
|
||||||
|
Pour ceux qui lisent le blog directement depuis le site, vous avez peut-être
|
||||||
|
constaté de légers changements dans le thème graphique du blog. Quand [j'ai
|
||||||
|
migré le blog depuis PluXml vers Pelican](migration-du-blog-sous-pelican.html),
|
||||||
|
j'ai utilisé Bootstrap pour rapidement refaire un thème similaire à ce que
|
||||||
|
j'avais. Dernièrement j'ai réalisé que les pages HTML du blog sont plutôt
|
||||||
|
lourdes. Bootstrap est une librairie CSS / JS qui fait beaucoup de choses mais
|
||||||
|
qui pèse avec, en plus, une dépendance à JQuery. Ca ne cadre pas avec la philosophie
|
||||||
|
d'un blog statique qui se résume, pour moi, en plusieurs critères :
|
||||||
|
|
||||||
|
* possibilité de gérer les sources avec un gestionnaire de version : GIT
|
||||||
|
dans mon cas
|
||||||
|
* possibilité d'éditer les articles simplement. C'est le cas avec un
|
||||||
|
langage de markup qui simplifie HTML. Pelican propose RST et Markdown
|
||||||
|
pour lequel j'ai une préférence même s'il est plus limité.
|
||||||
|
* ouverture vers n'importe quel éditeur de texte : j'utilise VIM, GEdit, le
|
||||||
|
bloc-note de mon téléphone.
|
||||||
|
* contrôle fin du code HTML généré : c'est le cas par un contrôle totale des
|
||||||
|
CSS et des templates Jinja utilisés par Pelican pour générer les pages.
|
||||||
|
|
||||||
|
|
||||||
|
Donc l'idée d'avoir un thème CSS léger avec le minimum de JavaScript a fait son
|
||||||
|
chemin. La dernière contrainte c'était d'avoir un zeste de *responsive design*
|
||||||
|
pour basculer la barre latérale de droite en fin de page quand la largeur de l'écran
|
||||||
|
n'est pas suffisante (sur téléphone ou tablette). J'aurais pu l'écrire *from
|
||||||
|
scratch* en passant vraiment beaucoup de temps ou en ayant un vrai talent de Web
|
||||||
|
designer comme mon confrère [Badele](http://blog.jesuislibre.org) mais j'ai préféré
|
||||||
|
chercher une alternative à Bootstrap qui réponde à ces critères. Et j'ai trouvé la
|
||||||
|
perle rare : [Pure](http://purecss.io), un module CSS qui se concentre sur
|
||||||
|
l'essentiel tout en étant **HTML5-ready** et **responsive design**. C'est très
|
||||||
|
récent, développé par Yahoo (l'équipe qui s'occupe du fameux framework
|
||||||
|
Yui). La documentation est de très bonne qualité, le positionnement est clair :
|
||||||
|
ne pas *refaire* Bootstrap, rester léger. La documentation sur les bonnes
|
||||||
|
pratiques pour étendre la CSS est exemplaire. Ah j'oubliais... c'est sous licence
|
||||||
|
BSD :-)
|
||||||
|
|
||||||
|
Enfin, la dernière évolution sur le blog, c'est la migration des commentaires de l'époque PluXml
|
||||||
|
et à nouveau un formulaire pour soumettre des commentaires sur les articles.
|
||||||
|
|
||||||
|
Bonne rentrée.
|
@ -0,0 +1,47 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: De l'auto-hébergement au serveur dédié
|
||||||
|
category: Hébergement
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Après deux ans en auto-hébergement j'envisage de louer un serveur dédié
|
||||||
|
physique ou virtuel (les fameux VPS)<!-- more --> pour plusieurs raisons :
|
||||||
|
|
||||||
|
- l'augmentation du prix de l'électricité : mon antique portable consomme quand même 90W,
|
||||||
|
- la baisse du prix des serveurs dédiés,
|
||||||
|
- l'avantage d'avoir une bande passante non limitée par son upload ADSL pour les services proposés à l'extérieur.
|
||||||
|
|
||||||
|
J'ai regardé du côté de Dédibox et de OVH, on peut
|
||||||
|
avoir son propre petit serveur qui consommera moins de 10W, c'est
|
||||||
|
toujours ça pour l'environnement. Au niveau des besoins, il y a d'un côté
|
||||||
|
l'hébergement du blog et de mes outils collaboratifs et de l'autre le
|
||||||
|
serveur Minecraft. Le serveur Minecraft, c'est pas green IT du tout : du
|
||||||
|
JAVA, de la CPU à fond, beaucoup de RAM. Prendre un serveur couvrant les deux
|
||||||
|
besoins m'obligerait à choisir une machine puissante et assez coûteuse
|
||||||
|
alors que la mode Minecraft peut passer d'ici quelques mois. J'ai donc
|
||||||
|
décidé de séparer les hébergements :
|
||||||
|
|
||||||
|
- un serveur dédié (physique ou virtuel) peu puissant pour le blog et tout ce qui me passe par la tête : un pied à terre sur la Toile,
|
||||||
|
- un serveur Minecraft mutualisé loué au mois chez un hébergeur spécialisé dans
|
||||||
|
le serveur de jeux.
|
||||||
|
|
||||||
|
Étonnamment je ne devrais pas éclater mon budget que je me suis fixé en dessous
|
||||||
|
de 10 euros TTC par mois car j'ai découvert, gràce à mon fils tout un monde que
|
||||||
|
je ne connaissais pas : celui des hébergeurs à prix cassé de serveurs de jeux
|
||||||
|
clef en main où l'on choisit la capacité en nombre de joueurs simultanés (slots),
|
||||||
|
où tout s'administre en 3 clics avec une interface d'administration Web, sans
|
||||||
|
engagement de longue durée. Sans volonté de faire de la pub, il s'agit des
|
||||||
|
hébergeurs du style de Myriapulse, Verygames, OMGServ. Pour quatre joueurs on
|
||||||
|
peut louer quelque chose entre 1 et 4 euros par mois. C'est un domaine où la
|
||||||
|
compétition semble encore plus rude que dans l'hébergement classique.
|
||||||
|
|
||||||
|
Pour l'autre serveur (le mien), j'attends de voir les nouvelles offres que OVH
|
||||||
|
devrait dévoiler cette semaine avant de fixer mon choix. J'ai raté le coche du
|
||||||
|
Kimsufi 2013 à 5 euros et des brouettes sorti cet été je crois. Depuis OVH a
|
||||||
|
gelé les locations et revoit en profondeur toutes ses offres pour mieux
|
||||||
|
adresser les différents marchés de sa clientèle (du particulier fauché au grand
|
||||||
|
compte) en étant rentable et en situation de monter en charge. Si le serveur
|
||||||
|
physique est inaccessible, je me rabattrais sur une offre VPS chez OVH ou
|
||||||
|
ailleurs, ce qui compte c'est d'avoir la latitude d'installer tout ce qu'on
|
||||||
|
veut dessus.
|
@ -0,0 +1,84 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Ma vie de sysadmin en semi-pro (2)
|
||||||
|
categories: GNU/Linux BSD
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Il y a deux logiciels que j'utilise quotidiennent dans mon activité de sysadmin
|
||||||
|
à temps partiel<!-- more --> :
|
||||||
|
|
||||||
|
* [Nas4Free](http://www.nas4free.org)
|
||||||
|
* [Proxmox](http://www.proxmox.com)
|
||||||
|
|
||||||
|
Le premier est une distribution NAS sous FreeBSD qui permet de mettre en place
|
||||||
|
facilement un serveur de stockage. Si on l'installe sur un vrai serveur avec
|
||||||
|
plusieurs disques dur, il pourra gérer du Raid 0 (agrégation des disques),
|
||||||
|
du Raid 1 (miroir d'un disque sur l'autre) voire du Raid 5 avec au moins 4 disques
|
||||||
|
pour améliorer la tolérance aux pannes. Ce qu'il apporte ensuite, c'est une
|
||||||
|
facilité de configuration par une interface Web et le support d'un large nombre
|
||||||
|
de protocoles : Samba, NFS, FTP, Rsync et d'autres plus rares. Comme tout bon logiciel,
|
||||||
|
on l'installe, on prend le temps de le configurer puis on l'oublie car ça fait le job !
|
||||||
|
|
||||||
|
Je l'ai mis en place pour sauvegarder quelques machines en nocturne par Rsync.
|
||||||
|
C'est de la sauvegarde miroir (pas assez de capacité disque pour faire des sauvegardes tournantes)
|
||||||
|
avec une copie différentielle de ce qui a changé depuis la veille. Pour GNU/Linux, le programme
|
||||||
|
rsync de toute distribution qui se respecte combiné avec un CRON fait l'affaire.
|
||||||
|
|
||||||
|
Pour Ms Windows, il a fallu tester quelques clients rsync avant de trouver celui qui n'est pas
|
||||||
|
bogué et qui supporte les noms de fichiers avec accents :
|
||||||
|
c'est [cwRsync](https://www.itefix.no/i2/content/cwrsync-free-edition). Une tâche programmée
|
||||||
|
avec Ms Windows permet de lancer la sauvegarde en nocturne. Il est de bon ton de prévoir l'envoi
|
||||||
|
d'un email avec un compte-rendu de la sauvegarde, pour se rassurer sur le bon fonctionnement et
|
||||||
|
avoir une trace des fichiers synchronisés. J'ai dégoté le programme [blat](http://www.blat.net)
|
||||||
|
pour l'envoi d'email facile depuis un batch, il y en a sûrement plein d'autres. Voici un
|
||||||
|
script batch assez proche de celui que j'utilise :
|
||||||
|
|
||||||
|
``` bat
|
||||||
|
REM ================================================================
|
||||||
|
REM Synchroniser les changements
|
||||||
|
REM ================================================================
|
||||||
|
SET SOURCE=(REPERTOIRE SOURCE)
|
||||||
|
SET IPNAS=(IP DU NAS4FREE)
|
||||||
|
SET NOMRSYNC=(NOM DU PARTAGE RSYNC)
|
||||||
|
rsync --recursive --stats --verbose --size-only --chmod=ugo=rwX --compress --delete
|
||||||
|
--delete-excluded --force --links --backup --backup-dir=backup
|
||||||
|
--exclude-from=exclude.txt "%SOURCE%" %IPNAS%::%NOMRSYNC% >rsync.log 2>rsync.err
|
||||||
|
copy rsync.err+mail.txt+rsync.log rsync.mail
|
||||||
|
|
||||||
|
REM ================================================================
|
||||||
|
REM Envoi de l'email
|
||||||
|
REM ================================================================
|
||||||
|
SET FROM=(EXPEDITEUR DE L'EMAIL)
|
||||||
|
SET TO=(DESTINATAIRE DE L'EMAIL)
|
||||||
|
SET SMTP=(SERVEUR SMTP)
|
||||||
|
SET USER=(COMPTE UTILISATEUR)
|
||||||
|
SET PWD=(MOT DE PASSE)
|
||||||
|
blat rsync.mail -f %FROM% -to %TO% -server %SMTP% -u %USER% -pw %PWD% -subject "Nightly backup"
|
||||||
|
```
|
||||||
|
|
||||||
|
Une autre utilisation de mon instance Nas4Free est de servir un volume réseau iScsi qui sert
|
||||||
|
de stockage partagé à un cluster Ms Windows virtualisé qui sert à des tests. Ce qui m'amène au
|
||||||
|
second logiciel : **Proxmox**. Il s'agit d'une solution de virtualisation du style de VMware ESX
|
||||||
|
qui tourne sur un serveur dédié, s'administre par une interface Web. En fonction des besoins,
|
||||||
|
on peut créer des machines virtuelles car Proxmox est un hyperviseur KVM ou bien créer des
|
||||||
|
containers openvz.
|
||||||
|
|
||||||
|
* Les containers sont indépendants comme une machine virtuelle mais c'est réalisé par isolation
|
||||||
|
des processus et isolation de la mémoire, une sorte de *super Chroot*. Ca ne s'applique donc
|
||||||
|
qu'aux système GNU/Linux avec la contrainte de ne pas pouvoir choisir le kernel ni le
|
||||||
|
modifier en rajoutant des modules. Si on n'a pas ces contraintes, les containers sont la
|
||||||
|
solution privilégiée car ils sont très légers.
|
||||||
|
* La création de machines virtuelles GNU/Linux ou Ms Windows est la solution pour tous les
|
||||||
|
autres cas.
|
||||||
|
|
||||||
|
Grâce à cette gestion mixte Containers / KVM, un hyperviseur Proxmox qui tourne sur un serveur
|
||||||
|
récent peut réellement monter en charge. Les formats de VM sont ceux de KVM, il est aisé de convertir
|
||||||
|
une machine virtuelle VMware ou VirtualBox vers Proxmox. L'interface d'administration est sobre
|
||||||
|
et fonctionnelle. Elle permet la gestion des machines, leur configuration, la visualisation de
|
||||||
|
la charge (processeur, mémoire, réseau) par machine ou globale. Une console (qui nécessite le
|
||||||
|
support de JAVA dans le navigateur Web) peut être démarrée pour prendre le contrôle d'une machine.
|
||||||
|
Proxmox est sous licence AGPL et une société propose un support pour une souscription annuelle
|
||||||
|
raisonnable. Je ne l'ai pas expérimenté mais il est possible de mettre en cluster plusieurs instances
|
||||||
|
de Proxmox ce qui apporte la possibilité de migrer facilement des machines virtuelle ou des containers
|
||||||
|
d'une instance Proxmox vers une autre.
|
@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Bilan de l'hébergement
|
||||||
|
category: Hébergement
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
C'est fait ! j'ai lâché l'auto-hébergement pour un hébergement chez OVH avec
|
||||||
|
l'offre VPS (Virtual Private Server) de base<!-- more -->, un container OpenVz dédié,
|
||||||
|
hébergé à Roubaix sur lequel j'ai choisi d'installer Debian Wheezy. Je gagne de
|
||||||
|
la bande passante et une bonne qualité de service. L'objectif reste le même,
|
||||||
|
avoir un serveur dédié à bidouiller qui me fournit quelques services :
|
||||||
|
|
||||||
|
- l'hébergement de ce blog,
|
||||||
|
- une instance de Shaarli pour les favoris [merci SEB Sauvage](http://sebsauvage.net/wiki/doku.php?id=php:shaarli),
|
||||||
|
- un lecteur de flux RSS : [Tiny Tiny RSS](http://tt-rss.org)
|
||||||
|
|
||||||
|
C'est le minimum vital que j'ai réinstallé depuis la migration de mon ancien
|
||||||
|
serveur auto-hébergé. J'ai encore beaucoup à faire pour automatiser certaines
|
||||||
|
tâches d'administration, puis pour étoffer les services : faire mon évaluation
|
||||||
|
annuelle de OwnCloud par exemple.
|
||||||
|
|
||||||
|
Au niveau budget je suis en dessous des 100 euros par an : 72 euros pour la
|
||||||
|
location du VPS, 14 euros pour le domaine et les boites email chez Gandi et 12
|
||||||
|
euros pour la location du modeste serveur Minecraft chez Nitroserv. Soit un
|
||||||
|
budget de **8 euros par mois**.
|
||||||
|
|
||||||
|
C'est une passion qui reste raisonnable :-)
|
||||||
|
|
||||||
|
Au niveau des distributions GNU/Linux, j'ai stabilisé mes usages :
|
||||||
|
|
||||||
|
- ArchLinux, ma distrib de coeur à la maison pour sa fraîcheur de paquets, sa
|
||||||
|
logithèque énorme, sa stabilité qui peut en remontrer à beaucoup d'autres
|
||||||
|
distributions classiques (qui ne fonctionnent pas en mode *rolling-release*),
|
||||||
|
- Debian (parfois CentOS) sur les serveurs personnels et professionnels que je
|
||||||
|
suis amené à installer,
|
||||||
|
- Fedora sur mon poste professionnel, la distribution *incubateur* de RedHat :
|
||||||
|
une bonne distribution, pas trop mouvante pour un poste de développement
|
||||||
|
|
@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Mes extensions Firefox
|
||||||
|
category: Mozilla
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Malgré quelques tests de la concurrence, je reste fidèle à Firefox depuis la
|
||||||
|
version 0.5. Il y a eu des hauts et des bas<!-- more -->, je pense notamment à l'époque où
|
||||||
|
sa consommation mémoire était excessive. Aujourd'hui, c'est, pour moi, le
|
||||||
|
meilleur navigateur avec une feuille de route claire pour assoir et préserver
|
||||||
|
les standards ouverts du Web.
|
||||||
|
|
||||||
|
**Recherche**
|
||||||
|
|
||||||
|
- [Add to Search
|
||||||
|
Bar](https://addons.mozilla.org/en-US/firefox/addon/add-to-search-bar) :
|
||||||
|
ajouter facilement le formulaire de recherche d'un site aux moteurs de
|
||||||
|
recherche.
|
||||||
|
- [Quick Search
|
||||||
|
Bar](https://addons.mozilla.org/en-us/firefox/addon/quicksearch) : présenter
|
||||||
|
la barre de recherche sous forme de liste d'icônes pour changer facilement de
|
||||||
|
moteur.
|
||||||
|
|
||||||
|
**Lecture**
|
||||||
|
|
||||||
|
- [Reader](https://addons.mozilla.org/en-US/firefox/addon/reader) : formater la
|
||||||
|
page en cours pour la lecture avec une visibilité optimale.
|
||||||
|
|
||||||
|
**Protection de la vie privée**
|
||||||
|
|
||||||
|
- [Ghostery](https://addons.mozilla.org/en-US/firefox/addon/ghostery) : bloquer
|
||||||
|
les mouchards Web.
|
||||||
|
- [HTTPS Everywhere](https://www.eff.org/https-everywhere) : forcer
|
||||||
|
l'utilisation de HTTPS au lieu de HTTP.
|
||||||
|
- [ProfilePassword](https://freeshell.de/~kaosmos/profilepassword-en.html) : protéger l'accès au profile par un mot de passe au lancement de Firefox.
|
||||||
|
Utile en environnement professionnel où son navigateur est synchronisé avec son Firefox personnel.
|
||||||
|
- [Self-Destructing Cookies](https://addons.mozilla.org/en-US/firefox/addon/self-destructing-cookies) : suppression des cookies à la fermeture des onglets.
|
||||||
|
|
||||||
|
**Développement Web**
|
||||||
|
|
||||||
|
- [FireBreak](https://addons.mozilla.org/en-US/firefox/addon/firebreak) :
|
||||||
|
tester les *responsive design* avec différentes résolutions.
|
||||||
|
- [More Display Resolutions](https://addons.mozilla.org/ja/firefox/addon/more-display-resolutions) : idem que le précédent.
|
||||||
|
- [FireBug](https://getfirebug.com) : l'outil de référence pour le
|
||||||
|
développement Web, débogueur JavaScript, inspecteur CSS / HTML.
|
||||||
|
- [YSlow](https://addons.mozilla.org/en-US/firefox/addon/yslow) : un plugin pour FireBug orienté analyse de performance des pages Web.
|
||||||
|
- [View Dependencies](https://addons.mozilla.org/en-US/firefox/addon/view-dependencies) : ajout d'un onglet aux propriétés d'un site Web pour lister les dépendances
|
||||||
|
CSS / JS de la page.
|
||||||
|
- [Dust-me selectors](https://addons.mozilla.org/en-US/firefox/addon/dust-me-selectors) : analyse des sélecteurs CSS utilisés sur la page.
|
@ -0,0 +1,199 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Installation de Horde Groupware
|
||||||
|
categories: Hébergement Mobilité Debian
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Je remets en place progressivement les outils nécessaires sur mon serveur
|
||||||
|
Debian. Je me suis posé à nouveau la problématique de la synchronisation des
|
||||||
|
contacts et du calendrier entre mes appareils,<!-- more --> c'est à dire mon ordinateur
|
||||||
|
portable sous ArchLinux avec le logiciel de courrier *Thunderbird* et son
|
||||||
|
module de gestion de calendrier *Lightning*, mon antique téléphone BlackBerry
|
||||||
|
Bold 9780. Un accès Web à mon calendrier et mes contacts depuis n'importe
|
||||||
|
quelle machine quand je suis en déplacement serait un plus.
|
||||||
|
|
||||||
|
Le téléphone supporte la synchronisation Google de facto et SyncML en
|
||||||
|
installant le client [Funambol](http://www.funambol.com). Je n'ai trouvé aucune
|
||||||
|
possibilité gratuite pour faire de la synchronisation CardDAV, CalDAV ou
|
||||||
|
ActiveSync. SyncML reste ma meilleure option. On peut installer le client
|
||||||
|
Funambol du BlackBerry Store mais il fait plus que nécessaire car il
|
||||||
|
s'interface avec le serveur Funambol ou bien on peut installer une version plus
|
||||||
|
ancienne qui suffit pour la synchro des contacts, du calendrier et des tâches
|
||||||
|
depuis [ce lien](http://www.memotoo.com/how-to-sync-your-blackberry-phone.php).
|
||||||
|
Côté ordinateur, Lightning supporte nativement le protocole CalDav et le carnet
|
||||||
|
d'adresse peut être synchronisé avec CardDAV en installant le [module
|
||||||
|
complémentaire pour Sogo](http://www.sogo.nu/english/downloads/frontends.html).
|
||||||
|
|
||||||
|
<img src="/images/2014/logo-horde.jpg" style="float:left; margin: 0px 20px;"/>A
|
||||||
|
l'époque de mon Motorola Droid, j'avais déjà utilisé le client Funambol pour
|
||||||
|
synchroniser mes données avec
|
||||||
|
[eGroupware](http://www.egroupware.org/community_edition) et je m'étais
|
||||||
|
intéressé à *Horde*. Ce dernier semblait plus difficile à installer,
|
||||||
|
l'interface Web était peu conviviale et j'avais mis en place eGroupware que
|
||||||
|
j'avais utilisé 1 an avec satisfaction. J'ai su qu'une version 5 de Horde était
|
||||||
|
sortie dans l'année et j'ai décidé de l'évaluer. Horde supporte SyncML,
|
||||||
|
CardDAV, CalDav et son interface graphique a été rajeunie.
|
||||||
|
|
||||||
|
Ma cible de déploiement est mon serveur privé virtuel avec
|
||||||
|
l'environnement technique suivant :
|
||||||
|
|
||||||
|
- Distribution Debian Wheezy
|
||||||
|
- Serveur Web NginX
|
||||||
|
|
||||||
|
L'installation est plus complexe que la moyenne mais avec un bon tuto on s'en
|
||||||
|
sort. Horde est modulaire : un Framework et des applications. Moi j'ai besoin
|
||||||
|
de Kronolith (la gestion du calendrier) et de Turba (la gestion des contacts).
|
||||||
|
J'ai décliné l'installation par le système de paquets car généralement cela
|
||||||
|
tire le serveur Apache alors que j'utilise NginX et j'ai opté pour PEAR,
|
||||||
|
l'outil d'installation PHP que ne connaissais pas. De ma compréhension, c'est
|
||||||
|
l'équivalent de CPAN pour PERL ou d'APT pour Debian. Horde publie ses
|
||||||
|
composants pour l'infrastructure PEAR [sur ce serveur](http://pear.horde.org).
|
||||||
|
|
||||||
|
L'installation de PEAR sur Debian est galette.
|
||||||
|
|
||||||
|
apt-get install php-pear
|
||||||
|
|
||||||
|
Puis, on enregistre le canal Horde sur Pear et on installe les composants
|
||||||
|
nécessaires :
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
mkdir -p /var/www/horde
|
||||||
|
cd /var/www/horde
|
||||||
|
pear channel-discover pear.horde.org
|
||||||
|
pear install horde/horde_role
|
||||||
|
pear run-scripts horde/horde_role
|
||||||
|
pear install -a -B horde/horde
|
||||||
|
pear install horde/turba
|
||||||
|
pear install horde/kronolith
|
||||||
|
pear install horde/mnemo
|
||||||
|
pear install horde/Horde_SyncMl
|
||||||
|
```
|
||||||
|
|
||||||
|
Dans le cas de NginX sur Debian, il faut ajuster les permissions du répertoire.
|
||||||
|
|
||||||
|
chown -R www-data:www-data /var/www/horde
|
||||||
|
|
||||||
|
Et il faut créer les fichiers de configuration de chaque application à partir
|
||||||
|
des modèles fournis :
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
cd /var/www/horde/config
|
||||||
|
for f in *.dist; do cp $f `basename $f .dist`; done
|
||||||
|
cd /var/www/horde/kronolith/config
|
||||||
|
for f in *.dist; do cp $f `basename $f .dist`; done
|
||||||
|
cd /var/www/horde/turba/config
|
||||||
|
for f in *.dist; do cp $f `basename $f .dist`; done
|
||||||
|
cd /var/www/horde/nag/config
|
||||||
|
for f in *.dist; do cp $f `basename $f .dist`; done
|
||||||
|
cd /var/www/horde/mnemo/config
|
||||||
|
for f in *.dist; do cp $f `basename $f .dist`; done
|
||||||
|
```
|
||||||
|
|
||||||
|
Il reste à configurer NginX. Je force l'utilisation de HTTPS en redirigeant les
|
||||||
|
requêtes HTTP vers la version sécurisée du site.
|
||||||
|
|
||||||
|
``` nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name groupware.exemple.fr;
|
||||||
|
rewrite ^ https://$server_name$request_uri? permanent;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name groupware.exemple.fr;
|
||||||
|
root /var/www/horde;
|
||||||
|
index index.php;
|
||||||
|
|
||||||
|
ssl_certificate /etc/ssl/exemple.fr.cert;
|
||||||
|
ssl_certificate_key /etc/ssl/exemple.fr.key;
|
||||||
|
|
||||||
|
access_log /var/log/nginx/horde-access.log;
|
||||||
|
error_log /var/log/nginx/horde-error.log;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /rampage.php?$args;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php {
|
||||||
|
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||||
|
fastcgi_param PATH_INFO $fastcgi_path_info;
|
||||||
|
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
|
||||||
|
fastcgi_param PHP_VALUE "cgi.fix_pathinfo=1";
|
||||||
|
fastcgi_pass unix:/var/run/php5-fpm.sock;
|
||||||
|
fastcgi_index index.php;
|
||||||
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
include fastcgi_params;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Horde propose le choix entre plusieurs bases de données J'utilise déjà MySQL,
|
||||||
|
j'ai donc créé une nouvelle base pour Horde en utilisant les outils
|
||||||
|
en ligne de commande de MySQL.
|
||||||
|
|
||||||
|
mysql -u root -p
|
||||||
|
mysql> CREATE DATABASE horde;
|
||||||
|
mysql> GRANT ALL ON horde.* TO horde@localhost IDENTIFIED BY 'horde';
|
||||||
|
mysql> FLUSH PRIVILEGES;
|
||||||
|
mysql> EXIT;
|
||||||
|
|
||||||
|
A la première connexion Web, il n'y a pas d'authentification, on est connecté
|
||||||
|
en tant qu'administrateur sans mot de passe.
|
||||||
|
|
||||||
|
#### 1ère étape : définir la base de donnée.
|
||||||
|
|
||||||
|
1. Aller dans le menu Administration / Configuration
|
||||||
|
|
||||||
|
<img src="/images/2014/horde-config.png"/>
|
||||||
|
|
||||||
|
2. Cliquer sur le composant Horde (horde)
|
||||||
|
|
||||||
|
<img src="/images/2014/horde-application.png"/>
|
||||||
|
|
||||||
|
3. Configurer la base de donnée dans l'onglet Database
|
||||||
|
|
||||||
|
<img src="/images/2014/horde-database.png"/>
|
||||||
|
|
||||||
|
#### 2ème étape : créer un utilisateur avec les droits d'administration.
|
||||||
|
|
||||||
|
1. Aller dans le menu Administration / Utilisateur
|
||||||
|
|
||||||
|
<img src="/images/2014/horde-user.png"/>
|
||||||
|
|
||||||
|
2. Créer un nouvel utilisateur
|
||||||
|
|
||||||
|
<img src="/images/2014/horde-adduser.png"/>
|
||||||
|
|
||||||
|
3. Retourner dans le menu Administration / Configuration et rajouter
|
||||||
|
l'utilisateur nouvellement créé dans les admins de l'onglet
|
||||||
|
Authentification.
|
||||||
|
|
||||||
|
<img src="/images/2014/horde-setadmin.png"/>
|
||||||
|
|
||||||
|
4. Il est conseillé de tester le nouvel utilisateur en se déconnectant et en se
|
||||||
|
reconnectant. Si cela fonctionne, on peut enlever l'utilisateur
|
||||||
|
Administrator de la liste des admins.
|
||||||
|
|
||||||
|
#### 3ème étape : finaliser l'installation des applications
|
||||||
|
|
||||||
|
Dans le menu Administration / Configuration, tous les composants installés
|
||||||
|
apparaîssent. Les boutons *mettre à jour toutes les configurations* et *mettre
|
||||||
|
à jour les schémas de la base* doivent être cliqués pour finaliser l'installation.
|
||||||
|
|
||||||
|
#### Conclusion
|
||||||
|
|
||||||
|
L'URL CalDAV pour s'inscrire au calendrier se trouve dans les propriétés du
|
||||||
|
calendrier de l'application Agenda, dans l'onglet *inscription*. De manière
|
||||||
|
similaire, l'URL CardDAV se trouve dans les propriétés du carnet d'adresses.
|
||||||
|
Quant à l'URL SyncML, c'est un point d'entrée unique pour la synchronisation de
|
||||||
|
toutes les applications ; dans notre exemple ce serait
|
||||||
|
http://groupware.exemple.fr/rpc.php.
|
||||||
|
|
||||||
|
J'ai mis en place Horde depuis 1 semaine avec une synchronisation SyncML par
|
||||||
|
Funambol sur mon téléphone et une synchronisation CardDAV et CalDAV depuis
|
||||||
|
Thunderbird. J'ai lu que SyncML n'était pas très bon pour gérer les conflits de
|
||||||
|
synchronisation mais je n'ai pas rencontré de souci. L'évaluation se passe très
|
||||||
|
bien pour l'instant.
|
@ -0,0 +1,85 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: SMTP Relay avec qmail sur Debian Wheezy
|
||||||
|
category: Debian
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
J'ai cherché une alternative plus simple qu'Exim et Postfix pour que mes
|
||||||
|
serveurs Debian puissent envoyer des emails d'alerte.<!-- more --> C'est une fonctionnalité
|
||||||
|
utile si on installe fail2ban ou logwatch. Je n'ai pas besoin de gérer des
|
||||||
|
utilisateurs ou de recevoir des emails, juste d'en envoyer en utilisant le
|
||||||
|
serveur SMTP du FAI comme relais. J'ai trouvé
|
||||||
|
[**qmail**](http://en.wikipedia.org/wiki/Qmail) en faisant quelques recherches,
|
||||||
|
un antique MTA dont la dernière version stable 1.0.3 date de 1998 (gasp !) mais
|
||||||
|
qui est toujours disponible dans les dépôts Debian.
|
||||||
|
|
||||||
|
Avant de lancer l'installation, il faut s'assurer que le hostname du serveur
|
||||||
|
est un FQDN, c'est à dire un nom DNS complet. Si ce n'est pas le cas, qmail
|
||||||
|
refuse de s'installer. Si le serveur n'a pas de nom DNS, on peut mettre
|
||||||
|
n'importe quel domaine, ça ne gêne dans la configuration que nous allons mettre
|
||||||
|
en place. On peut modifier le hostname de manière persistente en deux étapes :
|
||||||
|
|
||||||
|
1. éditer le fichier /etc/hostname
|
||||||
|
2. forcer sa mise à jour avec la commande /etc/init.d/hostname.sh
|
||||||
|
|
||||||
|
L'installation de qmail désinstalle Postfix ou Exim4 car un seul MTA peut
|
||||||
|
s'approprier le port 25.
|
||||||
|
|
||||||
|
apt-get install qmail qmail-run
|
||||||
|
|
||||||
|
Il s'agit d'un service local, on ne veut surtout pas ouvrir le port 25 sur
|
||||||
|
Internet. On peut forcer qmail à n'écouter que sur l'interface loopback en
|
||||||
|
modifiant le script de démarrage. Ce n'est pas l'idéal mais vu la fréquence de
|
||||||
|
mise à jour de qmail, on ne craint pas trop de voir cette modification écrasée.
|
||||||
|
Il faut remplacer *0* par *127.0.0.1* dans le fichier
|
||||||
|
**/etc/qmail/qmail-smtpd/run**.
|
||||||
|
|
||||||
|
Voici la version modifiée :
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
QMAILDUID=`id -u qmaild`
|
||||||
|
NOFILESGID=`id -g qmaild`
|
||||||
|
MAXSMTPD=`cat /var/lib/qmail/control/concurrencyincoming`
|
||||||
|
LOCAL=`head -1 /var/lib/qmail/control/me`
|
||||||
|
|
||||||
|
if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then
|
||||||
|
echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
|
||||||
|
echo /var/qmail/supervise/qmail-smtpd/run
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f /var/lib/qmail/control/rcpthosts ]; then
|
||||||
|
echo "No /var/lib/qmail/control/rcpthosts!"
|
||||||
|
echo "Refusing to start SMTP listener because it'll create an open relay"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec softlimit -m 7000000 \
|
||||||
|
tcpserver -v -R -l "$LOCAL" -x /etc/qmail/tcp.smtp.cdb -c "$MAXSMTPD" \
|
||||||
|
-u "$QMAILDUID" -g "$NOFILESGID" 127.0.0.1 smtp qmail-smtpd 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
On modifie la configuration pour envoyer des emails en utilisant le serveur
|
||||||
|
SMTP Orange en tant que root@orange.fr si on est l'utilisateur root. On
|
||||||
|
remplace le contenu du fichier **/etc/qmail/defaulthost** avec ceci :
|
||||||
|
|
||||||
|
orange.fr
|
||||||
|
|
||||||
|
On supprime le contenu du fichier **/etc/qmail/defaultdomain** et on configure
|
||||||
|
le relais dans le fichier **/etc/qmail/smtproutes** :
|
||||||
|
|
||||||
|
smtp.orange.fr <utilisateur> <mot de passe>
|
||||||
|
|
||||||
|
Pour tester on relance qmail :
|
||||||
|
|
||||||
|
qmailctl stop
|
||||||
|
qmailctl start
|
||||||
|
|
||||||
|
Et on tente l'envoi d'un email avec la commande mail :
|
||||||
|
|
||||||
|
mail -s "Hello" someone@somewhere.fr
|
||||||
|
Ceci est un test
|
||||||
|
^D
|
||||||
|
|
||||||
|
Le fichier de log **/var/log/qmail/current** permet de vérifier l'état de l'envoi.
|
@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Gnome 3, attendez moi les jeunes !
|
||||||
|
category: GNU/Linux
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Ma dernière tentative d'utiliser Gnome en environnement professionnel date de
|
||||||
|
[fin 2011](gnome-3-pour-un-usage-professionnel.html). Le changement avait été
|
||||||
|
trop brutal et déclenché [mon passage à XFCE](quelle-distribution-gnome-2
|
||||||
|
-choisir-en-2012.html)<!-- more --> où je suis resté depuis, que ce soit sous Arch à la
|
||||||
|
maison ou au bureau sous Fedora. En 2 ans, les développeurs de Gnome ont
|
||||||
|
sacrément amélioré leur bijou :
|
||||||
|
|
||||||
|
- meilleures performances, cohésion de l'interface, raffinements
|
||||||
|
- ergonomiques et esthétiques à tous les étages, ouverture grâce aux
|
||||||
|
- extensions pour rajouter les fonctionnalités manquantes (ou écartées).
|
||||||
|
|
||||||
|
Par curiosité, j'ai testé quelques jours la version 3.12 à la
|
||||||
|
maison sous Arch en mixant les usages et j'ai réalisé que je m'y faisais très
|
||||||
|
bien. L'absence de barre de tâches ne me choque plus et je m'en sors même dans
|
||||||
|
des usages *professionnels* avec beaucoup d'application ouvertes. Alors qu'est
|
||||||
|
-ce qui a changé ? Certes l'interface est cohérente et agréable, la recherche
|
||||||
|
d'applications est plus rapide qu'à l'époque, on configure sans problème
|
||||||
|
l'utilisation multi-moniteur, c'est plus stable ... Cool mais rien de vraiment
|
||||||
|
déterminant ! En fait, ce qui a réellement changé c'est que *le vieil
|
||||||
|
utilisateur* que je suis a enfin digéré la rupture Gnome 2 / Gnome 3 et sauté
|
||||||
|
le pas vers cette nouvelle interface. Il est possible que la confrontation aux
|
||||||
|
interfaces pour mobile (Android, BB 10) ait accéléré l'acceptation d'un
|
||||||
|
nouveau type d'interface sur le bureau.
|
||||||
|
|
||||||
|
J'ai aussi basculé ma Fedora XFCE Spin vers Gnome au bureau et les quelques
|
||||||
|
jours d'utilisation sont positifs. Mon image d'utilisateur Linux avec une
|
||||||
|
interface archaïque et des terminaux plein les écrans s'écorne... J'ai
|
||||||
|
toujours des terminaux mais avec une interface moderne et sexy à faire saliver
|
||||||
|
les utilisateurs de Windows 7 et tousser ceux de Windows 8
|
||||||
|
(**troll inside**).
|
||||||
|
|
||||||
|
Plus sérieusement, comme d'autres j'ai douté de la
|
||||||
|
révolution Gnome en 2011 et c'est un beau projet que je retrouve 2 ans après.
|
||||||
|
Je ne renie pas XFCE, idéal pour les configurations plus légères que je suis
|
||||||
|
amené à installer mais je suis **enfin reconcilié** avec Gnome.
|
||||||
|
|
@ -0,0 +1,208 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Supervisor, gestion de processus
|
||||||
|
category: GNU/Linux
|
||||||
|
tag: planet
|
||||||
|
excerpt: "Quand il s'agit de déployer des programmes de son cru sur un serveur
|
||||||
|
GNU/Linux, on réalise généralement deux actions : l'écriture d'un script de démarrage et arrêt du programme, la *démon-isation* du programme"
|
||||||
|
---
|
||||||
|
|
||||||
|
Quand il s'agit de déployer des programmes de son cru sur un serveur
|
||||||
|
GNU/Linux, on réalise généralement deux actions :
|
||||||
|
|
||||||
|
- l'écriture d'un script de démarrage et arrêt du programme
|
||||||
|
- la *démon-isation* du programme
|
||||||
|
|
||||||
|
Le premier point n'est pas complexe mais il peut être contraignant. Si on
|
||||||
|
envisage de déployer sur Debian, Ubuntu et Fedora, il faut prévoir trois
|
||||||
|
scripts différents : un pour les scripts à la saucce Sys V, un pour Upstart
|
||||||
|
et un autre pour systemd. L'avantage c'est qu'on peut gérer finement les
|
||||||
|
dépendances à d'autres services.
|
||||||
|
|
||||||
|
Le second point consiste à veiller à ne pas bloquer le script d'init en
|
||||||
|
lançant le programme. On peut le gérer dans le code de notre programme en
|
||||||
|
prévoyant deux modes de lancement de notre programme : *daemon* et
|
||||||
|
interactif. Python, par exemple, propose [la librairie
|
||||||
|
daemonize](https://pypi.python.org/pypi/daemonize) pour réaliser cela. JAVA
|
||||||
|
propose des outils comme JAVA Service Wrapper pour gérer le lancement et
|
||||||
|
garantir l'arrêt du processus. On peut aussi le gérer de manière externe au
|
||||||
|
code, de manière rustique avec un
|
||||||
|
[nohup](https://en.wikipedia.org/wiki/Nohup), auquel cas il faut gérer
|
||||||
|
l'arrêt fiable du processus en manipulant son PID.
|
||||||
|
|
||||||
|
Voici un exemple de script d'init à la sauce Debian pour un programme
|
||||||
|
JAVA :
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: monprog
|
||||||
|
# Required-Start: $local_fs $remote_fs $network $syslog
|
||||||
|
# Required-Stop: $local_fs $remote_fs $network $syslog
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# X-Interactive: true
|
||||||
|
# Short-Description: Start/stop monprog
|
||||||
|
### END INIT INFO
|
||||||
|
BOOT_LOG=/var/log/monprog-boot.log
|
||||||
|
PID_FILE=/opt/monprog/pid
|
||||||
|
start_java () {
|
||||||
|
nohup java -cp "/opt/monprog/lib/*" fr.yax.monprog.Main >$BOOT_LOG 2>&1 &
|
||||||
|
echo $! > $PID_FILE
|
||||||
|
echo "Monprog started ..."
|
||||||
|
}
|
||||||
|
do_start () {
|
||||||
|
echo "Starting Monprog ..."
|
||||||
|
if [ ! -f $PID_FILE ]; then
|
||||||
|
start_java
|
||||||
|
else
|
||||||
|
PID=$(cat $PID_FILE)
|
||||||
|
if [ -d /proc/$PID ]; then
|
||||||
|
echo "Monprog is already running ..."
|
||||||
|
else
|
||||||
|
start_java
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
do_stop() {
|
||||||
|
echo "Stopping Monprog ..."
|
||||||
|
if [ -f $PID_FILE ]; then
|
||||||
|
PID =$(cat $PID_FILE);
|
||||||
|
kill $PID 2>/dev/null
|
||||||
|
echo "Monprog stopped ..."
|
||||||
|
rm -f $PID_FILE
|
||||||
|
else
|
||||||
|
echo "Monprog seems not running ..."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
case $1 in
|
||||||
|
start)
|
||||||
|
do_start
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
do_stop
|
||||||
|
;;
|
||||||
|
restart)
|
||||||
|
do_stop
|
||||||
|
sleep 1
|
||||||
|
do_start
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
|
||||||
|
C'est perfectible. Il faudrait tenter l'arrêt avec un signal moins violent
|
||||||
|
que SIGKILL de façon à l'intercepter dans le code et faire un arrêt propre.
|
||||||
|
Si cette méthode ne fonctionne pas au bout de plusieurs secondes, le script d'init pourrait alors opter pour un arrêt radical.
|
||||||
|
|
||||||
|
Cette méthode fonctionne bien mais elle nécessite une connaissance système
|
||||||
|
pour écrire et maintenir les scripts en fonction des déploiements cible. Si
|
||||||
|
on veut donner la possibilité à un utilisateur standard (non *root*) de
|
||||||
|
démarrer ou arrêter un programme, il faut aussi maîtriser un peu la gestion
|
||||||
|
des droits UNIX (avec sudo par exemple).
|
||||||
|
|
||||||
|
Une alternative simple pour la plupart des systèmes UNIX (GNU/Linux, FreeBSD,
|
||||||
|
Solaris et Mac OS X) est le [programme Supervisor](http://supervisord.org).
|
||||||
|
C'est écrit en Python (comme la plupart des programmes de qualité ! **Troll
|
||||||
|
inside** ) et de même que MongoDB permet au développeur de reprendre la main
|
||||||
|
au DBA sur l'administration de base de donnée, Supervisor permet au
|
||||||
|
développeur de reprendre un peu la main à l'admin sys sur le déploiement de
|
||||||
|
ses applications.
|
||||||
|
|
||||||
|
Supervisor est fourni sur la plupart des distributions. On peut l'installer
|
||||||
|
avec le système de paquet de sa distribution ou bien opter pour une
|
||||||
|
installation à partir de PIP, l'installeur de programmes Python. Ce dernier
|
||||||
|
permet d'obtenir la version la plus récente de Supervisor.
|
||||||
|
|
||||||
|
Supervisor est composé de deux parties :
|
||||||
|
|
||||||
|
- un service **Supervisord**
|
||||||
|
- un client en mode console : **Supervisorctl**
|
||||||
|
|
||||||
|
Le client permet d'interagir avec les programmes gérés : démarrer, stopper.
|
||||||
|
Une interface RPC permet aussi de piloter Supervisord programmatiquement ; je
|
||||||
|
n'ai pas encore testé cet aspect.
|
||||||
|
|
||||||
|
La configuration principale est dans un fichier supervisord.conf qui décrit la
|
||||||
|
connexion du client supervisorctl (section unix_http_server), la config RPC
|
||||||
|
(section rpcinterface) et le répertoire des configuration des programmes à
|
||||||
|
gérer (section includes).
|
||||||
|
|
||||||
|
Voici une configuration type :
|
||||||
|
|
||||||
|
#### /etc/supervisor/supervisord.conf
|
||||||
|
|
||||||
|
[unix_http_server]
|
||||||
|
file=/var/run//supervisor.sock ; (the path to the socket file)
|
||||||
|
chmod=0770 ; sockef file mode (default 0700)
|
||||||
|
chown=root:supervisor
|
||||||
|
|
||||||
|
[supervisord]
|
||||||
|
logfile=/var/log/supervisor/supervisord.log
|
||||||
|
pidfile=/var/run/supervisord.pid
|
||||||
|
childlogdir=/var/log/supervisor
|
||||||
|
|
||||||
|
[rpcinterface:supervisor]
|
||||||
|
supervisor.rpcinterface_factory = supervisorrpcinterface:make_main_rpcinterface
|
||||||
|
|
||||||
|
[supervisorctl]
|
||||||
|
serverurl=unix:///var/run//supervisor.sock
|
||||||
|
|
||||||
|
[include]
|
||||||
|
files = /etc/supervisor/conf.d/*.conf
|
||||||
|
|
||||||
|
Les droits sur la socket UNIX sont important. En donnant l'accès à ROOT et au
|
||||||
|
groupe supervisor, on peut facilement donner l'accès à supervisorctl en
|
||||||
|
ajoutant un utilisateur dans le groupe supervisor. Attention donner l'accès à
|
||||||
|
supervisorctl c'est donner le droit de stopper n'importe quel programme géré
|
||||||
|
par supervisor. C'est un privilège important.
|
||||||
|
|
||||||
|
Le reste de la configuration consiste à créer des configurations
|
||||||
|
additionnelles décrivant des programmes à lancer simplement :
|
||||||
|
|
||||||
|
- par défaut un programme démarre en même temps que le service donc au
|
||||||
|
démarrage du serveur. C'est configurable.
|
||||||
|
- on peut définir si un programme doit être relancé automatiquement et définir sous quelle condition, par exemple en fonction du code de sortie du programme.
|
||||||
|
- on peut opter pour l'envoi d'un signal au programme afin de demander au programme de s'arrêter proprement plutôt que de forcer un arrêt brutal.
|
||||||
|
- on peut regrouper des programmes pour manipuler des
|
||||||
|
groupes, faire des démarrages groupés et des arrêts groupés. C'est utile si on a beaucoup de programmes.
|
||||||
|
- au sein d'un groupe on peut définir des
|
||||||
|
priorités pour ordonner le lancement des programmes du groupe.
|
||||||
|
|
||||||
|
Voici un exemple qui définit un groupe mesprogrammes composé de 2 programmes correspondant au même binaire.
|
||||||
|
|
||||||
|
#### /etc/supervisor/conf.d/mesprogrammes.conf
|
||||||
|
|
||||||
|
[group:mesprogrammes]
|
||||||
|
programs=monprog1,monprog2
|
||||||
|
|
||||||
|
[program:monprog1]
|
||||||
|
directory=/opt/monprogram
|
||||||
|
command=/usr/bin/java -DrunDir=/opt/monprog -cp "lib/*" fr.yax.monprog.Main --port 1234
|
||||||
|
stopsignal=INT
|
||||||
|
priority=500
|
||||||
|
|
||||||
|
[program:monprog2]
|
||||||
|
directory=/opt/monprogram
|
||||||
|
command=/usr/bin/java -DrunDir=/opt/monprog -cp "lib/*" fr.yax.monprog.Main --port 1235
|
||||||
|
stopsignal=INT
|
||||||
|
priority=501
|
||||||
|
|
||||||
|
Dans cet exemple, on envoie un signal SIGINT à monprog pour lui demander un arrêt propre. Voici un snippet de code JAVA pour intercepter le signal :
|
||||||
|
|
||||||
|
#### Interception d'un signal SIGINT en JAVA
|
||||||
|
|
||||||
|
``` java
|
||||||
|
// register a shutdown hook
|
||||||
|
Runtime.getRuntime().addShutdownHook(new Thread() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
logger.info("Shutting down has been requested");
|
||||||
|
stopCleanly();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
En conclusion, **Supervisor** est un bon outil de gestion de programmes :
|
||||||
|
fiable, facile à installer et à configurer. En complément d'un outil de
|
||||||
|
déploiement comme [Fabric](http://www.fabfile.org) un développeur peut
|
||||||
|
facilement automatiser le déploiement de son programme sur une ou plusieurs
|
||||||
|
machines cibles.
|
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: En vacances
|
||||||
|
category: Humeur
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Bon, il ne faut pas se mentir, la saison chaude en Provence ça ne booste pas la
|
||||||
|
productivité.<!-- more --> On assure l'essentiel mais l'activité de blogging en a fait les
|
||||||
|
frais. C'est une demi excuse. L'autre moitié de l'excuse c'est que j'ai
|
||||||
|
*mollement* codé ces dernières semaines un petit projet de gestion des
|
||||||
|
commentaires d'un blog statique, un projet qui me tient à coeur depuis plus
|
||||||
|
d'un an. C'est un petit projet mais j'ai pris le temps de la réflexion et
|
||||||
|
savouré le codage dans mon [langage fétiche](https://www.python.org). Je
|
||||||
|
termine la documentation pour pouvoir le publier décemment sous GitHub et je
|
||||||
|
consacrerais bientôt un article dessus.
|
||||||
|
|
||||||
|
Pour me relaxer, j'ai travaillé un peu la cosmétique du site :
|
||||||
|
|
||||||
|
- mise à jour de [Pelican](http://docs.getpelican.com/en/3.4.0) en version 3.4
|
||||||
|
- mise à jour des librairies CSS: [Pure](http://purecss.io) en version 0.5.0, [Font Awesome](http://fortawesome.github.io/Font-Awesome) en version 4.1.0
|
||||||
|
- *subtiles retouches* de quelques détails visuels
|
||||||
|
|
||||||
|
Bon été à tous
|
||||||
|
|
||||||
|
<img src="/images/2014/apero.jpg"/>
|
@ -0,0 +1,133 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Pecosys, les commentaires avec Pelican
|
||||||
|
categories: Hébergement Blog
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Pecosys est le projet évoqué dans mon dernier billet pour gérer des
|
||||||
|
commentaires avec un blog statique<!-- more --> créé avec
|
||||||
|
[Pelican](http://docs.getpelican.com/en/3.4.0). J'ai publié [l'ensemble des
|
||||||
|
sources sur mon GitHub](https://github.com/kianby/pecosys) sous licence GPL.
|
||||||
|
Avant d'expliquer à quoi ça sert, une présentation des types de moteurs de
|
||||||
|
blog s'impose.
|
||||||
|
|
||||||
|
#### Petite intro sur les blog statiques
|
||||||
|
|
||||||
|
Les moteurs de blog classiques comme Wordpress ou Dotclear stockent leurs
|
||||||
|
données (articles, commentaires) dans une base de données et ils utilisent une
|
||||||
|
logique côté serveur pour produire les pages HTML. Au fil des ans, ces moteurs
|
||||||
|
ont rajouté beaucoup de fonctionnalités (par l'utilisation de plugins) et on
|
||||||
|
les appelle désormais des CMS (Content Management System) car ils peuvent
|
||||||
|
servir à bâtir tout type de site Web, en facilitant le travail de publication
|
||||||
|
et de collaboration aux rédacteurs qui n'ont plus besoin d'être des gens
|
||||||
|
techniques.
|
||||||
|
|
||||||
|
PluXml est un moteur un peu à part, plus léger que les CMS cités ci-dessus,
|
||||||
|
qui n'utilise pas de base de données mais stocke les données dans des fichiers
|
||||||
|
XML. C'est un pas dans la direction des blogs statiques dans la mesure où cela
|
||||||
|
permet de mettre son blog dans un gestionnaire de sources (comme GIT) et
|
||||||
|
conserver une traçabilité des changements. Cela facilite aussi la migration du
|
||||||
|
blog.
|
||||||
|
|
||||||
|
Pelican et Jekyll sont des vrais blogs statiques. Ils n'utilisent pas de
|
||||||
|
langage serveur comme PHP ou Ruby, il ne stockent pas leurs données dans une
|
||||||
|
base de données. Les articles sont écrits dans un langage Markup comme
|
||||||
|
[Markdown](http://daringfireball.net/projects/markdown) et la construction du
|
||||||
|
site (le build) est réalisé hors ligne. Il génère les pages à base de HTML,
|
||||||
|
CSS et éventuellement un zeste de JavaScript. Ces pages sont transférées vers
|
||||||
|
le serveur HTTP hébergeant le site... et hop le site est à jour.
|
||||||
|
|
||||||
|
Alors pourquoi s'embêter à gérer un site statique alors qu'un Wordpress
|
||||||
|
s'installe en 5 minutes ?
|
||||||
|
|
||||||
|
Cela dépend de tout un chacun mais j'y suis venu pour les raisons suivantes :
|
||||||
|
|
||||||
|
- Les articles sont écrits dans un format simpliste (pour ma part c'est Markdown), la présentation est clairement séparée du contenu. C'est lors du build qu'on génère le code HTML en fonction de *templates* et de CSS personnalisés par nos soins. Le code HTML généré par Pelican est propre et léger. Le jour où j'ai migré de WordPress à PluXml, j'ai été horrifié par le code HTML de WordPress.
|
||||||
|
- Le contenu du blog est un ensemble de fichier au format texte, idéal à gérer avec un gestionnaire de sources afin de garder trace des modifications. Un gestionnaire de sources devient aussi un moyen d'automatiser la mise à jour du site. On écrit et on teste sur sa machine de dev, on publie sous GIT et il suffit que le serveur rafraîchisse sa version du site quand une modification a été effectuée.
|
||||||
|
|
||||||
|
#### La problématique des commentaires
|
||||||
|
|
||||||
|
Pas de logique serveur, juste un ensemble de pages HTML avec un peu
|
||||||
|
d'interactivité grâce à JavaScript. Comment gérer les commentaires avec un
|
||||||
|
site statique ? La solution proposée par Pelican c'est l'utilisation des
|
||||||
|
services de la société Disqus. Un peu de JavaScript embarqué au bon endroit et
|
||||||
|
vos pages sont agrémentées d'un formulaire pour poster des commentaires qui
|
||||||
|
envoie les données chez Disqus et l'affichage de la page dans le navigateur
|
||||||
|
client par l'usage de JavaScript, envoie des requêtes à Disqus pour rapatrier
|
||||||
|
les commentaires approuvées et les ajouter à la page HTML qui vient de votre
|
||||||
|
serveur.
|
||||||
|
|
||||||
|
Est-ce que vous sentez venir l'objection ?
|
||||||
|
|
||||||
|
D'abord on met en place une belle mécanique,très pure, où l'on contrôle le
|
||||||
|
contenu, l'affichage, puis on confie la partie sensible (les données
|
||||||
|
utilisateur) à une société commerciale, qui ne demande rien en retour et qui
|
||||||
|
propose sûrement un service aux petits oignons pour approuver les
|
||||||
|
commentaires... mais qui garde les données. Comment une société comme Disqus
|
||||||
|
monétise ses services ? Je ne sais pas, peu importe. Que se passe-t-il si la
|
||||||
|
société dépose le bilan ? Là j'ai la réponse. L'ensemble des commentaires est
|
||||||
|
perdu : une bonne partie de la richesse d'un blog, ce qui fait son histoire.
|
||||||
|
Dommage non ?
|
||||||
|
|
||||||
|
#### L'approche Pecosys
|
||||||
|
|
||||||
|
Pecosys est un serveur de commentaires écrit en Python que vous hébergez sur le même serveur que votre blog. Il reçoit les commentaires à approuver depuis le blog par le biais d'un formulaire sur le blog. Pour cela, les *templates* de Pelican ont été adaptés afin de rajouter ce formulaire en bas de chaque article.
|
||||||
|
|
||||||
|
Le lien entre le blog statique et le serveur Pecosys est réalisé par grâce au serveur Web. Dans le cas de NginX, il est trivial d'associer une URL à un programme Python. Dans le cas d'Apache, c'est faisable facilement en utilisant le module Proxy. Bref, le serveur Pecosys est d'abord un serveur HTTP sur lequel on poste les commentaires entrés par un formulaire classique de création de commentaires.
|
||||||
|
|
||||||
|
Quand un commentaire est reçu, le serveur va faire deux trucs : sauvegarder le commentaire et le soumettre à l'administrateur du blog.
|
||||||
|
|
||||||
|
La sauvegarde se fait grâce à GIT. Ah j'avais pas encore parlé de GIT :-) On suppose qu'on est dans une architecture centralisée où le blog est modifié depuis une machine de développeur et poussé (au sens GIT: PUSH) vers un *bare repository*. Dans mon cas, cette référence centrale des sources est sous BitBucket car ils acceptent la création de dépôts privés gratuitement et que je ne veux pas publier les adresses emails de tous ceux qui ont laissé un commentaire sur le blog. Souvenez-vous les commentaires font désormais partie des sources du blog, on verra comment plus loin.
|
||||||
|
|
||||||
|
Donc, pour résumer :
|
||||||
|
|
||||||
|
- j'écris mes articles sur ma machine de dev perso, je publie dans GIT et je pousse mes modifications au GIT centralisé de BitBucket (au sens GIT: ORIGIN).
|
||||||
|
- mon serveur vérifie périodiquement si le dépôt BitBucket a été modifié et si c'est le cas, il rapatrie les sources du blog et reconstruit le site grâce à sa mécanique Pelican installée localement.
|
||||||
|
- Pecosys a sa propre version du blog (au sens GIT: CLONE) maintenue à jour de BitBucket.
|
||||||
|
|
||||||
|
Donc quand Pecosys reçoit un nouveau commentaire, il met à jour sa version du
|
||||||
|
blog (la branche MASTER) et il crée une nouvelle branche XYZ pour ce
|
||||||
|
commentaire. il sauve ce commentaire dans les sources du blog (au format
|
||||||
|
Markdown) et il committe la branche XYZ.
|
||||||
|
|
||||||
|
Ensuite, le serveur va le communiquer à l'administrateur du blog par email.
|
||||||
|
Cela suppose qu'un email dédié est utilisé par Pecosys (pourquoi pas
|
||||||
|
blog@mydomain.com) et qu'il connaît l'email de l'administrateur du blog (vous
|
||||||
|
!). Cet email contient le commentaire et demande une réponse.
|
||||||
|
|
||||||
|
L'administrateur du blog (toujours vous) doit répondre à cet email. Une
|
||||||
|
réponse sans commentaire revient à approuver le commentaire et va lancer sa
|
||||||
|
publication. Une réponse avec un commentaire "NO" (désolé pour l'originalité)
|
||||||
|
signifie qu'on refuse le commentaire.
|
||||||
|
|
||||||
|
En fonction de cette réponse, le serveur Pecosys qui vérifie sa boite de
|
||||||
|
réception régulièrement, va traiter le commentaire :
|
||||||
|
|
||||||
|
- un refus du commentaire revient à supprimer la branche GIT XYZ
|
||||||
|
- une approbation du commentaire ramène les modifications de la branche XYZ sur la branche MASTER (au sens GIT: MERGE) et pousse les modifications sur le GIT distant (dans mon cas BitBucket)
|
||||||
|
|
||||||
|
Dans les deux cas, un email de confirmation de l'action réalisée est envoyé à
|
||||||
|
l'administrateur du blog.
|
||||||
|
|
||||||
|
A ce stade, la branche de référence BitBucket est à jour donc le serveur va
|
||||||
|
ramener ses modifications, reconstruire le site et par là même
|
||||||
|
publier le commentaire.
|
||||||
|
|
||||||
|
Si vous avez bien suivi et je sais que c'est un peu touffu et compliqué, vous
|
||||||
|
vous demandez comment les commentaires (ces fichiers en Markdown) sont générés
|
||||||
|
en HTML. Et bien, pas le biais d'un plugin Pelican nommé **CaCause**, en
|
||||||
|
hommage au projet de base initié il y a un an avec [Bruno
|
||||||
|
Adele](http://www.jesuislibre.org) et [Nahir
|
||||||
|
Mohamed](https://github.com/nadley) dont Pecosys est une reprise des idées
|
||||||
|
principales mais avec une réalisation différente par son dialogue basé sur
|
||||||
|
l'email et son utilisation *forcenée* de GIT.
|
||||||
|
|
||||||
|
Je teste Pecosys depuis deux semaines sur ce site et je suis prêt à donner un
|
||||||
|
coup de main à quiconque veut se lancer. Sur GitHub, j'ai publié les sources
|
||||||
|
du serveur mais aussi une version allégée de ce site (sans les commentaires)
|
||||||
|
qui contient donc mes *templates* avec le formulaire et les sources du plugin.
|
||||||
|
|
||||||
|
En attendant je retourne à mon farniente estival :-)
|
||||||
|
|
||||||
|
<img src="/images/2014/lemon.jpg"/>
|
@ -0,0 +1,128 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Emuler la Raspbian avec Qemu
|
||||||
|
categories: Debian Matériel Virtualisation
|
||||||
|
tag: planet
|
||||||
|
excerpt: "Je m'intéresse de plus en plus au Raspberry et je
|
||||||
|
franchirai peut-être le pas de l'achat dans quelque temps"
|
||||||
|
---
|
||||||
|
|
||||||
|
<img src="/images/2014/rasplogo.png" alt="Raspberry logo" style="margin: 0px
|
||||||
|
20px; float:left;" />Je m'intéresse de plus en plus au Raspberry et je
|
||||||
|
franchirai peut-être le pas de l'achat dans quelque temps. J'ai voulu voir à
|
||||||
|
quoi ressemble sa distribution principale Raspbian (basée sur Debian) en
|
||||||
|
l'émulant sous Qemu. Je me suis basé sur [le tutorial pointé par beaucoup de
|
||||||
|
gens dans les forums](http://xecdesign.com/qemu-emulating-raspberry-pi-the-
|
||||||
|
easy-way/) et j'ai effectué des recherches annexes pour résoudre
|
||||||
|
certains problèmes : taille des partitions, gestion de la souris sous Qemu. Ce
|
||||||
|
qui suit est le résultat de mes manipulations pour émuler Raspbian avec Qemu
|
||||||
|
depuis une distribution GNU/Linux 64 bits.
|
||||||
|
|
||||||
|
En pré-requis, on suppose que Qemu est installé sur le système hôte. On
|
||||||
|
vérifie que le processeur ARM du Raspberry est supporté par Qemu avec la
|
||||||
|
commande suivante :
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
$ qemu-system-arm -cpu ?
|
||||||
|
```
|
||||||
|
|
||||||
|
Le résultat liste les types de processeur supportés. On s'assure que **arm1176** est mentionné.
|
||||||
|
|
||||||
|
### Installation de base
|
||||||
|
|
||||||
|
On se crée un répertoire de travail dans lequel on va télécharger les fichiers nécessaires :
|
||||||
|
|
||||||
|
- le noyau Linux [depuis ce lien](http://xecdesign.com/downloads/linux-qemu/kernel-qemu)
|
||||||
|
- l'image de la Raspbian [depuis le site officiel](http://www.raspberrypi.org/downloads)
|
||||||
|
|
||||||
|
La modification d'un fichier est nécessaire pour que la distribution
|
||||||
|
fonctionne avec Qemu. On effectue donc un premier démarrage particulier avec
|
||||||
|
BASH en processus INIT pour la réaliser.
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda 2014-06-20-wheezy-raspbian.img
|
||||||
|
```
|
||||||
|
|
||||||
|
Quand Qemu a démarré BASH on modifie le fichier /etc/ld.so.preload
|
||||||
|
|
||||||
|
$ nano /etc/ld.so.preload
|
||||||
|
|
||||||
|
On commente la première ligne du fichier :
|
||||||
|
|
||||||
|
#/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so
|
||||||
|
|
||||||
|
On sauvegarde (CTRL-X avec nano) et on arrête l'émulation
|
||||||
|
|
||||||
|
exit
|
||||||
|
|
||||||
|
A ce stade, l'émulation Raspbian sous Qemu est fonctionnelle et on peut faire un vrai démarrage avec la commande :
|
||||||
|
|
||||||
|
$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2014-06-20-wheezy-raspbian.img
|
||||||
|
|
||||||
|
### Elargir la partition
|
||||||
|
|
||||||
|
Il ne reste pas beaucoup d'espace disque sur la partition root. On peut
|
||||||
|
élargir la partition, sinon on ne pourra même pas mettre à jour Raspbian avec
|
||||||
|
apt-get. Cela nécessite plusieurs étapes.
|
||||||
|
|
||||||
|
D'abord on élargit le disque avec l'utilitaire qemu-resize.
|
||||||
|
|
||||||
|
$ qemu-img resize 2014-06-20-wheezy-raspbian.img +2G
|
||||||
|
|
||||||
|
Ensuite on démarre la Raspbian avec Qemu
|
||||||
|
|
||||||
|
``` shell
|
||||||
|
$ qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2014-06-20-wheezy-raspbian.img
|
||||||
|
```
|
||||||
|
|
||||||
|
On se connecte au Raspberry avec l'utilisateur **pi** et le mot de passe
|
||||||
|
**raspberry**. Attention si on se connecte depuis la fenêtre Qemu, le clavier
|
||||||
|
est probablement configuré en QWERTY.
|
||||||
|
|
||||||
|
On lancer l'utilitaire **fdisk** pour modifier les partitions
|
||||||
|
|
||||||
|
$ fdisk /dev/sda
|
||||||
|
|
||||||
|
- supprimer la partition 2 qui commence à l'offset 122880 : commande **d** puis indiquer la partition **2**
|
||||||
|
- recréer une partition 2 qui commence à l'offset 122880 et utilise la totalité du disque : commande **n**
|
||||||
|
- sauvegarder les modifications : commande **w**
|
||||||
|
- arrêter le système avec la commande **reboot**.
|
||||||
|
|
||||||
|
On démarre à nouveau la Raspbian avec Qemu et on lance la commande resize2fs
|
||||||
|
pour élargir la partition 2 :
|
||||||
|
|
||||||
|
$ resize2fs /dev/sda2
|
||||||
|
$ reboot
|
||||||
|
|
||||||
|
### Augmenter la résolution sous X
|
||||||
|
|
||||||
|
Par défaut, on a une résolution en 640x480 quand on lance LXDE avec
|
||||||
|
**startx**. On peut monter en 800x600 en créant un fichier *xorg.conf*.
|
||||||
|
|
||||||
|
# sudo nano /etc/X11/xorg.conf
|
||||||
|
|
||||||
|
Ajouter ces lignes dans le fichier :
|
||||||
|
|
||||||
|
Section "Screen"
|
||||||
|
Identifier "Default Screen"
|
||||||
|
SubSection "Display"
|
||||||
|
Depth 16
|
||||||
|
Modes "800x600" "640x480"
|
||||||
|
EndSubSection
|
||||||
|
EndSection
|
||||||
|
|
||||||
|
Sauvegarde et redémarrer X pour voir le résultat.
|
||||||
|
|
||||||
|
### Déplacements erratiques de la souris
|
||||||
|
|
||||||
|
J'ai été confronté à ce problème lié à la configuration de Qemu. La souris se
|
||||||
|
fige ou certaines portions de l'écrans deviennent inaccessibles. je l'ai
|
||||||
|
résolu en lançant Qemu ainsi :
|
||||||
|
|
||||||
|
qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -usbdevice tablet -display sdl -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2014-06-20-wheezy-raspbian.img
|
||||||
|
|
||||||
|
Notez le paramètre *-usbdevice tablet* et *-display sdl*.
|
||||||
|
|
||||||
|
### Conclusion
|
||||||
|
|
||||||
|
L'émulation Qemu permet de se faire une bonne idée de la distribution. Bien sûr, ce n'est pas complètement fonctionnel car certains périphériques spécifiques au Raspberry ne sont pas présent (je pense aux entrées / sortie, au port HDMI) mais cela permet déjà beaucoup.
|
@ -0,0 +1,149 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Installation de Shinken
|
||||||
|
category: GNU/Linux
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Dans la série "ma vie de sysadmin en semi-pro", je me suis frotté à la mise
|
||||||
|
en place d'une supervision de type Nagios.<!-- more --> Mon besoin est la surveillance de
|
||||||
|
quelques serveurs et services critiques et la remontée d'alertes en cas de
|
||||||
|
souci. Nagios est la référence dans le domaine avec des centaines de greffons
|
||||||
|
pour surveiller la plupart des applications existantes et la possiblité de
|
||||||
|
créer ses propres greffons pour ses applications spécifiques. Par goût de la
|
||||||
|
démarcation (mais pas seulement), j'ai opté pour
|
||||||
|
[Shinken](https://fr.wikipedia.org/wiki/Shinken_%28logiciel%29), un
|
||||||
|
*fork* de Nagios qui a plusieurs avantages à mes yeux :
|
||||||
|
|
||||||
|
- c'était une branche expérimentale de Nagios qui aurait dû succéder au Nagios actuel dont les critiques disent que le noyau n'évolue pas assez vite par rapport aux demandes des utilisateurs,
|
||||||
|
- son architecture est saluée pour sa capacité de montée en charge (distribuée, balance de charge),
|
||||||
|
- c'est écrit en Python et la compatibilité est totale avec les greffons Nagios.
|
||||||
|
|
||||||
|
La supervision en général et Nagios en particulier est un vaste sujet et des
|
||||||
|
IT administrant des milliers de serveurs et de services ont beaucoup plus de
|
||||||
|
légitimité que moi pour en parler. Je vais me borner à décrire les étapes
|
||||||
|
d'une installation sans problème sur un serveur Debian Wheezy.
|
||||||
|
|
||||||
|
### Installation de Shinken
|
||||||
|
|
||||||
|
Ce qui suit s'inspire directement du [10 minutes Shinken installation guide](https://shinken.readthedocs.org/en/latest/02_gettingstarted/installations/shinken-installation.html) avec quelques adaptations pour Debian Wheezy.
|
||||||
|
|
||||||
|
Installation des paquets Debian nécessaires :
|
||||||
|
|
||||||
|
$ apt-get install python-cherrypy3 python-pip \
|
||||||
|
python-pycurl nagios-plugins
|
||||||
|
|
||||||
|
Création d'un utilisateur **shinken** dédié :
|
||||||
|
|
||||||
|
$ adduser shinken
|
||||||
|
|
||||||
|
Et finalement installation de shinken lui-même avec le programme PIP (je suppose que Python et PIP 2.x sont installés sur votre Debian) :
|
||||||
|
|
||||||
|
$ pip install shinken
|
||||||
|
|
||||||
|
C'est aussi simple que cela. On a installé le moteur de Shinken mais aucune
|
||||||
|
interface graphique. Je découvre petit à petit mais l'interface est une
|
||||||
|
composante optionnelle et plusieurs sont proposées. J'ai choisi
|
||||||
|
d'installer **webui**, celle recommandée qui apporte de la visualisation (la
|
||||||
|
configuration se fait en modifiant des fichiers et en redémarrant les
|
||||||
|
services Shinken).
|
||||||
|
|
||||||
|
### Installation de Webui
|
||||||
|
|
||||||
|
Shinken propose son propre gestionnaire de greffons avec le programme **shinken**.
|
||||||
|
|
||||||
|
$ shinken --init
|
||||||
|
$ shinken install webui
|
||||||
|
$ shinken install auth-cfg-password
|
||||||
|
|
||||||
|
Webui nécessite un stockage en base pour stocker les préférences
|
||||||
|
utilisateurs. On peut se limiter à SQLite, j'ai choisir MongoDB (la base
|
||||||
|
NoSQL) qui me sert à d'autres usages.
|
||||||
|
|
||||||
|
$ apt-get install mongodb python-pymongo
|
||||||
|
$ shinken install mod-mongodb
|
||||||
|
|
||||||
|
Editer */etc/shinken/modules/webui.cfg* et rajouter les modules dépendants :
|
||||||
|
|
||||||
|
modules auth-cfg-password,mongodb
|
||||||
|
|
||||||
|
Editer */etc/shinken/brokers/broker-master.cfg* et rajouter le module webui :
|
||||||
|
|
||||||
|
modules webui
|
||||||
|
|
||||||
|
Il reste à définir les contacts (personnes) du système dans
|
||||||
|
*/etc/shinken/contacts*. Par défaut, un administrateur est défini dans
|
||||||
|
*/etc/shinken/contacts/admin.cfg*, son mot de passe est utilisé pour
|
||||||
|
l'interface Webui.
|
||||||
|
|
||||||
|
Deux commandes servent régulièrement quand on modifie la configuration.
|
||||||
|
|
||||||
|
Vérifier que la configuration est syntaxiquement correcte :
|
||||||
|
|
||||||
|
$ service shinken check
|
||||||
|
|
||||||
|
Redémarrer les services Shinken :
|
||||||
|
|
||||||
|
$ service shinken restart
|
||||||
|
|
||||||
|
Si tout est correct, on peut se connecter sur Webui depuis un navigateur à l'adresse :
|
||||||
|
|
||||||
|
http://<SERVER>:7767
|
||||||
|
|
||||||
|
### les objets supervisés
|
||||||
|
|
||||||
|
Nagios introduit la notion de *host* et de *service* pour désigner les
|
||||||
|
machines et les services s'exécutant sur ces machines. La configuration de
|
||||||
|
Shinken après installation est minimale :
|
||||||
|
|
||||||
|
- les notifications par email sont activées et seront utilisées si [votre serveur peut envoyer des emails](http://blogduyax.madyanne.fr/smtp-relay-avec-qmail-sur-debian-wheezy.html)
|
||||||
|
- la machine locale est elle-même supervisée de manière générique, je crois que le seul indicateur c'est le Ping pour vérifier qu'elle est accessible.
|
||||||
|
|
||||||
|
On va enrichir tout cela en installant un agent SNMP sur le serveur Shinken ce qui permet de surveiller, entre autre, l'utilisation CPU, RAM, occupation des disques.
|
||||||
|
|
||||||
|
On installe un agent SNMP sur la machine locale avec le paquet **snmpd** qui, par défaut, n'est accessible que par localhost :
|
||||||
|
|
||||||
|
$ apt-get install snmpd
|
||||||
|
|
||||||
|
On rajoute le greffon linux-snmp dans Shinken :
|
||||||
|
|
||||||
|
$ shinken install linux-snmp
|
||||||
|
|
||||||
|
On corrige deux soucis de l'installation sous Debian :
|
||||||
|
|
||||||
|
le script **check_icmp** doit avoir les droits setuid :
|
||||||
|
|
||||||
|
$ chmod u+s /usr/lib/nagios/plugins/check_icmp
|
||||||
|
|
||||||
|
Le module PERL **utils.pm** est mal référencé par les greffons Nagios ; on le
|
||||||
|
fait pointer sur celui de notre installation de PERL dans */usr/share/perl5*
|
||||||
|
|
||||||
|
/usr/share/perl5$ ln -s /usr/lib/nagios/plugins/utils.pm
|
||||||
|
|
||||||
|
On peut modifier la configuration du *host* **localhost** en éditant le fichier */etc/shinken/hosts/localhost.cfg* :
|
||||||
|
|
||||||
|
define host{
|
||||||
|
use linux-snmp
|
||||||
|
contact_groups admins
|
||||||
|
host_name localhost
|
||||||
|
address 127.0.0.1
|
||||||
|
}
|
||||||
|
|
||||||
|
On vérifie la configuration et on redémarre Shinken :
|
||||||
|
|
||||||
|
$ service shinken check
|
||||||
|
$ service shinken restart
|
||||||
|
|
||||||
|
Si la configuration est correcte, la machine locale avec ses services CPU,
|
||||||
|
Mémoire apparaît désormais dans Webui. La fréquence du *polling*, les
|
||||||
|
notifications, tout est configurable finement par *host* , par groupe de
|
||||||
|
*host*, par service. La documentation est riche et bien détaillée.
|
||||||
|
|
||||||
|
Dans le cas de GNU/Linux, la supervision par SNMP apporte les indicateurs de
|
||||||
|
base d'un serveur. Pour avoir plus, on peut donner l'accès SSH au superviseur
|
||||||
|
Shinken sur les serveurs ou on peut installer NRPE (Nagios Remote Plugin
|
||||||
|
Executer). Je préfère NRPE car on ne demande pas l'accès total au serveur à
|
||||||
|
superviser. L'installation de [NRPE est bien décrite dans cet
|
||||||
|
article](http://xmodulo.com/2014/03/nagios-remote-plugin-executor-nrpe-
|
||||||
|
linux.html). Pour finir, beaucoup de resources Nagios sont disponibles sur
|
||||||
|
le site [Nagios Exchange](http://exchange.nagios.org).
|
@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
layout: post
|
||||||
|
title: Du nouveau sur Pecosys
|
||||||
|
categories: Hébergement Blog
|
||||||
|
tag: planet
|
||||||
|
---
|
||||||
|
|
||||||
|
Pecosys est le gestionnaire de commentaires pour les blog statiques créés avec
|
||||||
|
[Pelican](http://docs.getpelican.com/en/3.4.0) présenté [dans ce
|
||||||
|
billet](http://blogduyax.madyanne.fr/pecosys-les-commentaires-avec-pelican.html) en
|
||||||
|
août dernier.<!-- more --> Pour rappel, il s'agit de proposer une alternative aux systèmes
|
||||||
|
décentralisés sur des sites tiers comme Disqus et de conserver ces données qui
|
||||||
|
font partie de l'Histoire d'un blog dans les sources du blog.
|
||||||
|
|
||||||
|
La présentation du projet a eu un petit succès d'estime. Je suis conscient que
|
||||||
|
le public ciblé est réduit : du barbu (ou pas) qui écrit ses articles en
|
||||||
|
Markdown, le construit en HTML statique gràce à Pelican et versionne les
|
||||||
|
sources dans GIT. Sachant que Pecosys demande quelques connaissances système
|
||||||
|
pour s'installer et qu'il est écrit en Python, on touche les gens qui ont un
|
||||||
|
serveur dédié (physique ou virtuel) à la maison ou chez un hébergeur et qui
|
||||||
|
aiment se faire plaisir (ou mal selon le point de vue)..
|
||||||
|
|
||||||
|
Pecosys est en fonction sur ce blog depuis 3 mois. Il y a eu beaucoup de
|
||||||
|
corrections de bugs (désolé pour les commentaires perdus, ça ne devrait plus
|
||||||
|
arriver grâce aux logs étendus de NginX) et quelques nouveautés livrées et
|
||||||
|
installées tout récemment :
|
||||||
|
|
||||||
|
- Le support multi-langue dans la communication entre Pecosys et
|
||||||
|
l'administrateur du blog. Pour l'instant, le français et l'anglais sont
|
||||||
|
proposés.
|
||||||
|
- Une communication plus humaine entre Pecosys et l'administrateur du blog
|
||||||
|
avec des emails moins télégraphiques.
|
||||||
|
- La possibilité pour les lecteurs de s'abonner par email au flux de
|
||||||
|
commentaire d'un article et de se désabonner quand ils le souhaitent.
|
||||||
|
- La possibilité de relancer la *génération Pelican* du blog à chaque publication d'un
|
||||||
|
commentaire.
|
||||||
|
|
||||||
|
L'ensemble des sources et une documentation plus technique est publié [sur mon
|
||||||
|
GitHub.](https://github.com/kianby/pecosys)
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue