Ваша личная база знаний с JupyterLab

Давным-давно я использовал Evernote как свою личную базу знаний. Я был
собирая фрагменты знаний из моих проектов, над которыми я работал. Один из
постоянные проблемы заключались в том, чтобы я не вставлял случайно конфиденциальные данные
как часть фрагментов. С другой стороны, я использовал только часть Evernote
предложение — в основном древовидная организация заметок и полнотекстовый поиск для фильтрации
карты.

Уже несколько лет у меня есть домашние проекты с широким использованием Jupyter.
блокноты. Однажды я спросил себя — почему бы не использовать блокнот Jupyter как полноценное
личная база знаний? Однажды это превратилось в реальность.

В настоящее время у меня есть среда jupyterlab, интегрированная в мои dotfiles:
https://github.com/Voronenko/dotfiles/tree/master/ноутбук
— на каждом рабочем месте у меня есть виртуальная среда с JupyterLab,
и я могу легко вызвать его с помощью ярлыка оболочки

alias znotes=’workon project_notes && cd ${ZNOTES_PATH-~/z_personal_notes} &&
лаборатория юпитера

Мне не хватало функции быстрой фильтрации блокнота, когда я знаю его имя — и
это успешно решено расширением jupyterlab

Еще одной отсутствующей функцией была поддержка шаблонов — мои заметки обычно следуют
конкретный шаблон для облегчения поиска и анализа. Это также можно решить с помощью
пользовательский плагин, на этот раз

Одним из заметных бонусов является возможность встраивания диаграмм, связанных с моим
программные проекты, а также интерактивные фрагменты кода.

Единственная отсутствующая функция — это полнотекстовый поиск. Я в основном консольщик, поэтому
пока я использую обходной путь с nbgrep:

Одна партия ищет записи в ячейках кода


#!/bin/bash




SEARCHPATH=${ZNOTES_PATH-~/z_personal_notes}
SEARCHFILTER=".cells[]? | select(.cell_type==\"markdown\") | .source[]?//.input"


readonly C_NOC="\\033[0m"    
readonly C_RED="\\033[0;31m" 
readonly C_GRN="\\033[0;32m" 
readonly C_BLU="\\033[0;34m" 
readonly C_PUR="\\033[0;35m" 
readonly C_CYA="\\033[0;36m" 
readonly C_WHI="\\033[0;37m" 

print_red () { local i; for i in "$@"; do echo -e "${C_RED}${i}${C_NOC}"; done }
print_grn () { local i; for i in "$@"; do echo -e "${C_GRN}${i}${C_NOC}"; done }
print_blu () { local i; for i in "$@"; do echo -e "${C_BLU}${i}${C_NOC}"; done }
print_pur () { local i; for i in "$@"; do echo -e "${C_PUR}${i}${C_NOC}"; done }
print_cya () { local i; for i in "$@"; do echo -e "${C_CYA}${i}${C_NOC}"; done }
print_whi () { local i; for i in "$@"; do echo -e "${C_WHI}${i}${C_NOC}"; done }






SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

if ! type mdfind > /dev/null 2>&1; then
    
    echo find $SEARCHPATH -name '*.ipynb'
    FILES=$(find $SEARCHPATH -name '*.ipynb')
else
    
    
    FILES=$(mdfind -onlyin $SEARCHPATH -name '.ipynb')
fi


PATTERN=$1

for f in $FILES
do
    
    
    
    

    OUTPUT=$(jq $SEARCHFILTER $f \
        | sed 's/^"//g;s/"$//g;s/\\n$//g;s/\\"/"/g;s/\\\\/\\/g;s/\\n/\n/g' \
        | pygmentize -l python 2>/dev/null \
        | grep $PATTERN)


    
    if [ $? -eq 0 ]; then
        echo -e "${C_CYA}$f${C_NOC}:\n\n$OUTPUT\n\n"
    fi
done

IFS=$SAVEIFS

и другой сценарий оболочки отслеживает записи в ячейках уценки


#!/bin/bash




SEARCHPATH=${ZNOTES_PATH-~/z_personal_notes}
SEARCHFILTER=".cells[]? | select(.cell_type==\"markdown\") | .source[]?//.input"


readonly C_NOC="\\033[0m"    
readonly C_RED="\\033[0;31m" 
readonly C_GRN="\\033[0;32m" 
readonly C_BLU="\\033[0;34m" 
readonly C_PUR="\\033[0;35m" 
readonly C_CYA="\\033[0;36m" 
readonly C_WHI="\\033[0;37m" 

print_red () { local i; for i in "$@"; do echo -e "${C_RED}${i}${C_NOC}"; done }
print_grn () { local i; for i in "$@"; do echo -e "${C_GRN}${i}${C_NOC}"; done }
print_blu () { local i; for i in "$@"; do echo -e "${C_BLU}${i}${C_NOC}"; done }
print_pur () { local i; for i in "$@"; do echo -e "${C_PUR}${i}${C_NOC}"; done }
print_cya () { local i; for i in "$@"; do echo -e "${C_CYA}${i}${C_NOC}"; done }
print_whi () { local i; for i in "$@"; do echo -e "${C_WHI}${i}${C_NOC}"; done }






SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

if ! type mdfind > /dev/null 2>&1; then
    
    echo find $SEARCHPATH -name '*.ipynb'
    FILES=$(find $SEARCHPATH -name '*.ipynb')
else
    
    
    FILES=$(mdfind -onlyin $SEARCHPATH -name '.ipynb')
fi


PATTERN=$1

for f in $FILES
do
    
    
    
    

    OUTPUT=$(jq $SEARCHFILTER $f \
        | sed 's/^"//g;s/"$//g;s/\\n$//g;s/\\"/"/g;s/\\\\/\\/g;s/\\n/\n/g' \
        | pygmentize -l python 2>/dev/null \
        | grep $PATTERN)


    
    if [ $? -eq 0 ]; then
        echo -e "${C_CYA}$f${C_NOC}:\n\n$OUTPUT\n\n"
    fi
done

IFS=$SAVEIFS

Если у вас есть лучший вариант для запуска полнотекстового поиска по набору JupyterLab
блокноты — прокомментируйте под статьей — буду очень благодарен.

И, наконец, последняя возможность: KeyBase. Если вы воспользуетесь
— вы можете положить свою базу знаний на
смонтированная папка базы ключей (либо запеченная git, либо просто на основе файла) — таким образом
ваша база знаний становится полностью переносимой.

В текущих настройках — он охватывает мой рабочий процесс для заметок по проекту, но я постоянно
поиск дополнительных плагинов, которые могли бы улучшить опыт использования.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *