Hello World!

  |   Источник

“Doesn’t matter if you can dream it or not, all that matters is if you can begin it or not? Take that first step.”

Vikrmn, Corpkshetra



В своём первом блоге хочется написать пару строк о том, без чего не получилось бы реализовать данный замысел, высказать мысли о выборе сервисов и поблагодарить комьюнити, которое разрабатывают и поддерживают данные технологии. Итак, поехали.

Генератор статических сайтов Nikola

Основной критерий выбора: он должен использовать Python. Пожалуй, самый известный из генераторов статических сайтов для Python - Pelican . К сожалению, я не успел его опробовать. В интернете есть замечательная статья о тонкостях настройки Pelican https://the-bosha.ru/2016/05/04/generator-staticheskih-blogov-pelican/. Моё внимание привлёк Nicola. И в принципе, очень доволен выбором. Огромным преимуществом для меня была встроенная поддержка Jupyter notebooks (о чём расскажу ниже). Плюсом есть поддержка и доброжелательность комьюнити. К примеру, на свой вопрос я получил мгновенный ответ через Nikola Generator Twitter .

Полезные ссылки:

И, конечно, 'last but not least' - этот генератор назван в честь выдающегося ученого и изобретателя Николы Теслы. Есть и определённые минусы, не всё гладко с отображением кириллицы (по крайней мере, я с этим столкнулся и пришлось подбирать шрифт), не всё в документации прописано прозрачно и многие моменты пробовал интуитивно. Но всё это мелочи по сравнению с огромным потенциалом, заложенным в данный генератор статических сайтов.

С помощью jupyter notebook (запустив онлайн или установив на компьютер), вы сможете создавать документы notebooks (по сути, JSON c расширение ipynb), которые содержат как программный код, который можно интерактивно запускать, вносить изменения (например, на Python), так и расширенный текст, и диаграммы. Данными документами очень удобно делиться в интернете или конвертировать в различные форматы, например, HTML, Markdown, reST, pdf. Кроме этого, это и удобная оболочка c 'магическими командами', которая позволяет тесно взаимодейстовать с Python.

In [7]:
%ll
total 568
-rw-r--r-- 1 vitaliy   9260 лис  2 15:49 base_blog.html
-rw-r--r-- 1 vitaliy    163 жов 26 14:13 checker_div.py
drwxr-xr-x 3 vitaliy   4096 жов 26 14:13 css/
-rw-r--r-- 1 vitaliy  13328 лис  2 15:39 index2.html
-rw-r--r-- 1 vitaliy  17607 лис  2 15:30 index.html
drwxr-xr-x 2 vitaliy   4096 лис 14 19:13 __pycache__/
-rw-r--r-- 1 vitaliy   3869 лис  2 15:39 script.js
-rw-r--r-- 1 vitaliy 256336 лис  2 13:35 Untitled1.html
-rw-r--r-- 1 vitaliy 250093 лис  2 13:37 Untitled.html
drwxr-xr-x 2 vitaliy   4096 жов 26 14:13 w3images/


Пример использования Jupyter Notebook. В ходе работы над оформлением одного из сайтов, возникла необходимость просмотреть количество незакрытых div. Конечно, это удобно сделать с помощью любого текстового редактора, например, моего любимого Sublime Text3. Но, чтобы показать как выделяется код в документе Jupyter notebook, напишем модуль на Python.

In [8]:
x = 0
with open('index.html') as f:
    for line in f:
        if '<div' in line:
            x += 1
        if '</div' in line:
            x -= 1

print(x)
5
In [9]:
import json
In [15]:
help('json.load')
Help on function load in json:

json.load = load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
    Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
    a JSON document) to a Python object.
    
    ``object_hook`` is an optional function that will be called with the
    result of any object literal decode (a ``dict``). The return value of
    ``object_hook`` will be used instead of the ``dict``. This feature
    can be used to implement custom decoders (e.g. JSON-RPC class hinting).
    
    ``object_pairs_hook`` is an optional function that will be called with the
    result of any object literal decoded with an ordered list of pairs.  The
    return value of ``object_pairs_hook`` will be used instead of the ``dict``.
    This feature can be used to implement custom decoders that rely on the
    order that the key and value pairs are decoded (for example,
    collections.OrderedDict will remember the order of insertion). If
    ``object_hook`` is also defined, the ``object_pairs_hook`` takes priority.
    
    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
    kwarg; otherwise ``JSONDecoder`` is used.

Ccылки:

Для меня удобство Jupyter Notebook состоит в том, что в своих блогах я планирую показывать Python код. Поэтому установив и запустив Jupyter Notebook App на компьютере, можно в браузере формировать участки в формате Markdown и вставлять Python код, сохранять в формате .ipynb и затем Nikola конвертирует результат в HTML.
Пример:

(nikola) vitaliy@comp:~/Documents/my_blog$ nikola new_post -i "first.ipynb" -f ipynb --tags='web','site generator'

В интернете есть масса информации по использованию GitHub Pages как бесплатного хостинга для статических сайтов. Пример, https://htmlacademy.ru/blog/99-github-as-hosting. Для этого необходимо лишь зарегистрироваться на Github. Отмечу, что Nikola уже с коробки умеет делать deploy на GitHub Pages.


Comments powered by Disqus