<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Ramblings of a lost one</title>
<generator>Emacs webfeeder.el</generator>
<link href="https://leehalls.net"/>
<link href="https://leehalls.net//Users/leehalls/Documents/org_website copy/public/rss.xml" rel="self"/>
<id>https://leehalls.net//Users/leehalls/Documents/org_website copy/public/rss.xml</id>
<updated>2026-09-03T15:07:00+01:00</updated>
<entry>
  <title>Complete re-write</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Complete re-write</h1>
 <div id="table-of-contents" role="doc-toc">
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul> <li> <a href="#orga18097e">No preview text use #+DESCRIPTION instead</a></li>
 <li> <a href="#org5f5b62c">Other org-publish references</a></li>
 <li> <a href="#orgb075202">chatGPT rewrite</a></li>
</ul></div>
</div>
 <p>
Over the years I have tried drupal, wordpress and more recently hugo + ox-hugo and in that category have tried a few different themes, but often came up against an issue after some time. Perhaps a  <a href="file:///Users/leehalls/Documents/org_website/content/posts/20241116_update.html">hugo update had broken certain aspects</a> of the theme or to get it to do what I wanted was time consuming so this time no messing, no fancy export requirements just plain emacs, publish and orgmode.
</p>

 <p>
It has to be stated I would not be here without refering to  <a href="https://www.danliden.com/posts/20211203-this-site.html">Dan Liden</a>'s guide and  <a href="https://github.com/djliden/djliden.github.io">github</a> info in fact most of this is a copy of what is there but I have modified certain aspects and more recently ran it through chatGPT to only publish if a file has changed which along with a couple of other tweaks seriously increased the file size.
</p>
 <div id="outline-container-orga18097e" class="outline-2">
 <h2 id="orga18097e">No preview text use #+DESCRIPTION instead</h2>
 <div class="outline-text-2" id="text-orga18097e">
 <p>
In Dan's site he uses a function to get and show a preview of the page under the heading, he does this with text encapsulated with the #+PREVIEW: construct using this function
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code> 1:  <span class="org-comment-delimiter">;; </span> <span class="org-comment">org-site/build-site.el
</span> 2: ( <span class="org-keyword">defun</span>  <span class="org-function-name">my/get-preview</span> (file)
 3:    <span class="org-string">&quot;get preview text from a file
 4: 
 5: Uses the function here as a starting point:
 6: https://ogbe.net/blog/blogging_with_org.html&quot;</span>
 7:   ( <span class="org-keyword">with-temp-buffer</span>
 8:     (insert-file-contents file)
 9:     (goto-char (point-min))
10:     ( <span class="org-keyword">when</span> (re-search-forward  <span class="org-string">&quot;^#\\+BEGIN_PREVIEW$&quot;</span> nil 1)
11:       (goto-char (point-min))
12:       ( <span class="org-keyword">let</span> ((beg (+ 1 (re-search-forward  <span class="org-string">&quot;^#\\+BEGIN_PREVIEW$&quot;</span> nil 1)))
13:             (end ( <span class="org-keyword">progn</span> (re-search-forward  <span class="org-string">&quot;^#\\+END_PREVIEW$&quot;</span> nil 1)
14:                         (match-beginning 0))))
15:         (buffer-substring beg end)))))
</code></pre>
</div>

 <p>
I decided I preferred having this not within a separate entity in the org file but using the  <code>~#+DESCRIPTION:~</code> part of the headers ie
</p>

 <div class="note" id="orgece6ab0">
 <p>
TITLE: Complete re-write
</p>

 <p>
DESCRIPTION: Major refactor of website content into just an emacs orgmode entity with no hugo
</p>

 <p>
KEYWORDS: ramblings orgmode emacs
</p>

 <p>
DATE:  <span class="timestamp-wrapper"> <span class="timestamp">&lt;2026-01-31 Sat&gt;</span></span>
</p>

</div>

 <p>
So to achieve this the function needed re-writing;
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code>( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-publish-org-sitemap-format</span> (entry style project)
   <span class="org-doc">&quot;Format sitemap entries using #+DESCRIPTION.&quot;</span>
  ( <span class="org-keyword">cond</span>
   ((not (directory-name-p entry))
    ( <span class="org-keyword">let*</span> ((full-path (expand-file-name entry  <span class="org-string">&quot;./content&quot;</span>))
           (preview ( <span class="org-keyword">or</span> (my/org-get-description full-path)
                         <span class="org-string">&quot;(No description)&quot;</span>)))
      (format  <span class="org-string">&quot;[[file:%s][(%s) %s]]\n%s&quot;</span>
              entry
              (format-time-string  <span class="org-string">&quot;%Y-%m-%d&quot;</span>
                                  (org-publish-find-date entry project))
              (org-publish-find-title entry project)
              preview)))
   ((eq style 'tree)
    (file-name-nondirectory
     (directory-file-name entry)))
   (t entry)))
</code></pre>
</div>

 <p>
It works well and I keep a simple snippet to generate the required headers when creating a new post.
</p>
</div>
</div>
 <div id="outline-container-org5f5b62c" class="outline-2">
 <h2 id="org5f5b62c">Other org-publish references</h2>
 <div class="outline-text-2" id="text-org5f5b62c">
 <p>
 <a href="https://taingram.org/blog/org-mode-blog.html">https://taingram.org/blog/org-mode-blog.html</a>
</p>
</div>
</div>
 <div id="outline-container-orgb075202" class="outline-2">
 <h2 id="orgb075202">chatGPT rewrite</h2>
 <div class="outline-text-2" id="text-orgb075202">
 <p>
 <span class="timestamp-wrapper"> <span class="timestamp">[2026-09-02 Wed 11:36]</span></span> decided to try chatGPT on the script as i wanted to only publish changed files not everything each time. It took a couple attempts working through different script iterations and prompting chatgpt with returned errors etc but it seems to have worked well.
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code>
 <span class="org-comment-delimiter">;;         </span> <span class="org-comment">BUILD SCRIPT START
</span> <span class="org-comment-delimiter">;;                </span> <span class="org-comment">│
</span> <span class="org-comment-delimiter">;;                </span> <span class="org-comment">▼
</span> <span class="org-comment-delimiter">;;    </span> <span class="org-comment">Find all content/*.org
</span> <span class="org-comment-delimiter">;;                </span> <span class="org-comment">│
</span> <span class="org-comment-delimiter">;;                </span> <span class="org-comment">▼
</span> <span class="org-comment-delimiter">;;   </span> <span class="org-comment">Ignore sitemap.org/drafts
</span> <span class="org-comment-delimiter">;;                </span> <span class="org-comment">│
</span> <span class="org-comment-delimiter">;;                </span> <span class="org-comment">▼
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Compare .org → corresponding .html
</span> <span class="org-comment-delimiter">;;                </span> <span class="org-comment">│
</span> <span class="org-comment-delimiter">;;     </span> <span class="org-comment">┌──────────┴──────────┐
</span> <span class="org-comment-delimiter">;;     </span> <span class="org-comment">│                     │
</span> <span class="org-comment-delimiter">;;  </span> <span class="org-comment">unchanged             changed
</span> <span class="org-comment-delimiter">;;     </span> <span class="org-comment">│                     │
</span> <span class="org-comment-delimiter">;;     </span> <span class="org-comment">▼                     ▼
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">do nothing          org-publish
</span> <span class="org-comment-delimiter">;;                           </span> <span class="org-comment">│
</span> <span class="org-comment-delimiter">;;                           </span> <span class="org-comment">▼
</span> <span class="org-comment-delimiter">;;                      </span> <span class="org-comment">sitemap
</span> <span class="org-comment-delimiter">;;                           </span> <span class="org-comment">│
</span> <span class="org-comment-delimiter">;;                           </span> <span class="org-comment">▼
</span> <span class="org-comment-delimiter">;;                        </span> <span class="org-comment">RSS</span>
</code></pre>
</div>


 <p>
The full code is below and you can see it is quite a long script
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code> <span class="org-comment-delimiter">;;; </span> <span class="org-comment">org-website-publish.el --- Build script -*- lexical-binding: t; -*-
</span>
( <span class="org-keyword">require</span> ' <span class="org-constant">package</span>)

 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Package configuration
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
( <span class="org-keyword">setq</span> package-user-dir
      (expand-file-name  <span class="org-string">&quot;./.packages&quot;</span>))

( <span class="org-keyword">setq</span> package-archives
      '(( <span class="org-string">&quot;gnu&quot;</span>   .  <span class="org-string">&quot;https://elpa.gnu.org/packages/&quot;</span>)
        ( <span class="org-string">&quot;melpa&quot;</span> .  <span class="org-string">&quot;https://melpa.org/packages/&quot;</span>)))

 <span class="org-comment-delimiter">;; </span> <span class="org-comment">Prefer GNU ELPA for Org and other packages available from
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">both archives.
</span>( <span class="org-keyword">setq</span> package-archive-priorities
      '(( <span class="org-string">&quot;gnu&quot;</span>   . 20)
        ( <span class="org-string">&quot;melpa&quot;</span> . 10)))

 <span class="org-comment-delimiter">;; </span> <span class="org-comment">Do not activate a previously installed Org 9.5 package here.
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Its startup code emits the obsolete Org-ELPA closure warning
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">before we have had a chance to install the GNU ELPA version.
</span>( <span class="org-keyword">let</span> ((package-load-list
       '(all
         (org nil))))
  (package-initialize))

 <span class="org-comment-delimiter">;; </span> <span class="org-comment">Refresh on every build so the Org descriptor is current and
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">definitely comes from the archives configured above, rather
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">than from stale Org-ELPA metadata cached by an older script.
</span>(message  <span class="org-string">&quot;Refreshing GNU ELPA and MELPA package archives&quot;</span>)
( <span class="org-keyword">condition-case</span> err
    (package-refresh-contents)
  ( <span class="org-warning">error</span>
   (message  <span class="org-string">&quot;Package refresh failed: %s&quot;</span> err)))

( <span class="org-keyword">let*</span> ((org-entry
        (assq 'org package-archive-contents))
       (org-desc
        ( <span class="org-keyword">cond</span>
         (( <span class="org-keyword">and</span> org-entry
               (package-desc-p (cdr org-entry)))
          (cdr org-entry))
         (( <span class="org-keyword">and</span> org-entry
               (package-desc-p (cadr org-entry)))
          (cadr org-entry)))))

  ( <span class="org-keyword">if</span> ( <span class="org-keyword">or</span> (not org-desc)
          (not (equal
                (package-desc-archive org-desc)
                 <span class="org-string">&quot;gnu&quot;</span>)))
       <span class="org-comment-delimiter">;; </span> <span class="org-comment">A network or archive failure should not prevent the site
</span>       <span class="org-comment-delimiter">;; </span> <span class="org-comment">from being built. Continue with the newest Org already
</span>       <span class="org-comment-delimiter">;; </span> <span class="org-comment">available to this Emacs invocation.
</span>      (message
        <span class="org-string">&quot;Org was not found in GNU ELPA metadata; using the installed/bundled version&quot;</span>)

     <span class="org-comment-delimiter">;; </span> <span class="org-comment">A bundled Org satisfies a plain `</span> <span class="org-comment"> <span class="org-constant">package-installed-p</span></span> <span class="org-comment">' check.
</span>     <span class="org-comment-delimiter">;; </span> <span class="org-comment">Compare against the archive version explicitly so the newest
</span>     <span class="org-comment-delimiter">;; </span> <span class="org-comment">available Org package is installed when necessary.
</span>    ( <span class="org-keyword">unless</span> (package-installed-p
             'org
             (package-desc-version org-desc))
      ( <span class="org-keyword">let</span> ((package-install-upgrade-built-in t))
        (package-install org-desc)))))

 <span class="org-comment-delimiter">;; </span> <span class="org-comment">Org was deliberately excluded from the initial activation.
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Activate the newest installed Org now that the GNU ELPA
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">installation/upgrade step has finished.
</span>(package-activate 'org)

( <span class="org-keyword">dolist</span> (pkg '(htmlize ess ox-rss webfeeder esxml))
  ( <span class="org-keyword">unless</span> (package-installed-p pkg)
    (package-install pkg)))


 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Required packages
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
( <span class="org-keyword">require</span> ' <span class="org-constant">org</span>)
(message  <span class="org-string">&quot;Using Org version %s&quot;</span> (org-version))
( <span class="org-keyword">require</span> ' <span class="org-constant">ox-publish</span>)
( <span class="org-keyword">require</span> ' <span class="org-constant">ox-rss</span>)
( <span class="org-keyword">require</span> ' <span class="org-constant">webfeeder</span>)
( <span class="org-keyword">require</span> ' <span class="org-constant">esxml</span>)
( <span class="org-keyword">require</span> ' <span class="org-constant">json</span>)
( <span class="org-keyword">require</span> ' <span class="org-constant">seq</span>)
( <span class="org-keyword">require</span> ' <span class="org-constant">subr-x</span>)


 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Site constants
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
( <span class="org-keyword">defconst</span>  <span class="org-variable-name">my/org-site-base-url</span>
   <span class="org-string">&quot;https://leehalls.net&quot;</span>)

( <span class="org-keyword">defconst</span>  <span class="org-variable-name">my/org-site-root</span>
  (file-name-directory
   (file-truename
    ( <span class="org-keyword">or</span> load-file-name
        default-directory))))


 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Utility functions
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site--format-iso8601</span> (time)
   <span class="org-doc">&quot;Format TIME as an ISO-8601 UTC timestamp.&quot;</span>
  ( <span class="org-keyword">when</span> time
    (format-time-string
      <span class="org-string">&quot;%Y-%m-%dT%H:%M:%SZ&quot;</span>
     time
     t)))


( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site--collect-keyword</span> (name)
   <span class="org-doc">&quot;Return the first Org keyword named NAME from the current buffer.&quot;</span>
  ( <span class="org-keyword">let</span> ((val
         (cdr
          (assoc-string
           name
           (org-collect-keywords (list name))
           t))))
    ( <span class="org-keyword">when</span> val
      (car val))))


( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site--escape-html</span> (s)
   <span class="org-doc">&quot;Escape the HTML-sensitive characters in S.&quot;</span>
  ( <span class="org-keyword">when</span> s
    (replace-regexp-in-string
      <span class="org-string">&quot;[&lt;&gt;&amp;\&quot;]&quot;</span>
     ( <span class="org-keyword">lambda</span> (c)
       ( <span class="org-keyword">pcase</span> c
         ( <span class="org-string">&quot;&lt;&quot;</span>   <span class="org-string">&quot;&amp;lt;&quot;</span>)
         ( <span class="org-string">&quot;&gt;&quot;</span>   <span class="org-string">&quot;&amp;gt;&quot;</span>)
         ( <span class="org-string">&quot;&amp;&quot;</span>   <span class="org-string">&quot;&amp;amp;&quot;</span>)
         ( <span class="org-string">&quot;\&quot;&quot;</span>  <span class="org-string">&quot;&amp;quot;&quot;</span>)))
     s
     t
     t)))


( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site--truncate</span> (s n)
   <span class="org-doc">&quot;Truncate S to N characters.&quot;</span>
  ( <span class="org-keyword">when</span> s
    ( <span class="org-keyword">if</span> (&gt; (length s) n)
        (concat (substring s 0 n)  <span class="org-string">&quot;…&quot;</span>)
      s)))


( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site--abs-url</span> (path)
   <span class="org-doc">&quot;Return PATH as an absolute URL.&quot;</span>
  ( <span class="org-keyword">when</span> path
    ( <span class="org-keyword">if</span> (string-prefix-p  <span class="org-string">&quot;http&quot;</span> path)
        path
      (concat
       my/org-site-base-url
        <span class="org-string">&quot;/&quot;</span>
       (string-remove-prefix  <span class="org-string">&quot;/&quot;</span> path)))))


( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site--file-contents</span> (file)
   <span class="org-doc">&quot;Return the complete contents of FILE.&quot;</span>
  ( <span class="org-keyword">with-temp-buffer</span>
    (insert-file-contents file)
    (buffer-string)))


 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Additional HTML export settings
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
( <span class="org-keyword">setq</span> org-html-validation-link nil
      org-html-htmlize-output-type 'css
      org-html-style-default
      (my/org-site--file-contents
       (expand-file-name
         <span class="org-string">&quot;assets/head.html&quot;</span>
        my/org-site-root)))


 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">DESCRIPTION-based preview
</span> <span class="org-comment-delimiter">;;</span> <span class="org-comment">
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">DESCRIPTION is the single source of truth for sitemap
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">previews and page metadata.
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-get-description</span> (file)
   <span class="org-doc">&quot;Return the single-line #+DESCRIPTION from FILE, or nil.&quot;</span>
  ( <span class="org-keyword">when</span> ( <span class="org-keyword">and</span> file
             (file-exists-p file))
    ( <span class="org-keyword">with-temp-buffer</span>
      (insert-file-contents file)
      (goto-char (point-min))
      ( <span class="org-keyword">when</span> (re-search-forward
              <span class="org-string">&quot;^#\\+DESCRIPTION:[ \t]*</span> <span class="org-string"> <span class="org-regexp-grouping-backslash">\\</span></span> <span class="org-string"> <span class="org-regexp-grouping-construct">(</span></span> <span class="org-string">.*</span> <span class="org-string"> <span class="org-regexp-grouping-backslash">\\</span></span> <span class="org-string"> <span class="org-regexp-grouping-construct">)</span></span> <span class="org-string">$&quot;</span>
             nil
             t)
        (string-trim
         (match-string 1))))))


 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">SEO metadata injection
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site--insert-head-extra</span> (lines)
   <span class="org-doc">&quot;Insert LINES as #+HTML_HEAD_EXTRA keywords.&quot;</span>
  ( <span class="org-keyword">when</span> lines
    ( <span class="org-keyword">save-excursion</span>
      (goto-char (point-min))

       <span class="org-comment-delimiter">;; </span> <span class="org-comment">Move past the initial Org keyword block.
</span>      ( <span class="org-keyword">while</span> (looking-at  <span class="org-string">&quot;^#\\+&quot;</span>)
        (forward-line 1))

      ( <span class="org-keyword">dolist</span> (line lines)
        (insert
         (format
           <span class="org-string">&quot;#+HTML_HEAD_EXTRA: %s\n&quot;</span>
          line))))))


( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site--build-jsonld</span>
    (title description canonical published modified keywords image)
   <span class="org-doc">&quot;Build JSON-LD metadata for a page.&quot;</span>
  ( <span class="org-keyword">let</span> ((obj
         `(( <span class="org-string">&quot;context&quot;</span> .  <span class="org-string">&quot;https://schema.org&quot;</span>)
           ( <span class="org-string">&quot;@type&quot;</span> . ,( <span class="org-keyword">if</span> published
                            <span class="org-string">&quot;BlogPosting&quot;</span>
                          <span class="org-string">&quot;WebPage&quot;</span>))
           ( <span class="org-string">&quot;headline&quot;</span> . ,title)
           ( <span class="org-string">&quot;description&quot;</span> . ,description)
           ( <span class="org-string">&quot;mainEntityOfPage&quot;</span>
            . (( <span class="org-string">&quot;@type&quot;</span> .  <span class="org-string">&quot;WebPage&quot;</span>)
               ( <span class="org-string">&quot;@id&quot;</span> . ,canonical)))
           ( <span class="org-string">&quot;author&quot;</span>
            . (( <span class="org-string">&quot;@type&quot;</span> .  <span class="org-string">&quot;Person&quot;</span>)
               ( <span class="org-string">&quot;name&quot;</span> .  <span class="org-string">&quot;Lee Halls&quot;</span>))))))

    ( <span class="org-keyword">when</span> published
      ( <span class="org-keyword">push</span>
       `( <span class="org-string">&quot;datePublished&quot;</span> . ,published)
       obj))

    ( <span class="org-keyword">when</span> modified
      ( <span class="org-keyword">push</span>
       `( <span class="org-string">&quot;dateModified&quot;</span> . ,modified)
       obj))

    ( <span class="org-keyword">when</span> keywords
      ( <span class="org-keyword">push</span>
       `( <span class="org-string">&quot;keywords&quot;</span> . ,keywords)
       obj))

    ( <span class="org-keyword">when</span> image
      ( <span class="org-keyword">push</span>
       `( <span class="org-string">&quot;image&quot;</span> . ,image)
       obj))

    (json-encode obj)))


( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site--add-page-metadata</span> (backend)
   <span class="org-doc">&quot;Add SEO metadata to HTML exports.&quot;</span>
  ( <span class="org-keyword">when</span> (org-export-derived-backend-p
         backend
         'html)

    ( <span class="org-keyword">let*</span> ((info
            (org-export-get-environment backend))

           (source
            (plist-get info  <span class="org-builtin">:input-file</span>))

           (title
            (org-element-interpret-data
             (plist-get info  <span class="org-builtin">:title</span>)))

           (desc
            ( <span class="org-keyword">or</span>
             (my/org-site--collect-keyword
               <span class="org-string">&quot;DESCRIPTION&quot;</span>)

             ( <span class="org-keyword">and</span> source
                  (my/org-get-description
                   source))))

           (desc
            (my/org-site--truncate
             desc
             200))

           (canonical
            (my/org-site--collect-keyword
              <span class="org-string">&quot;CANONICAL_URL&quot;</span>))

            <span class="org-comment-delimiter">;; </span> <span class="org-comment">We deliberately guard this because date lookup
</span>            <span class="org-comment-delimiter">;; </span> <span class="org-comment">can involve the publishing project/cache.
</span>            <span class="org-comment-delimiter">;; </span> <span class="org-comment">This hook only runs during an actual export,
</span>            <span class="org-comment-delimiter">;; </span> <span class="org-comment">after org-publish has established its context.
</span>           (published
            (my/org-site--format-iso8601
             ( <span class="org-keyword">ignore-errors</span>
               ( <span class="org-keyword">when</span> source
                 (org-publish-find-date
                  source
                  (org-publish-get-project-from-filename
                   source
                   org-publish-project-alist))))))

           (meta-lines
            (delq
             nil
             (list

              ( <span class="org-keyword">when</span> canonical
                (format
                  <span class="org-string">&quot;&lt;link rel=\&quot;canonical\&quot; href=\&quot;%s\&quot;&gt;&quot;</span>
                 (my/org-site--escape-html
                  canonical)))

              ( <span class="org-keyword">when</span> desc
                (format
                  <span class="org-string">&quot;&lt;meta name=\&quot;description\&quot; content=\&quot;%s\&quot;&gt;&quot;</span>
                 (my/org-site--escape-html
                  desc))))))

      (my/org-site--insert-head-extra
       meta-lines)))))


(add-hook
 'org-export-before-processing-hook
 #'my/org-site--add-page-metadata)


 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Sitemap helpers
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
( <span class="org-keyword">defun</span>  <span class="org-function-name">my/remove-docs-from-sitemap</span> (tree)
   <span class="org-doc">&quot;Remove the DOCS branch from sitemap TREE.&quot;</span>
  ( <span class="org-keyword">cond</span>
   (( <span class="org-keyword">and</span> (listp tree)
         (equal (car tree)  <span class="org-string">&quot;docs&quot;</span>))
    nil)

   ((listp tree)
    (delq
     nil
     (mapcar
      #'my/remove-docs-from-sitemap
      tree)))

   (t
    tree)))


( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-publish-org-sitemap</span> (title list)
   <span class="org-doc">&quot;Generate the Org sitemap.&quot;</span>
  (concat
    <span class="org-string">&quot;#+OPTIONS: toc:nil\n&quot;</span>
   (org-list-to-subtree
    (my/remove-docs-from-sitemap
     list))))


( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-publish-org-sitemap-format</span>
    (entry style project)
   <span class="org-doc">&quot;Format sitemap ENTRY using its #+DESCRIPTION.&quot;</span>
  (message  <span class="org-string">&quot;SITEMAP ENTRY: %S&quot;</span> entry)

  ( <span class="org-keyword">cond</span>

    <span class="org-comment-delimiter">;; </span> <span class="org-comment">---------------------------------------------------------
</span>    <span class="org-comment-delimiter">;; </span> <span class="org-comment">File entry
</span>    <span class="org-comment-delimiter">;; </span> <span class="org-comment">---------------------------------------------------------
</span>
   ((not (directory-name-p entry))

    ( <span class="org-keyword">let*</span> ((full-path
            (expand-file-name
             entry
              <span class="org-string">&quot;./content&quot;</span>))

           (preview
            ( <span class="org-keyword">or</span>
             (my/org-get-description
              full-path)

              <span class="org-string">&quot;(No description)&quot;</span>))

            <span class="org-comment-delimiter">;; </span> <span class="org-comment">These functions are called only while Org Publish
</span>            <span class="org-comment-delimiter">;; </span> <span class="org-comment">is actually generating the sitemap, so its cache
</span>            <span class="org-comment-delimiter">;; </span> <span class="org-comment">has already been initialised.
</span>           (date
            ( <span class="org-keyword">ignore-errors</span>
              (org-publish-find-date
               entry
               project)))

           (title
            ( <span class="org-keyword">ignore-errors</span>
              (org-publish-find-title
               entry
               project))))

      (format
        <span class="org-string">&quot;[[file:%s][(%s) %s]]\n%s&quot;</span>
       entry

       ( <span class="org-keyword">if</span> date
           (format-time-string
             <span class="org-string">&quot;%Y-%m-%d&quot;</span>
            date)
          <span class="org-string">&quot;&quot;</span>)

       ( <span class="org-keyword">or</span> title
           (file-name-base entry))

       preview)))


    <span class="org-comment-delimiter">;; </span> <span class="org-comment">---------------------------------------------------------
</span>    <span class="org-comment-delimiter">;; </span> <span class="org-comment">Directory in tree style
</span>    <span class="org-comment-delimiter">;; </span> <span class="org-comment">---------------------------------------------------------
</span>
   ((eq style 'tree)

    (file-name-nondirectory
     (directory-file-name
      entry)))


    <span class="org-comment-delimiter">;; </span> <span class="org-comment">---------------------------------------------------------
</span>    <span class="org-comment-delimiter">;; </span> <span class="org-comment">Everything else
</span>    <span class="org-comment-delimiter">;; </span> <span class="org-comment">---------------------------------------------------------
</span>
   (t
    entry)))


 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">RSS feed generation
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site-generate-rss</span> ()
   <span class="org-doc">&quot;Generate an Atom/RSS feed from published HTML files.&quot;</span>
  (message  <span class="org-string">&quot;Generating RSS feed...&quot;</span>)

  ( <span class="org-keyword">let</span> ((webfeeder-default-author
          <span class="org-string">&quot;Lee Halls&quot;</span>))

    ( <span class="org-keyword">let*</span> ((public-dir
            (expand-file-name
              <span class="org-string">&quot;public&quot;</span>
             my/org-site-root))

            <span class="org-comment-delimiter">;; </span> <span class="org-comment">WEBFEEDER-BUILD resolves every entry relative to
</span>            <span class="org-comment-delimiter">;; </span> <span class="org-comment">PUBLIC-DIR, so pass relative names such as
</span>            <span class="org-comment-delimiter">;; </span> <span class="org-comment">&quot;docs/about.html&quot;, not &quot;./public/docs/about.html&quot;.
</span>            <span class="org-comment-delimiter">;; </span> <span class="org-comment">Passing the latter makes it look for
</span>            <span class="org-comment-delimiter">;; </span> <span class="org-comment">&quot;./public/public/docs/about.html&quot;.
</span>           (html-files
            (mapcar
             ( <span class="org-keyword">lambda</span> (file)
               (file-relative-name
                file
                public-dir))

             (seq-filter
              ( <span class="org-keyword">lambda</span> (file)
                (not
                 ( <span class="org-keyword">or</span>
                   <span class="org-comment-delimiter">;; </span> <span class="org-comment">Don't include drafts.
</span>                  (string-match-p
                    <span class="org-string">&quot;/posts/drafts/&quot;</span>
                   file)

                   <span class="org-comment-delimiter">;; </span> <span class="org-comment">Don't include assets.
</span>                  (string-match-p
                    <span class="org-string">&quot;/assets/&quot;</span>
                   file)

                   <span class="org-comment-delimiter">;; </span> <span class="org-comment">Don't include sitemap.html.
</span>                  (string-suffix-p
                    <span class="org-string">&quot;/sitemap.html&quot;</span>
                   file))))

              (directory-files-recursively
               public-dir
                <span class="org-string">&quot;\\.html$&quot;</span>)))))

      (message
        <span class="org-string">&quot;RSS: found %d HTML files&quot;</span>
       (length html-files))

      (webfeeder-build
       (expand-file-name
         <span class="org-string">&quot;rss.xml&quot;</span>
        public-dir)
       public-dir
       my/org-site-base-url
       html-files

        <span class="org-builtin">:title</span>
        <span class="org-string">&quot;Ramblings of a lost one&quot;</span>

        <span class="org-builtin">:description</span>
        <span class="org-string">&quot;Blog posts and updates from Lee Halls.&quot;</span>))))

 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Org Publish configuration
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
 <span class="org-comment-delimiter">;; </span> <span class="org-comment">Keep Org's timestamp/cache data outside the published site.
</span> <span class="org-comment-delimiter">;;</span> <span class="org-comment">
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">NOTE:
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Our custom pre-flight test below does NOT call
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">org-publish-needed-p, so it does not require this cache to
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">exist before the first invocation of org-publish.
</span> <span class="org-comment-delimiter">;;</span> <span class="org-comment">
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Org Publish itself will initialise and use this directory
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">normally when publishing.
</span>( <span class="org-keyword">setq</span> org-publish-timestamp-directory
      (expand-file-name
        <span class="org-string">&quot;.org-timestamps/&quot;</span>
       my/org-site-root))


( <span class="org-keyword">setq</span> org-publish-project-alist

      (list

       (list
         <span class="org-string">&quot;my-org-site&quot;</span>

         <span class="org-comment-delimiter">;; </span> <span class="org-comment">-----------------------------------------------------
</span>         <span class="org-comment-delimiter">;; </span> <span class="org-comment">Source
</span>         <span class="org-comment-delimiter">;; </span> <span class="org-comment">-----------------------------------------------------
</span>
         <span class="org-builtin">:recursive</span>
        t

         <span class="org-builtin">:base-directory</span>
        (expand-file-name
          <span class="org-string">&quot;content&quot;</span>
         my/org-site-root)

         <span class="org-comment-delimiter">;; </span> <span class="org-comment">Don't publish drafts.
</span>         <span class="org-builtin">:exclude</span>
         <span class="org-string">&quot;posts/drafts/.*&quot;</span>

         <span class="org-comment-delimiter">;; </span> <span class="org-comment">-----------------------------------------------------
</span>         <span class="org-comment-delimiter">;; </span> <span class="org-comment">Destination
</span>         <span class="org-comment-delimiter">;; </span> <span class="org-comment">-----------------------------------------------------
</span>
         <span class="org-builtin">:publishing-directory</span>
        (expand-file-name
          <span class="org-string">&quot;public&quot;</span>
         my/org-site-root)

         <span class="org-builtin">:publishing-function</span>
        'org-html-publish-to-html

         <span class="org-comment-delimiter">;; </span> <span class="org-comment">-----------------------------------------------------
</span>         <span class="org-comment-delimiter">;; </span> <span class="org-comment">HTML
</span>         <span class="org-comment-delimiter">;; </span> <span class="org-comment">-----------------------------------------------------
</span>
         <span class="org-builtin">:html-preamble</span>
        (my/org-site--file-contents
         (expand-file-name
           <span class="org-string">&quot;assets/html_preamble.html&quot;</span>
          my/org-site-root))

         <span class="org-builtin">:with-author</span>
        nil

         <span class="org-builtin">:with-creator</span>
        t

         <span class="org-builtin">:with-toc</span>
        t

         <span class="org-builtin">:section-numbers</span>
        nil

         <span class="org-builtin">:time-stamp-file</span>
        nil

         <span class="org-comment-delimiter">;; </span> <span class="org-comment">-----------------------------------------------------
</span>         <span class="org-comment-delimiter">;; </span> <span class="org-comment">Sitemap
</span>         <span class="org-comment-delimiter">;; </span> <span class="org-comment">-----------------------------------------------------
</span>
         <span class="org-comment-delimiter">;; </span> <span class="org-comment">Keep this value stable between runs. Changing it at
</span>         <span class="org-comment-delimiter">;; </span> <span class="org-comment">runtime invalidates Org's project cache and causes all
</span>         <span class="org-comment-delimiter">;; </span> <span class="org-comment">source files to be republished.
</span>         <span class="org-builtin">:auto-sitemap</span>
        t

         <span class="org-builtin">:sitemap-filename</span>
         <span class="org-string">&quot;sitemap.org&quot;</span>

         <span class="org-builtin">:sitemap-title</span>
         <span class="org-string">&quot;Ramblings of a lost one&quot;</span>

         <span class="org-builtin">:sitemap-sort-files</span>
        'anti-chronologically

         <span class="org-builtin">:sitemap-function</span>
        'my/org-publish-org-sitemap

         <span class="org-builtin">:sitemap-format-entry</span>
        'my/org-publish-org-sitemap-format)))


 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">File modification helpers
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site--file-mtime</span> (file)
   <span class="org-doc">&quot;Return FILE's modification time.&quot;</span>
  ( <span class="org-keyword">when</span> ( <span class="org-keyword">and</span> file
             (file-exists-p file))
    (file-attribute-modification-time
     (file-attributes file))))


( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site--output-file-for</span>
    (source-file base-dir publishing-dir)
   <span class="org-doc">&quot;Return the HTML output path for SOURCE-FILE.&quot;</span>
  ( <span class="org-keyword">let</span> ((relative-file
         (file-relative-name
          source-file
          base-dir)))

    (expand-file-name
     (concat
      (file-name-sans-extension
       relative-file)
       <span class="org-string">&quot;.html&quot;</span>)
     publishing-dir)))


( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site--file-needs-publishing-p</span>
    (source-file output-file)
   <span class="org-doc">&quot;Return non-nil if SOURCE-FILE needs publishing.

This function intentionally does NOT use Org Publish's internal
cache. It only compares source and output modification times.&quot;</span>
  ( <span class="org-keyword">cond</span>

    <span class="org-comment-delimiter">;; </span> <span class="org-comment">Source doesn't exist.
</span>   ((not (file-exists-p source-file))
    nil)

    <span class="org-comment-delimiter">;; </span> <span class="org-comment">Output doesn't exist.
</span>   ((not (file-exists-p output-file))
    t)

    <span class="org-comment-delimiter">;; </span> <span class="org-comment">Source is newer than output.
</span>   (t
    ( <span class="org-keyword">let</span> ((source-time
           (my/org-site--file-mtime
            source-file))

          (output-time
           (my/org-site--file-mtime
            output-file)))

      ( <span class="org-keyword">and</span> source-time
           output-time
           (time-less-p
            output-time
            source-time))))))


 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Pre-flight change detection
</span> <span class="org-comment-delimiter">;;</span> <span class="org-comment">
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">IMPORTANT:
</span> <span class="org-comment-delimiter">;;</span> <span class="org-comment">
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Do NOT use org-publish-needed-p here.
</span> <span class="org-comment-delimiter">;;</span> <span class="org-comment">
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">org-publish-needed-p depends on Org Publish's internal
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">org-publish-cache having already been initialised.
</span> <span class="org-comment-delimiter">;;</span> <span class="org-comment">
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">This function runs BEFORE org-publish, so using the cache
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">here causes:
</span> <span class="org-comment-delimiter">;;</span> <span class="org-comment">
</span> <span class="org-comment-delimiter">;;   </span> <span class="org-comment">&quot;org-publish-cache-file-needs-publishing called,
</span> <span class="org-comment-delimiter">;;    </span> <span class="org-comment">but no cache present&quot;
</span> <span class="org-comment-delimiter">;;</span> <span class="org-comment">
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Instead, we perform a simple source/output timestamp check.
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site-files-needing-publish</span>
    (project-name)
   <span class="org-doc">&quot;Return source files in PROJECT-NAME that need publishing.

This pre-flight check deliberately avoids Org Publish's
internal cache. Org Publish is responsible for its cache
during the actual publishing phase.&quot;</span>

  ( <span class="org-keyword">let*</span> ((project
          (assoc
           project-name
           org-publish-project-alist))

         (properties
          (cdr project))

         (base-dir
          (expand-file-name
           (plist-get
            properties
             <span class="org-builtin">:base-directory</span>)))

         (publishing-dir
          (expand-file-name
           (plist-get
            properties
             <span class="org-builtin">:publishing-directory</span>)))

         (exclude
          (plist-get
           properties
            <span class="org-builtin">:exclude</span>))

          <span class="org-comment-delimiter">;; </span> <span class="org-comment">Only consider Org files.
</span>         (files
          (directory-files-recursively
           base-dir
            <span class="org-string">&quot;\\.org$&quot;</span>))

         (files-to-publish
          nil))

     <span class="org-comment-delimiter">;; </span> <span class="org-comment">If the project doesn't exist, fail loudly rather than
</span>     <span class="org-comment-delimiter">;; </span> <span class="org-comment">silently deciding that nothing needs publishing.
</span>    ( <span class="org-keyword">unless</span> project
      ( <span class="org-warning">error</span>
        <span class="org-string">&quot;Org Publish project not found: %s&quot;</span>
       project-name))

    ( <span class="org-keyword">dolist</span>
        (file files (nreverse files-to-publish))

       <span class="org-comment-delimiter">;; </span> <span class="org-comment">-------------------------------------------------------
</span>       <span class="org-comment-delimiter">;; </span> <span class="org-comment">sitemap.org is generated by Org Publish.
</span>       <span class="org-comment-delimiter">;;</span> <span class="org-comment">
</span>       <span class="org-comment-delimiter">;; </span> <span class="org-comment">It should never cause the pre-flight check to decide
</span>       <span class="org-comment-delimiter">;; </span> <span class="org-comment">that the site needs rebuilding.
</span>       <span class="org-comment-delimiter">;; </span> <span class="org-comment">-------------------------------------------------------
</span>
      ( <span class="org-keyword">unless</span>
          (string-suffix-p
            <span class="org-string">&quot;sitemap.org&quot;</span>
           file)

         <span class="org-comment-delimiter">;; </span> <span class="org-comment">-----------------------------------------------------
</span>         <span class="org-comment-delimiter">;; </span> <span class="org-comment">Respect the project's :exclude expression.
</span>         <span class="org-comment-delimiter">;; </span> <span class="org-comment">-----------------------------------------------------
</span>
        ( <span class="org-keyword">unless</span>
            ( <span class="org-keyword">and</span> exclude
                 (string-match-p
                  exclude
                  file))

          ( <span class="org-keyword">let</span>
              ((output-file
                (my/org-site--output-file-for
                 file
                 base-dir
                 publishing-dir)))

            ( <span class="org-keyword">when</span>
                (my/org-site--file-needs-publishing-p
                 file
                 output-file)

              (message
                <span class="org-string">&quot;Publish required: %s&quot;</span>
               (file-relative-name
                file
                base-dir))

              ( <span class="org-keyword">push</span> file
                    files-to-publish))))))))


 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Publishing
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-site-publish</span> ()
   <span class="org-doc">&quot;Publish the site if source files have changed.

This is the main entry point used by the build script.&quot;</span>

  ( <span class="org-keyword">let*</span> ((project-name
           <span class="org-string">&quot;my-org-site&quot;</span>)

         (project
          (assoc project-name
                 org-publish-project-alist))

         (changed-files
          (my/org-site-files-needing-publish
           project-name)))

    ( <span class="org-keyword">if</span>
        changed-files

        ( <span class="org-keyword">progn</span>

          (message
            <span class="org-string">&quot;Changes detected in content files.&quot;</span>)

           <span class="org-comment-delimiter">;; </span> <span class="org-comment">Initialise Org's cache for title/date lookups used by
</span>           <span class="org-comment-delimiter">;; </span> <span class="org-comment">sitemap generation, but do not ask `</span> <span class="org-comment"> <span class="org-constant">org-publish</span></span> <span class="org-comment">' to
</span>           <span class="org-comment-delimiter">;; </span> <span class="org-comment">iterate over the whole project.
</span>          (org-publish-initialize-cache
           project-name)

          ( <span class="org-keyword">let*</span> ((sitemap-name
                  ( <span class="org-keyword">or</span> (org-publish-property
                        <span class="org-builtin">:sitemap-filename</span>
                       project)
                       <span class="org-string">&quot;sitemap.org&quot;</span>))

                 (sitemap-file
                  (expand-file-name
                   sitemap-name
                   (org-publish-property
                     <span class="org-builtin">:base-directory</span>
                    project))))

             <span class="org-comment-delimiter">;; </span> <span class="org-comment">Regenerate and publish the sitemap, then publish
</span>             <span class="org-comment-delimiter">;; </span> <span class="org-comment">only the exact source files found by the pre-flight
</span>             <span class="org-comment-delimiter">;; </span> <span class="org-comment">modification-time check.
</span>            (org-publish-sitemap
             project
             sitemap-name)

            ( <span class="org-keyword">dolist</span> (file
                     (append changed-files
                             (list sitemap-file)))
              (message
                <span class="org-string">&quot;Publishing selected file: %s&quot;</span>
               (file-relative-name
                file
                (org-publish-property
                  <span class="org-builtin">:base-directory</span>
                 project)))

              (org-publish-file
               file
               project
               t)))

           <span class="org-comment-delimiter">;; </span> <span class="org-comment">---------------------------------------------------
</span>           <span class="org-comment-delimiter">;; </span> <span class="org-comment">Generate RSS after publishing has completed.
</span>           <span class="org-comment-delimiter">;; </span> <span class="org-comment">---------------------------------------------------
</span>
          (my/org-site-generate-rss)

          (message
            <span class="org-string">&quot;Org site publishing complete.&quot;</span>))

       <span class="org-comment-delimiter">;; </span> <span class="org-comment">-------------------------------------------------------
</span>       <span class="org-comment-delimiter">;; </span> <span class="org-comment">Nothing changed.
</span>       <span class="org-comment-delimiter">;; </span> <span class="org-comment">-------------------------------------------------------
</span>
      (message
        <span class="org-string">&quot;No content changes detected. &quot;</span>
        <span class="org-string">&quot;Skipping publishing, sitemap and RSS generation.&quot;</span>))))


 <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">Main entry point
</span> <span class="org-comment-delimiter">;; </span> <span class="org-comment">------------------------------------------------------------
</span>
(my/org-site-publish)

 <span class="org-comment-delimiter">;;; </span> <span class="org-comment">org-website-publish.el ends here
</span>
              <span class="org-comment-delimiter">;;         </span> <span class="org-comment">BUILD SCRIPT START
</span>              <span class="org-comment-delimiter">;;                </span> <span class="org-comment">│
</span>              <span class="org-comment-delimiter">;;                </span> <span class="org-comment">▼
</span>              <span class="org-comment-delimiter">;;    </span> <span class="org-comment">Find all content/*.org
</span>              <span class="org-comment-delimiter">;;                </span> <span class="org-comment">│
</span>              <span class="org-comment-delimiter">;;                </span> <span class="org-comment">▼
</span>              <span class="org-comment-delimiter">;;   </span> <span class="org-comment">Ignore sitemap.org/drafts
</span>              <span class="org-comment-delimiter">;;                </span> <span class="org-comment">│
</span>              <span class="org-comment-delimiter">;;                </span> <span class="org-comment">▼
</span>              <span class="org-comment-delimiter">;; </span> <span class="org-comment">Compare .org → corresponding .html
</span>              <span class="org-comment-delimiter">;;                </span> <span class="org-comment">│
</span>              <span class="org-comment-delimiter">;;     </span> <span class="org-comment">┌──────────┴──────────┐
</span>              <span class="org-comment-delimiter">;;     </span> <span class="org-comment">│                     │
</span>              <span class="org-comment-delimiter">;;  </span> <span class="org-comment">unchanged             changed
</span>              <span class="org-comment-delimiter">;;     </span> <span class="org-comment">│                     │
</span>              <span class="org-comment-delimiter">;;     </span> <span class="org-comment">▼                     ▼
</span>              <span class="org-comment-delimiter">;; </span> <span class="org-comment">do nothing          org-publish
</span>              <span class="org-comment-delimiter">;;                           </span> <span class="org-comment">│
</span>              <span class="org-comment-delimiter">;;                           </span> <span class="org-comment">▼
</span>              <span class="org-comment-delimiter">;;                  </span> <span class="org-comment">Org creates/uses
</span>              <span class="org-comment-delimiter">;;                  </span> <span class="org-comment">its own cache
</span>              <span class="org-comment-delimiter">;;                           </span> <span class="org-comment">│
</span>              <span class="org-comment-delimiter">;;                           </span> <span class="org-comment">▼
</span>              <span class="org-comment-delimiter">;;                      </span> <span class="org-comment">sitemap
</span>              <span class="org-comment-delimiter">;;                           </span> <span class="org-comment">│
</span>              <span class="org-comment-delimiter">;;                           </span> <span class="org-comment">▼
</span>              <span class="org-comment-delimiter">;;                        </span> <span class="org-comment">RSS
</span>
</code></pre>
</div>
</div>
</div>
</div>]]></content>
  <link href="https://leehalls.net/posts/website_rewrite.html"/>
  <id>https://leehalls.net/posts/website_rewrite.html</id>
  <updated>2026-09-02T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Travel &amp; heatwaves</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Travel &amp; heatwaves</h1>
 <p>
Whlist the UK &amp; Europe was sweltering in the heat at the end of June I was enjoying a much cooler 2wks in Holland, Michigan working at a supplier site on a new cell. 
</p>


 <div id="org2a51025" class="figure">
 <p> <img src="../images/Holland_MI.jpg" alt="Zoomed image." width="300" style="border:2px solid black;"></img></p>
 <p> <span class="figure-number">Figure 1: </span>Holland, MI</p>
</div>

 <p>
Grand Rapids/Holland if you have never been I can honestly and thoroughly recommend a visit especially if you like BEER! just a word of warning they have a fantastic range of dark high percentage beer and it goes down easily …. too easily &amp; you'll know about it.
</p>

 <p>
Visit  <a href="https://www.hopcat.com/holland/beer">Hopcat</a> or  <a href="https://www.newhollandbrew.com/beer/">New Holland Brewing</a> to try Dragon's Milk a deliciously dark &amp; strong 11% or the Triple Mash version at a mere 18% Also keep a look out for the wonderfully named  <a href="https://foundersbrewing.com/our-beer/backwoods-bastard/">Backwoods Bastard</a>! although you may need to drive into Grand Rapids or visit Walmart for that one.
</p>


 <div id="org6a0afa0" class="figure">
 <p> <img src="../images/dark_beer.jpeg" alt="Zoomed image." width="600" style="border:2px solid black;"></img></p>
</div>


 <div class="caution" id="orgcfb1354">
 <p>
If you wake up feeling rough, hungover I did warn you they are easy to drink but incredibly strong!
</p>

</div>
</div>]]></content>
  <link href="https://leehalls.net/posts/heatwavetravel.html"/>
  <id>https://leehalls.net/posts/heatwavetravel.html</id>
  <updated>2026-06-29T00:00:00+01:00</updated>
</entry>
<entry>
  <title>A second attempt</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">A second attempt</h1>
 <p>
As written  <a href="blackbird_20260303.html">here</a> the blackbird's were unsuccesful in raising young, I had thought perhaps they no longer considered the garden a viable safe place but regular watching of it &amp; all the visitors we get I noticed them visiting the willow bush and now both Mr &amp; Mrs visit carefully with beaks full of grubs. They land, scan the area, move in one direction, scan the area then move in another sometimes flying into a different bush first. And if you're quiet &amp; have timed it right you can hear the chicks being fed before they fly off again to fetch more.
</p>

 <p>
The willow is a much denser bush, further up the garden away from the wind that whips around the corner of the house too. Its not possible to photograph them unless disturbing the bush which is not something that will be done. 
</p>

 <p>
 <span class="timestamp-wrapper"> <span class="timestamp">[2026-06-29 Mon]</span></span> well after my return from another work trip ( <a href="heatwavetravel.html">Michigan, USA</a>) the nest is empty and hopefully they managed to raise a family. It's a busy &amp; often dangerous area with magpie's, crow's and the odd raptor visit!
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/blackbird_20260613.html"/>
  <id>https://leehalls.net/posts/blackbird_20260613.html</id>
  <updated>2026-06-13T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Time &amp; interest</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Time &amp; interest</h1>
 <p>
It's June 2026, it's raining a perfectly dull grey sky exists which would seem the perfect metaphor for my current mental state. although the weather as reported using my  <a href="wttr.html">wttr</a> integration would seem not that bad 🌤️  🌡️+11°C 🌬️↖26km/h perhaps it is just the fugue of depression, having suffered all week with a bad cold &amp; lost the drive to &quot; <b>do</b>&quot; - everything from updating this blog and other jobs has stalled, the bikes remain in the garage in part because I no longer ride in the rain ( <i>unless caught out</i>) and time ( <i>hours at work &amp; travel</i>) even gaming provides no impetus.
</p>

 <p>
This XKCD comic captures the apathy
</p>


 <div id="org8d7113f" class="figure">
 <p> <img src="https://imgs.xkcd.com/comics/loop.png" alt="loop.png"></img></p>
</div>

 <p>
But taking some lines from my favourite book &amp; film … 
</p>
 <ul class="org-ul"> <li>&quot; <i>But in the end, it’s only a passing thing, this shadow. Even darkness must pass. A new day will come. And when the sun shines it will shine out the clearer.</i></li>
 <li>&quot; <i>All we have to decide is what to do with the time that is given us.</i>&quot;   <sup> <a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup></li>
</ul> <p>
It will pass although the frequency of return maybe an issue and so one must fight, fight the darkness within, find the spark and let it shine much easier to write/think than do but you may ask what has this to do with age?
</p>

 <p>
Well thoughts of time passing, taking a view of my internal architecture was never a concept I dealt with before, never considered growing older nor the subject of friends but watching the comraderie and genuine affection seen on Junk &amp; Disorderly <sup> <a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup> sparks a little envy. Even riding, in my CBR/ZX days I'd think nothing of getting up leaving Derbyshire and heading to Dracula's landing place via the coast road for a coffee &amp; returning over the moors a full day of riding, now I sometimes struggle to pick a route/destination even though one reason for riding is the cathartic emptiness of my brain - just me, my bike &amp; the road and environment, its a reflective experience that no other form of transportation can give. A long straight road gives you chance to zone out, meditate on self, twisties focuses the mind, the environment impacts more forcefully smells, wind, the heat reflected off the road and yet even this is not enough at the moment.
</p>

 <p>
So internal reflection on my surroundings and the utilisation of time is, I feel, an age related input driven by the loss of people, changes in body and perhaps an ever increasing frustration with the world around and the decline of it.
</p>
 <div id="footnotes">
 <h2 class="footnotes">Footnotes: </h2>
 <div id="text-footnotes">

 <div class="footdef"> <sup> <a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
LOTR -   <a href="https://www.youtube.com/watch?v=k6C8SX0mWP0">Sam Gamgee</a> @ 1:17 in the video &amp;  <a href="https://www.youtube.com/watch?v=IrOqnZdvI6M">Gandalf to Frodo</a>  @ 2:13
</p></div></div>

 <div class="footdef"> <sup> <a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
 <a href="https://www.henrycole.tv/junk-disorcerly">Junk &amp; Disorderly</a> or as the site link states &quot;junk-disorcerly&quot; basically friends buying, selling, doing up automotive items -  Henry Cole, Skid Willison, Allen Millyard &amp; co a right good watch   
</p></div></div>


</div>
</div></div>]]></content>
  <link href="https://leehalls.net/posts/timeandinterest_20260606.html"/>
  <id>https://leehalls.net/posts/timeandinterest_20260606.html</id>
  <updated>2026-06-06T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Spring is coming! &amp; the blackbird is nesting</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Spring is coming! &amp; the blackbird is nesting</h1>
 <p>
I've seen them trying to nest in this bush last year;
</p>


 <div id="org1703e75" class="figure">
 <p> <img src="../images/IMG_0598.jpeg" alt="IMG_0598.jpeg" width="300"></img></p>
</div>

 <p>
Once disturbed by the sparrowhawk they never stayed nor did I see eggs, then finally late last year after the season had finished the old nest fell out in the winds of winter so this is a new build. And here she is keeping a watchful eye out whilst sat on the results of her hardwork;
</p>


 <div id="org5739883" class="figure">
 <p> <img src="../images/blackbird_nesting_20260303T1625.jpg" alt="blackbird_nesting_20260303T1625.jpg" width="600"></img></p>
 <p> <span class="figure-number">Figure 1: </span>Beautiful mom</p>
</div>

 <p>
She flies off every so often but never for long which meant I could see into the nest from the bathroom window to capture a photo or two here I only caught sight of the one egg, but last time she flew out I could see two;
</p>


 <div id="orgae34f99" class="figure">
 <p> <img src="../images/blackbird_nesting_20260307.png" alt="blackbird_nesting_20260307.png" width="600"></img></p>
</div>

 <p>
I'm keeping an eye her but definitely not disturbing her although the bush is only 1.5m from the backdoor I make sure we're not near her and use the bino's from the bathroom window to check on her. She's doing well, hopefully I'll get to see the family.
</p>

 <p>
 <span class="timestamp-wrapper"> <span class="timestamp">[2026-03-14 Sat]</span></span> sad news, the nest has been abandoned 😫
</p>


 <div id="orge49d846" class="figure">
 <p> <img src="../images/IMG_0595.jpeg" alt="IMG_0595.jpeg" width="600"></img></p>
 <p> <span class="figure-number">Figure 2: </span>A sad outcome, abandoned.</p>
</div>

 <p>
Had not seen her flying in &amp; out, nor had I seen her sitting on the nest, I suspect the recent high winds which were giving the bush quite a rough ride moved the nest slightly making it more visible as well, when I checked in on her you could see that she was not happy and quite disturbed with her head moving around as the winds blew. A pity for her &amp; me, I was really looking forwards to her success. Still I'll do what I can for the others, keep putting food out, water available and watch them nesting in the trees.
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/blackbird_20260303.html"/>
  <id>https://leehalls.net/posts/blackbird_20260303.html</id>
  <updated>2026-03-03T00:00:00+00:00</updated>
</entry>
<entry>
  <title>The weather in your emacs journals</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">The weather in your emacs journals</h1>
 <p>
Obviously I like journelly and so went on a dive into getting the weather into my other notes and across platforms eventually stumbling upon wttr.in
</p>

 <div class="info" id="org9325092">
 <p>
From the github site:  <a href="https://github.com/chubin/wttr.in">https://github.com/chubin/wttr.in</a> wttr.in is a console-oriented weather forecast service that supports various information representation methods like terminal-oriented ANSI-sequences for console HTTP clients (curl, httpie, or wget), HTML for web browsers, or PNG for graphical viewers.
</p>

</div>

 <p>
I've had a few calls to it that have failed, but most of the time it reports back beautifully. So how do we get the weather from wttr into an orgmode file?
</p>

 <p>
On MS Windows I use this snippet
</p>


 <div class="org-src-container">
 <pre class="src src-batch"> <code>'# -*- mode: snippet -*-
'# name: Weather today (wttr.in, prompt city)
'# key: dl
'# --
* `(format-time-string &quot;%Y-%m-%d %a %H:%M&quot;)` $1
:PROPERTIES:
:WEEK: `(format-time-string &quot;WK%V&quot;)`
:WEATHER: `(let* ((place (read-string &quot;City: &quot; wttr-weather-default-location))
                  (raw (with-temp-buffer
                         (call-process
                          &quot;C:/Windows/system32/curl.exe&quot; nil '(t t) nil
                          &quot;-s&quot;
                          (format &quot;wttr.in/%s?format=4&quot;
                                  (replace-regexp-in-string &quot; &quot; &quot;+&quot; place)))
                         (string-trim (buffer-string)))))
             raw)`
:MILEAGE:
:START:
:FINISH:
:END:
</code></pre>
</div>

 <p>
and the above returns the weather in this format;
</p>

 <div class="info" id="org3386c0b">
 <p>
London: ☁️   🌡️+8°C 🌬️↖8km/h
</p>

</div>

 <p>
although you can also use it in your init.el as a function
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code>( <span class="org-keyword">defun</span>  <span class="org-function-name">my/get-weather</span> (city)
   <span class="org-doc">&quot;Fetch weather from wttr.in and remove the city prefix.&quot;</span>
  ( <span class="org-keyword">let*</span> ((raw (shell-command-to-string
               (format  <span class="org-string">&quot;curl -A curl -s --max-time 5 \&quot;https://wttr.in/%s?format=3\&quot;&quot;</span> city)))
         (clean (string-trim raw)))
     <span class="org-comment-delimiter">;; </span> <span class="org-comment">Remove leading 'City: ' if present
</span>    ( <span class="org-keyword">if</span> (string-match  <span class="org-string">&quot;^[</span> <span class="org-string"> <span class="org-negation-char">^</span></span> <span class="org-string">:]+: </span> <span class="org-string"> <span class="org-regexp-grouping-backslash">\\</span></span> <span class="org-string"> <span class="org-regexp-grouping-construct">(</span></span> <span class="org-string">.*</span> <span class="org-string"> <span class="org-regexp-grouping-backslash">\\</span></span> <span class="org-string"> <span class="org-regexp-grouping-construct">)</span></span> <span class="org-string">$&quot;</span> clean)
        (match-string 1 clean)
      clean)))
</code></pre>
</div>

 <p>
You can tweak the format but as written above  <code>format=3</code> returns something like this;
</p>

 <div class="info" id="orgf21d3b5">
 <p>
Silao: ☀️   +29°C
</p>

</div>

 <p>
So happy weather recording!
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/wttr.html"/>
  <id>https://leehalls.net/posts/wttr.html</id>
  <updated>2026-02-04T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Org insert link</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <p>
I'm in the process of re-writing this blog to move away from hugo and stuff I have no time to go and figure out into just a pure orgmode &amp; emacs publish route. One problem I ran into was inserting links via  <code>C-l</code> did not export correctly into the HTML. 
</p>

 <p>
My folder structure is
</p>

 <div class="org-src-container">
 <pre class="src src-ascii"> <code>- Top level
   - .packages
   - assets
       - head.html
       - html_preamble.html
       - images
              - vh_001.jpg
              - 
   - content
       - posts
              - vh.org
              - 
   - .build.sh
   - org-website-publish.el
</code></pre>
</div>

 <p>
To get them working I wrote a separate insert link function;
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code> <span class="org-comment-delimiter">;; </span> <span class="org-comment">my link insert
</span>( <span class="org-keyword">defun</span>  <span class="org-function-name">my/org-insert-image-link</span> (path)
   <span class="org-doc">&quot;Insert Org link with ../images/filename.ext instead of full PATH.&quot;</span>
  ( <span class="org-keyword">interactive</span>  <span class="org-string">&quot;fImage file: &quot;</span>)
  ( <span class="org-keyword">let*</span> ((filename (file-name-nondirectory path))
         (relpath (concat  <span class="org-string">&quot;../images/&quot;</span> filename)))
    (insert (format  <span class="org-string">&quot;[[file:%s]]&quot;</span> relpath))))
</code></pre>
</div>

 <ul class="org-ul"> <li>and bound it into orgmode function only on key  <code>C-i</code></li>
</ul> <div class="org-src-container">
 <pre class="src src-elisp"> <code> <span class="org-comment-delimiter">;; </span> <span class="org-comment">my link insert
</span>( <span class="org-keyword">with-eval-after-load</span> 'org
  (define-key org-mode-map (kbd  <span class="org-string">&quot;C-c i&quot;</span>)
    #'my/org-insert-image-link))
</code></pre>
</div>

 <p>
Now in the HTML source my images are coded as   <code>&lt;img src=&quot;../images/vh_001.JPG&quot; alt=&quot;vh_001.JPG&quot;&gt;</code> and when served visible in the webpage 😊
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/org_insert_link.html"/>
  <id>https://leehalls.net/posts/org_insert_link.html</id>
  <updated>2026-01-25T00:00:00+00:00</updated>
</entry>
<entry>
  <title>The weather in your emacs journals</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <header> <h1 class="title">The weather in your emacs journals</h1>
</header> <div class="note" id="org72cf69a">
 <p>
From the github site: wttr.in is a console-oriented weather forecast service that supports various information representation methods like terminal-oriented ANSI-sequences for console HTTP clients (curl, httpie, or wget), HTML for web browsers, or PNG for graphical viewers.
</p>

</div>


 <p>
The service is not 100% reliable, I've had a few calls to it that have failed, but most of the time it reports back beautifully.
</p>
</div>]]></content>
  <link href="https://leehalls.net/drafts/wttr.html"/>
  <id>https://leehalls.net/drafts/wttr.html</id>
  <updated>2026-01-24T00:00:00+00:00</updated>
</entry>
<entry>
  <title>OrgRoam to cosmascope</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">OrgRoam to cosmascope</h1>
 <p>
Firstly my org-roam db is small, its limited. I cannot quite seem to get my head  around the concept but I love the visualisation provided by org-roam-ui it reminds me of when I used TheBrain many years ago.
</p>

 <p>
What this does is converts your org-roam files into a format usable by cosmascope so that you can share them, host them on your site but consider it an experiment firstly in using ChatGPT &amp; secondly to see if it was possible to convert org-roam into a usable graph via cosmascope <sup> <a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>. This is adapted from Kévin Polisano’s obsidian2cosma.py ( <a href="https://github.com/kevinpolisano/obsidian2cosma">https://github.com/kevinpolisano/obsidian2cosma</a>) which converts your Obsidian vault. It is only the first step, you must then create the cosmascope itself.
</p>

 <p>
Consider this as work in progress and to be improved! There are limitations
</p>

 <ul class="org-ul"> <li>cosmascope will not display images if linked in your text</li>
 <li>the script does not handle internal links well ie in the generated log you may see
 <ul class="org-ul"> <li> <code>The following paragraph contains a broken link &quot;[[49F6458C-14AA-4C4B-9F6B-7F007E2199F9|emacs again?]]&quot;</code></li>
 <li>I'm sure there will be other issues but for an experiment and a test on a small org-roam data set it worked quite well.</li>
</ul></li>
</ul> <div id="org0f78589" class="figure">
 <p> <img src="../images/2025-10-19_11-24_orgroamui.png" alt="2025-10-19_11-24_orgroamui.png" width="50%"></img></p>
 <p> <span class="figure-number">Figure 1: </span>Org-roam-ui screenshot</p>
</div>


 <div id="org6bb4476" class="figure">
 <p> <img src="../images/2025-10-19_11-24_cosmascreen.png" alt="2025-10-19_11-24_cosmascreen.png" width="50%"></img></p>
 <p> <span class="figure-number">Figure 2: </span>Converted org-roam to cosmoscope</p>
</div>

 <p>
The script is located here on my rarely used github  <a href="https://github.com/drakxtwo/orgroam_cosmascope">https://github.com/drakxtwo/orgroam_cosmascope</a>
</p>


 <p>
but a copy is also below however only the github one will be updated.
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-doc">&quot;&quot;&quot;
Convert an Org-roam vault into a collection of Markdown notes readable by Cosma (https://cosma.graphlab.fr/en/)

Usage:
  python orgroam2cosma.py -i input_folder_path -o output_folder_path
                          [--type TYPE] [--tags TAGS]
                          [--creationdate CREATIONDATE]
                          [--zettlr True]
                          [-v]

Example:
  python orgroam2cosma.py -i ~/org-roam -o ./cosma_notes --zettlr True --verbose

Author: adapted from Kévin Polisano’s obsidian2cosma.py by ChatGPT
License: GNU GPL v3.0
&quot;&quot;&quot;</span>

 <span class="org-keyword">import</span> os
 <span class="org-keyword">import</span> re
 <span class="org-keyword">import</span> platform
 <span class="org-keyword">import</span> argparse
 <span class="org-keyword">import</span> shutil
 <span class="org-keyword">import</span> unicodedata
 <span class="org-keyword">import</span> csv
 <span class="org-keyword">from</span> pathlib  <span class="org-keyword">import</span> Path
 <span class="org-keyword">from</span> datetime  <span class="org-keyword">import</span> datetime  <span class="org-keyword">as</span> dt

 <span class="org-comment-delimiter"># </span> <span class="org-comment">========== Argument parsing ==========
</span> <span class="org-variable-name">parser</span>  <span class="org-operator">=</span> argparse.ArgumentParser()
parser.add_argument( <span class="org-string">&quot;-i&quot;</span>,  <span class="org-string">&quot;--input&quot;</span>,  <span class="org-builtin">help</span> <span class="org-operator">=</span> <span class="org-string">&quot;Path to the input folder&quot;</span>, required <span class="org-operator">=</span> <span class="org-constant">True</span>)
parser.add_argument( <span class="org-string">&quot;-o&quot;</span>,  <span class="org-string">&quot;--output&quot;</span>,  <span class="org-builtin">help</span> <span class="org-operator">=</span> <span class="org-string">&quot;Path to the output folder&quot;</span>, required <span class="org-operator">=</span> <span class="org-constant">True</span>)
parser.add_argument( <span class="org-string">&quot;--tags&quot;</span>,  <span class="org-builtin">help</span> <span class="org-operator">=</span> <span class="org-string">&quot;Filter notes by tags&quot;</span>, default <span class="org-operator">=</span> <span class="org-constant">None</span>)
parser.add_argument( <span class="org-string">&quot;--creationdate&quot;</span>,  <span class="org-builtin">help</span> <span class="org-operator">=</span> <span class="org-string">&quot;Use file creation date for IDs&quot;</span>, default <span class="org-operator">=</span> <span class="org-constant">False</span>)
parser.add_argument( <span class="org-string">&quot;--zettlr&quot;</span>,  <span class="org-builtin">help</span> <span class="org-operator">=</span> <span class="org-string">&quot;Use Zettlr-style links [text]([[id]])&quot;</span>, default <span class="org-operator">=</span> <span class="org-constant">False</span>)
parser.add_argument( <span class="org-string">&quot;-v&quot;</span>,  <span class="org-string">&quot;--verbose&quot;</span>, action <span class="org-operator">=</span> <span class="org-string">&quot;store_true&quot;</span>,  <span class="org-builtin">help</span> <span class="org-operator">=</span> <span class="org-string">&quot;Verbose mode&quot;</span>)
 <span class="org-variable-name">args</span>  <span class="org-operator">=</span> parser.parse_args()

 <span class="org-variable-name">input_folder</span>  <span class="org-operator">=</span> args. <span class="org-builtin">input</span>
 <span class="org-variable-name">output_folder</span>  <span class="org-operator">=</span> args.output

 <span class="org-keyword">def</span>  <span class="org-function-name">printv</span>(text):
     <span class="org-keyword">if</span> args.verbose:
         <span class="org-builtin">print</span>(text)

 <span class="org-comment-delimiter"># </span> <span class="org-comment">========== Helper functions ==========
</span>
 <span class="org-keyword">def</span>  <span class="org-function-name">creation_date</span>(file):
     <span class="org-keyword">if</span> platform.system()  <span class="org-operator">==</span>  <span class="org-string">&quot;Windows&quot;</span>:
         <span class="org-keyword">return</span> os.path.getctime(file)
     <span class="org-keyword">else</span>:
         <span class="org-variable-name">stat</span>  <span class="org-operator">=</span> os.stat(file)
         <span class="org-keyword">try</span>:
             <span class="org-keyword">return</span> stat.st_birthtime
         <span class="org-keyword">except</span>  <span class="org-type">AttributeError</span>:
             <span class="org-keyword">return</span> stat.st_mtime

 <span class="org-keyword">def</span>  <span class="org-function-name">create_id</span>(file):
     <span class="org-variable-name">timestamp</span>  <span class="org-operator">=</span> creation_date(file)  <span class="org-keyword">if</span> args.creationdate  <span class="org-keyword">else</span> dt.now().timestamp()
     <span class="org-keyword">return</span> dt.fromtimestamp(timestamp).strftime( <span class="org-string">'%Y%m%d%H%M%S'</span>)

 <span class="org-keyword">def</span>  <span class="org-function-name">clean_filename</span>(name):
     <span class="org-variable-name">name</span>  <span class="org-operator">=</span> unicodedata.normalize( <span class="org-string">&quot;NFD&quot;</span>, name).encode( <span class="org-string">&quot;ascii&quot;</span>,  <span class="org-string">&quot;ignore&quot;</span>).decode( <span class="org-string">&quot;utf-8&quot;</span>)
     <span class="org-keyword">return</span> name.replace( <span class="org-string">&quot; &quot;</span>,  <span class="org-string">&quot;-&quot;</span>)

 <span class="org-comment-delimiter"># </span> <span class="org-comment">========== Org file parsing ==========
</span>
 <span class="org-keyword">def</span>  <span class="org-function-name">parse_org_frontmatter</span>(content):
     <span class="org-doc">&quot;&quot;&quot;Extracts title, tags, and id from Org file headers.&quot;&quot;&quot;</span>
     <span class="org-variable-name">title_match</span>  <span class="org-operator">=</span> re.search(r <span class="org-string">&quot;^#\+title:\s*(.+)$&quot;</span>, content, re.MULTILINE)
     <span class="org-variable-name">tags_match</span>  <span class="org-operator">=</span> re.search(r <span class="org-string">&quot;^#\+filetags:\s*:?(.+?):?$&quot;</span>, content, re.MULTILINE)
     <span class="org-variable-name">id_match</span>  <span class="org-operator">=</span> re.search(r <span class="org-string">&quot;^:ID:\s*(.+)$&quot;</span>, content, re.MULTILINE)
     <span class="org-variable-name">roamkey_match</span>  <span class="org-operator">=</span> re.search(r <span class="org-string">&quot;^#\+roam_key:\s*(.+)$&quot;</span>, content, re.MULTILINE)

     <span class="org-variable-name">title</span>  <span class="org-operator">=</span> title_match.group(1).strip()  <span class="org-keyword">if</span> title_match  <span class="org-keyword">else</span>  <span class="org-constant">None</span>
     <span class="org-variable-name">tags</span>  <span class="org-operator">=</span> []
     <span class="org-keyword">if</span> tags_match:
         <span class="org-variable-name">tags</span>  <span class="org-operator">=</span> [t.strip()  <span class="org-keyword">for</span> t  <span class="org-keyword">in</span> tags_match.group(1).split( <span class="org-string">&quot;:&quot;</span>)  <span class="org-keyword">if</span> t.strip()]
     <span class="org-variable-name">id_</span>  <span class="org-operator">=</span> id_match.group(1).strip()  <span class="org-keyword">if</span> id_match  <span class="org-keyword">else</span>  <span class="org-constant">None</span>
     <span class="org-keyword">if</span>  <span class="org-keyword">not</span> id_  <span class="org-keyword">and</span> roamkey_match:
         <span class="org-variable-name">id_</span>  <span class="org-operator">=</span> roamkey_match.group(1).strip()

     <span class="org-keyword">return</span> { <span class="org-string">&quot;title&quot;</span>: title,  <span class="org-string">&quot;tags&quot;</span>: tags,  <span class="org-string">&quot;id&quot;</span>: id_}

 <span class="org-keyword">def</span>  <span class="org-function-name">convert_org_links</span>(content, title2id):
     <span class="org-doc">&quot;&quot;&quot;Convert Org links [[id:xxxx][Label]] or [[file:note.org][Label]] to Cosma Markdown links.&quot;&quot;&quot;</span>
     <span class="org-keyword">def</span>  <span class="org-function-name">repl</span>( <span class="org-keyword">match</span>):
         <span class="org-variable-name">target</span>  <span class="org-operator">=</span>  <span class="org-keyword">match</span>.group(1)
         <span class="org-variable-name">label</span>  <span class="org-operator">=</span>  <span class="org-keyword">match</span>.group(2)  <span class="org-keyword">or</span>  <span class="org-keyword">match</span>.group(1)

         <span class="org-comment-delimiter"># </span> <span class="org-comment">Org id link: [[id:1234][Label]]
</span>         <span class="org-keyword">if</span> target.startswith( <span class="org-string">&quot;id:&quot;</span>):
             <span class="org-variable-name">id_</span>  <span class="org-operator">=</span> target.replace( <span class="org-string">&quot;id:&quot;</span>,  <span class="org-string">&quot;&quot;</span>)
             <span class="org-keyword">return</span> f <span class="org-string">&quot;[</span>{label} <span class="org-string">]([[</span>{id_} <span class="org-string">]])&quot;</span>  <span class="org-keyword">if</span> args.zettlr  <span class="org-keyword">else</span> f <span class="org-string">&quot;[[</span>{id_} <span class="org-string">|</span>{label} <span class="org-string">]]&quot;</span>

         <span class="org-comment-delimiter"># </span> <span class="org-comment">Org file link: [[file:note.org][Label]]
</span>         <span class="org-keyword">elif</span> target.startswith( <span class="org-string">&quot;file:&quot;</span>):
             <span class="org-variable-name">file_ref</span>  <span class="org-operator">=</span> Path(target.replace( <span class="org-string">&quot;file:&quot;</span>,  <span class="org-string">&quot;&quot;</span>)).stem
             <span class="org-variable-name">file_ref</span>  <span class="org-operator">=</span> clean_filename(file_ref)
             <span class="org-keyword">if</span> file_ref  <span class="org-keyword">in</span> title2id:
                 <span class="org-variable-name">id_</span>  <span class="org-operator">=</span> title2id[file_ref]
                 <span class="org-keyword">return</span> f <span class="org-string">&quot;[</span>{label} <span class="org-string">]([[</span>{id_} <span class="org-string">]])&quot;</span>  <span class="org-keyword">if</span> args.zettlr  <span class="org-keyword">else</span> f <span class="org-string">&quot;[[</span>{id_} <span class="org-string">|</span>{label} <span class="org-string">]]&quot;</span>
             <span class="org-keyword">else</span>:
                 <span class="org-keyword">return</span> f <span class="org-string">&quot;[[</span>{label} <span class="org-string">]]&quot;</span>

         <span class="org-comment-delimiter"># </span> <span class="org-comment">Normal URL or external link
</span>         <span class="org-keyword">elif</span> re. <span class="org-keyword">match</span>(r <span class="org-string">&quot;https?://&quot;</span>, target):
             <span class="org-keyword">return</span> f <span class="org-string">&quot;[</span>{label} <span class="org-string">](</span>{target} <span class="org-string">)&quot;</span>

         <span class="org-keyword">return</span> f <span class="org-string">&quot;[[</span>{label} <span class="org-string">]]&quot;</span>

     <span class="org-comment-delimiter"># </span> <span class="org-comment">Replace all Org-style links [[target][label]]
</span>     <span class="org-variable-name">content</span>  <span class="org-operator">=</span> re.sub(r <span class="org-string">&quot;\[\[([^\]]+?)\](?:\[([^\]]+)\])?\]&quot;</span>, repl, content)
     <span class="org-keyword">return</span> content

 <span class="org-keyword">def</span>  <span class="org-function-name">convert_images</span>(content):
     <span class="org-doc">&quot;&quot;&quot;Convert [[file:img.png]] to ![](img.png)&quot;&quot;&quot;</span>
     <span class="org-keyword">return</span> re.sub(r <span class="org-string">&quot;\[\[file:(.+?\.(?:png|jpg|jpeg|gif))\]\]&quot;</span>, r <span class="org-string">&quot;![](\1)&quot;</span>, content)

 <span class="org-comment-delimiter"># </span> <span class="org-comment">========== Main pipeline ==========
</span>
 <span class="org-keyword">def</span>  <span class="org-function-name">main</span>():
    Path(output_folder).mkdir(parents <span class="org-operator">=</span> <span class="org-constant">True</span>, exist_ok <span class="org-operator">=</span> <span class="org-constant">True</span>)

    printv(f <span class="org-string">&quot;Converting Org-roam notes from </span>{input_folder} <span class="org-string"> → </span>{output_folder} <span class="org-string">&quot;</span>)

     <span class="org-variable-name">title2id</span>  <span class="org-operator">=</span> {}
     <span class="org-variable-name">org_files</span>  <span class="org-operator">=</span> []

     <span class="org-comment-delimiter"># </span> <span class="org-comment">Step 1: collect files
</span>     <span class="org-keyword">for</span> root, _, files  <span class="org-keyword">in</span> os.walk(input_folder):
         <span class="org-keyword">for</span> f  <span class="org-keyword">in</span> files:
             <span class="org-keyword">if</span> f.endswith( <span class="org-string">&quot;.org&quot;</span>):
                org_files.append(os.path.join(root, f))

     <span class="org-comment-delimiter"># </span> <span class="org-comment">Step 2: extract metadata and create IDs
</span>     <span class="org-keyword">for</span> f  <span class="org-keyword">in</span> org_files:
         <span class="org-builtin">print</span>(f)
         <span class="org-keyword">with</span>  <span class="org-builtin">open</span>(f,  <span class="org-string">&quot;r&quot;</span>, encoding <span class="org-operator">=</span> <span class="org-string">&quot;utf-8&quot;</span>)  <span class="org-keyword">as</span> infile:
             <span class="org-builtin">print</span>(infile.read())
             <span class="org-variable-name">content</span>  <span class="org-operator">=</span> infile.read()
         <span class="org-variable-name">meta</span>  <span class="org-operator">=</span> parse_org_frontmatter(content)
         <span class="org-variable-name">title</span>  <span class="org-operator">=</span> meta[ <span class="org-string">&quot;title&quot;</span>]  <span class="org-keyword">or</span> Path(f).stem
         <span class="org-variable-name">id_</span>  <span class="org-operator">=</span> meta[ <span class="org-string">&quot;id&quot;</span>]  <span class="org-keyword">or</span> create_id(f)
         <span class="org-variable-name">title2id</span>[clean_filename(title)]  <span class="org-operator">=</span> id_

     <span class="org-comment-delimiter"># </span> <span class="org-comment">Step 3: process and export each file
</span>     <span class="org-keyword">for</span> f  <span class="org-keyword">in</span> org_files:
         <span class="org-keyword">with</span>  <span class="org-builtin">open</span>(f,  <span class="org-string">&quot;r&quot;</span>, encoding <span class="org-operator">=</span> <span class="org-string">&quot;utf-8&quot;</span>)  <span class="org-keyword">as</span> infile:
             <span class="org-variable-name">content</span>  <span class="org-operator">=</span> infile.read()
         <span class="org-variable-name">meta</span>  <span class="org-operator">=</span> parse_org_frontmatter(content)
         <span class="org-variable-name">title</span>  <span class="org-operator">=</span> meta[ <span class="org-string">&quot;title&quot;</span>]  <span class="org-keyword">or</span> Path(f).stem
         <span class="org-variable-name">id_</span>  <span class="org-operator">=</span> meta[ <span class="org-string">&quot;id&quot;</span>]  <span class="org-keyword">or</span> title2id[clean_filename(title)]
         <span class="org-variable-name">tags</span>  <span class="org-operator">=</span> meta[ <span class="org-string">&quot;tags&quot;</span>]

         <span class="org-comment-delimiter"># </span> <span class="org-comment">Convert links &amp; images
</span>         <span class="org-variable-name">content</span>  <span class="org-operator">=</span> convert_org_links(content, title2id)
         <span class="org-variable-name">content</span>  <span class="org-operator">=</span> convert_images(content)

         <span class="org-comment-delimiter"># </span> <span class="org-comment">Remove Org metadata lines
</span>         <span class="org-variable-name">content</span>  <span class="org-operator">=</span> re.sub(r <span class="org-string">&quot;^#\+.*$&quot;</span>,  <span class="org-string">&quot;&quot;</span>, content, flags <span class="org-operator">=</span>re.MULTILINE)
         <span class="org-variable-name">content</span>  <span class="org-operator">=</span> re.sub(r <span class="org-string">&quot;^:PROPERTIES:[\s\S]*?:END:&quot;</span>,  <span class="org-string">&quot;&quot;</span>, content, flags <span class="org-operator">=</span>re.MULTILINE)
         <span class="org-variable-name">content</span>  <span class="org-operator">=</span> content.strip()

         <span class="org-comment-delimiter"># </span> <span class="org-comment">YAML front matter
</span>         <span class="org-variable-name">frontmatter</span>  <span class="org-operator">=</span>  <span class="org-string">&quot;---</span> <span class="org-constant">\n</span> <span class="org-string">&quot;</span>
         <span class="org-variable-name">frontmatter</span>  <span class="org-operator">+=</span> f <span class="org-string">&quot;title: </span>{title} <span class="org-constant">\n</span> <span class="org-string">&quot;</span>
         <span class="org-variable-name">frontmatter</span>  <span class="org-operator">+=</span> f <span class="org-string">&quot;id: </span>{id_} <span class="org-constant">\n</span> <span class="org-string">&quot;</span>
         <span class="org-keyword">if</span> tags:
             <span class="org-variable-name">frontmatter</span>  <span class="org-operator">+=</span> f <span class="org-string">&quot;tags: [</span>{', '.join(tags)} <span class="org-string">]</span> <span class="org-constant">\n</span> <span class="org-string">&quot;</span>
         <span class="org-variable-name">frontmatter</span>  <span class="org-operator">+=</span>  <span class="org-string">&quot;---</span> <span class="org-constant">\n\n</span> <span class="org-string">&quot;</span>

         <span class="org-variable-name">md_content</span>  <span class="org-operator">=</span> frontmatter  <span class="org-operator">+</span> content  <span class="org-operator">+</span>  <span class="org-string">&quot;</span> <span class="org-constant">\n</span> <span class="org-string">&quot;</span>
         <span class="org-variable-name">out_name</span>  <span class="org-operator">=</span> clean_filename(Path(title).stem)  <span class="org-operator">+</span>  <span class="org-string">&quot;.md&quot;</span>
         <span class="org-variable-name">out_path</span>  <span class="org-operator">=</span> os.path.join(output_folder, out_name)

         <span class="org-keyword">with</span>  <span class="org-builtin">open</span>(out_path,  <span class="org-string">&quot;w&quot;</span>, encoding <span class="org-operator">=</span> <span class="org-string">&quot;utf-8&quot;</span>)  <span class="org-keyword">as</span> outfile:
            outfile.write(md_content)

        printv(f <span class="org-string">&quot;[OK] </span>{os.path.basename(f)} <span class="org-string"> → </span>{out_name} <span class="org-string">&quot;</span>)

     <span class="org-comment-delimiter"># </span> <span class="org-comment">Step 4: save title→id mapping
</span>     <span class="org-keyword">with</span>  <span class="org-builtin">open</span>(os.path.join(output_folder,  <span class="org-string">&quot;_title2id.csv&quot;</span>),  <span class="org-string">&quot;w&quot;</span>, newline <span class="org-operator">=</span> <span class="org-string">&quot;&quot;</span>)  <span class="org-keyword">as</span> csvfile:
         <span class="org-variable-name">writer</span>  <span class="org-operator">=</span> csv.writer(csvfile)
        writer.writerows(title2id.items())

    printv(f <span class="org-string">&quot;✅ Conversion complete! </span>{ <span class="org-builtin">len</span>(org_files)} <span class="org-string"> notes processed.&quot;</span>)

 <span class="org-keyword">if</span>  <span class="org-builtin">__name__</span>  <span class="org-operator">==</span>  <span class="org-string">&quot;__main__&quot;</span>:
    main()

</code></pre>
</div>
 <div id="footnotes">
 <h2 class="footnotes">Footnotes: </h2>
 <div id="text-footnotes">

 <div class="footdef"> <sup> <a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
Cosmascope ( <a href="https://cosma.arthurperret.fr">https://cosma.arthurperret.fr</a>) describes itself as a knowledge visualisation tool for knowledge workers and it allows you to create an HTML page which displays much like org-roam-ui or obsidians graph.
</p></div></div>


</div>
</div></div>]]></content>
  <link href="https://leehalls.net/posts/orgroamcosma.html"/>
  <id>https://leehalls.net/posts/orgroamcosma.html</id>
  <updated>2025-10-18T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Journelly your orgmode journal on IOS</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Journelly your orgmode journal on IOS</h1>
 <p>
For those that know of its existence the combined power of emacs &amp; org mode for everything from simple note taking to complex journal writing, website creation, literate programming and more simply makes it an indispensable tool but its very power comes from its roots which means it is desktop centric and although a lot of my usage is in an MS environment to really leverage the most from the combination it should be in linux environment but getting back to the mobile journal topic - yes there are mobile clients;
</p>

 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-left"></col> <col class="org-left"></col> <col class="org-left"></col></colgroup> <tbody> <tr> <td class="org-left"> </td>
 <td class="org-left"> </td>
 <td class="org-left"> </td>
</tr> <tr> <td class="org-left">beorg</td>
 <td class="org-left">🍎</td>
 <td class="org-left"> <a href="https://www.beorgapp.com">https://www.beorgapp.com</a></td>
</tr> <tr> <td class="org-left">plainorg</td>
 <td class="org-left">🍎</td>
 <td class="org-left"> <a href="https://xenodium.com/plain-org-for-ios">https://xenodium.com/plain-org-for-ios</a></td>
</tr> <tr> <td class="org-left">orgro</td>
 <td class="org-left">🤖🍎</td>
 <td class="org-left"> <a href="https://orgro.org">https://orgro.org</a></td>
</tr> <tr> <td class="org-left">metanote   <sup> <a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup></td>
 <td class="org-left">🍎</td>
 <td class="org-left"> <a href="https://metanote-dev.github.io">https://metanote-dev.github.io</a></td>
</tr> <tr> <td class="org-left">orgzly (revived version)</td>
 <td class="org-left">🤖</td>
 <td class="org-left"> <a href="https://www.orgzlyrevived.com">https://www.orgzlyrevived.com</a></td>
</tr> <tr> <td class="org-left"> </td>
 <td class="org-left"> </td>
 <td class="org-left"> </td>
</tr></tbody></table> <p>
of all these I find  <b> <b>plainorg</b></b> the best for viewing existing files  it renders images nicely and handles internal links &amp;  <b> <b>beorg</b></b> for agenda functions, at the moment there is nothing close to those two on android but the author of plainorg is working on another app one which allows a journalling experience on iOS and you can read an excellent review of it here  <a href="https://www.macobserver.com/tips/round-ups/journelly-journal-app-ios/">https://www.macobserver.com/tips/round-ups/journelly-journal-app-ios/</a> 
</p>

 <p>
The app is called  <a href="https://xenodium.com/journelly-vs-emacs-why-not-both">journelly</a> and it is effectively a polished front end to keeping a true journal in genuine orgmode format. Each entry is automatically populated with the following properties;
</p>

 <div class="org-src-container">
 <pre class="src src-ASCII"> <code>:PROPERTIES:
:LATITUDE: 
:LONGITUDE: 
:WEATHER_TEMPERATURE: 
:WEATHER_CONDITION: 
:WEATHER_SYMBOL: 
:END:
</code></pre>
</div>

 <p>
You do not see these properties when creating an entry but you do see the location and weather as part of the heading
</p>


 <div id="org62854a5" class="figure">
 <p> <img src="../images/journelly_01.png" alt="journelly_01.png"></img></p>
</div>

 <p>
It is out now on the  <a href="https://apps.apple.com/gb/app/journelly/id6470714669">appstore</a> priced at 14.99GBP it might seem a little high but I think its worth it. I've been using it almost daily to capture notes, events and to as the name suggests journal &amp; I instantly have access in emacs.
</p>

 <p>
I've found it that useful that I'm considering a change to my normal journalling method &amp; I'm currently re-writing a python script to plot the journelly recorded locations on a map.
</p>

 <p>
The one thing I am missing is the ability to see a  <code>TODO</code> as a subheading, I'm not suggesting journelly become a todo list or task manager but my journal is often the first place a task will land especially if I am out for example on a ride-out I'll make notes, take photos but also possibly add a task to visit a shop when its open, or whatever. Then these tasks in my journals are available in emacs on the desktop, Alvaro and I had a good exchange about this and at the moment sub headings are disabled due to the way it treats all headings as equal. Nevertheless as a standalone application built around orgmode it is excellent.
</p>
 <div id="footnotes">
 <h2 class="footnotes">Footnotes: </h2>
 <div id="text-footnotes">

 <div class="footdef"> <sup> <a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
The site shows as having an android version but it is not found when searching the store 
</p></div></div>


</div>
</div></div>]]></content>
  <link href="https://leehalls.net/posts/orgjournal.html"/>
  <id>https://leehalls.net/posts/orgjournal.html</id>
  <updated>2025-05-05T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Location heatmap for Journelly</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Location heatmap for Journelly</h1>
 <p>
Following on from  <a href="orgjournal.html">a journal in orgmode/IOS</a> I have expertly crafted ( <i>read massively bodged</i>) a python script to create a heatmap of locations using folium.
</p>

 <p>
It simply reads in your Journelly.org file, checks for the lat/lon lines  &amp; stores them into a pandas dataframe ( <i>I was thinking of doing more with the df</i>) and updates the folium map object before saving the interactive HTML file.
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">import</span> pandas  <span class="org-keyword">as</span> pd 
 <span class="org-keyword">import</span> folium
 <span class="org-keyword">from</span> folium.plugins  <span class="org-keyword">import</span> HeatMap

 <span class="org-variable-name">flag</span>  <span class="org-operator">=</span>  <span class="org-variable-name">i</span>  <span class="org-operator">=</span>  <span class="org-variable-name">lat</span>  <span class="org-operator">=</span>  <span class="org-variable-name">lon</span>  <span class="org-operator">=</span> 0
 <span class="org-comment-delimiter">#</span> <span class="org-comment">create map object centred around your location &amp; define save location
</span> <span class="org-variable-name">map_object</span>  <span class="org-operator">=</span> folium.Map(location  <span class="org-operator">=</span> [52.88489542624623,  <span class="org-operator">-</span>1.42548966136386], zoom_start  <span class="org-operator">=</span> 10 )

 <span class="org-keyword">with</span>  <span class="org-builtin">open</span>( <span class="org-string">&quot;/Users/leehalls/Documents/dumpground/Journelly.org&quot;</span>)  <span class="org-keyword">as</span> file:
   <span class="org-keyword">for</span> item  <span class="org-keyword">in</span> file:
     <span class="org-keyword">if</span>  <span class="org-string">&quot;LATITUDE&quot;</span>  <span class="org-keyword">in</span> item:
         <span class="org-variable-name">lat</span>  <span class="org-operator">=</span> item[11:20]
     <span class="org-keyword">if</span>  <span class="org-string">&quot;LONGITUDE&quot;</span>  <span class="org-keyword">in</span> item:
         <span class="org-variable-name">lon</span>  <span class="org-operator">=</span> item[12:21]
         <span class="org-variable-name">i</span>  <span class="org-operator">+=</span> 1
     <span class="org-keyword">if</span> flag  <span class="org-operator">==</span> 0:
         <span class="org-variable-name">done</span>  <span class="org-operator">=</span> 1  <span class="org-comment-delimiter">#</span> <span class="org-comment">create dataframe
</span>         <span class="org-variable-name">df</span>  <span class="org-operator">=</span> pd.DataFrame({ <span class="org-string">&quot;lat&quot;</span>:[lat], <span class="org-string">&quot;lon&quot;</span>:[lon]})
     <span class="org-keyword">if</span> done  <span class="org-operator">==</span> 1:
         <span class="org-keyword">if</span> flag  <span class="org-operator">!=</span> i:
                 <span class="org-variable-name">flag</span>  <span class="org-operator">=</span> i
                 <span class="org-variable-name">data</span>  <span class="org-operator">=</span> { <span class="org-string">&quot;lat&quot;</span>:[lat],  <span class="org-string">&quot;lon&quot;</span>:[lon]}
                 <span class="org-variable-name">df_new_rows</span>  <span class="org-operator">=</span> pd.DataFrame(data)  <span class="org-comment-delimiter">#</span> <span class="org-comment">create new dataframe with last values
</span>                 <span class="org-variable-name">df</span>  <span class="org-operator">=</span> pd.concat([df, df_new_rows])  <span class="org-comment-delimiter">#</span> <span class="org-comment">add last values to cumulative dataframe
</span>                HeatMap(df_new_rows).add_to(map_object)  <span class="org-comment-delimiter">#</span> <span class="org-comment">add last location to heatmap
</span>
map_object.save(r <span class="org-string">&quot;/Users/leehalls/Documents/dumpground/map.html&quot;</span>)
</code></pre>
</div>



 <div id="orgd2cd1c6" class="figure">
 <p> <img src="../images/heatmap_01.png" alt="heatmap_01.png"></img></p>
</div>


 <div id="org41bc462" class="figure">
 <p> <img src="../images/heatmap_02.png" alt="heatmap_02.png"></img></p>
</div>
</div>]]></content>
  <link href="https://leehalls.net/posts/orgjournalheatmap.html"/>
  <id>https://leehalls.net/posts/orgjournalheatmap.html</id>
  <updated>2025-05-05T00:00:00+01:00</updated>
</entry>
<entry>
  <title>A thing of beauty</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">A thing of beauty</h1>
 <p>
From having these  <a href="biking.html">getting back to motorcycling</a> to this;
</p>


 <div id="orgd2d9501" class="figure">
 <p> <img src="../images/IMG_0182.jpeg" alt="IMG_0182.jpeg"></img></p>
</div>

 <p>
Thats it - no other words 😍
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/bobber.html"/>
  <id>https://leehalls.net/posts/bobber.html</id>
  <updated>2025-04-13T00:00:00+01:00</updated>
</entry>
<entry>
  <title>A lazy day with the camera</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">A lazy day with the camera</h1>
 <p>
Finally some nice weather and I had chance to pick up the camera again whilst sat in the garden, only a short time but managed to get two photos I am very happy with;  
</p>


 <div id="orga89bf9d" class="figure">
 <p> <img src="../images/robin.png" alt="robin.png"></img></p>
 <p> <span class="figure-number">Figure 1: </span>Fly for dinner?</p>
</div>

 <hr></hr> <div id="orgf7dad41" class="figure">
 <p> <img src="../images/starling.png" alt="starling.png"></img></p>
</div>
</div>]]></content>
  <link href="https://leehalls.net/posts/birds20250406.html"/>
  <id>https://leehalls.net/posts/birds20250406.html</id>
  <updated>2025-04-06T00:00:00+01:00</updated>
</entry>
<entry>
  <title>orgmode power yet confusion</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">orgmode power yet confusion</h1>
 <p>
I'm not a power user of orgmode yet it is a piece of software i use daily. My emacs diary.org file has around 100 sexp entries, plus events, appointments spanning 7yrs. The problem i had was sexp entries show up in the emacs diary but would not show up in any mobile client, as usual with org there are many ways to achieve the same thing. For example a sexp entry could look like  <code>%%(diary-cyclic 14 1 10 2025) Blue bin</code> so is a reminder to put the right colour bin out every 2wks works great when in emacs but outside? this entry is better, simpler and achieves the same results;
</p>

 <ul class="org-ul"> <li> <span class="timestamp-wrapper"> <span class="timestamp">&lt;2025-01-24 Fri +2w&gt;</span></span></li>
</ul> <p>
it shows the entry up every 2wks just the same as the sexp but works across the mobile apps as well. Why did i choose sexp in the first place for something so mundane? I guess it was because I just carried over the concept from the anniversary function where i could have the number of years show up since the event ie 
</p>

 <ul class="org-ul"> <li>%%(org-anniversary 1969 2 14) Arthur Dent - %d yrs old</li>
</ul> <p>
of course there is another way to capture repeating events one that allows you to add notes if something unique occurs for the specific repeat entry;
</p>

 <p>
 <a href="https://karl-voit.at/2017/01/15/org-clone-subtree-with-time-shift/">https://karl-voit.at/2017/01/15/org-clone-subtree-with-time-shift/</a>
</p>

 <p>
Lesson learned is that in org there is more than one way to skin a cat.
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/orgmodeoptions.html"/>
  <id>https://leehalls.net/posts/orgmodeoptions.html</id>
  <updated>2025-01-26T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Lights out</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Lights out</h1>
 <p>
I wrote quite  a long post here about  <a href="../../../org_website/content/posts/lightpollution.html#ID-021D55E2-ED21-4DE8-BBFC-3F45D3D2C7A0">light pollution</a> &amp; energy consumption which linked into my assertion that there's not enough  backlink &quot;darkness&quot;  in the world. The premise of it was, to turn out street lights and it is possibly coming to pass with councils starting to turn lights out. OK it is a cost cutting drive but that was also a major part of my posts and if done right, in the right areas its only going to be a benefit. This article posted on the BBC News website entitled &quot;Why are English councils turning off street lights?&quot;  <a href="https://www.bbc.co.uk/news/articles/c0mzkgxr22po.amp">https://www.bbc.co.uk/news/articles/c0mzkgxr22po.amp</a> seems to indicate that councils are either starting to switch off between specific hours or dimming both of which are good. I travel a lot and the number of roads I drive on across Europe which are dark compared to here is incredible. Our world is built on consumption of energy and short sightedly pushing people into electric cars is not the answer for either global warming, light pollution or energy consumption. 
</p>

 <p>
Again if we are serious about the planet about making a difference the conversation must widen into more realistic and achievable areas. 
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/lightsout_20241119.html"/>
  <id>https://leehalls.net/posts/lightsout_20241119.html</id>
  <updated>2024-11-19T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Time, broken themes and a rewrite</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Time, broken themes and a rewrite</h1>
 <p>
This post links in with  <a href="travelling.html">travelling</a> because again it refers to the sense of having no time, but also it shows what happens if you update software without keeping an eye on the changes … the theme I used no longer builds with the version hugo now installed  <code>hugo v0.136.5+extended darwin/arm64 BuildDate=2024-10-24T12:26:27Z VendorInfo=brew</code> and there are so many errors and elements broken due to internal hugo changes I'm not even sure I could update it. So either I revert back to level of hugo which works or I try out something new - new it is.
</p>

 <p>
I'm trialling the  <a href="https://themes.gohugo.io/themes/hugo-theme-til/">Today I Learned</a> or  <a href="https://github.com/mrmierzejewski/hugo-theme-console">Console</a> and both though they are completely different, the TIL theme the author notes is still in the early beta stage but I figured it worth a try as I like the idea of the graph, reminds me of org-roam or obsidians graph something I'm still getting used to but has potential. The title of the  <code>TIL</code> theme is true as I have now learned to use hugo specific exports  <a href="https://ox-hugo.scripter.co/doc/shortcodes/">https://ox-hugo.scripter.co/doc/shortcodes/</a> and this was because the graph uses backlinks to draw itself and the style of those links is  <code>{{</code>  <code>&lt; backlink &quot;travelling&quot;</code>  <code>&gt;}}</code> which does not translate well so after a little reading I found using~&lt; backlink &quot;travelling&quot; &gt;~  <code>}} @@</code> did the job however I'm sure there is a better way. One thing I was missing is the gallery element which I used for my photography side though I found this one:  <a href="https://github.com/mfg92/hugo-shortcode-gallery/tree/master">https://github.com/mfg92/hugo-shortcode-gallery/tree/master</a> and once added as a sub-module the shortcode is available and working well. Check out his photography here:  <a href="https://matze.rocks/images/">https://matze.rocks/images/</a> the one with black squirrel perfectly separated from the background and staring into you is my favourite so far but the one of an ibex? in B&amp;W framed by the foliage really appeals to the old B&amp;W developer in me.
</p>

 <p>
Previously tags &amp; categories provided the interlinking, perhaps the graph can be made to work for them instead of backlinks? though I like the idea of making something specifically linked but there is also the point that it might not be advisable working backlinks into all posts ( <i>you can see in the graph below this post links to the travel one</i>) I like it but perhaps one should learn from the reason for this update, it was simple enough to migrate to this theme but adding the shortcode breaks other themes so perhaps do not use or add that functionality. Maybe the lesson is that unless you take ownership of the theme or freeze at a certain software level then you're always going to face some major changes.
</p>

 <p>
I still haven't decided which one to use, I am slowly migrating content to both themes to see what they're like but for a while I'll trial one and see how I feel.
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/20241116_update.html"/>
  <id>https://leehalls.net/posts/20241116_update.html</id>
  <updated>2024-11-16T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Limited time lots of travel</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Limited time lots of travel</h1>
 <div class="preview" id="orge6e5223">
 <p>
craxy taxi ride, beautiful Mexico.
</p>

</div>


 <p>
Time is a commodity which seems to be scarce at the minute, need it to update my projects upon which some of the content of this website rely and of course my own education but due to various reasons and maybe a lack of drive on my part has meant nothing new has been written.
</p>

 <p>
Plus work travel took a good chunk of time away with among many smaller trips to various locations, a long one of two months based in Silao. Long hours but an  <b>awesome</b> set of people helped make the situation weirdly enjoyable despite the circumstances and we achieved a tremendous result given the timeframe.
</p>

 <p>
Still it wasnt all work in those two months as I did get the odd day off … around 4 … but during which I managed to get another tattoo
</p>



 <div id="org8ac6b4b" class="figure">
 <p> <img src="../images/20230513_163439.jpeg" alt="20230513_163439.jpeg" width="300"></img></p>
 <p> <span class="figure-number">Figure 1: </span>new ink</p>
</div>

 <p>
and visit the beautiful city of Guanajuato
</p>


 <div id="orge409302" class="figure">
 <p> <img src="../images/20230528_180208.jpeg" alt="20230528_180208.jpeg"></img></p>
 <p> <span class="figure-number">Figure 2: </span>Guanajuato</p>
</div>

 <p>
And take one of the most  <i>&quot;enjoyable&quot;</i> taxi rides i have had for a long time. With my driver praying to God on the twisty roads as he tried to make up time. He was at times cutting it close, tyre squeal, almost head-on into a bus. Entertaining.
</p>



 <div id="org5ecda8a" class="figure">
 <p> <img src="../images/guanajuato.png" alt="guanajuato.png"></img></p>
</div>


 <p>
 <span class="timestamp-wrapper"> <span class="timestamp">[2024-11-23 Sat]</span></span> decided to add a zoomed view of one section of the road to show just how twisty entertaining it was;
</p>


 <div id="org6842b85" class="figure">
 <p> <img src="../images/zoomed_road.png" alt="zoomed_road.png"></img></p>
</div>


 <div class="caution" id="org1f83327">
 <p>
Yes i know it was probably a rip-off, there was a more direct route which I did not know at the time and took on the way back but it was a fun ride, plenty of switch-backs and mountain scenery.
</p>

</div>
</div>]]></content>
  <link href="https://leehalls.net/posts/travelling.html"/>
  <id>https://leehalls.net/posts/travelling.html</id>
  <updated>2023-08-05T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Using org without emacs</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Using org without emacs</h1>
 <p>
Is it possible to use org without emacs? 
</p>

 <p>
For most people it would seem from various internet searches that what keeps them using emacs is orgmode. It is certainly true for me that 75% of my emacs usage is purely org based with the rest being python ( <i>yes i know its not good python</i>), tramp and the odd text edit though i still find SublimeText an easier option for somethings. Though to answer the question posed at the start the answer was always no, yes we have the various mobile options such as  <a href="https://www.orgzly.com">orgzly</a>,  <a href="https://orgro.org">orgro</a>,  <a href="https://metanote-dev.github.io">metanote</a>,  <a href="https://plainorg.com">plainorg</a> but some of these have limited functionality and personal opinion ahead … I would say are more an extension of the desktop org allowing you to view your data and capture basic info and for the desktop you needed emacs but
</p>

 <p>
perhaps not anymore ….
</p>

 <p>
As a long time  <a href="https://www.sublimetext.com">SublimeText</a> user i was surprised i had missed this, previously i had tried orgmode for sublime but then stumbled upon Org Extended  <a href="https://github.com/ihdavids/orgextended">https://github.com/ihdavids/orgextended</a> something which looks to bring most of the org\emacs functionality outside of emacs.
</p>

 <p>
Here we have what appears to be as close as possible a fully functional orgmode implementation outside of emacs. It has syntax highlighting, folding headers, tags, links etc and also a reasonably functional agenda. Certainly there is nothing to stop you creating and modifying complex org documents in it even images are shown inine for example;
</p>


 <div id="org88bc772" class="figure">
 <p> <img src="../images/sublime_orgimage.png" alt="sublime_orgimage.png"></img></p>
</div>

 <p>
Which shows SublimeText 4 on a mac editing a long file i wrote about getting gauges working for a home monitoring system.
</p>

 <p>
You can see here the Agenda view with days having activity shown with a red square around them
</p>


 <div id="org33aff53" class="figure">
 <p> <img src="../images/sublime_agenda.png" alt="sublime_agenda.png"></img></p>
</div>

 <p>
It doesnt have all the functionality of an emacs based org-agenda for example repeating todo items stored in my diary file show up irrespective that they are not due for another 6months ie
</p>

 <div class="org-src-container">
 <pre class="src src-org"> <code>++ TODO Kawasaki roadtax :bike:vehicle:
 <span class="org-org-special-keyword">DEADLINE:</span>  <span class="org-org-date">&lt;2023-04-01 Sat +1y -14d&gt;</span>
 <span class="org-org-drawer">:PROPERTIES:</span>
 <span class="org-org-special-keyword">:LAST_REPEAT:</span>  <span class="org-org-property-value"> <span class="org-org-date">[2022-03-26 Sat 11:48]</span></span>
 <span class="org-org-drawer">:END:</span>
</code></pre>
</div>

 <p>
and the various entries i have setup using SEXP do not show eg
</p>

 <div class="org-src-container">
 <pre class="src src-org"> <code> <span class="org-org-sexp-date">%%(org-anniversary 1969 2 14) Arthur Dent - %d yrs old</span>
</code></pre>
</div>

 <p>
though I have not spent long looking at all the configuration options nor reading through the quite extensive documentation but on an initial review it looks more than capable and very promising to bring org outside of emacs, well worth a look.
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/orgnoemacs.html"/>
  <id>https://leehalls.net/posts/orgnoemacs.html</id>
  <updated>2023-04-01T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Moving to HomeAssistant</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Moving to HomeAssistant</h1>
 <p>
A long time ago i setup &amp; wrote my own  <a href="https://github.com/drakxtwo/dragelec">home monitoring system</a> using wireless temperature sensors and a current clamp across the incoming feed to the house for electricity monitoring ( <i>take a look at the projects section for flask socketio</i>) Using it i was able to educate the step-son about taking 90 minute long showers without contributing to the bills <sup> <a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup> i then moved house leaving the current clamp hardware in place  <i>duh</i> then what with getting the house sorted, travelling for work and subsequent long hours on my return i never set it up again besides the long shower taker had buggered off saving me loads of cash :-)
</p>

 <p>
Still i had the temperature sensors lying around and the knowledge/program was still lurking so i decided to restart it but then i found  <a href="https://www.home-assistant.io">HomeAssistant</a> and realised then and there to ditch trying to do it all myself.
</p>

 <p>
Using a raspberry pi, MQTT and HomeAssistant i had everything i had before and much more….
</p>

 <p>
Although I had set the Pi up once more recording just temperatures adding the excellent MotionEye to capture video of movement on my drive/garage the visual interface, graphs, weaather forecast etc was all gone so i was just recording for its own sake. Pretty pointless. But now using HomeAssistant i am once again making use of the data with nice visuals
</p>


 <div id="orgbe6a883" class="figure">
 <p> <img src="../images/home_assistant_1.png" alt="home_assistant_1.png"></img></p>
</div>

 <p>
and much more with all the integrations that the software offers i think it could end up being like an emacs init.el constantly being added to or tweaked for example i have;
</p>

 <ul class="org-ul"> <li>daily report of the cost for gas &amp; electricity</li>
 <li>live streaming of the camera feeds from motioneye</li>
 <li>info on all my hardware (server status, temperature, network and processer loads etc)</li>
</ul> <div id="orgb2ed817" class="figure">
 <p> <img src="../images/home_assistant_2.png" alt="home_assistant_2.png"></img></p>
</div>

 <ul class="org-ul"> <li>weather forecast</li>
 <li>calendar</li>
 <li>radio (this is work in progress but it will be playing a Polish radio station on command)</li>
 <li>historical data if i want to check</li>
</ul> <p>
all the above is in a nice interface accessible via web browser with my longer term goal to use an old Android tablet as the always on interface maybe even replacing Alexa. I havent even scratched the surface yet what with scenarios, events, automation theres lots to look into. Dont just take my word for it, a short google search will throw up tons of info and links to other people on their HA journey.
</p>
 <div id="footnotes">
 <h2 class="footnotes">Footnotes: </h2>
 <div id="text-footnotes">

 <div class="footdef"> <sup> <a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
The electric shower used the most power in the house so was easy to monitor, hence when the ampage was excessive for a period of time that i defined, at first the program emailed me a report of time length &amp; amount, that i used hoping that showing the data would educate and change behaviour … it did not.  <b>HOWEVER</b> turning off the internet to a specific IP address when a shower exceeded a set time :-) well surprise surprise teenagers love the internet and its loss was galling. Shorter showers here we come! 
</p></div></div>


</div>
</div></div>]]></content>
  <link href="https://leehalls.net/posts/homeassist.html"/>
  <id>https://leehalls.net/posts/homeassist.html</id>
  <updated>2023-01-28T00:00:00+00:00</updated>
</entry>
<entry>
  <title>A sparrow for breakfast</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">A sparrow for breakfast</h1>
 <p>
I've been lucky enough to see this guy a few times, always a fleeting flutter of feathers and trills and as the others tried to evade, successfully i might add. This time though one was not quick enough but i was with a lot of luck and accidental timing, because i was filling the kettle when the bush infront of the window moved and out flew this fellow;
</p>

 <p>
 <img src="../images/20230121_091048.jpg" alt="20230121_091048.jpg"></img>
He sat there for a whilst just seemingly comtemplating his next move before lanching back into the bush which came alive once more with noise and movement before silence …
</p>

 <p>
Out he flew with breakfast
</p>

 <p>
 <img src="../images/20230121_091159.jpg" alt="20230121_091159.jpg"></img>
A look around, pluck a few feathers and then off he goes with the prize. I'm not winning any photographic awards here i was just fortunate to have my phone to hand to grab a few shots through hazy windows and thats enough. How many people get to see something like this up close without evening leaving home?
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/sparrow.html"/>
  <id>https://leehalls.net/posts/sparrow.html</id>
  <updated>2023-01-26T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Python export for specific tagged headlines &amp; files</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Python export for specific tagged headlines &amp; files</h1>
 <p>
 <span class="timestamp-wrapper"> <span class="timestamp">[2022-11-11 Fri]</span></span> renamed this article because in my mind &quot;parser&quot; indicates something more than this is. This is just a way to read an org file and extract headings identifed with a specific tag and only the linked files for that heading/tag not all the files i have stored in the data directory.
The reason this genuine example of poor python exists is because of my workflow … so i keep project notes in org files ( <i>of course!</i>) and any associated files that are linked eg emails or images are saved in the relevant sub-directory eg
</p>

 <div class="org-src-container">
 <pre class="src src-batch"> <code>- top dir
  - all orgfiles
  - project_dir_1
  - project_dir_2
  - project_dir_3
</code></pre>
</div>


 <p>
However if i want to share specific tagged topics to say handover a part of the project to someone else or perhaps for financial arguments I can export or publish ( <i>in fact i've got quite a good publish.el</i>) but whilst this copies only the nodes that are specifically tagged it also copies  <b>every</b> single file that is stored in the project sub-directory. Not good when some topics are private or covered by an NDA nor if i want to keep the size down. I did search and search but came up empty weirdly so as i sort of expected this to be a normal requirement but perhaps thats the point of the emacs\org combination. It is so malleable we can create our own curated libraries hence who is to say what is &quot;normal&quot; thus i created this monstrosity however i may have missed something but in the meantime it is here if anyone wants to try it or if anyone can show me a better way please do!
</p>

 <p>
What is it? 
</p>
 <ul class="org-ul"> <li>well it is a python program to take a specified orgfile, parse it searching the headers for specific tags and then only output to the export directory the files specifically associated with those tagged nodes.</li>
</ul> <p>
What is not good at?
</p>
 <ul class="org-ul"> <li>its crude, the output doesnt consider sub-headings etc so everything is treated with the HTML  <code>&lt;H1&gt;</code> tag and images are not re-sized or have size attributes applied or in other words if you've a big image in your orgfile that you resized using the</li>
</ul> <div class="org-src-container">
 <pre class="src src-emacs-lisp"> <code>#+ATTR_HTML:  <span class="org-builtin">:width</span> 200
#+ATTR_ORG:  <span class="org-builtin">:width</span> 200
</code></pre>
</div>

 <p>
attributes …. well thats ignored.
</p>

 <p>
Also weirdly some links do not have a space applied so the continuation text is immediately after the link, a minor problem but from a visual point an annoying one. 
</p>

 <p>
Does it work?
</p>
 <ul class="org-ul"> <li>Yes, i've tested it on macBook air copying across one specific project file and its sub-dir ( <i>data safety!</i>) a file with 1049 lines and with a sub-directory containing &gt;300mB of files and it only copied across those files that were pertinent outputting an HTML file that was if not nice to look at usable.</li>
</ul> <p>
Is it perfect?
</p>
 <ul class="org-ul"> <li> <b>HELL NO</b> …. did you read my sites intro? i'm an amateur i do this because i find it interesting &amp; could be a lot better at it but because i dont program frequently a bit like language usage ( <i>i was conversational in German, understood a lot of Japanese &amp; Swedish and others</i>) if you dont use it well it dies and you end up remembering only &quot;konichi wa&quot; or &quot;Minä rakastan sinua&quot; if you speak any Finnish.</li>
</ul> <p>
So on to the code:
</p>

 <p>
First it relies on two libraries the orgparse library which can be found here:  <a href="https://github.com/karlicoss/orgparse">https://github.com/karlicoss/orgparse</a> and then an org to html library  <a href="https://github.com/honmaple/org-python">https://github.com/honmaple/org-python</a> 
</p>

 <p>
Import the libraries needed
</p>
 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">from</span> orgparse  <span class="org-keyword">import</span> load, loads
 <span class="org-keyword">from</span> orgpython  <span class="org-keyword">import</span> to_html
 <span class="org-keyword">import</span> shutil
 <span class="org-keyword">import</span> re
 <span class="org-keyword">import</span> os
</code></pre>
</div>

 <p>
next we load the file to parse entries for
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-variable-name">root</span>  <span class="org-operator">=</span> load( <span class="org-string">'project_340.org'</span>)
</code></pre>
</div>

 <p>
open the output for file for writing;
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-variable-name">f</span>  <span class="org-operator">=</span>  <span class="org-builtin">open</span>( <span class="org-string">'export/test.html'</span>,  <span class="org-string">'w'</span>)
</code></pre>
</div>

 <p>
this is the old function is called to write the headline and raw body
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">def</span>  <span class="org-function-name">output</span>(hdg,body):
     <span class="org-comment-delimiter"># </span> <span class="org-comment">write heading &amp; body to file
</span>     <span class="org-builtin">print</span>( <span class="org-string">'creating output'</span>)
    f.write(hdg)
    f.write( <span class="org-string">'</span> <span class="org-constant">\n</span> <span class="org-string">'</span>)
    f.write(body)
</code></pre>
</div>

 <p>
now replaced with
</p>
 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">def</span>  <span class="org-function-name">convert</span>(hdg, bodytext):
     <span class="org-comment-delimiter"># </span> <span class="org-comment">here be dragons 
</span>     <span class="org-comment-delimiter">#</span> <span class="org-comment">print(to_html(bodytext, toc=True, offset=0, highlight=True))
</span>     <span class="org-comment-delimiter">#</span> <span class="org-comment">f.write(to_html(hdg, toc=True,offset=0,higlight=True))
</span>    f.write( <span class="org-string">'&lt;h1&gt;'</span>  <span class="org-operator">+</span> hdg  <span class="org-operator">+</span>  <span class="org-string">'&lt;/h1&gt;'</span>)
    f.write(to_html(bodytext, toc <span class="org-operator">=</span> <span class="org-constant">True</span>, offset <span class="org-operator">=</span>0, highlight <span class="org-operator">=</span> <span class="org-constant">True</span>))
</code></pre>
</div>

 <p>
function to identify the filename inside the body text, here we split the entire text into individual words and poll through them to find the relevant text
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-comment-delimiter"># </span> <span class="org-comment">old function
</span> <span class="org-keyword">def</span>  <span class="org-function-name">copyfile</span>(filename): 
     <span class="org-comment-delimiter"># </span> <span class="org-comment">here be dragons
</span>     <span class="org-keyword">for</span> word  <span class="org-keyword">in</span> filename.split():
         <span class="org-keyword">if</span>  <span class="org-string">'file:'</span>  <span class="org-keyword">in</span> word:
             <span class="org-variable-name">fn</span>  <span class="org-operator">=</span> word[7:word.find( <span class="org-string">']'</span>)]
            shutil.copyfile(fn,  <span class="org-string">'export/'</span> <span class="org-operator">+</span>fn)
</code></pre>
</div>

 <p>
the problem with above function is that i need to re-write my outlook email save macro, currently it saves the filename with spaces so the above will split the filename at the space meaning i may not have the complete filename eg  <code>[[file:this_example would be saved incorrectly.msg]]</code> this next function avoids the problem by using regex something which i still even after all these years haven't got to grips with.
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">def</span>  <span class="org-function-name">copyfile</span>(filename):
     <span class="org-variable-name">pattern</span>  <span class="org-operator">=</span> re. <span class="org-builtin">compile</span>(r <span class="org-string">'[\[\]]+'</span>)
     <span class="org-variable-name">inputtxt</span>  <span class="org-operator">=</span>  <span class="org-builtin">filter</span>( <span class="org-constant">None</span>, pattern.split(filename))
     <span class="org-keyword">for</span> dat  <span class="org-keyword">in</span> inputtxt:
         <span class="org-keyword">if</span>  <span class="org-string">&quot;file:&quot;</span>  <span class="org-keyword">in</span> dat:
             <span class="org-variable-name">fn</span>  <span class="org-operator">=</span> dat[5:]
             <span class="org-variable-name">name</span>  <span class="org-operator">=</span> dat.split( <span class="org-string">'/'</span>)
             <span class="org-builtin">dir</span>  <span class="org-operator">=</span>  <span class="org-string">'export/'</span>  <span class="org-operator">+</span> (name[0][5:])
             <span class="org-builtin">print</span>( <span class="org-string">'filename info'</span>,  <span class="org-builtin">dir</span>)
            os.makedirs( <span class="org-builtin">dir</span>, exist_ok <span class="org-operator">=</span> <span class="org-constant">True</span>)
            shutil.copyfile(dat[5:],  <span class="org-builtin">dir</span>  <span class="org-operator">+</span> <span class="org-string">'/'</span>  <span class="org-operator">+</span>name[1])        
</code></pre>
</div>

 <p>
What it effectively does is split the body text identified by orgparse into each word then looks for the keyword  <code>file</code> and then we split the first 7 characters from the string to remove  <code>[[file:</code> element before using find to identify the position of the square close bracket and so have isolated the filename into the variable  <code>fn</code> and this repeated for every file link found in the body text allowing us to copy only the relevant files to our export directory.
</p>


 <p>
Finally the main section parsing the orgfile - note we use format='raw' to get the complete org link
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code>
 <span class="org-comment-delimiter"># </span> <span class="org-comment">traverse through all the nodes/headings
</span> <span class="org-keyword">for</span> node  <span class="org-keyword">in</span> root[1:]:   <span class="org-comment-delimiter"># </span> <span class="org-comment">[1:] for skipping root itself
</span>     <span class="org-comment-delimiter">#</span> <span class="org-comment">conditional choose headings which match specific tags
</span>     <span class="org-keyword">if</span> node.tags  <span class="org-operator">==</span>  <span class="org-builtin">set</span>([ <span class="org-string">'the_tag_i_want'</span>]):
         <span class="org-variable-name">hdg</span>  <span class="org-operator">=</span> node.heading
         <span class="org-variable-name">bdy</span>  <span class="org-operator">=</span> node.get_body( <span class="org-builtin">format</span> <span class="org-operator">=</span> <span class="org-string">'raw'</span>)
        copyfile(bdy)
        convert(hdg,bdy)

f.close()
 <span class="org-builtin">print</span>( <span class="org-string">'----'</span>)
</code></pre>
</div>
</div>]]></content>
  <link href="https://leehalls.net/posts/orgparse.html"/>
  <id>https://leehalls.net/posts/orgparse.html</id>
  <updated>2022-10-28T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Back to motorcycles</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Back to motorcycles</h1>
 <p>
However when the financial crash hit in '08 something had to go and the bike no matter how much i tried to justify its life was just one expense too many, she had to go so with bitter regret my beautiful, sexy ZX6 departed for pastures new and lo as each year passed i'd sit and listen to all those fuckers still riding, the roar of the engine increasing as they perhaps exceeded the A-road speed limit and so it continued year after year until i could no longer stand it.
</p>

 <p>
I spent over a year searching for something often torn between the desire to cafe-racer an old CB750 or similar and the need for speed. I'd mark bikes on ebay or other sites but by the time i had made my mind up they'd gone. In the end i bought something i had not even considered looking at and which neither fits the cafe-racer or need for speed categories;
</p>


 <div id="orgc732c69" class="figure">
 <p> <img src="../images/benelli_2.jpg" alt="benelli_2.jpg"></img></p>
 <p> <span class="figure-number">Figure 1: </span>Benelli 502C</p>
</div>

 <p>
 <img src="../images/benelli_1.jpg" alt="benelli_1.jpg"></img>
It is a nice looking bike, gets a lot of questions\comments mostly from people wanting to copy the rear end for their projects plus the fuel tank is  <b>massive</b> i was used to a re-fueling stop anywhere between 90-120miles yet this thing just keeps on going.
</p>

 <p>
There are a few shortcomings … 
</p>

 <ul class="org-ul"> <li>[1] power is one - yes she is easy to ride, quick to chuck into corners but be prepared to hit the gearbox often unless you dont mind stopping midway through an overtake as the rev-limiter kicks in, treat her a bit like an old two-stroke. That said for a simple cruise with a bit of fun in the twisties she's alright and something I've learned with age its not all about the power, the overtake but enjoying the ride. See the countryside pass by not fly by!</li>

 <li>[2] Dashboard - yes its a nice looking TFT display but there two significant-ish concerns. Firstly it often becomes unreadable in full sunlight and though you are not going to breaking many records i dont think Mr Plod will accept the excuse &quot; <i>i cannae see me dashboard when suns out</i>&quot; secondly perhaps laughably watch what happens when you switch to night riding … the fuel gauge and temperature display swap sides.</li>
</ul> <p>
Despite those the ride is fun, she looks good, and she was cheap we're talking about 5200 on the road but since the purchase of the Benelli i still kept my eyes on ebay and over a year ago ended up with a second bike, this time a full on cruiser and one from 1997.
</p>


 <div id="org52efa6a" class="figure">
 <p> <img src="../images/vn800_1.jpg" alt="vn800_1.jpg"></img></p>
 <p> <span class="figure-number">Figure 2: </span>Old school VN800</p>
</div>

 <p>
She really doesnt struggle with power\torque and to be honest combine a cruiser with an open face helmet, a pair of shades and good weather it is awesome. Yes ground clearance is now almost non-existent and lean angles are not double digits, and yes the suspension may have gone a little soft ( <i>scraped through the exhaust</i>) but it is just so much fun. Makes me wish i had gone this route sooner although there are other issues with owning an older girl …. the new E10 petrol might be something to consider and well …. she broke down on me, leaving me stranded except for a fellow biker who happened to be driving past in his van! Saved me a long walk home.
</p>

 <p>
That decision hasn't been made though but for the Benelli it is time to go, i've had my 3yrs of fun but have reached the limit and it is time to go different though what? Bikes are a personal thing and finding the right one is not so easy the search has restarted…….
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/biking.html"/>
  <id>https://leehalls.net/posts/biking.html</id>
  <updated>2022-06-04T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Realtime data plot</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Realtime data plot</h1>
 <p>
Following on from my earlier smoothiecharts trying to use smoothiecharts with flask-socketio for realtime data i managed to get an alternative working this time using charts  <a href="https://www.chartjs.org/">https://www.chartjs.org/</a> Using this i am now able to generate random data ( <i>in lieu of external input values</i>) and have them graphed in realtime on a line chart created using the api. The main part of the flask-python element consists of the data creation routine
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-type">@application.route</span>( <span class="org-string">'/'</span>)
 <span class="org-keyword">def</span>  <span class="org-function-name">index</span>():
     <span class="org-keyword">return</span> render_template( <span class="org-string">'data_acq.html'</span>)

 <span class="org-type">@application.route</span>( <span class="org-string">'/chart-data'</span>)
 <span class="org-keyword">def</span>  <span class="org-function-name">chart_data</span>():
     <span class="org-keyword">def</span>  <span class="org-function-name">generate_random_data</span>():
         <span class="org-keyword">while</span>  <span class="org-constant">True</span>:
             <span class="org-variable-name">timestamp</span>  <span class="org-operator">=</span> datetime.now().strftime( <span class="org-string">'%H:%M:%S'</span>)
             <span class="org-variable-name">tc1</span>  <span class="org-operator">=</span>  <span class="org-builtin">round</span>(random.random()  <span class="org-operator">*</span> 100)

             <span class="org-variable-name">json_data</span>  <span class="org-operator">=</span> json.dumps(
                { <span class="org-string">'time'</span>: timestamp,  <span class="org-string">'value0'</span>: tc1})
             <span class="org-keyword">yield</span> f <span class="org-string">&quot;data:</span>{json_data} <span class="org-constant">\n\n</span> <span class="org-string">&quot;</span>
             <span class="org-variable-name">values</span>  <span class="org-operator">=</span> (timestamp,tc1)
             <span class="org-variable-name">header</span>  <span class="org-operator">=</span> [ <span class="org-string">'timestamp'</span>, <span class="org-string">'tc1'</span>]
            time.sleep(1)
             <span class="org-builtin">print</span>(values)

     <span class="org-keyword">return</span> Response(generate_random_data(), mimetype <span class="org-operator">=</span> <span class="org-string">'text/event-stream'</span>)
</code></pre>
</div>

 <p>
and then inside the appropriate html file we have'
</p>

 <ul class="org-ul"> <li>the link to the charting library</li>
</ul> <div class="org-src-container">
 <pre class="src src-html"> <code>&lt; <span class="org-function-name">head</span>&gt;
    &lt; <span class="org-function-name">meta</span>  <span class="org-variable-name">charset</span>= <span class="org-string">&quot;UTF-8&quot;</span>&gt;
    &lt; <span class="org-function-name">title</span>&gt; <span class="org-underline"> <span class="org-bold">realtime chart demo</span></span>&lt;/ <span class="org-function-name">title</span>&gt;
    &lt; <span class="org-function-name">link</span>  <span class="org-variable-name">href</span>= <span class="org-string">&quot;https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.min.css&quot;</span>  <span class="org-variable-name">rel</span>= <span class="org-string">&quot;stylesheet&quot;</span>&gt;
    &lt; <span class="org-function-name">link</span>  <span class="org-variable-name">href</span>= <span class="org-string">&quot;https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.css&quot;</span>  <span class="org-variable-name">rel</span>= <span class="org-string">&quot;stylesheet&quot;</span>&gt;
&lt;/ <span class="org-function-name">head</span>&gt;
</code></pre>
</div>

 <ul class="org-ul"> <li>then the body contains the div element for the line chart</li>
</ul> <div class="org-src-container">
 <pre class="src src-html"> <code>&lt; <span class="org-function-name">div</span>  <span class="org-variable-name">class</span>= <span class="org-string">&quot;container&quot;</span>&gt;
    &lt; <span class="org-function-name">div</span>  <span class="org-variable-name">class</span>= <span class="org-string">&quot;row&quot;</span>&gt;
        &lt; <span class="org-function-name">div</span>  <span class="org-variable-name">class</span>= <span class="org-string">&quot;col-12&quot;</span>&gt;
            &lt; <span class="org-function-name">div</span>  <span class="org-variable-name">class</span>= <span class="org-string">&quot;card&quot;</span>&gt;
                &lt; <span class="org-function-name">div</span>  <span class="org-variable-name">class</span>= <span class="org-string">&quot;card-body&quot;</span>&gt;
                    &lt; <span class="org-function-name">canvas</span>  <span class="org-variable-name">id</span>= <span class="org-string">&quot;canvas&quot;</span>&gt;&lt;/ <span class="org-function-name">canvas</span>&gt;
                &lt;/ <span class="org-function-name">div</span>&gt;
            &lt;/ <span class="org-function-name">div</span>&gt;
        &lt;/ <span class="org-function-name">div</span>&gt;
    &lt;/ <span class="org-function-name">div</span>&gt;
&lt;/ <span class="org-function-name">div</span>&gt;
</code></pre>
</div>

 <ul class="org-ul"> <li>and the javascript to receive the data from the flask app</li>
</ul> <div class="org-src-container">
 <pre class="src src-javascript"> <code>&lt;script src= <span class="org-string">&quot;https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.0/jquery.min.js&quot;</span>&gt;&lt;/script&gt;
&lt;!--suppress JSUnresolvedLibraryURL --&gt;
&lt;script src= <span class="org-string">&quot;https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.min.js&quot;</span>&gt;&lt;/script&gt;
&lt;!--suppress JSUnresolvedLibraryURL --&gt;
&lt;script src= <span class="org-string">&quot;https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js&quot;</span>&gt;&lt;/script&gt;

&lt;script&gt;
    $(document).ready( <span class="org-keyword">function</span> () {
         <span class="org-keyword">const</span>  <span class="org-variable-name">config</span> = {
            type:  <span class="org-string">'line'</span>,
            data: {
                labels: [],
                datasets: [{
                    label:  <span class="org-string">&quot;TC1&quot;</span>,
                    backgroundColor:  <span class="org-string">'rgb(255, 179, 179)'</span>,
                    borderColor:  <span class="org-string">'rgb(255, 179, 179)'</span>,
                    data: [],
                    fill:  <span class="org-constant">false</span>,
                }
],
            },
            options: {
                responsive:  <span class="org-constant">true</span>,
                title: {
                    display:  <span class="org-constant">true</span>,
                    text:  <span class="org-string">'Random value'</span>
                },
                tooltips: {
                    mode:  <span class="org-string">'index'</span>,
                    intersect:  <span class="org-constant">false</span>,
                },
                hover: {
                    mode:  <span class="org-string">'nearest'</span>,
                    intersect:  <span class="org-constant">true</span>
                },
                scales: {
                    xAxes: [{
                        display:  <span class="org-constant">true</span>,
                        scaleLabel: {
                            display:  <span class="org-constant">true</span>,
                            labelString:  <span class="org-string">'Time'</span>
                        }
                    }],
                    yAxes: [{
                        display:  <span class="org-constant">true</span>,
                        ticks: {
                        suggestedMin: 50,
                        suggestedMax: 200},
                        scaleLabel: {
                            display:  <span class="org-constant">true</span>,
                            labelString:  <span class="org-string">'Value'</span>
                        }
                    }]
                }
            }
        };


         <span class="org-keyword">const</span>  <span class="org-variable-name">context</span> = document.getElementById( <span class="org-string">'canvas'</span>).getContext( <span class="org-string">'2d'</span>);

         <span class="org-keyword">const</span>  <span class="org-variable-name">lineChart</span> =  <span class="org-keyword">new</span>  <span class="org-type">Chart</span>(context, config);

         <span class="org-keyword">const</span>  <span class="org-variable-name">source</span> =  <span class="org-keyword">new</span>  <span class="org-type">EventSource</span>( <span class="org-string">&quot;/chart-data&quot;</span>);

        source.onmessage =  <span class="org-keyword">function</span> ( <span class="org-variable-name">event</span>) {
             <span class="org-keyword">const</span>  <span class="org-variable-name">data</span> = JSON.parse(event.data);
             <span class="org-keyword">if</span> (config.data.labels.length === 100) {
                config.data.labels.shift();
                config.data.datasets[0].data.shift();
            }
            document.getElementById( <span class="org-string">'time'</span>).innerHTML = data.time;
            document.getElementById( <span class="org-string">'tc1'</span>).innerHTML = data.value0;
            config.data.labels.push(data.time);
            config.data.datasets[0].data.push(data.value0);
            lineChart.update();
        }
    });
&lt;/script&gt;
</code></pre>
</div>

 <p>
Adding all this together results in a line graph that is updated every second looking like
</p>


 <div id="orgea4a7cd" class="figure">
 <p> <img src="../images/chart.min.js_example.png" alt="chart.min.js_example.png"></img></p>
</div>

 <p>
with a simple table underneath that also shows the last value received. Currently it shows 100 values on the chart before each one is &quot;lost&quot; like a FIFO system but we can change this by altering the value in the HTML file
</p>

 <div class="org-src-container">
 <pre class="src src-javascript"> <code> <span class="org-keyword">if</span> (config.data.labels.length === 100) {
    config.data.labels.shift();
    config.data.datasets[0].data.shift();
}
</code></pre>
</div>

 <p>
So changing the value seen above dictates how many values are plotted on the chart before being moved off it, following the above it should easily be possible for anyone to build a chart with multiple realtime values shown.
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/realtimedata.html"/>
  <id>https://leehalls.net/posts/realtimedata.html</id>
  <updated>2021-12-29T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Wild Parakeets</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Wild Parakeets</h1>
 <p>
I've known for a while now that in the local area we have a flock of parakeets flying free, I'd seen them last year when walking the dog and again this year but this is the first time they've spent anytime actually around where i live. There is approximately 10 to 12 birds and you definitely know when they are around! Communicative squawky little fellows they are too.
</p>

 <p>
This week they've been in the trees at the back of my garden and i was finally home and near the camera when one turned up today.
</p>


 <div id="org4fec0e4" class="figure">
 <p> <img src="../images/wild_parakeet.jpg" alt="wild_parakeet.jpg"></img></p>
</div>
</div>]]></content>
  <link href="https://leehalls.net/posts/parakeets.html"/>
  <id>https://leehalls.net/posts/parakeets.html</id>
  <updated>2021-09-03T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Orgmode insert image</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Orgmode insert image</h1>
 <p>
My workflow relies on orgmode, currently ( <i>may change</i>  <sup> <a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>) all orgfiles for each project reside in a top level folder and then i create a subfolder for each project into which all data is stored (emails\images\project files etc) and the org file links to these eg;
</p>

 <blockquote>
 <p>
~ top level folder
</p>
 <ul class="org-ul"> <li>project 1 orgfile</li>
 <li>project 2 orgfile</li>
 <li>project <sub>1</sub> <sub>data</sub> <ul class="org-ul"> <li>email <sub>1</sub> <sub>for</sub> <sub>project</sub> <sub>1</sub></li>
 <li>image <sub>for</sub> <sub>project</sub> <sub>1</sub></li>
</ul></li>
 <li>project <sub>2</sub> <sub>data</sub> <ul class="org-ul"> <li>email <sub>1</sub> <sub>for</sub> <sub>project</sub> <sub>2</sub></li>
 <li>image <sub>for</sub> <sub>project</sub> <sub>2</sub></li>
</ul></li>
</ul></blockquote>

 <p>
When it comes to image capture i either launch greenshot and save everything to a temporary capture folder or launch the windows snipping tool &amp; then choose where to save the image the issue with this workflow is that its not smooth. After i have captured the image there is another or several steps to insert the image into the main org file and hence become usuable.
</p>

 <p>
Being avid consumer of knowledge i'm constantly searching ways to improve myself and the things i do and have recently been investigating  <a href="https://www.orgroam.com/">orgroam</a> and so stumbled across nobiot's github blog on emacs in Windows 10  <b> <a href="https://github.com/nobiot/Zero-to-Emacs-and-Org-roam">Zero to Emacs and Org-roam</a></b> aimed at Windows users. In there he has code to launch the snipping tool and insert a link into the org folder although he has it looking specifically for an  <code>images</code> folder. The first lot of code worked out of the box but i could not get the folder chooser section at the end of his  <a href="https://github.com/nobiot/Zero-to-Emacs-and-Org-roam/blob/main/115.How-to-enable-insert-image-from-clipboard.md">blog page</a> to work. Probably just me being dumb ¯\ <sub>(ツ)</sub>_/¯ but no matter what i tried it just wouldn't gel so i attempted to fudge my own version and ended up with the following;
</p>

 <div class="org-src-container">
 <pre class="src src-emacs-lisp"> <code>( <span class="org-keyword">defun</span>  <span class="org-function-name">my/take-screenshot</span> ()
   <span class="org-doc">&quot;Take a screenshot into a time stamped unique-named file in the
 directory of your choice, in my case I use helm to traverse &amp; select then insert a link to this file.&quot;</span>
  ( <span class="org-keyword">interactive</span>)
  ( <span class="org-keyword">let*</span> ((dirname (file-relative-name
               (read-directory-name   <span class="org-string">&quot;Choose the image directory: &quot;</span>))))
       ( <span class="org-keyword">setq</span> filename (concat dirname
                      (format-time-string  <span class="org-string">&quot;%Y%m%d%H%M&quot;</span>)  <span class="org-string">&quot;.png&quot;</span>)))
        <span class="org-comment-delimiter">;; </span> <span class="org-comment">(setq filename (concat default-directory
</span>        <span class="org-comment-delimiter">;;                </span> <span class="org-comment">(format-time-string &quot;%Y%m%d%H%M&quot;) &quot;.png&quot;))
</span>      (shell-command  <span class="org-string">&quot;snippingtool /clip&quot;</span>)
      (shell-command (concat  <span class="org-string">&quot;powershell -command \&quot;Add-Type -AssemblyName System.Windows.Forms;if ($([System.Windows.Forms.Clipboard]::ContainsImage())) {$image = [System.Windows.Forms.Clipboard]::GetImage();[System.Drawing.Bitmap]$image.Save('&quot;</span> filename  <span class="org-string">&quot;',[System.Drawing.Imaging.ImageFormat]::Png); Write-Output 'clipboard content saved as file'} else {Write-Output 'clipboard does not contain image data'}\&quot;&quot;</span>))
      (insert (concat  <span class="org-string">&quot;[[file:&quot;</span> filename <span class="org-string">&quot;]]&quot;</span>))
  )
</code></pre>
</div>

 <p>
So far it seems to work well though i've yet to put it too intensive use. Feel free to try it, i cant take any credit for it as the idea and code mostly came from nobiot. 
</p>
 <div id="footnotes">
 <h2 class="footnotes">Footnotes: </h2>
 <div id="text-footnotes">

 <div class="footdef"> <sup> <a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
instead of having the org file residing in the top level directory i may simply create the project folder as normal and store the org file within it along with all notes\emails\images etc  
</p></div></div>


</div>
</div></div>]]></content>
  <link href="https://leehalls.net/posts/win10_snip.html"/>
  <id>https://leehalls.net/posts/win10_snip.html</id>
  <updated>2021-07-25T00:00:00+01:00</updated>
</entry>
<entry>
  <title>More garden photography</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">More garden photography</h1>
 <p>
Everyday a family of starlings raucously visit the garden, searching for the meal worms i leave and taking baths. They often take upto five baths a day!! Fortunately one of the young ones decided to take a break and pose rather handsomely for a wee photo shoot.
</p>


 <div id="org1f132dc" class="figure">
 <p> <img src="../images/starling_1.jpg" alt="starling_1.jpg"></img></p>
</div>


 <div id="org787a5c0" class="figure">
 <p> <img src="../images/starling_2.jpg" alt="starling_2.jpg"></img></p>
</div>
</div>]]></content>
  <link href="https://leehalls.net/posts/more_gardenphoto.html"/>
  <id>https://leehalls.net/posts/more_gardenphoto.html</id>
  <updated>2021-05-16T00:00:00+01:00</updated>
</entry>
<entry>
  <title>VL53L1X &amp; a Raspberry Pico</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">VL53L1X &amp; a Raspberry Pico</h1>
 <div class="note" id="org6f0b12b">
 <p>
 <span class="timestamp-wrapper"> <span class="timestamp">[2021-09-03 Fri]</span></span> update: as you'll see here ( <a href="https://www.reddit.com/r/raspberry_pi/comments/pf5zej/having_problems_with_a_vl53l1x_with_micropython/">reddit link</a>) someone has ported the CircuitPython driver to MicroPython for some reason I never found it when I started this but his github driver can be found here:  <a href="https://github.com/truckershitch/micropython-vl53l0x">https://github.com/truckershitch/micropython-vl53l0x</a>
</p>

</div>

 <p>
I've had an idea for checking the height of a equipment during its movement for some time now and thought the small form factor of the pico + the VL53L1X sensor would be an ideal candidate. So after much searching and trial/error it seemed it wasnt possible until i stumbled across a few threads in the micro-python forum and the openmv github site and i now have a working setup;
</p>

 <p>
The sensor is wired as follows;
</p>
 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-left"></col> <col class="org-left"></col> <col class="org-left"></col></colgroup> <tbody> <tr> <td class="org-left"> </td>
 <td class="org-left">GP num</td>
 <td class="org-left">pin num</td>
</tr> <tr> <td class="org-left">SDA</td>
 <td class="org-left">GP4</td>
 <td class="org-left">pin 6</td>
</tr> <tr> <td class="org-left">SCL</td>
 <td class="org-left">GP5</td>
 <td class="org-left">pin 7</td>
</tr> <tr> <td class="org-left">GND</td>
 <td class="org-left">GND</td>
 <td class="org-left">pin 8</td>
</tr> <tr> <td class="org-left">+ve</td>
 <td class="org-left">3v3out</td>
 <td class="org-left">pin 36</td>
</tr></tbody></table> <div id="org8bcfb41" class="figure">
 <p> <img src="../images/vl53l1x_2.jpg" alt="vl53l1x_2.jpg"></img></p>
</div>

 <p>
In order to get it working you'll need to copy the  <code>vl53l1x.py</code> file from;
</p>
 <ul class="org-ul"> <li> <a href="https://github.com/openmv/openmv/blob/master/scripts/libraries/vl53l1x.py">https://github.com/openmv/openmv/blob/master/scripts/libraries/vl53l1x.py</a></li>
</ul> <p>
then edit it and replace
</p>

 <ul class="org-ul"> <li>search &amp; replace all  <code>pyb</code> with  <code>machine</code></li>
 <li>search &amp; replace all  <code>delay</code> with  <code>lightsleep</code></li>
</ul> <p>
Or you can download the version from my github page  <a href="https://github.com/drakxtwo/vl53l1x_pico/tree/main">https://github.com/drakxtwo/vl53l1x_pico/tree/main</a>
</p>

 <p>
You can test to see if  a device is found by;
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">from</span> machine  <span class="org-keyword">import</span> I2C
 <span class="org-keyword">from</span> vl53l1x  <span class="org-keyword">import</span> VL53L1X
 <span class="org-keyword">import</span> time

 <span class="org-variable-name">sda</span> <span class="org-operator">=</span>machine.Pin(4)
 <span class="org-variable-name">scl</span> <span class="org-operator">=</span>machine.Pin(5)
 <span class="org-variable-name">i2c</span> <span class="org-operator">=</span>machine.I2C(0,sda <span class="org-operator">=</span>sda,scl <span class="org-operator">=</span>scl,freq <span class="org-operator">=</span>400000)
 <span class="org-builtin">print</span>( <span class="org-string">'scanning bus..'</span>)
 <span class="org-variable-name">devices</span>  <span class="org-operator">=</span> i2c.scan()
 <span class="org-keyword">if</span>  <span class="org-builtin">len</span>(devices)  <span class="org-operator">==</span> 0:
   <span class="org-builtin">print</span>( <span class="org-string">&quot;No i2c device !&quot;</span>)
 <span class="org-keyword">else</span>:
   <span class="org-builtin">print</span>( <span class="org-string">'i2c devices found:'</span>, <span class="org-builtin">len</span>(devices))

 <span class="org-keyword">for</span> device  <span class="org-keyword">in</span> devices:  
     <span class="org-builtin">print</span>( <span class="org-string">&quot;Decimal address: &quot;</span>,device, <span class="org-string">&quot; | Hexa address: &quot;</span>, <span class="org-builtin">hex</span>(device))
</code></pre>
</div>

 <p>
Assuming we can found a sensor then the code to read from it is;
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">from</span> machine  <span class="org-keyword">import</span> I2C
 <span class="org-keyword">from</span> vl53l1x  <span class="org-keyword">import</span> VL53L1X
 <span class="org-keyword">import</span> time

 <span class="org-variable-name">i2c</span>  <span class="org-operator">=</span> I2C(0)
 <span class="org-variable-name">distance</span>  <span class="org-operator">=</span> VL53L1X(i2c)

 <span class="org-keyword">while</span>  <span class="org-constant">True</span>:
     <span class="org-builtin">print</span>( <span class="org-string">&quot;range: mm &quot;</span>, distance.read())
    time.sleep_ms(50)
</code></pre>
</div>

 <p>
with output as follows;
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code>MicroPython v1.14 on 2021 <span class="org-operator">-</span>02 <span class="org-operator">-</span>05; Raspberry Pi Pico  <span class="org-keyword">with</span> RP2040
Type  <span class="org-string">&quot;help()&quot;</span>  <span class="org-keyword">for</span> more information.
 <span class="org-operator">&gt;&gt;&gt;</span>  <span class="org-operator">%</span>Run  <span class="org-operator">-</span>c $EDITOR_CONTENT
 <span class="org-builtin">range</span>: mm  174
 <span class="org-builtin">range</span>: mm  174
 <span class="org-builtin">range</span>: mm  172
 <span class="org-builtin">range</span>: mm  172
 <span class="org-builtin">range</span>: mm  172
 <span class="org-builtin">range</span>: mm  172
</code></pre>
</div>

 <p>
Thats as far as i have got, the original pimoroni library allowed for multiplexing the sensors, changing range etc i dont know if thats possible, i'm pleased i got this far!
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/vl53lx_pico.html"/>
  <id>https://leehalls.net/posts/vl53lx_pico.html</id>
  <updated>2021-04-04T00:00:00+01:00</updated>
</entry>
<entry>
  <title>GPG emacs on Windows 10</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">GPG emacs on Windows 10</h1>
 <p>
I've been using GPG without any dotemacs configuration &amp; without issue or concern on Win10 machines for a long time but recently I started to recieve &quot;no usable configuration errors&quot; now I know its not because I've made changes to the dotemacs file, altered key etc but on checking log files I have updated to version 3.1.15 of Gpg4win as well as switched emacs to 28.0.50 from 27.1 but that change hasnt created the issue (switch back and it still fails) so it looks like the Gpg4win upgrade has altered something on two separate systems with identical results. To get it working again i've had to modify the dotemacs in a similar fashion to how i run emacs on a locked machine which software installs are not allowed and that is by specifying directly the home and program directories;
</p>

 <div class="org-src-container">
 <pre class="src src-emacs-lisp"> <code> <span class="org-comment-delimiter">;</span> <span class="org-comment">(customize-set-variable epg-debug t)
</span>(customize-set-variable 'epg-gpg-home-directory  <span class="org-string">&quot;C:/Users/lhall/AppData/Roaming/gnupg/&quot;</span>)
(customize-set-variable 'epg-gpg-program  <span class="org-string">&quot;D:/Software/GnuPG/bin/gpg.exe&quot;</span>)
(customize-set-variable 'epg-gpgconf-program  <span class="org-string">&quot;D:/Software/GnuPG/bin/gpgconf&quot;</span>)
(customize-set-variable 'epg-gpgsm-program  <span class="org-string">&quot;D:/Software/GnuPG/bin/gpgsm&quot;</span>)
</code></pre>
</div>

 <p>
Once the above is done I can now once again en/de-crpyt my data. However i did notice two things;
</p>

 <p>
 <b>First</b>: making a change to my dotemacs file under 28.0.50 means it fails to compile when re-opening emacs  <b>unless</b> i start 27.1 first and then the snapshot emacs runs fine afterwards and on one machine that running ox-hugo export fails with  <code>Error: (file-missing &quot;Searching for program&quot; &quot;No such file or directory&quot; &quot;git&quot;)</code> ¯\(° <sub>o</sub>)/¯ I had been considering a switch at home to WSL which seems to work well which allows the use of mu4e maybe this is the push needed? but as orgmode itself is such a fantastic tool for project &amp; information management that it is  <i>emacs</i> for me - it is often the sole purpose of running emacs perhaps some none unix focus would grow its audience?
</p>

 <p>
 <b>Secondly</b>: whilst googling the problem i came across several sites complaining that pgp  <a href="https://latacora.micro.blog/2019/07/16/the-pgp-problem.html">should be shot</a> and from that there is a new apparently easier, less problematic modern alternative to GPG called  <a href="https://github.com/FiloSottile/age">age</a> that in its own words features small explicit keys, no config options, and UNIX-style composability. It is written in GO and on trying it out seems very quick &amp; simple. Now all thats needed is an emacs interface. Example from age site
</p>

 <div class="org-src-container">
 <pre class="src src-bash"> <code>$ age-keygen -o key.txt
Public key: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p
$ tar cvz ~/data | age -r age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p &gt; data.tar.gz.age
$ age --decrypt -i key.txt data.tar.gz.age &gt; data.tar.gz
</code></pre>
</div>

 <p>
 <a href="https://github.com/FiloSottile/age">https://github.com/FiloSottile/age</a>
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/gpg_emacsconfig.html"/>
  <id>https://leehalls.net/posts/gpg_emacsconfig.html</id>
  <updated>2021-03-13T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Mouse photography</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Mouse photography</h1>
 <p>
Still trying to learn the new lense and manual focus (nearly always used autofocus) so with a turn in the weather it was nice to sit outside and watch/listen. Thats when i noticed the resident mouse decide to sit on his doorstep and watch me.
</p>


 <div id="org3dc4571" class="figure">
 <p> <img src="../images/mouse_01.png" alt="mouse_01.png"></img></p>
</div>


 <div id="orgcf8ed5d" class="figure">
 <p> <img src="../images/mouse_02.png" alt="mouse_02.png"></img></p>
</div>

 <p>
I'm quite pleased with these two photos, handheld at full zoom and manual focus.
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/garden_mouse.html"/>
  <id>https://leehalls.net/posts/garden_mouse.html</id>
  <updated>2021-02-27T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Querying the SQL DB</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Querying the SQL DB</h1>
 <p>
This is taken from a previous website post but the problem still remains, my home monitoring system has 4 zone with a wireless temperature sensor in each. They all wake up individually on a periodic basis and each time one sensor outputs data the main program writes an entry into the SQL database for all zones so only the sensor currently transmitting has new data and the previous readings from the other sensors are stored with the new.
</p>

 <p>
What this means is that for given time period i can have a different number of readings for each zone or put another way  <i>my data export is not uniform meaning comparison of time periods is not simple</i>
</p>

 <p>
For example the following SQL select statement 
</p>
 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">for</span> row  <span class="org-keyword">in</span> curs.execute( <span class="org-string">&quot;SELECT * FROM home_mon WHERE DATE&gt;(?) and DATE&lt;(?)&quot;</span>, ( <span class="org-string">'2018-12-01'</span>,  <span class="org-string">'2018-12-25'</span>)):
</code></pre>
</div>

 <p>
counts 6547 rows for December 2018 whilst the same for 2019 only counts 6516 this discrepancy is larger for some other months. So to compare periods i wrote the following to get one value per hour
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">for</span> row  <span class="org-keyword">in</span> curs.execute( <span class="org-string">&quot;SELECT * FROM home_mon WHERE DATE&gt;(?)&quot;</span>, (yr18,)):
     <span class="org-variable-name">dat</span>  <span class="org-operator">=</span> dt.datetime.fromtimestamp( <span class="org-builtin">int</span>( <span class="org-builtin">float</span>(row[1]))).strftime( <span class="org-string">'%Y-%m-%d %H:%M:%S'</span>)
     <span class="org-variable-name">hr</span>  <span class="org-operator">=</span>  dt.datetime.fromtimestamp( <span class="org-builtin">int</span>( <span class="org-builtin">float</span>(row[1]))).strftime( <span class="org-string">'%H:'</span>)
     <span class="org-keyword">if</span> dat  <span class="org-operator">&gt;</span>  <span class="org-string">&quot;2018-12-01&quot;</span>  <span class="org-keyword">and</span> dat  <span class="org-operator">&lt;</span>  <span class="org-string">&quot;2018-12-25&quot;</span>:
         <span class="org-keyword">if</span> hr  <span class="org-operator">!=</span> pasthr18:
             <span class="org-variable-name">pasthr18</span>  <span class="org-operator">=</span> hr
            data_18.append(row[4])
     <span class="org-keyword">if</span> dat  <span class="org-operator">&gt;</span>  <span class="org-string">&quot;2019-12-01&quot;</span>  <span class="org-keyword">and</span> dat  <span class="org-operator">&lt;</span>  <span class="org-string">&quot;2019-12-25&quot;</span>:
         <span class="org-keyword">if</span> hr  <span class="org-operator">!=</span> pasthr19:
             <span class="org-variable-name">pasthr19</span>  <span class="org-operator">=</span> hr
            data_19.append(row[4])

     <span class="org-variable-name">cnt</span>  <span class="org-operator">=</span> cnt  <span class="org-operator">+</span> 1
    x.append(cnt)
</code></pre>
</div>

 <p>
The result of this is for the periods  <b>01-12</b> &gt;  <b>25-12</b> in both years I get 576 values for both meaning a real comparison can now be done.
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/sqlquery1.html"/>
  <id>https://leehalls.net/posts/sqlquery1.html</id>
  <updated>2021-02-20T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Panda &amp; SQL pain</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Panda &amp; SQL pain</h1>
 <p>
I've left the home monitoring system alone for a few years, its just sat quietly in the garage collating data into an SQL database, the only changes made recently were to move everything onto a Pi4 and add an additional camera into the motioneye system running on the same Pi. So as its a slow day i decided now was the time to update it or rather start work on it. One thing i wanted to do was re-instigate the live readings and an auto graph element and for this i needed to extract data - simple i got my old code somewhere …. somewhere … maybe.
</p>

 <p>
After a bit of searching and playing around i decided to re-write;
</p>

 <p>
Though I spent far longer testing this than i should have. The code when run will sometimes report correctly a full dataframe and yet next time with exactly the same code (no changes) it reports an empty one.  <i>Run it &gt; empty &gt; run it &gt; empty &gt; run it &gt; data</i>
</p>


 <div id="orge58358f" class="figure">
 <p> <img src="../images/db_query_fail.PNG" alt="db_query_fail.PNG"></img></p>
</div>

 <p>
Not sure why -  <i>yet</i>.
</p>

 <p>
Anyway ignoring why it sometimes works and then others dont for now the code is very simple and it outputs an interactive visualisation like;
</p>

 <p>
 <img src="../images/sql_graph_1.png" alt="sql_graph_1.png"></img>
You can find the interactive version  <a href="file:///data/data_out.html">here:</a>
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">import</span> sqlite3
 <span class="org-keyword">import</span> pandas  <span class="org-keyword">as</span> pd
 <span class="org-keyword">import</span> pandas_bokeh
 <span class="org-keyword">from</span> sqlalchemy  <span class="org-keyword">import</span> create_engine 
 <span class="org-keyword">import</span> datetime  <span class="org-keyword">as</span> dt
 <span class="org-variable-name">file</span>  <span class="org-operator">=</span>  <span class="org-string">&quot;home_mon_db.sqlite&quot;</span>
pandas_bokeh.output_file( <span class="org-string">'data_out.html'</span>)

 <span class="org-comment-delimiter">#</span> <span class="org-comment">define time window
</span> <span class="org-variable-name">timenow</span>  <span class="org-operator">=</span> dt.datetime.now()
 <span class="org-comment-delimiter"># </span> <span class="org-comment">testing values
</span> <span class="org-variable-name">now_date</span>  <span class="org-operator">=</span>  <span class="org-string">'2021-02-11'</span>
 <span class="org-comment-delimiter">#</span> <span class="org-comment">prev_time = '06:00:00'
</span> <span class="org-comment-delimiter">#</span> <span class="org-comment">now_time = '08:00:00'
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">programatic values
</span> <span class="org-comment-delimiter">#</span> <span class="org-comment">now_date = timenow.strftime('%Y-%m-%d')
</span> <span class="org-variable-name">prev_time</span>  <span class="org-operator">=</span>  <span class="org-builtin">str</span>((dt.datetime.now()  <span class="org-operator">-</span> dt.timedelta(hours <span class="org-operator">=</span>8,minutes <span class="org-operator">=</span>0)).strftime( <span class="org-string">'%H:%M:%S'</span>))  <span class="org-comment-delimiter"># </span> <span class="org-comment">defines a window to get data from
</span> <span class="org-variable-name">now_time</span>  <span class="org-operator">=</span>  <span class="org-builtin">str</span>(timenow.strftime( <span class="org-string">'%H:%M:%S'</span>))

 <span class="org-builtin">print</span>( <span class="org-string">'DATE:'</span>,now_date, <span class="org-string">'PREVTIME:'</span>,prev_time, <span class="org-string">'NOWTIME'</span>,now_time)

 <span class="org-keyword">try</span>:
         <span class="org-variable-name">cnx</span>  <span class="org-operator">=</span> sqlite3.connect( <span class="org-string">'home_mon_db.sqlite'</span>)
         <span class="org-variable-name">df</span>  <span class="org-operator">=</span> pd.read_sql( <span class="org-string">&quot;SELECT * FROM home_mon WHERE DATE = ? AND time BETWEEN ? AND ?&quot;</span>, cnx, params <span class="org-operator">=</span>{now_date, prev_time, now_time})
 <span class="org-keyword">except</span>  <span class="org-type">ValueError</span>  <span class="org-keyword">as</span> e:
         <span class="org-builtin">print</span>( <span class="org-string">'failed'</span>, e)

 <span class="org-keyword">if</span> df.empty  <span class="org-operator">==</span>  <span class="org-constant">True</span>:
         <span class="org-builtin">print</span>( <span class="org-string">'DataFrame is empty!'</span>)
 <span class="org-keyword">else</span>:
         <span class="org-builtin">print</span>(df)
         <span class="org-variable-name">sel</span>  <span class="org-operator">=</span>df[[ <span class="org-string">'TIME'</span>, <span class="org-string">'EXTERNAL'</span>]]
         <span class="org-comment-delimiter"># </span> <span class="org-comment">sel.plot_bokeh(rangetool=True)  # this i like
</span>        sel.plot_bokeh(
                kind <span class="org-operator">=</span> <span class="org-string">'line'</span>,
                x <span class="org-operator">=</span> <span class="org-string">'TIME'</span>,
                xlabel <span class="org-operator">=</span> <span class="org-string">'TIME'</span>,
                ylabel <span class="org-operator">=</span> <span class="org-string">'Degrees C'</span>,
                title <span class="org-operator">=</span> <span class="org-string">'Sensor inside garage'</span>
        )

 <span class="org-builtin">print</span>( <span class="org-string">'finished'</span>)
cnx.close()
</code></pre>
</div>
</div>]]></content>
  <link href="https://leehalls.net/posts/pdsql_1.html"/>
  <id>https://leehalls.net/posts/pdsql_1.html</id>
  <updated>2021-02-14T00:00:00+00:00</updated>
</entry>
<entry>
  <title>More garden visitors</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">More garden visitors</h1>
 <p>
OK hands up .. these were taken whilst sat inside nice and warm through the window! so not brilliant plus a little poor editing still not bad though
</p>


 <div id="org9bcdf0d" class="figure">
 <p> <img src="../images/mouse1.jpg" alt="mouse1.jpg"></img></p>
</div>


 <div id="orgb49c2af" class="figure">
 <p> <img src="../images/squirrel_colour2.jpg" alt="squirrel_colour2.jpg"></img></p>
</div>
</div>]]></content>
  <link href="https://leehalls.net/posts/upclose_visitors.html"/>
  <id>https://leehalls.net/posts/upclose_visitors.html</id>
  <updated>2021-02-07T00:00:00+00:00</updated>
</entry>
<entry>
  <title>New lense</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">New lense</h1>
 <p>
So a little splurge and finally got a lense that means i dont have to be within 3m of the thing i'm trying to catch an image of! Still lots to learn but first handheld efforts dont seem to bad.
</p>


 <div id="org7d3a466" class="figure">
 <p> <img src="../images/squirrel_bandw.jpg" alt="squirrel_bandw.jpg"></img></p>
</div>


 <div id="org0532edb" class="figure">
 <p> <img src="../images/pigeon.jpg" alt="pigeon.jpg"></img></p>
</div>
</div>]]></content>
  <link href="https://leehalls.net/posts/new_lense.html"/>
  <id>https://leehalls.net/posts/new_lense.html</id>
  <updated>2021-02-06T00:00:00+00:00</updated>
</entry>
<entry>
  <title>emacs on Windows</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">emacs on Windows</h1>
 <p>
Working mostly in the MS Windows environment i keep notes, project records in org and these files have multiple links to documents, images, saved mails etc and most are stored with hyperlinks ( <i>though i may now be migrating to attachments</i>) but when it comes to opening the links then it takes a little extra work. When using helm and initiating links by  <code>C-c C-l</code> and choosing  <code>file</code> this allows me to select files from a list and use completion support to narrow down the list of files. However the  <code>file+sys</code> option does not, so i always chose  <code>file</code>, used helm to help find it, insert the link and then edit it to add the +sys part.
</p>

 <p>
Well not anymore, i stumbled upon the following code;
</p>

 <p>
 <a href="https://stackoverflow.com/questions/11553123/linking-to-files-on-windows-network-share">https://stackoverflow.com/questions/11553123/linking-to-files-on-windows-network-share</a>
</p>

 <div class="org-src-container">
 <pre class="src src-emacs-lisp"> <code>(mapc ( <span class="org-keyword">lambda</span> (file-name-matcher)
    (add-to-list 'org-file-apps
                 (cons file-name-matcher 'default) 'append))
  (list  <span class="org-string">&quot;\\.doc\\'&quot;</span>
         <span class="org-string">&quot;\\.xls\\'&quot;</span>
         <span class="org-string">&quot;\\.ppt\\'&quot;</span>))
</code></pre>
</div>

 <p>
adding this to my dotemacs file means files open without the need for the  <code>file+sys</code> making my life much easier, my modified version adds more file formats
</p>


 <div class="org-src-container">
 <pre class="src src-emacs-lisp"> <code>(mapc ( <span class="org-keyword">lambda</span> (file-name-matcher)
    (add-to-list 'org-file-apps
                 (cons file-name-matcher 'default) 'append))
  (list  <span class="org-string">&quot;\\.doc\\'&quot;</span>
         <span class="org-string">&quot;\\.docx\\'&quot;</span>
         <span class="org-string">&quot;\\.xls\\'&quot;</span>
         <span class="org-string">&quot;\\.xlsx\\'&quot;</span>
         <span class="org-string">&quot;\\.ppt\\'&quot;</span>
         <span class="org-string">&quot;\\.pptx\\'&quot;</span>
         <span class="org-string">&quot;\\.msg\\'&quot;</span>))
</code></pre>
</div>

 <p>
Now i can work with attachments because i've also found out how to add per file folder setting for attachments so by this i mean each org file i have is saved with its project name ie
</p>

 <ul class="org-ul"> <li>project <sub>a</sub></li>
 <li>project <sub>b</sub></li>
</ul> <p>
before i'd create a directory and then manually copy in my files for linking to, now with this at the end of my org files under the heading local variables;
</p>

 <div class="org-src-container">
 <pre class="src src-org"> <code> <span class="org-comment"># Local Variables:</span>
 <span class="org-comment"># org-attach-direction: &quot;project_a/&quot;</span>
 <span class="org-comment"># end:</span>
</code></pre>
</div>

 <p>
if i add an attachment the folder if it does not exist is created and the file is stored within it.
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/emacs_openfiles.html"/>
  <id>https://leehalls.net/posts/emacs_openfiles.html</id>
  <updated>2020-12-05T00:00:00+00:00</updated>
</entry>
<entry>
  <title>COVID North vs South</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">COVID North vs South</h1>
 <p>
Its interesting to me that society or rather the portrayal of modern English society is one where the class system of the Oliver Twist era and before no longer exists or has been eroded to almost non-existence.  <b>Bollocks.</b> The number of poorer people going to the alleged &quot; <i>elite</i>&quot; universtities is minimal but I agree that the internet has muddied the water, allowed those with talents to broadcast themselves to a wide audience and earn in some cases significant money but they are still a rarity and have they crossed the divide or simply created another class?
</p>

 <p>
But perhaps if you were cynical an example of class and the truly English North vs South divide you only have to look at the latest COVID19 map to get us out of lockdown from December the 2nd.
</p>

 <div id="org10cbf5a" class="figure">
 <p> <img src="../images/covid_north_south.PNG" alt="covid_north_south.PNG"></img></p>
 <p> <span class="figure-number">Figure 1: </span> <a href="https://www.independent.co.uk/life-style/which-tier-postcode-area-lockdown-covid-b1762224.html">https://www.independent.co.uk/life-style/which-tier-postcode-area-lockdown-covid-b1762224.html</a></p>
</div>

 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-left"></col> <col class="org-left"></col> <col class="org-left"></col></colgroup> <tbody> <tr> <td class="org-left"> <img src="../images/tier1.jpg" alt="tier1.jpg"></img></td>
 <td class="org-left"> <img src="../images/tier2.jpg" alt="tier2.jpg"></img></td>
 <td class="org-left"> <img src="../images/tier3.jpg" alt="tier3.jpg"></img></td>
</tr></tbody></table> <p>
OK its not totally and clearly delineated on the historic North v South divide I mean who classes Stratford Upon Avon as the Midlands or Warrington as historically upper class? (they're in Tier 3) but just about everything on initial glances would appear that the old moniker of working class Midlands and North has been left in lockdown only the wording has changed. One suspects again with a rather cynical eye that this proposed Christmas holiday for lockdown was never real but why not man up and just state the science does not allow for Xmas, the virus does not respect borders, time of year etc I guess because that takes balls and its much easier as a politician to pretend you're doing something when really you are not. 
</p>

 <p>
Instead we now have a map which on face value allows the southern half ( <i>most of it</i>) to have slightly more openness. Still on the bright side … our political elite are rather an aging bunch and one could hope that a clean sweep of the Houses of Parliament etc would allow for some refreshing younger new ideas without the need for a return of Guy Fawkes. Besides it could be worse, pity the poor Welsh where restaurants, pubs must close at 1800 and cannot sell alcohol at anytime even with food. ¯\ <sub>(ツ)</sub>_/¯ 
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/covid_northsouthdivide.html"/>
  <id>https://leehalls.net/posts/covid_northsouthdivide.html</id>
  <updated>2020-11-26T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Lights out</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Lights out</h1>
 <p>
In light ( <i>no pun intended</i>) of the last post it was quite suprising to see more stories on the subject of light pollution filter into my news-stream, from the effect on  <a href="https://www.newscientist.com/article/2258765-light-pollution-is-changing-the-way-cougars-hunt-deer-in-western-us/">cougars hunting in the western US</a> to  <a href="https://www.theguardian.com/environment/2020/nov/02/treat-artificial-light-form-pollution-environment">reduced pollination, affected sleep cycles and more</a>. Although the  <a href="https://www.darksky.org/">dark sky</a> movement has been going for a long time and reading through its site you can find out about the effects of light pollution on animals and humans, energy waste and more I guess we need people to stop being afraid of the dark but it would seem there could be a push to make artificial light a form of environmental pollution the same as other forms that we naturally consider to be pollution. For me this can only be a good thing, as i mentioned in my earlier post the benefits of simply turning the lights off could be immense.
</p>

 <p>
A really good way of visualising how much light there really is in the world at night you can visit   <a href="https://www.lightpollutionmap.info/">https://www.lightpollutionmap.info/</a> and generate a map like;
</p>


 <div id="org84a6625" class="figure">
 <p> <img src="../images/light_pollution_1.png" alt="light_pollution_1.png"></img></p>
 <p> <span class="figure-number">Figure 1: </span>Light pollution across the UK</p>
</div>

 <p>
But another interesting site i found is  <a href="https://www.underluckystars.com/if-light-pollution-cleared">https://www.underluckystars.com/if-light-pollution-cleared</a> just look at how the cities could be if we eliminated light pollution;
</p>

 <p>
 <img src="../images/london_nopollution.png" alt="london_nopollution.png"></img>
I love the dark, as i said there isnt enough of it and i really hope light pollution becomes a classified form of pollution worthy of action/sanctions.
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/lightpollution.html"/>
  <id>https://leehalls.net/posts/lightpollution.html</id>
  <updated>2020-11-04T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Darkness</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Darkness</h1>
 <p>
I've often been heard muttering the phrase &quot; <i>there's not enough darkness in the world</i>&quot; most who hear it tend to assume i'm talking about we need more death,pestilence, war, famine etc all the &quot;bad&quot; things rather ironic given the COVID situation but i actually mean  <b>its too bright</b>. For a man that loves the sunshine i also embrace the night and i prefer working in the dark or reduced light environment not nightshifts though i've done my fair share of those, in the office i'd often be first one in and the lights would remain off until the second person arrived, at home i never turn on the main lights unless there is a need &amp; by this i mean looking for a needle or a genuine situation where light bright enough to blind for a few moments should one care to look directly at it, is required. 
</p>

 <p>
Besides i like the romance of candles or low lighting.
</p>

 <p>
But in general there are too many lights, the night sky is no longer lit by stars, the moon loses its majesty and nature pays a price.
</p>

 <p>
There is also the consumption of energy, in these days of global warming, the desire to cut energy usage we still light the night sky like we're afraid of the dark. One rather large gripe i have is that most roads and motorways are lit permanently at night why? i've got headlights? i can drive safely in the dark I'm not afraid of it and i'm quite capable of moderating my speed to suit the conditions. Should there be an accident give the emergency services an override then anyone approaching the lights knows its a good idea to slow down, put them at interchanges/exits but not every 200m or switch every alternate one off. Just think of the power we'd save.
</p>

 <p>
So given the above viewpoint it was quite a surprise to see an article pop up on my news feed about Germany with the headline:  <a href="https://phys.org/news/2020-08-germany-dim-night-insects.html">Germany plans to dim lights at night to save insects</a> ok its only a draft law but imagine if it became reality, if every country did the same. The power savings alone could be impressive but if it did have a positive affect on the insect population then  <i>woop dee fucking doo dah</i> thats a win in many ways. I know people say things were different in my day and that its a perception rather than reality but in this case its true. Things were different when i was younger, there were more bees and their hated cousin the wasp  <sup> <a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>, more birds &amp; in general more nature  <sup> <a id="fnr.1.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>. Now i know it is not lighting that is solely to blame and not the biggest contributor to the decline but it is surely one of the easier things we can change  <b>without impact on us?</b>
</p>

 <p>
Shouldnt we be doing everything possible in this time? it would seem to me that even picking the easy targets such as lighting reduction would cumulatively yield benefits all around and what i dont understand is why such things are seemingly not on the table, its ok to push for the big things (removal of coal power, reduction in old automotive technology BTW  <i>i dont think the push for electric is the way forward but thats a different topic</i>) but these things are not instant wins, they take years if not decades to achieve but in the meantime we could be doing more with simple, easy to change and positive steps.
</p>

 <p>
Fair play to Germany for trying and here's hoping the law becomes reality and its effect is proven.
</p>
 <div id="footnotes">
 <h2 class="footnotes">Footnotes: </h2>
 <div id="text-footnotes">

 <div class="footdef"> <sup> <a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
The most comprehensive assessment yet of the state of nature in the UK has found that the area occupied by more than 6500 species has shrunk by 5 per cent since 1970  <a href="https://www.newscientist.com/article/2218235-thousands-of-uk-wildlife-and-plant-species-are-in-decline/">https://www.newscientist.com/article/2218235-thousands-of-uk-wildlife-and-plant-species-are-in-decline/</a>
</p></div></div>


</div>
</div></div>]]></content>
  <link href="https://leehalls.net/posts/darkness.html"/>
  <id>https://leehalls.net/posts/darkness.html</id>
  <updated>2020-08-07T00:00:00+01:00</updated>
</entry>
<entry>
  <title>outlook events for orgmode</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">outlook events for orgmode</h1>
 <p>
If like me you spend all your working life in MS products and yet you still want to or do rely on orgmode to give you some semblance of sanity, then this might help. Its not a bidirectional synchronisation and i only wanted the appointments for today to show. It queries Outlook for any confirmed appointments in the calendar and then outputs a single orgmode file in my main org folder which is automatically added to the agenda. The following code originally taken from  <a href="https://sukhbinder.wordpress.com/2020/04/08/get-outlook-entries-with-python-3/">https://sukhbinder.wordpress.com/2020/04/08/get-outlook-entries-with-python-3/</a> then gutted and adapted for my needs queries MS Outlook for the events in the calendar. I've restricted it for one day but changing the variable  <code>num_days</code> can output more if you wanted. 
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-comment-delimiter"># </span> <span class="org-comment">taken from https://sukhbinder.wordpress.com/2020/04/08/get-outlook-entries-with-python-3/
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">modified 2020.08.07
</span>
 <span class="org-keyword">import</span> win32com.client
 <span class="org-keyword">import</span> datetime  <span class="org-keyword">as</span> dt

 <span class="org-variable-name">f</span>  <span class="org-operator">=</span>  <span class="org-builtin">open</span>( <span class="org-string">'C:/Users/lee.halls/Documents/orgfiles/today.org'</span>,  <span class="org-string">'w'</span>)

 <span class="org-keyword">def</span>  <span class="org-function-name">getEndtime</span>(start_time,org_duration):
     <span class="org-variable-name">org_duration</span>  <span class="org-operator">=</span> org_duration  <span class="org-operator">/</span> 60
     <span class="org-variable-name">the_time</span>  <span class="org-operator">=</span> dt.datetime.strptime(start_time,  <span class="org-string">'%H:%M'</span>)
     <span class="org-variable-name">new_time</span>  <span class="org-operator">=</span> the_time  <span class="org-operator">+</span> dt.timedelta(hours <span class="org-operator">=</span>org_duration)
     <span class="org-keyword">return</span> new_time.strftime( <span class="org-string">'%H:%M'</span>)

 <span class="org-variable-name">Outlook</span>  <span class="org-operator">=</span> win32com.client.Dispatch( <span class="org-string">&quot;Outlook.Application&quot;</span>)
 <span class="org-variable-name">ns</span>  <span class="org-operator">=</span> Outlook.GetNamespace( <span class="org-string">&quot;MAPI&quot;</span>)

 <span class="org-variable-name">appointments</span>  <span class="org-operator">=</span> ns.GetDefaultFolder(9).Items
appointments.Sort( <span class="org-string">&quot;[Start]&quot;</span>)
appointments. <span class="org-variable-name">IncludeRecurrences</span>  <span class="org-operator">=</span>  <span class="org-string">&quot;True&quot;</span>

 <span class="org-comment-delimiter"># </span> <span class="org-comment">define date range
</span> <span class="org-variable-name">num_days</span>  <span class="org-operator">=</span> 1
 <span class="org-variable-name">today</span>  <span class="org-operator">=</span> dt.datetime.today()
 <span class="org-variable-name">begin</span>  <span class="org-operator">=</span> today.date().strftime( <span class="org-string">&quot;%d/%m/%Y&quot;</span>)
 <span class="org-variable-name">tomorrow</span>  <span class="org-operator">=</span> dt.timedelta(num_days)  <span class="org-operator">+</span> today
 <span class="org-variable-name">end</span>  <span class="org-operator">=</span> tomorrow.date().strftime( <span class="org-string">&quot;%d/%m/%Y&quot;</span>)

 <span class="org-comment-delimiter"># </span> <span class="org-comment">restrict appointments in outlook to today
</span> <span class="org-variable-name">appointments</span>  <span class="org-operator">=</span> appointments.Restrict(
     <span class="org-string">&quot;[Start] &gt;= '&quot;</span>  <span class="org-operator">+</span> begin  <span class="org-operator">+</span>  <span class="org-string">&quot;' AND [END] &lt;= '&quot;</span>  <span class="org-operator">+</span> end  <span class="org-operator">+</span>  <span class="org-string">&quot;'&quot;</span>)

 <span class="org-comment-delimiter"># </span> <span class="org-comment">loop through appointments
</span> <span class="org-keyword">for</span> a  <span class="org-keyword">in</span> appointments:
     <span class="org-comment-delimiter">#</span> <span class="org-comment">print(a.Subject, a.Start, a.Duration)
</span>     <span class="org-variable-name">startTime</span>  <span class="org-operator">=</span> (a.Start).strftime( <span class="org-string">&quot;%H:%M&quot;</span>)
     <span class="org-variable-name">endTime</span>  <span class="org-operator">=</span> getEndtime(startTime, a.Duration)
     <span class="org-comment-delimiter"># </span> <span class="org-comment">print ('%s%s%s%s%s%s%s' % ('* ', startTime ,'-', endTime, ' ', a.Subject, '\n'))
</span>     <span class="org-comment-delimiter"># </span> <span class="org-comment">print ('%s%s%s' % ('&lt;', a.Start.strftime('%Y-%m-%d'), '&gt;'))
</span>    f.write ( <span class="org-string">'%s%s%s%s%s%s%s'</span>  <span class="org-operator">%</span> ( <span class="org-string">'* '</span>, startTime , <span class="org-string">'-'</span>, endTime,  <span class="org-string">' '</span>, a.Subject,  <span class="org-string">'</span> <span class="org-constant">\n</span> <span class="org-string">'</span>))
    f.write ( <span class="org-string">'%s%s%s%s'</span>  <span class="org-operator">%</span> ( <span class="org-string">'&lt;'</span>, a.Start.strftime( <span class="org-string">'%Y-%m-%d'</span>),  <span class="org-string">'&gt;'</span>,  <span class="org-string">'</span> <span class="org-constant">\n</span> <span class="org-string">'</span> ))


f.close()
</code></pre>
</div>

 <p>
I've set this to run via windows task scheduler every time i unlock the PC.
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/outlook_events.html"/>
  <id>https://leehalls.net/posts/outlook_events.html</id>
  <updated>2020-08-06T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Beginning email analysis for outlook</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Beginning email analysis for outlook</h1>
 <p>
 <span class="timestamp-wrapper"> <span class="timestamp">[2020-06-24 Wed 22:36]</span></span> This was originally titled &quot;Outlook email analysis&quot; but on reflection it sounded too presumptious for what is actually shown hence the addition of  &quot; <i>beginning</i>&quot; to the title.
</p>

 <p>
Its been a productive week and this morning i finally got around to trying my hand at using python to conduct some simple Outlook inbox analysis. I've wanted for a long time to have more data visualisation and so another journey begins. The following piece of code is simple and needs improvement but what it does is to connect to the outlook mailbox, and loop through all emails to provide a count of emails received against a persons name for today and it creates an org table output
</p>

 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-left"></col> <col class="org-right"></col></colgroup> <tbody> <tr> <td class="org-left">2020-06-12</td>
 <td class="org-right"> </td>
</tr> <tr> <td class="org-left">man, Bat</td>
 <td class="org-right">2</td>
</tr> <tr> <td class="org-left">Darwin, Charles</td>
 <td class="org-right">7</td>
</tr> <tr> <td class="org-left">Dent, Arthur</td>
 <td class="org-right">3</td>
</tr> <tr> <td class="org-left">Morgan, Arthur</td>
 <td class="org-right">1</td>
</tr> <tr> <td class="org-left">Pratchett, Terry</td>
 <td class="org-right">1</td>
</tr></tbody></table> <p>
The code is
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">import</span> win32com.client
 <span class="org-keyword">from</span> collections  <span class="org-keyword">import</span> defaultdict
 <span class="org-keyword">from</span> datetime  <span class="org-keyword">import</span> datetime, date
 <span class="org-keyword">import</span> datetime

 <span class="org-variable-name">f</span>  <span class="org-operator">=</span>  <span class="org-builtin">open</span>( <span class="org-string">&quot;test.org&quot;</span>,  <span class="org-string">'a'</span>)

 <span class="org-comment-delimiter"># </span> <span class="org-comment">setup connection to outlook
</span> <span class="org-variable-name">outlook</span>  <span class="org-operator">=</span> win32com.client.Dispatch( <span class="org-string">&quot;Outlook.Application&quot;</span>).GetNamespace( <span class="org-string">&quot;MAPI&quot;</span>)
 <span class="org-variable-name">inbox</span>  <span class="org-operator">=</span> outlook.GetDefaultFolder(6)

 <span class="org-comment-delimiter"># </span> <span class="org-comment">get inbox messages
</span> <span class="org-variable-name">messages</span>  <span class="org-operator">=</span> inbox.Items
 <span class="org-variable-name">message</span>  <span class="org-operator">=</span> inbox.Items.GetFirst()

 <span class="org-comment-delimiter"># </span> <span class="org-comment">define yesterday's date &amp; create dictionary
</span> <span class="org-variable-name">d</span>  <span class="org-operator">=</span> (date.today()  <span class="org-operator">-</span> datetime.timedelta (days <span class="org-operator">=</span>1)).strftime( <span class="org-string">'%Y-%m-%d'</span>)
 <span class="org-variable-name">counts</span>  <span class="org-operator">=</span> defaultdict( <span class="org-builtin">int</span>)

 <span class="org-comment-delimiter"># </span> <span class="org-comment">loop through all messages and check if yesterday &lt; received time then update dictionary
</span> <span class="org-keyword">for</span> message  <span class="org-keyword">in</span> inbox.Items:
     <span class="org-variable-name">received_time</span>  <span class="org-operator">=</span> message.ReceivedTime.strftime( <span class="org-string">'%Y-%m-%d'</span>)
     <span class="org-keyword">if</span> d  <span class="org-operator">&lt;</span> received_time:
         <span class="org-variable-name">counts</span>[message.SenderName]  <span class="org-operator">+=</span>1

f.write( <span class="org-string">'%s%s%s%s'</span>  <span class="org-operator">%</span> ( <span class="org-string">'| '</span>, date.today().strftime( <span class="org-string">'%Y-%m-%d'</span>) ,  <span class="org-string">' |'</span>,  <span class="org-string">'</span> <span class="org-constant">\n</span> <span class="org-string">'</span>))
 <span class="org-keyword">for</span> key  <span class="org-keyword">in</span> (counts):
     <span class="org-builtin">print</span>( <span class="org-string">'|'</span>, key,  <span class="org-string">'|'</span>, counts[key],  <span class="org-string">'|'</span>)
    f.write( <span class="org-string">'%s%s%s%s%s%s'</span>  <span class="org-operator">%</span> ( <span class="org-string">'|'</span>, key,  <span class="org-string">'|'</span>, counts[key],  <span class="org-string">'|'</span>,  <span class="org-string">'</span> <span class="org-constant">\n</span> <span class="org-string">'</span>))


f.close()
</code></pre>
</div>

 <p>
Next tasks are to have it count all yesterday's msgs, set the script to run first thing every morning or perhaps have it run once a week and compile stats for the week so that there is not too much data.
</p>

 <p>
 <span class="timestamp-wrapper"> <span class="timestamp">[2020-06-13 Sat 10:33]</span></span> now updated for weekly analysis and corrected the misuse of importing datetime as shown in the above example, but also started to play with the xlsxwriter module
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-comment-delimiter"># </span> <span class="org-comment">-*- coding: utf-8 -*-
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">this collects the names and how many emails i received from them for the week
</span>
 <span class="org-keyword">import</span> win32com.client
 <span class="org-keyword">from</span> collections  <span class="org-keyword">import</span> defaultdict
 <span class="org-keyword">import</span> datetime  <span class="org-keyword">as</span> dt
 <span class="org-keyword">from</span> datetime  <span class="org-keyword">import</span> datetime, date
 <span class="org-keyword">import</span> xlsxwriter

 <span class="org-variable-name">f</span>  <span class="org-operator">=</span>  <span class="org-builtin">open</span>( <span class="org-string">&quot;test.org&quot;</span>,  <span class="org-string">'w'</span>)

 <span class="org-comment-delimiter"># </span> <span class="org-comment">setup connection to outlook
</span> <span class="org-variable-name">outlook</span>  <span class="org-operator">=</span> win32com.client.Dispatch( <span class="org-string">&quot;Outlook.Application&quot;</span>).GetNamespace( <span class="org-string">&quot;MAPI&quot;</span>)
 <span class="org-variable-name">inbox</span>  <span class="org-operator">=</span> outlook.GetDefaultFolder(6)

 <span class="org-comment-delimiter"># </span> <span class="org-comment">setup xlsx file
</span> <span class="org-variable-name">workbook</span>  <span class="org-operator">=</span> xlsxwriter.Workbook( <span class="org-string">'outlook_data.xlsx'</span>)
 <span class="org-variable-name">worksheet</span>  <span class="org-operator">=</span> workbook.add_worksheet( <span class="org-string">'WK'</span> <span class="org-operator">+</span>date.today().strftime( <span class="org-string">'%V'</span>))

 <span class="org-comment-delimiter"># </span> <span class="org-comment">get inbox messages
</span> <span class="org-variable-name">messages</span>  <span class="org-operator">=</span> inbox.Items
 <span class="org-variable-name">message</span>  <span class="org-operator">=</span> inbox.Items.GetFirst()

 <span class="org-comment-delimiter"># </span> <span class="org-comment">get week number
</span> <span class="org-variable-name">counts</span>  <span class="org-operator">=</span> defaultdict( <span class="org-builtin">int</span>)
 <span class="org-variable-name">rw</span>  <span class="org-operator">=</span> 0

 <span class="org-comment-delimiter"># </span> <span class="org-comment">create header for file
</span>f.write( <span class="org-string">'%s%s%s%s%s%s'</span>  <span class="org-operator">%</span> ( <span class="org-string">'| '</span>,  <span class="org-string">'Mails received in week'</span>,  <span class="org-string">'| '</span> , date.today().strftime( <span class="org-string">'%V'</span>),  <span class="org-string">' |'</span>,  <span class="org-string">'</span> <span class="org-constant">\n</span> <span class="org-string">'</span>))

 <span class="org-comment-delimiter"># </span> <span class="org-comment">loop through all messages and check if received this week
</span> <span class="org-keyword">for</span> message  <span class="org-keyword">in</span> inbox.Items:
     <span class="org-variable-name">r</span>  <span class="org-operator">=</span> message.ReceivedTime.strftime( <span class="org-string">'%V'</span>)
     <span class="org-keyword">if</span> r  <span class="org-operator">==</span> date.today().strftime( <span class="org-string">'%V'</span>):
         <span class="org-variable-name">counts</span>[message.SenderName]  <span class="org-operator">+=</span>1

 <span class="org-keyword">for</span> key  <span class="org-keyword">in</span> (counts):
     <span class="org-builtin">print</span>( <span class="org-string">'|'</span>, key,  <span class="org-string">'|'</span>, counts[key],  <span class="org-string">'|'</span>)
    worksheet.write(rw, 0, key)
    worksheet.write(rw, 1, counts[key])
    f.write( <span class="org-string">'%s%s%s%s%s%s'</span>  <span class="org-operator">%</span> ( <span class="org-string">'|'</span>, key,  <span class="org-string">'|'</span>, counts[key],  <span class="org-string">'|'</span>,  <span class="org-string">'</span> <span class="org-constant">\n</span> <span class="org-string">'</span>))
     <span class="org-variable-name">rw</span>  <span class="org-operator">+=</span>1


f.close()
workbook.close()

</code></pre>
</div>
</div>]]></content>
  <link href="https://leehalls.net/posts/outlook_python.html"/>
  <id>https://leehalls.net/posts/outlook_python.html</id>
  <updated>2020-06-12T00:00:00+01:00</updated>
</entry>
<entry>
  <title>emacs lisp &amp; yasnippet templates</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">emacs lisp &amp; yasnippet templates</h1>
 <p>
On my home machines I keep a journal and used some fu to determine which machine the journal entry was written on. I also keep a daily log for work normally this consists of start time, mileage to be claimed so the snippet template resembles
</p>

 <pre class="example" id="org4eca623">
# -*- mode: snippet -*-
# name: daily
# key: daily
# --
** `(format-time-string &quot;%Y-%m-%d-%H:%m&quot; (current-time))`
:PROPERTIES:
:LOCATION:
:MILEAGE:
:START: `(format-time-string &quot;%H:%M&quot; (current-time))`
:FINISH:
:END: 
</pre>


 <p>
At the start of everyday when i open up the laptop emacs is always there waiting and in the log for this year i type  <code>daily</code> hit tab and voila my entry for the day commences
</p>

 <pre class="example" id="org6f4f88e">
** 2020-06-05-14:06
   :PROPERTIES:
   :LOCATION: 
   :MILEAGE:
   :START: 14:06
   :FINISH:
   :END: 
</pre>

 <p>
Location, mileage and end time are manually entered and normally i keep location as a set of abbreviations that match the mileage to claim this means using dynamic column view i can get a nice table of times/locations such as;
</p>

 <p>

</p>

 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-right"></col> <col class="org-left"></col> <col class="org-right"></col> <col class="org-right"></col> <col class="org-right"></col> <col class="org-right"></col> <col class="org-left"></col></colgroup> <thead> <tr> <th scope="col" class="org-right">ITEM</th>
 <th scope="col" class="org-left">LOCATIONS</th>
 <th scope="col" class="org-right">START</th>
 <th scope="col" class="org-right">FINISH</th>
 <th scope="col" class="org-right">MILEAGE</th>
 <th scope="col" class="org-right">EXPENSE</th>
 <th scope="col" class="org-left">TAGS</th>
</tr></thead> <tbody> <tr> <td class="org-right">July 2018</td>
 <td class="org-left"> </td>
 <td class="org-right"> </td>
 <td class="org-right"> </td>
 <td class="org-right">745</td>
 <td class="org-right">207.03</td>
 <td class="org-left"> </td>
</tr> <tr> <td class="org-right">20180705</td>
 <td class="org-left"> </td>
 <td class="org-right">05:56</td>
 <td class="org-right">15:10</td>
 <td class="org-right"> </td>
 <td class="org-right">0.00</td>
 <td class="org-left">:clock <sub>anamoly</sub>:</td>
</tr> <tr> <td class="org-right">20180706</td>
 <td class="org-left"> </td>
 <td class="org-right">07:40</td>
 <td class="org-right">14:00</td>
 <td class="org-right"> </td>
 <td class="org-right">0.00</td>
 <td class="org-left"> </td>
</tr> <tr> <td class="org-right">20180709</td>
 <td class="org-left">MEA-WAR</td>
 <td class="org-right">10:25</td>
 <td class="org-right">17:00</td>
 <td class="org-right">90</td>
 <td class="org-right">0.00</td>
 <td class="org-left">:clock <sub>anamoly</sub>:travel:</td>
</tr> <tr> <td class="org-right">20180710</td>
 <td class="org-left">WAR</td>
 <td class="org-right">07:40</td>
 <td class="org-right">17:00</td>
 <td class="org-right"> </td>
 <td class="org-right">0.00</td>
 <td class="org-left">:travel:</td>
</tr> <tr> <td class="org-right">20180711</td>
 <td class="org-left">WAR</td>
 <td class="org-right">07:40</td>
 <td class="org-right">17:00</td>
 <td class="org-right"> </td>
 <td class="org-right">3.30</td>
 <td class="org-left">:travel:</td>
</tr> <tr> <td class="org-right">20180712</td>
 <td class="org-left">WAR-MEA</td>
 <td class="org-right">07:40</td>
 <td class="org-right">13:30</td>
 <td class="org-right">90</td>
 <td class="org-right">48.45</td>
 <td class="org-left">:travel:clock <sub>anamoly</sub>:</td>
</tr> <tr> <td class="org-right">20180713</td>
 <td class="org-left">MEA-TAM-MEA</td>
 <td class="org-right">07:45</td>
 <td class="org-right">14:00</td>
 <td class="org-right">25</td>
 <td class="org-right">0.00</td>
 <td class="org-left"> </td>
</tr> <tr> <td class="org-right">20180716</td>
 <td class="org-left">MEA-BHX-PARIS</td>
 <td class="org-right">05:00</td>
 <td class="org-right">20:00</td>
 <td class="org-right">25</td>
 <td class="org-right">29.00</td>
 <td class="org-left">:travel:clock <sub>anamoly</sub>:</td>
</tr> <tr> <td class="org-right">20180717</td>
 <td class="org-left">PARIS</td>
 <td class="org-right">08:30</td>
 <td class="org-right">18:30</td>
 <td class="org-right"> </td>
 <td class="org-right">0.00</td>
 <td class="org-left">:travel:clock <sub>anamoly</sub>:</td>
</tr> <tr> <td class="org-right">20180718</td>
 <td class="org-left">PARIS-BHX-MEA</td>
 <td class="org-right">08:30</td>
 <td class="org-right">00:00</td>
 <td class="org-right">25</td>
 <td class="org-right">0.00</td>
 <td class="org-left">:travel:clock <sub>anamoly</sub>:</td>
</tr></tbody></table> <p>
This then at the top of the file gets rendered into a smaller dynamic table so i can see cumulative mileage by month
</p>

 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-left"></col> <col class="org-left"></col> <col class="org-left"></col> <col class="org-left"></col> <col class="org-right"></col> <col class="org-left"></col></colgroup> <thead> <tr> <th scope="col" class="org-left">ITEM</th>
 <th scope="col" class="org-left">LOCATIONS</th>
 <th scope="col" class="org-left">START</th>
 <th scope="col" class="org-left">FINISH</th>
 <th scope="col" class="org-right">MILEAGE</th>
 <th scope="col" class="org-left">TAGS</th>
</tr></thead> <tbody> <tr> <td class="org-left">April 2018</td>
 <td class="org-left"> </td>
 <td class="org-left"> </td>
 <td class="org-left"> </td>
 <td class="org-right">400</td>
 <td class="org-left"> </td>
</tr> <tr> <td class="org-left">May 2018</td>
 <td class="org-left"> </td>
 <td class="org-left"> </td>
 <td class="org-left"> </td>
 <td class="org-right">689</td>
 <td class="org-left"> </td>
</tr> <tr> <td class="org-left">June 2018</td>
 <td class="org-left"> </td>
 <td class="org-left"> </td>
 <td class="org-left"> </td>
 <td class="org-right">682</td>
 <td class="org-left"> </td>
</tr> <tr> <td class="org-left">July 2018</td>
 <td class="org-left"> </td>
 <td class="org-left"> </td>
 <td class="org-left"> </td>
 <td class="org-right">745</td>
 <td class="org-left"> </td>
</tr> <tr> <td class="org-left">August 2018</td>
 <td class="org-left"> </td>
 <td class="org-left"> </td>
 <td class="org-left"> </td>
 <td class="org-right">155</td>
 <td class="org-left"> </td>
</tr></tbody></table> <p>
now i'm working from home due to COVID i got tired of typing &quot;home&quot; everytime but i know there will be site &amp; supplier visits coming up so i didnt want to alter the template and just add the text &quot;home&quot; so back to the point of this post which was to use a bit of emacs-lisp fu to get the snippet template to auto update location but how?
</p>

 <p>
After a little thinking i came to the conclusion the easiest way would be to identify the network address the laptop is currently on, now admittedly this falls down if by some miracle everywhere i go has the same  <code>192.168.1</code> start for IP address but i'll test that when on the road. I started by reading up on network commands via
</p>

 <p>
 <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Misc-Network.html">https://www.gnu.org/software/emacs/manual/html_node/elisp/Misc-Network.html</a>
</p>

 <p>
i then searched and found  <a href="https://emacs.stackexchange.com/questions/7653/elisp-code-to-check-for-internet-connection">https://emacs.stackexchange.com/questions/7653/elisp-code-to-check-for-internet-connection</a> and this was discussing auto updating packages if the connection was alive.
</p>

 <p>
A bit of playing around i could see  <code>network-interface-list</code> contained the info i wanted 
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code>(print (network-interface-list))

#+RESULTS:
: ((lo0 . [127 0 0 1 0]) (lo0 . [0 0 0 0 0 0 0 1 0]) (eth1 . [169 254 195 98 0]) (eth1 . [65152 0 0 0 2226 39545 32787 50018 0]) (wlan2 . [169 254 127 144 0]) (wlan2 . [65152 0 0 0 20906 64385 58821 32656 0]) (wlan1 . [169 254 218 84 0]) (wlan1 . [65152 0 0 0 12504 37352 2860 55892 0]) (wlan0 . [169 254 231 54 0]) (wlan0 . [65152 0 0 0 41016 7035 59478 59190 0]) (eth0 . [192 168 1 14 0]) (eth0 . [65152 0 0 0 4387 56520 32424 30320 0]))
</code></pre>
</div>

 <p>
but then reading the first site also gave me  <code>network-interface-info</code> so specifying the wireless network or in this case ethernet ( <i>i'm writing this on my main m\c</i>) gives
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code>(print (network-interface-info  <span class="org-string">&quot;eth0&quot;</span>))

#+RESULTS:
: ([192 168 1 14 0] [192 168 1 255 0] [255 255 255 0 0] (1 . [244 77 48 24 93 135]) (dynamic running multicast broadcast up))
</code></pre>
</div>

 <p>
ok so i have the data what next? a little trial and error follows;
</p>

 <div class="org-src-container">
 <pre class="src src-emacs-lisp"> <code>(print (network-interface-info  <span class="org-string">&quot;wlan0&quot;</span>))
( <span class="org-keyword">setq</span> x (nth 0 (network-interface-info  <span class="org-string">&quot;wlan0&quot;</span>)))
(print x)
(format  <span class="org-string">&quot;%s&quot;</span> x)
( <span class="org-keyword">if</span> (string-match-p  <span class="org-string">&quot;192 168 1&quot;</span> (format  <span class="org-string">&quot;%s&quot;</span> x))
 <span class="org-string">&quot;home&quot;</span>
 <span class="org-string">&quot;work&quot;</span>)
</code></pre>
</div>

 <p>
there's a lot wrong with the above and i've learned a bit more however given i start with  <b>zero</b> emacs-lisp fu i think i can be spared a little leeway however it does ultimately work and can be pared down to the following;
</p>

 <div class="org-src-container">
 <pre class="src src-emacs-lisp"> <code>( <span class="org-keyword">if</span> (string-match-p  <span class="org-string">&quot;192 168 1&quot;</span> (format  <span class="org-string">&quot;%s&quot;</span> (network-interface-info  <span class="org-string">&quot;wlan0&quot;</span>)))
 <span class="org-string">&quot;home&quot;</span>
 <span class="org-string">&quot;work&quot;</span>)
</code></pre>
</div>

 <p>
All that needs to happen now is for the code to be incorporated into the snippet;
</p>

 <pre class="example" id="orga1f42dc">
# -*- mode: snippet -*-
# name: daily
# key: daily
# --
** `(format-time-string &quot;%Y-%m-%d-%H:%m&quot; (current-time))`

:PROPERTIES:
`(if (string-match-p &quot;192 168 1&quot; (format &quot;%s&quot; (network-interface-info &quot;wlan0&quot;)))
&quot;:LOCATION: HOME&quot;
&quot;:LOCATION: &quot;)`
:MILEAGE:
:START: `(format-time-string &quot;%H:%M&quot; (current-time))`
:FINISH:
:END:
</pre>

 <p>
Basically an hour of research and testing to save me what? 20s per day? thats going to be a long ROI before it pays off but i like learning and how knows what else may now be automated now that i have a little more fu.
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/emacslisp_yasnippet.html"/>
  <id>https://leehalls.net/posts/emacslisp_yasnippet.html</id>
  <updated>2020-06-05T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Website security</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Website security</h1>
 <p>
This site already uses HTTPS and SSL but whilst wandering aimlessly through some tech sites i stumbled upon reference to Mozilla's  <a href="https://observatory.mozilla.org/">Observatory</a>  which states;
</p>

 <blockquote>
 <p>
The Mozilla Observatory has helped over 170,000 websites by teaching developers, system administrators, and security professionals how to configure their sites safely and securely.
</p>
</blockquote>

 <p>
Essentially it scans your site for security issues and gives you a report,  <i>hey i thought lets try it</i> so i did and i got an  <b>F</b>  🫨 😥 💩
</p>


 <div id="org8dd67fb" class="figure">
 <p> <img src="../images/moz_obs_f.png" alt="moz_obs_f.png"></img></p>
</div>

 <p>
 <b>Ouch</b> that was not what i expected. The report goes into detail on what was wrong and my failures were;
</p>

 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-left"></col> <col class="org-left"></col> <col class="org-right"></col> <col class="org-left"></col></colgroup> <thead> <tr> <th scope="col" class="org-left">Test</th>
 <th scope="col" class="org-left">Pass</th>
 <th scope="col" class="org-right">Score</th>
 <th scope="col" class="org-left">Reason</th>
</tr></thead> <tbody> <tr> <td class="org-left">Content security policy</td>
 <td class="org-left">:x:</td>
 <td class="org-right">-25</td>
 <td class="org-left">Content security policy (CSP) header not implemented</td>
</tr> <tr> <td class="org-left">HTTPS strict transport security</td>
 <td class="org-left">:x:</td>
 <td class="org-right">-20</td>
 <td class="org-left">HTTP Strict Transport Security (HSTS) header not implemented</td>
</tr> <tr> <td class="org-left">X-Content-Type-Otions</td>
 <td class="org-left">:x:</td>
 <td class="org-right">-5</td>
 <td class="org-left">X-Content-Type-Options header not implemented</td>
</tr> <tr> <td class="org-left">X-Frame-Options</td>
 <td class="org-left">:x:</td>
 <td class="org-right">-20</td>
 <td class="org-left">X-Frame-Options (XFO) header not implemented</td>
</tr> <tr> <td class="org-left">X-XSS-Protection</td>
 <td class="org-left">:x:</td>
 <td class="org-right">-10</td>
 <td class="org-left">X-XSS-Protection header not implemented</td>
</tr></tbody></table> <p>
The games begin! starting with an epic trawl through documentation and sites on how to improve, during this i stumbled upon three that proved useful, written in a language i understood. Firstly Joseph Earl's post on how to  <a href="https://www.josephearl.co.uk/post/static-sites-netlify-security/">improve netlify static site security</a> and secondly Philipp Häfelfinger's post on  <a href="https://haefelfinger.ch/posts/2019/2019-11-12-Migrate-from-jekyll-to-hugo/">migrating from jekyll to hugo</a>
</p>

 <p>
Both proved interesting but on Phillip's he has a section on HTTP headers and using a  <code>.htaccess</code> file to improve security. In the interests of full disclosure i copied the lines except the last two re CSP pasted here for completeness;
</p>

 <pre class="example" id="org8554b91">
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Header always set Strict-Transport-Security &quot;max-age=31536000; includeSubDomains&quot;
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options &quot;SAMEORIGIN&quot;
Header always set X-Xss-Protection &quot;1; mode=block;&quot;
Header always set Referrer-Policy &quot;strict-origin&quot;
</pre>

 <p>
With the above added to a  <code>.htaccess</code> file store this in the static folder such that when hugo is run it copies this to the root of your  <code>public_html</code> folder, re-running the mozilla test now gets me 
</p>

 <p>
 <img src="../images/moz_obs_b.png" alt="moz_obs_b.png"></img>
Much better but still not enough, adding the last two lines from Philipp's post but modified for this site;
</p>

 <pre class="example" id="orge06b29f">
Header always set Content-Security-Policy &quot;default-src 'self' https://leehalls.net https://*.leehalls.net https:; script-src 'self' https://leehalls.net https://*.leehalls.net; style-src 'self' 'unsafe-inline' https://leehalls.net https://*.leehalls.net; img-src 'self' https://leehalls.net https://*.leehalls.net; object-src 'self'; script-src 'self' https://leehalls.net https://*.leehalls.net; require-sri-for style;&quot;
Header always set Access-Control-Allow-Origin &quot;https://leehalls.net&quot;
</pre>


 <p>
Gets me a more detailed report and a score of  <b>B+</b> so not quite what i anticipated given what i had read and it seems the reason is  <i>&quot;Content Security Policy (CSP) implemented unsafely. This includes 'unsafe-inline' or data: inside script-src, overly broad sources such as https: inside object-src or script-src, or not restricting the sources for object-src or script-src.&quot;</i>
</p>

 <p>
Obviously a little knowledge is dangerous :weary: more searching and trying to understand what i was doing led me to the third site, the actual Content Security Policy website  <a href="https://content-security-policy.com/">https://content-security-policy.com/</a>
</p>

 <p>
Here it suggested that  <code>default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self';base-uri 'self';form-action 'self'</code> is a good starting point for many sites, so i used that instead of the modified code and now my  <code>.htaccess</code> file looks like;
</p>

 <pre class="example" id="org467db34">
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Header always set Strict-Transport-Security &quot;max-age=31536000; includeSubDomains&quot;
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options &quot;SAMEORIGIN&quot;
Header always set X-XSS-Protection &quot;1; mode=block&quot;
Header always set Referrer-Policy &quot;strict-origin&quot;
Header always set Content-Security-Policy &quot;default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self';base-uri 'self';form-action 'self';  require-sri-for style;&quot;
Header always set Access-Control-Allow-Origin &quot;https://leehalls.net&quot;
</pre>

 <p>
Running the Observatory report again and i get . . . . 
</p>


 <div id="org44a9361" class="figure">
 <p> <img src="../images/moz_obs_a+.png" alt="moz_obs_a+.png"></img></p>
</div>

 <p>
I'd say that deserves a 🍺 however I have an A+ rating but when refreshing the site it appears odd, things are not working the way they should a little bit of testing and i needed to add to the  <code>style-src</code> section the following as per Philipp's example ~ style-src 'self' 'unsafe-inline'~ and everything  <i> <b>seems</b></i> to be working ok i just get a recommendation now from the report which states 
</p>

 <blockquote>
 <p>
Almost there!
</p>

 <p>
Your current CSP policy allows the use of 'unsafe-inline' inside of style-src. Moving style attributes into external stylesheets not only makes you safer, but also makes your code easier to maintain.
</p>
</blockquote>

 <p>
So that gives me two red crosses with the second being for   <code>Clickjacking protection, using frame-ancestors</code> still some work to do and i also want to understand why my modification of Phillip's example failed to gain the same A+ rating and there are other things i do not understand &amp; so my dear Watson the game continues!
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/website_security.html"/>
  <id>https://leehalls.net/posts/website_security.html</id>
  <updated>2020-05-30T00:00:00+01:00</updated>
</entry>
<entry>
  <title>HTML/CSS Agenda for emacs batch output</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">HTML/CSS Agenda for emacs batch output</h1>
 <div class="note" id="orgb9f5ea6">
 <p>

</p>

 <p>
,*UPDATE  <span class="timestamp-wrapper"> <span class="timestamp">[2021-01-03 Sun 13:30]</span></span>*
</p>

 <p>
After posting a reply on reddit to request for help on emacs batch mode and the agenda i realised when i migrated from the pi based server to the macmini replacement i had not re-setup batch mode myself, so following my own advice below i recreated the dotemacs added in the css export from a good working installation, altered the org-super-agenda as described  <a href="../../../leehalls_todayilearned/content_org/all_posts.html#ID-e675bbfa-9aac-4468-bb1c-cb13a015bb08">here</a> and typed in the magic code:
</p>

 <p>
 <code>/usr/local/bin/emacs -Q -batch -l ~/.emacs -eval '(org-batch-store-agenda-views)'</code>
</p>

 <p>
emacs booted up, org-super-agenda began its magic but when viewing the resulting HTML page it was blank. Checking the source shows the agenda, so its exported correctly and in the super-agenda mode but there is something wrong with how the CSS is interpreted, removing the  <code>(setq org-agenda-export-html-style</code> code and the agenda is shown but in the old  <i>plain</i> format.
</p>

 <p>
So for now the following can be ignored. Pretty bad when your own notes let you down :-O
</p>

</div>

 <hr></hr> <p>
 <i>BELOW NOT QUITE ACCURATE!</i>
</p>
 <hr></hr> <p>
Success whhooo … seems sunshine might be good for the brain as i finally have an agenda created in batch mode that renders in a modified gruvbox format (i tweaked the gruvbox el file to my liking). The steps needed;
</p>

 <p>
In your working emacs use  <code>C-a</code> and bring up your formatted agenda and then whilst the focus is on the agenda  <code>M-x</code> and  <code>org-export-htmlize-generate-css</code> this will generate a css file containing all the formatting used, note a lot of it you might not need. Now we have the CSS file we need to add the contents to our dotemacs file.
</p>

 <p>
If you open the file it may start like;
</p>

 <div class="org-src-container">
 <pre class="src src-css"> <code>&lt;style type= <span class="org-string">&quot;text/css&quot;</span>&gt;
    &lt;!--
       <span class="org-css-selector">body</span> {
         <span class="org-css-property">color</span>:  <span class="custom-3">#fdf4c1</span>;
         <span class="org-css-property">background-color</span>:  <span class="custom-2">#1d2021</span>;
      }
       <span class="org-css-selector">.org-border</span> {
      }
       <span class="org-css-selector">.org-browse-url-button</span> {
         <span class="org-comment-delimiter">/* </span> <span class="org-comment">browse-url-button</span> <span class="org-comment-delimiter"> */</span>
         <span class="org-css-property">color</span>:  <span class="custom-1">#458588</span>;
         <span class="org-css-property">text-decoration</span>: underline;
      }
       <span class="org-css-selector">.org-buffer-menu-buffer</span> {
         <span class="org-comment-delimiter">/* </span> <span class="org-comment">buffer-menu-buffer</span> <span class="org-comment-delimiter"> */</span>
         <span class="org-css-property">font-weight</span>: bold;
      }
       <span class="org-css-selector">.org-builtin</span> {
         <span class="org-comment-delimiter">/* </span> <span class="org-comment">font-lock-builtin-face</span> <span class="org-comment-delimiter"> */</span>
         <span class="org-css-property">color</span>:  <span class="custom">#fe8019</span>;
      }
</code></pre>
</div>

 <p>
However we cannot just copy/paste into our dotemacs  <i>oh no</i>, i'm learning there are always some detours or hurdles to take. The bit we are interested in is everything from  <code>body {</code> downwards and not the initial  <code>&lt;style type</code> stuff.
</p>

 <p>
So open up the dotemacs file and type 
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code>( <span class="org-keyword">setq</span> org-agenda-export-html-style
 <span class="org-string">&quot;&lt;style&gt;

&lt;---- paste the copied code here ---&gt;

&lt;/style&gt;&quot;</span>
</code></pre>
</div>

 <p>
What you should see (shortened form shown) is something like;
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code>( <span class="org-keyword">setq</span> org-agenda-export-html-style
 <span class="org-string">&quot;&lt;style&gt;
      body {
        color: #fdf4c1;
        background-color: #1d2021;
      }
      .org-border {
      }
      .org-browse-url-button {
        /* browse-url-button */
        color: #458588;
        text-decoration: underline;
      }
      a:hover {
        text-decoration: underline;
      }
&lt;/style&gt;&quot;</span>

)
</code></pre>
</div>

 <p>
Now when running the command  <code>/usr/local/bin/emacs -Q -batch -l ~/.emacs -eval '(org-batch-store-agenda-views)'</code> emacs should output your agenda in  <b>gloriously</b> formatted HTML.
</p>

 <p>
Good luck!
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/emacs_batch.html"/>
  <id>https://leehalls.net/posts/emacs_batch.html</id>
  <updated>2020-05-29T00:00:00+01:00</updated>
</entry>
<entry>
  <title>batch agenda output via html</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">batch agenda output via html</h1>
 <p>
Success! Previously I mentioned difficulty in getting the agenda output using the command line in HTML form however now after a bit of baking in today's glorious sunshine i figured it out. As normal i'd overlooked the obvious and discounted all the info i had reviewed.
</p>

 <p>
My old command looks like
</p>

 <p>
 <code>/usr/local/bin/emacs -Q --batch --load ~/.emacs --eval='(org-batch-agenda &quot;c&quot; org-agenda-files (quote (&quot;/srv/dev-disk-by-id-usb-Seagate_Portable_NAA570VH-0-0-part1/drakx/orgfiles/&quot;)) org-agenda-span (quote week))' &gt; /srv/dev-disk-by-id-usb-Seagate_Portable_NAA570VH-0-0-part1/drakx/orgfiles/agenda.txt</code>
</p>

 <p>
and this is entered into the scheduled job section of the OMV server setup;
</p>

 <p>
 <img src="../images/omv_cron_agenda.png" alt="omv_cron_agenda.png"></img>
It works very well but lacked the formatting of an HTML output, now the new command looks like;
</p>

 <p>
 <code>/usr/local/bin/emacs -Q -batch -l ~/.emacs -eval '(org-batch-store-agenda-views)'</code>
</p>

 <p>
and this does have HTML output  <b>however</b> it is not achievable without some modification of the org-super-agenda setup in the dotemacs file. As shown on many including the official site there are lines to show what output format we want, i just overlooked it.
</p>

 <p>
The following is a section from my dotemacs which shows the org-super-agenda setup for one command;
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code>'(( <span class="org-string">&quot;c&quot;</span>  <span class="org-string">&quot;Super view&quot;</span>
   ((agenda  <span class="org-string">&quot;&quot;</span> ((org-agenda-overriding-header  <span class="org-string">&quot;&quot;</span>)
                (org-super-agenda-groups
                 '(( <span class="org-builtin">:name</span>  <span class="org-string">&quot;&quot;</span>
                           <span class="org-builtin">:time-grid</span> t
                           <span class="org-builtin">:date</span> today
                           <span class="org-builtin">:order</span> 1)))))
    (alltodo  <span class="org-string">&quot;&quot;</span> ((org-agenda-overriding-header  <span class="org-string">&quot;&quot;</span>)
                 (org-super-agenda-groups
                  '(( <span class="org-builtin">:log</span> t)
                    ( <span class="org-builtin">:name</span>  <span class="org-string">&quot;family stuff&quot;</span>
                            <span class="org-builtin">:discard</span> ( <span class="org-builtin">:deadline</span> future)
                            <span class="org-builtin">:tag</span>  <span class="org-string">&quot;family&quot;</span>
                            <span class="org-builtin">:order</span> 8)
                    ( <span class="org-builtin">:name</span>  <span class="org-string">&quot;house stuff&quot;</span>
                            <span class="org-builtin">:discard</span> ( <span class="org-builtin">:deadline</span> future)
                            <span class="org-builtin">:tag</span>  <span class="org-string">&quot;house&quot;</span>
                            <span class="org-builtin">:order</span> 8)
                    ( <span class="org-builtin">:name</span>  <span class="org-string">&quot;tech stuff&quot;</span>
                            <span class="org-builtin">:discard</span> ( <span class="org-builtin">:deadline</span> future)
                            <span class="org-builtin">:tag</span> ( <span class="org-string">&quot;tech&quot;</span>  <span class="org-string">&quot;emacs&quot;</span>)
                            <span class="org-builtin">:order</span> 1)

                    )))))
   nil
   ( <span class="org-string">&quot;~/agenda.html&quot;</span>)
   )
</code></pre>
</div>


 <p>
The critical part of this for batch processing is;
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code>nil
( <span class="org-string">&quot;~/agenda.html&quot;</span>)
</code></pre>
</div>

 <p>
This tells the batch command how to save and where to save the agenda when it runs from the commandline. At the moment there is no fancy CSS applied but you get basic CSS and this is because  <i>quoting: &quot;when you run Emacs in batch mode, it has no display and therefore no colored faces, so that HTMLIZE will pick up simpler versions of the faces and use those.&quot;</i>  <sup> <a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup></p>

 <p>
Now a small modification of Tasker's scene to use a webview box instead of text and voila i now have a nicely formatted agenda on display on my phone.
</p>
 <div id="footnotes">
 <h2 class="footnotes">Footnotes: </h2>
 <div id="text-footnotes">

 <div class="footdef"> <sup> <a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
quote taken from the man himself on the org mailing list:  <a href="https://lists.gnu.org/archive/html/emacs-orgmode/2009-02/msg00321.html">https://lists.gnu.org/archive/html/emacs-orgmode/2009-02/msg00321.html</a> 
</p></div></div>


</div>
</div></div>]]></content>
  <link href="https://leehalls.net/posts/emacs_batchorgagenda.html"/>
  <id>https://leehalls.net/posts/emacs_batchorgagenda.html</id>
  <updated>2020-05-27T00:00:00+01:00</updated>
</entry>
<entry>
  <title>orgmode, android and Tasker</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">orgmode, android and Tasker</h1>
 <div id="table-of-contents" role="doc-toc">
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul> <li> <a href="#orga06863a">The capture scenes look like this;</a></li>
 <li> <a href="#org5d9e275">The task element</a></li>
 <li> <a href="#org5a373c4">Finally if all goes well</a></li>
 <li> <a href="#orgba82f77">The &quot;read my agenda&quot; scene</a></li>
 <li> <a href="#orgec534dd">XML for the main task above looks like;</a></li>
 <li> <a href="#orgb700358">XML for the photocapture scene</a></li>
</ul></div>
</div>
 <p>
Yes i know orgzly exists and whilst it is an excellent app it just doesn't feel  <i>right</i> or perhaps quick enough for me, I use it but only as a &quot;refer to&quot; method ie a viewer of pgp encrypted passwords or other entries and not as a capture/entry or agenda viewing system and yet because i wanted a way of quickly capturing tasks &amp; sometimes tasks with photos I created several scenes in  <a href="https://tasker.joaoapps.com/">Tasker</a> which work for me, using these i have to simply click an icon and can have a task populated with the right orgmode format, date etc and ready to enter text. The capture scenes write to a  <code>staging_ground.org</code> file which is automagically sync'd via syncthing to my main machine and the agenda scene simply reads the cron-generated text output of the org agenda.
</p>

 <p>
One downside of this approach is that Tasker is no longer available without Google Play so for an alternative ROM you're pretty stuffed :anguished:
</p>

 <p>
from the  <a href="https://tasker.joaoapps.com/faq-ov.html#dh">FAQ</a> of Tasker
</p>

 <blockquote>
 <p>
Why is Tasker only sold via Play Store now ?
App prices have been driven so low that the only way to make any profit is to make an extremely large amount of sales.
</p>

 <p>
Any sales channel that has even a little bit of administrative overhead is therefore out of the question because of the formula
</p>

 <p>
large-number-of-sales x little-overhead = large-overhead
A small developer can't handle a large overhead.
</p>
</blockquote>
 <div id="outline-container-orga06863a" class="outline-2">
 <h2 id="orga06863a">The capture scenes look like this;</h2>
 <div class="outline-text-2" id="text-orga06863a">
 <p>
 <img src="../images/tasker_org_capture.jpg" alt="tasker_org_capture.jpg"></img>
After attempting to recreate the tasks/scenes on another phone i realise there is quite a bit to them which isnt immediately obvious for example placing the focus on the text edit box. Hence a re-write of this post to try and give more info.
</p>

 <p>
As with all programming it helps if you give the constructs meaningful names so that finding, using and understanding them in the future is easier ie the text edit box in the scene above would normally be called  <code>TextEdit1</code> but i've called it  <code>My_OrgTextEdit</code> 
</p>

 <p>
 <img src="../images/tasker_myorgtext_s.jpg" alt="tasker_myorgtext_s.jpg"></img>
if you've got lots of scenes or tasks it giving them useful names aids identifying what each one does plus note the CamelCase format this is to differentiate between global and local variables
</p>

 <blockquote>
 <p>
Global vs. Local Variables
Variables which have an all-lower-case name (e.g. %fruit <sub>bar</sub>) are local, meaning that their value is specific to the task or scene in which they are used.
</p>

 <p>
Variables which have one or more capital letters in their name (e.g. %Car, %WIFI) are global, meaning that wherever they are accessed from the same value is returned.
</p>

 <p>
REF:  <a href="https://tasker.joaoapps.com/userguide/en/variables.html">https://tasker.joaoapps.com/userguide/en/variables.html</a>
</p>
</blockquote>

 <p>
Once you've created a scene as above ( <i>two buttons, 1 label and 1 textedit box</i>) you need the textedit box to have the focus. You can do this by long pressing on the actual box to reveal another menu, from this choose focus and you'll see the box will now have a star inside it eg
</p>

 <p>
 <img src="../images/tasker_focus_s.jpg" alt="tasker_focus_s.jpg"></img>
The next thing we need to do with the textedit box is to set a task within it, a short tap on the textedit element opens up its settings screen and here we can set fonts, colours and text changed;
</p>

 <p>
 <img src="../images/tasker_txtchanged_s.jpg" alt="tasker_txtchanged_s.jpg"></img>
Tasker recognises when the content has changed and because of the task above stores the result in the variable  <code>My_OrgTxt</code> a full example is;
</p>

 <p>
 <img src="../images/tasker_txtchanged1_s.jpg" alt="tasker_txtchanged1_s.jpg"></img>
Finally for the scene we need a cancel and an ok/accept button, as before a short tap on the button element brings up the settings screen and we create a task this time under the  <code>tap</code> function
</p>

 <p>
 <img src="../images/tasker_writefile.jpg" alt="tasker_writefile.jpg"></img>
For the cancel button we simply have the task to destroy the scene if using text entry but if capturing a photo then we want the button to actually delete the unused photo and not litter.
</p>
</div>
</div>
 <div id="outline-container-org5d9e275" class="outline-2">
 <h2 id="org5d9e275">The task element</h2>
 <div class="outline-text-2" id="text-org5d9e275">
 <p>
The capture scenes do nothing without the main task which is made up of multiple steps my photo capture task is the more complex and if you can replicate this then capturing simple text is a lot easier;
</p>

 <p>
 <img src="../images/tasker_orgtask.jpg" alt="tasker_orgtask.jpg"></img>
Essentially this group of actions in the task perform the following
</p>

 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides" class="zebra-striping sane-table"> <colgroup> <col class="org-left"></col> <col class="org-left"></col></colgroup> <thead> <tr> <th scope="col" class="org-left">#</th>
 <th scope="col" class="org-left">Description</th>
</tr></thead> <tbody> <tr> <td class="org-left">1</td>
 <td class="org-left">Tasker opens the camera app and within 3s or so snaps a photo and saves it with the filename we defined</td>
</tr> <tr> <td class="org-left">2</td>
 <td class="org-left">We set our own variable to the Tasker internal one which contains the filesystem path of the last photo taken</td>
</tr> <tr> <td class="org-left">3</td>
 <td class="org-left">Split the variable and save just the filename part</td>
</tr> <tr> <td class="org-left">4</td>
 <td class="org-left">Move this file into our org folder</td>
</tr> <tr> <td class="org-left">5</td>
 <td class="org-left">Show the capture scene</td>
</tr> <tr> <td class="org-left">6</td>
 <td class="org-left">Set the clipboard to our standard orgmode TODO format with the file details already in</td>
</tr> <tr> <td class="org-left">7</td>
 <td class="org-left">Launch another of the Tasker apps (autoinput) to paste the clipboard into the scene</td>
</tr></tbody></table> <p>
Most of the above is straight forwards,  <b>#7</b> the autoinput element needs a little more explanation, define the action as normal from the Tasker options and then from the autoinput config menu ensure that the  <code>Type:</code> is set to focus and  <code>Action:</code> to paste as below;
</p>

 <p>
 <img src="../images/tasker_autoinput1.jpg" alt="tasker_autoinput1.jpg"></img>
The eagle eyed will see one other line which states  <code>Is Tasker Action: true</code> this is necessary otherwise the autoinput  <i>task</i> will fail, you can set this option by scrolling to the bottom of the autoinput configuration screen and choosing advanced
</p>


 <div id="org2d1310d" class="figure">
 <p> <img src="../images/tasker_autoinput1.jpg" alt="tasker_autoinput1.jpg"></img></p>
</div>
</div>
</div>
 <div id="outline-container-org5a373c4" class="outline-2">
 <h2 id="org5a373c4">Finally if all goes well</h2>
 <div class="outline-text-2" id="text-org5a373c4">
 <p>
So once all that is complete we end up with a scene with auto-populated text waiting for more input;
</p>

 <p>
 <img src="../images/example_task.jpg" alt="example_task.jpg"></img>
Type away and pressing the green accept button and within a few seconds the magic of syncthing whirs away in the background, refresh the emacs org agenda and voila.
</p>

 <p>
 <img src="../images/staginggnd_org.png" alt="staginggnd_org.png"></img>
Opening the task allows me to see any notes i've added and of course the photo to go with it.
</p>
</div>
</div>
 <div id="outline-container-orgba82f77" class="outline-2">
 <h2 id="orgba82f77">The &quot;read my agenda&quot; scene</h2>
 <div class="outline-text-2" id="text-orgba82f77">
 <p>
The &quot;read my agenda&quot; scene is much simpler the task reads in the text file and stores the contents in a variable before launching the agenda scene
</p>

 <p>
 <img src="../images/tasker_readagenda.jpg" alt="tasker_readagenda.jpg"></img>
Whilst the scene has a textbox which reads the variable and prints
</p>

 <p>
 <img src="../images/tasker_agendascenetask.jpg" alt="tasker_agendascenetask.jpg"></img>
Finally the agenda looks like;
</p>

 <p>
 <img src="../images/tasker_agendascene.jpg" alt="tasker_agendascene.jpg"></img>
Each of the above has an icon on my Android home screen so with one tap i can create a photonote in an org file or read my agenda in true orgmode output. HTML would be better, the agenda looks better  <del>but i was not yet able to get HTML output working via a cronjob and using org-super-agenda.</del>  <b>2020-05-27 now working see footnote &gt;  <sup> <a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup></b>
</p>
</div>
</div>
 <div id="outline-container-orgec534dd" class="outline-2">
 <h2 id="orgec534dd">XML for the main task above looks like;</h2>
 <div class="outline-text-2" id="text-orgec534dd">
 <div class="org-src-container">
 <pre class="src src-xml"> <code> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">TaskerData</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;&quot;</span>  <span class="org-nxml-attribute-local-name">dvi</span>= <span class="org-string">&quot;1&quot;</span>  <span class="org-nxml-attribute-local-name">tv</span>= <span class="org-string">&quot;5.9.2&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Task</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;task4&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">cdate</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1586619219286</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">cdate</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">edate</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1590482529265</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">edate</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">id</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">4</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">id</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">nme</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">My_OrgPhoto</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">nme</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">pri</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">7</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">pri</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Action</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;act0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;7&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">101</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">PT-%DATE-%TIME</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg4&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg5&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1280x720</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg6&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg7&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg8&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;1&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg9&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Action</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Action</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;act1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;7&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">547</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">%My_OrgPhoto</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">%FOTO</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg4&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg5&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Action</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Action</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;act2&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;7&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">590</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">%My_OrgPhoto</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">/</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Action</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Action</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;act3&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;7&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">400</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">%My_OrgPhoto</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">orgFiles/staging_img</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Action</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Action</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;act4&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;7&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">47</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">My_OrgPhoto_s</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;100&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;100&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg4&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg5&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;1&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg6&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;1&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg7&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;1&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Action</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Action</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;act5&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;7&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">105</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">* TODO %DATE-%TIME - PHOTONOTE
[[file:staging_img/%My_OrgPhoto3]]</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Action</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Action</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;act6&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;7&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1732635924</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Bundle</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Vals</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;val&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">ActionId</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">null</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">ActionId</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">ActionId-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">ActionId-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">ActionType</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">32768</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">ActionType</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">ActionType-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">ActionType-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">EnableDisableAccessibilityService</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">null</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">EnableDisableAccessibilityService</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">EnableDisableAccessibilityService-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">EnableDisableAccessibilityService-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">FieldSelectionType</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">2</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">FieldSelectionType</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">FieldSelectionType-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">FieldSelectionType-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">IsFirstAction</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">false</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">IsFirstAction</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">IsFirstAction-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.Boolean</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">IsFirstAction-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">IsTaskerAction</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">true</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">IsTaskerAction</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">IsTaskerAction-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.Boolean</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">IsTaskerAction-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">NearbyText</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">null</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">NearbyText</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">NearbyText-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">NearbyText-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Password</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">null</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Password</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Password-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Password-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">RepeatInterval</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">null</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">RepeatInterval</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">RepeatInterval-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">RepeatInterval-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">RepeatTimes</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">null</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">RepeatTimes</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">RepeatTimes-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">RepeatTimes-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">StoredAction</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">null</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">StoredAction</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">StoredAction-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">StoredAction-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">TextToWrite</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">null</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">TextToWrite</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">TextToWrite-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">TextToWrite-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">com.twofortyfouram.locale.intent.extra.BLURB</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">Type: Focus
Action : Paste
Is Tasker Action: true</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">com.twofortyfouram.locale.intent.extra.BLURB</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">com.twofortyfouram.locale.intent.extra.BLURB-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">com.twofortyfouram.locale.intent.extra.BLURB-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">net.dinglisch.android.tasker.RELEVANT_VARIABLES</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">StringArray sr=&quot;&quot;</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">%err
Error Code
Only available if you select </span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">amp</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">lt;b</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">amp</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">gt;Continue Task After Error</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">amp</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">lt;/b</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">amp</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">gt; and the action ends in error</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">%errmsg
Error Message
Only available if you select </span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">amp</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">lt;b</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">amp</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">gt;Continue Task After Error</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">amp</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">lt;/b</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">amp</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">gt; and the action ends in error</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">/_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;&amp;</span> <span class="org-nxml-entity-ref-name">lt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-text">/StringArray</span> <span class="org-nxml-entity-ref-delimiter">&amp;</span> <span class="org-nxml-entity-ref-name">gt</span> <span class="org-nxml-entity-ref-delimiter">;</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">net.dinglisch.android.tasker.RELEVANT_VARIABLES</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">net.dinglisch.android.tasker.RELEVANT_VARIABLES-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">[Ljava.lang.String;</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">net.dinglisch.android.tasker.RELEVANT_VARIABLES-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">FieldSelectionType ActionType plugininstanceid plugintypeid </span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">net.dinglisch.android.tasker.subbundled</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">true</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">net.dinglisch.android.tasker.subbundled</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">net.dinglisch.android.tasker.subbundled-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.Boolean</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">net.dinglisch.android.tasker.subbundled-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">plugininstanceid</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">931c2a84-a888-45e8-a2e3-8a19eff825e6</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">plugininstanceid</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">plugininstanceid-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">plugininstanceid-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">plugintypeid</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">com.joaomgcd.autoinput.intent.IntentPerformAction</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">plugintypeid</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">plugintypeid-type</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">java.lang.String</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">plugintypeid-type</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Vals</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Bundle</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">com.joaomgcd.autoinput</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">com.joaomgcd.autoinput.activity.ActivityConfigPerformAction</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;23&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Action</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Img</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;icn&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;2&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">nme</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">camera</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">nme</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">pkg</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">net.dinglisch.android.ipack.bluewhitepearlhd</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">pkg</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Img</span> <span class="org-nxml-tag-delimiter">&gt;</span>
         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Task</span> <span class="org-nxml-tag-delimiter">&gt;</span>
 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">TaskerData</span> <span class="org-nxml-tag-delimiter">&gt;</span>

</code></pre>
</div>
</div>
</div>
 <div id="outline-container-orgb700358" class="outline-2">
 <h2 id="orgb700358">XML for the photocapture scene</h2>
 <div class="outline-text-2" id="text-orgb700358">
 <div class="org-src-container">
 <pre class="src src-xml"> <code> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">TaskerData</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;&quot;</span>  <span class="org-nxml-attribute-local-name">dvi</span>= <span class="org-string">&quot;1&quot;</span>  <span class="org-nxml-attribute-local-name">tv</span>= <span class="org-string">&quot;5.9.2&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">dmetric</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1440.0,2792.0</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">dmetric</span> <span class="org-nxml-tag-delimiter">&gt;</span>
         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Scene</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;sceneMy_OrgPhoto_s&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">cdate</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1586846659080</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">cdate</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">edate</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1590482654993</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">edate</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">gridSize</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">30</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">gridSize</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">heightLand</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">-1</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">heightLand</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">heightPort</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">2086</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">heightPort</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">nme</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">My_OrgPhoto_s</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">nme</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">widthLand</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">-1</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">widthLand</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">widthPort</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1241</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">widthPort</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">EditTextElement</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;elements0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">flags</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">12</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">flags</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">geom</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">32,186,1182,1284,35,1225,1290,977</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">geom</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">valueselectedTask</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">55</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">valueselectedTask</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">TextEdit1</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;14&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;100&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg4&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">#FF00FF00</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg5&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg6&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;5&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg7&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg8&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;1000&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">RectElement</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;background&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">flags</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">4</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">flags</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">geom</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">-1,-1,-1,-1,-1,-1,-1,-1</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">geom</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">#FF000000</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg4&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;1&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg5&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">#FF000000</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg6&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg7&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">RectElement</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">EditTextElement</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">ButtonElement</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;elements1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">clickTask</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">57</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">clickTask</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">flags</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">4</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">flags</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">geom</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1021,25,192,160,472,745,434,775</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">geom</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">Button1</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;8&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;100&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg4&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">#FF000000</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg5&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg6&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Img</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg7&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;2&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">nme</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">cuteball_go</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">nme</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">pkg</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">net.dinglisch.android.ipack.ilikebuttonshd</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">pkg</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Img</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">ButtonElement</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">ButtonElement</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;elements2&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">clickTask</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">58</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">clickTask</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">flags</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">4</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">flags</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">geom</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">32,25,186,160,35,1429,205,175</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">geom</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">Button2</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;16&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;100&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg4&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">#FF000000</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg5&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg6&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Img</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg7&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;2&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">nme</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">aqua_shutdown</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">nme</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">pkg</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">net.dinglisch.android.ipack.ilikebuttonshd</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">pkg</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Img</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">ButtonElement</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">TextElement</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;elements3&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">flags</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">4</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">flags</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">geom</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">298,25,620,173,327,1429,677,190</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">geom</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">Text1</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">ORG PHOTO CAPTURE</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;14&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;100&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg4&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">#FF3EFF00</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg5&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg6&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg7&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg8&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">RectElement</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;background&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">flags</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">4</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">flags</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">geom</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">-1,-1,-1,-1,-1,-1,-1,-1</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">geom</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">#8D000000</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg4&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg5&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">#FF000000</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg6&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg7&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">RectElement</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">TextElement</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">PropertiesElement</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;props&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;1&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">#33FFFFFF</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;0&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg4&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">Capture</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg5&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Img</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg6&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;2&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg7&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">PropertiesElement</span> <span class="org-nxml-tag-delimiter">&gt;</span>
         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Scene</span> <span class="org-nxml-tag-delimiter">&gt;</span>
         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Task</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;task55&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">cdate</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1586900574760</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">cdate</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">edate</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1586900574760</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">edate</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">id</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">55</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">id</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">pri</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">102</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">pri</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Action</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;act0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;7&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">195</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">My_OrgPhoto_s</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">TextEdit1</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;2&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">%orgTXT</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Action</span> <span class="org-nxml-tag-delimiter">&gt;</span>
         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Task</span> <span class="org-nxml-tag-delimiter">&gt;</span>
         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Task</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;task57&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">cdate</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1586846843950</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">cdate</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">edate</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1586846843950</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">edate</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">id</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">57</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">id</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">pri</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">102</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">pri</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Action</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;act0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;7&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">410</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">orgFiles/staging_gnd.org</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">%orgTXT</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg2&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;1&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Int</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg3&quot;</span>  <span class="org-nxml-attribute-local-name">val</span>= <span class="org-string">&quot;1&quot;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Action</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Action</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;act1&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;7&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">49</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">My_OrgPhoto_s</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Action</span> <span class="org-nxml-tag-delimiter">&gt;</span>
         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Task</span> <span class="org-nxml-tag-delimiter">&gt;</span>
         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Task</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;task58&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">cdate</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1586900945194</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">cdate</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">edate</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">1586900945194</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">edate</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">id</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">58</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">id</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">pri</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">102</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">pri</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Action</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;act0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;7&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">49</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">code</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-element-local-name">Str</span>  <span class="org-nxml-attribute-local-name">sr</span>= <span class="org-string">&quot;arg0&quot;</span>  <span class="org-nxml-attribute-local-name">ve</span>= <span class="org-string">&quot;3&quot;</span> <span class="org-nxml-tag-delimiter">&gt;</span> <span class="org-nxml-text">My_OrgPhoto_s</span> <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Str</span> <span class="org-nxml-tag-delimiter">&gt;</span>
                 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Action</span> <span class="org-nxml-tag-delimiter">&gt;</span>
         <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">Task</span> <span class="org-nxml-tag-delimiter">&gt;</span>
 <span class="org-nxml-tag-delimiter">&lt;</span> <span class="org-nxml-tag-slash">/</span> <span class="org-nxml-element-local-name">TaskerData</span> <span class="org-nxml-tag-delimiter">&gt;</span>
</code></pre>
</div>
</div>
</div>
 <div id="footnotes">
 <h2 class="footnotes">Footnotes: </h2>
 <div id="text-footnotes">

 <div class="footdef"> <sup> <a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
new commandline using org-batch-store-agenda-views and a small mod to my dotemacs file code results in HTML output, 
</p></div></div>


</div>
</div></div>]]></content>
  <link href="https://leehalls.net/posts/android_taskerorg.html"/>
  <id>https://leehalls.net/posts/android_taskerorg.html</id>
  <updated>2020-05-24T00:00:00+01:00</updated>
</entry>
<entry>
  <title>COVID19</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">COVID19</h1>
 <p>
Currently as of Thursday 21 May 2020 @ 16:09 there has been for the UK  <b>36,042 deaths</b> associated with the virus, 250,908 lab-confirmed cases and for the rest of the world inc UK data its 5,067,579 cases &amp;  <b>332,711 deaths</b>  <sup> <a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup>. So its a very real threat and has had a significant impact not only on families but countries with some close to the brink of bankruptcy and being forced to chose letting people live in lockdown and to continue the disease control measures or sending them back to work and possibly die. Despite all this, for me personally, the enforced lockdown has been brilliant.
</p>

 <p>
Perhaps sadly in some peoples eyes I've had to make no changes to my personal life, there has been no loss nor sense of isolation. I've had time to work on my projects, the garden, the house, continue on my own journey of learning as well as become more self-reliant ie no dropbox, reduced google etc
</p>

 <p>
I've never been one for the social scene and am comfortable with the multitude of voices in my head for company so to be shut inside the confines of my home &amp; garden was no trouble. OK i've not been furloughed the entire time and undertook several weeks of working from home supporting both the UK and European operations but with this there was no pressure associated with the smalltalk needed when present with people and definitely no time vs traffic pressure to meet the Victorian workhouse ethic of you must clock-on.
</p>

 <p>
When furloughed properly there was simply no pressure at all.
</p>

 <p>
I still woke before 0700 but the day was mine and there was no time constraints, no rolling of the normally loaded dice to see what the M42, A38 or M6 was going to be like on a journey to a factory, office or airport. I could react and change plans to suit the weather which has been for the most part magnificent. Even when officially working at home i was  <b>more productive</b> both personally and professionally but alas slowly like with the rest of Europe the UK is being forced into sending people back to work and my time is becoming shorter and in all honesty i'll miss it. I already see this as perhaps a trial of what retirement could be like should i be lucky enough to last that long and be healthy enough to enjoy it.
</p>

 <p>
COVID19 is possibly here to stay, whether we the general public ever get to understand the real reason for its existence with all the politics and conspiracy theories that surround us I'd say is doubtful, it sure isnt 5G but is it down to the human consumption of anything &amp; everything living, wet markets, biological experimentation? who knows, there are lessons to be learnt though but will we?
</p>

 <p>
Its been an interesting &quot;experiment&quot; civilisation as we have come to it know teeters on a knife edge it's been proven by COVID that it doesnt take much for the veneer of civility to disappear and the true nature of the human beast to be shown or to point our economic frailty. It's perhaps a little ironic that in this time of idiocy with that lunatic Trump and our own Brexit what the world actually needs is more global cooperation not the closing of borders and the introversion of countries.
</p>

 <p>
Still with COVID i'm reminded of something i've long enjoyed listening to &amp; reading -  <a href="https://www.gutenberg.org/files/36/36-h/36-h.htm">War of the Worlds</a>
</p>

 <blockquote>
 <p>
“Perhaps I am a man of exceptional moods. I do not know how far my experience is common. At times I suffer from the strangest sense of detachment from myself and the world about me; I seem to watch it all from the outside, from somewhere inconceivably remote, out of time, out of space, out of the stress and tragedy of it all.”
</p>
</blockquote>

 <p>
and perhaps there is hope
</p>

 <blockquote>
 <p>
These germs of disease have taken toll of humanity since the beginning of things–taken toll of our prehuman ancestors since life began here. But by virtue of this natural selection of our kind we have developed resisting power; to no germs do we succumb without a struggle
</p>
</blockquote>

 <p>
For those whom lockdown has been a painful experience
</p>

 <blockquote>
 <p>
The day seemed, by contrast with my recent confinement, dazzlingly bright, the sky a glowing blue. A gentle breeze kept the red weed that covered every scrap of unoccupied ground gently swaying. And oh! the sweetness of the air!
</p>
</blockquote>
 <div id="footnotes">
 <h2 class="footnotes">Footnotes: </h2>
 <div id="text-footnotes">

 <div class="footdef"> <sup> <a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
Data taken from the UK goverment website and the European Centre for Disease Prevention and Control
</p></div></div>


</div>
</div></div>]]></content>
  <link href="https://leehalls.net/posts/covid19.html"/>
  <id>https://leehalls.net/posts/covid19.html</id>
  <updated>2020-05-22T00:00:00+01:00</updated>
</entry>
<entry>
  <title>emacs, orgmode, hugo + ox-hugo</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">emacs, orgmode, hugo + ox-hugo</h1>
 <p>
OK so i dont pretend to be an all knowing computer geek in fact just the opposite i'm aging computer enthusiast that grew up in the golden age of electronics and computers but i do have some understanding from starting out with BBC's,Spectrums and hacking high score tables or re-programming the header so the game could run from microdrive instead of C90 tape :wink:  through to TCL for aero engine data analysis and then python for a home monitoring system but my decision to start afresh, move to a new domain and use hugo + ox-hugo has had me reaching for a glass of the strong stuff and several relaxing hours getting my arse handed to me on COD!
</p>

 <p>
You may ask  <i>Why if you use orgmode already did you struggle with ox-hugo?</i> well despite all the excellent documentation provided by Kaushal and following the example of Ken Grimes it just didnt twig, for me something was missing.
</p>

 <p>
I normally keep one blog post per org file, each one saved with the date as the filename eg  <code>20200508.org</code> but wanted to try and jump to the ox-hugo preferred  <b>one file to rule all</b> method because with a file per post i sometimes struggled to link between them and i wanted to use more of orgmode's features. So i tried to take an old post and tweak it, i refactored the tags and categories added export features and jumped right in, needless to say it didnt work. 
</p>

 <p>
What i was doing was thinking the top heading was for each post ie
</p>

 <pre class="example" id="orgc208430">
* post 1                                                         :@emacs:org:
:PROPERTIES:
:export_file_name: post1
:export_description: my big dumbass
:END:
 now onto the rest blah blah

* post 2
:PROPERTIES:
:export_file_name: post2
:export_description: my big dumbass
:END:
 now onto the rest blah blah
</pre>

 <p>
It was not until i found  <a href="https://www.shanesveller.com/blog/2018/02/13/blogging-with-org-mode-and-ox-hugo/">Shane Sveller's</a> site that the lights switched on, he has a really clear explanation and what did it for me a full proper example page. Definitely worth visiting his site for full details but in brief i should have been doing something like this;
</p>
 <pre class="example" id="orge39e703">

* Posts
:PROPERTIES:
:EXPORT_HUGO_SECTION: posts
:EXPORT_HUGO_CUSTOM_FRONT_MATTER: :noauthor true :nocomment true :nopaging true :noread true
:END:

** starting afresh
:PROPERTIES:
:export_file_name: 
:export_description: 
:END:
</pre>

 <p>
So each blog or post is a subheading of the main and the same goes for pages bloody easy really. OK in my limited defense i was also trying to apply a theme to the posts and getting lost there with trying to tweak the output at the time as well as trying to understand how to &quot;ox-hugo&quot;. For example;
</p>

 <p>
A  <code>TODO</code> in a post is output by ox-hugo in markdown as;
</p>

 <div class="org-src-container">
 <pre class="src src-markdown"> <code># &lt;span class=&quot;org-todo done DONE&quot;&gt;DONE&lt;/span&gt; automatically rebuild my orgmode &amp; sync to my phone {#automatically-rebuild-my-orgmode-and-sync-to-my-phone}
</code></pre>
</div>

 <p>
every single theme i tried converts this into MASSIVE text in old HTML terms  <code>&lt;H1&gt;</code> or bigger ie
</p>

 <p>
 <img src="../images/example_todo.png" alt="example_todo.png"></img>
 i spent a lot of time trying different themes just to see if they did something different then i tried to edit the CSS files and i know nothing about CSS
</p>

 <p>
After all this i can recommend if you do not want to learn about css, layouts and other hugo terms i'd probably walk away from hugo but if you're already an orgmode user and want a challenge, want the full org experience for your site then pull up a comfy chair, grab a drink and stick on some meditation music and be prepared but you may find the following reading material useful before you start:
</p>


 <ul class="org-ul"> <li> <a href="https://www.shanesveller.com/blog/2018/02/13/blogging-with-org-mode-and-ox-hugo/">https://www.shanesveller.com/blog/2018/02/13/blogging-with-org-mode-and-ox-hugo/</a></li>
 <li> <a href="https://gtpedrosa.github.io/blog/using-org-mode-and-ox-hugo-to-replace-markdown-in-hugo-workflow/">https://gtpedrosa.github.io/blog/using-org-mode-and-ox-hugo-to-replace-markdown-in-hugo-workflow/</a></li>
 <li> <a href="https://people.umass.edu/weikaichen/post/emacs-ox-hugo/">https://people.umass.edu/weikaichen/post/emacs-ox-hugo/</a></li>
 <li> <a href="https://www.petercheng.net/posts/website-v2-setup/">https://www.petercheng.net/posts/website-v2-setup/</a></li>
 <li> <a href="https://joshrollinswrites.com/tags/orgmode/">https://joshrollinswrites.com/tags/orgmode/</a></li>
 <li> <a href="https://www.kengrimes.com/ox-hugo-tutorial/">https://www.kengrimes.com/ox-hugo-tutorial/</a></li>
 <li> <a href="https://github.com/kaushalmodi/ox-hugo">https://github.com/kaushalmodi/ox-hugo</a></li>
 <li> <a href="https://gitlab.com/kaushalmodi/hugo-theme-refined">https://gitlab.com/kaushalmodi/hugo-theme-refined</a></li>
</ul></div>]]></content>
  <link href="https://leehalls.net/posts/oxhugo.html"/>
  <id>https://leehalls.net/posts/oxhugo.html</id>
  <updated>2020-05-09T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Starting afresh</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Starting afresh</h1>
 <p>
So during this lockdown amongst other things i decided to  <i>re</i> kick-start all  projects which had either lay in waiting or been put on hold for more time, for example some of what was on that list was
</p>

 <ul class="org-ul"> <li>DONE convert old mac mini to OMV5 server</li>
 <li>DONE install syncthing under OMV</li>
 <li>DONE get my orgmode agenda automatically rebuilt &amp; setup sync to my phone</li>
 <li>DONE setup motioneye on a RasPi to monitor my bike</li>
 <li>TODO re-write  <i>dragelec</i> the home monitoring system</li>
 <li>TODO sort photos, improve Affinity workflow</li>
 <li>TODO misc python scripts to mimic a second brain
 <ul class="org-ul"> <li>basically these are scripts which pull data from various sources and output to a journal so for example i use Tasker to track start &amp; end of car journey's which gives me time spent plus GPS coords</li>
</ul></li>
</ul> <p>
There are other jobs but one i had been putting off was a new domain as my current  <code>.eu</code> one may end up being taken to the bottom of the garden and shot because of brexit, i also wanted a more controllable, more orgmode based blogging experience but a wise man once said &quot;Coming back to where you started is not the same as never leaving&quot;  <sup> <a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup> and i can fully agree, I started this journey with some knowledge of hugo, reasonable orgmode knowledge and little if any CSS &amp; to be blunt I feel like i've been dragged by my testicles backwards through a privet hedge by a small bearded dwarf with penchant for dense privet, what i thought would be a relatively simple transition turned out to be taking the red pill down a sewer of broken themes, conflicts and my own lack of understanding of both  <b> <i>hugo</i></b> and  <b> <i>how to write</i></b> in orgmode for ox-hugo. So i am back where started, scratched, a little bloody but wiser and with a  <b>significant</b> amount of respect for Kaushal who not only wrote ox-hugo but this theme i'm using. 
</p>


 <div class="note" id="org9380d9b">
 <p>
2021-02-06T14:22 UPDATE decided to re-vamp with different theme
</p>

 <p>
I still dont know what i am doing but have learnt quite a bit delving through different themes CSS files. I want to tweak this theme specifically for TODO lists but for now its time to transfer the content of my old site, refresh the words and update where needed.
</p>

</div>
 <div id="footnotes">
 <h2 class="footnotes">Footnotes: </h2>
 <div id="text-footnotes">

 <div class="footdef"> <sup> <a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
Terry Pratchett - A Hat full of Sky :  <i>i really do recommend reading some of his books for a humorous often cynical but immensely accurate alternative look at life</i> 
</p></div></div>


</div>
</div></div>]]></content>
  <link href="https://leehalls.net/posts/new_start.html"/>
  <id>https://leehalls.net/posts/new_start.html</id>
  <updated>2020-05-08T00:00:00+01:00</updated>
</entry>
<entry>
  <title>Quick link creation</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Quick link creation</h1>
 <p>
As the sub-heading to this site suggests this maybe a place to find poor python! I was updating my photography galleries and in doing so creating ox-hugo clickable image links so that the main page shows the thumbnail and a click brings up the main image. Anyway its a pain to go  <code>C-c C-l</code> for each and every file so i cobbled together a dirty and quick python script to trawl a directory and create a text file with the necesary ox-hugo links for clickable images.
</p>

 <p>
The ox-hugo format needed for creating hyperlinked pictures has to resemble;
</p>

 <pre class="example" id="orgc735517">
[[file:/img/lifedeath/LifeDeath_002.jpg][file:/img/lifedeath/LifeDeath_002-thumb.jpg]]
</pre>

 <p>
My files are are saved as 
</p>

 <pre class="example" id="org3f64bf3">
Name                               Size Type                   Modified  Attr
LifeDeath_001.jpg                460 KB JPEG image      13/01/2019 18:31-------
LifeDeath_001-thumb.jpg         11.5 KB JPEG image      13/01/2019 18:31-------
LifeDeath_002.jpg                464 KB JPEG image      13/01/2019 18:31-------
LifeDeath_002-thumb.jpg         11.8 KB JPEG image      13/01/2019 18:31-------
..
..
</pre>

 <p>
The following poor python does the job of creating the links
</p>
 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">import</span> glob

 <span class="org-comment-delimiter">#</span> <span class="org-comment">oxhugo link format
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">[[file:/img/colour/C_ART_0052.jpg][file:/img/colour/C_ART_0052-thumb.jpg]] 
</span> <span class="org-variable-name">output_file</span>  <span class="org-operator">=</span>  <span class="org-builtin">open</span>( <span class="org-string">&quot;link.txt&quot;</span>, <span class="org-string">&quot;a&quot;</span>)

 <span class="org-variable-name">one</span>  <span class="org-operator">=</span>  <span class="org-string">&quot;[[file:/img/lifedeath/&quot;</span>
 <span class="org-variable-name">three</span>  <span class="org-operator">=</span>  <span class="org-string">&quot;][file:/img/lifedeath/&quot;</span>
 <span class="org-variable-name">four</span>  <span class="org-operator">=</span>  <span class="org-string">&quot;]] &quot;</span>

 <span class="org-variable-name">files</span>  <span class="org-operator">=</span> []
 <span class="org-keyword">for</span> file  <span class="org-keyword">in</span> glob.glob( <span class="org-string">&quot;*.jpg&quot;</span>):
    files.append(file)

 <span class="org-variable-name">i</span>  <span class="org-operator">=</span>  <span class="org-variable-name">thumb</span>  <span class="org-operator">=</span> 0
 <span class="org-variable-name">main</span>  <span class="org-operator">=</span> 1
 <span class="org-keyword">while</span> i  <span class="org-operator">&lt;</span>  <span class="org-builtin">len</span>(files):
     <span class="org-keyword">try</span>:
         <span class="org-variable-name">complete</span>  <span class="org-operator">=</span> one  <span class="org-operator">+</span> files[main]  <span class="org-operator">+</span> three  <span class="org-operator">+</span> files[thumb]  <span class="org-operator">+</span> four  <span class="org-operator">+</span>  <span class="org-string">&quot;</span> <span class="org-constant">\n</span> <span class="org-string">&quot;</span>
     <span class="org-keyword">except</span>  <span class="org-type">IndexError</span>:
         <span class="org-builtin">print</span>( <span class="org-string">&quot;finished&quot;</span>)
         <span class="org-keyword">break</span>

    output_file.write(complete)
     <span class="org-variable-name">main</span>  <span class="org-operator">=</span> main  <span class="org-operator">+</span> 2
     <span class="org-variable-name">thumb</span>  <span class="org-operator">=</span> thumb  <span class="org-operator">+</span> 2
</code></pre>
</div>

 <p>
The resulting output gives me exactly what i needed.
</p>
</div>]]></content>
  <link href="https://leehalls.net/posts/python_oxhugolink.html"/>
  <id>https://leehalls.net/posts/python_oxhugolink.html</id>
  <updated>2020-05-08T00:00:00+01:00</updated>
</entry>
<entry>
  <title>About Me</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">About Me</h1>

 <div id="org16ac24d" class="figure">
 <p> <img src="../images/bikerlee.jpg" alt="bikerlee.jpg" width="200px" style="float:left;margin:0px 20px 20px 0px;"></img></p>
</div>

 <p>
Hi, and yes, that fat hamster in a helmet really is me, riding my much-loved  <a href="posts/bobber.html">Triumph Bobber</a>, captured near Whatstandwell Bridge.
</p>

 <p>
An admittedly expensive set of three photographs was purchased, and this is one of them. Seeing as there aren't many decent photos of me—and this one involves the bike—why not? 😁
</p>

 <p>
Away from the bike, I'm a fan of fantasy and gaming, an amateur Emacs Lisp and Python programmer, and an  <b>old-school</b> automation engineer with a background in PLC programming, industrial robotics, instrumentation, controls, and automated manufacturing systems.
</p>

 <p>
I currently work for a Tier One automotive supplier as a Process Engineer/Senior Expert specialising in industrial adhesive bonding and automated assembly processes. My work covers the complete process lifecycle, from early product and process feasibility through equipment specification, development and commissioning, to series-production support and continuous improvement.
</p>

 <p>
A large part of the role involves assessing product designs for manufacturability and bondability, developing robust bonding processes, and ensuring that equipment, automation, material application, surface preparation, process controls, and inspection methods are capable of consistently meeting OEM requirements.
</p>

 <p>
When things don't go according to plan, I also provide technical and problem-solving support—investigating bonding failures, process variation, equipment and automation issues, and generally trying to determine why something that  <b>definitely worked yesterday</b> has decided not to work today.
</p>
</div>]]></content>
  <link href="https://leehalls.net/docs/about.html"/>
  <id>https://leehalls.net/docs/about.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Photography - Black &amp; White</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Photography - Black &amp; White</h1>
 <p>
The magic of not knowing how a picture turned out and then in the gloomy darkness lit only by a dim red light watching it slowly materialise before your eyes seemed and still seems magical to me. Ultimately I followed the herd and switched to digital, for me the switch was because the ever present call of computing still serenaded me &amp; promised a match up of photography and computers. It was another mistake. Photography lost its magic.
</p>



 <div id="org0d7e831" class="figure">
 <p> <img src="../images/bandw/dasha_000.png" alt="Zoomed image." width="600" style="border:2px solid black;"></img></p>
 <p> <span class="figure-number">Figure 1: </span>Eyes, a window into the soul</p>
</div>


 <div id="org93bebaa" class="figure">
 <p> <img src="../images/bandw/bw_0000.jpg" alt="Zoomed image." width="300" style="border:2px solid black;"></img></p>
 <p> <span class="figure-number">Figure 2: </span>The Spire</p>
</div>


 <div id="orga1450fb" class="figure">
 <p> <img src="../images/bandw/bw_0001.jpg" alt="Zoomed image." width="300" style="border:2px solid black;"></img></p>
 <p> <span class="figure-number">Figure 3: </span>What a vampire sees?</p>
</div>


 <div id="org0714877" class="figure">
 <p> <img src="../images/bandw/bw_0002.jpg" alt="Zoomed image." width="300" style="border:2px solid black;"></img></p>
 <p> <span class="figure-number">Figure 4: </span>Tangled</p>
</div>


 <div id="orgd5af6c4" class="figure">
 <p> <img src="../images/bandw/dasha_002.png" alt="Zoomed image." width="600" style="border:2px solid black;"></img></p>
 <p> <span class="figure-number">Figure 5: </span>The light shines on the righteous</p>
</div>


 <div id="org6d532c3" class="figure">
 <p> <img src="../images/bandw/bw_0003.jpg" alt="Zoomed image." width="300" style="border:2px solid black;"></img></p>
</div>


 <div id="orgad4d354" class="figure">
 <p> <img src="../images/bandw/bw_0004.jpg" alt="Zoomed image." width="300" style="border:2px solid black;"></img></p>
</div>


 <div id="orge4bc5d3" class="figure">
 <p> <img src="../images/bandw/bw_0005.jpg" alt="Zoomed image." width="400" style="border:2px solid black;"></img></p>
</div>


 <div id="org32c97da" class="figure">
 <p> <img src="../images/bandw/bw_0006.jpg" alt="Zoomed image." width="300" style="border:2px solid black;"></img></p>
</div>


 <div id="orgbe0a1a8" class="figure">
 <p> <img src="../images/bandw/bw_0007.jpg" alt="Zoomed image." width="600" style="border:2px solid black;"></img></p>
 <p> <span class="figure-number">Figure 10: </span>A man &amp; his dog, opposite sides of the canal and opposite direction of travel (yes, it was really his)</p>
</div>


 <div id="orgad55f55" class="figure">
 <p> <img src="../images/bandw/bw_0008.jpg" alt="Zoomed image." width="300" style="border:2px solid black;"></img></p>
</div>


 <div id="org1014bdb" class="figure">
 <p> <img src="../images/bandw/bw_0009.jpg" alt="Zoomed image." width="300" style="border:2px solid black;"></img></p>
</div>


 <div id="org25f5e8a" class="figure">
 <p> <img src="../images/bandw/bw_0010.jpg" alt="Zoomed image." width="300" style="border:2px solid black;"></img></p>
</div>
</div>]]></content>
  <link href="https://leehalls.net/docs/bandw.html"/>
  <id>https://leehalls.net/docs/bandw.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Photography - Colour</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Photography - Colour</h1>
 <p>
I never really liked colour photography, always thought it became dated too quickly but i know it can have impact and power. So these a are few of my colour images, nothing special but ones i’m prepared to share. Below the gallery i’ve picked out and titled ones’s i thought deserved more detail
</p>

 <p>
 <a href="colour_p2.html">Page 2</a>      -       <a href="colour_p3.html">Page 3</a>
</p>


 <div id="orge512fbd" class="figure">
 <p> <img src="../images/colour/C_ART_0050.jpg" alt="Zoomed image." width="600" style="border:2px solid black;"></img></p>
 <p> <span class="figure-number">Figure 1: </span>Crossing into the artic</p>
</div>


 <div id="org8159aaf" class="figure">
 <p> <img src="../images/colour/C_ART_0046.jpg" alt="Zoomed image." width="500" style="border:2px solid black;"></img></p>
 <p> <span class="figure-number">Figure 2: </span>Welcome to Hell</p>
</div>


 <div id="orga1c02cf" class="figure">
 <p> <img src="../images/colour/C_ART_0052.jpg" alt="Zoomed image." width="500" style="border:2px solid black;"></img></p>
</div>


 <div id="org5e7b921" class="figure">
 <p> <img src="../images/colour/C_ART_0047.jpg" alt="Zoomed image." width="400" style="border:2px solid black;"></img></p>
</div>


 <p>
 <a href="colour_p2.html">Page 2</a>      -       <a href="colour_p3.html">Page 3</a>
</p>
</div>]]></content>
  <link href="https://leehalls.net/docs/colour.html"/>
  <id>https://leehalls.net/docs/colour.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Photography - Colour - P2</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Photography - Colour - P2</h1>
 <p>
 <a href="colour.html">Page 1</a>      -       <a href="colour_p3.html">Page 3</a>
</p>


 <div id="org4eae1ee" class="figure">
 <p> <img src="../images/colour/C_ART_0062.jpg" alt="Zoomed image." width="300" style="border:2px solid black;"></img></p>
</div>


 <div id="org6ec747e" class="figure">
 <p> <img src="../images/colour/C_ART_0064.jpg" alt="Zoomed image." width="500" style="border:2px solid black;"></img></p>
</div>



 <div id="orgf29054e" class="figure">
 <p> <img src="../images/colour/ladybower_001.jpg" alt="Ladybower Reservoir" width="600" style="border:2px solid black;"></img></p>
 <p> <span class="figure-number">Figure 3: </span>Ladybower Reservoir</p>
</div>


 <div id="org640bca8" class="figure">
 <p> <img src="../images/colour/starling_2.jpg" alt="Zoomed image." width="400" style="border:2px solid black;"></img></p>
</div>


 <p>
 <a href="colour.html">Page 1</a>      -       <a href="colour_p3.html">Page 3</a>
</p>
</div>]]></content>
  <link href="https://leehalls.net/docs/colour_p2.html"/>
  <id>https://leehalls.net/docs/colour_p2.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Photography - Colour - P3</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Photography - Colour - P3</h1>
 <p>
 <a href="colour.html">Page 1</a>      -       <a href="colour_p2.html">Page 2</a>
</p>


 <div id="orgab3ff27" class="figure">
 <p> <img src="../images/colour/C_ART_0060.jpg" alt="Zoomed image." width="600" style="border:2px solid black;"></img></p>
 <p> <span class="figure-number">Figure 1: </span>Across the rail bridge somewhere in Scotland</p>
</div>



 <p>
 <a href="colour.html">Page 1</a>      -       <a href="colour_p2.html">Page 2</a>
</p>
</div>]]></content>
  <link href="https://leehalls.net/docs/colour_p3.html"/>
  <id>https://leehalls.net/docs/colour_p3.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Flask &amp; socketio</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Flask &amp; socketio</h1>
 <div id="table-of-contents" role="doc-toc">
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul> <li> <a href="#orga686bba">Realtime gauges using flask socketio</a></li>
 <li> <a href="#org174d7d3">Flask socketio</a>
 <ul> <li> <a href="#org2debd98">Setting up the socketio</a></li>
 <li> <a href="#orge001ea0">background thread</a></li>
 <li> <a href="#orgfa9bb82">route &amp; starting the app</a></li>
</ul></li>
 <li> <a href="#org5b8468e">the client</a></li>
</ul></div>
</div>
 <div id="outline-container-orga686bba" class="outline-2">
 <h2 id="orga686bba">Realtime gauges using flask socketio</h2>
 <div class="outline-text-2" id="text-orga686bba">
 <div class="info" id="org172da35">
 <p>
 <b>UPDATE  <span class="timestamp-wrapper"> <span class="timestamp">[2024-11-18 Mon]</span></span></b> all of this was written pre the requirement for virtual environments as is now the standard on the RPi although its not that different it just means an additional step.
</p>

</div>

 <p>
I've been running a home Pi based server that monitors electricity &amp; internal/external temperatures, for a longtime it was dumb ie I could view the data when I would ssh in or on graphs via a remote service but apart from email alerts for long term high electricity usage it was to all intents lacking.
</p>

 <p>
Then I found  <a href="https://canvas-gauges.com/">Canvas Gauges</a> by Mikhus … you could have radial or linear gauges with lots of customisation and  <i> <b>reactive</b></i> perfect!
</p>


 <div id="org59530b1" class="figure">
 <p> <img src="../images/imgs_socketio/2017-05-20 10_41_04-192.168.1.64 radioPi (RadioPi) - VNC Viewer.png" alt="2017-05-20 10_41_04-192.168.1.64 radioPi (RadioPi) - VNC Viewer.png"></img></p>
</div>

 <p>
Or so I thought, I could not get it working, 4wks of trying and I was going to give up, I had gauges - they worked but did not change value automatically so I ended up setting an HTML refresh to update every so often just to give me a dashboard which looked useful but I wasnt happy.
</p>

 <p>
Getting a gauge onto a page is simple, getting the gauge to be reactive well at the time that was beyond me, I searched for simple tutorials and all I found was chat apps … not what I wanted. With Python I usually figure out what I need to get there, websockets whoa and moving into javascript albeit simplistically was daunting and way more than I wanted for a few gauges. Eventually, whilst sat waiting in yet another airport for yet another flight I finally got the gauges reacting and updating in realtime. 
</p>

 <p>
Hopefully someone just starting with the Pi or any other flask based website will find this useful.
</p>

 <p>
Following this guide and downloading the  <a href="https://github.com/drakxtwo/gauges_flask_socketio">https://github.com/drakxtwo/gauges_flask_socketio</a> repository will ( <i>should</i>)get you a page with gauges that react like so;
</p>

 <p>
 <a href="../images/imgs_socketio/gauges_anim.mp4">../images/imgs_socketio/gauges_anim.mp4</a>
</p>
</div>
 <ul class="org-ul"> <li> <a id="org53c56a8"></a> <span class="todo TODO">TODO</span> gauges animation doesnt work <br></br> <div class="outline-text-5" id="text-org53c56a8">
 <p>
seems I've made an error the file has one movement where the gauges drop down in the last 3s whereas the original animation had several fluctuations to demonstrate the gauges perhaps my version control is crap. I really should look at using git properly
</p>
</div>
</li>
</ul></div>
 <div id="outline-container-org174d7d3" class="outline-2">
 <h2 id="org174d7d3">Flask socketio</h2>
 <div class="outline-text-2" id="text-org174d7d3">
 <div class="info" id="orgf02b0ba">
 <p>
I put this together from lots of sources, to be blunt  <b>it works</b>, however it is probably not pretty, could be improved and may yet have some errors.
</p>

</div>
 <p>
Every tutorial I've found covers chat programs but that was not what I wanted and I did not see how to translate the chat app into what I needed. To be fair the flask-socketio docs are good and they can be found here;  <a href="https://flask-socketio.readthedocs.io/en/latest/">https://flask-socketio.readthedocs.io/en/latest/</a> but my problem was not the pythonic side but the client side, setting up flask for socketio is as simple as any other library eg  <code>sudo pip install flask-socketio</code> and  <code>sudo pip install eventlet</code> then its a relatively simple task of following the instructions on the website.
</p>

 <p>
Below are parts of my sample code;
</p>
</div>
 <div id="outline-container-org2debd98" class="outline-3">
 <h3 id="org2debd98">Setting up the socketio</h3>
 <div class="outline-text-3" id="text-org2debd98">
 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="linenr">1: </span> <span class="org-variable-name">app</span>  <span class="org-operator">=</span> Flask( <span class="org-builtin">__name__</span>)
 <span class="linenr">2: </span>app. <span class="org-variable-name">config</span>[ <span class="org-string">'SECRET_KEY'</span>]  <span class="org-operator">=</span>  <span class="org-string">'secret!'</span>
 <span class="linenr">3: </span> <span class="org-variable-name">socketio</span>  <span class="org-operator">=</span> SocketIO(app, async_mode <span class="org-operator">=</span>async_mode)
 <span class="linenr">4: </span> <span class="org-variable-name">thread</span>  <span class="org-operator">=</span>  <span class="org-constant">None</span>
</code></pre>
</div>
</div>
</div>
 <div id="outline-container-orge001ea0" class="outline-3">
 <h3 id="orge001ea0">background thread</h3>
 <div class="outline-text-3" id="text-orge001ea0">
 <p>
This essentially sends the random values which move the gauges, normally you'd replace the random function with whatever data you want to send.
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="linenr"> 1: </span> <span class="org-keyword">def</span>  <span class="org-function-name">background_thread</span>():
 <span class="linenr"> 2: </span>     <span class="org-doc">&quot;&quot;&quot;Example of how to send server generated events to clients.&quot;&quot;&quot;</span>
 <span class="linenr"> 3: </span>     <span class="org-variable-name">ext</span> <span class="org-operator">=</span> <span class="org-variable-name">fr</span> <span class="org-operator">=</span> <span class="org-variable-name">kt</span> <span class="org-operator">=</span> <span class="org-variable-name">bd</span> <span class="org-operator">=</span> <span class="org-variable-name">elec</span> <span class="org-operator">=</span>0
 <span class="linenr"> 4: </span>     <span class="org-keyword">while</span>  <span class="org-constant">True</span>:
 <span class="linenr"> 5: </span>          socketio.sleep(2)
 <span class="linenr"> 6: </span>           <span class="org-variable-name">ext</span>  <span class="org-operator">=</span> randint( <span class="org-operator">-</span>10,30)
 <span class="linenr"> 7: </span>           <span class="org-variable-name">fr</span>  <span class="org-operator">=</span> randint(10,30)
 <span class="linenr"> 8: </span>           <span class="org-variable-name">kt</span>  <span class="org-operator">=</span> randint(10,30)
 <span class="linenr"> 9: </span>           <span class="org-variable-name">bd</span>  <span class="org-operator">=</span> randint(10,30)
 <span class="linenr">10: </span>           <span class="org-variable-name">elec</span>  <span class="org-operator">=</span> randint(0,8000)
 <span class="linenr">11: </span>
 <span class="linenr">12: </span>          socketio.emit( <span class="org-string">'my_response'</span>,
 <span class="linenr">13: </span>                        { <span class="org-string">'data'</span>: <span class="org-string">'Values'</span>,  <span class="org-string">'elec'</span>: elec, <span class="org-string">'ext'</span>: ext, <span class="org-string">'fr'</span>: fr, <span class="org-string">'kt'</span>: kt, <span class="org-string">'bd'</span>: bd},
 <span class="linenr">14: </span>                        namespace <span class="org-operator">=</span> <span class="org-string">'/carpi'</span>)
</code></pre>
</div>

 <p>
So you can see i'm sending four random temperature values and one electricity output, they are sent to the client via the socketio.emit line.
</p>
</div>
</div>
 <div id="outline-container-orgfa9bb82" class="outline-3">
 <h3 id="orgfa9bb82">route &amp; starting the app</h3>
 <div class="outline-text-3" id="text-orgfa9bb82">
 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="linenr"> 1: </span> <span class="org-variable-name">mesg</span>  <span class="org-operator">=</span>  <span class="org-string">'we are here...'</span>
 <span class="linenr"> 2: </span> <span class="org-type">@app.route</span>( <span class="org-string">'/'</span>)
 <span class="linenr"> 3: </span> <span class="org-keyword">def</span>  <span class="org-function-name">index</span>():
 <span class="linenr"> 4: </span>     <span class="org-variable-name">speed</span>  <span class="org-operator">=</span> randint(0,133)
 <span class="linenr"> 5: </span>     <span class="org-variable-name">templateData</span> <span class="org-operator">=</span>{
 <span class="linenr"> 6: </span>           <span class="org-string">'mesg'</span> :mesg,
 <span class="linenr"> 7: </span>           <span class="org-string">'speed'</span> :speed
 <span class="linenr"> 8: </span>    }
 <span class="linenr"> 9: </span>     <span class="org-keyword">return</span> render_template( <span class="org-string">'trial3.html'</span>, async_mode <span class="org-operator">=</span>socketio.async_mode,  <span class="org-operator">**</span>templateData)
 <span class="linenr">10: </span>
 <span class="linenr">11: </span> <span class="org-type">@socketio.on</span>( <span class="org-string">'connect'</span>, namespace <span class="org-operator">=</span> <span class="org-string">'/carpi'</span>)
 <span class="linenr">12: </span> <span class="org-keyword">def</span>  <span class="org-function-name">test_connect</span>():
 <span class="linenr">13: </span>     <span class="org-keyword">global</span> thread
 <span class="linenr">14: </span>     <span class="org-keyword">if</span> thread  <span class="org-keyword">is</span>  <span class="org-constant">None</span>:
 <span class="linenr">15: </span>           <span class="org-variable-name">thread</span>  <span class="org-operator">=</span> socketio.start_background_task(target <span class="org-operator">=</span>background_thread)
 <span class="linenr">16: </span>
 <span class="linenr">17: </span> <span class="org-keyword">if</span>  <span class="org-builtin">__name__</span>  <span class="org-operator">==</span>  <span class="org-string">'__main__'</span>:
 <span class="linenr">18: </span>    socketio.run(app, debug <span class="org-operator">=</span> <span class="org-constant">True</span>)
 <span class="linenr">19: </span>
</code></pre>
</div>

 <p>
The above is the main part of the simple flask app as you can see we define the normal routes but render the template with an additional &quot;switch&quot; (async <sub>mode</sub>), and start the background thread that calls the random number generator.
</p>
</div>
</div>
</div>
 <div id="outline-container-org5b8468e" class="outline-2">
 <h2 id="org5b8468e">the client</h2>
 <div class="outline-text-2" id="text-org5b8468e">
 <p>
The client is simply an HTML page which loads the relevant libraries for displaying the gauges, working with socketio and jquery. If you've downloaded my git files and run it you should see a page resembling;
</p>


 <div id="orgd447d8c" class="figure">
 <p> <img src="../images/imgs_socketio/2017-05-19 18_09_21-LEE Gauge Test.png" alt="2017-05-19 18_09_21-LEE Gauge Test.png"></img></p>
</div>

 <p>
You can see what mode socketio is running in, a list of values being transmitted and the gauges. The main crux of this is done in the header
</p>

 <div class="org-src-container">
 <pre class="src src-javascript"> <code> <span class="linenr"> 1: </span>&lt;script src= <span class="org-string">&quot;static/gauge.min.js&quot;</span>&gt;&lt;/script&gt;
 <span class="linenr"> 2: </span>&lt;script type= <span class="org-string">&quot;text/javascript&quot;</span> src= <span class="org-string">&quot;static/jquery-3.2.1.min.js&quot;</span>&gt;&lt;/script&gt;
 <span class="linenr"> 3: </span>&lt;script type= <span class="org-string">&quot;text/javascript&quot;</span> src= <span class="org-string">&quot;static/socket.io-1.3.5.min.js&quot;</span>&gt;&lt;/script&gt;
 <span class="linenr"> 4: </span>&lt;script type= <span class="org-string">&quot;text/javascript&quot;</span> charset= <span class="org-string">&quot;utf-8&quot;</span>&gt;
 <span class="linenr"> 5: </span>   <span class="org-keyword">var</span>  <span class="org-variable-name">mycount</span> = 66;
 <span class="linenr"> 6: </span>   <span class="org-keyword">var</span>  <span class="org-variable-name">myData</span> = {};
 <span class="linenr"> 7: </span>   <span class="org-keyword">var</span>  <span class="org-variable-name">testc</span> = 10;
 <span class="linenr"> 8: </span>  $(document).ready( <span class="org-keyword">function</span>() {
 <span class="linenr"> 9: </span>  namespace =  <span class="org-string">'/carpi'</span>;
 <span class="linenr">10: </span>       <span class="org-keyword">var</span>  <span class="org-variable-name">socket</span> = io.connect(location.protocol +  <span class="org-string">'//'</span> + document.domain +  <span class="org-string">':'</span> + location.port + namespace);    
 <span class="linenr">11: </span>      socket.on( <span class="org-string">'connect'</span>,  <span class="org-keyword">function</span>() {
 <span class="linenr">12: </span>           socket.emit( <span class="org-string">'my_event'</span>, {data:  <span class="org-string">'I\'m connected!'</span>});
 <span class="linenr">13: </span>      });
 <span class="linenr">14: </span>      socket.on( <span class="org-string">'my_response'</span>,  <span class="org-keyword">function</span>( <span class="org-variable-name">msg</span>) {
 <span class="linenr">15: </span>          $( <span class="org-string">'#values'</span>).html(msg.count)
 <span class="linenr">16: </span>  $( <span class="org-string">'#log'</span>).append( <span class="org-string">'&lt;br&gt;'</span> + $( <span class="org-string">'&lt;div/&gt;'</span>).text( <span class="org-string">'Received #'</span> + msg.data +  <span class="org-string">': '</span> + msg.count).html())
 <span class="linenr">17: </span>   <span class="org-keyword">var</span>  <span class="org-variable-name">elec</span> = msg.elec
 <span class="linenr">18: </span>   <span class="org-keyword">var</span>  <span class="org-variable-name">external</span> = msg.ext
 <span class="linenr">19: </span>   <span class="org-keyword">var</span>  <span class="org-variable-name">frontroom</span> = msg.fr
 <span class="linenr">20: </span>   <span class="org-keyword">var</span>  <span class="org-variable-name">kitchen</span> = msg.kt
 <span class="linenr">21: </span>   <span class="org-keyword">var</span>  <span class="org-variable-name">bedroom</span> = msg.bd
 <span class="linenr">22: </span>
 <span class="linenr">23: </span>  extGauge.value = external
 <span class="linenr">24: </span>  frontroomGauge.value = frontroom
 <span class="linenr">25: </span>  kitchenGauge.value = kitchen
 <span class="linenr">26: </span>  bedroomGauge.value = bedroom
 <span class="linenr">27: </span>  elecGauge.value = elec
 <span class="linenr">28: </span>        });
 <span class="linenr">29: </span>   });
 <span class="linenr">30: </span>&lt;/script&gt;
</code></pre>
</div>


 <p>
To set up the canvas gauges eg
</p>


 <div id="orge5a9799" class="figure">
 <p> <img src="../images/imgs_socketio/2017-05-19 15_48_20-LEE Gauge Test.png" alt="2017-05-19 15_48_20-LEE Gauge Test.png"></img></p>
</div>

 <p>
we write the code in two sections the first simply calls the gauge
</p>

 <div class="org-src-container">
 <pre class="src src-html"> <code>&lt; <span class="org-function-name">canvas</span>  <span class="org-variable-name">id</span>= <span class="org-string">&quot;external-temp&quot;</span>&gt;  &lt;/ <span class="org-function-name">canvas</span>&gt;
</code></pre>
</div>

 <p>
the second controls all the parameters that design the gauge.
</p>

 <div class="org-src-container">
 <pre class="src src-javascript"> <code>&lt;script&gt;
   <span class="org-keyword">var</span>  <span class="org-variable-name">extGauge</span> =  <span class="org-keyword">new</span>  <span class="org-type">RadialGauge</span>({
  renderTo:  <span class="org-string">'external-temp'</span>,
  width: 150,
  height: 150,
  units:  <span class="org-string">&quot;Deg&quot;</span>,
  minValue: -10,
  maxValue: 30,
  majorTicks: [
       <span class="org-string">&quot;-10&quot;</span>,
       <span class="org-string">&quot;5&quot;</span>,
       <span class="org-string">&quot;0&quot;</span>,
       <span class="org-string">&quot;5&quot;</span>,
       <span class="org-string">&quot;10&quot;</span>,
       <span class="org-string">&quot;15&quot;</span>,
       <span class="org-string">&quot;20&quot;</span>,
       <span class="org-string">&quot;25&quot;</span>,
       <span class="org-string">&quot;30&quot;</span>
  ],
  minorTicks: 5,
  strokeTicks:  <span class="org-constant">true</span>,
  highlights: [
  { from: -10, to: 0, color:  <span class="org-string">'rgba(25,0, 168, .8)'</span>},
  { from: 0, to: 5, color:  <span class="org-string">'rgba(47, 15, 224, .7)'</span>},
  { from: 5, to: 15, color:  <span class="org-string">'rgba(47, 15, 247, .6)'</span>},
  { from: 15, to: 18, color:  <span class="org-string">'rgba(0, 204, 61, .8)'</span>},
  { from: 18, to: 22, color:  <span class="org-string">'rgba(0, 204, 61, .8)'</span>},
  { from: 22, to: 26, color:  <span class="org-string">'rgba(247, 151, 7, .5)'</span>},
  { from: 26, to: 30, color:  <span class="org-string">'rgba(247, 31, 7, .5)'</span>}
  ],
colorPlate:  <span class="org-string">&quot;#fff&quot;</span>,
borderShadowWidth: 0,
borders:  <span class="org-constant">false</span>,
needleType:  <span class="org-string">&quot;arrow&quot;</span>,
needleWidth: 3,
needleCircleSize: 10,
needleCircleOuter:  <span class="org-constant">true</span>,
needleCircleInner:  <span class="org-constant">false</span>,
animationDuration: 1500,
animationRule:  <span class="org-string">&quot;linear&quot;</span>
})
  extGauge.draw();
&lt;/script&gt;
</code></pre>
</div>

 <p>
And that is pretty much it, start the app, open a web-browser and point at 127.0.0.1:5000 and voila…. You should have some reasonable looking gauges that update automatically, for me the next part is re-writing the &quot;dragelec&quot; app to use websockets etc and then changing the client to cope. Thats the easy part, now go tweak :)
</p>
</div>
</div>
</div>]]></content>
  <link href="https://leehalls.net/docs/flask_socketio.html"/>
  <id>https://leehalls.net/docs/flask_socketio.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Photography - Life &amp; Death</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Photography - Life &amp; Death</h1>
 <p>
A year or two ago i was sat in the kitchen when i heard an awful sound from the front garden, I raced to open the door and intervene unsure of what it was and there right in front of me were the two combatants literally right on the doorstep.
</p>

 <p>
At my appearance they momentarily paused combat and both sets of eyes fixed on mine, gingerly I backed away and shut the door leaving them to their struggle. Thinking it was a waste as i had disturbed them mid-fight i raced for my camera, knowing the whole thing could be over in seconds with the escape of one and I was keen to get at least one semi blurry photo its not often you can get that close to nature whilst still being at home, so i swapped lenses and leant out the upstairs window.
</p>

 <p>
The following photos are the best from over a hundred and fifty shots i took spanning a battle which lasted nearly 30 minutes.
</p>

 <p>
The quality is poor i admit but when leaning out of a window on full zoom with no tripod or support for the camera or me! I’m happy with them and they capture a moment i never thought to witness in the wild let alone in my garden.
</p>


 <div id="org5f6e2fd" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_001.jpg" alt="LifeDeath_001.jpg"></img></p>
</div>


 <div id="org302c6aa" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_002.jpg" alt="LifeDeath_002.jpg"></img></p>
</div>


 <div id="org7959e51" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_003.jpg" alt="LifeDeath_003.jpg"></img></p>
</div>


 <div id="org8bfe054" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_004.jpg" alt="LifeDeath_004.jpg"></img></p>
</div>


 <div id="orgdbbde68" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_005.jpg" alt="LifeDeath_005.jpg"></img></p>
</div>


 <div id="org0630c00" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_006.jpg" alt="LifeDeath_006.jpg"></img></p>
</div>


 <div id="org6de453e" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_007.jpg" alt="LifeDeath_007.jpg"></img></p>
</div>


 <div id="orgb7db7f7" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_008.jpg" alt="LifeDeath_008.jpg"></img></p>
</div>


 <div id="orge698f56" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_009.jpg" alt="LifeDeath_009.jpg"></img></p>
</div>


 <div id="org2e59ea9" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_010.jpg" alt="LifeDeath_010.jpg"></img></p>
</div>


 <div id="orgb7741a1" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_011.jpg" alt="LifeDeath_011.jpg"></img></p>
</div>


 <div id="orgac925a0" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_012.jpg" alt="LifeDeath_012.jpg"></img></p>
</div>
</div>]]></content>
  <link href="https://leehalls.net/docs/lifeanddeath.html"/>
  <id>https://leehalls.net/docs/lifeanddeath.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Logbook</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Logbook</h1>
 <p>
A few pages from 1990 my logbook of apprenticeship days
</p>


 <div id="org7ddc589" class="figure">
 <p> <img src="../images/logbook/CCI30082013.jpg" alt="CCI30082013.jpg"></img></p>
</div>


 <div id="org37201c4" class="figure">
 <p> <img src="../images/logbook/CCI30082013_2.jpg" alt="CCI30082013_2.jpg"></img></p>
</div>


 <div id="org792c9c0" class="figure">
 <p> <img src="../images/logbook/CCI30082013_3.jpg" alt="CCI30082013_3.jpg"></img></p>
</div>
</div>]]></content>
  <link href="https://leehalls.net/docs/logbook.html"/>
  <id>https://leehalls.net/docs/logbook.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Projects &amp; notes</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Projects &amp; notes</h1>
 <div id="table-of-contents" role="doc-toc">
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul> <li> <a href="#org9a1fbde">Flask &amp; socketio</a></li>
 <li> <a href="#org3c4a149">Snippets - RaspberryPi</a></li>
 <li> <a href="#org75ec81c">Logbook</a></li>
</ul></div>
</div>
 <p>
A grandiose terms to describe the things I've either worked on ( <a href="flask_socketio.html">reactive gauges</a>) or am working on or other topics which require more detail and a permanent home than simply a post.
</p>
 <div id="outline-container-org9a1fbde" class="outline-2">
 <h2 id="org9a1fbde"> <a href="flask_socketio.html">Flask &amp; socketio</a></h2>
 <div class="outline-text-2" id="text-org9a1fbde">
 <p>
Ever wanted realtime, reactive gauges? this is a  <a href="flask_socketio.html">write-up</a> on how I achieved just that using flask, socketio &amp; canvas gauges.
</p>
</div>
</div>
 <div id="outline-container-org3c4a149" class="outline-2">
 <h2 id="org3c4a149"> <a href="pi_snippets.html">Snippets - RaspberryP</a>i</h2>
 <div class="outline-text-2" id="text-org3c4a149">
 <p>
A long out of date file of code snippets and info for use with a Raspberry Pi, some will be irrelevant, some may still be of use.
</p>
</div>
</div>
 <div id="outline-container-org75ec81c" class="outline-2">
 <h2 id="org75ec81c"> <a href="logbook.html">Logbook</a></h2>
 <div class="outline-text-2" id="text-org75ec81c">
 <p>
A few pages from my apprenticeship days, handwriting was much neater back then!
</p>
</div>
</div>
</div>]]></content>
  <link href="https://leehalls.net/docs/notes.html"/>
  <id>https://leehalls.net/docs/notes.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Photography</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Photography</h1>
 <div id="table-of-contents" role="doc-toc">
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul> <li> <a href="#org086d8af">Black &amp; White</a></li>
 <li> <a href="#orgdab8812">Colour</a></li>
 <li> <a href="#org12b95b9">Life &amp; Death - the struggle</a></li>
</ul></div>
</div>
 <p>
A long time ago I fell in love with photography, worked my way through several cameras upto an EOS 1N before finally scaling everything back, a passion which as with a lot of things died overtime. I still pick up the camera and you'll see the results of that throughout this blog but not with the same fervour.
</p>
 <div id="outline-container-org086d8af" class="outline-2">
 <h2 id="org086d8af"> <a href="bandw.html">Black &amp; White</a></h2>
 <div class="outline-text-2" id="text-org086d8af">
 <p>
I am neither an Ansel Adams <sup> <a id="fnr.1" class="footref" href="#fn.1" role="doc-backlink">1</a></sup> nor a Bob Carlos Clarke <sup> <a id="fnr.2" class="footref" href="#fn.2" role="doc-backlink">2</a></sup>, if only, but I developed a passion for photography, especially black &amp; white. Over twenty years ago I dumped being a fulltime computer geek (a mistake) and dove into photography, converting a room into a full chemical based dark room.
</p>


 <div id="orge4f7350" class="figure">
 <p> <img src="../images/bandw/bw_0007.jpg" alt="bw_0007.jpg"></img></p>
</div>
</div>
</div>
 <div id="outline-container-orgdab8812" class="outline-2">
 <h2 id="orgdab8812"> <a href="colour.html">Colour</a></h2>
 <div class="outline-text-2" id="text-orgdab8812">
 <p>
I never really liked colour photography, always thought it became dated too quickly but i know it can have impact and power. So these a are few of my colour images, nothing special but ones i’m prepared to share. Below the gallery i’ve picked out and titled ones’s i thought deserved more detail
</p>


 <div id="orgc231ea1" class="figure">
 <p> <img src="../images/colour/ladybower_001.jpg" alt="ladybower_001.jpg"></img></p>
</div>
</div>
</div>
 <div id="outline-container-org12b95b9" class="outline-2">
 <h2 id="org12b95b9"> <a href="lifeanddeath.html">Life &amp; Death - the struggle</a></h2>
 <div class="outline-text-2" id="text-org12b95b9">
 <p>
A year or two ago i was sat in the kitchen when i heard an awful sound from the front garden, I raced to open the door and intervene unsure of what it was and there right in front of me were the two combatants literally right on the doorstep
</p>


 <div id="orgce9f150" class="figure">
 <p> <img src="../images/lifedeath/LifeDeath_005.jpg" alt="LifeDeath_005.jpg"></img></p>
</div>
</div>
</div>
 <div id="footnotes">
 <h2 class="footnotes">Footnotes: </h2>
 <div id="text-footnotes">

 <div class="footdef"> <sup> <a id="fn.1" class="footnum" href="#fnr.1" role="doc-backlink">1</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
Ansel Adams is famous for his photographs of the great american landscape ( <i>_it was these that made me want to try landscape photography</i>) but he not only photographed landscapes but as with many great photographers was able to capture many subjects including a period in history which some try to destroy evidence of. (ref:  <a href="https://en.wikipedia.org/wiki/Manzanar">Manzanar</a> )
</p></div></div>

 <div class="footdef"> <sup> <a id="fn.2" class="footnum" href="#fnr.2" role="doc-backlink">2</a></sup> <div class="footpara" role="doc-footnote"> <p class="footpara">
 <a href="https://www.google.com/search?num=10&amp;sca_esv=7e6a266c6397ec49&amp;rlz=1C5CHFA_enGB1033GB1033&amp;sxsrf=APpeQntHcNfpiJNpYCVFvWt44zej_6qKmA:1787553107722&amp;udm=2&amp;fbs=ABfTbFVyMZGZf1hfvX9uKjN_-G8c4u0nXx4bEIpwm1lnNH832VstEKsVDqPorK0Gahnm2nq-aQnTz_mBV-EZYISbLc-StUIq_PhL7hb0Qt0YiIGOHkJjnTZ-cOFt4MBdBh9xxUSVRKmiEusZuD8DlVlOopefaU3mIem7eOlDG-R0QsifrPwvO2bkMKxXEnItRCG5U4DB58oSckFcnsRHkxOsYEDxVUZ1Jw&amp;q=bob+carlos+clarke&amp;sa=X&amp;ved=2ahUKEwipvIKg0riWAxXfXEEAHRv4G5wQtKgLegQIJBAB&amp;biw=1248&amp;bih=678&amp;dpr=2">Bob Carlos Clarke</a> known for erotica but definitely not limited to it ( <i>i tried and failed at that</i>) 
</p></div></div>


</div>
</div></div>]]></content>
  <link href="https://leehalls.net/docs/photos.html"/>
  <id>https://leehalls.net/docs/photos.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Raspberry Pi snippets &amp; code info</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Raspberry Pi snippets &amp; code info</h1>
 <div id="table-of-contents" role="doc-toc">
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul> <li> <a href="#orgb842ad8">Various code examples &amp; notes for the raspberry pi</a>
 <ul> <li>
 <ul> <li> <a href="#org8565c85">Working with files</a></li>
 <li> <a href="#org4f78055">PiDisplay</a></li>
 <li> <a href="#orga939513">Audio</a></li>
 <li> <a href="#org3815651">bash</a></li>
 <li> <a href="#orgfbaf2d1">misc</a></li>
 <li> <a href="#org8dad060">crontab</a></li>
 <li> <a href="#org8d4715d">network</a></li>
 <li> <a href="#org595d1d7">access a network drive</a></li>
 <li> <a href="#org562c857">ssh file system</a></li>
 <li> <a href="#org1cba7ad">python ping</a></li>
 <li> <a href="#org3660256">emacs</a></li>
 <li> <a href="#org9817a22">camera    <span class="tag"> <span class="camera">camera</span></span></a></li>
</ul></li>
</ul></li>
</ul></div>
</div>
 <div id="outline-container-orgb842ad8" class="outline-2">
 <h2 id="orgb842ad8">Various code examples &amp; notes for the raspberry pi</h2>
 <div class="outline-text-2" id="text-orgb842ad8">
 <hr></hr> <p>
 <b>UPDATE:  <span class="timestamp-wrapper"> <span class="timestamp">[2024-11-18 Mon]</span></span></b> These all were relevant when the RPi first arrived, given all the changes, updates etc some may no longer work but I leave them here as a reference
</p>
 <hr></hr> <p>
Various things i've found useful for my projects using raspberry pi's, covers things from turning the red light off on the camera to kiosk mode for Chrome. Most of these were initially done under Raspbian - Jessie and may not work uner the latest Buster.
</p>

 <p>
Everything here can be downloaded in the original org-mode format:  <a href="http:/orgfiles/pi_snippets.txt">Snippets of code</a> because of the way hugo interprets org files i've had to save it with a  <i>txt</i> extension for the link to work. If you want to view the file in emacs/org then simply change the extension to  <i>org</i> instead of  <i>txt</i> or copy and paste.
</p>
</div>
 <div id="outline-container-org8565c85" class="outline-4">
 <h4 id="org8565c85">Working with files</h4>
 <div class="outline-text-4" id="text-org8565c85">
</div>
 <ul class="org-ul"> <li> <a id="orgf5c91b8"></a>read csv and create an array variable <br></br> <div class="outline-text-5" id="text-orgf5c91b8">
 <p>
So the following tries to open a csv file and store in the array  <code>SensorValues</code> the contents of each row, if it fails to open the file it simply stores an arbitrary value
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-comment-delimiter"># </span> <span class="org-comment">read in stored values &amp; initialise preset values
</span> <span class="org-keyword">import</span> csv
 <span class="org-keyword">try</span>:
     <span class="org-keyword">with</span>  <span class="org-builtin">open</span>( <span class="org-string">'/tmp/tmpvalues.csv'</span>,  <span class="org-string">'r'</span>)  <span class="org-keyword">as</span> csvfile:
         <span class="org-variable-name">fileRead</span>  <span class="org-operator">=</span> csv.reader(csvfile, delimiter <span class="org-operator">=</span> <span class="org-string">','</span>)
         <span class="org-keyword">for</span> row  <span class="org-keyword">in</span> fileRead:
             <span class="org-variable-name">SensorValues</span>  <span class="org-operator">=</span> [ <span class="org-builtin">float</span>(x)  <span class="org-keyword">for</span> x  <span class="org-keyword">in</span> row  <span class="org-keyword">if</span> x  <span class="org-operator">!=</span>  <span class="org-string">''</span>]
 <span class="org-keyword">except</span>:
     <span class="org-variable-name">SensorValues</span>  <span class="org-operator">=</span> (
        66.00,
        66.00,
        66.00,
        66.00,
        66.00,
        66.00,
        66.00,
        66.00,
        66.00,
        66.00)
</code></pre>
</div>
</div>
</li>
 <li> <a id="orgf89a514"></a>credential file <br></br> <div class="outline-text-5" id="text-orgf89a514">
 <p>
If you dont want to store your login details in a python script, for example if you want to share that script you dont want to give people you password do you? So you can create a file credentials file eg
</p>

 <p>
 <code>emacs -nw credentials.py</code>
</p>

 <p>
Then type in the following;
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-comment-delimiter"># </span> <span class="org-comment">email login details
</span> <span class="org-variable-name">em_login</span>  <span class="org-operator">=</span> {
     <span class="org-string">'smtpdata'</span>:  <span class="org-string">'smtp.server.address'</span>,
     <span class="org-string">'login'</span>:  <span class="org-string">'login.address'</span>,
     <span class="org-string">'password'</span>:  <span class="org-string">'login.password'</span>,
     <span class="org-string">'toemail'</span>:  <span class="org-string">'send.to.email.address'</span>
}
 <span class="org-comment-delimiter"># </span> <span class="org-comment">initial state details
</span> <span class="org-variable-name">in_login</span>  <span class="org-operator">=</span> {
     <span class="org-string">'login'</span>:  <span class="org-string">'login.address'</span>,
     <span class="org-string">'password'</span>:  <span class="org-string">'login.password'</span>,
     <span class="org-string">'accesskey'</span>:  <span class="org-string">'access.key'</span>,
     <span class="org-string">'bucketname'</span>:  <span class="org-string">'monitorhome'</span>,
     <span class="org-string">'bucketkey'</span>:  <span class="org-string">'bucket.key'</span>
}
</code></pre>
</div>

 <p>
now call this file as a module in the main code and assign to your chosen variable
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">import</span> credentials

 <span class="org-variable-name">empassword</span>  <span class="org-operator">=</span> credentials.em_login[ <span class="org-string">'password'</span>]
 <span class="org-variable-name">inpassword</span>  <span class="org-operator">=</span> credentials.in_login[ <span class="org-string">'password'</span>]

 <span class="org-builtin">print</span>( <span class="org-string">&quot;email password:&quot;</span>, empassword)
 <span class="org-builtin">print</span>( <span class="org-string">&quot;initial password:&quot;</span>, inpassword)
</code></pre>
</div>
</div>
</li>
 <li> <a id="org9aa1c9b"></a>convert windows CR (carriage returns) to linux <br></br> <div class="outline-text-5" id="text-org9aa1c9b">
 <p>
 <code>sed -i 's/\r//' filename</code>
</p>

 <p>
Use with care it could destroy your file, it might be better to the dos2unix utility
</p>
</div>
</li>
</ul></div>
 <div id="outline-container-org4f78055" class="outline-4">
 <h4 id="org4f78055">PiDisplay</h4>
 <div class="outline-text-4" id="text-org4f78055">
 <p>
Notes on using the offical pi touch screen
</p>
</div>
 <ul class="org-ul"> <li> <a id="orgf659496"></a>rotate official display <br></br> <div class="outline-text-5" id="text-orgf659496">
 <p>
Useful if the display case you've bought has a fixed orientation;
</p>

 <p>
edit your  <code>/boot/config.txt</code> file, and add the following line:
</p>

 <p>
 <code>lcd_rotate=2</code>
</p>
</div>
</li>
 <li> <a id="org1e8a410"></a>onscreen keyboard <br></br> <div class="outline-text-5" id="text-org1e8a410">
 <p>
You can install an onscreen keyboard by;
</p>

 <p>
 <code>sudo apt-get install florence</code>
</p>

 <p>
or 
</p>

 <p>
 <code>sudo apt-get install matchbox-keyboard</code>
</p>

 <p>
then reboot, to access the keyboard click on menu/accessories/keyboard
</p>
</div>
</li>
 <li> <a id="org26d81a5"></a>get backlight status <br></br> <div class="outline-text-5" id="text-org26d81a5">
 <p>
Weirdly ( <i>at least i think so</i>) it's  <b>0</b> for on and  <b>1</b> for off and script must be run as root
</p>
 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-comment-delimiter">#</span> <span class="org-comment">!/usr/bin/env python3
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">gets current backlight state
</span> <span class="org-variable-name">file</span> <span class="org-operator">=</span> <span class="org-builtin">open</span>( <span class="org-string">'/sys/devices/platform/rpi_backlight/backlight/rpi_backlight/bl_power'</span>, <span class="org-string">'r+'</span>)
 <span class="org-variable-name">current_status</span> <span class="org-operator">=</span> <span class="org-builtin">int</span>(file.read(1))

 <span class="org-builtin">print</span>(current_status)
</code></pre>
</div>
</div>
</li>
 <li> <a id="org42567e6"></a>kiosk mode <br></br> <div class="outline-text-5" id="text-org42567e6">
 <p>
Kiosk mode runs your internet browser full screen useful for setting up a display system. Modify the  <b>/etc/xdg/lxsession/LXDE/autostart</b> file or if using the NOOBS installation  <b>/etc/xdg/lxsession/LXDE-pi/autostart</b>
</p>
 <div class="org-src-container">
 <pre class="src src-bash"> <code>@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@point-rpi

@xset s noblank
@xset s off
@xset -dpms

@chromium-browser --noerrdialogs --kiosk http://127.0.0.1:5000 --incognito --disable-translate
</code></pre>
</div>

 <p>
 <b>BE AWARE</b> if the following file exists then it overrides any other files so the @chromium command must go in here.
</p>

 <p>
 <code>nano .config/lxsession/LXDE-pi/autostart</code>
</p>

 <p>
so edit it to show the line;
</p>

 <p>
 <code>@chromium-browser --noerrdialogs --kiosk http://127.0.0.1:5000 --incognito --disable-translate</code>
</p>

 <p>
so my file reads;
</p>

 <div class="org-src-container">
 <pre class="src src-bash"> <code>@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash
@point-rpi
@chromium-browser --noerrdialogs --kiosk http://127.0.0.1:5000 --incognito --disable-translate
</code></pre>
</div>
</div>
</li>
</ul></div>
 <div id="outline-container-orga939513" class="outline-4">
 <h4 id="orga939513">Audio</h4>
 <div class="outline-text-4" id="text-orga939513">
</div>
 <ul class="org-ul"> <li> <a id="org3ad8f04"></a>Enabling Audio Output <br></br> <div class="outline-text-5" id="text-org3ad8f04">
 <p>
By default, the RPi audio output is set to automatically select the digital HDMI interface if its being used, otherwise the analog audio output. You can force it to use a specific interface via the sound mixer controls.  amixer allows command-line control of the mixer for the ALSA driver.
</p>

 <p>
You can force the RPi to use a specific interface using the command amixer cset numid=3 N where the N parameter means the following:
</p>

 <ul class="org-ul"> <li>0=auto</li>
 <li>1=analog</li>
 <li>2=hdmi</li>
</ul> <p>
Therefore, to force the Raspberry Pi to use the analog output:
</p>

 <p>
 <code>amixer cset numid=3 1</code>
</p>
</div>
</li>
 <li> <a id="orgc83fed0"></a>How to play Internet radio on your Raspberry PI (mpd/mpc) <br></br> <div class="outline-text-5" id="text-orgc83fed0">
 <p>
first make sure your audio is working, using the ALSA package
</p>

 <p>
install the mpd and mpc packages:
</p>

 <p>
 <code>sudo apt-get install mpd mpc</code>
</p>

 <p>
change the permissions of mpd (just to make sure):
</p>

 <p>
 <code>sudo service mpd stop</code>
 <code>sudo chmod -R g+w /var/lib/mpd</code>
 <code>sudo chmod -R g+w /var/run/mpd</code>
</p>

 <p>
make a change to the mpd config file /etc/mpd.conf
</p>

 <p>
 <code>sudo nano /etc/mpd.conf</code>
</p>

 <p>
Note all the sites i visited suggested that it was simply commenting OUT the line:
</p>

 <p>
 <code>bind_to_address &quot;localhost&quot;</code>
</p>

 <p>
however i had many issues and nothing seemed to work until i had the conf file set as follows;
</p>

 <div class="org-src-container">
 <pre class="src src-shell"> <code> <span class="org-comment-delimiter"># </span> <span class="org-comment">bind_to_address &quot;localhost&quot;
</span>bind_to_address  <span class="org-string">&quot;127.0.0.1&quot;</span>
port  <span class="org-string">&quot;6600&quot;</span>
</code></pre>
</div>

 <p>
shutdown/reboot your Raspberry PI after it's up and running again add an Internet radio URL, for instance:
</p>

 <ul class="org-ul"> <li> <code>mpc add http://icecast.omroep.nl/3fm-bb-mp3</code></li>
</ul> <p>
to start playing the stream type:
</p>

 <ul class="org-ul"> <li> <code>mpc play</code></li>
</ul> <p>
The other thing to be aware of is you may need to download the radio stations m3u playlist file and open it to extract the direct URL of the stream ( <i>i had to</i>) so the stream i needed was;
</p>

 <p>
 <code>http://stream4.nadaje.com:11986/prs</code>
</p>

 <p>
then save that into MY OWN m3u playlist for for the MPD daemon to work.
</p>
</div>
</li>
 <li> <a id="org9b5661f"></a>python check if mpc is playing <br></br> <div class="outline-text-5" id="text-org9b5661f">
 <div class="org-src-container">
 <pre class="src src-python" id="org908fbec"> <code> <span class="org-keyword">from</span> mpd  <span class="org-keyword">import</span> MPDClient

 <span class="org-variable-name">client</span> <span class="org-operator">=</span>MPDClient()
client. <span class="org-variable-name">idletimeout</span>  <span class="org-operator">=</span>  <span class="org-constant">None</span>           <span class="org-comment-delimiter"># </span> <span class="org-comment">timeout for fetching the result of the idle command is handled seperately, default: None
</span>client.connect( <span class="org-string">&quot;localhost&quot;</span>, 6600)   <span class="org-comment-delimiter"># </span> <span class="org-comment">connect to localhost:6600
</span> <span class="org-builtin">print</span>(client.mpd_version)

 <span class="org-keyword">if</span> client.status()[ <span class="org-string">'state'</span>]  <span class="org-keyword">in</span> ( <span class="org-string">'play'</span>,  <span class="org-string">'pause'</span>):
     <span class="org-builtin">print</span>( <span class="org-string">'Playing'</span>)
 <span class="org-keyword">else</span>:
     <span class="org-builtin">print</span>( <span class="org-string">'stopped'</span>)

</code></pre>
</div>
</div>
</li>
</ul></div>
 <div id="outline-container-org3815651" class="outline-4">
 <h4 id="org3815651">bash</h4>
 <div class="outline-text-4" id="text-org3815651">
</div>
 <ul class="org-ul"> <li> <a id="org859aa5d"></a>alias <br></br> <div class="outline-text-5" id="text-org859aa5d">
 <p>
for example if you get tired of typing emacs -nw to start emacs without a gui window then add
</p>

 <p>
 <code>alias enw='emacs -nw'</code>
</p>

 <p>
to the end of your .profile or .bashrc file located at /home or /home/usr
</p>
</div>
</li>
</ul></div>
 <div id="outline-container-orgfbaf2d1" class="outline-4">
 <h4 id="orgfbaf2d1">misc</h4>
 <div class="outline-text-4" id="text-orgfbaf2d1">
</div>
 <ul class="org-ul"> <li> <a id="org693839a"></a>Display system's serial support <br></br> <div class="outline-text-5" id="text-org693839a">
 <p>
 <code>dmesg | grep tty</code>
</p>

 <p>
resulting output resembles;
</p>
 <div class="org-src-container">
 <pre class="src src-bash"> <code>pi@raspberrypi:~/xbee $ dmesg | grep tty
[    0.000000] Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2708.boardrev=0x3 bcm2708.serial=0xf83a1e37 smsc95xx.macaddr=B8:27:EB:3A:1E:37 bcm2708_fb.fbswap=1 bcm2708.uart_clock=48000000 vc_mem.mem_base=0xec00000 vc_mem.mem_size=0x10000000  dwc_otg.lpm_enable=0  <span class="org-variable-name">console</span>=ttyAMA0,115200  <span class="org-variable-name">console</span>=tty1  <span class="org-variable-name">root</span>=/dev/mmcblk0p2  <span class="org-variable-name">rootfstype</span>=ext4  <span class="org-variable-name">elevator</span>=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
[    0.000718] console [tty1] enabled
[    0.201139] 20201000.uart: ttyAMA0 at MMIO 0x20201000 ( <span class="org-variable-name">irq</span> = 81,  <span class="org-variable-name">base_baud</span> = 0) is a PL011 rev2
[    0.201529] console [ttyAMA0] enabled
[    2.333606] systemd[1]: Expecting device dev-ttyAMA0.device...
[    2.353451] systemd[1]: Starting system-serial\x2dgetty.slice.
[    2.354181] systemd[1]: Created slice system-serial\x2dgetty.slice.
[    9.556243] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB0
pi@raspberrypi:~/xbee $
</code></pre>
</div>
</div>
</li>
 <li> <a id="orgc3e340c"></a>nginx gpg key <br></br> <div class="outline-text-5" id="text-orgc3e340c">
 <p>
The distributed version of nginx is old, if you want to install the newer versions you have to self compile but first you need to take a couple of steps;
</p>

 <p>
create a file;
</p>

 <ul class="org-ul"> <li> <code>sudo nano /etc/apt/sources.list.d/nginx.list</code></li>
</ul> <p>
and add the line;
</p>

 <p>
 <code>deb-src http://nginx.org/packages/mainline/debian/ wheezy nginx</code>
</p>


 <p>
then run apt-get update and you will receive an error stating the signatures cannot be verified, to overcome this you need the nginx keys which you can get via;
</p>

 <p>
 <code>curl -O https://nginx.org/keys/nginx_signing.key &amp;&amp; apt-key add ./nginx_signing.key</code>
</p>

 <p>
now run
 <code>sudo apt-key update</code>
 <code>sudo apt-get update</code>
</p>

 <p>
and you should get no error messages meaning you can now run;
</p>

 <p>
 <code>apt-get source nginx</code>
</p>

 <p>
to finally get the latest nginx source for building on your pi ( <i>set aside quite some time for it to build</i>) and to install use
</p>

 <p>
 <code>sudo dpkg -i nginx_1.9.4-1~squeeze_armhf.deb</code>
</p>
</div>
</li>
 <li> <a id="orge1f2d58"></a>MOTD <br></br> <div class="outline-text-5" id="text-orge1f2d58">
 <p>
Below MOTD was found somewhere on the net, when i find from where i'll add a link (its only here in this file so i remember)
</p>

 <p>
To get something like this every time you log in;
</p>


 <div id="org82994fc" class="figure">
 <p> <img src="imgs_pisnippets/2017-11-11 10_34_24-192.168.0.69 (pi).png" alt="2017-11-11 10_34_24-192.168.0.69 (pi).png"></img></p>
</div>

 <p>
You need a custom message of the day script, copy the code and place it in  <code>/home/pi/.bash_profile</code>
</p>

 <div class="org-src-container">
 <pre class="src src-bash"> <code> <span class="org-builtin">let</span>  <span class="org-variable-name">upSeconds</span>= <span class="org-string">&quot;$(/usr/bin/cut -d. -f1 /proc/uptime)&quot;</span>
 <span class="org-builtin">let</span>  <span class="org-variable-name">secs</span>=$((${ <span class="org-variable-name">upSeconds</span>}%60))
 <span class="org-builtin">let</span>  <span class="org-variable-name">mins</span>=$((${ <span class="org-variable-name">upSeconds</span>}/60%60))
 <span class="org-builtin">let</span>  <span class="org-variable-name">hours</span>=$((${ <span class="org-variable-name">upSeconds</span>}/3600%24))
 <span class="org-builtin">let</span>  <span class="org-variable-name">days</span>=$((${ <span class="org-variable-name">upSeconds</span>}/86400))
 <span class="org-variable-name">UPTIME</span>= <span class="org-sh-quoted-exec">`printf &quot;%d days, %02dh%02dm%02ds&quot; &quot;$days&quot; &quot;$hours&quot; &quot;$mins&quot; &quot;$secs&quot;`</span>

 <span class="org-comment-delimiter"># </span> <span class="org-comment">get the load averages
</span> <span class="org-builtin">read</span> one five fifteen rest &lt; /proc/loadavg

 <span class="org-builtin">echo</span>  <span class="org-string">&quot;$(tput setaf 2)
   .~~.   .~~.    `date +&quot;%A, %e %B %Y, %r&quot;`
  '. \ ' ' / .'   `uname -srmo`$(tput setaf 1)
   .~ .~~~..~.
  : .~.'~'.~. :   Uptime.............: ${UPTIME}
 ~ (   ) (   ) ~  Memory.............: `cat /proc/meminfo | grep MemFree | awk {'print $2'}`kB (Free) / `cat /proc/meminfo | grep MemTotal | awk {'print $2'}`kB (Total)
( : '~'.~.'~' : ) Load Averages......: ${one}, ${five}, ${fifteen} (1, 5, 15 min)
 ~ .~ (   ) ~. ~  Running Processes..: `ps ax | wc -l | tr -d &quot; &quot;`
  (  : '~' :  )   IP Addresses.......: `/sbin/ifconfig eth0 | /bin/grep &quot;inet addr&quot; | /usr/bin/cut -d &quot;:&quot; -f 2 | /usr/bin/cut -d &quot; &quot; -f 1` and `wget -q -O - http://icanhazip.com/ | tail`
   '~ .~~~. ~'
       '~'
$(tput sgr0)&quot;</span>
</code></pre>
</div>
 <p>
$(tput sgr0)&quot;
</p>
</div>
</li>
 <li> <a id="orgcd4082a"></a>identify usb devices <br></br> <div class="outline-text-5" id="text-orgcd4082a">
 <p>
create a script with the following and make it executable
</p>
 <div class="org-src-container">
 <pre class="src src-bash"> <code> <span class="org-comment-delimiter">#</span> <span class="org-comment">!/bin/</span> <span class="org-keyword">bash</span> <span class="org-comment">
</span> <span class="org-keyword">for</span> sysdevpath <span class="org-keyword"> in</span> $(find /sys/bus/usb/devices/usb*/ -name dev);  <span class="org-keyword">do</span>
    (
         <span class="org-variable-name">syspath</span>= <span class="org-string">&quot;${sysdevpath%/dev}&quot;</span>
         <span class="org-variable-name">devname</span>= <span class="org-string">&quot;$(udevadm info -q name -p $syspath)&quot;</span>
        [[  <span class="org-string">&quot;$devname&quot;</span> ==  <span class="org-string">&quot;bus/&quot;</span>* ]] &amp;&amp;  <span class="org-keyword">continue</span>
         <span class="org-builtin">eval</span>  <span class="org-string">&quot;$(udevadm info -q property --export -p $syspath)&quot;</span>
        [[ -z  <span class="org-string">&quot;$ID_SERIAL&quot;</span> ]] &amp;&amp;  <span class="org-keyword">continue</span>
         <span class="org-builtin">echo</span>  <span class="org-string">&quot;/dev/$devname - $ID_SERIAL&quot;</span>
    )
 <span class="org-keyword">done</span>
</code></pre>
</div>

 <p>
taken from:  <a href="https://unix.stackexchange.com/questions/144029/command-to-determine-ports-of-a-device-like-dev-ttyusb0">https://unix.stackexchange.com/questions/144029/command-to-determine-ports-of-a-device-like-dev-ttyusb0</a>
</p>
</div>
</li>
 <li> <a id="org6e87e1f"></a>mysql <br></br> <div class="outline-text-5" id="text-org6e87e1f">
 <p>
using mariadb as the main sql server
</p>

 <p>
logon to sql server:  <code>mysql -u root -p</code>
</p>

 <p>
create database:  <code>CREATE DATABASE home;</code>
</p>

 <p>
now we need at least one table.
</p>


 <p>
 <code>CREATE TABLE temps (recnum int NOT NULL AUTO_INCREMENT, recdate DATE DEFAULT NULL, rectime time DEFAULT NULL, external float DEFAULT NULL, frontroom float DEFAULT NULL, bedroom float DEFAULT NULL, kitchen float DEFAULT NULL,PRIMARY KEY( recnum ));</code>
</p>

 <p>
now we can see what we've created with;
</p>

 <p>
 <code>show columns in temps</code>
</p>

 <div class="org-src-container">
 <pre class="src src-verse"> <code>+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| recnum    | int(11) | NO   | PRI | NULL    | auto_increment |
| recdate   | date    | YES  |     | NULL    |                |
| rectime   | time    | YES  |     | NULL    |                |
| external  | float   | YES  |     | NULL    |                |
| frontroom | float   | YES  |     | NULL    |                |
| bedroom   | float   | YES  |     | NULL    |                |
| kitchen   | float   | YES  |     | NULL    |                |
+-----------+---------+------+-----+---------+----------------+
7 rows in set (0.04 sec)
</code></pre>
</div>

 <p>
now to leave the sql server simply type  <code>exit;</code>
</p>
</div>
</li>
 <li> <a id="orga3e9dd6"></a>access serial port <br></br> <div class="outline-text-5" id="text-orga3e9dd6">
 <p>
when you want python to access the serial port it will if not run as root error out with permission denied. To get round this add your user to the dialout group eg
</p>

 <p>
 <code>sudo adduser &lt;username&gt; dialout</code>
</p>

 <p>
then logout and log back in, you should now be able to run your python script with using root. To check what groups your user is a member of simply type  <code>groups</code>
</p>
</div>
</li>
</ul></div>
 <div id="outline-container-org8dad060" class="outline-4">
 <h4 id="org8dad060">crontab</h4>
 <div class="outline-text-4" id="text-org8dad060">
</div>
 <ul class="org-ul"> <li> <a id="org6a2d5b2"></a>run in background during boot <br></br> <div class="outline-text-5" id="text-org6a2d5b2">
 <p>
The &amp; at the end of the line makes the script run in the background whilst the pi carries on booting
@reboot sudo python /home/pi/homeApp/ourhome.py &amp;
</p>
</div>
</li>
 <li> <a id="orge560abc"></a>enable cron logging <br></br> <div class="outline-text-5" id="text-orge560abc">
 <p>
By default, the logging for the cron daemon is not enabled in Debian To enable it, open the file /etc/rsyslog.conf via
</p>

 <p>
 <code>sudo nano /etc/rsyslog.conf</code>
</p>

 <p>
and uncomment the line
</p>

 <p>
 <code>cron.*                          /var/log/cron.log</code>
</p>
</div>
</li>
 <li> <a id="org0019bfc"></a>run on reboot <br></br> <div class="outline-text-5" id="text-org0019bfc">
 <p>
to run a command on boot i use the following in the crontab file
</p>

 <p>
@reboot run <sub>command</sub></p>
</div>
</li>
 <li> <a id="org8fc086e"></a>cron sleep <br></br> <div class="outline-text-5" id="text-org8fc086e">
 <p>
Starting a command on reboot after x seconds
</p>

 <p>
For some reason my pi would not wait for the wifi network to come online (wait for network on boot is enabled) so my NAS wont connect, to be honest i had other things to do than fault find so as i added an @reboot mount command with a sleep period to ensure the drive was accessible;
</p>

 <p>
 <code>@reboot sleep 10;sudo mount -a</code>
</p>
</div>
</li>
 <li> <a id="org6ba5fe1"></a>specifying the crontab editor <br></br> <div class="outline-text-5" id="text-org6ba5fe1">
 <p>
if like me you've accidentally set the wrong editor when first using crontab you can specify the editor everytime using the following;
</p>
 <div class="org-src-container">
 <pre class="src src-bash"> <code> <span class="org-builtin">export</span>  <span class="org-variable-name">VISUAL</span>=nano; crontab -e
</code></pre>
</div>

 <p>
alternatively you can edit the ~/.selected.editor file and change to your chosen editor;
</p>

 <div class="org-src-container">
 <pre class="src src-bash"> <code> <span class="org-comment-delimiter"># </span> <span class="org-comment">Generated by /usr/bin/select-editor
</span> <span class="org-variable-name">SELECTED_EDITOR</span>= <span class="org-string">&quot;/usr/bin/nano&quot;</span>
</code></pre>
</div>
</div>
</li>
</ul></div>
 <div id="outline-container-org8d4715d" class="outline-4">
 <h4 id="org8d4715d">network</h4>
 <div class="outline-text-4" id="text-org8d4715d">
</div>
 <ul class="org-ul"> <li> <a id="org9373d05"></a>setup new blank image <br></br> <div class="outline-text-5" id="text-org9373d05">
 <p>
before removing the flashed sd card
</p>

 <p>
create a blank file called ssh
</p>

 <p>
then create a file called wpa <sub>supplicant.conf</sub> with the following;
</p>

 <p>
ctrl <sub>interface</sub>=DIR=/var/run/wpa <sub>supplicant</sub> GROUP=netdev
update <sub>config</sub>=1
country=gb
</p>

 <p>
network={
    ssid=&quot;your <sub>SSID</sub>&quot;
    psk=&quot;your <sub>password</sub>&quot;
    key <sub>mgmt</sub>=WPA-PSK
}
</p>
</div>
</li>
 <li> <a id="orgaba593b"></a>setup wifi via command line <br></br> <div class="outline-text-5" id="text-orgaba593b">
 <p>
 <code>sudo iwlist wlan0 scan</code>
</p>

 <p>
Open the wpa-supplicant configuration file in nano:
 <code>sudo nano /etc/wpa_supplicant/wpa_supplicant.conf</code>
Go to the bottom of the file and add the following:
</p>
 <div class="org-src-container">
 <pre class="src src-bash"> <code> <span class="org-variable-name">country</span>=gb
 <span class="org-variable-name">update_config</span>=1
 <span class="org-variable-name">ctrl_interface</span>=/var/run/wpa_supplicant

 <span class="org-variable-name">network</span>={
     <span class="org-variable-name">scan_ssid</span>=1
     <span class="org-variable-name">ssid</span>= <span class="org-string">&quot;testing&quot;</span>
     <span class="org-variable-name">psk</span>= <span class="org-string">&quot;testingPassword&quot;</span>
}
</code></pre>
</div>

 <p>
Then re-configure the interface by  <code>wpa_cli -i wlan0 reconfigure</code>
</p>
</div>
</li>
 <li> <a id="org4c231dc"></a>Static or fixed IP address <br></br> <div class="outline-text-5" id="text-org4c231dc">
 <p>
add to /etc/dhcpcd.conf
</p>
 <div class="org-src-container">
 <pre class="src src-bash"> <code> <span class="org-comment-delimiter">#</span> <span class="org-comment">Custom static IP address
</span>interface eth0
static  <span class="org-variable-name">ip_address</span>=192.168.1.04/24
static  <span class="org-variable-name">routers</span>=192.168.1.1
static  <span class="org-variable-name">domain_name_servers</span>=192.168.1.1
</code></pre>
</div>

 <p>
changing eth0 to wlan0 depending on connection type and also remember to use your own choice of IP address/subnet etc
</p>
</div>
</li>
 <li> <a id="org39d19c0"></a>mail <br></br> <div class="outline-text-5" id="text-org39d19c0">
 <p>
Had problems with a cron job and no idea why &amp; at the time had not setup logging and without an MTA [Mail Transport Assistant] i could not see what errors were being given, after reading up i installed postfix
</p>

 <p>
 <code>sudo apt install postfix</code>
</p>

 <p>
Choosing &quot;LOCAL&quot; during setup, then after a reboot i could use the following to find out what went wrong:
</p>

 <div class="org-src-container">
 <pre class="src src-shell"> <code>sudo tail -f /var/mail/&lt;user&gt;
</code></pre>
</div>

 <p>
alternatively you can set up a more capable system and allow your Pi to send mail using your google account
</p>

 <div class="org-src-container">
 <pre class="src src-shell"> <code>sudo apt-get install ssmtp mailutils mpack
sudo nano /etc/ssmtp/ssmtp.conf
</code></pre>
</div>

 <div class="org-src-container">
 <pre class="src src-shell"> <code> <span class="org-comment-delimiter"># </span> <span class="org-comment">Config file for sSMTP sendmail
</span>
 <span class="org-comment-delimiter"># </span> <span class="org-comment">The person who gets all mail for userids &lt; 1000
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">Make this empty to disable rewriting.
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">root=localhost
</span> <span class="org-variable-name">root</span>=your_chosen_address

 <span class="org-comment-delimiter"># </span> <span class="org-comment">The place where the mail goes. The actual machine name is required no
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">MX records are consulted. Commonly mailhosts are named mail.domain.com
</span> <span class="org-variable-name">mailhub</span>=smtp.gmail.com:587

 <span class="org-comment-delimiter"># </span> <span class="org-comment">Where will the mail seem to come from?
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">rewriteDomain=gmail.com
</span>
 <span class="org-comment-delimiter"># </span> <span class="org-comment">The full hostname
</span> <span class="org-variable-name">hostname</span>=yourHOSTNAME

 <span class="org-comment-delimiter"># </span> <span class="org-comment">Are users allowed to set their own From: address?
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">YES - Allow the user to specify their own From: address
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">NO - Use the system generated From: address
</span> <span class="org-variable-name">FromLineOverride</span>=YES

 <span class="org-variable-name">UseSTARTTLS</span>=YES

 <span class="org-variable-name">AuthUser</span>=yourEMAIL
 <span class="org-variable-name">AuthPass</span>=either password or two-factor key
</code></pre>
</div>
</div>
 <ul class="org-ul"> <li> <a id="orgb375bd8"></a> <span class="todo TODO">TODO</span> - update rqd Example python script for using sSMTP <br></br> <div class="outline-text-6" id="text-orgb375bd8">
 <p>
sudo apt-get install ssmtp
sudo apt-get install mailutils
</p>

 <p>
root=postmaster
mailhub=smtp.gmail.com:587
hostname=raspberrypi
AuthUser=AGmailUserName@gmail.com
AuthPass=TheGmailPassword
FromLineOverride=YES
UseSTARTTLS=YES
</p>
</div>
</li>
 <li> <a id="org75514ad"></a>old <br></br> <div class="outline-text-6" id="text-org75514ad">
 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-comment-delimiter">#</span> <span class="org-comment">!/usr/bin/python
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">Taken and modified from an example here:
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">http://tombuntu.com/index.php/2008/10/24/server-monitoring-with-python-and-ssmtp/
</span>
 <span class="org-keyword">import</span> subprocess, re, time
 <span class="org-keyword">import</span> urllib, urllib2

 <span class="org-comment-delimiter"># </span> <span class="org-comment">email address to use in the to field
</span> <span class="org-variable-name">recipient</span>  <span class="org-operator">=</span>  <span class="org-string">'towhomit@mayconcern'</span>
 <span class="org-comment-delimiter"># </span> <span class="org-comment">email address to use in the from field
</span> <span class="org-variable-name">sender</span>  <span class="org-operator">=</span>  <span class="org-string">'fromwhom@sentit'</span>
 <span class="org-comment-delimiter"># </span> <span class="org-comment">template for the email message
</span> <span class="org-comment-delimiter"># </span> <span class="org-comment">first '%s' is recipient, second is sender, third is content
</span> <span class="org-variable-name">message</span>  <span class="org-operator">=</span>  <span class="org-string">'''To: %s
From: %s
Subject: rpiELEC IP: %s

'''</span>

 <span class="org-keyword">def</span>  <span class="org-function-name">send_mail</span>(content):
     <span class="org-keyword">try</span>:
         <span class="org-variable-name">ssmtp</span> <span class="org-operator">=</span>subprocess.Popen(( <span class="org-string">'/usr/sbin/ssmtp'</span>, recipient), stdin <span class="org-operator">=</span>subprocess.PIPE)
     <span class="org-keyword">except</span>  <span class="org-type">OSError</span>:
         <span class="org-builtin">print</span>( <span class="org-string">'Error sending mail'</span>)

     <span class="org-comment-delimiter"># </span> <span class="org-comment">pass mail to sSMTP client
</span>    ssmtp.communicate(message  <span class="org-operator">%</span> (recipient, sender,content))
    ssmtp.wait()


 <span class="org-variable-name">data</span>  <span class="org-operator">=</span> re.search( <span class="org-string">'&quot;([0-9.]*)&quot;'</span>, urllib.urlopen( <span class="org-string">&quot;http://ip.jsontest.com/&quot;</span>).read()).group(1)
send_mail(data)
</code></pre>
</div>
</div>
</li>
</ul></li>
</ul></div>
 <div id="outline-container-org595d1d7" class="outline-4">
 <h4 id="org595d1d7">access a network drive</h4>
 <div class="outline-text-4" id="text-org595d1d7">
 <p>
Edit your /etc/fstab file and add the following line (changing the ip address and location of the credentials file to suit your setup);
</p>

 <div class="org-src-container">
 <pre class="src src-bash"> <code>//192.168.1.1/Drive /media/nas_documents cifs  <span class="org-variable-name">credentials</span>=/home/drakx/.nas_credentials, <span class="org-variable-name">sec</span>=ntlmv2, <span class="org-variable-name">uid</span>=1000, <span class="org-variable-name">gid</span>=1000, <span class="org-variable-name">iocharset</span>=utf8 0 0
</code></pre>
</div>

 <p>
Now create a file called .nas <sub>credentials</sub> in your home directory
</p>

 <div class="org-src-container">
 <pre class="src src-bash"> <code> <span class="org-variable-name">username</span>=YOUR_ROUTER_LOGIN
 <span class="org-variable-name">password</span>=YOUR_ROUTER_LOGIN_PASSWORD
</code></pre>
</div>
</div>
</div>
 <div id="outline-container-org562c857" class="outline-4">
 <h4 id="org562c857">ssh file system</h4>
 <div class="outline-text-4" id="text-org562c857">
 <p>
One trick i didnt learn until far too late was  <b>sshfs</b> essentially it mounts your remote system as a folder on your desktop/laptop so instead of saving files then transfering etc you can open and load the remote files and work on them as if local. Excellent for tweaking your python website.
</p>

 <p>
The line of code you need is really simple;
</p>

 <p>
 <code>sshfs pi@192.168.1.69:/home/pi home/user/folder/</code>
</p>
</div>
</div>
 <div id="outline-container-org1cba7ad" class="outline-4">
 <h4 id="org1cba7ad">python ping</h4>
 <div class="outline-text-4" id="text-org1cba7ad">
 <p>
need to  <code>sudo pip install ping</code> first
</p>

 <div class="org-src-container">
 <pre class="src src-python"> <code> <span class="org-keyword">import</span> ping, socket
 <span class="org-keyword">try</span>:
    ping.verbose_ping( <span class="org-string">'www.google.com'</span>, count <span class="org-operator">=</span>3)
 <span class="org-keyword">except</span> socket.error, e:
     <span class="org-builtin">print</span>  <span class="org-string">&quot;Ping Error:&quot;</span>, e
</code></pre>
</div>
</div>
</div>
 <div id="outline-container-org3660256" class="outline-4">
 <h4 id="org3660256">emacs</h4>
 <div class="outline-text-4" id="text-org3660256">
</div>
 <ul class="org-ul"> <li> <a id="org3a1d789"></a>emacs commands/tips <br></br> <div class="outline-text-5" id="text-org3a1d789">
 <table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"> <colgroup> <col class="org-left"></col> <col class="org-left"></col></colgroup> <tbody> <tr> <td class="org-left">key command</td>
 <td class="org-left"> </td>
</tr> <tr> <td class="org-left">M-;</td>
 <td class="org-left">when a region is highlighted pressing M-; will comment out the section</td>
</tr> <tr> <td class="org-left">C-c C-x -</td>
 <td class="org-left">starts a list in emacs with timer, now pressing M-RET will allow notes</td>
</tr> <tr> <td class="org-left"> </td>
 <td class="org-left">eg</td>
</tr> <tr> <td class="org-left"> </td>
 <td class="org-left">- 0:00:00 :: Now I can start taking some notes.</td>
</tr> <tr> <td class="org-left"> </td>
 <td class="org-left">- 0:00:02 :: If I hit  <code>M-RET</code>, a new list item is created.</td>
</tr> <tr> <td class="org-left"> </td>
 <td class="org-left">- 0:00:06 :: And so on</td>
</tr> <tr> <td class="org-left">org-toggle-link-display</td>
 <td class="org-left">OK not a shortcut but really useful for me once toggled it displays</td>
</tr> <tr> <td class="org-left"> </td>
 <td class="org-left">links in their unshortened form which means if a link has a  <code>%20</code></td>
</tr> <tr> <td class="org-left"> </td>
 <td class="org-left">in it then the emacs search &amp; replace ~M-shift-% will work</td>
</tr> <tr> <td class="org-left"> </td>
 <td class="org-left">( <i>for some reason files i've transferred all had link spaces replaced</i></td>
</tr> <tr> <td class="org-left"> </td>
 <td class="org-left"> <i>with  <code>%20</code> bloody annoying</i></td>
</tr> <tr> <td class="org-left">M-x occur</td>
 <td class="org-left">searches your file with regexp &amp; opens a second buffer with all matches</td>
</tr> <tr> <td class="org-left"> </td>
 <td class="org-left"> </td>
</tr></tbody></table></div>
</li>
 <li> <a id="orgd12444b"></a>emacs org-publish <br></br> <div class="outline-text-5" id="text-orgd12444b">
 <p>
took me a long time to get this working and i dont use the ctrl c-e P to get it going you have to use alt-x org-publish ret org ret
</p>

 <div class="org-src-container">
 <pre class="src src-elisp"> <code>( <span class="org-keyword">setq</span> org-publish-project-alist
      '(
        ( <span class="org-string">&quot;org-notes&quot;</span>
          <span class="org-builtin">:base-directory</span>  <span class="org-string">&quot;C:/Users/drakx/Documents/org_files&quot;</span>
          <span class="org-builtin">:base-extension</span>  <span class="org-string">&quot;org&quot;</span>
          <span class="org-builtin">:publishing-directory</span>  <span class="org-string">&quot;C:/Users/drakx/Documents/org_publish&quot;</span>
          <span class="org-builtin">:recursive</span> -t
          <span class="org-builtin">:publishing-function</span> org-html-publish-to-html
          <span class="org-builtin">:headline-levels</span> 4
          <span class="org-builtin">:auto-preamble</span> t
          <span class="org-builtin">:auto-sitemap</span> t                 <span class="org-comment-delimiter">; </span> <span class="org-comment">Generate sitemap.org automagically...
</span>          <span class="org-builtin">:sitemap-filename</span>  <span class="org-string">&quot;sitemap.org&quot;</span>   <span class="org-comment-delimiter">; </span> <span class="org-comment">... call it sitemap.org (it's the default)...
</span>          <span class="org-builtin">:sitemap-title</span>  <span class="org-string">&quot;Sitemap&quot;</span>          <span class="org-comment-delimiter">; </span> <span class="org-comment">... with title '</span> <span class="org-comment"> <span class="org-constant">Sitemap</span></span> <span class="org-comment">'.
</span>          <span class="org-builtin">:language</span>  <span class="org-string">&quot;en&quot;</span>
          <span class="org-builtin">:section-numbers</span> nil
          <span class="org-builtin">:with-toc</span> t
          <span class="org-builtin">:html-preamble</span> t
         )

        ( <span class="org-string">&quot;org-static&quot;</span>
          <span class="org-builtin">:base-directory</span>  <span class="org-string">&quot;C:/Users/drakx/Documents/org_files/files/&quot;</span>
          <span class="org-builtin">:base-extension</span>  <span class="org-string">&quot;css</span> <span class="org-string"> <span class="org-regexp-grouping-backslash">\\</span></span> <span class="org-string"> <span class="org-regexp-grouping-construct">|</span></span> <span class="org-string">js</span> <span class="org-string"> <span class="org-regexp-grouping-backslash">\\</span></span> <span class="org-string"> <span class="org-regexp-grouping-construct">|</span></span> <span class="org-string">png</span> <span class="org-string"> <span class="org-regexp-grouping-backslash">\\</span></span> <span class="org-string"> <span class="org-regexp-grouping-construct">|</span></span> <span class="org-string">jpg</span> <span class="org-string"> <span class="org-regexp-grouping-backslash">\\</span></span> <span class="org-string"> <span class="org-regexp-grouping-construct">|</span></span> <span class="org-string">gif</span> <span class="org-string"> <span class="org-regexp-grouping-backslash">\\</span></span> <span class="org-string"> <span class="org-regexp-grouping-construct">|</span></span> <span class="org-string">pdf</span> <span class="org-string"> <span class="org-regexp-grouping-backslash">\\</span></span> <span class="org-string"> <span class="org-regexp-grouping-construct">|</span></span> <span class="org-string">mp3</span> <span class="org-string"> <span class="org-regexp-grouping-backslash">\\</span></span> <span class="org-string"> <span class="org-regexp-grouping-construct">|</span></span> <span class="org-string">ogg</span> <span class="org-string"> <span class="org-regexp-grouping-backslash">\\</span></span> <span class="org-string"> <span class="org-regexp-grouping-construct">|</span></span> <span class="org-string">swf&quot;</span>
          <span class="org-builtin">:publishing-directory</span>  <span class="org-string">&quot;C:/Users/drakx/Documents/org_publish/files/&quot;</span>
          <span class="org-builtin">:recursive</span> t
          <span class="org-builtin">:publishing-function</span> org-publish-attachment
         )

      ( <span class="org-string">&quot;org&quot;</span>  <span class="org-builtin">:components</span> ( <span class="org-string">&quot;org-notes&quot;</span>  <span class="org-string">&quot;org-static&quot;</span>))
      )
)
</code></pre>
</div>


 <p>
now all i need to do is test in my work files and on interlinked org files, as of today  <span class="timestamp-wrapper"> <span class="timestamp">[2018-08-05 Sun 09:01]</span></span> i have only tested it on a simple project
</p>
</div>
</li>
</ul></div>
 <div id="outline-container-org9817a22" class="outline-4">
 <h4 id="org9817a22">camera    <span class="tag"> <span class="camera">camera</span></span></h4>
 <div class="outline-text-4" id="text-org9817a22">
</div>
 <ul class="org-ul"> <li> <a id="orgd257420"></a>Disable red LED <br></br> <div class="outline-text-5" id="text-orgd257420">
 <p>
Edit /boot/config and add the line
</p>

 <p>
 <code>disable_camera_led=1</code>
</p>
</div>
</li>
</ul></div>
</div>
</div>]]></content>
  <link href="https://leehalls.net/docs/pi_snippets.html"/>
  <id>https://leehalls.net/docs/pi_snippets.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Projects &amp; notes</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Projects &amp; notes</h1>
 <div id="table-of-contents" role="doc-toc">
 <h2>Table of Contents</h2>
 <div id="text-table-of-contents" role="doc-toc">
 <ul> <li> <a href="#orgd4395f9">Flask &amp; socketio</a></li>
</ul></div>
</div>
 <p>
A grandiose terms to describe the things I've either worked on ( <a href="flask_socketio.html">reactive gauges</a>) or am working on or other topics which require more detail and a permanent home than simply a post.
</p>


 <p>
 <a href="colour.html">colour photo</a>
</p>
 <div id="outline-container-orgd4395f9" class="outline-2">
 <h2 id="orgd4395f9"> <a href="flask_socketio.html">Flask &amp; socketio</a></h2>
 <div class="outline-text-2" id="text-orgd4395f9">
 <p>
Ever wanted realtime, reactive gauges? this is a  <a href="flask_socketio.html">write-up</a> on how I achieved just that using flask, socketio &amp; canvas gauges.
</p>
</div>
</div>
</div>]]></content>
  <link href="https://leehalls.net/docs/projects.html"/>
  <id>https://leehalls.net/docs/projects.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Posts Archive</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <h1 class="title">Posts Archive</h1>
 <div id="outline-container-org4849d2a" class="outline-2">
 <h2 id="org4849d2a"> <a href="posts/website_rewrite.html">(2026-09-02) Complete re-write Complete re-write</a></h2>
 <div class="outline-text-2" id="text-org4849d2a">
 <p>
Major refactor of website content into just an emacs orgmode entity with no hugo
</p>
</div>
</div>
 <div id="outline-container-orgcecf4b5" class="outline-2">
 <h2 id="orgcecf4b5"> <a href="posts/heatwavetravel.html">(2026-06-29) Travel &amp; heatwaves</a></h2>
 <div class="outline-text-2" id="text-orgcecf4b5">
 <p>
I missed the end of june 2026 heatwave
</p>
</div>
</div>
 <div id="outline-container-org6a3c8c0" class="outline-2">
 <h2 id="org6a3c8c0"> <a href="posts/blackbird_20260613.html">(2026-06-13) A second attempt</a></h2>
 <div class="outline-text-2" id="text-org6a3c8c0">
 <p>
After failing earlier this year, the blackbirds have a family.
</p>
</div>
</div>
 <div id="outline-container-org1861b5e" class="outline-2">
 <h2 id="org1861b5e"> <a href="posts/timeandinterest_20260606.html">(2026-06-06) Time &amp; interest</a></h2>
 <div class="outline-text-2" id="text-org1861b5e">
 <p>
As one ages, perhaps they realise more the importance of time and its utilisation but also I'm finding it hard( <i>er</i>) to maintain interest &amp; drive feeling somewhat apathetic
</p>
</div>
</div>
 <div id="outline-container-orgc83b943" class="outline-2">
 <h2 id="orgc83b943"> <a href="posts/blackbird_20260303.html">(2026-03-03) Spring is coming! &amp; the blackbird is nesting</a></h2>
 <div class="outline-text-2" id="text-orgc83b943">
 <p>
I thought I had seen them flying in &amp; out, nesting by the backdoor
</p>
</div>
</div>
 <div id="outline-container-org43312ed" class="outline-2">
 <h2 id="org43312ed"> <a href="posts/wttr.html">(2026-02-04) The weather in your emacs journals</a></h2>
 <div class="outline-text-2" id="text-org43312ed">
 <p>
Getting the weather into your daily journal
</p>
</div>
</div>
 <div id="outline-container-orgc3d2284" class="outline-2">
 <h2 id="orgc3d2284"> <a href="posts/org_insert_link.html">(2026-01-25) Org insert link</a></h2>
 <div class="outline-text-2" id="text-orgc3d2284">
 <p>
orgmode insert file link alteration to convert from absolute path
</p>
</div>
</div>
 <div id="outline-container-orgddda019" class="outline-2">
 <h2 id="orgddda019"> <a href="posts/orgroamcosma.html">(2025-10-18) OrgRoam to cosmascope</a></h2>
 <div class="outline-text-2" id="text-orgddda019">
 <p>
 <i>org-roam is your second brain but what if you wanted to host it, share somehow? Well this is a short description on how to use cosmascope to do just that.</i>
</p>
</div>
</div>
 <div id="outline-container-org0458f51" class="outline-2">
 <h2 id="org0458f51"> <a href="posts/orgjournalheatmap.html">(2025-05-05) Location heatmap for Journelly</a></h2>
 <div class="outline-text-2" id="text-org0458f51">
 <p>
Creating a map of journelly recorded entries
</p>
</div>
</div>
 <div id="outline-container-orged72de2" class="outline-2">
 <h2 id="orged72de2"> <a href="posts/orgjournal.html">(2025-05-05) Journelly your orgmode journal on IOS</a></h2>
 <div class="outline-text-2" id="text-orged72de2">
 <p>
Keeping a journal in orgmode on IOS
</p>
</div>
</div>
 <div id="outline-container-org8299254" class="outline-2">
 <h2 id="org8299254"> <a href="posts/bobber.html">(2025-04-13) A thing of beauty</a></h2>
 <div class="outline-text-2" id="text-org8299254">
 <p>
The Triumph bobber, unsure whether to ride it or stare at it
</p>
</div>
</div>
 <div id="outline-container-org3f1e7b0" class="outline-2">
 <h2 id="org3f1e7b0"> <a href="posts/birds20250406.html">(2025-04-06) A lazy day with the camera</a></h2>
 <div class="outline-text-2" id="text-org3f1e7b0">
 <p>
Taking advantage of the nice weather to just sit with camera
</p>
</div>
</div>
 <div id="outline-container-orgbdddce9" class="outline-2">
 <h2 id="orgbdddce9"> <a href="posts/orgmodeoptions.html">(2025-01-26) orgmode power yet confusion</a></h2>
 <div class="outline-text-2" id="text-orgbdddce9">
 <p>
Orgmode has multiple ways to achieve the same thing
</p>
</div>
</div>
 <div id="outline-container-org4befb80" class="outline-2">
 <h2 id="org4befb80"> <a href="posts/lightsout_20241119.html">(2024-11-19) Lights out</a></h2>
 <div class="outline-text-2" id="text-org4befb80">
 <p>
An update on councils turning lights out.
</p>
</div>
</div>
 <div id="outline-container-org4c9a6f6" class="outline-2">
 <h2 id="org4c9a6f6"> <a href="posts/20241116_update.html">(2024-11-16) Time, broken themes and a rewrite</a></h2>
 <div class="outline-text-2" id="text-org4c9a6f6">
 <p>
Not keeping upto-date
</p>
</div>
</div>
 <div id="outline-container-org6e9ed64" class="outline-2">
 <h2 id="org6e9ed64"> <a href="posts/travelling.html">(2023-08-05) Limited time lots of travel</a></h2>
 <div class="outline-text-2" id="text-org6e9ed64">
 <p>
Entertaining ride up a mountain
</p>
</div>
</div>
 <div id="outline-container-orga845dc9" class="outline-2">
 <h2 id="orga845dc9"> <a href="posts/homeassist.html">(2023-01-28) Moving to HomeAssistant</a></h2>
 <div class="outline-text-2" id="text-orga845dc9">
 <p>
Home monitoring dashboards, transition from self programmed to HomeAssistant
</p>
</div>
</div>
 <div id="outline-container-org0ba7413" class="outline-2">
 <h2 id="org0ba7413"> <a href="posts/sparrow.html">(2023-01-26) A sparrow for breakfast</a></h2>
 <div class="outline-text-2" id="text-org0ba7413">
 <p>
Breakfast is a Sparrow?
</p>
</div>
</div>
 <div id="outline-container-orgc2fda6f" class="outline-2">
 <h2 id="orgc2fda6f"> <a href="posts/orgnoemacs.html">(2022-11-04) Using org without emacs</a></h2>
 <div class="outline-text-2" id="text-orgc2fda6f">
 <p>
Using orgmode outside of emacs
</p>
</div>
</div>
 <div id="outline-container-orge6cd54d" class="outline-2">
 <h2 id="orge6cd54d"> <a href="posts/orgparse.html">(2022-10-28) Python export for specific tagged headlines &amp; files</a></h2>
 <div class="outline-text-2" id="text-orge6cd54d">
 <p>
Parsing orgfiles for export ensuring only the files linked in specific tagged headings are copied to the export directory
</p>
</div>
</div>
 <div id="outline-container-org1fcc383" class="outline-2">
 <h2 id="org1fcc383"> <a href="posts/biking.html">(2022-06-04) Back to motorcycles</a></h2>
 <div class="outline-text-2" id="text-org1fcc383">
 <p>
Back into biking
</p>
</div>
</div>
 <div id="outline-container-org7d2dfbf" class="outline-2">
 <h2 id="org7d2dfbf"> <a href="posts/realtimedata.html">(2021-12-29) Realtime data plot</a></h2>
 <div class="outline-text-2" id="text-org7d2dfbf">
 <p>
Realtime data plotting using chartjs
</p>
</div>
</div>
 <div id="outline-container-orge54b177" class="outline-2">
 <h2 id="orge54b177"> <a href="posts/parakeets.html">(2021-09-03) Wild Parakeets</a></h2>
 <div class="outline-text-2" id="text-orge54b177">
 <p>
Unusual bird(s) to be seen flying free in the UK
</p>
</div>
</div>
 <div id="outline-container-org97fdaba" class="outline-2">
 <h2 id="org97fdaba"> <a href="posts/win10_snip.html">(2021-07-25) Orgmode insert image</a></h2>
 <div class="outline-text-2" id="text-org97fdaba">
 <p>
Using Windows snip tool to insert image into orgmode file
</p>
</div>
</div>
 <div id="outline-container-orgafc32c8" class="outline-2">
 <h2 id="orgafc32c8"> <a href="posts/more_gardenphoto.html">(2021-05-16) More garden photography</a></h2>
 <div class="outline-text-2" id="text-orgafc32c8">
 <p>
Close up photos of the regular garden visitors
</p>
</div>
</div>
 <div id="outline-container-org90288b2" class="outline-2">
 <h2 id="org90288b2"> <a href="posts/vl53lx_pico.html">(2021-04-04) VL53L1X &amp; a Raspberry Pico</a></h2>
 <div class="outline-text-2" id="text-org90288b2">
 <p>
Using the VL53L1X laser ToF sensor on a Rapsberry Pico
</p>
</div>
</div>
 <div id="outline-container-org2ae8ff1" class="outline-2">
 <h2 id="org2ae8ff1"> <a href="posts/gpg_emacsconfig.html">(2021-03-13) GPG emacs on Windows 10</a></h2>
 <div class="outline-text-2" id="text-org2ae8ff1">
 <p>
Specifying GPG program locations to allow en/decryption in emacs
</p>
</div>
</div>
 <div id="outline-container-orgf43d525" class="outline-2">
 <h2 id="orgf43d525"> <a href="posts/garden_mouse.html">(2021-02-27) Mouse photography</a></h2>
 <div class="outline-text-2" id="text-orgf43d525">
 <p>
The garden resident granted me an audience whilst trying out the new lense
</p>
</div>
</div>
 <div id="outline-container-org1f9d5ea" class="outline-2">
 <h2 id="org1f9d5ea"> <a href="posts/sqlquery1.html">(2021-02-20) Querying the SQL DB</a></h2>
 <div class="outline-text-2" id="text-org1f9d5ea">
 <p>
Overcoming a different number of records in db per sensor
</p>
</div>
</div>
 <div id="outline-container-org7132c2c" class="outline-2">
 <h2 id="org7132c2c"> <a href="posts/pdsql_1.html">(2021-02-14) Panda &amp; SQL pain</a></h2>
 <div class="outline-text-2" id="text-org7132c2c">
 <p>
Starting to improve the home monitoring system with a pandas output to bokeh
</p>
</div>
</div>
 <div id="outline-container-org1035b2c" class="outline-2">
 <h2 id="org1035b2c"> <a href="posts/upclose_visitors.html">(2021-02-07) More garden visitors</a></h2>
 <div class="outline-text-2" id="text-org1035b2c">
 <p>
A couple more photographs of the regular garden visitors
</p>
</div>
</div>
 <div id="outline-container-org66e05f5" class="outline-2">
 <h2 id="org66e05f5"> <a href="posts/new_lense.html">(2021-02-06) New lense</a></h2>
 <div class="outline-text-2" id="text-org66e05f5">
 <p>
A new lense for bringing the far away closer
</p>
</div>
</div>
 <div id="outline-container-org1f91bd0" class="outline-2">
 <h2 id="org1f91bd0"> <a href="posts/emacs_openfiles.html">(2020-12-05) emacs on Windows</a></h2>
 <div class="outline-text-2" id="text-org1f91bd0">
 <p>
Opening links/attachments with native applications on MS Windows
</p>
</div>
</div>
 <div id="outline-container-org9f7052f" class="outline-2">
 <h2 id="org9f7052f"> <a href="posts/covid_northsouthdivide.html">(2020-11-26) COVID North vs South</a></h2>
 <div class="outline-text-2" id="text-org9f7052f">
 <p>
The age old subject of the North v South, working class vs upper class as shown by COVID perhaps if viewed with a cynical perspective
</p>
</div>
</div>
 <div id="outline-container-orgfd86e7a" class="outline-2">
 <h2 id="orgfd86e7a"> <a href="posts/lightpollution.html">(2020-11-04) Lights out</a></h2>
 <div class="outline-text-2" id="text-orgfd86e7a">
 <p>
Visualising light pollution.
</p>
</div>
</div>
 <div id="outline-container-orgcb2b04d" class="outline-2">
 <h2 id="orgcb2b04d"> <a href="posts/darkness.html">(2020-08-07) Darkness</a></h2>
 <div class="outline-text-2" id="text-orgcb2b04d">
 <p>
Not enough darkness in the world
</p>
</div>
</div>
 <div id="outline-container-org8b0e81a" class="outline-2">
 <h2 id="org8b0e81a"> <a href="posts/outlook_events.html">(2020-08-06) outlook events for orgmode</a></h2>
 <div class="outline-text-2" id="text-org8b0e81a">
 <p>
Uni-directional sync of outlook events to orgmode
</p>
</div>
</div>
 <div id="outline-container-orgfdd42fd" class="outline-2">
 <h2 id="orgfdd42fd"> <a href="posts/outlook_python.html">(2020-06-12) Beginning email analysis for outlook</a></h2>
 <div class="outline-text-2" id="text-orgfdd42fd">
 <p>
Using python to conduct some analysis of MS Outlook emails
</p>
</div>
</div>
 <div id="outline-container-orgd149902" class="outline-2">
 <h2 id="orgd149902"> <a href="posts/emacslisp_yasnippet.html">(2020-06-05) emacs lisp &amp; yasnippet templates</a></h2>
 <div class="outline-text-2" id="text-orgd149902">
 <p>
Identifying my IP address to set a property using elisp
</p>
</div>
</div>
 <div id="outline-container-orgd9eb398" class="outline-2">
 <h2 id="orgd9eb398"> <a href="posts/website_security.html">(2020-05-30) Website security</a></h2>
 <div class="outline-text-2" id="text-orgd9eb398">
 <p>
Improving static site security with the help of the Mozilla Observatory
</p>
</div>
</div>
 <div id="outline-container-orgc453640" class="outline-2">
 <h2 id="orgc453640"> <a href="posts/emacs_batch.html">(2020-05-29) HTML/CSS Agenda for emacs batch output</a></h2>
 <div class="outline-text-2" id="text-orgc453640">
 <p>
Getting the orgmode agenda output as a nice HTML page via the commandline
</p>
</div>
</div>
 <div id="outline-container-org03a55ea" class="outline-2">
 <h2 id="org03a55ea"> <a href="posts/emacs_batchorgagenda.html">(2020-05-27) batch agenda output via html</a></h2>
 <div class="outline-text-2" id="text-org03a55ea">
 <p>
Getting the orgmode agenda output as HTML via the commandline
</p>
</div>
</div>
 <div id="outline-container-org73445e7" class="outline-2">
 <h2 id="org73445e7"> <a href="posts/android_taskerorg.html">(2020-05-24) orgmode, android and Tasker</a></h2>
 <div class="outline-text-2" id="text-org73445e7">
 <p>
Using tasker scenese to create an orgmode experience
</p>
</div>
</div>
 <div id="outline-container-org8bb08c7" class="outline-2">
 <h2 id="org8bb08c7"> <a href="posts/covid19.html">(2020-05-22) COVID19</a></h2>
 <div class="outline-text-2" id="text-org8bb08c7">
 <p>
Unpopular opinion but COVID19 has been good for me!
</p>
</div>
</div>
 <div id="outline-container-org7d30f63" class="outline-2">
 <h2 id="org7d30f63"> <a href="posts/oxhugo.html">(2020-05-09) emacs, orgmode, hugo + ox-hugo</a></h2>
 <div class="outline-text-2" id="text-org7d30f63">
 <p>
Trial and tribulations of hugo &amp; ox-hugo
</p>
</div>
</div>
 <div id="outline-container-orgec890b1" class="outline-2">
 <h2 id="orgec890b1"> <a href="posts/new_start.html">(2020-05-08) Starting afresh</a></h2>
 <div class="outline-text-2" id="text-orgec890b1">
 <p>
Coming back to where you started is not the same as never leaving
</p>
</div>
</div>
 <div id="outline-container-org05e0eef" class="outline-2">
 <h2 id="org05e0eef"> <a href="posts/python_oxhugolink.html">(2020-05-08) Quick link creation</a></h2>
 <div class="outline-text-2" id="text-org05e0eef">
 <p>
Quick &amp; dirty python script to create ox-hugo clickable links
</p>
</div>
</div>
</div>]]></content>
  <link href="https://leehalls.net/archive.html"/>
  <id>https://leehalls.net/archive.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
<entry>
  <title>Ramblings of a lost one</title>
  <author><name>Lee Halls</name></author>
  <content type="html"><![CDATA[<div id="content" class="content">
 <div id="outline-container-org9ddf45f" class="outline-2">
 <h2 id="org9ddf45f">posts</h2>
 <div class="outline-text-2" id="text-org9ddf45f">
</div>
 <div id="outline-container-org0db7040" class="outline-3">
 <h3 id="org0db7040"> <a href="posts/website_rewrite.html">(2026-09-02) Complete re-write Complete re-write</a></h3>
 <div class="outline-text-3" id="text-org0db7040">
 <p>
Major refactor of website content into just an emacs orgmode entity with no hugo
</p>
</div>
</div>
 <div id="outline-container-org257bf2e" class="outline-3">
 <h3 id="org257bf2e"> <a href="posts/heatwavetravel.html">(2026-06-29) Travel &amp; heatwaves</a></h3>
 <div class="outline-text-3" id="text-org257bf2e">
 <p>
I missed the end of june 2026 heatwave
</p>
</div>
</div>
 <div id="outline-container-org862c097" class="outline-3">
 <h3 id="org862c097"> <a href="posts/blackbird_20260613.html">(2026-06-13) A second attempt</a></h3>
 <div class="outline-text-3" id="text-org862c097">
 <p>
After failing earlier this year, the blackbirds have a family.
</p>
</div>
</div>
 <div id="outline-container-org7d6e500" class="outline-3">
 <h3 id="org7d6e500"> <a href="posts/timeandinterest_20260606.html">(2026-06-06) Time &amp; interest</a></h3>
 <div class="outline-text-3" id="text-org7d6e500">
 <p>
As one ages, perhaps they realise more the importance of time and its utilisation but also I'm finding it hard( <i>er</i>) to maintain interest &amp; drive feeling somewhat apathetic
</p>
</div>
</div>
 <div id="outline-container-org37cbf6b" class="outline-3">
 <h3 id="org37cbf6b"> <a href="posts/blackbird_20260303.html">(2026-03-03) Spring is coming! &amp; the blackbird is nesting</a></h3>
</div>
</div>
 <div id="outline-container-org9afc737" class="outline-2">
 <h2 id="org9afc737">Post Archive</h2>
 <div class="outline-text-2" id="text-org9afc737">
 <p>
 <a href="archive.html">All Posts</a>
</p>
</div>
</div>
</div>]]></content>
  <link href="https://leehalls.net/index.html"/>
  <id>https://leehalls.net/index.html</id>
  <updated>2000-01-01T00:00:00+00:00</updated>
</entry>
</feed>
