<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Emacs on Ἀθανάσιος Α.</title>
    <link>https://thanosapollo.org/el/tags/emacs/</link>
    <description>Recent content in Emacs on Ἀθανάσιος Α.</description>
    <generator>Hugo</generator>
    <language>el</language>
    <lastBuildDate>Thu, 05 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://thanosapollo.org/el/tags/emacs/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Σημειώσεις ἔκδοσης Gnosis 0.8.0</title>
      <link>https://thanosapollo.org/el/posts/gnosis-version-0-8-0/</link>
      <pubDate>Thu, 05 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/el/posts/gnosis-version-0-8-0/</guid>
      <description>Ἐπισκόπηση ἔκδοσης Gnosis 0.8.0</description>
      <content:encoded><![CDATA[<p>Χαίρομαι νὰ ἀνακοινώσω τὴν ἔκδοση 0.8.0 γιὰ τὸ
<a href="/el/projects/gnosis/">gnosis</a>.</p>
<p>Ἐπιτέλους αὐτὸ τὸ ἔργο ἐξελίσσεται στὸ <em>«ὅλα σὲ ἕνα»</em> σύστημα γνώσης
ποὺ εἶχα φανταστεῖ.  Αὐτὴ ἡ ἔκδοση ἐπιτρέπει προβολὴ συνδεδεμένων
κόμβων τοῦ <code>org-gnosis</code> καὶ τῶν συνδεδεμένων themata τους σὲ
tabulated-list μέσω τοῦ <code>gnosis-dashboard</code> μὲ ἐξαιρετικὴ ἐπίδοση.</p>
<p>Δὲν χρειάζονται πιὰ ἐξωτερικοὶ περιηγητὲς γιὰ νὰ βλέπω τὴ συλλογή μου.
Αὐτὸ σημαίνει ὅτι τὸ ἔργο <code>org-gnosis-ui</code> θὰ πρέπει νὰ θεωρεῖται
παρωχημένο.  Ὅλες οἱ λειτουργίες μποροῦν τώρα νὰ γίνουν ἐντὸς Ἤμαξ.</p>
<p>Ἐπιπλέον, ἔχω δημοσιεύσει ἕνα <code>gnosis-deck</code> εἰδικὰ σχεδιασμένο γιὰ
συναδέλφους φοιτητὲς ἰατρικῆς, ὀνομαζόμενο
<a href="https://codeberg.org/thanosapollo/gnosis-unking">Unking</a>, βασισμένο
στὴν <strong>τελευταία δωρεὰν ἔκδοση</strong> τοῦ
<a href="https://www.ankihub.net/step-deck">Anking deck</a>, Anking V11.  Αὐτὸ τὸ
deck εἶναι ἀρκετὰ περιεκτικό, μὲ πάνω ἀπὸ 40.000 themata.</p>
<p>Καθὼς τὸ Gnosis ἤδη ἐκπληρώνει τὶς ἀρχικές μου προθέσεις καὶ πέρα, ἡ
περαιτέρω ἀνάπτυξη θὰ ἐστιαστεῖ κυρίως σὲ διορθώσεις σφαλμάτων καὶ γενικὴ
συντήρηση παρὰ σὲ νέα μεγάλα χαρακτηριστικά.  Ἡ προτεραιότητά μου τώρα
θὰ μετατοπιστεῖ πρὸς τὴ χρήση τοῦ συστήματος γιὰ τὶς ἐξετάσεις μου
παρὰ πρὸς τὴ συνέχιση ἐνεργῆς ἀνάπτυξης.</p>
<p>Ὑπῆρξε πραγματικὰ εὐχάριστο καὶ ἀνταποδοτικὸ νὰ δουλεύω σὲ αὐτὸ τὸ
ἔργο.  Ὁ στόχος μου γιὰ νὰ μάθω προγραμματισμὸ ἦταν νὰ φτιάξω ἕνα
σύστημα γνώσης καὶ νὰ μὴν βασίζομαι σὲ τρίτους γιὰ τὴ μελέτη μου.</p>
<p>Τὸ ὁποῖο ἐπιτέλους πέτυχα:) Αὐτὸ δὲν θὰ ἦταν δυνατὸ χωρὶς ὅλη τὴ δουλειὰ
ποὺ πολλοὶ ἀπὸ ἐσᾶς ἔχετε βάλει στὸ οἰκοσύστημα Ἤμαξ, ὁπότε ἁπλῶς
θέλω νὰ ἐκφράσω τὴν εἰλικρινῆ μου εὐγνωμοσύνη σὲ ὅλους σας, εὐχαριστῶ!</p>
<h2 id="νέα-χαρακτηριστικὰ">Νέα χαρακτηριστικὰ</h2>
<ul>
<li>Αὐτόματη ἀνίχνευση μεθόδου εἰσαγωγῆς: τὸ gnosis ἀνιχνεύει τὴ γραφὴ τῆς
ἀναμενόμενης ἀπάντησης (ἑλληνικά, κυριλλικά, κ.λπ.) καὶ ἐνεργοποιεῖ
τὴν κατάλληλη μέθοδο εἰσαγωγῆς κατὰ τὴν ἐπανάληψη.
Ρυθμίζεται μέσω <code>gnosis-script-input-method-alist</code>.</li>
<li>Ἀλλαγὴ τύπου thema καὶ deck μέσω <code>gnosis-update-thema</code>.</li>
<li>Ἐνέργεια μαζικῆς σύνδεσης τοῦ πίνακα γιὰ τὰ τρέχοντα ἐμφανιζόμενα themata.</li>
<li>Γραμμὴ κεφαλίδας πίνακα μὲ ἀριθμὸ καταχωρίσεων καὶ πλαίσιο.</li>
<li>Ἀσύγχρονη εἰσαγωγὴ deck μὲ <code>gnosis-import-deck-async</code>.</li>
<li>Δεῖγμα deck συμπεριλαμβάνεται στὸ <code>decks/demo.org</code>.</li>
</ul>
<h2 id="ἐπίδοση">Ἐπίδοση</h2>
<ul>
<li>Νέα μονάδα <code>gnosis-tl</code> ἀντικαθιστᾶ τὸ <code>tabulated-list-print</code> γιὰ
ἀπόδοση πίνακα (3-4x ταχύτερη).</li>
<li>Προοδευτικὴ ἀσύγχρονη ἀπόδοση γιὰ μεγάλους πίνακες.</li>
<li>Μαζικὴ ἀνάκτηση δεδομένων ἐπανάληψης ἀντὶ ἐρωτημάτων ἀνὰ thema.</li>
</ul>
<h2 id="διορθώσεις-σφαλμάτων">Διορθώσεις σφαλμάτων</h2>
<ul>
<li>Διόρθωση ὑπολογισμοῦ γεγονότος anagnosis στὸν ἀλγόριθμο.</li>
<li>Διόρθωση ἀφαίρεσης ἐτικέτας cloze γιὰ ἀκραῖες περιπτώσεις καὶ τύπο
mc-cloze.</li>
<li>Διόρθωση <code>vc-pull</code> νὰ τρέχει μεταπτώσεις βάσης δεδομένων μετὰ τὴ λήψη.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>(Βίντεο) Ἤμαξ Notmuch μὲ πολλαπλὲς διευθύνσεις &amp; αὐτόματη κρυπτογράφηση</title>
      <link>https://thanosapollo.org/el/posts/emacs-notmuch-video-guide/</link>
      <pubDate>Thu, 18 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/el/posts/emacs-notmuch-video-guide/</guid>
      <description>Ὁδηγὸς βίντεο γιὰ διαχείριση ἠλεκτρονικοῦ ταχυδρομείου μὲ Ἤμαξ, χρησιμοποιώντας notmuch &amp;amp; isync.</description>
      <content:encoded><![CDATA[<p>Αὐτὸς ὁ ὁδηγὸς παρέχει γρήγορη ρύθμιση γιὰ διαμόρφωση Notmuch μὲ GNU
Ἤμαξ γιὰ χειρισμὸ πολλαπλῶν διευθύνσεων ἠλεκτρονικοῦ ταχυδρομείου καὶ ἐνεργοποίηση
αὐτόματης κρυπτογράφησης.</p>
<p>Τὸ Notmuch ὑπῆρξε ἐξαιρετικὰ χρήσιμο γιὰ μένα τὸν περασμένο χρόνο, καὶ
ἐλπίζω αὐτὸς ὁ ὁδηγὸς νὰ βοηθήσει νέους χρήστες νὰ ξεπεράσουν τὰ ἀρχικὰ
ἐμπόδια.</p>
<center>
<p><i>Ἤμαξ Notmuch μὲ πολλαπλὲς διευθύνσεις καὶ αὐτόματη κρυπτογράφηση</i><p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/P42C5wEQK-Y?si=wbDx5y3zH5Wd23gE" title="Πρόγραμμα ἀναπαραγωγῆς βίντεο YouTube" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</center>
<blockquote>
<p>Σημειώσεις βίντεο:</p>
</blockquote>
<h2 id="σύνοψις">Σύνοψις</h2>
<ul>
<li>Ἐπίδειξη ροῆς ἐργασίας ἠλεκτρονικοῦ ταχυδρομείου Ἤμαξ μὲ <code>notmuch.el</code>.
<ul>
<li>Ἀποστολὴ μηνυμάτων ἀπὸ πολλαπλὲς διευθύνσεις, χρησιμοποιώντας <a href="%5C%2Asmtpmail">smtpmail</a>.</li>
<li>Αὐτόματη κρυπτογράφηση μηνυμάτων ἠλεκτρονικοῦ ταχυδρομείου, ἂν ὑπάρχει διαθέσιμο κλειδὶ pgp, χρησιμοποιώντας <a href="%5C%2Amml-sec">mml-sec</a>.</li>
</ul>
</li>
</ul>
<h2 id="γιατί-notmuch">Γιατί notmuch</h2>
<ul>
<li>Ἐνσωματωμένη ὑποστήριξη Ἤμαξ, μὲ <code>notmuch.el</code>.
<ul>
<li>Πακέτα ὅπως <a href="https://github.com/tarsius/ol-notmuch">ol-notmuch</a> φέρνουν ἐνσωμάτωση μὲ τὸ ὑπόλοιπο
οἰκοσύστημα Ἤμαξ.</li>
</ul>
</li>
<li>Τὸ Notmuch εἶναι <code>σύστημα βασισμένο σὲ ἐτικέτες</code>.  Δὲν βασίζεσαι
στὸν πάροχο ἠλεκτρονικοῦ ταχυδρομείου σου γιὰ κανόνες φίλτρων κ.λπ. γιὰ νὰ ὀργανώσεις
τὴν ἀλληλογραφία σου σὲ ξεχωριστὰ γραμματοκιβώτια.
<ul>
<li>Πράγμα ποὺ εἶναι ἀναποτελεσματικὸ ἐξαρχῆς ὅταν δουλεύεις μὲ
χιλιάδες++ μηνύματα ἠλεκτρονικοῦ ταχυδρομείου.</li>
<li>Αὐτὸ ἐπίσης κάνει εὐκολότερη τὴ μετάβαση σὲ νέο πάροχο ἠλεκτρονικοῦ ταχυδρομείου.</li>
</ul>
</li>
<li>Τοπικὴ ἀποθήκευση ἀλληλογραφίας.</li>
<li>Ἐξαιρετικὴ ἐπίδοση γιὰ φιλτράρισμα καὶ ἀναζήτηση μέσα ἀπὸ ἑκατοντάδες
χιλιάδες μηνύματα.</li>
</ul>
<h2 id="ὑποθέσεις-ποὺ-κάνω-γιὰ-αὐτὸ-τὸ-βίντεο">Ὑποθέσεις ποὺ κάνω γιὰ αὐτὸ τὸ βίντεο</h2>
<h3 id="ἔχεις-λειτουργικὴ-διαμόρφωση-ἤμαξ">Ἔχεις λειτουργικὴ διαμόρφωση Ἤμαξ</h3>
<h3 id="ὁ-πάροχος-ἠλεκτρονικοῦ-ταχυδρομείου-σου-ὑποστηρίζει-ἀνάκτηση-καὶ-ἀποστολὴ-ἀλληλογραφίας-μέσω-ἐφαρμογῶν-τρίτων">Ὁ πάροχος ἠλεκτρονικοῦ ταχυδρομείου σου ὑποστηρίζει ἀνάκτηση καὶ ἀποστολὴ ἀλληλογραφίας μέσω ἐφαρμογῶν τρίτων</h3>
<ul>
<li>Ἤδη ξέρεις πῶς νὰ ρυθμίσεις <code>isync/mbsync</code> γιὰ ἀνάκτηση μηνυμάτων ἠλεκτρονικοῦ ταχυδρομείου ἀπὸ
ἀπομακρυσμένο διακομιστή.</li>
<li>Ὁ πάροχος ἠλεκτρονικοῦ ταχυδρομείου σου προσφέρει διαπιστευτήρια <code>smtp</code> γιὰ χρήση
ἐφαρμογῶν τρίτων.
<ul>
<li>Προσωπικὰ συνιστῶ νὰ δοκιμάσεις τὸ <code>purelymail.com</code> <strong>κοστίζει
μόνο 10$/χρόνο καὶ προσφέρει καλὴ ὑπηρεσία</strong>.</li>
</ul>
</li>
</ul>
<p><em>Παράδειγμα διαμόρφωσης isyncrc</em> <code>~/.config/isyncrc</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-cfg" data-lang="cfg"><span style="display:flex;"><span><span style="color:#a6e22e">IMAPAccount gmail</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Host imap.gmail.com</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Port 993</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">User user@gmail.com # Change this to your username.</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">PassCmd &#34;pass gmail/account&#34; # Change this to a command that returns your password.</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">TLSType IMAPS</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">TLSVersions +1.2</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">CertificateFile /etc/ssl/certs/ca-certificates.crt</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">IMAPStore gmail-remote</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Account gmail</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">MaildirStore gmail-local</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Path ~/Mail/gmail/</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Inbox ~/Mail/gmail/Inbox</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Trash ~/Mail/gmail/Trash</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SubFolders Verbatim</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Channel gmail</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Far :gmail-remote:</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Near :gmail-local:</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Patterns *</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Expunge None</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">CopyArrivalDate yes</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Sync All</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Create Both</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">SyncState *</span>
</span></span></code></pre></div><p>Μετὰ τὴν προσαρμογὴ τῆς παραπάνω διαμόρφωσης, τρέξε <code>mbsync -a</code> γιὰ νὰ
συγχρονίσεις τὸ ἀπομακρυσμένο γραμματοκιβώτιο τοπικά.</p>
<h2 id="ρύθμιση-notmuch">Ρύθμιση notmuch</h2>
<h3 id="πρώτη-ἐγκατάσταση">Πρώτη ἐγκατάσταση</h3>
<ul>
<li>Μετὰ τὴν ἐγκατάσταση notmuch γιὰ πρώτη φορά, τρέξε <code>notmuch setup</code>
γιὰ διαδραστικὴ ρύθμιση.</li>
</ul>
<h3 id="δημιούργησε-dot-scripts-notmuch-hook-dot-sh">Δημιούργησε <code>~/.scripts/notmuch-hook.sh</code></h3>
<ul>
<li>Σενάριο Bash ποὺ θὰ φιλτράρει/ἐπισημαίνει τὴν ἀλληλογραφία σου</li>
</ul>
<p>Παράδειγμα:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/sh
</span></span></span><span style="display:flex;"><span>notmuch new
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Add +inbox tag to a specific alias/address</span>
</span></span><span style="display:flex;"><span>notmuch tag +inbox -- to:main@address.org
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#Sent messages, change this to your mail addresses</span>
</span></span><span style="display:flex;"><span>notmuch tag -unread -new -inbox +sent -- from:*@mydomain.org or from:*@mydomain.com or from:user@gmail.com
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Example for Emacs-devel</span>
</span></span><span style="display:flex;"><span>notmuch tag +emacs-devel -new -inbox -- from:emacs-devel@gnu.org or to:emacs-devel@gnu.org
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Example for Github</span>
</span></span><span style="display:flex;"><span>notmuch tag +github -- from:*github.com
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Filter based on other tags, such as drafts</span>
</span></span><span style="display:flex;"><span>notmuch tag -inbox -sent -inbox -- tag:draft
</span></span></code></pre></div><h2 id="διαμόρφωση-ἤμαξ">Διαμόρφωση Ἤμαξ</h2>
<h3 id="notmuch">Notmuch</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(use-package notmuch
</span></span><span style="display:flex;"><span>  :config
</span></span><span style="display:flex;"><span>  (defun thanos/notmuch-update--command (new-buffer)
</span></span><span style="display:flex;"><span>    (let ((default-directory <span style="color:#e6db74">&#34;~/.scripts/&#34;</span>)) <span style="color:#75715e">;; Directory where notmuch script is located.</span>
</span></span><span style="display:flex;"><span>      (async-shell-command <span style="color:#e6db74">&#34;mbsync -a; ./notmuch-hook.sh&#34;</span> new-buffer)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (defun thanos/notmuch-update ()
</span></span><span style="display:flex;"><span>    (interactive)
</span></span><span style="display:flex;"><span>    (let* ((buffer (generate-new-buffer <span style="color:#e6db74">&#34;*notmuch update*&#34;</span>))
</span></span><span style="display:flex;"><span>           (height (<span style="color:#a6e22e">max</span> <span style="color:#ae81ff">5</span> (<span style="color:#a6e22e">truncate</span> (<span style="color:#a6e22e">*</span> (frame-height) <span style="color:#ae81ff">0.1</span>))))
</span></span><span style="display:flex;"><span>           (window (split-window-vertically (<span style="color:#a6e22e">-</span> height))))
</span></span><span style="display:flex;"><span>      (with-selected-window window
</span></span><span style="display:flex;"><span>        (switch-to-buffer buffer)
</span></span><span style="display:flex;"><span>        (let ((proc (thanos/notmuch-update--command buffer)))
</span></span><span style="display:flex;"><span>          (<span style="color:#a6e22e">set-process-sentinel</span>
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">get-buffer-process</span> buffer)
</span></span><span style="display:flex;"><span>           (lambda (process event)
</span></span><span style="display:flex;"><span>             (when (<span style="color:#a6e22e">memq</span> (<span style="color:#a6e22e">process-status</span> process) <span style="color:#f92672">&#39;</span>(exit <span style="color:#a6e22e">signal</span>))
</span></span><span style="display:flex;"><span>               (delete-window (<span style="color:#a6e22e">get-buffer-window</span> (<span style="color:#a6e22e">process-buffer</span> process)))
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">kill-buffer</span> (<span style="color:#a6e22e">process-buffer</span> process)))))))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (defun thanos/notmuch-search ()
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Custom notmuch-search wrapper, that makes sure we have newest mail first.&#34;</span>
</span></span><span style="display:flex;"><span>    (interactive)
</span></span><span style="display:flex;"><span>    (let ((query (notmuch-read-query <span style="color:#e6db74">&#34;Notmuch search: &#34;</span>)))
</span></span><span style="display:flex;"><span>      (notmuch-search query <span style="color:#66d9ef">nil</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">;; Configure saved searches to your liking, here&#39;s an example:</span>
</span></span><span style="display:flex;"><span>  (setf notmuch-saved-searches
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">`</span>((:name <span style="color:#e6db74">&#34;Week&#39;s Inbox&#34;</span> :query <span style="color:#e6db74">&#34;tag:inbox date:7d..today&#34;</span> :sort-order newest-first
</span></span><span style="display:flex;"><span>                 :key <span style="color:#f92672">,</span>(kbd <span style="color:#e6db74">&#34;i&#34;</span>))
</span></span><span style="display:flex;"><span>          (:name <span style="color:#e6db74">&#34;Inbox&#34;</span> :query <span style="color:#e6db74">&#34;tag:inbox&#34;</span> :sort-order newest-first :key <span style="color:#f92672">,</span>(kbd <span style="color:#e6db74">&#34;I&#34;</span>))
</span></span><span style="display:flex;"><span>          (:name <span style="color:#e6db74">&#34;Unread&#34;</span> :query <span style="color:#e6db74">&#34;tag:unread&#34;</span> :sort-order newest-first :key <span style="color:#f92672">,</span>(kbd <span style="color:#e6db74">&#34;u&#34;</span>))
</span></span><span style="display:flex;"><span>          (:name <span style="color:#e6db74">&#34;Today&#39;s message&#34;</span> :query <span style="color:#e6db74">&#34;tag:inbox date:today&#34;</span>
</span></span><span style="display:flex;"><span>                 :sort-order newest-first :key <span style="color:#f92672">,</span>(kbd <span style="color:#e6db74">&#34;t&#34;</span>))
</span></span><span style="display:flex;"><span>          (:name <span style="color:#e6db74">&#34;sent&#34;</span> :query <span style="color:#e6db74">&#34;tag:sent&#34;</span> :sort-order newest-first :key <span style="color:#f92672">,</span>(kbd <span style="color:#e6db74">&#34;s&#34;</span>))
</span></span><span style="display:flex;"><span>          (:name <span style="color:#e6db74">&#34;drafts&#34;</span> :query <span style="color:#e6db74">&#34;tag:draft&#34;</span> :sort-order newest-first :key <span style="color:#f92672">,</span>(kbd <span style="color:#e6db74">&#34;d&#34;</span>))
</span></span><span style="display:flex;"><span>          (:name <span style="color:#e6db74">&#34;all mail&#34;</span> :query <span style="color:#e6db74">&#34;*&#34;</span> :sort-order oldest-first :key <span style="color:#f92672">,</span>(kbd <span style="color:#e6db74">&#34;a&#34;</span>))))
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">;; Tag format configuration</span>
</span></span><span style="display:flex;"><span>  (setf notmuch-tag-formats
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&#39;</span>((<span style="color:#e6db74">&#34;unread&#34;</span> (<span style="color:#a6e22e">propertize</span> tag <span style="color:#e6db74">&#39;face</span> <span style="color:#e6db74">&#39;notmuch-tag-unread</span>))))
</span></span><span style="display:flex;"><span>  :bind ((<span style="color:#e6db74">&#34;C-x m&#34;</span> <span style="color:#f92672">.</span> notmuch-hello)
</span></span><span style="display:flex;"><span>         :map notmuch-hello-mode-map
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;u&#34;</span> <span style="color:#f92672">.</span> notmuch-hello-update)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;U&#34;</span> <span style="color:#f92672">.</span> thanos/notmuch-update)
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;s&#34;</span> <span style="color:#f92672">.</span> thanos/notmuch-search)
</span></span><span style="display:flex;"><span>         :map notmuch-search-mode-map
</span></span><span style="display:flex;"><span>         (<span style="color:#e6db74">&#34;u&#34;</span> <span style="color:#f92672">.</span> notmuch-refresh-all-buffers)))
</span></span></code></pre></div><h3 id="smtpmail">smtpmail</h3>
<ul>
<li>Αὐτὴ ἡ διαμόρφωση χρησιμοποιεῖται γιὰ ἀποστολὴ μηνυμάτων ἠλεκτρονικοῦ ταχυδρομείου ἀπὸ πολλαπλὲς
διευθύνσεις· βεβαιώσου ὅτι ἔχεις ἀποθηκευμένο τὸν κωδικὸ
πρόσβασης στὸ <code>~/.authinfo.gpg</code> ποὺ ὁ Ἤμαξ θὰ χρησιμοποιήσει ἐκ
προεπιλογῆς.</li>
</ul>
<!--listend-->
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(use-package smtpmail
</span></span><span style="display:flex;"><span>  :config
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">;; Default credentials</span>
</span></span><span style="display:flex;"><span>  (setf smtpmail-smtp-user (auth-source-pass-get <span style="color:#e6db74">&#34;user&#34;</span> <span style="color:#e6db74">&#34;gmail/user&#34;</span>) <span style="color:#75715e">;; This is not your password, just the username.  Emacs will search for your pw in ~/.authinfo.gpg.</span>
</span></span><span style="display:flex;"><span>        smtpmail-smtp-server <span style="color:#e6db74">&#34;smtp.gmail.com&#34;</span>
</span></span><span style="display:flex;"><span>        smtpmail-smtp-service <span style="color:#ae81ff">465</span> <span style="color:#75715e">;; Adjust this to your mail provider port if needed</span>
</span></span><span style="display:flex;"><span>        smtpmail-stream-type <span style="color:#e6db74">&#39;ssl</span>
</span></span><span style="display:flex;"><span>        message-send-mail-function <span style="color:#e6db74">&#39;smtpmail-send-it</span>
</span></span><span style="display:flex;"><span>        message-signature <span style="color:#e6db74">&#34;My signature&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (defun thanos/mail-config-hook ()
</span></span><span style="display:flex;"><span>    (let ((from (mail-fetch-field <span style="color:#e6db74">&#34;From&#34;</span>))
</span></span><span style="display:flex;"><span>          (public <span style="color:#e6db74">&#34;&lt;public@thanosapollo.org&gt;&#34;</span>)
</span></span><span style="display:flex;"><span>          (gmail <span style="color:#e6db74">&#34;&lt;104111@students.mu-sofia.bg&gt;&#34;</span>))
</span></span><span style="display:flex;"><span>      (cond ((<span style="color:#a6e22e">string-match</span> public from)
</span></span><span style="display:flex;"><span>             (setf smtpmail-smtp-user (auth-source-pass-get <span style="color:#e6db74">&#34;user&#34;</span> <span style="color:#e6db74">&#34;purelymail/thanosapollo&#34;</span>)
</span></span><span style="display:flex;"><span>                   smtpmail-smtp-server <span style="color:#e6db74">&#34;smtp.purelymail.com&#34;</span>))
</span></span><span style="display:flex;"><span>            ((<span style="color:#a6e22e">string-match</span> gmail from)
</span></span><span style="display:flex;"><span>             (setf smtpmail-smtp-user <span style="color:#e6db74">&#34;104111@students.mu-sofia.bg&#34;</span>
</span></span><span style="display:flex;"><span>                   smtpmail-smtp-server <span style="color:#e6db74">&#34;smtp.gmail.com&#34;</span>)))))
</span></span><span style="display:flex;"><span>  <span style="color:#75715e">;; You can use :hook instead, but I prefer add-hook under :config personally.</span>
</span></span><span style="display:flex;"><span>  (add-hook <span style="color:#e6db74">&#39;message-send-hook</span> <span style="color:#a6e22e">#&#39;</span>thanos/mail-config-hook))
</span></span></code></pre></div><h3 id="mml-sec">mml-sec</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(use-package mml-sec
</span></span><span style="display:flex;"><span>  :config
</span></span><span style="display:flex;"><span>  (defun gpg-list-emails-available ()
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;Return a list of trusted emails.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Parses output of `gpg --list-keys --with-colons&#39; command into a
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">list of emails.&#34;</span>
</span></span><span style="display:flex;"><span>  (let* ((command <span style="color:#e6db74">&#34;gpg --list-keys --with-colons&#34;</span>)
</span></span><span style="display:flex;"><span>         (output (shell-command-to-string command))
</span></span><span style="display:flex;"><span>         (lines (split-string output <span style="color:#e6db74">&#34;\n&#34;</span> <span style="color:#66d9ef">t</span>))
</span></span><span style="display:flex;"><span>         (emails <span style="color:#f92672">&#39;</span>()))
</span></span><span style="display:flex;"><span>    (dolist (line lines)
</span></span><span style="display:flex;"><span>      (when (string-prefix-p <span style="color:#e6db74">&#34;uid:&#34;</span> line)
</span></span><span style="display:flex;"><span>        (when (<span style="color:#a6e22e">string-match</span> <span style="color:#e6db74">&#34;&lt;\\([^&gt;]+\\)&gt;&#34;</span> line)
</span></span><span style="display:flex;"><span>          (let ((email (<span style="color:#a6e22e">downcase</span> (string-trim (match-string <span style="color:#ae81ff">1</span> line)))))
</span></span><span style="display:flex;"><span>            (push email emails)))))
</span></span><span style="display:flex;"><span>    (delete-dups emails)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (defun thanos/mail-list-recipients-from-buffer ()
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Get the list of recipients from the current email buffer.&#34;</span>
</span></span><span style="display:flex;"><span>    (save-excursion
</span></span><span style="display:flex;"><span>      (<span style="color:#a6e22e">goto-char</span> (<span style="color:#a6e22e">point-min</span>))
</span></span><span style="display:flex;"><span>      (let ((to (or (mail-fetch-field <span style="color:#e6db74">&#34;To&#34;</span>) <span style="color:#e6db74">&#34;&#34;</span>))
</span></span><span style="display:flex;"><span>            (cc (or (mail-fetch-field <span style="color:#e6db74">&#34;Cc&#34;</span>) <span style="color:#e6db74">&#34;&#34;</span>))
</span></span><span style="display:flex;"><span>            (bcc (or (mail-fetch-field <span style="color:#e6db74">&#34;Bcc&#34;</span>) <span style="color:#e6db74">&#34;&#34;</span>))
</span></span><span style="display:flex;"><span>            recipients)
</span></span><span style="display:flex;"><span>        (setq recipients (<span style="color:#a6e22e">concat</span> to <span style="color:#e6db74">&#34;, &#34;</span> cc <span style="color:#e6db74">&#34;, &#34;</span> bcc))
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">;; Remove empty strings from the result</span>
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">delq</span> <span style="color:#66d9ef">nil</span>
</span></span><span style="display:flex;"><span>              (<span style="color:#a6e22e">mapcar</span> (lambda (addr)
</span></span><span style="display:flex;"><span>                        (let ((clean-addr (string-trim addr)))
</span></span><span style="display:flex;"><span>                          (when (not (string-empty-p clean-addr))
</span></span><span style="display:flex;"><span>                            (<span style="color:#a6e22e">downcase</span>
</span></span><span style="display:flex;"><span>                             (if (<span style="color:#a6e22e">string-match</span> <span style="color:#e6db74">&#34;&lt;\\([^&gt;]+\\)&gt;&#34;</span> clean-addr)
</span></span><span style="display:flex;"><span>                                 (string-trim (match-string <span style="color:#ae81ff">1</span> clean-addr))
</span></span><span style="display:flex;"><span>                               clean-addr)))))
</span></span><span style="display:flex;"><span>                      (split-string recipients <span style="color:#e6db74">&#34;,&#34;</span> <span style="color:#66d9ef">t</span>))))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (defun thanos/mail-sign-encrypt ()
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Auto-encrypt if all recipients have keys, else just sign.&#34;</span>
</span></span><span style="display:flex;"><span>    (let ((trusted-emails (gpg-list-emails-available))
</span></span><span style="display:flex;"><span>          (recipients (thanos/mail-list-recipients-from-buffer)))
</span></span><span style="display:flex;"><span>      (if (cl-every (lambda (r) (<span style="color:#a6e22e">member</span> r trusted-emails)) recipients)
</span></span><span style="display:flex;"><span>          (progn
</span></span><span style="display:flex;"><span>            (<span style="color:#a6e22e">message</span> <span style="color:#e6db74">&#34;Encrypting message.&#34;</span>)
</span></span><span style="display:flex;"><span>            (mml-secure-message-sign-encrypt))
</span></span><span style="display:flex;"><span>        (progn
</span></span><span style="display:flex;"><span>          (<span style="color:#a6e22e">message</span> <span style="color:#e6db74">&#34;Just signing message.&#34;</span>)
</span></span><span style="display:flex;"><span>          (mml-secure-message-sign)))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  (add-hook <span style="color:#e6db74">&#39;message-send-hook</span> <span style="color:#a6e22e">#&#39;</span>thanos/mail-sign-encrypt)
</span></span><span style="display:flex;"><span>  :custom
</span></span><span style="display:flex;"><span>  (mml-secure-openpgp-signers <span style="color:#f92672">&#39;</span>(<span style="color:#e6db74">&#34;62B758D0F6719938BC09CECA339F736C3A720928&#34;</span>))) <span style="color:#75715e">;; Change this to your own key!</span>
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Μεγάλη ἐνημέρωση γιὰ τὸ Gnosis: ἔκδοση 0.5.0</title>
      <link>https://thanosapollo.org/el/posts/gnosis-0-5-0-release/</link>
      <pubDate>Tue, 17 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/el/posts/gnosis-0-5-0-release/</guid>
      <description>Τὸ Gnosis μόλις πῆρε μεγάλη ἐνημέρωση μὲ αὐτὴ τὴν ἔκδοση.  Προστέθηκε ἡ ἀπὸ καιρὸ ὑποσχεμένη ὑποστήριξη org-mode μαζὶ μὲ ἄλλες σημαντικὲς ἀλλαγές.</description>
      <content:encoded><![CDATA[<p>Τὸ Gnosis μόλις πῆρε μεγάλη ἐνημέρωση μὲ αὐτὴ τὴν ἔκδοση.  Προστέθηκε ἡ ἀπὸ
καιρὸ ὑποσχεμένη ὑποστήριξη <strong>org-mode</strong> καὶ ὑποστήριξη σύνδεσης
σημειώσεων μὲ κόμβους
<a href="https://thanosapollo.org/projects/org-gnosis/">org-gnosis</a>.</p>
<h2 id="org-mode-support">Ὑποστήριξη Org Mode</h2>
<p>Μετὰ ἀπὸ δουλειὰ/πειραματισμὸ στὸ org-gnosis καὶ καλύτερη κατανόηση τοῦ πῶς
δουλεύει τὸ org-mode, ἀποφάσισα νὰ χρησιμοποιήσω org-mode γιὰ
δημιουργία καὶ ἐξαγωγὴ σημειώσεων gnosis.</p>
<p>Οἱ σημειώσεις, ἀνεξαρτήτως τύπου, θὰ εἶναι πλέον ὡς ἑξῆς:</p>
<blockquote>
<p>Παράδειγμα τύπου cloze.</p>
</blockquote>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-org" data-lang="org"><span style="display:flex;"><span>*<span style="font-weight:bold"> Thema                     </span><span style="font-style:italic"> :pharmacology:antimicrobials:penicillin:</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">:PROPERTIES:
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">:GNOSIS_ID: NEW
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">:GNOSIS_TYPE: cloze
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">:END:</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">**</span> Keimenon
</span></span><span style="display:flex;"><span>What is the treatment for Actinomyces infection?
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Penicillin
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">**</span> Hypothesis
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- </span>drug type
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">**</span> Answer
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- </span>Penicillin
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">**</span> Parathema
</span></span><span style="display:flex;"><span>Sulfonamides → Nocardia
</span></span><span style="display:flex;"><span>Actinomyces → [[<span style="color:#a6e22e">id:680ca944-8ee9-4513-92d6-25696ee01f48</span>][<span style="color:#f92672">Penicillin</span>]]
</span></span><span style="display:flex;"><span>(treatment is a SNAP)
</span></span></code></pre></div><blockquote>
<p>Σημείωσε ὅτι ἡ σύνταξη τύπου anki ἐξακολουθεῖ νὰ ὑποστηρίζεται γιὰ clozes.</p>
</blockquote>
<!--quoteend-->
<blockquote>
<p>Παράδειγμα MCQ</p>
</blockquote>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-org" data-lang="org"><span style="display:flex;"><span>*<span style="font-weight:bold"> Thema                                                           </span><span style="font-style:italic"> :clinical:</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">:PROPERTIES:
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">:GNOSIS_ID: NEW
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">:GNOSIS_TYPE: mcq
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">:END:</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">**</span> Keimenon
</span></span><span style="display:flex;"><span>A 60-year-old man comes to the physician with chills, nausea, and
</span></span><span style="display:flex;"><span>diffuse muscle aches for 3 days. His niece had similar symptoms 2
</span></span><span style="display:flex;"><span>weeks ago and H3N2 influenza strain was isolated from her respiratory
</span></span><span style="display:flex;"><span>secretions. He received his influenza vaccination 2 months ago. His
</span></span><span style="display:flex;"><span>temperature is 38.5°C. A rapid influenza test is
</span></span><span style="display:flex;"><span>positive. Which of the following mechanisms best explains this
</span></span><span style="display:flex;"><span>patient&#39;s infection despite vaccination?
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">**</span> Hypothesis
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- </span>Random point mutations within viral genome
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- </span>Complementing with functional viral proteins
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- </span>Exchange of viral genes between chromosomes
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- </span>Reassortment of viral RNA segments
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- </span>Acquisition of viral surface proteins
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">**</span> Answer
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">- </span>Random point mutations within viral genome
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">**</span> Parathema
</span></span><span style="display:flex;"><span>Random point mutations within the viral genome are responsible for
</span></span><span style="display:flex;"><span>antigenic drift, which creates a new virus strain.
</span></span></code></pre></div><p>Κάθε σημείωση εἶναι ἕνα <strong>thema</strong> ποὺ ἀποτελεῖται ἀπὸ τὰ ἑξῆς
στοιχεῖα:</p>
<ul>
<li>*Keimenon*· Τὸ κύριο κείμενο ἢ ἡ ἐρώτηση.</li>
<li>*Hypothesis*· Ὑποθέσεις/ὑποδείξεις γιὰ τὸ κείμενο ποὺ ὁδηγοῦν στὴ
σωστὴ ἀπάντηση
<ul>
<li>Γιὰ παράδειγμα χρησιμοποιεῖται ὡς ὑποδείξεις γιὰ τύπο cloze ἢ ὡς
ἐπιλογὲς σὲ MCQ</li>
</ul>
</li>
<li>*Answer*· Ἡ σωστὴ ἀπάντηση ἢ λύση στὸ keimenon.</li>
<li>*Parathema*· ἐπέκταση τοῦ keimenon, ποὺ μπορεῖ νὰ περιλαμβάνει
συνδέσμους π.χ. σὲ θέματα org-gnosis ἢ ἀκόμα καὶ ἀρχεῖα, ὡς τρόπος
σύνδεσης θεμάτων org-gnosis μὲ τὸ τρέχον thema.</li>
</ul>
<p>Προαιρετικά, μπορεῖς ἐπίσης νὰ προσθέσεις ἐτικέτες σὲ κάθε σημείωση.</p>
<p>Οἱ σημειώσεις/themata μποροῦν νὰ ἔχουν πολλαπλὲς hypotheses καὶ
ἀπαντήσεις (<em>ἀνάλογα μὲ τὸν τύπο τους</em>), διαχωρισμένες μὲ
<code>gnosis-export-separator</code>, ποὺ ἐξ ὁρισμοῦ εἶναι <code>&quot;\n-&quot;</code> (νέα
γραμμὴ ἀκολουθούμενη ἀπὸ παύλα).</p>
<h2 id="support-for-exporting-decks">Ὑποστήριξη ἐξαγωγῆς decks</h2>
<p>Προστέθηκε ὑποστήριξη ἐξαγωγῆς decks ὡς ἀρχεῖα org μέσω
<code>gnosis-export-deck</code>.</p>
<h2 id="support-for-org-gnosis-notes">Ὑποστήριξη σημειώσεων org-gnosis</h2>
<blockquote>
<p>Μὲ αὐτὴ τὴν ἐνημέρωση τὸ org-gnosis εἶναι ἐπιτέλους μέρος τοῦ gnosis.
Ὁ στόχος δὲν εἶναι ἁπλῶς ἕνα ἐργαλεῖο ἐπανάληψης μὲ διαστήματα, ἀλλὰ
ἕνα ὁλοκληρωμένο ἐργαλεῖο μάθησης.</p>
</blockquote>
<p>Μὲ αὐτὴ τὴ νέα ἐνημέρωση μπορεῖς νὰ κάνεις ἐπαναλήψεις γιὰ συγκεκριμένα
θέματα <strong>org-gnosis</strong>.</p>
<ul>
<li>Χρησιμοποίησε <code>M-x gnosis-review-topic</code> γιὰ νὰ ἐπιλέξεις θέμα ἀπὸ
τὶς σημειώσεις org-gnosis καὶ νὰ ἐπαναλάβεις ὅλα τὰ συνδεδεμένα
themata.</li>
<li>Μπορεῖς νὰ συνδέσεις ἕνα thema μὲ θέμα org-gnosis προσθέτοντας
σύνδεσμο org id εἴτε στὸ parathema <em>(συνιστᾶται)</em> εἴτε στὸ
keimenon, μὲ <code>M-x org-gnosis-insert</code>.</li>
</ul>
<blockquote>
<p>Μελλοντικὲς ἐκδόσεις θὰ ἐπεκτείνουν περαιτέρω αὐτὴ τὴ λειτουργικότητα.</p>
</blockquote>
<h2 id="deprecated-support-for-images">Παρωχημένη ὑποστήριξη εἰκόνων</h2>
<ul>
<li>Ἡ ὑποστήριξη εἰκόνων θὰ ξαναγραφεῖ στὴν ἑπόμενη δευτερεύουσα ἔκδοση
<ul>
<li>Θὰ προστεθεῖ ὑποστήριξη ἐμφάνισης συνδέσμων ἀρχείων εἰκόνων.</li>
</ul>
</li>
</ul>
<h2 id="deprecated-support-for-y-or-n-notes">Παρωχημένη ὑποστήριξη σημειώσεων y-or-n</h2>
<p>Μὲ αὐτὴ τὴν ἐνημέρωση οἱ τρέχουσες σημειώσεις <code>y-or-n</code> θὰ μετατραποῦν
σὲ τύπο MCQ, μὲ ἐπιλογὲς «Ναί» καὶ «Ὄχι».</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ξαναγράφοντας τὴ Γνῶση: ἔκδοση 0.4.0</title>
      <link>https://thanosapollo.org/el/posts/gnosis-0-4-0-release/</link>
      <pubDate>Wed, 07 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/el/posts/gnosis-0-4-0-release/</guid>
      <description>Γνῶσις (γνῶσις), ὑλοποίηση συστήματος ἐπανάληψης μὲ διαστήματα γιὰ GNU Ἤμαξ</description>
      <content:encoded><![CDATA[<p>Ποιὸ εἶναι τὸ πιὸ σημαντικὸ πρᾶγμα γιὰ τὴν ἀποθήκευση γνώσης;</p>
<p>Θὰ ἔλεγα ἡ σωστὴ ὀργάνωση αὐτῆς τῆς γνώσης, ὅπως μὲ decks γιὰ κάθε
ἀντικείμενο καὶ οὐσιώδεις ἐτικέτες ποὺ συνδέουν σχετικὲς ἔννοιες μεταξύ
decks, κάνοντάς την εὔκολα ἀναζητήσιμη καὶ προσβάσιμη.</p>
<p>Καθὼς ἄρχισα νὰ προσθέτω ὅλο καὶ περισσότερες σημειώσεις στὴ gnosis, βρέθηκα
νὰ θέλω νὰ προσαρμόζω τὸν ἀλγόριθμο ἐπανάληψης ὄχι μόνο γιὰ decks ἀλλὰ καὶ
γιὰ ἐτικέτες.  Αὐτὸ μὲ ὁδήγησε νὰ ἀναδιαμορφώσω τὴν ὑποκείμενη ἀρχιτεκτονικὴ
καὶ νὰ ξαναϋλοποιήσω βασικὲς ἔννοιες.</p>
<h2 id="key-changes-made">Κύριες ἀλλαγές</h2>
<ul>
<li>Ἀνασχεδιασμὸς τοῦ <code>gnosis-dashboard</code> μὲ buffer <em>σὰν ἀρχικὴ σελίδα</em>
ποὺ ἐμφανίζει τρέχοντα στατιστικὰ δραστηριότητας, ὅπως σειρὰ ἐπανάληψης καὶ
τὶς σημειώσεις ποὺ εἶναι προγραμματισμένες γιὰ σήμερα.
<img loading="lazy" src="/images/gnosis-dashboard-03.png"></li>
<li>Ξαναγραμμένος ἀλγόριθμος gnosis:
<ul>
<li>Προστέθηκε <strong>gnosis-score</strong>, ἡ τρέχουσα βαθμολογία γνώσης γιὰ μία σημείωση.</li>
<li>Προστέθηκε τιμὴ <strong>epignosis</strong>, ποὺ δείχνει τὴν ἀκρίβεια γνώσης γιὰ
δεδομένη σημείωση, καθὼς καὶ <strong>agnoia</strong> γιὰ τὴν ἔλλειψη γνώσης
μιᾶς σημείωσης· αὐτὲς οἱ τιμὲς θὰ χρησιμοποιηθοῦν σὲ <strong>γεγονότα
anagnosis</strong>. <em>Τὰ ὀνόματα εἶναι ἑλληνικὲς λέξεις· epignosis ≈ ἐπίγνωσις, agnoia ≈ ἄγνοια.</em></li>
<li>Προστέθηκαν εἰδικὰ γεγονότα ἐπανάληψης· <strong>Anagnosis</strong> &amp; <strong>Lethe</strong>
<ul>
<li><strong>Anagnosis</strong> ἀναφέρεται στὴν ἀναγνώριση καὶ κατανόηση ἑνὸς
πλαισίου· τὰ γεγονότα anagnosis πυροδοτοῦνται εἴτε ἀπὸ διαδοχικὲς
ἀποτυχημένες εἴτε ἀπὸ ἐπιτυχεῖς ἀνακλήσεις.  Ἀνάλογα μὲ τὸ πῶς
πυροδοτοῦνται, ἐφαρμόζεται <strong>epignosis</strong> ἢ <strong>agnoia</strong> στὸ <strong>gnosis-score</strong></li>
<li><strong>Lethe</strong> ἀναφέρεται στὴ λήθη τῆς γνώσης· πυροδοτεῖται ἀπὸ
διαδοχικὲς ἀποτυχίες ἀνάκλησης ἀπάντησης· μὲ αὐτὸ τὸ γεγονὸς τὸ
ἑπόμενο διάστημα ὁρίζεται σὲ 0</li>
</ul>
</li>
<li>Προστέθηκε *amnesia*· ὅταν ἀποτυγχάνεις νὰ ἀνακαλέσεις μία σημείωση,
ἡ τιμὴ amnesia χρησιμοποιεῖται γιὰ νὰ καθορίσει τὸ ἑπόμενο διάστημα.</li>
<li>Προστέθηκε <strong>proto</strong>, μία λίστα ἀκεραίων ποὺ δείχνει τὶς τιμὲς
γιὰ τὰ πρῶτα διαστήματα.  Ἡ λίστα proto δὲν ἔχει ὅριο μῆκους.</li>
</ul>
</li>
<li>Ξαναϋλοποιήθηκε ἡ διαμόρφωση γιὰ τὶς παραπάνω τιμὲς deck καὶ προστέθηκε
ἡ ἱκανότητα νὰ κάνεις τὸ ἴδιο γιὰ ἐτικέτες.  Ἡ διαμόρφωση ἐτικέτας
ἔχει προτεραιότητα πάνω ἀπὸ τὴ διαμόρφωση deck.</li>
</ul>
<p><em>Παράδειγμα:</em></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setq gnosis-custom-values
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#39;</span>((:deck <span style="color:#e6db74">&#34;demo&#34;</span> (:proto (<span style="color:#ae81ff">0</span> <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">3</span>) :anagnosis <span style="color:#ae81ff">3</span> :epignosis <span style="color:#ae81ff">0.5</span> :agnoia <span style="color:#ae81ff">0.3</span> :amnesia <span style="color:#ae81ff">0.5</span> :lethe <span style="color:#ae81ff">3</span>))
</span></span><span style="display:flex;"><span>    (:tag <span style="color:#e6db74">&#34;demo-concept&#34;</span> (:proto (<span style="color:#ae81ff">1</span> <span style="color:#ae81ff">2</span>) :anagnosis <span style="color:#ae81ff">3</span> :amnesia <span style="color:#ae81ff">0.7</span>))))
</span></span></code></pre></div><p>Μία σημείωση κάτω ἀπὸ τὸ deck <em>demo</em> μὲ ἐτικέτα <em>demo-concept</em> θὰ ἔχει τὶς
τιμὲς τοῦ deck demo μὲ ἐξαίρεση:</p>
<ul>
<li>τιμὴ <code>proto</code> ὁρισμένη σὲ <code>(1 2)</code></li>
<li>τιμὴ <code>amnesia</code> ὁρισμένη σὲ <code>0.7</code></li>
</ul>
<p>Γιὰ σημειώσεις μὲ πολλαπλὲς ἐτικέτες, διατηρεῖται ἡ μέγιστη τιμὴ γιὰ
τὶς περισσότερες παραμέτρους.  Ὡστόσο, τὰ <code>anagnosis</code> καὶ <code>lethe</code>
διατηροῦν τὴν ἐλάχιστη τιμὴ.</p>
<h2 id="next-features-on-the-horizon">Ἑπόμενα χαρακτηριστικὰ στὸν ὁρίζοντα</h2>
<ul>
<li>Ἐνσωμάτωση Org mode</li>
<li>Ἐξαγωγὴ καὶ εἰσαγωγὴ deck</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Διαχείριση ἠλεκτρονικοῦ ταχυδρομείου στὸν Ἤμαξ | Ὁδηγὸς ἐγκατάστασης mu4e &amp; isync</title>
      <link>https://thanosapollo.org/el/posts/mu4e-guide/</link>
      <pubDate>Mon, 29 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/el/posts/mu4e-guide/</guid>
      <description>Διαχείριση ἠλεκτρονικοῦ ταχυδρομείου μὲ Ἤμαξ, χρησιμοποιώντας mu4e &amp;amp; isync.</description>
      <content:encoded><![CDATA[<p>Τὸ ἠλεκτρονικὸ ταχυδρομεῖο, μίσησέ το ἢ ἀγάπησέ το, ὅλοι πρέπει νὰ τὸ ἀντιμετωπίσουμε.  Εὐτυχῶς,
χάρη στὸν Ἤμαξ καὶ τὸ <a href="https://github.com/djcb/mu">mu4e</a> μπορεῖς νὰ δουλεύεις μὲ τὸ ἠλεκτρονικὸ ταχυδρομεῖο
παραγωγικὰ καί, τολμῶ νὰ πῶ, εὐχάριστα.</p>
<h2 id="about">Σχετικά</h2>
<p>Σὲ αὐτὸν τὸν ὁδηγὸ θὰ σὲ καθοδηγήσω στὴν ἐγκατάσταση mu4e μὲ πολλαπλοὺς
λογαριασμούς, χρησιμοποιώντας isync καὶ mu, καθὼς καὶ στὰ βασικὰ τοῦ πῶς νὰ
ἐνσωματώσεις τὸ mu4e στὴ ροὴ ἐργασίας σου, συν συμβουλὲς καὶ κόλπα ὅπως
χρήση ἐνεργειῶν τοῦ mu4e γιὰ ἐφαρμογὴ διορθώσεων Git.</p>
<p>Γιὰ νὰ ἀκολουθήσεις αὐτὸν τὸν ὁδηγό, βεβαιώσου ὅτι ἔχεις ἐνεργοποιήσει
πρόσβαση IMAP/SMTP γιὰ τὸν λογαριασμὸ ἠλεκτρονικοῦ ταχυδρομείου σου.  Τὰ βήματα ἐνεργοποίησης
μπορεῖ νὰ διαφέρουν ἀνάλογα μὲ τὸν συγκεκριμένο πάροχο ἠλεκτρονικοῦ ταχυδρομείου, ὁπότε δὲν θὰ
τὰ καλύψω ἐδῶ.</p>
<h2 id="why-mu4e">Γιατί mu4e;</h2>
<p>Ὑπάρχουν πολλαπλὲς ἐπιλογὲς στὸν GNU Ἤμαξ γιὰ διαχείριση ἠλεκτρονικοῦ ταχυδρομείου, ὅπως rmail,
gnus, notmuch καὶ mu4e.</p>
<p>Καθεμία ἀπὸ αὐτὲς τὶς ἐπιλογὲς ἔχει τὶς δικές της πολυπλοκότητες, ἀνάλογα μὲ
τὴ συγκεκριμένη περίπτωση χρήσης σου.</p>
<p>Στὴν προσωπική μου ἐμπειρία, προτιμῶ τὸ mu4e λόγω τῆς εὐκολίας ἐγκατάστασης,
ἰδίως ὅταν ἔχεις νὰ κάνεις μὲ πολλαπλοὺς λογαριασμούς.</p>
<h2 id="installing-mu-isync">Ἐγκατάσταση MU &amp; isync</h2>
<p>Γιὰ νὰ ξεκινήσεις, ἐγκατάστησε <strong>mu</strong> καὶ <strong>isync</strong></p>
<ul>
<li>Arch Linux</li>
</ul>
<!--listend-->
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo pacman -S mu isync
</span></span></code></pre></div><ul>
<li>Gentoo</li>
</ul>
<!--listend-->
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ sudo emerge -av mu isync
</span></span></code></pre></div><p><code>NOTE</code>: Βεβαιώσου ὅτι χρησιμοποιεῖς <code>emacs</code> USEFLAG γιὰ τὸ mu</p>
<p>Ἂν τὸ <code>mu</code> δὲν εἶναι πακεταρισμένο γιὰ τὴ διανομή σου, συστήνω νὰ ἀλλάξεις
σὲ νέα.  Ἀλλὰ ἂν ἐπιμένεις, ἴσως ἔχεις ἐπιτυχία ἐγκαθιστώντας mu ἀπὸ
πηγή, χρησιμοποιώντας
<a href="https://github.com/radian-software/straight.el">straight.el</a>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(straight-use-package <span style="color:#e6db74">&#39;mu4e</span>)
</span></span></code></pre></div><h2 id="setting-up-mbsync">Ρύθμιση mbsync</h2>
<p>Ἐπεξεργάσου τὴ διαμόρφωσή σου: <code>~/.mbsyncrc</code></p>
<h3 id="example-setup-for-fastmail">Παράδειγμα ρύθμισης γιὰ Fastmail:</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>IMAPAccount fastmail
</span></span><span style="display:flex;"><span>Host imap.fastmail.com
</span></span><span style="display:flex;"><span>Port 993
</span></span><span style="display:flex;"><span>User myaccount@fastmail.com
</span></span><span style="display:flex;"><span>PassCmd &#34;emacsclient -e &#39;(password-store-get-field \&#34;fastmail.com/myaccount@fastmail.com\&#34; \&#34;smtp\)&#39;&#34;
</span></span><span style="display:flex;"><span>SSLType IMAPS
</span></span><span style="display:flex;"><span>SSLVersions TLSv1.2
</span></span><span style="display:flex;"><span>CertificateFile /etc/ssl/certs/ca-certificates.crt
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>IMAPStore fastmail-remote
</span></span><span style="display:flex;"><span>Account fastmail
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>MaildirStore fastmail-local
</span></span><span style="display:flex;"><span>Path ~/Mail/Fastmail/
</span></span><span style="display:flex;"><span>Inbox ~/Mail/Fastmail/Inbox
</span></span><span style="display:flex;"><span>Trash ~/Mail/Fastmail/Trash/
</span></span><span style="display:flex;"><span>SubFolders Verbatim
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Channel fastmail
</span></span><span style="display:flex;"><span>Far :fastmail-remote:
</span></span><span style="display:flex;"><span>Near :fastmail-local:
</span></span><span style="display:flex;"><span>Patterns *
</span></span><span style="display:flex;"><span>Expunge None
</span></span><span style="display:flex;"><span>CopyArrivalDate yes
</span></span><span style="display:flex;"><span>Sync All
</span></span><span style="display:flex;"><span>Create Both
</span></span><span style="display:flex;"><span>SyncState *
</span></span></code></pre></div><h3 id="example-setup-for-gmail">Παράδειγμα ρύθμισης γιὰ Gmail:</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>IMAPAccount gmail
</span></span><span style="display:flex;"><span>Host imap.gmail.com
</span></span><span style="display:flex;"><span>Port 993
</span></span><span style="display:flex;"><span>User myaccount@gmail.com
</span></span><span style="display:flex;"><span>PassCmd &#34;pass google/mygmail.com&#34;
</span></span><span style="display:flex;"><span>SSLType IMAPS
</span></span><span style="display:flex;"><span>SSLVersions TLSv1.2
</span></span><span style="display:flex;"><span>CertificateFile /etc/ssl/certs/ca-certificates.crt
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>IMAPStore gmail-remote
</span></span><span style="display:flex;"><span>Account gmail
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>MaildirStore gmail-local
</span></span><span style="display:flex;"><span>Path ~/Mail/Account-GMAIL/
</span></span><span style="display:flex;"><span>SubFolders Verbatim
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Channel gmail
</span></span><span style="display:flex;"><span>Far :gmail-remote:
</span></span><span style="display:flex;"><span>Near :gmail-local:
</span></span><span style="display:flex;"><span>Patterns * ![Gmail]* &#34;[Gmail]/Sent Mail&#34; &#34;[Gmail]/Starred&#34; &#34;[Gmail]/All Mail&#34; &#34;[Gmail]/Trash&#34;
</span></span><span style="display:flex;"><span>Expunge None
</span></span><span style="display:flex;"><span>CopyArrivalDate yes
</span></span><span style="display:flex;"><span>Sync All
</span></span><span style="display:flex;"><span>Create Both
</span></span><span style="display:flex;"><span>SyncState *
</span></span><span style="display:flex;"><span>Settings you should adjust:
</span></span></code></pre></div><ul>
<li><code>PassCmd</code> αὐτὸ θὰ πρέπει νὰ ἐξάγει τὸν κωδικὸ τοῦ λογαριασμοῦ σου.
Προσωπικὰ χρησιμοποιῶ pass ὡς διαχειριστὴ κωδικῶν.</li>
</ul>
<p>Στὸ παραπάνω παράδειγμα fastmail παίρνω τὸν κωδικὸ μὲ αὐτὴ τὴ συνάρτηση
Ἤμαξ:</p>
<p><code>(password-store-get-field \&quot;fastmail.com/myaccount@fastmail.com\&quot; \&quot;smtp\)</code></p>
<p>Τὸ <code>password-store</code> εἶναι διεπαφὴ τοῦ pass γιὰ τὸν Ἤμαξ.</p>
<p><code>NOTE</code>: Ἀντὶ γιὰ PassCmd, μπορεῖς νὰ χρησιμοποιήσεις Pass ποὺ ἁπλῶς ἔχει
τὸν κωδικό σου σὲ ἀπλὸ κείμενο, ἀλλὰ δὲν τὸ συστήνω γιὰ λόγους ἀσφαλείας.</p>
<ul>
<li>
<p><code>CertificateFile</code> - Αὐτὴ ἡ τοποθεσία μπορεῖ νὰ διαφέρει ἀνάλογα μὲ τὴ
διανομὴ Linux σου.</p>
</li>
<li>
<p><code>Patterns</code> - Ὁρίζει ποιοὶ φάκελοι θὰ συγχρονιστοῦν· προσωπικὰ ἁπλῶς
ὁρίζω τοὺς φακέλους μου χειροκίνητα, παρόμοια μὲ τὸ παράδειγμα fastmail.</p>
</li>
</ul>
<p>Μὴ διστάσεις νὰ ὁρίσεις πολλαπλοὺς λογαριασμοὺς μὲ αὐτὸν τὸν τρόπο.</p>
<p>Μετὰ τὴ διαμόρφωση τοῦ isync, ξεκίνα τὸν ἀρχικὸ συγχρονισμὸ τρέχοντας αὐτὴ
τὴν ἐντολή:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ mbsync -a
</span></span></code></pre></div><h2 id="setting-up-mu-mu4e">Ρύθμιση mu &amp; mu4e</h2>
<p>Πρῶτα, πρέπει νὰ τρέξεις τὴν ἀρχικὴ εὐρετηρίαση.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>mu init --maildir=~/Mail --my-address myaccount@fastmail.com
</span></span><span style="display:flex;"><span>mu index
</span></span></code></pre></div><p><code>NOTE</code>: Μπορεῖς νὰ προσθέσεις ὅσα ὁρίσματα <code>--my-address</code> θέλεις.</p>
<p>Τώρα εἶναι ὥρα νὰ δημιουργήσεις τὴ διαμόρφωση mu4e γιὰ Ἤμαξ.</p>
<p>Μπορεῖς νὰ τὴ δημιουργήσεις ὡς μονάδα, ἢ ἁπλῶς ὡς μέρος τοῦ :config μὲ
use-package.  Προσωπικὰ ὁρίζω μεταβλητὲς στὸ init.el μου ἔτσι:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(defvar is-desktop (<span style="color:#a6e22e">equal</span> (<span style="color:#a6e22e">system-name</span>) <span style="color:#e6db74">&#34;desktop-hostname&#34;</span>)) <span style="color:#75715e">;; your $HOSTNAME</span>
</span></span><span style="display:flex;"><span>(defvar is-laptop (<span style="color:#a6e22e">equal</span> (<span style="color:#a6e22e">system-name</span>) <span style="color:#e6db74">&#34;laptop-hostname&#34;</span>))
</span></span></code></pre></div><p>Δημιούργησε <code>~/.emacs.d/modules/thanos-mu4e.el</code> γιὰ τὴ διαμόρφωση μονάδας
mu4e.  Καὶ πρόσθεσε αὐτὸ στὸ init.el μου</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(add-to-list <span style="color:#e6db74">&#39;load-path</span> <span style="color:#e6db74">&#34;~/.emacs.d/modules&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(when (or is-desktop is-laptop)
</span></span><span style="display:flex;"><span>  (require <span style="color:#e6db74">&#39;thanos-mu4e</span>))
</span></span></code></pre></div><p>Ἔτσι φορτώνω τὴ διαμόρφωση mu4e μόνο ὅταν χρησιμοποιῶ φορητὸ ἢ ἐπιτραπέζιο ὑπολογιστή.</p>
<h2 id="loading-mu4e">Φόρτωση Mu4e</h2>
<p>Βεβαιώσου ὅτι τὸ <code>mu4e</code> εἶναι στὸ load-path:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(add-to-list <span style="color:#e6db74">&#39;load-path</span> <span style="color:#e6db74">&#34;/usr/share/emacs/site-lisp/mu4e/&#34;</span>) <span style="color:#75715e">;; path to mu4e</span>
</span></span><span style="display:flex;"><span>(require <span style="color:#e6db74">&#39;mu4e</span>)
</span></span></code></pre></div><h2 id="the-essentials">Τὰ οὐσιώδη</h2>
<p>Αὐτὸ εἶναι ἕνα παράδειγμα διαμόρφωσης γιὰ νὰ ξεκινήσεις μὲ mu4e
χρησιμοποιώντας πολλαπλοὺς λογαριασμούς:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setf mu4e-get-mail-command <span style="color:#e6db74">&#34;mbsync -a&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(when (and is-desktop (server-running-p))
</span></span><span style="display:flex;"><span>  (setf mu4e-update-interval (<span style="color:#a6e22e">*</span> <span style="color:#ae81ff">10</span> <span style="color:#ae81ff">60</span>)))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">;; Snippet from EmacsWiki</span>
</span></span><span style="display:flex;"><span>(defun set-mu4e-context (context-name full-name mail-address signature)
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;Return a mu4e context named CONTEXT-NAME with :match-func matching
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    folder name CONTEXT-NAME in Maildir. The context&#39;s </span><span style="color:#e6db74">`user-mail-address&#39;</span><span style="color:#e6db74">,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    </span><span style="color:#e6db74">`user-full-name&#39;</span><span style="color:#e6db74"> and </span><span style="color:#e6db74">`mu4e-compose-signature&#39;`smtpmail-smpt-server&#39;</span><span style="color:#e6db74"> is set to MAIL-ADDRESS
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    FULL-NAME SIGNATURE and SERVER respectively.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Special folders are set to context specific folders.&#34;</span>
</span></span><span style="display:flex;"><span>  (let ((dir-name (<span style="color:#a6e22e">concat</span> <span style="color:#e6db74">&#34;/&#34;</span> context-name)))
</span></span><span style="display:flex;"><span>    (make-mu4e-context
</span></span><span style="display:flex;"><span>     :name context-name
</span></span><span style="display:flex;"><span>     <span style="color:#75715e">;; we match based on the maildir of the message</span>
</span></span><span style="display:flex;"><span>     :match-func
</span></span><span style="display:flex;"><span>     <span style="color:#f92672">`</span>(lambda (msg)
</span></span><span style="display:flex;"><span>    (when msg
</span></span><span style="display:flex;"><span>      (string-match-p
</span></span><span style="display:flex;"><span>       <span style="color:#f92672">,</span>(<span style="color:#a6e22e">concat</span> <span style="color:#e6db74">&#34;^&#34;</span> dir-name)
</span></span><span style="display:flex;"><span>       (mu4e-message-field msg :maildir))))
</span></span><span style="display:flex;"><span>     :vars
</span></span><span style="display:flex;"><span>     <span style="color:#f92672">`</span>((user-mail-address    <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>mail-address)
</span></span><span style="display:flex;"><span>       (<span style="color:#a6e22e">user-full-name</span>       <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>full-name)
</span></span><span style="display:flex;"><span>       (mu4e-sent-folder     <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>(<span style="color:#a6e22e">concat</span> dir-name <span style="color:#e6db74">&#34;/Sent&#34;</span>))
</span></span><span style="display:flex;"><span>       (mu4e-drafts-folder   <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>(<span style="color:#a6e22e">concat</span> dir-name <span style="color:#e6db74">&#34;/Drafts&#34;</span>))
</span></span><span style="display:flex;"><span>       (mu4e-trash-folder    <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>(<span style="color:#a6e22e">concat</span> dir-name <span style="color:#e6db74">&#34;/Trash&#34;</span>))
</span></span><span style="display:flex;"><span>       (mu4e-trash-folder    <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>(<span style="color:#a6e22e">concat</span> dir-name <span style="color:#e6db74">&#34;/Starred&#34;</span>))
</span></span><span style="display:flex;"><span>       (mu4e-refile-folder   <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>(<span style="color:#a6e22e">concat</span> dir-name <span style="color:#e6db74">&#34;/Archive&#34;</span>))
</span></span><span style="display:flex;"><span>       (mu4e-compose-signature <span style="color:#f92672">.</span> <span style="color:#f92672">,</span>signature)))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">;;Fixing duplicate UID errors when using mbsync and mu4e</span>
</span></span><span style="display:flex;"><span>(setf mu4e-change-filenames-when-moving <span style="color:#66d9ef">t</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(setf mu4e-maildir-shortcuts
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">&#39;</span>((<span style="color:#e6db74">&#34;/Fastmail/Inbox&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">?f</span>)
</span></span><span style="display:flex;"><span>    (<span style="color:#e6db74">&#34;/Drafts&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">?d</span>)
</span></span><span style="display:flex;"><span>    (<span style="color:#e6db74">&#34;/Sent&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">?s</span>)
</span></span><span style="display:flex;"><span>    (<span style="color:#e6db74">&#34;/Gmail-Account/[Gmail]/All Mail&#34;</span> <span style="color:#f92672">.</span> <span style="color:#e6db74">?g</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(setf mu4e-contexts
</span></span><span style="display:flex;"><span>      (<span style="color:#a6e22e">list</span>
</span></span><span style="display:flex;"><span>       (make-mu4e-context
</span></span><span style="display:flex;"><span>    :name <span style="color:#e6db74">&#34;fastmail&#34;</span>
</span></span><span style="display:flex;"><span>    :match-func
</span></span><span style="display:flex;"><span>    (lambda (msg)
</span></span><span style="display:flex;"><span>      (when msg
</span></span><span style="display:flex;"><span>        (string-prefix-p <span style="color:#e6db74">&#34;/Fastmail&#34;</span> (mu4e-message-field msg :maildir))))
</span></span><span style="display:flex;"><span>    :vars <span style="color:#f92672">&#39;</span>((user-mail-address <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;username@fastmail.com&#34;</span>)
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">user-full-name</span>    <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;User Name&#34;</span>)
</span></span><span style="display:flex;"><span>        (smtpmail-smtp-server <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;smtp.fastmail.com&#34;</span>)
</span></span><span style="display:flex;"><span>        (smtpmail-smtp-service <span style="color:#f92672">.</span> <span style="color:#ae81ff">465</span>)
</span></span><span style="display:flex;"><span>        (smtpmail-stream-type <span style="color:#f92672">.</span> ssl)
</span></span><span style="display:flex;"><span>        (mu4e-drafts-folder  <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;/Drafts&#34;</span>)
</span></span><span style="display:flex;"><span>        (mu4e-sent-folder  <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;/Sent&#34;</span>)
</span></span><span style="display:flex;"><span>        (mu4e-refile-folder  <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;/Archive&#34;</span>)
</span></span><span style="display:flex;"><span>        (mu4e-trash-folder  <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;/Trash&#34;</span>)))
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">;; You can comment out the second account.</span>
</span></span><span style="display:flex;"><span>       (make-mu4e-context
</span></span><span style="display:flex;"><span>    :name <span style="color:#e6db74">&#34;gmail&#34;</span>
</span></span><span style="display:flex;"><span>    :match-func
</span></span><span style="display:flex;"><span>    (lambda (msg)
</span></span><span style="display:flex;"><span>      (when msg
</span></span><span style="display:flex;"><span>        (string-prefix-p <span style="color:#e6db74">&#34;/Gmail-Account&#34;</span> (mu4e-message-field msg :maildir))))
</span></span><span style="display:flex;"><span>    :vars <span style="color:#f92672">&#39;</span>((user-mail-address <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;username@gmail.com&#34;</span>)
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">user-full-name</span>    <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;User Name&#34;</span>)
</span></span><span style="display:flex;"><span>        (smtpmail-smtp-server <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;smtp.gmail.com&#34;</span>)
</span></span><span style="display:flex;"><span>        (smtpmail-smtp-service <span style="color:#f92672">.</span> <span style="color:#ae81ff">465</span>)
</span></span><span style="display:flex;"><span>        (smtpmail-stream-type <span style="color:#f92672">.</span> ssl)))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(setf message-send-mail-function <span style="color:#e6db74">&#39;smtpmail-send-it</span>
</span></span><span style="display:flex;"><span>      mu4e-compose-signature <span style="color:#e6db74">&#34;My Signature&#34;</span>
</span></span><span style="display:flex;"><span>      mu4e-compose-context-policy <span style="color:#e6db74">&#39;ask</span>)
</span></span></code></pre></div><h2 id="extras">Ἐπιπλέον</h2>
<h3 id="mu4e-actions">Ἐνέργειες Mu4e</h3>
<p>Οἱ ἐνέργειες Mu4e καθιστοῦν πραγματικὰ ἁπλὴ τὴν ἐργασία μὲ διορθώσεις Git· αὐτὴ
εἶναι ἕνα παράδειγμα διαμόρφωσης ποὺ ἴσως θέλεις νὰ χρησιμοποιήσεις:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setf mu4e-view-actions
</span></span><span style="display:flex;"><span>      (delete-dups
</span></span><span style="display:flex;"><span>       (<span style="color:#a6e22e">append</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&#39;</span>((<span style="color:#e6db74">&#34;gapply git patches&#34;</span> <span style="color:#f92672">.</span> mu4e-action-git-apply-patch)
</span></span><span style="display:flex;"><span>      (<span style="color:#e6db74">&#34;mgit am patch&#34;</span> <span style="color:#f92672">.</span> mu4e-action-git-apply-mbox)))))
</span></span></code></pre></div><h3 id="sign-your-emails-using-pgp">Ὑπόγραψε τὰ μηνύματα ἠλεκτρονικοῦ ταχυδρομείου σου μὲ pgp</h3>
<p>Ἂν ἔχεις ρυθμίσει τὸ δικό σου κλειδὶ pgp, μπορεῖς νὰ ὑπογράφεις αὐτόματα ὅλα
τὰ μηνύματα ἠλεκτρονικοῦ ταχυδρομείου σου μὲ αὐτὸ τὸ ἄγκιστρο:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(add-hook <span style="color:#e6db74">&#39;message-send-hook</span> <span style="color:#e6db74">&#39;mml-secure-message-sign-pgpmime</span>)
</span></span></code></pre></div><p>Ρίξε μία ματιὰ στὶς συναρτήσεις ποὺ ὁρίζονται γιὰ <code>mml-mode-map</code> γιὰ περισσότερα.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Πρώτη ἔκδοση Gnosis (γνῶσις)</title>
      <link>https://thanosapollo.org/el/posts/gnosis-release/</link>
      <pubDate>Tue, 16 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/el/posts/gnosis-release/</guid>
      <description>Gnosis (γνῶσις), ὑλοποίηση συστήματος ἐπανάληψης μὲ διαστήματα γιὰ GNU Ἤμαξ</description>
      <content:encoded><![CDATA[<p>Τὸ Gnosis (γνῶσις) εἶναι ὑλοποίηση συστήματος
<a href="https://en.wikipedia.org/wiki/Spaced_repetition">ἐπανάληψης μὲ
διαστήματα</a>
(SRS) γιὰ λήψη σημειώσεων καὶ αὐτοέλεγχο, γιὰ <a href="https://www.gnu.org/software/emacs/">GNU
Ἤμαξ</a>.</p>
<p>Τὸ Gnosis δὲν χρησιμοποιεῖ μάθηση τύπου καρτῶν μνήμης· ἀντ’ αὐτοῦ
χρησιμοποιεῖ δυαδικὴ τιμὴ γιὰ νὰ ἀξιολογήσει τὴν εἴσοδο τοῦ χρήστη.
Δηλαδή ἢ ξέρεις τὴ σωστὴ ἀπάντηση, ἢ δὲν τὴν ξέρεις· δὲν ἐμπλέκεται
καμία δική σου βαθμολόγηση.</p>
<h2 id="about">Περὶ</h2>
<p>Στὸ προηγούμενό μου ἄρθρο, <a href="http://thanosapollo.org/post/spaced-repetition-software-gripes/">Παράπονα γιὰ λογισμικὸ ἐπανάληψης μὲ διαστήματα</a>,
παρουσίασα ἕνα σχέδιο γιὰ αὐτὸ ποὺ θεωρῶ βέλτιστο σχεδιασμὸ ἑνὸς
SRS, ποὺ καλύπτει τὶς <strong>δικές μου προσωπικὲς</strong> προτιμήσεις.</p>
<p>Ἔτσι, ἀνέπτυξα τὸ δικό μου SRS, gnosis (γνῶσις), προφερόμενο
«GNU-sis», <em>ποὺ σημαίνει γνώση στὰ ἑλληνικά</em>.  Αὐτὸ τὸ SRS ἀντιμετωπίζει
τὶς ἀνησυχίες ποὺ εἶχα ἐπισημάνει προηγουμένως.  Πρὸς τὸ παρόν, τὸ
βρῆκα ἐξαιρετικὰ ὠφέλιμο καὶ, ὡς ἐκ τούτου, ἀποφάσισα νὰ τὸ μοιραστῶ
μὲ ὅλους σας.</p>
<h3 id="differences-with-other-srs">Διαφορὲς μὲ ἄλλα SRS</h3>
<p>Τὸ Gnosis δὲν ὑλοποιεῖ συνεδρίες ἐπανάληψης μὲ κάρτες μνήμης ὅπου ὁ
χρήστης βαθμολογεῖ μόνος του τὴν ἀπάντησή του σὲ αὐθαίρετη κλίμακα.
Ἀντ’ αὐτοῦ ὑλοποιεῖ τύπους «σημείωσης» ποὺ ἀπαιτοῦν εἴσοδο χρήστη.
Κάποιοι ἀπὸ αὐτοὺς τοὺς τύπους σημειώσεων, ὅπως τὸ <code>MCQ</code>
<em>ἐρώτηση πολλαπλῆς ἐπιλογῆς</em>, ἐπιτρέπουν ἀκόμα καὶ τὴν προσομοίωση
ἐξετάσεων πραγματικῆς ζωῆς.</p>
<p>Σὲ ἀντίθεση μὲ ἄλλες ὑλοποιήσεις SRS γιὰ GNU Ἤμαξ, τὸ gnosis δὲν
βασίζεται στὸ <code>org-mode</code>, ποὺ ἔχω βρεῖ ὅτι δὲν εἶναι ἰδανικὴ ἐπιλογὴ
ὡς ἀντικαταστάτης βάσης δεδομένων.  Ἀντ’ αὐτοῦ ἐπιλέγει βάση
<a href="https://www.sqlite.org/index.html">sqlite</a> μὲ
<a href="https://en.wikipedia.org/wiki/Git">git</a> γιὰ παρακολούθηση ὁποιωνδήποτε
ἀλλαγῶν, ἐπιτρέποντας ἀποδοτικὴ διαχείριση δεδομένων, χειρισμὸ καὶ
ἀκεραιότητα δεδομένων.</p>
<p>Ἐπιπλέον, ἐφόσον τὸ Gnosis βασίζεται στὸν Ἤμαξ καὶ εἶναι γραμμένο
σὲ Emacs Lisp, προσφέρει βολικὴ καὶ (ἐλπίζω) εὐχάριστη ἐμπειρία
προσαρμογῆς σύμφωνα μὲ τὶς ἀτομικές σου προτιμήσεις.</p>
<p>Ὡστόσο, ἕνα μειονέκτημα τῆς χρήσης τοῦ Gnosis εἶναι ὅτι πρὸς τὸ παρὸν
δὲν ὑποστηρίζεται σὲ κινητὲς συσκευές, καθὼς ὁ Ἤμαξ δὲν ἔχει ἀκόμα
ἐπεκτείνει τὴ συμβατότητά του σὲ τέτοιες πλατφόρμες.</p>
<h2 id="installation">Ἐγκατάσταση</h2>
<p>Μπορεῖς νὰ πάρεις τὸ gnosis ἀπὸ τὸν προσωπικό μου git διακομιστὴ
<a href="https://git.thanosapollo.org/gnosis">ἐδῶ</a> ἢ χρησιμοποιώντας αὐτὸν τὸν
<a href="https://git.sr.ht/~thanosapollo/gnosis">ἀντίγραφο στὸ SourceHut</a>.</p>
<h3 id="straight.el">Straight.el</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(straight-use-package
</span></span><span style="display:flex;"><span> <span style="color:#f92672">&#39;</span>(gnosis :type git
</span></span><span style="display:flex;"><span>          :host <span style="color:#66d9ef">nil</span>
</span></span><span style="display:flex;"><span>          :repo <span style="color:#e6db74">&#34;https://git.thanosapollo.org/gnosis&#34;</span>))
</span></span></code></pre></div><h3 id="manual">Χειροκίνητα</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>$ git clone https://git.thanosapollo.org/gnosis
</span></span></code></pre></div><p><em>Πρόσθεσε αὐτὸ στὴ διαμόρφωση Ἤμαξ σου:</em></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(add-to-list <span style="color:#e6db74">&#39;load-path</span> <span style="color:#e6db74">&#34;/path/to/gnosis&#34;</span>)
</span></span><span style="display:flex;"><span>(load-file <span style="color:#e6db74">&#34;~/path/to/gnosis.el&#34;</span>)
</span></span><span style="display:flex;"><span>(require <span style="color:#e6db74">&#39;gnosis</span>)
</span></span></code></pre></div><h2 id="adding-notes">Προσθήκη σημειώσεων</h2>
<p>Ἡ δημιουργία σημειώσεων γιὰ gnosis μπορεῖ νὰ γίνει μὲ ἁπλὸ
<code>M-x gnosis-add-note</code></p>
<p>Τὰ πάντα γίνονται μέσω τοῦ mini-buffer.  Ἡ προσωπική μου ροὴ ἐργασίας
ἐκμεταλλεύεται αὐτὸ μὴ φεύγοντας οὐσιαστικὰ ἀπὸ τὴν προτροπὴ
<code>gnosis-add-note</code> μέχρι νὰ τελειώσω τὴ μελέτη ἑνὸς κεφαλαίου/τμήματος,
χρησιμοποιώντας
<a href="https://github.com/vedang/pdf-tools">pdf-tools</a> ἢ
<a href="https://depp.brause.cc/nov.el/">nov.el</a>.</p>
<p><em>Νομίζω δὲν θὰ χρειαστεῖς πολλὴ καθοδήγηση στὴ δημιουργία σημειώσεων
γιὰ ὁποιονδήποτε τύπο σημείωσης, ἐκτὸς ἀπὸ <code>cloze</code>.</em></p>
<h3 id="creating-cloze-type-notes">Δημιουργία σημειώσεων τύπου cloze</h3>
<p>Οἱ ἐρωτήσεις σημειώσεων τύπου cloze μορφοποιοῦνται παρόμοια μὲ τὴ
σύνταξη τοῦ Anki, ὡς ἑξῆς:
&gt; Ἡ {c1:κυπροεπταδίνη} εἶναι {c2:ἀνταγωνιστὴς ὑποδοχέων 5-HT2} ποὺ χρησιμοποιεῖται γιὰ τὴ θεραπεία τοῦ {c2:συνδρόμου σεροτονίνης}</p>
<p><em>ΣΗΜΕΙΩΣΗ</em>: Μπορεῖς ἐπίσης νὰ μορφοποιήσεις clozes σὰν Anki ἂν τὸ
προτιμᾶς· π.χ. <code>{{c1::Cyproheptadine}}</code></p>
<ul>
<li>
<p>Γιὰ κάθε ἐτικέτα <code>cX</code> θὰ δημιουργηθεῖ σημείωση τύπου cloze· τὸ
παραπάνω παράδειγμα δημιουργεῖ 2 σημειώσεις τύπου cloze.</p>
</li>
<li>
<p>Κάθε ἐτικέτα <code>cX</code> μπορεῖ νὰ ἔχει πολλαπλὰ clozes, ἀλλὰ κάθε cloze
πρέπει νὰ εἶναι <em>ΜΟΝΑΔΙΚΗ</em> λέξη (ἢ μοναδικὸς συνδυασμὸς λέξεων) στὴ
δεδομένη σημείωση.</p>
</li>
</ul>
<h2 id="customizing-gnosis-algorithm">Προσαρμογὴ ἀλγορίθμου gnosis</h2>
<h3 id="gnosis-algorithm-interval"><code>gnosis-algorithm-interval</code></h3>
<p>Αὐτὴ εἶναι μιὰ λίστα 2 ἀριθμῶν, γιὰ τὰ πρῶτα 2 διαστήματα μετὰ ἀπὸ
ἐπιτυχῆ ἐπανάληψη.  Γιὰ παράδειγμα:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setq gnosis-algorithm-interval <span style="color:#f92672">&#39;</span>(<span style="color:#ae81ff">1</span> <span style="color:#ae81ff">3</span>))
</span></span></code></pre></div><p>Μετὰ τὴν πρώτη ἐπιτυχῆ ἐπανάληψη μιᾶς σημείωσης, θὰ τὴ δεῖς ξανὰ
αὔριο· ἂν ἐπαναλάβεις ἐπιτυχῶς τὴν ἴδια σημείωση ξανά, ἡ ἑπόμενη
ἐπανάληψη θὰ εἶναι μετὰ ἀπὸ 3 μέρες.</p>
<h3 id="gnosis-algorithm-ef"><code>gnosis-algorithm-ef</code></h3>
<p>Αὐτὴ εἶναι ἡ τιμὴ τοῦ «παράγοντα εὐκολίας» gnosis· βασικὰ εἶναι μιὰ
λίστα ποὺ ἀποτελεῖται ἀπὸ 3 στοιχεῖα.  Τὸ πρῶτο στοιχεῖο εἶναι ὁ
παράγοντας αὔξησης, ποὺ χρησιμοποιεῖται γιὰ νὰ αὐξήσει τὸν παράγοντα
εὐκολίας μετὰ ἀπὸ ἐπιτυχῆ ἐπανάληψη.  Τὸ δεύτερο στοιχεῖο ἀναφέρεται
στὸν παράγοντα μείωσης, ποὺ χρησιμοποιεῖται γιὰ νὰ μειώσει τὸν
παράγοντα εὐκολίας μετὰ ἀπὸ ἀποτυχημένη ἐπανάληψη.  Τὸ τρίτο στοιχεῖο
εἶναι ὁ (ἀρχικὸς) συνολικὸς παράγοντας εὐκολίας, ποὺ χρησιμοποιεῖται
γιὰ τὸν ὑπολογισμὸ τοῦ ἑπόμενου διαστήματος.</p>
<p>Τὰ βασικὰ τοῦ πῶς χρησιμοποιεῖται εἶναι ὅτι πολλαπλασιάζεται μὲ τὸ
τελευταῖο διάστημα· π.χ. ἂν ἐπανέλαβες τελευταία φορὰ μιὰ σημείωση πρὶν
6 μέρες, καὶ ὁ παράγοντας εὐκολίας (συνολικὸς) αὐτῆς τῆς σημείωσης
εἶναι 2.0, τὸ ἑπόμενο διάστημά σου θὰ ἦταν 6 * 2.0 &amp; ὁ ἑπόμενος
συνολικὸς ef θὰ εἶναι 2.0 + increase-factor.</p>
<p>Παράδειγμα διαμόρφωσης:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setq gnosis-algorithm-ef <span style="color:#f92672">&#39;</span>(<span style="color:#ae81ff">0.3</span> <span style="color:#ae81ff">0.3</span> <span style="color:#ae81ff">1.3</span>))
</span></span></code></pre></div><h3 id="gnsois-algorithm-ff"><code>gnsois-algorithm-ff</code></h3>
<p>Αὐτὴ εἶναι ἡ τιμὴ τοῦ παράγοντα λήθης (ff) gnosis· πρέπει νὰ εἶναι
ἀριθμὸς κινητῆς ὑποδιαστολῆς κάτω ἀπὸ 1.  Χρησιμοποιεῖται γιὰ τὸν
ὑπολογισμὸ τοῦ ἑπόμενου διαστήματος μετὰ ἀπὸ ἀποτυχημένη ἐπανάληψη,
πολλαπλασιαζόμενη μὲ τὸ τελευταῖο διάστημα.  Ἂν γιὰ μιὰ σημείωση μὲ
τιμὴ last-interval 6 ἡμερῶν καὶ ff 0.5, μετὰ ἀπὸ ἀποτυχημένη
ἐπανάληψη τὸ ἑπόμενο διάστημα θὰ εἶναι σὲ 6 * 0.5 μέρες</p>
<p>Παράδειγμα διαμόρφωσης:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(setq gnosis-algorithm-ff <span style="color:#ae81ff">0.5</span>)
</span></span></code></pre></div>]]></content:encoded>
    </item>
    <item>
      <title>Παράπονα γιὰ λογισμικὸ ἐπανάληψης μὲ διαστήματα</title>
      <link>https://thanosapollo.org/el/posts/spaced-repetition-software-gripes/</link>
      <pubDate>Tue, 09 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/el/posts/spaced-repetition-software-gripes/</guid>
      <description>Προβλήματα μὲ λογισμικὸ ἐπανάληψης μὲ διαστήματα (μάθησης) &amp;amp; ἀνακοίνωση τοῦ Gnosis</description>
      <content:encoded><![CDATA[<p>Σὲ αὐτὸ τὸ ἄρθρο οὐσιαστικὰ δημοσιοποιῶ τὶς σημειώσεις μου γιὰ
λογισμικὸ ἐπανάληψης μὲ διαστήματα, καὶ ἀνακοινώνω ὅτι δουλεύω στὸ
<a href="https://git.thanosapollo.org/gnosis">gnosis</a>, ἐπέκταση/πακέτο μάθησης
μὲ ἐπανάληψη μὲ διαστήματα γιὰ GNU Ἤμαξ.</p>
<p>Θὰ πρέπει ἐπίσης νὰ σημειώσω ὅτι θεωρῶ τὴν
<a href="https://en.wikipedia.org/wiki/Spaced_repetition">ἐπανάληψη μὲ
διαστήματα</a> κόλπο γιὰ τὴ μάθηση, <strong>ποὺ θὰ ἔπρεπε νὰ χρησιμοποιεῖται
ἀπὸ κάθε φοιτητή</strong>.</p>
<h2 id="what-is-spaced-repetition-learning">Τί εἶναι ἡ μάθηση μὲ ἐπανάληψη μὲ διαστήματα</h2>
<p>Ἡ <a href="https://en.wikipedia.org/wiki/Spaced_repetition">ἐπανάληψη μὲ
διαστήματα</a>
βασίζεται στὴν ἑξῆς προϋπόθεση:
&gt; Ἡ ἐπαναλαμβανόμενη ἔκθεση σὲ πληροφορία συμβάλλει στὴν ἐπιμήκυνση τῆς
&gt; διατήρησης μνήμης.</p>
<p>Οἱ γνωστικές μας ἱκανότητες εἶναι ἐγγενῶς προγραμματισμένες νὰ
διατηροῦν σχετικὴ πληροφορία ἐνῶ ἀπορρίπτουν περιττὲς λεπτομέρειες,
διαδικασία ποὺ ἐξαρτᾶται ἀπὸ τὴ συχνότητα μὲ τὴν ὁποία συναντᾶμε τέτοια
πληροφορία.</p>
<blockquote>
<p>Σύνοψις: Ὅσο πιὸ συχνὰ ἐκτίθεσαι σὲ πληροφορία, τόσο περισσότερο τὴν
διατηρεῖς</p>
</blockquote>
<h2 id="my-gripes-with-spaced-repetition-software">Τὰ «παράπονά» μου μὲ λογισμικὸ ἐπανάληψης μὲ διαστήματα</h2>
<p>Ἔχω ἐπιλέξει νὰ ἀναπτύξω τὸ δικό μου SRS (λογισμικὸ/σύστημα ἐπανάληψης μὲ διαστήματα) ἀντὶ νὰ βασίζομαι σὲ ὑπάρχοντα, καθιερωμένα.  Μέσω
τῆς ὑλοποίησής μου μὲ ὄνομα «gnosis» (GNOH-sis, ποὺ σημαίνει γνώση στὰ
ἑλληνικὰ) στοχεύω νὰ ἀντιμετωπίσω καὶ νὰ ὑπερβῶ τὶς προκλήσεις καὶ
τοὺς περιορισμοὺς ποὺ συνδέονται μὲ τρέχουσες λύσεις SRS.  Μὲ τὸ
gnosis, ἐλπίζω νὰ ἐπιλύσω τὰ περισσότερα, ἂν ὄχι ὅλα, ἀπὸ αὐτὰ τὰ
προβλήματα καὶ νὰ προσφέρω πιὸ ἐκλεπτυσμένη καὶ <strong>προηγμένη</strong> μαθησιακὴ
ἐμπειρία.</p>
<h3 id="not-libreware">Ὄχι libreware</h3>
<p>Αὐτὸ ἀναφέρεται σὲ <a href="https://en.wikipedia.org/wiki/Proprietary_software">ἰδιόκτητα
προγράμματα λογισμικοῦ</a> ποὺ
ὑλοποιοῦν ἐπανάληψη μὲ διαστήματα, μερικὰ ἀπὸ τὰ ὁποῖα εἶναι ἀκόμα καὶ
ἔνοχα γιὰ ἀφαίρεση τῆς δυνατότητας ἐπανάληψης μὲ διαστήματα γιὰ τὴν
ὁποία οἱ χρήστες πλήρωσαν.  Εἶχα πληρωμένη συνδρομὴ μὲ τὸ
<a href="https://quizlet.com/">quizlet</a> μόνο γιὰ νὰ
ἀνακαλύψω ὅτι ἀφαίρεσαν τὴ δυνατότητα ἐπανάληψης μὲ διαστήματα ποὺ
εἶχα ἤδη πληρώσει &amp; χρησιμοποιοῦσα, καθιστώντας τὴν τότε ροὴ ἐργασίας
μου ἄχρηστη.</p>
<p>Μὴ βασίζεσαι σὲ λογισμικὸ ποὺ δὲν κατέχεις γιὰ τὴ δουλειά σου.  <strong>Δὲν
«κατέχεις» ἰδιόκτητο λογισμικό, παρὰ τὸ ὅτι πληρώνεις γι’ αὐτό.</strong></p>
<blockquote>
<p>Θὰ ἔπρεπε νὰ ἐπιδιώκεις νὰ χρησιμοποιεῖς μόνο
<a href="https://en.wikipedia.org/wiki/Free_software">libreware</a> γιὰ τὴ ροὴ
ἐργασίας σου.</p>
</blockquote>
<h3 id="lack-of-customization">Ἔλλειψη προσαρμογῆς</h3>
<p>Τὸ καλὸ λογισμικὸ θὰ ἔπρεπε νὰ ταιριάζει στὴ ροὴ ἐργασίας σου σὰν
γάντι· γιὰ νὰ τὸ κάνει αὐτὸ πρέπει νὰ δίνει <em>πολὺ</em> χῶρο γιὰ
προσαρμογὴ ἀπὸ τὸν χρήστη.  Ἁπλὲς ἀλλαγὲς ὅπως ἀλλαγὲς
χρωματικοῦ σχήματος μέχρι πιὸ προηγμένη προσαρμογὴ χαρακτηριστικῶν
ὅπως προσθήκη δικών σου τύπων καρτῶν καὶ ἀλλαγὴ τοῦ ἀλγορίθμου
ἐπανάληψης μὲ διαστήματα θὰ ἔπρεπε νὰ εἶναι ἁπλὲς καὶ εὔκολες.  Γιὰ
παράδειγμα, ἕνας φοιτητὴς ἰατρικῆς θὰ χρησιμοποιοῦσε μεγαλύτερο
χρονικὸ διάστημα γιὰ τὸν ἀλγόριθμό του ἀπὸ, ἂς ποῦμε, κάποιον ποὺ
προσπαθεῖ νὰ ἐπεκτείνει τὸ ἰαπωνικό του λεξιλόγιο.</p>
<p>Ἀφοῦ ἤδη καθιερώσαμε τὴν ἀνάγκη τὸ ἰδανικό μας λογισμικὸ νὰ εἶναι
<em>libreware</em>, ἡ πραγματοποίηση ἀλλαγῶν στὰ βασικὰ συστατικὰ θὰ ἦταν
εὔκολη.  Ἀλλὰ θὰ ἔπρεπε νὰ προστεθεῖ ὅτι ἡ προσαρμογὴ γιὰ
διαφορετικὲς ἀνάγκες &amp; στυλ μάθησης θὰ ἔπρεπε νὰ εἶναι πρωταρχικὸς
στόχος κατὰ τὸν σχεδιασμὸ ἑνὸς SRS.</p>
<h3 id="flashcards-are-an-inferior-learning-method.">Οἱ κάρτες μνήμης εἶναι κατώτερη μέθοδος μάθησης.</h3>
<p>Οἱ κάρτες μνήμης εἶναι ἀρκετὰ ἁπλὲς νὰ φτιαχτοῦν· πρωτότυπες
μέθοδοι ἐπανάληψης μὲ διαστήματα χρησιμοποιοῦσαν φυσικὲς κάρτες μνήμης.
Οἱ σημερινοὶ ὑπολογιστὲς μᾶς ἐπιτρέπουν πιὸ ἐξελιγμένες μεθόδους
«ἐπανάληψης», <em>ὅπως τὴ χρήση εἰσόδου χρήστη</em>.</p>
<p>Ἡ χρήση εἰσόδου χρήστη γιὰ τὴν ἀξιολόγηση τῆς ἀποτελεσματικότητας μιᾶς
ἐπανάληψης εἶναι προτιμότερη ἀπὸ τὸ ἁπλῶς νὰ ἀποκαλύπτεις μιὰ ἀπάντηση
καὶ νὰ ρωτᾶς ἂν ἦταν γνωστὴ ἢ ὄχι.  Αὐτὴ ἡ προσέγγιση ἐξασφαλίζει ὄχι
μόνο τὴν κατανόηση τῆς ἀπάντησης ἀλλὰ καὶ τὴν ἀκριβῆ ὀρθογραφία της.
Ἐπιπλέον, ὁδηγεῖ σὲ πιὸ ἀποδοτικὴ διατήρηση σὲ σύγκριση μὲ τὴν ἁπλὴ
ἐμφάνιση τῆς ἀπάντησης χωρὶς ἐνεργὴ συμμετοχὴ τοῦ χρήστη.</p>
<p>Ἰδανικὰ μὲ τὸ <a href="https://git.thanosapollo.org/gnosis">Gnosis</a> θὰ
ἤθελα ἐπίσης νὰ ὑλοποιήσω τύπο
<a href="https://en.wikipedia.org/wiki/Multiple_choice">MCQ</a> γιὰ προσομοίωση
τῶν ἐξετάσεων <a href="https://en.wikipedia.org/wiki/Usmle">USMLE</a> ποὺ
<em>ἐλπίζω</em> σύντομα νὰ ἐξεταστῶ.  <em>Αὐτὸ θὰ καταστήσει δυνατὴ τὴν
προσομοίωση ὁποιασδήποτε ἄλλης ἐξέτασης MCQ</em></p>
<h3 id="no-self-rating">Ὄχι αὐτοβαθμολόγηση</h3>
<p>Συνιστᾶται οἱ χρήστες νὰ μὴν αὐτοβαθμολογοῦν τὶς ἀπαντήσεις τους.  Ἡ
διαδικασία ἐπανάληψης θὰ ἔπρεπε νὰ περιλαμβάνει δυαδικὴ ἀξιολόγηση
ἐπιτυχίας ἢ ἀποτυχίας, ὅπου οἱ χρήστες εἴτε ἀνακαλοῦν σωστὰ τὴν
ἀπάντηση εἴτε ὄχι.  Αὐτὴ ἡ βαθμολογία ἐπιτυχίας/ἀποτυχίας θὰ
χρησιμοποιεῖται γιὰ νὰ καθορίσει τὸ ἑπόμενο διάστημα γιὰ τὴ συγκεκριμένη
σημείωση, βελτιστοποιώντας τὸ σύστημα ἐπανάληψης μὲ διαστήματα γιὰ
ἀποτελεσματικὴ μάθηση.</p>
<h3 id="collaboration">Συνεργασία</h3>
<p>Τὸ περισσότερο λογισμικὸ ἐπανάληψης μὲ διαστήματα βασίζεται σὲ βάσεις
δεδομένων γιὰ ἀποθήκευση, ἀλλὰ τὸ μειονέκτημα εἶναι ὅτι οἱ βάσεις
δεδομένων δὲν εἶναι εὔκολα ἀναγνώσιμες ἢ ἐπεξεργάσιμες ἀπὸ ἀνθρώπους,
ἐμποδίζοντας τὴν κοινὴ χρήση καὶ τὴ συνεργασία.</p>
<p>Γιὰ νὰ ἀντιμετωπίσω αὐτὸν τὸν περιορισμό, σκοπεύω νὰ ἐνσωματώσω
δυνατότητες ἐξαγωγῆς στὸ gnosis.  Αὐτὴ ἡ δυνατότητα θὰ ἐπέτρεπε στοὺς
χρήστες νὰ ἐξάγουν ἕνα deck σημειώσεων σὲ φιλικὴ πρὸς τὸν χρήστη μορφή,
τὸ ὁποῖο οἱ χρήστες μποροῦν νὰ μοιράζονται καὶ νὰ ἐπεξεργάζονται συνεργατικὰ μὲ
ἐργαλεῖα ὅπως ἀποθετήρια
<a href="https://en.wikipedia.org/wiki/Git">git</a>.</p>
<p>Αὐτὴ ἡ συνεργατικὴ προσέγγιση θὰ μᾶς ἐπέτρεπε νὰ δουλεύουμε μαζί, νὰ
μοιραζόμαστε, καὶ νὰ δημιουργοῦμε πολύτιμο μαθησιακὸ ὑλικὸ ποὺ μπορεῖ
νὰ χρησιμοποιηθεῖ καὶ νὰ τροποποιηθεῖ ἀπὸ ὅλους τοὺς ἐμπλεκόμενους.</p>
<h3 id="syncing-between-devices">Συγχρονισμὸς μεταξὺ συσκευῶν</h3>
<p>Τὸ Anki κάνει τὸν συγχρονισμὸ μεταξὺ συσκευῶν παιχνιδάκι!  Ἀλλὰ γίνεται
τρομερὰ ἀργὸ ἂν συγχρονίζεις νέα συσκευὴ ὅταν ἔχεις πολὺ ὑλικὸ στὸν
λογαριασμό σου, συν ὅτι βασίζεσαι στοὺς διακομιστὲς τοῦ Anki γιὰ νὰ
δουλεύει.</p>
<p>Ἀφοῦ στὸ gnosis θὰ χρησιμοποιῶ
<a href="https://en.wikipedia.org/wiki/Sqlite">sqlite</a> ὡς ὑλοποίηση βάσης
δεδομένων, ἁπλῶς θὰ χρησιμοποιοῦσα git γιὰ νὰ κρατῶ τὴ βάση δεδομένων
μου συγχρονισμένη μεταξὺ διαφορετικῶν συσκευῶν.</p>
<h2 id="gnosis">Gnosis</h2>
<p>Μπορεῖς νὰ βρεῖς τὸ gnosis στὸν git διακομιστή μου
<a href="https://git.thanosapollo.org/gnosis">ἐδῶ</a>, <em>διάβασε τὸ τμῆμα Περὶ
γιὰ ὁδηγίες ἐγκατάστασης</em>.</p>
<p>Δὲν εἶναι ἀκόμα οὔτε σὲ δοκιμαστικὴ ἔκδοση ἄλφα, ἀλλὰ διαθέτει ἤδη τὴ βασικὴ
λειτουργικότητα γιὰ νὰ τὸ δοκιμάσεις.  Μὴ διστάσεις νὰ μοῦ
στείλεις μήνυμα ἠλεκτρονικοῦ ταχυδρομείου ἂν ἔχεις ἐρωτήσεις ἢ αἰτήματα γιὰ gnosis.</p>]]></content:encoded>
    </item>
    <item>
      <title>pcomplete-yay | Ἐπεκτάσιμες συμπληρώσεις γιὰ τὸ yay στὸ eshell</title>
      <link>https://thanosapollo.org/el/posts/pcomplete-yay/</link>
      <pubDate>Fri, 13 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/el/posts/pcomplete-yay/</guid>
      <description>Ἐπεκτάσιμες συμπληρώσεις γιὰ τὸ yay στὸ eshell [Πακέτο Ἤμαξ]</description>
      <content:encoded><![CDATA[<p>Τὸ Eshell εἶναι τὸ ἀγαπημένο μου κέλυφος, ἀλλὰ δὲν εἶναι τόσο καλοδουλεμένο οὔτε
καλὰ τεκμηριωμένο γιὰ καθημερινὲς ἐργασίες.  Ἕνα τέτοιο παράδειγμα εἶναι ἡ
χρήση συμπληρώσεων γιὰ διαχειριστὲς πακέτων, ὅπως τὸ yay, γιὰ ἐγκατάσταση ἢ
ἀφαίρεση πακέτων.</p>
<h2 id="about">Σχετικά</h2>
<p>Χρησιμοποιῶ τὸ eshell περισσότερο ἀπὸ κάθε ἄλλο κέλυφος τελευταῖα, ἀλλὰ
ὑστερεῖ σὲ συμπληρώσεις σὲ σύγκριση μὲ ἄλλα κελύφη.</p>
<p>Ἔφτιαξα αὐτὸ τὸ ἁπλὸ πακέτο γιὰ νὰ προσφέρει συμπληρώσεις γιὰ ἐγκατάσταση
καὶ ἀφαίρεση πακέτων μὲ τὸ <a href="https://github.com/Jguer/yay">yay</a>.</p>
<p>Τὸ Eshell παρέχει ἀπρόσκοπτη ἐνσωμάτωση μὲ τὸ ὑπόλοιπο οἰκοσύστημα τοῦ
Ἤμαξ καί, χάρη στὴν ἐνσωμάτωση μὲ τὸ
<a href="https://codeberg.org/akib/emacs-eat">Eat</a>, δὲν ἔχει πλέον πρόβλημα μὲ
ὀπτικὲς ἐντολές, μὲ τὶς ὁποῖες παλαιότερα δυσκολευόταν.  Τὸ μόνο ποὺ τοῦ λείπει εἶναι
ἀξιοπρεπεῖς δυνατότητες συμπλήρωσης· πιστεύω πὼς σύντομα θὰ δοῦμε
περισσότερες.</p>
<h2 id="installation">Ἐγκατάσταση</h2>
<p>Μπορεῖτε νὰ πάρετε τὸ <code>pcomplete-yay</code> ἀκολουθώντας τὶς ὁδηγίες στὸ
<a href="https://git.thanosapollo.org/pcomplete-yay/about">git ἀποθετήριο</a> τοῦ ἔργου.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
