#오그롬: 위키데이터 제텔카스텐 에버그린 활용법

#오그롬: 위키데이터 제텔카스텐 에버그린 활용법

2022-09-06 Note evergreen notes orgroam pkm semantic wikidata zettelkasten

#관련노트

DONE 연결 노트 버퍼 관련 기록

[2023-08-17 Thu 06:40] https://www.orgroam.com/manual.html#Customizing-Node-Caching

참 이게 까다롭다. 연결 노트 정보를 보여주는게 얼마나 중요한가? 그래야 연결 방법도 고민하게 된다.

  • BacklinksView (preview of) nodes that link to this node
  • Reference LinksNodes that reference this node (see Refs)
  • Unlinked referencesView nodes that contain text that match the nodes title/alias but are not linked

백링크는 다른 노드들이다. 레퍼런스 링크는 이 노드가 참조하는 노드들이다. 언링크는 제목만 보면 연결해야 할 것 같은데?! 안 된 노드다.

이게 깔끔하게 동작하는 것인지는 모르겠다.

M-{N}: magit-section-show-level-{N}-all
n: magit-section-forward
<TAB>: magit-section-toggle
<RET>: org-roam-buffer-visit-thing

DONE bug-fix in Spacemacs

[2023-08-17 Thu 12:13] org-roam/org-roam#1772 Weird backlink buffer display by `org-roam-buffer-togg…

DONE 오그롬 통합 관련 기록

[2023-09-01 Fri 05:15]

  • 2023-09-01 아래는 다 처리 된 이야기다. 그러나 참고 할만 하다 반 년 전에 디노트와 오그롬을 중심으로 노트 테이킹과 퍼블리시 작업을 했다. 하나 하나 검증해 가면서 가기 위해 적어 놓은 내용이다.
  • 2023-05-16 테스트 목록을 정리해보자. 무엇을 확인해야 하는가 지금 할 수 있는 수준에서 할 것들과 구현해서 할 것들을 나누어야 한다. 목표도 있어야 한다.

목표

구성의 측면에서 단계를 본다면,

  • spacemacs org-roam layer
  • spacemacs bibtex layer
  • org-roam doom config
  • org-roam-ui -> enable
  • org-roam ben config
  • folder – notes, posts, private, terms -> category 기능 확인!
    • jahyun 님이 note, blog, private 으로 나눈 것을 따라가자. 각각을 notes, posts, private 으로 구분하면 org-roam 으로 블로그 전체를 커버할 수 있겠네. org-roam 에 md-roam 을 연동하고, ref, bitex 등까지 다 붙이고 있으니까 org-roam-ui 까지 고민하자면 다 통합하는게 좋겠다. 중복 노력할 필요가 없다.

    • 위에 내가 쓴 것과 같다. 생각해보면 term 은? org 디렉토리에서는 다 같이 있어도 상관 없는데. 아니다. 반대로 나눠서 볼 수 있고… 애매하네! 노트 버튼 누르면 다 보일텐데 나눠서 보면 term 하고 무슨 상관인가. jf 를 생각해보면 폴더를 나눴다. 다만. 다만.

      quotes, glossary … 뭐 이렇게 나누었다. 폴더를 나누는 것은 맞다. export 만 요령 껏 하면 된다. 차차 해결 할 수 있다. terms 하고 notes 하고 구분하는 것은 무의미하다. glossary 와 다른 이야기다. 아니면 따로 나열 할 수도 있다. 일단 확실한 녀석들은 구분하는게 맞다.

      근데 immediate 로 넣으면 그게 terms 으로 가지 않는다. 즉, capture 에서 나눌 수는 없다. 심플하게 하자. 파일 갯수 고민하는 것은 무의미 하다.

  • 장난이 아니게 방대해서 감히 엄두가 안난다.

vanilla/takeonrules-dotfiles/emacs.d/knowledge-management-config.org

  • 이게 참고 하기 좋겠다. 욕심내지 마라.

vanilla/patrl-dotfiles/readme.org

할 것들 org-roam

  • note 에 상세 시간 적어야 겠다. 순서를 알 수가 없다.
  • blog url 을 가지고 reference 노트를 만들어 본다. cite 당 1 개의 노트가 있어야 한다. 그 노트에는 번역 해도 좋다.
  • org hugo-setup tag loading tag, category 등을 사전에 정리 해 놓았다. 이건 yml 로 관리를 할 것이다.
  • image 첨부가 잘 반영 되는가?
  • 노트명은 영어로 한다. Alias 는 한글로 한다. 검색에 지저분하게 나오지 않게 하는 것 url 은 영어로 하고 표기는 한글로 한다.
  • footnote 를 넣고 export 해본다.
  • citation 파일 연동
  • completion everywhere 시나리오 언제나 완성을 사용할 수 있어야 한다. 내가 관리하는 문서에 대해서. 즉, roam 폴더 아래에 있는 파일들을 대상으로 한다.
  • org-roam journal 은 사용 안한다. 즉, 키바인딩에 없게 한다. 그렇다면 매일 사용하는 저널 시나리오와 충돌이 나게 된다. 옮겨야 할 수도 있다. 다만, org-agenda 는 여기에 구애 받지 않아야 한다. 어젠다 파일도 옮겨야 한다면, 아예 나의 org 파일에 대한 전체 구성을 roam 으로 바꾼다는 말이다.
  • tags category
  • org-roam ekg settings

지금 하고 있는 작업

  • [-] citar 로 url 을 bib 에 넣어보자. 이건 org-roam 과 관계 없다. docs/org-cite-example.org 여기에 하다 말은 것 넣자.
  • org-roam hugo export
    • 일단 이전 노트들은 옮겨 놓는다. 새로 시작할 것이다.
    • org-roam capture 로 폴더 별로 노트를 만든다. (sample)

[2023-03-25 Sat 16:24]

blog customization

Netlify CMS + Netlify 로 블로그 사이트 관리 및 배포 자동화 하기 - DuiNaru | 개발과 경험을 담는 블로그 jf 의 모두스 색상이 좋다. [2023-03-25 Sat 16:44]

org-roam 테스트 및 hugo 테스트

[2023-05-16 Tue 12:53] 위에 할 것들에 적어 놓은 것들을 생각하되 기본 기능만 본다. 아주 심플하게 제로스 방식 그대로 한다. 워크플로우에 따라서 한다.

여기서 나눠야 할 것이 벤의 워크로드가 있다. 이미 반영되어 있다. 근데 벤은 딱히 걱정할게 없다. 아 어짜피 페이지는 articles 만 보낼거니까 상관 없다.

기능 검증 중심. 디테일 커스텀은 따로 목록 만들자.
  • 슬립박스에 엔트리 추가 캡처 하는거다. 아 베당님이 캡처 템블릿 쉽게 만드는 것 확인.
  • 심플하게 다 바꿈. 뺄 수 있는 것 다 뺀다. 왜?! 그게 시작이자 답을 찾는 과정이다.
  • citar-create-note citar 로 key 검색 후 key 이름으로 파일이 생성
  • reference capture 이름을 명시하는 것. 둘다 reference 폴더로 들어간다.
  • org-time-stamps 추가
  • footnote 에 레퍼런스를 달아보자 footnote new or action org-cite-insert
  • hello 에 roam-ref 를 넣어봐라. org-cite 말고
  • 근데 roam-ref 가 org-cite 랑 뭐가 어떻게 다른가? cite 에 일대일 대응되는게 롬레퍼런스이다. 사이트는 문서가 여러개 레퍼런스를 가지고 있다는 말이다. 물론 레퍼런스 중에는 롬에 문서 파일이 있는 것도 있고. 그냥 조테로에만 등록된 것도 있다.
  • 일단 braindump 스타일로 다 export 하자. 심플하게 하려면 폴더 구성을 단순하게 하는게 좋겠다.
  • 일단 이 파일을 main 으로 만든다.

Simple Note Taking System In Emacs

[2023-05-17 Wed 06:53] /home/junghan/sync/man/notes/EmacsElementsCurrent/my-note-taking-system.org

다른 것은 모르겠고, 일단 간단한 거 남길 때는 이렇게 사용해보자. 링크를 만들면 좋다.

org-tags-view 는 모든 어젠다 파일에서 태그 리스트를 만든다. 태그 리스트가 별로다. 태그를 사전에 대략 분류화 해놓고 싶다. 정책이 없이 태그가 달리는게 분별이 없다.

Node Hierarchy

[2023-07-10 Mon 18:50]

id 가 있어야 한다.

TODO Backlinks count display

Occasionally I want to see how many backlinks a particular page has.

This idea came to my mind because I often write a note in the following form:

According to <This Person>, <some opinion>

And I have a note called #Personalities that looks like that:

Philosophers:
- <This Person>
- <That Person>
- <Another Person>
...

So I’m curious to see how many notes I have linked to each:

Philosophers:
- <This Person> [30]
- <That Person> [40]
- <Another Person> [20]
...

The obvious way to implement that is via overlays:

(defface my/org-roam-count-overlay-face
  '((t :inherit tooltip))
  "Face for Org Roam count overlay.")

(defun my/org-roam--count-overlay-make (pos count)
  (let* ((overlay-value (concat
                         " "
                         (propertize
                          (format "%d" count)
                          'face 'my/org-roam-count-overlay-face)
                         " "))
         (ov (make-overlay pos pos (current-buffer) nil t)))
    (overlay-put ov 'roam-backlinks-count count)
    (overlay-put ov 'priority 1)
    (overlay-put ov 'after-string overlay-value)))

Also a function to remove them:

(defun my/org-roam--count-overlay-remove-all ()
  (dolist (ov (overlays-in (point-min) (point-max)))
    (when (overlay-get ov 'roam-backlinks-count)
      (delete-overlay ov))))

Now we can iterate over all roam links in the buffer, count the number of backlinks via org-roam-db-query and invoke my/org-roam--count-overlay-make if that number is greater than zero:

(defun my/org-roam--count-overlay-make-all ()
  (my/org-roam--count-overlay-remove-all)
  (org-element-map (org-element-parse-buffer) 'link
    (lambda (elem)
      (when (string-equal (org-element-property :type elem) "id")
        (let* ((id (org-element-property :path elem))
               (count (caar
                       (org-roam-db-query
                        [:select (funcall count source)
                         :from links
                         :where (= dest $s1)
                         :and (= type "id")]
                        id))))
          (when (< 0 count)
            (my/org-roam--count-overlay-make
             (org-element-property :end elem)
             count)))))))

And a minor mode to toggle the display in a particular org-roam buffer.

(define-minor-mode my/org-roam-count-overlay-mode
  "Display backlink count for org-roam links."
  :after-hook
  (if my/org-roam-count-overlay-mode
      (progn
        (my/org-roam--count-overlay-make-all)
        (add-hook 'after-save-hook #'my/org-roam--count-overlay-make-all nil t))
    (my/org-roam--count-overlay-remove-all)
    (remove-hook 'after-save-hook #'my/org-roam--count-overlay-remove-all t)))

CANCELLED ORG Review workflow

/home/junghan/sync/man/dotsamples/vanilla/sqrt-dotfiles/Emacs.org

UPD <2022-03-27 Sun>. Out of action for now

My take on a review workflow. As a baseline, I want to have a template that lists the important changes since the last review and other basic information. I’m doing reviews regularly, but the time intervals still may vary, hence this flexibility.

검토 워크플로우에 대한 제 생각 기본적으로 마지막 검토 이후 중요한 변경 사항과 기타 기본 정보를 나열하는 템플릿을 갖고 싶습니다. 정기적으로 검토를 하고 있지만 시간 간격이 달라질 수 있으므로 이러한 유연성이 필요합니다.

This section has seen some updates over time.

이 섹션은 시간이 지남에 따라 몇 가지 업데이트가 있었습니다.

Data from git

First, as I have Console.org autocommit set up in my org directory, here is a handy function to get an alist of changed files of a form (status . path). In principle, the rev parameter can be a commit, tag, etc but here I’m interested in a form like @{2021-08-30}.

Also in principle, Org Roam DB also stores stuff like creation time and modification time, but I started this section before I started using Org Roam extensively, so git works fine for me.

또한 원칙적으로 Org Roam DB 에는 생성 시간, 수정 시간 등도 저장되지만, 저는 Org Roam 을 광범위하게 사용하기 전에 이 섹션을 시작했기 때문에 git 이 잘 작동합니다.

(setq my/git-diff-status
      '(("A" . added)
        ("C" . copied)
        ("D" . deleted)
        ("M" . modified)
        ("R" . renamed)
        ("T" . type-changed)
        ("U" . unmerged)))

(defun my/get-files-status (rev)
  (let ((files (shell-command-to-string (concat "git diff --name-status " rev))))
    (mapcar
     (lambda (file)
       (let ((elems (split-string file "\t")))
         (cons
          (cdr (assoc (car elems) my/git-diff-status))
          (nth 1 elems))))
     (split-string files "\n" t))))

I’ll use it to get a list of added and changed files in the Org directory since the last review. The date should be in a format YYYY-MM-DD.

(defun my/org-changed-files-since-date (date)
  (let ((default-directory org-directory))
    (my/get-files-status (format "@{%s}" date))))

Data from org-roam

Now that we have the list of new & changed files, I want to sort into a bunch of categories: projects, log entries, etc. The categories are defined by tags.

이제 새 파일 및 변경된 파일 목록이 생겼으니 프로젝트, 로그 항목 등 여러 범주로 분류하고 싶습니다. 카테고리는 태그로 정의됩니다.

So here is a list of plists that sets these categories. The properties are as follows:

  • :status is a git status for the file
  • :tags is a plist that sets up the following conditions for the Roam node
    • :include - should be empty or one of these should be present
    • :exclude - should be empty or none of these should be present
  • :title is the name of category as I want it to be seen in the review template
(setq my/org-review-roam-queries
      '((:status added
                 :tags (:include ("org"))
                 :title "New Project Entries")
        (:status changed
                 :tags (:include ("org"))
                 :title "Changed Project Entries")
        (:status added
                 :tags (:exclude ("org"))
                 :title "New Zettelkasten Entries")
        (:status changed
                 :tags (:exclude ("org"))
                 :title "Changed Zettelkasten Entries")))

This list is used to extract & format the relevant section of the review template.

이 목록은 리뷰 템플릿의 관련 섹션을 추출하고 서식을 지정하는 데 사용됩니다.

cl-loop seems pretty good as a control flow structure, but I’ll see if it is also pretty good at producing poorly maintainable code. At least at the moment of this writing, the function below looks rather concise.

=CL-루프 = 는 제어 흐름 구조로는 꽤 괜찮은 것 같지만, 유지 관리가 잘 안 되는 코드를 생성하는 데도 괜찮은지 확인해 보겠습니다. 적어도 이 글을 쓰는 현재로서는 아래 함수가 꽤 간결해 보입니다.

(defun my/org-review-format-roam (changes)
  (cl-loop for query in my/org-review-roam-queries
           with nodes = (org-roam-node-list)
           with node-tags = (mapcar #'org-roam-node-tags nodes)
           for include-tags = (plist-get (plist-get query :tags) :include)
           for exclude-tags = (plist-get (plist-get query :tags) :exclude)
           ;; List of nodes filtered by :tags in query
           for filtered-nodes =
           (cl-loop for node in nodes
                    for tags in node-tags
                    if (and
                        (or (seq-empty-p include-tags)
                            (seq-intersection include-tags tags))
                        (or (seq-empty-p exclude-tags)
                            (not (seq-intersection exclude-tags tags))))
                    collect node)
           ;; List of changes filtered by :status in query
           for filtered-changes =
           (cl-loop for change in changes
                    if (and (eq (car change) (plist-get query :status))
                            (string-match-p (rx bos "roam") (cdr change)))
                    collect (cdr change))
           ;; Intersection of the two filtered lists
           for final-nodes =
           (cl-loop for node in filtered-nodes
                    for path = (file-relative-name (org-roam-node-file node)
                                                   org-directory)
                    if (member path filtered-changes)
                    collect node)
           ;; If the intersction list is not empty, format it to the result
           if final-nodes
           concat (format "** %s\n" (plist-get query :title))
           ;; FInal list of links, sorted by title
           and concat (cl-loop for node in (seq-sort
                                            (lambda (node1 node2)
                                              (string-lessp
                                               (org-roam-node-title node1)
                                               (org-roam-node-title node2)))
                                            final-nodes)
                               concat (format "- [[id:%s][%s]]\n"
                                              (org-roam-node-id node)
                                              (org-roam-node-title node)))))

Data from org-agenda via org-ql

Third second, I want to list some changes in my agenda. This section will change depending on what I’m currently working on.

+세 번째로, 제 안건의 몇 가지 변경 사항을 나열하고 싶습니다. 이 섹션은 제가 현재 진행 중인 작업에 따라 변경될 것입니다.

So, here is a list of queries results of which I want to see in the review template. The format is (name date-field order-by-field query).

다음은 검토 템플릿에서 보고자 하는 쿼리 결과 목록입니다. 형식은 (이름 날짜 필드 순서별 쿼리) 입니다.

(setq my/org-ql-review-queries
      `(("Waitlist" scheduled scheduled
         (and
          (done)
          (tags-inherited "waitlist")))
        ("Personal tasks done" closed ,nil
         (and
          (tags-inherited "personal")
          (todo "DONE")))
        ("Attended meetings" closed scheduled
         (and
          (tags-inherited "meeting")
          (todo "PASSED")))
        ("Done project tasks" closed deadline
         (and
          (todo "DONE")
          (ancestors
           (heading "Tasks"))))))

The query will be executed like this: (and (date-field :from rev-date) query)

(defun my/org-review-exec-ql (saved rev-date)
  (let ((query `(and
                 (,(nth 1 saved) :from ,rev-date)
                 ,(nth 3 saved))))
    (org-ql-query
      :select #'element
      :from (org-agenda-files)
      :where query
      :order-by (nth 2 saved))))

Format one element of the query result.

(defun my/org-review-format-element (elem)
  (concat
   (string-pad
    (plist-get (cadr elem) :raw-value)
    40)
   (when-let (scheduled (plist-get (cadr elem) :scheduled))
     (concat " [SCHEDULED: " (plist-get (cadr scheduled) :raw-value) "]"))
   (when-let (deadline (plist-get (cadr elem) :deadline))
     (concat " [DEADLINE: " (plist-get (cadr deadline) :raw-value) "]"))))

Execute all the saved queries and format an Org list for the capture template.

(defun my/org-review-format-queries (rev-date)
  (mapconcat
   (lambda (results)
     (concat "** " (car results) "\n"
             (string-join
              (mapcar (lambda (r) (concat "- " r)) (cdr results))
              "\n")
             "\n"))
   (seq-filter
    (lambda (result)
      (not (seq-empty-p (cdr result))))
    (mapcar
     (lambda (saved)
       (cons
        (car saved)
        (mapcar
         #'my/org-review-format-element
         (my/org-review-exec-ql saved rev-date))))
     my/org-ql-review-queries))
   "\n"))

Capture template

Now, we have to put all this together and define a capture template for the review.

I’ll use a separate directory for the review files, just like for org-journal and org-roam. I’ll store the review files in org-roam. Time will tell if that’s a good idea. The filename will have a format YYYY-MM-DD.org, which will also free me from the effort of storing the last review date somewhere.

If somehow there are no files in the folder, fallback to the current date minus one two week. Also featuring the most awkward date transformation I’ve ever done just to add one date.

(setq my/org-review-directory "review")

(defun my/get-last-review-date ()
  (->
   (substring
    (or
     (-max-by
      'string-greaterp
      (-filter
       (lambda (f) (not (or (string-equal f ".") (string-equal f ".."))))
       (directory-files (f-join org-roam-directory my/org-review-directory))))
     (format-time-string
      "%Y-%m-%d"
      (time-subtract
       (current-time)
       (seconds-to-time (* 60 60 24 14)))))
    0 10)
   (concat "T00:00:00-00:00")
   parse-time-string
   encode-time
   (time-add (seconds-to-time (* 60 60 24)))
   ((lambda (time)
      (format-time-string "%Y-%m-%d" time)))))

A template looks like this:

(setq my/org-review-capture-template
      `("r" "Review" plain
        ,(string-join
          '("#+title: %<%Y-%m-%d>: REVIEW"
            "#+category: REVIEW"
            "#+filetags: log review"
            "#+STARTUP: overview"
            ""
            "Last review date: %(org-timestamp-translate (org-timestamp-from-string (format \"<%s>\" (my/get-last-review-date))))"
            ""
            "* Roam"
            "%(my/org-review-format-roam (my/org-changed-files-since-date (my/get-last-review-date)))"
            "* Agenda"
            "%(my/org-review-format-queries (my/get-last-review-date))"
            "* Thoughts"
            "%?")
          "\n")
        :if-new (file "review/%<%Y-%m-%d>.org.gpg")))

(defun my/org-roam-capture-review ()
  (interactive)
  (org-roam-capture- :node (org-roam-node-create)
                     :templates `(,my/org-review-capture-template)))

관련 링크

links::PKM ONE – Medium

links::Semantic Search for Org roam | lgmoneda

Langtools 관련 된 글이다 훌륭하다.

DONE CANCELLED nursery 참고 > 저자가 둠이맥스 사용자라

“chrisbarrett/nursery”

Related-Notes

References

마지막 수정일자