Welcome to Planet openSUSE

This is a feed aggregator that collects what openSUSE contributors are writing in their respective blogs.

To have your blog added to this aggregator, please read the instructions.

24 November, 2019

Michael Meeks: 2019-11-24 Sunday.

21:00 UTCmember

  • All Saints, Simon & Norma back for lunch; played with the babes, quartet bits, ferried kids around the place.


Preparations for the Developers Conference 2020 have begun. The date, location and theme have been announced.

The next Developers Conference, simply dubbed DevCon 2020, will be held on 2 - 4 April at the Caudan Arts Centre in Port-Louis, Mauritius. This time the conference theme is Comics, which I am pretty sure requires no further explanation as to what to expect.

A few of our regular supporters have already joined as sponsors, while others have expressed their intention to back us financially in the coming days. The conference cannot happen without the help and support of the sponsors and the commitment to support the DevCon organizers every year is really appreciated. May the force be with you & your organizations prosper!

Developers Conference is an event by the community for the community. We should not forget this. Everyone's help is welcomed and appreciated. In fact, next year we're aiming big and the more backers we have the merrier!

If you believe there are organizations out there that can support us please share the conference brochure with them. The brochure explains about the conference, the different sponsorship tiers and ways in which an organization can help in making DevCon 2020 another great & awesome conference!

Meanwhile, you out there, if you've been to the Developers Conference before, then how about submitting a paper this time? Take the leap and do it!


I've looked for it myself and search results always return complicated hacks to achieve it. Adjusting the top, bottom or right and left margins (only) are not usually a straightforward task if you do not know the right package to use.

Like for example, this StackExchange (TeX) suggestion is definitely NOT recommended.

The reasons to have to modify the page margins in the middle of a document could vary; say if you need to display an almost "full-page" figure in a landscape layout, you'd surely be touching the margins and getting additional blank pages being created if you do not reduce those margins of the current page.

The simplest way I found of doing it is using the changepage package available from ctan.org. While the package provides several commands to adjust the page margins, text blocks or the entire page design, I find the below single line command extremely useful.

\changepage{〈text height〉}{〈text width〉}{〈even-side margin〉}{〈odd-side margin〉}{〈column sep.〉}{〈topmargin〉}{〈headheight〉}{〈headsep〉}{〈footskip〉

Thus, in one single line the entire page can be re-designed in the middle of your LaTeX document.

The changepage command takes nine arguments, which can either be blank or contain a value of a length. The length value is added to the current length. If a length value is not supplied then a zero value is assigned which is then added to the current length, therefore, resulting in no change. A negative value is used to reduce the current length.


Komunitas openSUSE Indonesia kali ini turut memeriahkan Kopdar yang diadakan KDE Indonesia, kali ini KDE Indonesia muncul kembali dengan mengadakan kopdar di Yogyakarta dengan mengangkat tema “Jadi Penerjemah itu Mudah”. Kopdar ini diadakan pada tanggal 23 November 2019 bertempat di Kantor Midtrans. Penerjemah senior KDE Indonesia,  Wantoyek yang kali ini berkesempatan untuk memberikan dongeng tentang keluh kesah, serta cara menerjemahkan KDE ke bahasa Indonesia. Pada kopdar kali ini openSUSE Indonesia diwakili oleh Edwin Zakaria, Yan Arief, Rifki Affandi, Rania Amina dan tentunya pembicara Wantoyek.

Acara dimulai jam 19.00 – selesai, dihadiri sekitar 20an orang yang berasal dari berbagai daerah di Jawa Tengah. Sepengetahuan mimin ada beberapa orang yang datang dari luar Yogyakarta, seperti dari Semarang, Solo, Jember dan Jakarta!. Mau yang paling jauh? ada loh! Salah satu anggota Open Source Design , namanya Jan C. Borchardt asal dari Jerman.

Peserta kopdar KDE

Wantoyek yang sedang menjelaskan cara translasi

Kopdar ini berlangsung sampai jam 23.30 karena para peserta keasyikan menerjemahkan *eh. Terima kasih kepada Midtrans karena telah menyediakan tempat, Midtrans keren!.  openSUSE Indonesia tidak lupa turut memberikan doorprize berupa kaos edisi curang openSUSE yang diberikan oleh Yan Arief kepada peserta yang beruntung. Peserta beruntung yang mendapatkan kaos ini adalah peserta dari DOSCOM (Semarang) loh!.

Pemberian Doorprize oleh Yan Arief

23 November, 2019

Michael Meeks: 2019-11-23 Saturday.

21:00 UTCmember

  • Out for a run with J. Put up some Ikea storage units, Mentalistsed, bit of hacking & mail.


Recently, my Linksys E2000 decided it would no longer be the wireless access point I expected it to be and it had to be replaced. Thinking that maybe it just needed an update or to be reverted to the original firmware also did not solve the problem as it would just not allow any clients to access the network. No matter what I did, there was no way I could get this thing to work properly. It was time to replace it. After doing some reading and digging but ultimately taking the advice of my e-friend Mauro, I purchased an Aruba IAP-105.

The WRT54GL I pulled out of storage just wasn’t cutting it, throughput wise, even though Wireless G was pretty great some 14 years ago.

This is a nice little device and it feels like a well built unit. While handling it, the look and feel of this well crafted equipment feels like something that shouts at me “professional” or perhaps, “I was built to survive knuckle-dragger handler like you.”

Reset the router done by inserting a paperclip into the recessed hole when off and turning it on. Wait about 5 seconds for the LED indicators to flash and you are off to the races. Note that just pressing and holding the reset button does nothing when it is on.

The Access Point presented a login screen and I was unsuccessful in locating anywhere in the instruction manual the default username and password. It took a bit of digging but I was able to determine that the default username is admin and the password is also admin. I was sure to fix that default as it has been shown far too often that the defaults are left and a network is compromised.

Setting up the Access Point was so simple that it took me a bit to realize I had it set up properly with very minimal effort on my part. The effort was so minimal, I was convinced it wasn’t set up properly until I started to see the clients connect. It was amazingly easy.

Under the Network section, select New to enter a New WLAN. What is interesting here is that you have 3 options. Employee, Voice and Guest. None of which are exactly my use but home use is probably closer to “Employee” than Guest.

Next was the Client IP & VLAN Settings. In my case, I have no VLANs on my network. Maybe I should but at this time, I don’t see a need. For my purposes. I want the Client IP assignment taken care of my main DHCP server and since I don’t have a Virtual Controller, I went with the “Network Assigned” option as it seemed the most reasonable. The client VLAN assignment was left at “Default”.

The Security section was straight forward

Nothing to do with the Access section.

Once I completed it, I was a bit confused because I didn’t set the DHCP server or the DNS


पिचले सितंबर को Bali, Indonesia के Udayana University में openSUSE Asia Summit 2019 घटित हुआ। लगातार दो दिनों तक दुनिया के कोने कोने से आए हुए इंजीनियरों, डेवलपर्स, डिजाइनरों और कइ तरह के openSUSE योगदानकर्ताओं ने मिलकर तकनीकी प्रदर्शन तथा अन्य कार्यशालाएँ आयोजित कीं।

इस सम्मेलन के द्वारा openSUSE समुदाय अपने उपयोगकर्ताओं और योगदानकर्ताओं को एक साथ लाता हें ताकि इन में openSUSE प्रोजैक्ट को लेकर बातचीत हो सके। बोर्ड के सदस्य समुदाय को प्रोजैक्ट से संबंधित जानकारी देते हैं। नए उपयोगकर्ता इस सम्मेलन से बहुत लाभ उठा सकते हैं।

सम्मेलन के समापन समारोह से पहले यह घोषित कि गइ की अगला सम्मेलन, याने कि openSUSE Asia Summit 2020, मानव रचना इंटरनेशनल इंस्टिट्यूट ऑफ़ रिसर्च एंड स्टडीस (Manav Rachna Int'l Institute of Research & Studies), फरीदाबाद, हरियाणा, भारत (Faridabab, Haryana, India) में होगा। इंस्टिट्यूट की प्रतिनिधि, शोभा त्यागी, ने विस्तार से अपना प्रस्ताव बाताया जोकी सम्मेलन के आयोजकों ने स्वीकार किया।

將GCP Stackdriver Alert 傳送到 telegram 小記

OS: container with openSUSE Leap 15.1

上次寫的是 “使用 Stackdriver 監控 GCE CPU 使用率, 超出監控值主動發出通知”, 通知的方式是 E-mail

所以接下來就來實驗透過 Telegram 來接受訊息 :)

首先要來建立 telegram bot

可以點選 以下網址 開啟 telegram 

或是在 telegram 程式中 

搜尋 @botfather


也可以看到剛剛點選的 /start

輸入 /newbot 建立 bot

接下來會被要求輸入 bot 名稱, 這邊我以 sakana-gcp 為例子
輸入 sakana-gcp

然後是建立 bot 的使用者, 必須以 bot 結尾

我這邊以 sakana_gcp_bot 為例
輸入 sakana_gcp_bot
  • 這邊的命名規則不給輸入 - , 所以我用底線

建立完成會給 bot 的 HTTP API TOKEN

  • Bot 名稱( 顯示名稱 ): sakana-gcp
  • Bot 使用者名稱(帳號): sakana_gcp_bot

接下來觀察 bot 是否可以加入群組

輸入 /setjoingroups
  • 預設是 Enable, 就是 bot 可以被加入群組
  • 如果被要求輸入 bot , 要輸入的是 bot 使用者名稱, @sakana_gcp_bot 

建立 Group

搜尋剛剛建立的 bot
點選 sakana-gcp , 點選其他要加入的人, 例如自己


接下來檢查是否可以查到已經加入群組的資訊, 以及 Group ID

使用 curl 指令 針對 bot 查詢資訊
> curl  https://api.telegram.org/botYOUR_TOKEN/getUpdates


  • 這邊的 YOUR_TOKEN 就是剛剛 @botfather 給的 TOKEN

  • 如果result 是空的, 就把 bot 從群組踢出去再加入一次, 再試試看

從資料中取得 Group Chat ID

使用 curl 確認是否可以用這個 Group Chat ID 發送訊息

>curl  -X  POST  "https://api.telegram.org/botYOUR_TOKEN/sendMessage"   -d "chat_id=YOUR_CHAT_ID&text=my sample text"

  • -X 是 request , -d 是 data
    • 注意雙引號各把 host 以及 data 內容標示住


Cloudfunction 部分

使用 container 方式來建立相關程式
  • 要有 npm 套件, 等等在 container 內建立, 不影響自己環境

> docker  run  -v  ~/.aws:/root/.aws  -v  ~/.azure:/root/.azure  -v ~/.config/gcloud:/root/.config/gcloud  -it  sakana/ansible_opensuse151  /bin/bash

==== 在 contaienr 內 ( openSUSE Leap 15.1 with ansible and cloud tools ) ====

安裝 npm
# zypper  install  npm

Loading repository data...
Reading installed packages...
'npm' not found in package names. Trying capabilities.
Resolving package dependencies...

The following 8 NEW packages are going to be installed:
  libicu60_2 libicu60_2-ledata nodejs-common nodejs10 nodejs10-devel npm10 system-user-nobody timezone

8 new packages to install.
Overall download size: 17.8 MiB. Already cached: 0 B. After the operation, additional 71.0 MiB will be used.
Continue? [y/n/v/...? shows all options] (y): y

建立 telegram 目錄
# mkdir  telegram

進入 telegram 目錄
# cd  telegram

建立 index.js

# vi   index.js

const axios = require('axios');
// replace the value below with the Telegram token you receive from @BotFather
const token = '[YOUR_TOKEN]';
const chatId ='[YOUR_CHAT_ID]';
const url = `https://api.telegram.org/bot${token}/sendMessage`;
function sendMessage(msg) {
  return axios.post(url, {
   chat_id: chatId,
   text: msg,
exports.trigger = (req, res) => {
 const incident = req.body.incident;
 const policy = incident.policy_name;
 const cond = incident.condition_name;
 const state = incident.state;
 const url = incident.url;
 const msg = `${policy} ${cond} is ${state}, please check ${url}`
 .then(function (response) {
   console.error('invoke telegram');
   res.send({ status: 'OK'});
.catch(function (error) {

執行 npm init , 全都按照預設值

# npm  init

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (telegram) 
version: (1.0.0) 
entry point: (index.js) 
test command: 
git repository: 
license: (ISC) 
About to write to /telegram/package.json:

  "name": "telegram",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  "author": "",
  "license": "ISC"

Is this OK? (yes)  Y

安裝 axios 

# npm install axios

npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN telegram@1.0.0 No description
npm WARN telegram@1.0.0 No repository field.

+ axios@0.19.0
added 5 packages

22 November, 2019

Michael Meeks: 2019-11-22 Friday.

21:00 UTCmember

  • Mail chew; admin, calls, some patch review & merging. J.N.M.E. out to Ikea for a shopping binge.


openSUSE Tumbleweed es una distribución “Rolling Release” de actualización contínua. Aquí puedes estar al tanto de las últimas novedades.


openSUSE Tumbleweed es la versión “rolling release” o de actualización continua de la distribución de GNU/Linux openSUSE.

Hagamos un repaso a las novedades que han llegado hasta los repositorios estas semanas.

El anuncio original lo puedes leer en el blog de Dominique Leuenberger, publicado bajo licencia CC-by-sa, en este enlace:

Aunque durante esta semana el test openQA ha bloqueado algunas “snapshots” se han publicado 3 unevas “snapshots” (1116, 1118 y 1119),  que entre muchos otros cambios se pueden destacar:

  • Mesa 19.2.4
  • Linux kernel 5.3.11
  • KDE Plasma 5.17.3
  • Subversion 1.13.0
  • binutils 2.33.1

Y muchas otras cosas en las que se están trabajando para próximas “snapshots”, como por ejemplo:

  • openssl 1.1.1d: formará parte de la “snapshot” 1121
  • rpm 4.15.0
  • Python 3.8
  • Rust 1.39.0
  • Perl 5.30.1
  • libxml 2.9.10

Si quieres estar a la última con software actualizado y probado utiliza openSUSE Tumbleweed la opción rolling release de la distribución de GNU/Linux openSUSE.

Mantente actualizado y ya sabes: Have a lot of fun!!

Enlaces de interés




Dear Tumbleweed users and hackers,

Another week, in which openQA did block some of the snapshots – and some issues it was unfortunately not able to see. Anyway, during the week 2019/47 we have released three snapshot into the wild (1116, 1118 and 1119), containing those changes:

  • Mesa 19.2.4: fixes critical rendering issues from earlier Mesa 19.2.3. As this rendering issue did not happen on all graphics adapters, openQA had no chance of spotting it
  • Linux kernel 5.3.11
  • KDE Plasma 5.17.3
  • Subversion 1.13.0
  • binutils 2.33.1

The things being worked on include:

  • openssl 1.1.1d: will be part of snapshot 1121 and later)
  • rpm 4.15.0: the new python dependency generator is nasty, as it adds much more dependencies that were the before (probably a good thing), exposing new build cycles
  • Python 3.8
  • Rust 1.39.0: break Firefox and Thunderbird so far
  • Perl 5.30.1
  • libxml 2.9.10: breaks perl-XML-LibXSLT (on i586 only, invalid free() )


A More User Friendly Role Selector Dialog

Step by step, we continue improving the user experience making use of the newly added widgets to libyui. This sprint was the turn to update the role selection dialog to use the new item selector introduced during the sprint 87. Apart from looking better as it can be seen in the screenshots below, there are two immediate improvements:

  • the vertical scroll, when present, is respected after selecting a role (instead of “jumping to the beginning”), and
  • the selected role (if any) will be visible when arriving at the dialog even when the list is quite long or the available space too short.
Before After

What is more, updating the dialog was also useful for us to realize about some needed improvements for the widget itself, mentioned in the next section. Quite a productive change 🙂

When one Bit is not Enough: The CustomStatusItemSelector

A few weeks ago, we wrote about the new ItemSelector widget that is finding its way into YaST user interfaces. It turned out that just a simple on/off status is not enough in some cases, so we had to extend that concept. For example, software modules may have dependencies, and we want to show the difference between one that was explicitly selected by the user and one that was auto-selected because some other software module requires it.

This kind of shook the foundations of the underlying classes; all of a sudden a bit is no longer just a bit, but it needs to be broken down into even smaller pieces. Well, we cheated; we now use integer values instead. Most of the class hierarchy still only uses 0 and 1, but the new YCustomStatusItemSelector also supports using higher numbers for application-defined purposes.

For each possible status value, the application defines the name of the icon to be displayed (for graphical UIs like the Qt UI), the text equivalent (for text mode / the NCurses UI), and an optional nextStatus which tells the widget what status to cycle to when the user changes the status of an item with a mouse click or with the keyboard. A value of -1 lets the application handle this.

So this is not a one-trick-pony that is useful only for that one use case (the software modules), but a generic tool that might find good uses in other places all over YaST as well.

Usage examples: C++, Ruby.

Snapper and Machine-readable Output

Most likely you already know snapper, a great tool to work with your filesystem snapshots. Some third-party scripts and tools (e.g., YaST) use the snapper CLI to get some information, but generally, snapper generates an output intended to be human-readable. Sometimes that could cause some


Το πρόγραμμα εγκατάστασης του YaST του openSUSE δημιουργεί μια λεπτομερή ρύθμιση παραμέτρων του συστήματος αρχείων btrfs root που έχει σχεδιαστεί για να είναι ευέλικτη και ασφαλής, ενώ εξακολουθεί να είναι αποτελεσματική όταν χρησιμοποιείται με εργαλεία όπως το Snapper.

Μια από τις επιτακτικές απαιτήσεις είναι να παράσχει ένα σαφώς καθορισμένο «σύστημα αρχείων root» που περιέχει ότι μας νοιάζει για «πλήρη επαναφορά συστήματος» (διευκολύνεται από το snapper), ενώ χρησιμοποιεί υποτόμους (subvolumes) για να αποκλείσει όλα όσα δεν θέλουμε στο 'σύστημα αρχείων root', έτσι το snapper δεν καταστρέφει κατά λάθος τα δεδομένα χρήστη κατά την επαναφορά του συστήματος και των εφαρμογών του. Λεπτομέρειες σχετικά με την προεπιλεγμένη διάταξη υποτόμων (subvolumes) μπορούν να βρεθούν στο wiki του openSUSE.

Ωστόσο, αυτό οδηγεί σε επιπλοκές για ορισμένους προχωρημένους χρήστες που επιθυμούν να αναδημιουργήσουν αυτό το χέρι, όπως όταν κάνουν περίπλοκη ανάκτηση του συστήματος, προσαρμοσμένες αυτοματοποιημένες προβλέψεις ή άλλες παρεμβάσεις. (ΣΗΜΕΙΩΣΗ: για την πλήρη επαναφορά του συστήματος είναι συχνά καλύτερο να χρησιμοποιήσετε ένα εργαλείο όπως το ReaR).

Τα παρακάτω βήματα είναι τα βήματα για να δημιουργήσετε με μη αυτόματο τρόπο ένα διαμέρισμα btrfs όπως δημιουργείται με openSUSE που πιστεύεται ότι είναι σωστό αυτή τη στιγμή.

Αυτός ο οδηγός ισχύει για το openSUSE Tumbleweed, το openSUSE Leap 15.1. Ωστόσο, θα πρέπει να προσέξετε να κάνετε διπλό έλεγχο για νέους ή καταργημένους υποτόμους στις διανομές *SUSE καθώς υπάρχει ανάπτυξη.

Οι παλαιότερες εκδόσεις των διανομών SUSE θα πρέπει να προσαρμόσουν αυτές τις οδηγίες για να χειριστούν την παλιά διάταξη υποτόμου /var/* που χρησιμοποιήθηκε προηγουμένως.

Δεν πρέπει να ξεχνάμε ότι αυτός ο οδηγός θα πρέπει να ακολουθείται μόνο από ανθρώπους που πιστεύουν ότι γνωρίζουν τι κάνουν. Είναι συνήθως πολύ πιο εύκολο να χρησιμοποιήσετε τα προεπιλεγμένα εργαλεία του openSUSE όπως το YaST και το ReaR.


Για αυτό το παράδειγμα θα χρησιμοποιήσουμε το /dev/sda ως δείγμα του δίσκου μας και το /dev/sda1 ως το παράδειγμα του διαμερίσματός μας για ένα σύστημα αρχείων root btrfs.

1. Δημιουργήστε έναν πίνακα διαμερισμάτων και το διαμέρισμα που θα χρησιμοποιηθεί ως το σύστημα αρχείων root χρησιμοποιώντας το αγαπημένο σας εργαλείο (π.χ., yast, parted, fdisk).

2. Διαμορφώστε το /dev/sda1 με σύστημα αρχείων btrfs

mkfs.btrfs /dev/sda1

3. Προσαρτήστε το νέο διαμέρισμα κάπου έτσι ώστε να μπορέσουμε να το χρησιμοποιήσουμε. Θα χρησιμοποιήσουμε /mnt σε αυτό το παράδειγμα.

mount /dev/sda1 /mnt

4. Δημιουργήστε την προεπιλεγμένη διάταξη υποτόμου (αυτό προϋποθέτει αρχιτεκτονική Intel, οι διαδρομές /boot/grub2/* είναι διαφορετικές για διαφορετικές αρχιτεκτονικές)

btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@/.snapshots
mkdir /mnt/@/.snapshots/1
btrfs subvolume create /mnt/@/.snapshots/1/snapshot
mkdir -p /mnt/@/boot/grub2/
btrfs subvolume create /mnt/@/boot/grub2/i386-pc
btrfs subvolume create /mnt/@/boot/grub2/x86_64-efi
btrfs subvolume create /mnt/@/home
btrfs subvolume create /mnt/@/opt
btrfs subvoulme create /mnt/@/root
btrfs subvolume create /mnt/@/srv
btrfs subvolume create /mnt/@/tmp
mkdir /mnt/@/usr/
btrfs subvolume create /mnt/@/usr/local
btrfs subvolume create /mnt/@/var

5. Απενεργοποιήστε το copy-on-write για το var για να βελτιώσετε την απόδοση οποιωνδήποτε βάσεων δεδομένων και των VM εικόνων μέσα

chattr +C /mnt/@/var

6. Δημιουργήστε το αρχείο /mnt/@/.snapshots/1/info.xml για τη ρύθμιση του snapper. Συμπεριλάβετε το ακόλουθο περιεχόμενο, αντικαθιστώντας το $DATE με την τρέχουσα ημερομηνία/ώρα του συστήματος.

<?xml version="1.0"?>
<description>first root filesystem</description>

7. Ορίστε το στιγμιότυπο 1 ως προεπιλεγμένο στιγμιότυπο για το σύστημα αρχείων root, αποπροσαρτήστε το και προσαρτήστε ξανά.

btrfs subvolume set-default $(btrfs subvolume list /mnt | grep "@/.snapshots/1/snapshot" | grep -oP '(?<=ID )[0-9]+') /mnt unmount /mnt mount /dev/sda1 /mnt

8. Θα πρέπει να είστε σε θέση να επιβεβαιώσετε τα παραπάνω που λειτούργησε με την εντολή ls /mnt που θα πρέπει να ανταποκριθεί με ένα κενό αποτέλεσμα.

Συγχαρητήρια, σε αυτό το σημείο το σύστημα αρχείων δημιουργείται με τη σωστή δομή. Αλλά πρέπει να ξέρετε πώς να το προσαρτήσετε σωστά για να το χρησιμοποιήσετε.

9. Τώρα πρέπει να δημιουργήσετε ένα σκελετό του συστήματος αρχείων για να προσαρτήσετε όλους τους υποτόμους.

mkdir /mnt/.snapshots
mkdir -p /mnt/boot/grub2/i386-pc
mkdir -p /mnt/boot/grub2/x86_64-efi
mkdir /mnt/home
mkdir /mnt/opt
mkdir /mnt/root
mkdir /mnt/srv
mkdir /mnt/tmp
mkdir -p /mnt/usr/local
mkdir /mnt/var

10. Προσαρτήστε όλους τους υποτόμους.

mount /dev/sda1 /mnt/.snapshots -o subvol=@/.snapshots
mount /dev/sda1 /mnt/boot/grub2/i386-pc -o subvol=@/boot/grub2/i386-pc
mount /dev/sda1 /mnt/boot/grub2/x86_64-efi -o subvol=@/boot/grub2/x86_64-efi
mount /dev/sda1 /mnt/home -o subvol=@/home
mount /dev/sda1 /mnt/opt -o subvol=@/opt
mount /dev/sda1 /mnt/root -o subvol=@/root
mount /dev/sda1 /mnt/srv -o subvol=@/srv
mount /dev/sda1 /mnt/tmp -o subvol=@/tmp
mount /dev/sda1 /mnt/usr/local -o subvol=@/usr/local
mount /dev/sda1 /mnt/var -o subvol=@/var

11. Έχετε τελειώσει, τώρα έχετε δημιουργήσει με επιτυχία μια brtfs δομή συστήματος αρχείων τύπου root και κάνατε προσάρτηση έτοιμη για χρήση. Τώρα μπορείτε να το χρησιμοποιήσετε για ότι θέλετε, όπως η χειροκίνητη μεταφορά αρχείων από μια υπάρχουσα εγκατάσταση του openSUSE.

Μόλις συμπληρωθεί, πρέπει να ληφθεί μέριμνα ώστε το αρχείο /mnt/etc/fstab να περιλαμβάνει επίσης τις κατάλληλες καταχωρήσεις για κάθε ένα από τους υποτόμους εκτός από τα στιγμιότυπα @/.snapshots/1/snapshot που δεν θα πρέπει να προσαρτηθούν όπως παρέχει το αρχικά εγκατεστημένο σύστημα.

Εάν αντιμετωπίσετε κάποιο πρόβλημα, μπορείτε να επικοινωνήσετε με το forum (Αγγλικά) ή στο Facebook (Ελληνικά).

21 November, 2019


Di Falkon, fitur untuk menyembunyikan Tab Toolbar ada dalam pengaturan. Yaitu pada bagian Tabs >> Tabs behaviour >> Hide tabs when there is only one tab. Saat pengaturan ini dicentang, Tab Toolbar akan menghilang jika hanya ada satu tab aktif. Jika ada lebih dari satu, maka otomatis Tab Toolbar akan muncul.

Di Firefox, pengaturan ini tidak tersedia. Tapi kita bisa mengakalinya dengan membuat berkas pengaturan khusus.

Caranya, di folder profil Firefox, yang biasanya ada di ~/.mozilla/firefox/<nama_profil>, buat sebuah folder dengan nama chrome. Buat sebuah berkas di dalam folder tersebut dengan nama userChrome.css. Isi berkas tersebut dengan:

#tabbrowser-tabs, #tabbrowser-tabs arrowscrollbox { min-height: 0 !important; }
#tabbrowser-tabs tab { height: var(--tab-min-height); }
#tabbrowser-tabs tab:first-of-type:last-of-type { display: none !important; }

Setelah file tersebut dibuat, buka Firefox. Ketik about:config di address bar, klik I accept the risk! Cari toolkit.legacyUserProfileCustomizations.stylesheets dan ubah Value menjadi true dengan cara klik kanan dan pilih toggle.

Setelah mengubah konfigurasi, buka Menu >> Customize… Pindahkan ikon New Tab ke tempat lain, lalu klik Done

Selesai, jalankan ulang Firefox untuk melihat hasilnya.

Michael Meeks: 2019-11-21 Thursday.

21:00 UTCmember

  • Mail chew, debugging, moved flights, demo preparation. Presented to the team, lots of positive feedback. More code cleanup, train, flight, drive home - lovely to see the family again.


Procédure pour créer une VM sur la FreeBox Delta Vous êtes détenteur d’une FreeBox, type Delta? Vous êtes un peu un Geek, voire un Super Geek ou un Gourou comme moi ? Ignorons la modestie pour un moment et mettons nous dans la peau de quelqu’un/e qui veut utiliser sa FreeBox à 100%. Freebox Delta […]

The post #Rouen #Journée Mensuelle du #Logiciel Libre et de la #cybersécurité Samedi 30 Novembre, 2019 – #openSUSE en VM #FreeBox #QEMU appeared first on Network Users Institute - Cybersécurité, Intégration de Linux & Logiciels Libres à Rouen, Normandie..


Boletín de noticias relacionadas con el software libre publicado por la Free Software Foundation.

¡El boletín de noticias de la FSF está aquí!

La Free Software Foundation (FSF) es una organización creada en Octubre de 1985 por Richard Stallman y otros entusiastas del software libre con el propósito de difundir esta filosofía.

La Fundación para el software libre (FSF) se dedica a eliminar las restricciones sobre la copia, redistribución, entendimiento, y modificación de programas de computadoras. Con este objeto, promociona el desarrollo y uso del software libre en todas las áreas de la computación, pero muy particularmente, ayudando a desarrollar el sistema operativo GNU.

Además de tratar de difundir la filosofía del software libre, y de crear licencias que permitan la difusión de obras y conservando los derechos de autorías, también llevan a cabo diversas campañas de concienciación y para proteger derechos de los usuarios frentes a aquellos que quieren poner restricciones abusivas en cuestiones tecnológicas.

Mensualmente publican un boletín (supporter) con noticias relacionadas con el software libre, sus campañas, o eventos. Una forma de difundir los proyectos, para que la gente conozca los hechos, se haga su propia opinión, y tomen partido si creen que la reivindicación es justa!!


Puedes ver todos los números publicados en este enlace: http://www.fsf.org/free-software-supporter/free-software-supporter

¿Te gustaría aportar tu ayuda en la traducción? Lee el siguiente enlace:

Por aquí te traigo un extracto de algunas de las noticias que ha destacado la FSF este mes de noviembre de 2019


Del 6 de octubre

La FSF y el proyecto GNU fueron iniciados por Richard M. Stallman (RMS) y el ejerció como el director de ambas entidades. Es por eso que la relación entre la FSF y GNU has sido fluida.

Como parte de nuestro compromiso en soportar el desarrollo y la distribución de sistemas operativos completamente libres, la FSF provee GNU con servicios como patrocinio fiscal, infraestructura técnica, promoción, comisión de derechos de autor y administración de voluntarios.

La toma de decisiones en la GNU ha estado ampliamente en las manos de los directores de la GNU (“Chief GNUisance”), la FSF esta trabajando ahora con los líderes de la GNU en un entendimiento conjunto de la relación a futuro. Como parte de eso, estamos invitando a realizar comentarios desde la comunidad de software libre a <fsf-and-gnu@fsf.org>

Los líderes de GNU han publicado una declaración La dirección de contacto para enviar los comentarios a GNU es <gnu-and-fsf@gnu.org>. Los mensajes enviados a <fsf-and-gnu@fsf.org> y <gnu-and-fsf@gnu.org> serán


When starting a WSL distribution for the first time, a text prompt for user name and password appears:

The code for that is partially in the Windows launcher. The Windows side actually prompts for the user name:

and passes it to ‘adduser’:

That seems to be a Debian specific tool that also prompts for a password. We don’t have it in openSUSE. When done, the Windows part actually calls into the Linux environment again with ‘id -u’ to get the uid of the added user:

So in order to also prompt for the password we’d have to write a wrapper like the Debian one or implement another prompt in the launcher. Implementing such a prompt in Windows code seems boring to me. When writing a wrapper, I’d do something dialog based to make it look more fancy. There’s already jeos-firstboot that does something similar already and more. But then the WSL image doesn’t have to be really minimal, which means we have YaST!

So even though WSL doesn’t really boot as it has no systemd it would be still possible to run the YaST firstboot wizard on first start. What modules it launches is configurable via xml file. So leaving out hardware/VM specific things like network configuration it works pretty well:

For the launcher to know the name of the created user a small YaST module was needed to write the name into /run/wsl_firstboot_uid. The launcher fetches it from there.

Using the YaST firstboot wizard also allows to use e.g. the existing registration dialogs on SLE or add other useful configuration steps. One feature I have in mind would be for example is the role selection screen to offer some pre defined package selections for WSL use cases.

Tumbleweed and Leap appx files to test this are available from download.opensuse.org. Keep in mind that one needs to import the certificates used by OBS for signing first.

20 November, 2019

Michael Meeks: 2019-11-20 Wednesday.

21:00 UTCmember

  • Plugged away at proof, patch review, and locking investigation. With a WOPI implementation, it is a little suprising to see 'unlock' do the actual checkin, and not the PutFile; hey ho.
  • Out to visit Cor & Gerlinde in the evening at their lovely new home & enjoy some Vegan food.


El servicio ProtonVPN ha publicado una nueva versión de su cliente para conectarse a sus VPN para sistemas GNU/Linux. Completamente reescrito en Python

En el blog ya has podido leer tutoriales sobre cómo conectarnos a ProtonVPN mediante OpenVPN o NetworkManager de forma sencilla.

Ahora además, han publicado la versión 2.0 de su cliente para la línea de comandos de sistemas GNU/Linux reescrito completamente en Python y publicado bajo licencia GPL 3.0

Esta nueva versión, es más rápida y más ligera y también gana en estabilidad. Además el código es más sencillo de mantener y ofrece una experiencia de usuario más robusta. Este nuevo cliente ha sido creado por el usuario Rafficer.

Para instalarlo tal como explican en la documentación oficial, deberemos resolver las dependencias necesarias, y después instalarlo mediante el gestor de paquetes pip de Python, con el comando:

sudo pip3 install protonvpn-cli

Una vez instalado el paquete, lo primero que deberemos hacer es configurar nuestra cuenta con ProtonVPN indicando nuestro nombre de usuario y contraseña y seleccionar el plan que tenemos (en mi caso el gratuito)

Así que antes de nada, para configurar esas credenciales deberemos ejecutar:

sudo protonvpn init

La mayoría de los comandos necesarios para conectarnos o configurar la aplicación necesitarán de privilegios de “root”. Otros de información no será necesario.

Después de configurar nuestras credenciales y cuenta, podremos conectarnos a los servidores VPN disponibles para nuestra cuenta. Para ello echaremos un vistazo a los comandos disponibles.

Una vez conectado al servicor VPN que queramos podemos comprobar que estamos bien conectados mediante el comando:

protonvpn status

Y si queremos modificar alguna configuración de la cuenta o de las opciones, siempre podremos hacerlo mediante el comando:

protonvpn configure

Yo ya lo he instalado y lo estoy probando en mi equipo. De momento ningún problema y es sencillo de utilizar. Es una buena herramienta para eludir censura gubernamental o para proteger tu privacidad rastreos corporativos.

Imagen: Ondiz Zárraga

19 November, 2019

Michael Meeks: 2019-11-19 Tuesday.

21:00 UTCmember

  • Wrestled VMs, authentication, firewalls & so on to get some code building & the first interesting integration errors to arrive. Somehow, after suffering Javascript for some years, Java seems amazingly beautiful (in comparison) - curious.
  • Curious at the idea of research aroud empathy being weaponized to polarize and de-rationalize arguments; some people won't think. Perhaps ironic that a leading envionmental & children's advocate of the moment is an Autist - an interesting world.


CSS length values have a number and a unit, e.g. 5cm or 6px. Sometimes the unit is a percentage, like 50%, and SVG says that lengths with percentage units should be resolved with respect to a certain rectangle. For example, consider this circle element:

<circle cx="50%" cy="75%" r="4px" fill="black"/>

This means, draw a solid black circle whose center is at 50% of the width and 75% of the height of the current viewport. The circle should have a 4-pixel radius.

The process of converting that kind of units into absolute pixels for the final drawing is called normalization. In SVG, percentage units sometimes need to be normalized with respect to the current viewport (a local coordinate system), or with respect to the size of another object (e.g. when a clipping path is used to cut the current shape in half).

One detail about normalization is that it can be with respect to the horizontal dimension of the current viewport, the vertical dimension, or both. Keep this in mind: at normalization time, we need to be able to distinguish between those three modes.

The original C version

I have talked about the original C code for lengths before; the following is a small summary.

The original C code had this struct to represent lengths:

typedef struct {
    double length;
    char factor;
} RsvgLength;

The parsing code would set the factor field to a character depending on the length's unit: 'p' for percentages, 'i' for inches, etc., and '\0' for the default unit, which is pixels.

Along with that, the normalization code needed to know the direction (horizontal, vertical, both) to which the length in question refers. It did this by taking another character as an argument to the normalization function:

_rsvg_css_normalize_length (const RsvgLength * in, RsvgDrawingCtx * ctx, char dir)
    if (in->factor == '\0')            /* pixels, no need to normalize */
        return in->length;
    else if (in->factor == 'p') {      /* percentages; need to consider direction */
        if (dir == 'h')                                     /* horizontal */
            return in->length * ctx->vb.rect.width;
        if (dir == 'v')                                     /* vertical */
            return in->length * ctx->vb.rect.height;
        if (dir == 'o')                                     /* both */
            return in->length * rsvg_viewport_percentage (ctx->vb.rect.width,
    } else { ... }

The original post talks about how I found a couple of bugs with how the directions are identified at normalization time. The function above expects one of 'h'/'v'/'o' for horizontal/vertical/both, and one or two places in the code passed the wrong character.

Making the C version cleaner

Before converting that code to Rust, I removed the pesky characters and made the code use proper enums to identify a length's units.

+typedef enum {
+} LengthUnit;
 typedef struct {
     double length;
-    char factor;
+    LengthUnit unit;
 } RsvgLength;

Then, do the same for the normalization function, so it will get the direction in which to normalize as an enum instead of a char.

+typedef enum {
+} LengthDir;

-_rsvg_css_normalize_length (const RsvgLength * in, RsvgDrawingCtx * ctx, char dir)
+_rsvg_css_normalize_length (const 


Este es un pequeño script en Bash para generar un número deseado de contraseñas de una longitud deseada

En este mismo blog, hace un tiempo pudiste leer cómo generar contraseñas y comprobarlas mediante unas utilidades para la línea de comandos:

En este caso, se trata de un sencillo script en Bash para generar un número de contraseñas que queramos y de una longitud de caracteres que deseemos. Veamos cómo hacerlo…

Este artículo es una adaptación de un artículo en inglés escrito por Greg Pittman y publicado en la web opensource.com bajo licencia CC-by-sa

Lo primero es conseguir el código del script, que como veréis es muy sencillo. Está disponible en un snippet en GitLab, pero es el código que encontraréis a continuación:

#!/usr/bin/env sh


printf "\e[2J\e[H"
printf "\n* Generador de contraseñas * \n"
read -p "De qué longitud de caracteres quieres las contraseñas: " long
read -p "Cuantas contraseñas quieres generar: " cant
printf "\nGenerando %s contraseñas de %s caracteres \n" "$cant" "$long"

for ((n=0;n<$cant;n++)) do dd if=/dev/urandom count=1 2> /dev/null | uuencode -m - | sed -ne 2p | cut -c-$long


Puedes copiar el código, pegarlo en un archivo con extensión .sh y darle permisos de ejecución (chmod +x archivo.sh)

El funcionamiento es sencillo. Preguntamos la cantidad de caracteres por contraseña y el número de contraseñas a generar.

Después se generan bloques de datos aleatorios, y se pasan a caracteres que se puedan imprimir y que no sean caracteres de control. Se mezclan mayúsculas y minúsculas y se cortan a la medida de caracteres deseados.

Y se imprime la lista. Después escogemos la que mejor nos plazca y la pegamos en el servicio que deseemos. Después se pueden gestionar mediante pass y tenerlas sincronizadas mediante git

Me pareció interesante darle más flexibilidad al script, haciendo que este pregunte información al usuario. ¿Qué te ha parecido?

18 November, 2019


When I first started to put fingers to keyboard with this “CubicleNate.com” thing, I didn’t ever envision it become much of anything. Just a little tool to help keep my notes somewhat organized and hope that I could provide some kind of resource to someone at some point. In late 2018, I joined the Big Daddy Linux Live community, appearing frequently on the weekly “LUG” meetings and making many new e-friends that challenged me to expand my knowledge of Linux and open source software. This has given me new things to play with and write about in Linux.

I started to produce some video content on YouTube and this site to enhance some of my content and later, I thought I would cut my teeth on a podcast of my own to talk about the nerdy things I enjoy. My reoccurring topics consist of my additional thoughts about a subject or two of the last BDLL show and an openSUSE corner but truth be told, openSUSE weaves itself throughout my “noodlings”.

In September of 2019, the formation of Destination Linux Network was announced where these well established content creators have pooled their resources to draw together their somewhat discrete communities and provide a forum for interaction in greater depth than what Telegram, Discord or YouTube can provide on their own.

As part of the launch of this new Destination Linux Network, I was asked if I was interested in starting a podcast with one Eric Adams. My immediate reaction was an absolute and resounding, “yes” to which I have no regret. The podcast is called “DLN Xtend” where we discuss a part of some of the other shows in greater depth with our own perspectives and slant on the subject. It has been loads of fun to do and I hope to continue to be a part of this as well as the Destination Linux Network for years to come.

Additionally, and not directly related, I have been able to join Dave and Yannick one of my new favorite podcasts, “Tea, Earl Grey Hot“, an unofficial Star Trek fan podcast as well as the “Ask Noah Show” where we discussed some of the merits of Microsoft and their contributions to the open source software movement.

It has been a fun ride that had has lead me to some new and interesting opportunities, not only am I blessed with being able to interact with some of the most interesting minds in Linux and open source software but it has opened up doors with other tangentially related topics.

Michael Meeks: 2019-11-18 Monday.

21:00 UTCmember

  • Up unfeasibly early, drove to Stansted, flight to Amsterdam, trains to Apeldoorn, customer visit. Met the team, got hardware setup rather slowly.

17 November, 2019

Michael Meeks: 2019-11-17 Sunday.

21:00 UTCmember

  • All Saints in the morning; lunch, slugged & did some quartet practice & planning for Demetia Concert coming soon. Out for a lovely tea & watching American Football with Laura & Tyler.

16 November, 2019

Michael Meeks: 2019-11-16 Saturday.

21:00 UTCmember

  • Off to Sue & Clive's for some fine food, a wander across scenic but muddy fields in the evening, a nice fire, fireworks and fun with the cousins. Drove back late.


openSUSE Tumbleweed es una distribución “Rolling Release” de actualización contínua. Aquí puedes estar al tanto de las últimas novedades.


openSUSE Tumbleweed es la versión “rolling release” o de actualización continua de la distribución de GNU/Linux openSUSE.

Hagamos un repaso a las novedades que han llegado hasta los repositorios estas semanas.

El anuncio original lo puedes leer en el blog de Dominique Leuenberger, publicado bajo licencia CC-by-sa, en este enlace:

La semana pasada ha sido intensa, ya que se han publicado 5 nuevas “snapshots” (1107, 1109, 1110, 1111 y 1112). Los cambios más notables que han traído hasta los repositorios son:

  • git 2.24.0
  • Mesa 19.2.3
  • gimp 2.10.14
  • Linux kernel 5.3.9
  • libvirt 5.9.0
  • KDE Applications 19.08.3
  • KDE Frameworks 5.64.0

Y entre la lista de próximos paquetes actualizados en próximas “snapshots” podemos encontrar:

  • rpm 4.15.0
  • Python 3.8
  • openssl 1.1.1d
  • Linux kernel 5.3.11+
  • KDE Plasma 5.17.3
  • Rust 1.39.0: de momento esta versión tiene incompatibilidades con Firefox y Thunderbird

Si quieres estar a la última con software actualizado y probado utiliza openSUSE Tumbleweed la opción rolling release de la distribución de GNU/Linux openSUSE.

Mantente actualizado y ya sabes: Have a lot of fun!!

Enlaces de interés



15 November, 2019


Dear Tumbleweed users and hackers,

This has been a busy week, with 5 successfully tested snapshots delivered to you, the users (1107, 1109, 1110, 1111 and 1112). The main updates/changes there include:

  • git 2.24.0
  • Mesa 19.2.3
  • gimp 2.10.14
  • Linux kernel 5.3.9
  • libvirt 5.9.0
  • KDE Applications 19.08.3
  • KDE FRameworks 5.64.0

The list of things on the todo is in big parts unchanged and the stagings contain these major updates:

  • rpm 4.15.0: the new python dependency generator is nasty, as it adds much more deps that were the before (probablu a good thing), exposing new build cycles
  • Python 3.8
  • openssl 1.1.1d
  • Linux kernel 5.3.11+
  • KDE Plasma 5.17.3
  • Rust 1.39.0: break Firefox and Thunderbird so far

Michael Meeks: 2019-11-15 Friday.

21:00 UTCmember

  • Mail, sales & marketing call, partner call, customer call. Tried to upgrade my BIOS: already updated, followed the helpful instructions from Benjmain Tissoires - as far as I could on debugging input problems; evemu-record suggests the kernel is missing events - hmm. Poked at hid tools unsuccessfuly.
  • Cleaned up text input javascript, added some remote controlled JS protocol debugging too.

<- Current blog entries