Home Assistant for a Newbie
Navegador Lagrange para Gemini ahora disponible para Android
Ya hay disponible una APK para Android del navegador Lagrange para protocolo Gemini, aunque en una versión Alfa muy temprana de desarrollo

Jaakko Keränen, el desarrollador del navegador Lagrange, para protocolos Gemini, hace un tiempo estaba tratando de portar el código para estar disponible para Android y arquitecturas ARM.
Ya ha anunciado que se ha publicado una primera versión Alfa de la aplicación APK solo para arquitecturas ARM de32 bits.
En el anuncio, nos deja claro que es una muy primera versión de desarrollo, por lo que tengamos en cuenta que pueden faltar de implementar nuevas funcionalidades, algunas pueden no funcionar como se espera y otras simplemente harán que «crashee» la aplicación.
Otros fallos con los que cabe contar, es que solo funciona en orientación vertical, no tiene integración con el sistema operativo y algunos otros problemas, pero quería publicar una primera versión de trabajo para ver cómo se desenvolvía y para que hubiera gente que la probara.
También advierte que esta primera versión es una prueba a sí mismo, para ver si puede crear una APK que se pueda instalar, ya que no es usuario ni desarrollador de Android.
El desarrollo lo ha realizado mediante Android Studio en un sistema Xubuntu y después de lidiar con alguna contrariedad pudo hacer funcionar el entorno para desarrollar Lagrange para Android.
Estos son algunos de los errores encontrados que tiene esta APK y que pronto se irán puliendo:
- Fallo al crear un marcador por primera vez
- Bloqueo al abrir una imagen
- Fallo al actualizar los feeds suscritor
- Fallo al ver la página de prueba de Emoji
- Crash al abrir la configuración
- Los enlaces web no se abren (necesitan un SDL más reciente)
Aunque todavía, como admite su desarrollador, la versión está en fase inicial de desarrollo, es bueno ver que una versión para Android está disponible, lo que ayudará a difundir y extender y utilizar más el protocolo Gemini.
Te dejo un enlace al anuncio oficial en su blog desde donde podrás descargar la APK y si quieres instalarla en tu teléfono y reportar fallos que encuentres.
Enlaces de interés
- https://gmi.skyjake.fi/gemlog/2021-12_android-alpha.gmi
- gemini://skyjake.fi/gemlog/2021-12_android-alpha.gmi (enlace para abrir con un navegador compatible con el protocolo Gemini, por ejemplo Lagrange)

Jekyll: Import Disqus comments for Staticman
For some years already, I try to rely for this website on less external resources and avoid ad-powered services to improve the privacy for my dear readers.
Recently, I removed the comments provided by Disqus from this blog, because Disqus introduced too much data sharing with many third parties. Norway just fined this year Disqus 2,5 Mio Euro for tracking without legal basis.
Please find hereafter some tips on how to export comments from Disqus and display them in a privacy-friendly way in your Jekyll blog.
Export Disqus Comments to JSON and YAML
- Disqus documents the export and export format at https://docs.disqus.com/developers/export/
-
Navigate to http://disqus.com/admin/discussions/export/ to export your comments to XML format.
The XML has principally 3 parts: meta data, a list with webpages and a list with comments that are linked each to a webpage (via a Disqus identifier) and possibly a parent comment in case the comment is a reply.
For use within Jekyll, I need to restructure the data and have a list of comments for each webpage by my own identifier (e.g. post slug) and convert everything to a format that Jekyll can handle, hence YAML, JSON, CSV, or TSV. I choose YAML.
-
Install the linux tool
xqto manipulate XML files and export to JSON and the tooljq.xqis basically a wrapper ofjq.pip install xqDownload binaries of jq here: https://stedolan.github.io/jq/download/
-
I convert then the Disqus XML export into a JSON file with the code in
export-disqus-xml2json.sh - Then, I pipe the output through
import-json-yaml.rbto split the list of comments into individual files for easy consumption by Jekyll.
# file: 'export-disqus-xml2json.sh'
#!/usr/bin/env sh
xq '.disqus | .thread as $threads | .post | map(select(.isDeleted == "false")) | map(.thread."@dsq:id" as $id | ($threads[] | select(."@dsq:id" == $id)) as $thread | {id: ("disqus-"+."@dsq:id"), date: .createdAt, slug: ($thread.id | tostring | gsub("/$";"") | split("/") | last), name: (if .author.name == "Robert" then "Robert Riemann" else .author.name end), avatar: .author | (if has("username") and .username != "rriemann" then "https://disqus.com/api/users/avatars/"+.username+".jpg" else null end), email: .author | (if has("username") and .username == "rriemann" then "my@mail.com" else null end), message, origin: ($thread.link | tostring | gsub("^https://blog.riemann.cc";"")), replying_to: (if has("parent") then ("disqus-"+.parent."@dsq:id") else null end)})' "$@"
Example comment from the JSON list:
{
"id": "disqus-4145062197",
"date": "2018-10-14T22:14:58Z",
"slug": "versioning-of-openoffice-libreoffice-documents-using-git",
"name": "Robert Riemann",
"avatar": null,
"email": "my@mail.com",
"message": "<p>I agree, it is not perfect. I have no solution how to keep the noise out of git.</p>",
"origin": "/2013/04/23/versioning-of-openoffice-libreoffice-documents-using-git/",
"replying_to": "disqus-4136593561"
}
The script import-json-yaml.rb takes each comment and puts it in YAML format with a unique filenname in the folder named after the slug.
# file: 'import-json-yaml.rb'
#!/usr/bin/env ruby
require 'json'
require 'yaml'
require 'fileutils'
require 'date'
data = if ARGV.length > 0 then
JSON.load_file(ARGV[0])
else
JSON.parse(ARGF.read)
end
data.each do |comment|
FileUtils.mkdir_p comment['slug']
File.write "#{comment['slug']}/#{comment['id']}-#{Date.parse(comment['date']).strftime('%s')}.yml", comment.to_yaml
end
The output with tree looks like:
_data
├── comments
│ ├── announcing-kubeplayer
│ │ ├── disqus-113988522-1292630400.yml
│ │ └── disqus-1858985256-1424044800.yml
│ ├── requires-owncloud-serverside-backend
│ │ ├── disqus-41270666-1269302400.yml
│ │ ├── disqus-41273219-1269302400.yml
...
Display Comments in Jekyll
Those comments are accessible in jekyll posts/pages via site.data.comments[page.slug]
Most helpful for the integration of comments to Jekyll was the post https://mademistakes.com/mastering-jekyll/static-comments-improved/.
<!-- file: 'my-comments.html' -->
{% assign comments = site.data.comments[page.slug] | sort %}
{% for comment in comments %}
{% assign index = forloop.index %}
{% assign replying_to = comment[1].replying_to | to_integer %}
{% assign avatar = comment[1].avatar %}
{% assign email = comment[1].email %}
{% assign name = comment[1].name %}
{% assign url = comment[1].url %}
{% assign date = comment[1].date %}
{% assign message = comment[1].message %}
{% include comment index=index replying_to=replying_to avatar=avatar email=email name=name url=url date=date message=message %}
{% endfor %}
<!-- file: 'comment' -->
<article id="comment{% unless include.r %}{{ index | prepend: '-' }}{% else %}{{ include.index | prepend: '-' }}{% endunless %}" class="js-comment comment {% if include.name == site.author.name %}admin{% endif %} {% unless include.replying_to == 0 %}child{% endunless %}">
<div class="comment__avatar">
{% if include.avatar %}
<img src="{{ include.avatar }}" alt="{{ include.name | escape }}">
{% elsif include.email %}
<img src="https://www.gravatar.com/avatar/{{ include.email | md5 }}?d=mm&s=60" srcset="https://www.gravatar.com/avatar/{{ include.email | md5 }}?d=mm&s=120 2x" alt="{{ include.name | escape }}">
{% else %}
<img src="/assets/img/avatar-60.jpg" srcset="/assets/img/avatar-120.jpg 2x" alt="{{ include.name | escape }}">
{% endif %}
</div>
<div class="comment__inner">
<header>
<p>
<span class="comment__author-name">
{% unless include.url == blank %}
<a rel="external nofollow" href="{{ include.url }}">
{{ include.name }}
</a>
{% else %}
{{ include.name }}
{% endunless %}
</span>
wrote on
<span class="comment__timestamp">
{% if include.date %}
{% if include.index %}<a href="#comment{% if r %}{{ index | prepend: '-' }}{% else %}{{ include.index | prepend: '-' }}{% endif %}" title="link to this comment">{% endif %}
<time datetime="{{ include.date | date_to_xmlschema }}">{{ include.date | date: '%B %d, %Y' }}</time>
{% if include.index %}</a>{% endif %}
{% endif %}
</span>
</p>
</header>
<div class="comment__content">
{{ include.message | markdownify }}
</div>
</div>
</article>
Receiving New Comments
Like explained in https://mademistakes.com/mastering-jekyll/static-comments/, the software https://staticman.net/ allows to feed POST HTTP requests to Github and Gitlab pull requests, so that comments can be added automatically. Of course, the website requires after each time a rebuild.
I had much trouble to setup Staticman. Eventually, I decided to use a Ruby CGI program that emails me the new comment as an attachment. I like Ruby very much. :wink: Once I figured out how to use the Gitlab API wrapper, I may also use pull requests instead of email attachments.
# file: 'index.rb'
#!/usr/bin/env ruby
Gem.paths = { 'GEM_PATH' => '/var/www/virtual/rriemann/gem' }
require 'cgi'
require 'yaml'
require 'date'
require 'mail'
cgi = CGI.new
# rudimentary validation
unless ENV['HTTP_ORIGIN'] == 'https://blog.riemann.cc' and
ENV['CONTENT_TYPE'] == 'application/x-www-form-urlencoded' and
ENV['REQUEST_METHOD'] == 'POST' and
cgi.params['email']&.first&.strip =~ URI::MailTo::EMAIL_REGEXP and
cgi.params['age']&.first == '' then # age is a bot honeypot
print cgi.http_header("status" => "FORBIDDEN")
print "<p>Error: 403 Forbidden</p>"
exit
end
output = Hash.new
date = DateTime.now
output['id'] = ENV['UNIQUE_ID']
output['date'] = date.iso8601
output['updated'] = date.iso8601
output['origin'] = cgi.params['origin']&.first
output['slug'] = cgi.params['slug']&.first&.gsub(/[^\w-]/, '') # some sanitizing
output['name'] = cgi.params['name']&.first
output['email'] = cgi.params['email']&.first&.downcase&.strip
output['url'] = cgi.params['url']&.first
output['message'] = cgi.params['message']&.join("\n").encode(universal_newline: true)
output['replying_to'] = cgi.params['replying_to']&.first
#Mail.defaults do
# delivery_method :sendmail
#end
Mail.defaults do
delivery_method :smtp, address: "smtp.domain", port: 587, user_name: "smtp_user", password: "smtp_password", enable_starttls_auto: true
end
mail = Mail.new do
from 'no-reply@domain' # 'rriemann'
to 'comments-recipient@domain' # ENV['SERVER_ADMIN']
reply_to output['email']
header['X-Blog-Comment'] = output['slug']
subject "New Comment from #{output['name']} for #{cgi.params['title']&.first}"
body <<~BODY
Hi blog author,
a new comment from #{output['name']} for https://blog.riemann.cc#{output['origin']}:
#{output['message']}
BODY
add_file(filename: "#{output['id']}-#{date.strftime('%s')}.yml", content: output.to_yaml)
end
mail.deliver
if mail.error_status then
print cgi.http_header("status" => "SERVER_ERROR")
cgi.print <<~RESPONSE
<p><b>Error: </b> #{mail.error_status}</p>
<p>An error occured. Please try again later.</p>
<p><a href="javascript:history.back()">Go back</a></p>
RESPONSE
else
print cgi.http_header
cgi.print <<~RESPONSE
<p><b>Thank you</b> for your fedback! Your comment is published after review.</p>
<p><a href="#{output['origin']}">Back to the previous page</a></p>
RESPONSE
end
To make it work with Apache, you may need to add these lines to the Apache configuration (could be a .htaccess file):
DirectoryIndex index.html index.rb
Options +ExecCGI
SetHandler cgi-script
AddHandler cgi-script .rb
Foto de grupo de Akademy-es 2021 #akademyes
No hay evento que se precie que no tenga su correspondiente imagen para la posteridad, y los eventos virtuales no son una excepción. Bienvenidos a una breve pero significativa entrada en la que os presento la foto de grupo de Akademy-es 2021 que se ha tomado, evidentemente, utilizando las limitaciones del espacio que nos ofrecen las ventanas de webconferencia.
Foto de grupo de Akademy-es 2021 #akademyes
Antes, cuando las Akademy-es eran virtuales, era una tradición (que se inició en Almería 2017 y que continuó en Valencia 2018 y siguió en Vigo 2019) que el mismo día de la realización de la misma yo publicara la ansiada foto de grupo.
Este año ha sido una excepción (por diversos motivos) y me ha costado un poco más ponerla ya que he de reconocer que ha sido un diciembre muy movido.
Esta captura de pantalla, que no en realidad foto de grupo, se ha realizado con solo los participantes que pusieron su webcam en el momento de tomar la instantánea y que el sistema permite mostrar en solo una pantalla.. Es por ello que en esta ocasión más que nunca se puede decir que son todos los que están pero no están todos los que son.
Pero, o me enrollo más y os dejo ya la foto de grupo de Akademy-es 2021 de Vigo, en la que no están todos los que son pero si que son todos los que están. Pinchad en la imagen para verlo más grande.

¿Qué es el Akademy-es?
Akademy-es es el encuentro anual de desarrolladores, colaboradores y usuarios de KDE en España, que se celebra desde el año 2006 en distintas ciudades del territorio español y con esta se llegará a la decimasexta edición, lo cual significa una cifra más que aceptable.
Os recuerdo que el registro y la asistencia a las Akademy-es es libre y gratuito, es decir, no te cuesta nada. Se hace únicamente para contar asistente y para organizar la tradicional cena del sábado (que esperamos que vuelva con fuerza).
Más información: KDE España
Pi-Hole the Easy Way
Natal de NERD: Lançado openCV 4.5.5

Versão 4.5.5 da biblioteca openCV foi lançada com diversas novidades. Como suporte a áudio na API VideoCapture, otimização ao RISC-V, suporte ao OpenVINO 2021.4.2 LTS release atualização do exemplo do módulo videoio da câmera realsense e muito mais. Todos os detalhes aqui: https://github.com/opencv/opencv/wiki/ChangeLog


2021年を振り返って
この記事は openSUSE Advent Calendar の25日目です。
今年も openSUSE Advent Calendar にご参加頂きありがとうございました。みなさん忙しかったからか、今年は13日目で力尽きてしまいました。
最終日は openSUSE 関連の活動を振り返ってみようと思います。
1〜5月
うーん。何かを行った記録がありません。15.3 向けの開発をしていたかもしれません。
6月
openSUSE Leap 15.3 がリリースされました。今年はリリースパーティーも mini Summit もできなかったので、来年はしたいですね。
8月
openSUSE.Asia Summit をオンラインで開催しました。もともとは昨年にインドで開催する予定でしたが、インドチームによるオンライン開催になりました。
https://events.opensuse.org/conferences/oSAS21
8月末に開催された Open Developers Conference (ODC) では、Cross Distro Developers Camp の枠で Leap 15.3 とリリースモデルの話をしました。
https://speakerdeck.com/ftake/opensuse-leap-15-dot-3-toririsumoderufalsehua
9月〜11月
同じく活動の記録が…。
12月
今年も Advent Calendar を作成しました。序盤は勢い良くスタートしましたが…途中でばったり力尽きてしまった感じになってしまいました。
大晦日には Geeko Magazine Special Edition を久しぶり発行します。2年ぶりとは思えないページ数になっています。オンラインイベントが続くため、頒布機会がなかなか確保できなさそうですが、機会があればお手にとって見たください。
来年は?
今年は仕事が忙しく、Mozc の最新バージョンへのアップデートなど、いろいろやりかけになってしまいました。なんとか時間を取れるようにしたいなと思います。
Emacs, Oculus, Cookies, DNI electrónico, NVDA en los podcast de GNU/Linux València
Me complace presentar otro podcast de la gente de GNU/Linux València que fue grabado hace unos días y que tengo ya en mi playlist. Además del nuevo proyecto de Emacs, en este podcast también se habla deOculus, Cookies, DNI electrónico y NVDA. ¡Dentro entrada!
Emacs, Oculus, Cookies, DNI electrónico, NVDA en los podcast de GNU/Linux València

Parece que tras mucho tiempo en silencio, siempre por problemas de horarios, los podcast de GNU/Linux València empiezan a tomar un ritmo de publicación constante.
Hay que destacar que se tratan de unos audios distendidos, tipo tertulia, que siempre son muy amenos y accesibles para todo el mundo, ya sean novato, experto o simplemente te interese conocer este mundillo antes de dar el salto.
En palabras de los miembros de la Asociación encargadas de publicar la entrada correspondiente a su podcast.
Contamos con José Carlos, colaborador de GNU/Linux València, el cual está [más que] ayudando a la implementación de ODOO como software de planificación de recursos de nuestra asociación. Junto a Jose Carlos están los habituales, Alejandro y Marcos.
Los temas de los que hablamos son:
– Emacs. Un momento, ¿hablamos de Emacs y no está Taraak? Hablamos de Emacs y no está Taraak (o_Ô)
– Licencia de Oculus de Facebook
– Cookies
– DNI electrónico
– NVDA
¡Esperamos que os guste!
Y como es habitual en este tipo de entrada, os dejo directamente el audio para que lo disfrutéis.
Más información: GNU/Linux València
¡Únete a GNU/Linux València!
Aprovecho para recordar que desde hace unos meses, los chicos de GNU/Linux Valencia ya tienen su menú propio en el blog, con lo que seguir sus eventos en esta humilde bitácora será más fácil que nunca, y así podréis comprobar su alto nivel de actividades que realizan que destacan por su variedad.
Y que además, GNU/Linux València ha crecido y se ha ¡¡¡convertido en asociación!!! Así que si buscas una forma de colaborar con el Software Libre, esta asociación puede ser tu sitio. ¡Te esperamos!
Tu lanzador Linux de juegos de la Epic Store: Heroic
Para este 25 de enero diciembre (que se celebra tanto la Navidad como el nacimiento de Sir Isaac Newton) os presento Heroic, tu lanzador Linux de juegos de la Epic Store, todo un descubrimiento que realicé este verano pero que hasta estos días no he conseguido probar.
Tu lanzador Linux de juegos de la Epic Store: Heroic
Lo descubrí escuchando un podcast, creo que fue el 63 de Mancomún (y si no lo es, no dejéis de escucharlo que es igualmente interesante), donde hablaban de videojuegos en Linux con Leillo.
Y, aún creyendo que controlaba mucho de este tema con mi experiencia en Lutris quedé asombrado al descubrir Heroic.

¿Y qué es eso? Básicamente Heroic es un gestor y lanzador de juegos de la tienda de videojuegos digitales Epic Store, famosa por regalar un videojuego cada semana, lo cual ha conseguido crearme un síndrome de Diógenes, ya que todos los jueves del año reclamo un juego que no creo que juegue pero que se queda guardado en mi biblioteca digital.
De hecho, estas navidades no es cada jueves, sino cada día a lo largo de 15 con lo que me biblioteca no para de crecer.
Evidentemente ni los pruebo, ya que requieren la Epic Launcher, el cual no está disponible para sistemas GNU/Linux. Pero afortunadamente ese problema tiene solución gracias al trabajo de los desarrolladores (aunque me suena que solo era uno) de Heroic, que han creado un gestor de dichos juegos que a la vez es lanzador, eso si, necesitas tener bien instalado y configurado wine para hacerlos funcionar.

En palabras de sus desarrolladores:
Heroic es un lanzador de juegos de código abierto para Linux, Windows y MacOS (limitado a los juegos de Windows que utilizan Wine/Crossover). Ahora mismo soporta el lanzamiento de juegos desde la Epic Games Store usando Legendary, una alternativa CLI al Epic Games Launcher. Heroic está construido con tecnologías web como: TypeScript, React, NodeJS y Electron.
De momento, estas vacaciones me lo he instalado, pero todavía no he conseguido ejecutar ningún juego, ya os iré contando.
