<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>обучение и базы знаний</title><subtitle>Эффективное обучение и личные картотеки. Научный взгляд 🔬
подкаст https://music.yandex.ru/album/35116811</subtitle><author><name>обучение и базы знаний</name></author><id>https://teletype.in/atom/zakirov_edtech</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/zakirov_edtech?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@zakirov_edtech?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zakirov_edtech"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/zakirov_edtech?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-10-11T23:08:34.894Z</updated><entry><id>zakirov_edtech:i37cCgPLnbT</id><link rel="alternate" type="text/html" href="https://teletype.in/@zakirov_edtech/i37cCgPLnbT?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zakirov_edtech"></link><title>Практика использования персональных баз знаний и Obsidian в самообразовании XXI в.</title><published>2025-06-07T15:42:09.451Z</published><updated>2025-09-11T12:25:14.903Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/29/0f/290f1cc4-b462-48c9-9bad-e10ab1a70b7a.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/7e/24/7e2433b0-4a23-4b94-9779-19866135af89.png&quot;&gt;Написана научная работа в Институте Образования ТГУ. Информация и выводы не претендуют на достоверность, тем более научное поле совсем не исследовано. Научная работа предназначена для новичков, которые хотят ознакомиться со сферой управления персональными знаниями и для тех, кто хочет ознакомиться с программой Obsidian. Полная версия по ссылке</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;zwAa&quot;&gt;&lt;em&gt;Написана научная работа в Институте Образования ТГУ. Информация и выводы не претендуют на достоверность, тем более научное поле совсем не исследовано. Научная работа предназначена для новичков, которые хотят ознакомиться со сферой управления персональными знаниями и для тех, кто хочет ознакомиться с программой Obsidian. Полная версия по &lt;a href=&quot;https://docs.google.com/document/d/1XKDlmPNk4JcxeI0caiuJdkYxweIwS5gW/edit?usp=sharing&amp;ouid=106160181512071754677&amp;rtpof=true&amp;sd=true&quot; target=&quot;_blank&quot;&gt;ссылке&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;figure id=&quot;t1M3&quot; class=&quot;m_column&quot;&gt;
      &lt;img src=&quot;https://img4.teletype.in/files/7e/24/7e2433b0-4a23-4b94-9779-19866135af89.png&quot; width=&quot;1200&quot; /&gt;
      &lt;figcaption&gt;Программы для ведения заметок&lt;/figcaption&gt;
    &lt;/figure&gt;
  &lt;/section&gt;
  &lt;p id=&quot;Iwra&quot;&gt;&lt;strong&gt;Ниже можно ознакомиться с введением научной работы ⬇ ⬇ ⬇&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;CxKX&quot;&gt;В 2004 г. Анжело Маравита и Ацуси Ирики провели исследование, в ходе которого было установлено, что мозг приматов и человека, регулярно использующих инструменты, начинает воспринимать их как часть тела . Данное открытие позволяет предположить, что современные цифровые инструменты, заменившие традиционные орудия труда, также интегрируются в когнитивные процессы.&lt;/p&gt;
  &lt;p id=&quot;foWS&quot;&gt;Человек в доцифровую эпоху уже обладал инструментами, позволяющими экстернализировать собственные идеи и размышления: глиняные таблички, береста, краски, бумага, перо, ручки. Подобный примитивный набор современным людям кажется недостаточным: мы храним на серверных установках столько информации, сколько никогда не уместилось бы в рукописном виде. Однако человеку в эпоху бумажных технологий хватало данного инструментария, чтобы открывать и исследовать мир.&lt;/p&gt;
  &lt;p id=&quot;dWEN&quot;&gt;Сегодня нужен принципиально отличающийся подход к обработке накопленных массивов знаний человечества. Информационные технологии кардинально изменили традиционные методы самообразования, самоанализа и личностного развития. Человеку в цифровую эпоху недостаточно ручки и бумаги, так как информационный шум не позволит получить результаты форсированно – данная практика потребует большого количества времени. Использование цифровых помощников не просто рекомендация, а необходимость в условиях конкуренции за знания.&lt;/p&gt;
  &lt;p id=&quot;PiGu&quot;&gt;Однако стремительный рост объема данных и развитие искусственного интеллекта требуют новых подходов к обработке знаний. Петиция о рисках ИИ, подписанная ведущими разработчиками, подчеркивает важность осмысленного управления информацией . В условиях глобального информационного взрыва XXI в. актуальной становится проблема трансформации информации в персонифицированные знания . Особую значимость этот вопрос приобретает в контексте современного образования, где возрастает роль “самонавыков”.&lt;/p&gt;
  &lt;p id=&quot;9CYE&quot;&gt;В 2023 г. автором был опробован метод Zettelkasten (буквальный перевод с нем. “ящик для заметок”) Никласа Лумана, известного немецкого социолога, что позволило зафиксировать положительные эффекты от использования цифровых инструментов для создания персональных баз знаний (далее ПБЗ). С этого момента началось личное знакомство с культурой knowledge management (авторский перевод с англ. “культура управления персональными и корпоративными знаниями”). Использование программы Obsidian продемонстрировало такие преимущества, как улучшение запоминания, глубины проработки материала и генерации новых идей.&lt;/p&gt;
  &lt;p id=&quot;WEpK&quot;&gt;Изучение данной программы, широко распространенного инструмента для организации персональных информационных хранилищ, позволило сформулировать закономерный вопрос: каковы причины ее относительно низкой популярности? В ходе взаимодействия были выявлены многочисленные когнитивные преимущества применения системы персональных баз знаний. К их числу относятся: интенсификация аналитических процессов, повышение качества усвоения информации, углубленная проработка материала, усиление концентрации внимания, улучшение мнемических функций, а также стимуляция генерации новых идей. Перечисленные эффекты представляют собой лишь часть положительных эффектов от использования данной методики.&lt;/p&gt;
  &lt;p id=&quot;MOcT&quot;&gt;Несмотря на растущую популярность персонализированных систем управления знаниями, остается неясным, как использование данных инструментов для управления персонифицированными базами знаний коррелирует с объективными показателями эффективности самообразования, если такие существуют (скорость усвоения информации, глубина понимания, креативность выводов).&lt;/p&gt;
  &lt;p id=&quot;AkYP&quot;&gt;&lt;strong&gt;Актуальность исследования обусловлена:&lt;/strong&gt;&lt;/p&gt;
  &lt;ol id=&quot;RZsM&quot;&gt;
    &lt;li id=&quot;jo6s&quot;&gt;Необходимостью адаптации человека к новой образовательной, информационной и цифровой реальности, так как наблюдается высокая конкуренция за знания;&lt;/li&gt;
    &lt;li id=&quot;1hRG&quot;&gt;Ростом вовлеченности взрослого населения в самообразование (по данным НИУ ВШЭ, с 21% в 2015 году до 37% в 2019 году) ;&lt;/li&gt;
    &lt;li id=&quot;Yi8B&quot;&gt;Возможным потенциалом концепции управления персональными знаниями в рамках использования цифровых инструментов;&lt;/li&gt;
    &lt;li id=&quot;YnEs&quot;&gt;Отсутствием эмпирических данных о влиянии ПБЗ на эффективность самообразования (научная актуальность).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;7GtQ&quot;&gt;&lt;strong&gt;Проблема исследования:&lt;/strong&gt; противоречие между феноменом использования ПБЗ как инструмента самообразования и недостаточной изученностью эффективности данного метода обучения.&lt;/p&gt;
  &lt;p id=&quot;zMlZ&quot;&gt;&lt;strong&gt;Цель исследования: &lt;/strong&gt;проанализировать и обосновать роль персональных баз знаний как инструмента когнитивной оптимизации самообразования в условиях цифровой трансформации.&lt;/p&gt;
  &lt;p id=&quot;9xXQ&quot;&gt;&lt;strong&gt;Объект исследования:&lt;/strong&gt; персональные базы знаний в эпоху бумажных и цифровых технологий.&lt;/p&gt;
  &lt;p id=&quot;UQCq&quot;&gt;&lt;strong&gt;Задачи научной работы:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;btrE&quot;&gt;
    &lt;li id=&quot;DvRw&quot;&gt;Рассмотреть предпосылки зарождения тенденции к непрерывному самообразованию;&lt;/li&gt;
    &lt;li id=&quot;FKt7&quot;&gt;Проанализировать поисковые запросы и доказать популярность концепции ведения персональных баз знаний;&lt;/li&gt;
    &lt;li id=&quot;fR90&quot;&gt;Провести исследование исторических предпосылок, предопределяющих современное состояние концепции управления знаниями на примере творческих личностей и ключевых исторических событий;&lt;/li&gt;
    &lt;li id=&quot;7ok4&quot;&gt;Используя междисциплинарный подход, показать, какие существуют преимущества использования персональных баз знаний в рамках цифровых инструментов;&lt;/li&gt;
    &lt;li id=&quot;MMlI&quot;&gt;Представить кейс с описанием конкретного практического примера применения такого инструмента, как Obsidian, для самообразования в рамках практики использования персонифицированных баз знаний.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;R8DF&quot;&gt;&lt;strong&gt;Теоретические методы исследования:&lt;/strong&gt; анализ научной литературы.&lt;/p&gt;
  &lt;p id=&quot;Se8H&quot;&gt;&lt;strong&gt;Эмпирические методы исследования: &lt;/strong&gt;кейс-стади, анализ поисковых запросов, наблюдение, сравнительный анализ (приложение А).&lt;/p&gt;

</content></entry><entry><id>zakirov_edtech:S4DvC3IHKae</id><link rel="alternate" type="text/html" href="https://teletype.in/@zakirov_edtech/S4DvC3IHKae?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zakirov_edtech"></link><title>Понимание/запоминание иностранных языков</title><published>2025-03-11T13:52:57.343Z</published><updated>2025-06-07T15:42:37.509Z</updated><category term="learning" label="learning"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/a2/e3/a2e39cba-db3c-4c5d-8233-c6305a540aca.png&quot;&gt;Telegram-канал | Наш подкаст</summary><content type="html">
  &lt;p id=&quot;OKpl&quot; data-align=&quot;right&quot;&gt;&lt;strong&gt;&lt;em&gt;&lt;a href=&quot;https://t.me/ed_knowledgebase&quot; target=&quot;_blank&quot;&gt;Telegram-канал&lt;/a&gt; &lt;/em&gt;|&lt;em&gt; &lt;a href=&quot;https://edknowledge.mave.digital&quot; target=&quot;_blank&quot;&gt;Наш подкаст&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;HIJe&quot;&gt;Про мнемонику и процесс запоминания будет огромный отдельный разговор, а пока поговорим про сложные субстанции: понимание незнакомых слов, которые нельзя визуализировать&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;DRBA&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a2/e3/a2e39cba-db3c-4c5d-8233-c6305a540aca.png&quot; width=&quot;547&quot; /&gt;
    &lt;figcaption&gt;Какой fabric&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;3f8s&quot;&gt;Ключевая проблема в запоминании: &lt;strong&gt;это невозможность представить объект и визуализировать его&lt;/strong&gt;. Иностранные незнакомые слова, математические формулы, химические уравнения, философские идеи – все это сложно представить в образах и к тому же сложно связать с чем-то. Это классическая история, описанная в учебниках по мнемонике 📐&lt;/p&gt;
  &lt;h3 id=&quot;fmxc&quot;&gt;МФА (метод фонетических ассоциаций) решает проблему запоминания таких сложных символов. Как это работает?&lt;/h3&gt;
  &lt;figure id=&quot;GTtU&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c1/23/c1230c69-e0cd-4d43-ba3f-7463029b5295.png&quot; width=&quot;579&quot; /&gt;
    &lt;figcaption&gt;Факторы запоминания&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7uHP&quot;&gt;&lt;strong&gt;Look = лук &lt;/strong&gt;звучание на русском (это типичный пример запоминания). Представляете себе картинку, как из-за лука щиплет глаза &lt;strong&gt;--&amp;gt;&lt;/strong&gt; отсюда перевод &lt;em&gt;&amp;quot;смотреть&amp;quot;&lt;/em&gt;. В следующий раз, когда попадается слово, главное удачно его произнести&lt;/p&gt;
  &lt;p id=&quot;Kfxs&quot;&gt;&lt;strong&gt;Successfully &lt;/strong&gt;--&amp;gt; cложнее запоминать. Созвучных слов никаких нет, но тут вам на ум приходит какой-нибудь ваш локальный мем с этим словом. В общем: у вас есть определенная связанная история. Вспоминаете ее и проговариваете слово. &lt;br /&gt;Еще вариант: понимание правил словообразования. Если вы знаете значение слова &lt;em&gt;&amp;quot;success&amp;quot;&lt;/em&gt;, не затруднит и дать толкование слову&lt;em&gt; &amp;quot;successfully&amp;quot;&lt;/em&gt;. Это логическое мышление, про него я рассказывал в выпуске подкаста &lt;a href=&quot;https://edknowledge.mave.digital/ep-8&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;&amp;quot;Не выучить, а запомнить термины. Основы логики&amp;quot;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;J0mH&quot;&gt;Ключевой момент тут: &lt;strong&gt;это связывание&lt;/strong&gt;. Вы связываете незнакомые символы со знакомым образом. Таким образом, незнакомый раннее набор символов превращается в конкретный образ. Как это функционирует с точки зрения когнитивных мозговых процессов – до конца не понятно&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;5m9t&quot;&gt;&lt;strong&gt;⚠ Задача:&lt;/strong&gt; остановиться на слове, которое не знаете, и вдумчиво, внимательно его разобрать (с чем связано, какие ассоциации, в каком контексте употребляется)&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;JMk5&quot;&gt;Очевидно, что запоминание vocabulary – это далеко даже не половина от изучения нового языка. Это сложный и многогранный процесс, но в данном посте пока разобрали только техники запоминания. &lt;strong&gt;Отдельные вопросы:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;d7dT&quot;&gt;
    &lt;li id=&quot;Vi4p&quot;&gt;разговорный иностранный&lt;/li&gt;
    &lt;li id=&quot;TlhX&quot;&gt;мышление на иностранным языке&lt;/li&gt;
    &lt;li id=&quot;qr9E&quot;&gt;флеш-карточки&lt;/li&gt;
    &lt;li id=&quot;9Jnl&quot;&gt;регулярность&lt;/li&gt;
    &lt;li id=&quot;aeFC&quot;&gt;иностранная среда&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;KgY6&quot;&gt;&lt;strong&gt;&lt;em&gt;Ссылки на научные материалы в telegram-канале ⬇&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;ZGGT&quot;&gt;&lt;a href=&quot;https://t.me/ed_knowledgebase&quot; target=&quot;_blank&quot;&gt;Telegram-канал &amp;quot;Обучение и базы знаний&amp;quot;&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;8xTQ&quot;&gt;&lt;a href=&quot;https://edknowledge.mave.digital&quot; target=&quot;_blank&quot;&gt;Подкаст &amp;quot;Обучение и базы знаний&amp;quot;&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;gjjQ&quot;&gt;&lt;a href=&quot;http://second-brain.ru&quot; target=&quot;_blank&quot;&gt;Дружественное сообщество Second brain&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>zakirov_edtech:qOTifC9ddKc</id><link rel="alternate" type="text/html" href="https://teletype.in/@zakirov_edtech/qOTifC9ddKc?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zakirov_edtech"></link><title>Storage in Obsidian under the scalpel #1</title><published>2025-02-06T06:34:03.614Z</published><updated>2025-02-06T06:34:03.614Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/50/dc/50dcd8ca-eb25-4809-aa68-b924c4547162.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/65/2c/652c7f97-b41d-4b73-aa4b-836620dfa395.png&quot;&gt;Автор хранилища: Sebastian Dubois</summary><content type="html">
  &lt;p id=&quot;YsmN&quot; data-align=&quot;right&quot;&gt;&lt;em&gt;Автор хранилища: &lt;a href=&quot;https://www.dsebastien.net/personal-knowledge-management-at-scale-analyzing-8-000-notes-and-64-000-links/&quot; target=&quot;_blank&quot;&gt;Sebastian Dubois&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h3 id=&quot;J58O&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Общая статистика:&lt;/strong&gt;&lt;/h3&gt;
    &lt;p id=&quot;xYho&quot; data-align=&quot;center&quot;&gt;&lt;em&gt;8000 заметок&lt;br /&gt;64000 ссылок-связей&lt;br /&gt;2,8 млн. слов = эквивалент 32 книг&lt;br /&gt;3 года работы в Obsidian&lt;/em&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;oyHQ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/65/2c/652c7f97-b41d-4b73-aa4b-836620dfa395.png&quot; width=&quot;1217&quot; /&gt;
    &lt;figcaption&gt;graph Obsidian&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;ifFr&quot;&gt;&lt;strong&gt;Первоначальная цель:&lt;/strong&gt; создание надежного &amp;quot;второго мозга&amp;quot; для личных нужд&lt;br /&gt;&lt;strong&gt;Результат:&lt;/strong&gt; БЗ используется для создания контента, проведения исследований и применения бизнес-решений&lt;/p&gt;
  &lt;/section&gt;
  &lt;blockquote id=&quot;PF24&quot;&gt;Дело в том, что я всегда хотел иметь единый источник достоверной информации для всего своего контента и идей. Но мне потребовалось много времени, чтобы этого добиться. За последние несколько лет моя система сильно выросла, и теперь я полагаюсь на неё каждый день во всём&lt;/blockquote&gt;
  &lt;p id=&quot;GOdB&quot;&gt;&lt;strong&gt;Плотность ссылок существенно варьируется в зависимости от типа заметки:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;0KrK&quot;&gt;
    &lt;li id=&quot;0bOf&quot;&gt;MOC: 90,1 ссылки на заметку&lt;/li&gt;
    &lt;li id=&quot;UHYj&quot;&gt;Опубликованные статьи: 6.3 ссылки на заметку&lt;/li&gt;
    &lt;li id=&quot;AQlH&quot;&gt;Литературные заметки: 5.4 ссылки на заметку&lt;/li&gt;
    &lt;li id=&quot;seUN&quot;&gt;Обычные заметки: 2,9 ссылки на заметку&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;LhdY&quot;&gt;&lt;strong&gt;Ключевые разделы включают:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;GSXs&quot;&gt;
    &lt;li id=&quot;amt5&quot;&gt;Постоянные заметки (1458 заметок, 413 тысяч слов)&lt;/li&gt;
    &lt;li id=&quot;or3R&quot;&gt;Литературные заметки (2227 примечаний, 169 тысяч слов)&lt;/li&gt;
    &lt;li id=&quot;JFq4&quot;&gt;MOC (118 заметок)&lt;/li&gt;
    &lt;li id=&quot;ViQy&quot;&gt;Люди (635 заметок, 81 тысяча слов)&lt;/li&gt;
    &lt;li id=&quot;ZLJr&quot;&gt;Цитаты (1741 заметка, 169 тысяч слов)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;RUQu&quot;&gt;Под литературными заметками автор вряд ли имеет в виду 1 заметка = 1 книга (как с MOC). Речь о всех заметках, связанных с прочитанной литературой. Постоянные заметки – скорее всего аналог &amp;quot;вечнозелёных заметок&amp;quot;. Интересное авторское решение: это заметки о людях + связанные с ним цитаты&lt;/p&gt;
  &lt;blockquote id=&quot;V9Av&quot;&gt;Я очень люблю цитаты, но мне также нравится связывать идеи с людьми, которые их придумали. Поэтому у меня так много заметок о людях&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;8WrZ&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Automation and Templates&lt;/strong&gt;&lt;/h3&gt;
  &lt;ul id=&quot;TGzV&quot;&gt;
    &lt;li id=&quot;Iqp9&quot;&gt;27 шаблонов&lt;/li&gt;
    &lt;li id=&quot;eqF3&quot;&gt;Автоматическое перемещение заметок на основа тегов (Плагин Auto note mover)&lt;/li&gt;
    &lt;li id=&quot;ArZV&quot;&gt;Автоматизация резервного копирования&lt;/li&gt;
    &lt;li id=&quot;rxrH&quot;&gt;Автоматическая генерация статистики&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;SYEp&quot;&gt;Для такого огромного хранилища есть существенная потребность в корректно настроенном резервном копировании и в доступе к актуальной статистике&lt;/p&gt;
  &lt;p id=&quot;ujHr&quot;&gt;1. Шаблоны для всех типов контента для обеспечения единообразия: для каждого основного типа заметок есть отдельный шаблон (например, периодические заметки, заметки о встречах, литературные заметки, цитаты и т. д.)&lt;/p&gt;
  &lt;p id=&quot;bTuj&quot;&gt;2. Автоматическая сортировка для упрощения работы с контентом: я использую плагин для автоматической сортировки заметок по тегам&lt;/p&gt;
  &lt;p id=&quot;yiYu&quot;&gt;3. Специальная папка «Ресурсы» для всех вложений (1309 файлов, ~700 МБ): я не хочу думать о том, куда помещать вложения. Все они попадают в одну папку «Вложения». Чтобы найти их, я просто ориентируюсь на ссылки в соответствующих заметках&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;ko1N&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;System Architecture and structure&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;1rtE&quot;&gt;Автор использует Obsidian в качестве инструмента для размышления (TfT) и единого источника истины (SSOT). По-русски: абсолютно любый мысленный процесс, касающихся любых жизненных сфер, происходит у автора в Obsidian&lt;/p&gt;
  &lt;p id=&quot;EcKX&quot;&gt;Автор хранилища использует PARA-метод Тьяго Форте для организации папок. &lt;a href=&quot;https://notes.dsebastien.net/30+Areas/33+Permanent+notes/33.02+Content/Johnny+Decimal+system?ref=dsebastien.net&quot; target=&quot;_blank&quot;&gt;Десятичная система Джонни&lt;/a&gt; помогает поддерживать порядок в папках + Zettelkasten.&lt;/p&gt;
  &lt;p id=&quot;hTpF&quot;&gt;&lt;strong&gt;3 принципа:&lt;/strong&gt;&lt;/p&gt;
  &lt;ol id=&quot;1TkL&quot;&gt;
    &lt;li id=&quot;R97H&quot;&gt;Структура (PARA + Десятичная система Джонни)&lt;/li&gt;
    &lt;li id=&quot;i3hz&quot;&gt;Автоматизация (про шаблоны раннее)&lt;/li&gt;
    &lt;li id=&quot;CVLP&quot;&gt;Критерии для сохранения информации&lt;/li&gt;
  &lt;/ol&gt;
  &lt;blockquote id=&quot;bKvF&quot;&gt;В-третьих, и это самое важное, у меня есть реальная система. Я не собираю информацию бездумно. Я знаю о своих целях, приоритетах и о том, как я хочу, чтобы информация превращалась в знания, которые я могу использовать. Вся информация, которую я собираю, попадает в воронку, независимо от источника, и оказывается в моей интегрированной среде для мышления. Всё остальное считается временным&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;rRqe&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Выводы&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;JCBG&quot;&gt;Несмотря на &amp;quot;деревянность&amp;quot; и излишнюю структурированность хранилища (чего стоит только автоматическое тегирование заметок) очевидно, что персональная база знаний полностью соответствует ожиданиям пользователя и полностью удовлетворяет его потребности. В очередной раз приходим к тому, что нет универсального решения в управлении личными знаниями&lt;/p&gt;
  &lt;blockquote id=&quot;A8TB&quot;&gt;Один из важнейших уроков заключался в том, что лучшая техническая архитектура — это зачастую самая простая архитектура, способная справиться со сложностью вашего сценария использования. Хотя было заманчиво создавать сложные схемы автоматизации и организации, сочетание обычных текстовых файлов, простых структур папок и автоматизированной организации на основе тегов оказалось на удивление надёжным и удобным в обслуживании&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;MQB9&quot;&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/ed_knowledgebase&quot; target=&quot;_blank&quot;&gt;Обучение и базы знаний&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Vc81&quot;&gt;&lt;em&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/second_brain_ru&quot; target=&quot;_blank&quot;&gt;Second Brain&lt;/a&gt; про управление личными знаниями&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;yPMq&quot;&gt;&lt;em&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/obsidianrus&quot; target=&quot;_blank&quot;&gt;Pro Obsidian&lt;/a&gt; про Obsidian и заметковедение&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;2PJ9&quot;&gt;&lt;em&gt;✔ Официальный &lt;a href=&quot;https://second-brain.ru/&quot; target=&quot;_blank&quot;&gt;сайт&lt;/a&gt; сообщества Second Brain&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;N8ZQ&quot;&gt;✔ Youtube-канал &lt;a href=&quot;https://www.youtube.com/@second-brain&quot; target=&quot;_blank&quot;&gt;Second brain&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>zakirov_edtech:Lu6u_3M6FTq</id><link rel="alternate" type="text/html" href="https://teletype.in/@zakirov_edtech/Lu6u_3M6FTq?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zakirov_edtech"></link><title>Designer and functional habit tracker in Obsidian | установка и настройка</title><published>2025-02-03T07:43:47.149Z</published><updated>2025-02-03T10:23:26.247Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/d6/16/d61690d6-6bc1-4858-8788-d52f3795ec7d.png"></media:thumbnail><category term="obsidian" label="Obsidian"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/ab/06/ab06f49c-6206-425c-b746-0e5c927e95e0.jpeg&quot;&gt;Автор: Шейн Тиммонс</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;8ogJ&quot;&gt;&lt;strong&gt;Автор:&lt;/strong&gt; &lt;a href=&quot;https://stimmons.substack.com/p/building-a-powerful-habit-tracker&quot; target=&quot;_blank&quot;&gt;Шейн Тиммонс&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;nfpN&quot;&gt;На сайте автора, где была подробная инструкция, перестали работать ссылки, поэтому пришлось искать способы реализации это трекера привычек у других пользователей&lt;/p&gt;
  &lt;figure id=&quot;isO8&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/30/e2/30e2dffe-4143-4274-9e25-8191142aa466.png&quot; width=&quot;2000&quot; /&gt;
    &lt;figcaption&gt;Habit Tracker in Obsidian&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;cXoG&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Инструкция&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;6ghA&quot;&gt;Все, что нужно для создания трекера привычек – это плагин Datacore и код трекера. Так как плагина нет в сторонних плагинах в Obsidian, придется устанавливать его вручную на своих страх и риск ❕&lt;/p&gt;
  &lt;p id=&quot;geS3&quot;&gt;1. Скачиваем плагин &lt;strong&gt;BRAT &lt;/strong&gt;из сторонних плагинов в Obsidian. Он нам нужен для установки плагина Datacore&lt;/p&gt;
  &lt;figure id=&quot;3UlY&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b6/1f/b61f7c5a-2088-40bc-9329-3123aac0d71e.png&quot; width=&quot;1375&quot; /&gt;
    &lt;figcaption&gt;BRAT-плагин&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cNff&quot;&gt;2. Вызываем панель команд в Obsidian &lt;strong&gt;(CTRL + P)&lt;/strong&gt;. Прописываем: &lt;em&gt;&lt;strong&gt;BRAT: Plugins&lt;/strong&gt;... &lt;/em&gt;Выбираем&lt;em&gt; &lt;strong&gt;Add a beta plugin for testing&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;figure id=&quot;3qWg&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/27/31/2731e213-687a-43bf-98dc-3a0f385344df.png&quot; width=&quot;1182&quot; /&gt;
    &lt;figcaption&gt;BRAT-плагин&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;bCBu&quot;&gt;3. В открывшемся окне вставляем ссылку на github c плагином &lt;strong&gt;Datacore&lt;/strong&gt;: &lt;a href=&quot;https://github.com/blacksmithgu/datacore&quot; target=&quot;_blank&quot;&gt;https://github.com/blacksmithgu/datacore&lt;/a&gt;. Так мы установим и включим плагин&lt;/p&gt;
  &lt;figure id=&quot;MDvB&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/bd/a2/bda2ecab-e818-43b2-8dc9-fc6a0d788e85.png&quot; width=&quot;1128&quot; /&gt;
    &lt;figcaption&gt;BRAT-плагин&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;1kQM&quot;&gt;4. Создаем пустую заметку, называем ее, как удобно. Вставляем код ⬇&lt;/p&gt;
  &lt;pre id=&quot;SahX&quot;&gt;&amp;#x60;&amp;#x60;&amp;#x60;datacorejsx
// Constants and color configuration
const HABITS = [
  { id: &amp;#x27;Reading&amp;#x27;, emoji: &amp;#x27;📚&amp;#x27;, label: &amp;#x27;Reading&amp;#x27;, defaultDuration: 25, unit: &amp;#x27;minutes&amp;#x27;, monthlyGoal: 1000 },
  { id: &amp;#x27;Writing&amp;#x27;, emoji: &amp;#x27;✍️&amp;#x27;, label: &amp;#x27;Writing&amp;#x27;, defaultDuration: 30, unit: &amp;#x27;minutes&amp;#x27; },
  { id: &amp;#x27;Money&amp;#x27;, emoji: &amp;#x27;💰&amp;#x27;, label: &amp;#x27;Money&amp;#x27;, defaultDuration: 10, unit: &amp;#x27;dollars&amp;#x27;, monthlyGoal: 2000 },
  { id: &amp;#x27;Workout&amp;#x27;, emoji: &amp;#x27;🧘‍♂️&amp;#x27;, label: &amp;#x27;Workout&amp;#x27;, defaultDuration: 30, unit: &amp;#x27;minutes&amp;#x27; }
];&lt;/pre&gt;
  &lt;pre id=&quot;9OVD&quot;&gt;const GOALS = {
  perfectDays: {
    monthly: 20,
    yearly: 250
  }
};&lt;/pre&gt;
  &lt;pre id=&quot;Ld5n&quot;&gt;const DAYS = [&amp;#x27;Sun&amp;#x27;, &amp;#x27;Mon&amp;#x27;, &amp;#x27;Tue&amp;#x27;, &amp;#x27;Wed&amp;#x27;, &amp;#x27;Thu&amp;#x27;, &amp;#x27;Fri&amp;#x27;, &amp;#x27;Sat&amp;#x27;];&lt;/pre&gt;
  &lt;pre id=&quot;VP2H&quot;&gt;const COLORS = {
  primary: &amp;#x27;var(--interactive-accent)&amp;#x27;,
  secondary: &amp;#x27;var(--background-secondary)&amp;#x27;,
  hoverState: &amp;#x27;var(--interactive-accent-hover)&amp;#x27;,
  textPrimary: &amp;#x27;var(--text-normal)&amp;#x27;,
  textLight: &amp;#x27;var(--text-on-accent)&amp;#x27;,
  progressBar: {
    low: &amp;#x27;var(--interactive-accent)&amp;#x27;,
    medium: &amp;#x27;var(--interactive-accent)&amp;#x27;,
    high: &amp;#x27;var(--interactive-accent)&amp;#x27;,
    gradient: {
      start: &amp;#x27;var(--interactive-accent)&amp;#x27;,
      end: &amp;#x27;var(--interactive-accent-hover)&amp;#x27;
    }
  }
};&lt;/pre&gt;
  &lt;pre id=&quot;qgON&quot;&gt;// Utility Functions
const formatMetricValue = (value, habit) =&amp;gt; {
  if (value === null || value === undefined) return &amp;#x27;0&amp;#x27;;&lt;/pre&gt;
  &lt;pre id=&quot;lnEd&quot;&gt;  switch(habit.unit) {
    case &amp;#x27;minutes&amp;#x27;:
      return value === 1 ? &amp;#x27;1 Minute&amp;#x27; : &amp;#x60;${value} Minutes&amp;#x60;;
    case &amp;#x27;dollars&amp;#x27;:
      return &amp;#x60;$${Number(value).toLocaleString()}&amp;#x60;;
    case &amp;#x27;rupees&amp;#x27;:
      return &amp;#x60;Rs. ${Number(value).toLocaleString()}&amp;#x60;;
    default:
      return value;
  }
};&lt;/pre&gt;
  &lt;pre id=&quot;HrKl&quot;&gt;const calculateTrendPercentage = (current, previous) =&amp;gt; {
  if (previous === 0) return current &amp;gt; 0 ? 100 : 0;
  return ((current - previous) / previous) * 100;
};&lt;/pre&gt;
  &lt;pre id=&quot;zhvw&quot;&gt;// Moved getCompletionColor to top level
const getCompletionColor = (percentage) =&amp;gt; {
  if (percentage &amp;gt;= 75) return COLORS.progressBar.high;
  if (percentage &amp;gt;= 50) return COLORS.progressBar.medium;
  return COLORS.progressBar.low;
};&lt;/pre&gt;
  &lt;pre id=&quot;yC8C&quot;&gt;// Base Components
const CircularProgress = ({ value, size, color = &amp;#x27;var(--interactive-accent)&amp;#x27; }) =&amp;gt; {
  const strokeWidth = 4;
  const radius = (size - strokeWidth * 2) / 2;
  const circumference = 2 * Math.PI * radius;
  const progress = ((100 - value) / 100) * circumference;&lt;/pre&gt;
  &lt;pre id=&quot;dECq&quot;&gt;  return (
    &amp;lt;svg
      width={size}
      height={size}
      viewBox={&amp;#x60;0 0 ${size} ${size}&amp;#x60;}
      style={{
        transform: &amp;#x27;rotate(-90deg)&amp;#x27;,
        overflow: &amp;#x27;visible&amp;#x27;
      }}
    &amp;gt;
      &amp;lt;circle
        cx={size / 2}
        cy={size / 2}
        r={radius}
        stroke=&amp;quot;var(--background-modifier-border)&amp;quot;
        strokeWidth={strokeWidth}
        fill=&amp;quot;none&amp;quot;
      /&amp;gt;
      &amp;lt;circle
        cx={size / 2}
        cy={size / 2}
        r={radius}
        stroke={color}
        strokeWidth={strokeWidth}
        strokeDasharray={circumference}
        strokeDashoffset={progress}
        fill=&amp;quot;none&amp;quot;
        style={{
          transition: &amp;#x27;stroke-dashoffset 0.5s ease&amp;#x27;,
          transformOrigin: &amp;#x27;center&amp;#x27;
        }}
      /&amp;gt;
    &amp;lt;/svg&amp;gt;
  );
};&lt;/pre&gt;
  &lt;pre id=&quot;XvRE&quot;&gt;// Additional Base Components
const TrendIndicator = ({ current, previous }) =&amp;gt; {
  const trend = calculateTrendPercentage(current, previous);
  let color = &amp;#x27;var(--text-normal)&amp;#x27;;
  let indicator = &amp;#x27;→&amp;#x27;;&lt;/pre&gt;
  &lt;pre id=&quot;k0cT&quot;&gt;  if (trend &amp;gt; 0) {
    color = &amp;#x27;var(--color-green)&amp;#x27;;
    indicator = &amp;#x27;↑&amp;#x27;;
  } else if (trend &amp;lt; 0) {
    color = &amp;#x27;var(--color-red)&amp;#x27;;
    indicator = &amp;#x27;↓&amp;#x27;;
  }&lt;/pre&gt;
  &lt;pre id=&quot;RXZQ&quot;&gt;  return (
    &amp;lt;span style={{ color }}&amp;gt;
      {indicator} {Math.abs(trend).toFixed(1)}%
    &amp;lt;/span&amp;gt;
  );
};&lt;/pre&gt;
  &lt;pre id=&quot;120h&quot;&gt;const TimeInput = ({
  entry,
  habitId,
  editingTime,
  setEditingTime,
  updateHabitDuration,
  getHabitStatus,
  getHabitDuration
}) =&amp;gt; {
  const duration = getHabitDuration(entry, habitId);
  const isEditing = editingTime?.entryPath === entry.$path &amp;amp;&amp;amp; editingTime?.habitId === habitId;&lt;/pre&gt;
  &lt;pre id=&quot;JbYu&quot;&gt;  if (!getHabitStatus(entry, habitId)) return null;&lt;/pre&gt;
  &lt;pre id=&quot;fiQ7&quot;&gt;  if (isEditing) {
    return (
      &amp;lt;input
        type=&amp;quot;number&amp;quot;
        defaultValue={duration}
        min=&amp;quot;0&amp;quot;
        style={{
          width: &amp;#x27;60px&amp;#x27;,
          padding: &amp;#x27;2px&amp;#x27;,
          fontSize: &amp;#x27;0.9em&amp;#x27;,
          textAlign: &amp;#x27;center&amp;#x27;
        }}
        onBlur={(e) =&amp;gt; updateHabitDuration(entry, habitId, e.target.value)}
        autoFocus
      /&amp;gt;
    );
  }&lt;/pre&gt;
  &lt;pre id=&quot;x9Eg&quot;&gt;  return (
    &amp;lt;span
      onClick={() =&amp;gt; setEditingTime({ entryPath: entry.$path, habitId })}
      style={{ cursor: &amp;#x27;pointer&amp;#x27;, fontSize: &amp;#x27;0.8em&amp;#x27; }}
    &amp;gt;
      {formatMetricValue(duration, HABITS.find(h =&amp;gt; h.id === habitId))}
    &amp;lt;/span&amp;gt;
  );
};&lt;/pre&gt;
  &lt;pre id=&quot;SasW&quot;&gt;const ProgressBar = ({ value, max, color = &amp;#x27;var(--interactive-accent)&amp;#x27; }) =&amp;gt; {
  const percentage = Math.min((value / max) * 100, 100);
  return (
    &amp;lt;div style={{
      width: &amp;#x27;100%&amp;#x27;,
      height: &amp;#x27;4px&amp;#x27;,
      backgroundColor: &amp;#x27;var(--background-modifier-border)&amp;#x27;,
      borderRadius: &amp;#x27;4px&amp;#x27;,
      overflow: &amp;#x27;hidden&amp;#x27;
    }}&amp;gt;
      &amp;lt;div style={{
        width: &amp;#x60;${percentage}%&amp;#x60;,
        height: &amp;#x27;100%&amp;#x27;,
        backgroundColor: color,
        transition: &amp;#x27;width 0.3s ease&amp;#x27;
      }} /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};&lt;/pre&gt;
  &lt;pre id=&quot;pR1Z&quot;&gt;const StyledCard = ({ children, extraStyles = {} }) =&amp;gt; (
  &amp;lt;div style={{
    backgroundColor: &amp;#x27;var(--background-primary)&amp;#x27;,
    borderRadius: &amp;#x27;12px&amp;#x27;,
    boxShadow: &amp;#x27;0 2px 8px rgba(0, 0, 0, 0.1)&amp;#x27;,
    padding: &amp;#x27;24px&amp;#x27;,
    transition: &amp;#x27;all 0.2s ease&amp;#x27;,
    &amp;#x27;:hover&amp;#x27;: {
      boxShadow: &amp;#x27;0 4px 12px rgba(0, 0, 0, 0.15)&amp;#x27;,
      transform: &amp;#x27;translateY(-2px)&amp;#x27;
    },
    ...extraStyles
  }}&amp;gt;
    {children}
  &amp;lt;/div&amp;gt;
);&lt;/pre&gt;
  &lt;pre id=&quot;dugM&quot;&gt;const ActionButton = ({ icon, label, onClick, isActive, extraStyles = {} }) =&amp;gt; (
  &amp;lt;button
    onClick={onClick}
    style={{
      padding: &amp;#x27;12px 24px&amp;#x27;,
      borderRadius: &amp;#x27;8px&amp;#x27;,
      border: &amp;#x27;none&amp;#x27;,
      backgroundColor: isActive ? COLORS.primary : COLORS.secondary,
      color: isActive ? COLORS.textLight : COLORS.textPrimary,
      display: &amp;#x27;flex&amp;#x27;,
      alignItems: &amp;#x27;center&amp;#x27;,
      gap: &amp;#x27;8px&amp;#x27;,
      cursor: &amp;#x27;pointer&amp;#x27;,
      transition: &amp;#x27;all 0.2s ease&amp;#x27;,
      fontSize: &amp;#x27;16px&amp;#x27;,
      fontWeight: &amp;#x27;500&amp;#x27;,
      &amp;#x27;:hover&amp;#x27;: {
        transform: &amp;#x27;translateY(-1px)&amp;#x27;,
        backgroundColor: COLORS.primary,
        color: COLORS.textLight,
        boxShadow: &amp;#x27;0 2px 4px rgba(0, 0, 0, 0.2)&amp;#x27;
      },
      ...extraStyles
    }}
  &amp;gt;
    &amp;lt;span style={{ fontSize: &amp;#x27;20px&amp;#x27; }}&amp;gt;{icon}&amp;lt;/span&amp;gt;
    {label &amp;amp;&amp;amp; &amp;lt;span&amp;gt;{label}&amp;lt;/span&amp;gt;}
  &amp;lt;/button&amp;gt;
);&lt;/pre&gt;
  &lt;pre id=&quot;niaC&quot;&gt;const NavigationControls = ({
  selectedDate,
  navigateDate,
  activeView,
  setActiveView
}) =&amp;gt; (
  &amp;lt;div style={{
    display: &amp;#x27;flex&amp;#x27;,
    flexDirection: &amp;#x27;column&amp;#x27;,
    gap: &amp;#x27;24px&amp;#x27;
  }}&amp;gt;
    &amp;lt;div style={{
      display: &amp;#x27;flex&amp;#x27;,
      gap: &amp;#x27;16px&amp;#x27;,
      alignItems: &amp;#x27;center&amp;#x27;,
      justifyContent: &amp;#x27;center&amp;#x27;,
      background: COLORS.secondary,
      padding: &amp;#x27;8px 16px&amp;#x27;,
      borderRadius: &amp;#x27;12px&amp;#x27;,
      boxShadow: &amp;#x27;var(--shadow-s)&amp;#x27;
    }}&amp;gt;
      &amp;lt;ActionButton
        icon=&amp;quot;←&amp;quot;
        onClick={() =&amp;gt; navigateDate(-1)}
        extraStyles={{
          backgroundColor: COLORS.primary,
          color: COLORS.textLight
        }}
      /&amp;gt;
      &amp;lt;div style={{
        fontWeight: &amp;#x27;bold&amp;#x27;,
        fontSize: &amp;#x27;24px&amp;#x27;,
        minWidth: &amp;#x27;240px&amp;#x27;,
        textAlign: &amp;#x27;center&amp;#x27;,
        fontFamily: &amp;#x27;var(--font-interface)&amp;#x27;,
        background: &amp;#x27;var(--background-primary)&amp;#x27;,
        padding: &amp;#x27;8px 16px&amp;#x27;,
        borderRadius: &amp;#x27;8px&amp;#x27;,
        boxShadow: &amp;#x27;var(--shadow-s)&amp;#x27;
      }}&amp;gt;
        {selectedDate.toFormat(&amp;#x27;MMMM dd, yyyy&amp;#x27;)}
      &amp;lt;/div&amp;gt;
      &amp;lt;ActionButton
        icon=&amp;quot;→&amp;quot;
        onClick={() =&amp;gt; navigateDate(1)}
        extraStyles={{
          backgroundColor: COLORS.primary,
          color: COLORS.textLight
        }}
      /&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
);&lt;/pre&gt;
  &lt;pre id=&quot;N4fM&quot;&gt;const CalendarView = ({
  selectedDate,
  sortedNotes,
  getHabitStatus,
  calculateCompletedHabits,
  updateHabit,
  getHabitDuration,
  editingTime,
  setEditingTime,
  updateHabitDuration
}) =&amp;gt; {
  const dates = [];
  let currentDate = selectedDate;&lt;/pre&gt;
  &lt;pre id=&quot;Uk8e&quot;&gt;  // Show last 7 days (today and previous 6 days)
  for (let i = 0; i &amp;lt; 7; i++) {
    dates.push(currentDate.minus({ days: i }));
  }&lt;/pre&gt;
  &lt;pre id=&quot;Vvvy&quot;&gt;  const notesMap = new Map(sortedNotes.map(note =&amp;gt; [note.$name, note]));
  const today = dc.luxon.DateTime.now().startOf(&amp;#x27;day&amp;#x27;);&lt;/pre&gt;
  &lt;pre id=&quot;4yu1&quot;&gt;  return (
    &amp;lt;div style={{
      width: &amp;#x27;100%&amp;#x27;,
      overflow: &amp;#x27;hidden&amp;#x27;,
      padding: &amp;#x27;8px 4px&amp;#x27;
    }}&amp;gt;
      &amp;lt;div style={{
        display: &amp;#x27;flex&amp;#x27;,
        gap: &amp;#x27;12px&amp;#x27;,
        overflowX: &amp;#x27;auto&amp;#x27;,
        paddingBottom: &amp;#x27;12px&amp;#x27;,
        WebkitOverflowScrolling: &amp;#x27;touch&amp;#x27;,
        scrollbarWidth: &amp;#x27;none&amp;#x27;,
        msOverflowStyle: &amp;#x27;none&amp;#x27;,
        &amp;#x27;::-webkit-scrollbar&amp;#x27;: {
          display: &amp;#x27;none&amp;#x27;
        }
      }}&amp;gt;
        {dates.map((date) =&amp;gt; {
          const dateStr = date.toFormat(&amp;#x27;yyyy-MM-dd&amp;#x27;);
          const entry = notesMap.get(dateStr);
          const isSelected = date.hasSame(selectedDate, &amp;#x27;day&amp;#x27;);
          const isToday = date.hasSame(today, &amp;#x27;day&amp;#x27;);&lt;/pre&gt;
  &lt;pre id=&quot;151V&quot;&gt;          return (
            &amp;lt;div style={{
              flex: &amp;#x27;0 0 320px&amp;#x27;,
              maxWidth: &amp;#x27;320px&amp;#x27;
            }}&amp;gt;
              &amp;lt;CalendarDayCard
                key={dateStr}
                date={date}
                entry={entry}
                getHabitStatus={getHabitStatus}
                calculateCompletedHabits={calculateCompletedHabits}
                isSelected={isSelected}
                isToday={isToday}
                updateHabit={updateHabit}
                getHabitDuration={getHabitDuration}
                editingTime={editingTime}
                setEditingTime={setEditingTime}
                updateHabitDuration={updateHabitDuration}
              /&amp;gt;
            &amp;lt;/div&amp;gt;
          );
        })}
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};&lt;/pre&gt;
  &lt;pre id=&quot;3Ggl&quot;&gt;const CalendarDayCard = ({
  date,
  entry,
  getHabitStatus,
  calculateCompletedHabits,
  isSelected,
  isToday,
  updateHabit,
  getHabitDuration,
  editingTime,
  setEditingTime,
  updateHabitDuration
}) =&amp;gt; {
  const completedCount = calculateCompletedHabits(entry);
  const completionPercentage = entry ? Math.round((completedCount / HABITS.length) * 100) : 0;&lt;/pre&gt;
  &lt;pre id=&quot;utbQ&quot;&gt;  return (
    &amp;lt;div style={{
      padding: &amp;#x27;12px&amp;#x27;,
      borderRadius: &amp;#x27;16px&amp;#x27;,
      backgroundColor: &amp;#x27;var(--background-primary)&amp;#x27;,
      color: COLORS.textPrimary,
      boxShadow: &amp;#x27;var(--shadow-s)&amp;#x27;,
      border: isSelected ? &amp;#x60;2px solid ${COLORS.primary}&amp;#x60; : &amp;#x27;1px solid var(--background-modifier-border)&amp;#x27;,
      transition: &amp;#x27;all 0.3s cubic-bezier(0.4, 0, 0.2, 1)&amp;#x27;,
      display: &amp;#x27;flex&amp;#x27;,
      flexDirection: &amp;#x27;column&amp;#x27;,
      gap: &amp;#x27;8px&amp;#x27;,
      minHeight: &amp;#x27;168px&amp;#x27;
    }}&amp;gt;
      &amp;lt;div style={{
        display: &amp;#x27;flex&amp;#x27;,
        justifyContent: &amp;#x27;space-between&amp;#x27;,
        alignItems: &amp;#x27;center&amp;#x27;,
        backgroundColor: COLORS.secondary,
        padding: &amp;#x27;8px 12px&amp;#x27;,
        borderRadius: &amp;#x27;10px&amp;#x27;
      }}&amp;gt;
        &amp;lt;span style={{
          fontSize: &amp;#x27;1em&amp;#x27;,
          fontWeight: &amp;#x27;600&amp;#x27;,
          color: COLORS.textPrimary
        }}&amp;gt;
          {DAYS[date.weekday % 7]}
        &amp;lt;/span&amp;gt;
        &amp;lt;span style={{
          fontWeight: &amp;#x27;500&amp;#x27;,
          fontSize: &amp;#x27;0.9em&amp;#x27;,
          color: COLORS.textPrimary
        }}&amp;gt;
          {date.toFormat(&amp;#x27;MM-dd&amp;#x27;)}
        &amp;lt;/span&amp;gt;
      &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;F3tD&quot;&gt;      {entry &amp;amp;&amp;amp; (
        &amp;lt;&amp;gt;
          &amp;lt;div style={{
            display: &amp;#x27;grid&amp;#x27;,
            gridTemplateColumns: &amp;#x27;repeat(auto-fit, minmax(120px, 1fr))&amp;#x27;,
            gap: &amp;#x27;8px&amp;#x27;,
            flex: 1,
            padding: &amp;#x27;2px&amp;#x27;
          }}&amp;gt;
            {HABITS.map(habit =&amp;gt; {
              const isCompleted = getHabitStatus(entry, habit.id);
              const duration = getHabitDuration(entry, habit.id);&lt;/pre&gt;
  &lt;pre id=&quot;aE6Z&quot;&gt;              return (
                &amp;lt;div
                  key={habit.id}
                  onClick={() =&amp;gt; updateHabit(entry, habit.id)}
                  style={{
                    display: &amp;#x27;flex&amp;#x27;,
                    flexDirection: &amp;#x27;column&amp;#x27;,
                    alignItems: &amp;#x27;center&amp;#x27;,
                    justifyContent: &amp;#x27;center&amp;#x27;,
                    gap: &amp;#x27;4px&amp;#x27;,
                    backgroundColor: isCompleted ? COLORS.primary : COLORS.secondary,
                    borderRadius: &amp;#x27;10px&amp;#x27;,
                    cursor: &amp;#x27;pointer&amp;#x27;,
                    padding: &amp;#x27;12px&amp;#x27;,
                    width: &amp;#x27;100%&amp;#x27;,
                    minHeight: &amp;#x27;80px&amp;#x27;,
                    transition: &amp;#x27;all 0.2s ease&amp;#x27;
                  }}
                &amp;gt;
                  &amp;lt;span style={{
                    fontSize: &amp;#x27;24px&amp;#x27;,
                    marginBottom: &amp;#x27;4px&amp;#x27;
                  }}&amp;gt;
                    {habit.emoji}
                  &amp;lt;/span&amp;gt;
                  &amp;lt;span style={{
                    fontSize: &amp;#x27;0.95em&amp;#x27;,
                    fontWeight: &amp;#x27;600&amp;#x27;,
                    color: isCompleted ? COLORS.textLight : COLORS.textPrimary,
                    letterSpacing: &amp;#x27;0.2px&amp;#x27;,
                    textAlign: &amp;#x27;center&amp;#x27;,
                    lineHeight: &amp;#x27;1.2&amp;#x27;
                  }}&amp;gt;
                    {habit.label}
                  &amp;lt;/span&amp;gt;
                  {isCompleted &amp;amp;&amp;amp; duration &amp;amp;&amp;amp; (
                    &amp;lt;span style={{
                      fontSize: &amp;#x27;0.75em&amp;#x27;,
                      fontWeight: &amp;#x27;600&amp;#x27;,
                      color: isCompleted ? COLORS.textLight : COLORS.textPrimary,
                      textAlign: &amp;#x27;center&amp;#x27;
                    }}&amp;gt;
                      {formatMetricValue(duration, habit)}
                    &amp;lt;/span&amp;gt;
                  )}
                &amp;lt;/div&amp;gt;
              );
            })}
          &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;Rb3T&quot;&gt;          &amp;lt;div style={{
            marginTop: &amp;#x27;auto&amp;#x27;,
            display: &amp;#x27;flex&amp;#x27;,
            flexDirection: &amp;#x27;column&amp;#x27;,
            gap: &amp;#x27;4px&amp;#x27;
          }}&amp;gt;
            &amp;lt;ProgressBar
              value={completedCount}
              max={HABITS.length}
              color={getCompletionColor(completionPercentage)}
            /&amp;gt;
            &amp;lt;div style={{
              textAlign: &amp;#x27;right&amp;#x27;,
              fontSize: &amp;#x27;0.8em&amp;#x27;,
              fontWeight: &amp;#x27;600&amp;#x27;,
              color: getCompletionColor(completionPercentage)
            }}&amp;gt;
              {completionPercentage}%
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/&amp;gt;
      )}
    &amp;lt;/div&amp;gt;
  );
};&lt;/pre&gt;
  &lt;pre id=&quot;MwwL&quot;&gt;const MetricCard = ({ habit, current, previous, ytdTotal }) =&amp;gt; {
  const trend = calculateTrendPercentage(current, previous);
  const formattedTotal = formatMetricValue(current, habit);
  const formattedYTD = formatMetricValue(ytdTotal, habit);&lt;/pre&gt;
  &lt;pre id=&quot;coun&quot;&gt;  return (
    &amp;lt;div style={{
      backgroundColor: &amp;#x27;var(--background-primary)&amp;#x27;,
      borderRadius: &amp;#x27;16px&amp;#x27;,
      padding: &amp;#x27;24px&amp;#x27;,
      boxShadow: &amp;#x27;var(--shadow-s)&amp;#x27;,
      display: &amp;#x27;flex&amp;#x27;,
      flexDirection: &amp;#x27;column&amp;#x27;,
      gap: &amp;#x27;16px&amp;#x27;
    }}&amp;gt;
      &amp;lt;div style={{
        display: &amp;#x27;flex&amp;#x27;,
        alignItems: &amp;#x27;center&amp;#x27;,
        gap: &amp;#x27;12px&amp;#x27;
      }}&amp;gt;
        &amp;lt;div style={{
          fontSize: &amp;#x27;32px&amp;#x27;,
          backgroundColor: COLORS.secondary,
          borderRadius: &amp;#x27;12px&amp;#x27;,
          padding: &amp;#x27;12px&amp;#x27;,
          display: &amp;#x27;flex&amp;#x27;,
          alignItems: &amp;#x27;center&amp;#x27;,
          justifyContent: &amp;#x27;center&amp;#x27;
        }}&amp;gt;
          {habit.emoji}
        &amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;
          &amp;lt;h3 style={{ margin: 0 }}&amp;gt;{habit.label}&amp;lt;/h3&amp;gt;
          &amp;lt;div style={{
            color: &amp;#x27;var(--text-muted)&amp;#x27;,
            fontSize: &amp;#x27;0.9em&amp;#x27;
          }}&amp;gt;
            Last 30 Days
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;ugLX&quot;&gt;      &amp;lt;div style={{
        display: &amp;#x27;grid&amp;#x27;,
        gridTemplateColumns: &amp;#x27;repeat(2, 1fr)&amp;#x27;,
        gap: &amp;#x27;16px&amp;#x27;
      }}&amp;gt;
        &amp;lt;div style={{
          backgroundColor: COLORS.secondary,
          padding: &amp;#x27;16px&amp;#x27;,
          borderRadius: &amp;#x27;12px&amp;#x27;,
          textAlign: &amp;#x27;center&amp;#x27;
        }}&amp;gt;
          &amp;lt;div style={{ fontSize: &amp;#x27;0.9em&amp;#x27;, color: &amp;#x27;var(--text-muted)&amp;#x27; }}&amp;gt;Current&amp;lt;/div&amp;gt;
          &amp;lt;div style={{
            fontSize: &amp;#x27;1.4em&amp;#x27;,
            fontWeight: &amp;#x27;bold&amp;#x27;,
            marginTop: &amp;#x27;4px&amp;#x27;
          }}&amp;gt;
            {formattedTotal}
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;MDk8&quot;&gt;        &amp;lt;div style={{
          backgroundColor: COLORS.secondary,
          padding: &amp;#x27;16px&amp;#x27;,
          borderRadius: &amp;#x27;12px&amp;#x27;,
          textAlign: &amp;#x27;center&amp;#x27;
        }}&amp;gt;
          &amp;lt;div style={{ fontSize: &amp;#x27;0.9em&amp;#x27;, color: &amp;#x27;var(--text-muted)&amp;#x27; }}&amp;gt;YTD&amp;lt;/div&amp;gt;
          &amp;lt;div style={{
            fontSize: &amp;#x27;1.4em&amp;#x27;,
            fontWeight: &amp;#x27;bold&amp;#x27;,
            marginTop: &amp;#x27;4px&amp;#x27;
          }}&amp;gt;
            {formattedYTD}
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;UWUa&quot;&gt;      &amp;lt;div style={{
        display: &amp;#x27;flex&amp;#x27;,
        alignItems: &amp;#x27;center&amp;#x27;,
        justifyContent: &amp;#x27;space-between&amp;#x27;,
        backgroundColor: COLORS.secondary,
        padding: &amp;#x27;12px 16px&amp;#x27;,
        borderRadius: &amp;#x27;12px&amp;#x27;
      }}&amp;gt;
        &amp;lt;span&amp;gt;Trend&amp;lt;/span&amp;gt;
        &amp;lt;TrendIndicator current={current} previous={previous} /&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};&lt;/pre&gt;
  &lt;pre id=&quot;YvlB&quot;&gt;const TrendsView = ({ trends }) =&amp;gt; {
  const monthlyProgress = (trends.currentMonth.perfectDays / GOALS.perfectDays.monthly) * 100;
  const yearlyProgress = (trends.yearToDate.perfectDays / GOALS.perfectDays.yearly) * 100;&lt;/pre&gt;
  &lt;pre id=&quot;YJKe&quot;&gt;  return (
    &amp;lt;div style={{
      padding: &amp;#x27;24px&amp;#x27;,
      display: &amp;#x27;flex&amp;#x27;,
      flexDirection: &amp;#x27;column&amp;#x27;,
      gap: &amp;#x27;32px&amp;#x27;
    }}&amp;gt;
      &amp;lt;div style={{
        display: &amp;#x27;grid&amp;#x27;,
        gridTemplateColumns: &amp;#x27;repeat(auto-fit, minmax(280px, 1fr))&amp;#x27;,
        gap: &amp;#x27;24px&amp;#x27;
      }}&amp;gt;
        &amp;lt;div style={{
          backgroundColor: &amp;#x27;var(--background-primary)&amp;#x27;,
          borderRadius: &amp;#x27;16px&amp;#x27;,
          padding: &amp;#x27;24px&amp;#x27;,
          display: &amp;#x27;flex&amp;#x27;,
          alignItems: &amp;#x27;center&amp;#x27;,
          gap: &amp;#x27;24px&amp;#x27;,
          boxShadow: &amp;#x27;var(--shadow-s)&amp;#x27;
        }}&amp;gt;
          &amp;lt;CircularProgress value={monthlyProgress} size={100} color={COLORS.primary} /&amp;gt;
          &amp;lt;div&amp;gt;
            &amp;lt;h3 style={{ margin: &amp;#x27;0 0 8px 0&amp;#x27;, color: &amp;#x27;var(--text-normal)&amp;#x27; }}&amp;gt;Monthly Goal&amp;lt;/h3&amp;gt;
            &amp;lt;div style={{ fontSize: &amp;#x27;1.2em&amp;#x27;, fontWeight: &amp;#x27;bold&amp;#x27;, color: &amp;#x27;var(--text-normal)&amp;#x27; }}&amp;gt;
              {trends.currentMonth.perfectDays}/{GOALS.perfectDays.monthly} Perfect Days
            &amp;lt;/div&amp;gt;
            &amp;lt;div style={{ color: &amp;#x27;var(--text-muted)&amp;#x27; }}&amp;gt;
              {monthlyProgress.toFixed(1)}% Complete
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;XGF7&quot;&gt;        &amp;lt;div style={{
          backgroundColor: &amp;#x27;var(--background-primary)&amp;#x27;,
          borderRadius: &amp;#x27;16px&amp;#x27;,
          padding: &amp;#x27;24px&amp;#x27;,
          display: &amp;#x27;flex&amp;#x27;,
          alignItems: &amp;#x27;center&amp;#x27;,
          gap: &amp;#x27;24px&amp;#x27;,
          boxShadow: &amp;#x27;var(--shadow-s)&amp;#x27;
        }}&amp;gt;
          &amp;lt;CircularProgress value={yearlyProgress} size={100} color={COLORS.progressBar.high} /&amp;gt;
          &amp;lt;div&amp;gt;
            &amp;lt;h3 style={{ margin: &amp;#x27;0 0 8px 0&amp;#x27;, color: &amp;#x27;var(--text-normal)&amp;#x27; }}&amp;gt;Yearly Goal&amp;lt;/h3&amp;gt;
            &amp;lt;div style={{ fontSize: &amp;#x27;1.2em&amp;#x27;, fontWeight: &amp;#x27;bold&amp;#x27;, color: &amp;#x27;var(--text-normal)&amp;#x27; }}&amp;gt;
              {trends.yearToDate.perfectDays}/{GOALS.perfectDays.yearly} Perfect Days
            &amp;lt;/div&amp;gt;
            &amp;lt;div style={{ color: &amp;#x27;var(--text-muted)&amp;#x27; }}&amp;gt;
              {yearlyProgress.toFixed(1)}% Complete
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;Y4ql&quot;&gt;        &amp;lt;div style={{
          backgroundColor: &amp;#x27;var(--background-primary)&amp;#x27;,
          borderRadius: &amp;#x27;16px&amp;#x27;,
          padding: &amp;#x27;24px&amp;#x27;,
          display: &amp;#x27;flex&amp;#x27;,
          alignItems: &amp;#x27;center&amp;#x27;,
          gap: &amp;#x27;24px&amp;#x27;,
          boxShadow: &amp;#x27;var(--shadow-s)&amp;#x27;
        }}&amp;gt;
          &amp;lt;div style={{
            width: &amp;#x27;100px&amp;#x27;,
            height: &amp;#x27;100px&amp;#x27;,
            display: &amp;#x27;flex&amp;#x27;,
            alignItems: &amp;#x27;center&amp;#x27;,
            justifyContent: &amp;#x27;center&amp;#x27;,
            fontSize: &amp;#x27;48px&amp;#x27;,
            backgroundColor: &amp;#x27;var(--background-secondary)&amp;#x27;,
            borderRadius: &amp;#x27;50%&amp;#x27;
          }}&amp;gt;
            🔥
          &amp;lt;/div&amp;gt;
          &amp;lt;div&amp;gt;
            &amp;lt;h3 style={{ margin: &amp;#x27;0 0 8px 0&amp;#x27;, color: &amp;#x27;var(--text-normal)&amp;#x27; }}&amp;gt;Current Streak&amp;lt;/h3&amp;gt;
            &amp;lt;div style={{ fontSize: &amp;#x27;1.2em&amp;#x27;, fontWeight: &amp;#x27;bold&amp;#x27;, color: &amp;#x27;var(--text-normal)&amp;#x27; }}&amp;gt;
              {trends.last30Days.perfectDays} Days
            &amp;lt;/div&amp;gt;
            &amp;lt;div style={{ color: &amp;#x27;var(--text-muted)&amp;#x27; }}&amp;gt;
              Last 30 Days
            &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;l6I8&quot;&gt;      &amp;lt;div style={{
        display: &amp;#x27;grid&amp;#x27;,
        gridTemplateColumns: &amp;#x27;repeat(auto-fit, minmax(300px, 1fr))&amp;#x27;,
        gap: &amp;#x27;24px&amp;#x27;
      }}&amp;gt;
        {HABITS.map(habit =&amp;gt; (
          &amp;lt;MetricCard
            key={habit.id}
            habit={habit}
            current={trends.last30Days.habitMetrics[habit.id].total}
            previous={trends.last30Days.habitMetrics[habit.id].previousPeriodTotal}
            ytdTotal={trends.yearToDate.habitMetrics[habit.id].total}
          /&amp;gt;
        ))}
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};&lt;/pre&gt;
  &lt;pre id=&quot;SVNE&quot;&gt;const HistoricalView = ({
  sortedNotes,
  currentPage,
  setCurrentPage,
  updateHabit,
  getHabitStatus,
  getHabitDuration,
  editingTime,
  setEditingTime,
  updateHabitDuration,
  calculateCompletedHabits
}) =&amp;gt; {
  const itemsPerPage = 20;
  const totalPages = Math.ceil(sortedNotes.length / itemsPerPage);
  const startIndex = currentPage * itemsPerPage;
  const displayNotes = sortedNotes.slice(startIndex, startIndex + itemsPerPage);&lt;/pre&gt;
  &lt;pre id=&quot;FWEt&quot;&gt;  return (
    &amp;lt;div style={{
      padding: &amp;#x27;24px&amp;#x27;,
      backgroundColor: COLORS.secondary,
      borderRadius: &amp;#x27;12px&amp;#x27;,
      marginTop: &amp;#x27;24px&amp;#x27;
    }}&amp;gt;
      &amp;lt;h3 style={{ margin: &amp;#x27;0 0 20px 0&amp;#x27; }}&amp;gt;Historical Data&amp;lt;/h3&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;iviA&quot;&gt;      &amp;lt;div style={{
        width: &amp;#x27;100%&amp;#x27;,
        overflow: &amp;#x27;auto&amp;#x27;,
        borderRadius: &amp;#x27;12px&amp;#x27;,
        boxShadow: &amp;#x27;var(--shadow-s)&amp;#x27;,
        backgroundColor: &amp;#x27;var(--background-primary)&amp;#x27;
      }}&amp;gt;
        &amp;lt;table style={{
          width: &amp;#x27;100%&amp;#x27;,
          borderCollapse: &amp;#x27;separate&amp;#x27;,
          borderSpacing: 0
        }}&amp;gt;
          &amp;lt;thead&amp;gt;
            &amp;lt;tr&amp;gt;
              &amp;lt;th style={{
                padding: &amp;#x27;16px&amp;#x27;,
                backgroundColor: COLORS.secondary,
                color: COLORS.textPrimary,
                fontWeight: &amp;#x27;bold&amp;#x27;,
                textAlign: &amp;#x27;left&amp;#x27;,
                position: &amp;#x27;sticky&amp;#x27;,
                top: 0,
                zIndex: 10,
              }}&amp;gt;Date&amp;lt;/th&amp;gt;
              {HABITS.map(habit =&amp;gt; (
                &amp;lt;th key={habit.id} style={{
                  padding: &amp;#x27;16px&amp;#x27;,
                  backgroundColor: COLORS.secondary,
                  color: COLORS.textPrimary,
                  fontWeight: &amp;#x27;bold&amp;#x27;,
                  textAlign: &amp;#x27;center&amp;#x27;,
                  position: &amp;#x27;sticky&amp;#x27;,
                  top: 0,
                  zIndex: 10,
                }}&amp;gt;
                  &amp;lt;div style={{ fontSize: &amp;#x27;1.4em&amp;#x27; }}&amp;gt;{habit.emoji}&amp;lt;/div&amp;gt;
                  &amp;lt;div&amp;gt;{habit.label}&amp;lt;/div&amp;gt;
                &amp;lt;/th&amp;gt;
              ))}
              &amp;lt;th style={{
                padding: &amp;#x27;16px&amp;#x27;,
                backgroundColor: COLORS.secondary,
                color: COLORS.textPrimary,
                fontWeight: &amp;#x27;bold&amp;#x27;,
                textAlign: &amp;#x27;center&amp;#x27;,
                position: &amp;#x27;sticky&amp;#x27;,
                top: 0,
                zIndex: 10,
              }}&amp;gt;Completion&amp;lt;/th&amp;gt;
            &amp;lt;/tr&amp;gt;
          &amp;lt;/thead&amp;gt;
          &amp;lt;tbody&amp;gt;
            {displayNotes.map((entry, index) =&amp;gt; (
              &amp;lt;tr key={entry.$path} style={{
                backgroundColor: index % 2 === 0 ? &amp;#x27;var(--background-primary)&amp;#x27; : &amp;#x27;var(--background-secondary)&amp;#x27;
              }}&amp;gt;
                &amp;lt;td style={{
                  padding: &amp;#x27;12px 16px&amp;#x27;,
                  borderBottom: &amp;#x27;1px solid rgba(0, 0, 0, 0.05)&amp;#x27;,
                  minWidth: &amp;#x27;150px&amp;#x27;
                }}&amp;gt;{entry.$name}&amp;lt;/td&amp;gt;
                {HABITS.map(habit =&amp;gt; {
                  const isCompleted = getHabitStatus(entry, habit.id);
                  return (
                    &amp;lt;td key={habit.id} style={{
                      padding: &amp;#x27;12px 16px&amp;#x27;,
                      borderBottom: &amp;#x27;1px solid rgba(0, 0, 0, 0.05)&amp;#x27;,
                      textAlign: &amp;#x27;center&amp;#x27;,
                      minWidth: &amp;#x27;120px&amp;#x27;
                    }}&amp;gt;
                      &amp;lt;div style={{
                        display: &amp;#x27;flex&amp;#x27;,
                        flexDirection: &amp;#x27;column&amp;#x27;,
                        alignItems: &amp;#x27;center&amp;#x27;,
                        gap: &amp;#x27;4px&amp;#x27;
                      }}&amp;gt;
                        &amp;lt;div
                          onClick={() =&amp;gt; updateHabit(entry, habit.id)}
                          style={{
                            padding: &amp;#x27;4px 8px&amp;#x27;,
                            borderRadius: &amp;#x27;4px&amp;#x27;,
                            backgroundColor: isCompleted ? COLORS.primary : COLORS.secondary,
                            color: isCompleted ? COLORS.textLight : &amp;#x27;var(--text-muted)&amp;#x27;,
                            cursor: &amp;#x27;pointer&amp;#x27;
                          }}
                        &amp;gt;
                          {isCompleted ? &amp;#x27;✓&amp;#x27; : &amp;#x27;×&amp;#x27;}
                        &amp;lt;/div&amp;gt;
                        {isCompleted &amp;amp;&amp;amp; (
                          &amp;lt;TimeInput
                            entry={entry}
                            habitId={habit.id}
                            editingTime={editingTime}
                            setEditingTime={setEditingTime}
                            updateHabitDuration={updateHabitDuration}
                            getHabitStatus={getHabitStatus}
                            getHabitDuration={getHabitDuration}
                          /&amp;gt;
                        )}
                      &amp;lt;/div&amp;gt;
                    &amp;lt;/td&amp;gt;
                  );
                })}
                &amp;lt;td style={{
                  padding: &amp;#x27;12px 16px&amp;#x27;,
                  borderBottom: &amp;#x27;1px solid rgba(0, 0, 0, 0.05)&amp;#x27;,
                  textAlign: &amp;#x27;center&amp;#x27;,
                  color: getCompletionColor(Math.round((calculateCompletedHabits(entry) / HABITS.length) * 100)),
                  fontWeight: &amp;#x27;600&amp;#x27;
                }}&amp;gt;
                  {Math.round((calculateCompletedHabits(entry) / HABITS.length) * 100)}%
                &amp;lt;/td&amp;gt;
              &amp;lt;/tr&amp;gt;
            ))}
          &amp;lt;/tbody&amp;gt;
        &amp;lt;/table&amp;gt;
      &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;YvCI&quot;&gt;      &amp;lt;div style={{
        display: &amp;#x27;flex&amp;#x27;,
        justifyContent: &amp;#x27;center&amp;#x27;,
        gap: &amp;#x27;8px&amp;#x27;,
        marginTop: &amp;#x27;16px&amp;#x27;
      }}&amp;gt;
        &amp;lt;ActionButton
          icon=&amp;quot;←&amp;quot;
          onClick={() =&amp;gt; setCurrentPage(prev =&amp;gt; Math.max(0, prev - 1))}
          extraStyles={{
            opacity: currentPage === 0 ? 0.5 : 1,
            cursor: currentPage === 0 ? &amp;#x27;default&amp;#x27; : &amp;#x27;pointer&amp;#x27;
          }}
        /&amp;gt;
        &amp;lt;span style={{
          padding: &amp;#x27;8px 16px&amp;#x27;,
          backgroundColor: &amp;#x27;var(--background-primary)&amp;#x27;,
          borderRadius: &amp;#x27;8px&amp;#x27;
        }}&amp;gt;
          Page {currentPage + 1} of {totalPages}
        &amp;lt;/span&amp;gt;
        &amp;lt;ActionButton
          icon=&amp;quot;→&amp;quot;
          onClick={() =&amp;gt; setCurrentPage(prev =&amp;gt; Math.min(totalPages - 1, prev + 1))}
          extraStyles={{
            opacity: currentPage === totalPages - 1 ? 0.5 : 1,
            cursor: currentPage === totalPages - 1 ? &amp;#x27;default&amp;#x27; : &amp;#x27;pointer&amp;#x27;
          }}
        /&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};&lt;/pre&gt;
  &lt;pre id=&quot;vEOo&quot;&gt;const GoalsView = ({ entries, daysInMonth }) =&amp;gt; {
  const habitsWithGoals = HABITS.filter(h =&amp;gt; h.monthlyGoal);&lt;/pre&gt;
  &lt;pre id=&quot;1fpo&quot;&gt;  const calculateProgress = (habitId) =&amp;gt; {
    const total = entries.reduce((sum, entry) =&amp;gt; sum + (entry?.value(habitId) ?? 0), 0);
    const habit = HABITS.find(h =&amp;gt; h.id === habitId);&lt;/pre&gt;
  &lt;pre id=&quot;tZ1L&quot;&gt;    // Count days that actually have data
    const daysWithData = entries.filter(entry =&amp;gt; {
      const value = entry?.value(habitId);
      return value !== null &amp;amp;&amp;amp; value !== undefined &amp;amp;&amp;amp; value &amp;gt; 0;
    }).length;&lt;/pre&gt;
  &lt;pre id=&quot;X2fg&quot;&gt;    // Calculate progress against monthly goal
    const progress = (total / habit.monthlyGoal) * 100;&lt;/pre&gt;
  &lt;pre id=&quot;FU8s&quot;&gt;    // Calculate daily average based on days with actual data, or 1 if no days have data
    const daysForAverage = Math.max(daysWithData, 1);
    const dailyAverage = Number((total / daysForAverage).toFixed(2));&lt;/pre&gt;
  &lt;pre id=&quot;VDTh&quot;&gt;    // Project monthly total based on daily average
    const projection = Number((dailyAverage * daysInMonth).toFixed(2));
    const isOnTrack = projection &amp;gt;= habit.monthlyGoal;&lt;/pre&gt;
  &lt;pre id=&quot;Ya1z&quot;&gt;    return {
      total,
      progress: Number(Math.min(progress, 100).toFixed(2)),
      dailyAverage,
      projection,
      isOnTrack,
      daysWithData
    };
  };&lt;/pre&gt;
  &lt;pre id=&quot;kZSO&quot;&gt;  const getProgressGradient = (isOnTrack) =&amp;gt; {
    return {
      start: isOnTrack ? COLORS.progressBar.gradient.start : COLORS.progressBar.gradient.start,
      end: isOnTrack ? COLORS.progressBar.gradient.end : COLORS.progressBar.gradient.end
    };
  };&lt;/pre&gt;
  &lt;pre id=&quot;rxYH&quot;&gt;  return (
    &amp;lt;div style={{
      padding: &amp;#x27;16px&amp;#x27;,
      width: &amp;#x27;100%&amp;#x27;,
      maxWidth: &amp;#x27;100%&amp;#x27;
    }}&amp;gt;
      &amp;lt;div style={{
        display: &amp;#x27;grid&amp;#x27;,
        gridTemplateColumns: &amp;#x27;repeat(auto-fit, minmax(450px, 1fr))&amp;#x27;,
        gap: &amp;#x27;24px&amp;#x27;,
        width: &amp;#x27;100%&amp;#x27;
      }}&amp;gt;
        {habitsWithGoals.map(habit =&amp;gt; {
          const stats = calculateProgress(habit.id);
          const progressColor = stats.isOnTrack ? COLORS.progressBar.high : COLORS.progressBar.low;
          const gradient = getProgressGradient(stats.isOnTrack);&lt;/pre&gt;
  &lt;pre id=&quot;SkyI&quot;&gt;          return (
            &amp;lt;div key={habit.id} style={{
              background: &amp;#x27;var(--background-secondary)&amp;#x27;,
              borderRadius: &amp;#x27;12px&amp;#x27;,
              padding: &amp;#x27;24px&amp;#x27;,
              boxShadow: &amp;#x27;var(--shadow-s)&amp;#x27;,
              minWidth: &amp;#x27;450px&amp;#x27;,
              flex: &amp;#x27;1 1 auto&amp;#x27;
            }}&amp;gt;
              &amp;lt;div style={{
                display: &amp;#x27;flex&amp;#x27;,
                alignItems: &amp;#x27;center&amp;#x27;,
                gap: &amp;#x27;16px&amp;#x27;,
                marginBottom: &amp;#x27;16px&amp;#x27;
              }}&amp;gt;
                &amp;lt;div style={{
                  width: &amp;#x27;100px&amp;#x27;,
                  height: &amp;#x27;100px&amp;#x27;,
                  position: &amp;#x27;relative&amp;#x27;
                }}&amp;gt;
                  &amp;lt;CircularProgress
                    progress={stats.progress}
                    size={100}
                    strokeWidth={10}
                    circleColor={progressColor}
                    gradientStart={gradient.start}
                    gradientEnd={gradient.end}
                  /&amp;gt;
                  &amp;lt;div style={{
                    position: &amp;#x27;absolute&amp;#x27;,
                    top: &amp;#x27;50%&amp;#x27;,
                    left: &amp;#x27;50%&amp;#x27;,
                    transform: &amp;#x27;translate(-50%, -50%)&amp;#x27;,
                    fontSize: &amp;#x27;42px&amp;#x27;,
                    display: &amp;#x27;flex&amp;#x27;,
                    alignItems: &amp;#x27;center&amp;#x27;,
                    justifyContent: &amp;#x27;center&amp;#x27;,
                    width: &amp;#x27;80%&amp;#x27;,
                    height: &amp;#x27;80%&amp;#x27;
                  }}&amp;gt;
                    {habit.emoji}
                  &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;0GnZ&quot;&gt;                &amp;lt;div style={{ flex: 1 }}&amp;gt;
                  &amp;lt;h3 style={{
                    margin: &amp;#x27;0 0 8px 0&amp;#x27;,
                    textAlign: &amp;#x27;center&amp;#x27;,
                    fontSize: &amp;#x27;1.4em&amp;#x27;,
                    color: &amp;#x27;var(--text-normal)&amp;#x27;
                  }}&amp;gt;{habit.label}&amp;lt;/h3&amp;gt;
                  &amp;lt;div style={{
                    display: &amp;#x27;grid&amp;#x27;,
                    gridTemplateColumns: &amp;#x27;1fr 1fr&amp;#x27;,
                    gap: &amp;#x27;12px&amp;#x27;
                  }}&amp;gt;
                    &amp;lt;Stat
                      label=&amp;quot;Current&amp;quot;
                      value={formatMetricValue(stats.total, habit)}
                    /&amp;gt;
                    &amp;lt;Stat
                      label=&amp;quot;Goal&amp;quot;
                      value={formatMetricValue(habit.monthlyGoal, habit)}
                    /&amp;gt;
                    &amp;lt;Stat
                      label=&amp;quot;Daily Avg&amp;quot;
                      value={formatMetricValue(stats.dailyAverage, habit)}
                    /&amp;gt;
                    &amp;lt;Stat
                      label=&amp;quot;Projected&amp;quot;
                      value={formatMetricValue(stats.projection, habit)}
                      color={stats.isOnTrack ? &amp;#x27;var(--color-green)&amp;#x27; : &amp;#x27;var(--color-red)&amp;#x27;}
                    /&amp;gt;
                  &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
              &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;rND4&quot;&gt;              &amp;lt;div style={{
                height: &amp;#x27;40px&amp;#x27;,
                background: &amp;#x27;var(--background-primary)&amp;#x27;,
                borderRadius: &amp;#x27;20px&amp;#x27;,
                overflow: &amp;#x27;hidden&amp;#x27;,
                position: &amp;#x27;relative&amp;#x27;
              }}&amp;gt;
                &amp;lt;div style={{
                  position: &amp;#x27;absolute&amp;#x27;,
                  top: &amp;#x27;0&amp;#x27;,
                  left: &amp;#x27;0&amp;#x27;,
                  height: &amp;#x27;100%&amp;#x27;,
                  width: &amp;#x60;${stats.progress}%&amp;#x60;,
                  background: &amp;#x60;linear-gradient(90deg, ${gradient.start} 0%, ${gradient.end} 100%)&amp;#x60;,
                  transition: &amp;#x27;width 0.3s ease&amp;#x27;
                }} /&amp;gt;
                &amp;lt;div style={{
                  position: &amp;#x27;absolute&amp;#x27;,
                  top: &amp;#x27;50%&amp;#x27;,
                  left: &amp;#x27;50%&amp;#x27;,
                  transform: &amp;#x27;translate(-50%, -50%)&amp;#x27;,
                  color: &amp;#x27;var(--text-normal)&amp;#x27;,
                  fontWeight: &amp;#x27;bold&amp;#x27;
                }}&amp;gt;
                  {stats.progress}%
                &amp;lt;/div&amp;gt;
              &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
          );
        })}
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};&lt;/pre&gt;
  &lt;pre id=&quot;KffV&quot;&gt;const WeeklyGoalsView = ({ entries }) =&amp;gt; {
  const habitsWithGoals = HABITS.filter(h =&amp;gt; h.monthlyGoal);
  const daysInWeek = 7;&lt;/pre&gt;
  &lt;pre id=&quot;pBdZ&quot;&gt;  const calculateWeeklyProgress = (habitId) =&amp;gt; {
    const total = entries.reduce((sum, entry) =&amp;gt; sum + (entry?.value(habitId) ?? 0), 0);
    const habit = HABITS.find(h =&amp;gt; h.id === habitId);&lt;/pre&gt;
  &lt;pre id=&quot;qRq5&quot;&gt;    // Count days that actually have data
    const daysWithData = entries.filter(entry =&amp;gt; {
      const value = entry?.value(habitId);
      return value !== null &amp;amp;&amp;amp; value !== undefined &amp;amp;&amp;amp; value &amp;gt; 0;
    }).length;&lt;/pre&gt;
  &lt;pre id=&quot;ntCt&quot;&gt;    // Calculate weekly goal as a proportion of monthly goal
    const weeklyGoal = Math.round(habit.monthlyGoal * (daysInWeek / 30));
    const progress = (total / weeklyGoal) * 100;&lt;/pre&gt;
  &lt;pre id=&quot;q65H&quot;&gt;    // Calculate daily average based on days with actual data, or 1 if no days have data
    const daysForAverage = Math.max(daysWithData, 1);
    const dailyAverage = Number((total / daysForAverage).toFixed(2));&lt;/pre&gt;
  &lt;pre id=&quot;qWDe&quot;&gt;    const projection = Number((dailyAverage * daysInWeek).toFixed(2));
    const isOnTrack = projection &amp;gt;= weeklyGoal;&lt;/pre&gt;
  &lt;pre id=&quot;4HjU&quot;&gt;    return {
      total,
      weeklyGoal,
      progress: Number(Math.min(progress, 100).toFixed(2)),
      dailyAverage,
      projection,
      isOnTrack,
      daysWithData
    };
  };&lt;/pre&gt;
  &lt;pre id=&quot;qwbQ&quot;&gt;  const getProgressGradient = (isOnTrack) =&amp;gt; {
    return {
      start: isOnTrack ? COLORS.progressBar.gradient.start : COLORS.progressBar.gradient.start,
      end: isOnTrack ? COLORS.progressBar.gradient.end : COLORS.progressBar.gradient.end
    };
  };&lt;/pre&gt;
  &lt;pre id=&quot;CBeC&quot;&gt;  return (
    &amp;lt;div style={{
      padding: &amp;#x27;16px&amp;#x27;,
      width: &amp;#x27;100%&amp;#x27;,
      maxWidth: &amp;#x27;100%&amp;#x27;
    }}&amp;gt;
      &amp;lt;div style={{
        display: &amp;#x27;grid&amp;#x27;,
        gridTemplateColumns: &amp;#x27;repeat(auto-fit, minmax(450px, 1fr))&amp;#x27;,
        gap: &amp;#x27;24px&amp;#x27;,
        width: &amp;#x27;100%&amp;#x27;
      }}&amp;gt;
        {habitsWithGoals.map(habit =&amp;gt; {
          const stats = calculateWeeklyProgress(habit.id);
          const progressColor = stats.isOnTrack ? COLORS.progressBar.high : COLORS.progressBar.low;
          const gradient = getProgressGradient(stats.isOnTrack);&lt;/pre&gt;
  &lt;pre id=&quot;PH84&quot;&gt;          return (
            &amp;lt;div key={habit.id} style={{
              background: &amp;#x27;var(--background-secondary)&amp;#x27;,
              borderRadius: &amp;#x27;12px&amp;#x27;,
              padding: &amp;#x27;24px&amp;#x27;,
              boxShadow: &amp;#x27;var(--shadow-s)&amp;#x27;,
              minWidth: &amp;#x27;450px&amp;#x27;,
              flex: &amp;#x27;1 1 auto&amp;#x27;
            }}&amp;gt;
              &amp;lt;div style={{
                display: &amp;#x27;flex&amp;#x27;,
                alignItems: &amp;#x27;center&amp;#x27;,
                gap: &amp;#x27;16px&amp;#x27;,
                marginBottom: &amp;#x27;16px&amp;#x27;
              }}&amp;gt;
                &amp;lt;div style={{
                  width: &amp;#x27;100px&amp;#x27;,
                  height: &amp;#x27;100px&amp;#x27;,
                  position: &amp;#x27;relative&amp;#x27;
                }}&amp;gt;
                  &amp;lt;CircularProgress
                    progress={stats.progress}
                    size={100}
                    strokeWidth={10}
                    circleColor={progressColor}
                    gradientStart={gradient.start}
                    gradientEnd={gradient.end}
                  /&amp;gt;
                  &amp;lt;div style={{
                    position: &amp;#x27;absolute&amp;#x27;,
                    top: &amp;#x27;50%&amp;#x27;,
                    left: &amp;#x27;50%&amp;#x27;,
                    transform: &amp;#x27;translate(-50%, -50%)&amp;#x27;,
                    fontSize: &amp;#x27;42px&amp;#x27;,
                    display: &amp;#x27;flex&amp;#x27;,
                    alignItems: &amp;#x27;center&amp;#x27;,
                    justifyContent: &amp;#x27;center&amp;#x27;,
                    width: &amp;#x27;80%&amp;#x27;,
                    height: &amp;#x27;80%&amp;#x27;
                  }}&amp;gt;
                    {habit.emoji}
                  &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;OFMN&quot;&gt;                &amp;lt;div style={{ flex: 1 }}&amp;gt;
                  &amp;lt;h3 style={{
                    margin: &amp;#x27;0 0 8px 0&amp;#x27;,
                    textAlign: &amp;#x27;center&amp;#x27;,
                    fontSize: &amp;#x27;1.4em&amp;#x27;,
                    color: &amp;#x27;var(--text-normal)&amp;#x27;
                  }}&amp;gt;{habit.label}&amp;lt;/h3&amp;gt;
                  &amp;lt;div style={{
                    display: &amp;#x27;grid&amp;#x27;,
                    gridTemplateColumns: &amp;#x27;1fr 1fr&amp;#x27;,
                    gap: &amp;#x27;12px&amp;#x27;
                  }}&amp;gt;
                    &amp;lt;Stat
                      label=&amp;quot;Current&amp;quot;
                      value={formatMetricValue(stats.total, habit)}
                    /&amp;gt;
                    &amp;lt;Stat
                      label=&amp;quot;Weekly Goal&amp;quot;
                      value={formatMetricValue(stats.weeklyGoal, habit)}
                    /&amp;gt;
                    &amp;lt;Stat
                      label=&amp;quot;Daily Avg&amp;quot;
                      value={formatMetricValue(stats.dailyAverage, habit)}
                    /&amp;gt;
                    &amp;lt;Stat
                      label=&amp;quot;Projected&amp;quot;
                      value={formatMetricValue(stats.projection, habit)}
                      color={stats.isOnTrack ? &amp;#x27;var(--color-green)&amp;#x27; : &amp;#x27;var(--color-red)&amp;#x27;}
                    /&amp;gt;
                  &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
              &amp;lt;/div&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;Hijd&quot;&gt;              &amp;lt;div style={{
                height: &amp;#x27;40px&amp;#x27;,
                background: &amp;#x27;var(--background-primary)&amp;#x27;,
                borderRadius: &amp;#x27;20px&amp;#x27;,
                overflow: &amp;#x27;hidden&amp;#x27;,
                position: &amp;#x27;relative&amp;#x27;
              }}&amp;gt;
                &amp;lt;div style={{
                  position: &amp;#x27;absolute&amp;#x27;,
                  top: &amp;#x27;0&amp;#x27;,
                  left: &amp;#x27;0&amp;#x27;,
                  height: &amp;#x27;100%&amp;#x27;,
                  width: &amp;#x60;${stats.progress}%&amp;#x60;,
                  background: &amp;#x60;linear-gradient(90deg, ${gradient.start} 0%, ${gradient.end} 100%)&amp;#x60;,
                  transition: &amp;#x27;width 0.3s ease&amp;#x27;
                }} /&amp;gt;
                &amp;lt;div style={{
                  position: &amp;#x27;absolute&amp;#x27;,
                  top: &amp;#x27;50%&amp;#x27;,
                  left: &amp;#x27;50%&amp;#x27;,
                  transform: &amp;#x27;translate(-50%, -50%)&amp;#x27;,
                  color: &amp;#x27;var(--text-normal)&amp;#x27;,
                  fontWeight: &amp;#x27;bold&amp;#x27;
                }}&amp;gt;
                  {stats.progress}%
                &amp;lt;/div&amp;gt;
              &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
          );
        })}
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};&lt;/pre&gt;
  &lt;pre id=&quot;1zyu&quot;&gt;const Stat = ({ label, value, color }) =&amp;gt; (
  &amp;lt;div style={{ textAlign: &amp;#x27;center&amp;#x27; }}&amp;gt;
    &amp;lt;div style={{
      fontSize: &amp;#x27;0.9em&amp;#x27;,
      color: &amp;#x27;var(--text-muted)&amp;#x27;,
      marginBottom: &amp;#x27;4px&amp;#x27;
    }}&amp;gt;
      {label}
    &amp;lt;/div&amp;gt;
    &amp;lt;div style={{
      fontSize: &amp;#x27;1.1em&amp;#x27;,
      fontWeight: &amp;#x27;bold&amp;#x27;,
      color: color || &amp;#x27;var(--text-normal)&amp;#x27;
    }}&amp;gt;
      {value}
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
);&lt;/pre&gt;
  &lt;pre id=&quot;NLoN&quot;&gt;function HabitTracker() {
  // State Management
  const [activeView, setActiveView] = dc.useState(&amp;#x27;weekly&amp;#x27;);
  const [selectedDate, setSelectedDate] = dc.useState(dc.luxon.DateTime.now());
  const [editingTime, setEditingTime] = dc.useState(null);
  const [currentPage, setCurrentPage] = dc.useState(0);&lt;/pre&gt;
  &lt;pre id=&quot;3b3G&quot;&gt;  // Data Queries and Utility Functions
  const dailyNotes = dc.useQuery(&amp;#x60;
    @page 
    AND path(&amp;quot;002 Journal&amp;quot;)
  &amp;#x60;);&lt;/pre&gt;
  &lt;pre id=&quot;NBGs&quot;&gt;  const sortedNotes = dc.useMemo(() =&amp;gt; {
    return [...dailyNotes].sort((a, b) =&amp;gt; b.$name.localeCompare(a.$name));
  }, [dailyNotes]);&lt;/pre&gt;
  &lt;pre id=&quot;H95B&quot;&gt;  const getNotesForPeriod = (startDate) =&amp;gt; {
    return sortedNotes.filter(note =&amp;gt; {
      const noteDate = dc.luxon.DateTime.fromISO(note.$name);
      return noteDate &amp;gt;= startDate;
    });
  };&lt;/pre&gt;
  &lt;pre id=&quot;tzI3&quot;&gt;  // Add new function to get notes for specific date range
  const getNotesForDateRange = (startDate, endDate) =&amp;gt; {
    return sortedNotes.filter(note =&amp;gt; {
      const noteDate = dc.luxon.DateTime.fromISO(note.$name);
      // Use startOf(&amp;#x27;day&amp;#x27;) and endOf(&amp;#x27;day&amp;#x27;) to ensure full day coverage
      return noteDate &amp;gt;= startDate.startOf(&amp;#x27;day&amp;#x27;) &amp;amp;&amp;amp; noteDate &amp;lt;= endDate.endOf(&amp;#x27;day&amp;#x27;);
    });
  };&lt;/pre&gt;
  &lt;pre id=&quot;VthU&quot;&gt;  const last30DaysNotes = dc.useMemo(() =&amp;gt;
    getNotesForPeriod(selectedDate.minus({ days: 30 })),
    [sortedNotes, selectedDate]
  );&lt;/pre&gt;
  &lt;pre id=&quot;yhTC&quot;&gt;  const yearToDateNotes = dc.useMemo(() =&amp;gt;
    getNotesForPeriod(selectedDate.startOf(&amp;#x27;year&amp;#x27;)),
    [sortedNotes, selectedDate]
  );&lt;/pre&gt;
  &lt;pre id=&quot;A0WH&quot;&gt;  const currentMonthNotes = dc.useMemo(() =&amp;gt;
    getNotesForPeriod(selectedDate.startOf(&amp;#x27;month&amp;#x27;)),
    [sortedNotes, selectedDate]
  );&lt;/pre&gt;
  &lt;pre id=&quot;PybG&quot;&gt;  const previousMonthNotes = dc.useMemo(() =&amp;gt;
    sortedNotes.filter(note =&amp;gt; {
      const noteDate = dc.luxon.DateTime.fromISO(note.$name);
      const monthAgo = selectedDate.minus({ months: 1 });
      return noteDate &amp;gt;= monthAgo &amp;amp;&amp;amp; noteDate &amp;lt; selectedDate.startOf(&amp;#x27;month&amp;#x27;);
    }),
    [sortedNotes, selectedDate]
  );&lt;/pre&gt;
  &lt;pre id=&quot;aKrl&quot;&gt;  const getHabitStatus = (entry, habitId) =&amp;gt; {
    const habit = HABITS.find(h =&amp;gt; h.id === habitId);
    const value = entry?.value(habitId) ?? 0;
    return value &amp;gt;= habit.defaultDuration;
  };&lt;/pre&gt;
  &lt;pre id=&quot;OIyB&quot;&gt;  const getHabitDuration = (entry, habitId) =&amp;gt; {
    return entry?.value(habitId) ?? null;
  };&lt;/pre&gt;
  &lt;pre id=&quot;xzsC&quot;&gt;  const calculateCompletedHabits = (entry) =&amp;gt; {
    if (!entry) return 0;
    return HABITS.reduce((count, habit) =&amp;gt;
      count + (getHabitStatus(entry, habit.id) ? 1 : 0), 0);
  };&lt;/pre&gt;
  &lt;pre id=&quot;1KYg&quot;&gt;  const calculatePerfectDays = (notes) =&amp;gt; {
    return notes.reduce((count, note) =&amp;gt;
      count + (calculateCompletedHabits(note) === HABITS.length ? 1 : 0), 0);
  };&lt;/pre&gt;
  &lt;pre id=&quot;taVQ&quot;&gt;  const calculateTrends = () =&amp;gt; {
    const trends = {
      last30Days: {
        perfectDays: calculatePerfectDays(last30DaysNotes),
        habitMetrics: {}
      },
      yearToDate: {
        perfectDays: calculatePerfectDays(yearToDateNotes),
        habitMetrics: {}
      },
      currentMonth: {
        perfectDays: calculatePerfectDays(currentMonthNotes),
        progress: 0
      }
    };&lt;/pre&gt;
  &lt;pre id=&quot;TSy6&quot;&gt;    trends.currentMonth.progress = (trends.currentMonth.perfectDays / GOALS.perfectDays.monthly) * 100;&lt;/pre&gt;
  &lt;pre id=&quot;A9Tb&quot;&gt;    HABITS.forEach(habit =&amp;gt; {
      const last30Total = last30DaysNotes.reduce((sum, note) =&amp;gt; {
        const value = note?.value(habit.id);
        const numValue = value ? Number(value) : 0;
        return sum + (isNaN(numValue) ? 0 : numValue);
      }, 0);&lt;/pre&gt;
  &lt;pre id=&quot;bWIE&quot;&gt;      const ytdTotal = yearToDateNotes.reduce((sum, note) =&amp;gt; {
        const value = note?.value(habit.id);
        const numValue = value ? Number(value) : 0;
        return sum + (isNaN(numValue) ? 0 : numValue);
      }, 0);&lt;/pre&gt;
  &lt;pre id=&quot;gUN9&quot;&gt;      const previousMonthTotal = previousMonthNotes.reduce((sum, note) =&amp;gt; {
        const value = note?.value(habit.id);
        const numValue = value ? Number(value) : 0;
        return sum + (isNaN(numValue) ? 0 : numValue);
      }, 0);&lt;/pre&gt;
  &lt;pre id=&quot;Ox75&quot;&gt;      trends.last30Days.habitMetrics[habit.id] = {
        total: last30Total,
        previousPeriodTotal: previousMonthTotal
      };&lt;/pre&gt;
  &lt;pre id=&quot;tnXn&quot;&gt;      trends.yearToDate.habitMetrics[habit.id] = {
        total: ytdTotal
      };
    });&lt;/pre&gt;
  &lt;pre id=&quot;xLuI&quot;&gt;    return trends;
  };&lt;/pre&gt;
  &lt;pre id=&quot;SvIW&quot;&gt;  // Get current week&amp;#x27;s notes based on selected date
  const currentWeekNotes = dc.useMemo(() =&amp;gt;
    sortedNotes.filter(note =&amp;gt; {
      const noteDate = dc.luxon.DateTime.fromISO(note.$name);
      const startOfWeek = selectedDate.startOf(&amp;#x27;week&amp;#x27;);
      const endOfWeek = selectedDate.endOf(&amp;#x27;week&amp;#x27;);
      return noteDate &amp;gt;= startOfWeek &amp;amp;&amp;amp; noteDate &amp;lt;= endOfWeek;
    }),
    [sortedNotes, selectedDate]
  );&lt;/pre&gt;
  &lt;pre id=&quot;PonN&quot;&gt;  // Action Handlers
  async function updateHabit(entry, habitId) {
    const file = app.vault.getAbstractFileByPath(entry.$path);
    await app.fileManager.processFrontMatter(file, (frontmatter) =&amp;gt; {
      const habit = HABITS.find(h =&amp;gt; h.id === habitId);
      const currentValue = frontmatter[habitId];
      frontmatter[habitId] = currentValue ? 0 : habit.defaultDuration;
    });
  }&lt;/pre&gt;
  &lt;pre id=&quot;el9P&quot;&gt;  async function updateHabitDuration(entry, habitId, duration) {
    const file = app.vault.getAbstractFileByPath(entry.$path);
    await app.fileManager.processFrontMatter(file, (frontmatter) =&amp;gt; {
      frontmatter[habitId] = parseInt(duration) || 0;
    });
    setEditingTime(null);
  }&lt;/pre&gt;
  &lt;pre id=&quot;rZTY&quot;&gt;  const navigateDate = (direction) =&amp;gt; {
    setSelectedDate(prev =&amp;gt; prev.plus({ days: direction }));
  };&lt;/pre&gt;
  &lt;pre id=&quot;hr3D&quot;&gt;  // Main Layout
  return (
  &amp;lt;div style={{
    width: &amp;#x27;100%&amp;#x27;,
    margin: &amp;#x27;0 auto&amp;#x27;,
    padding: &amp;#x27;24px&amp;#x27;,
    display: &amp;#x27;flex&amp;#x27;,
    flexDirection: &amp;#x27;column&amp;#x27;,
    gap: &amp;#x27;24px&amp;#x27;
  }}&amp;gt;
    &amp;lt;NavigationControls
      selectedDate={selectedDate}
      navigateDate={navigateDate}
      activeView={activeView}
      setActiveView={setActiveView}
    /&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;DABF&quot;&gt;    &amp;lt;StyledCard&amp;gt;
      &amp;lt;CalendarView
        selectedDate={selectedDate}
        sortedNotes={getNotesForDateRange(selectedDate.minus({ days: 6 }), selectedDate)}
        getHabitStatus={getHabitStatus}
        calculateCompletedHabits={calculateCompletedHabits}
        updateHabit={updateHabit}
        getHabitDuration={getHabitDuration}
        editingTime={editingTime}
        setEditingTime={setEditingTime}
        updateHabitDuration={updateHabitDuration}
      /&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;2fNM&quot;&gt;      &amp;lt;div style={{
        display: &amp;#x27;flex&amp;#x27;,
        justifyContent: &amp;#x27;center&amp;#x27;,
        gap: &amp;#x27;16px&amp;#x27;,
        marginTop: &amp;#x27;16px&amp;#x27;,
        paddingTop: &amp;#x27;16px&amp;#x27;,
        borderTop: &amp;#x27;1px solid var(--background-modifier-border)&amp;#x27;
      }}&amp;gt;
        &amp;lt;ActionButton
          icon=&amp;quot;📅&amp;quot;
          onClick={() =&amp;gt; setActiveView(activeView === &amp;#x27;weekly&amp;#x27; ? null : &amp;#x27;weekly&amp;#x27;)}
          isActive={activeView === &amp;#x27;weekly&amp;#x27;}
          extraStyles={{ padding: &amp;#x27;12px&amp;#x27; }}
        /&amp;gt;
        &amp;lt;ActionButton
          icon=&amp;quot;🚀&amp;quot;
          onClick={() =&amp;gt; setActiveView(activeView === &amp;#x27;goals&amp;#x27; ? null : &amp;#x27;goals&amp;#x27;)}
          isActive={activeView === &amp;#x27;goals&amp;#x27;}
          extraStyles={{ padding: &amp;#x27;12px&amp;#x27; }}
        /&amp;gt;
        &amp;lt;ActionButton
          icon=&amp;quot;🚧&amp;quot;
          onClick={() =&amp;gt; setActiveView(activeView === &amp;#x27;stats&amp;#x27; ? null : &amp;#x27;stats&amp;#x27;)}
          isActive={activeView === &amp;#x27;stats&amp;#x27;}
          extraStyles={{ padding: &amp;#x27;12px&amp;#x27; }}
        /&amp;gt;
        &amp;lt;ActionButton
          icon=&amp;quot;🎯&amp;quot;
          onClick={() =&amp;gt; setActiveView(activeView === &amp;#x27;history&amp;#x27; ? null : &amp;#x27;history&amp;#x27;)}
          isActive={activeView === &amp;#x27;history&amp;#x27;}
          extraStyles={{ padding: &amp;#x27;12px&amp;#x27; }}
        /&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/StyledCard&amp;gt;&lt;/pre&gt;
  &lt;pre id=&quot;qt9I&quot;&gt;    {activeView === &amp;#x27;weekly&amp;#x27; &amp;amp;&amp;amp; (
      &amp;lt;WeeklyGoalsView entries={currentWeekNotes} /&amp;gt;
    )}
    {activeView === &amp;#x27;goals&amp;#x27; &amp;amp;&amp;amp; (
      &amp;lt;GoalsView
        entries={currentMonthNotes}
        daysInMonth={new Date(new Date().getFullYear(), new Date().getMonth() + 1, 0).getDate()}
      /&amp;gt;
    )}
    {activeView === &amp;#x27;stats&amp;#x27; &amp;amp;&amp;amp; &amp;lt;TrendsView trends={calculateTrends()} /&amp;gt;}
    {activeView === &amp;#x27;history&amp;#x27; &amp;amp;&amp;amp; (
      &amp;lt;HistoricalView
        sortedNotes={sortedNotes}
        currentPage={currentPage}
        setCurrentPage={setCurrentPage}
        updateHabit={updateHabit}
        getHabitStatus={getHabitStatus}
        getHabitDuration={getHabitDuration}
        editingTime={editingTime}
        setEditingTime={setEditingTime}
        updateHabitDuration={updateHabitDuration}
        calculateCompletedHabits={calculateCompletedHabits}
      /&amp;gt;
    )}
  &amp;lt;/div&amp;gt;
);
}&lt;/pre&gt;
  &lt;pre id=&quot;Iarx&quot;&gt;return HabitTracker;
&amp;#x60;&amp;#x60;&amp;#x60;&amp;#x60;&lt;/pre&gt;
  &lt;p id=&quot;3vAL&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Hwig&quot; data-align=&quot;center&quot;&gt;Основная настройка трекера&lt;/h3&gt;
  &lt;p id=&quot;5jvN&quot;&gt;1. Чтобы начать работу с трекером, у вас должны быть настроены &lt;strong&gt;Ежедневные заметки&lt;/strong&gt; (указана папка, куда отправлять &lt;strong&gt;Daily notes&lt;/strong&gt;). Также желательно установить плагин &lt;strong&gt;Calendar &lt;/strong&gt;– так будет проще работать с трекером&lt;/p&gt;
  &lt;p id=&quot;OBij&quot;&gt;2. Дальше в коде трекера ищем &lt;em&gt;query&lt;/em&gt; (переходим в исходный код &lt;strong&gt;ctrl+e &lt;/strong&gt;–&amp;gt; поиск &lt;strong&gt;ctrl+f&lt;/strong&gt; –&amp;gt; вводим &lt;strong&gt;&lt;em&gt;query&lt;/em&gt;&lt;/strong&gt;). Тут нужно указать название своей папки с &lt;strong&gt;Daily notes&lt;/strong&gt;&lt;/p&gt;
  &lt;figure id=&quot;HqDi&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7a/91/7a917b19-e244-45b3-8fe8-f159840a6c82.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Habit tracker settings&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Tps4&quot;&gt;3. Проверяем, что все работает. Протыкиваем на календаре текущую неделю = создаем &lt;strong&gt;Ежедневные заметки на неделю&lt;/strong&gt;. В трекере появляются вот такие штучки, которые позволяет отмечать выполнение привычки ⬇&lt;/p&gt;
  &lt;figure id=&quot;uq85&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ee/94/ee94132e-5560-44e4-a869-542cf6b806f2.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Habit tracker settings&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Q5sS&quot;&gt;4. Теперь настраиваем то, что будет отображаться в вашем трекере. Это самая первая колонка в коде ⬇&lt;/p&gt;
  &lt;figure id=&quot;balo&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b0/af/b0af95a0-b986-4e5e-88ee-5f32be6e9f7b.png&quot; width=&quot;857&quot; /&gt;
    &lt;figcaption&gt;Habit tracker settings&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;5QVj&quot;&gt;&lt;strong&gt;id:&lt;/strong&gt; так привычка будет отображаться в свойствах Ежедневной заметки&lt;/p&gt;
    &lt;p id=&quot;wr6m&quot;&gt;&lt;strong&gt;emoji:&lt;/strong&gt; эмодзи привычки&lt;/p&gt;
    &lt;p id=&quot;y5cJ&quot;&gt;&lt;strong&gt;label:&lt;/strong&gt; название привычки (так она будет отображаться в трекере)&lt;/p&gt;
    &lt;p id=&quot;uHzx&quot;&gt;&lt;strong&gt;defaultDuration:&lt;/strong&gt; количество в цифрах (времени, денег, раз)&lt;/p&gt;
    &lt;p id=&quot;zc9I&quot;&gt;&lt;strong&gt;unit:&lt;/strong&gt; в чем измеряете? (в долларах, рублях, часах, минутах, секундах и тд)&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;DIzB&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d7/fa/d7fa389e-7736-4a2e-8542-d97fd41a98f6.png&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Habit tracker settings&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;MQB9&quot;&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/ed_knowledgebase&quot; target=&quot;_blank&quot;&gt;Обучение и базы знаний&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Vc81&quot;&gt;&lt;em&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/second_brain_ru&quot; target=&quot;_blank&quot;&gt;Second Brain&lt;/a&gt; про управление личными знаниями&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;yPMq&quot;&gt;&lt;em&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/obsidianrus&quot; target=&quot;_blank&quot;&gt;Pro Obsidian&lt;/a&gt; про Obsidian и заметковедение&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;2PJ9&quot;&gt;&lt;em&gt;✔ Официальный &lt;a href=&quot;https://second-brain.ru/&quot; target=&quot;_blank&quot;&gt;сайт&lt;/a&gt; сообщества Second Brain&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;N8ZQ&quot;&gt;✔ Youtube-канал &lt;a href=&quot;https://www.youtube.com/@second-brain&quot; target=&quot;_blank&quot;&gt;Second brain&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>zakirov_edtech:QXnTUJH3fOA</id><link rel="alternate" type="text/html" href="https://teletype.in/@zakirov_edtech/QXnTUJH3fOA?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zakirov_edtech"></link><title>Perfectionist Homepage in Obsidian</title><published>2025-01-20T09:56:55.689Z</published><updated>2025-01-22T11:46:01.354Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/c4/a6/c4a66502-3589-4daa-9033-7480e0bd569a.png"></media:thumbnail><category term="obsidian" label="Obsidian"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/63/6d/636dea67-eee2-4a91-80e0-906d7b7acb42.jpeg&quot;&gt;Автор: публикация на Reddit</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(263, 48%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;C0HW&quot;&gt;Автор: &lt;a href=&quot;https://www.reddit.com/r/ObsidianMD/comments/1gswbv9/my_homepage/#lightbox&quot; target=&quot;_blank&quot;&gt;публикация на Reddit&lt;/a&gt;&lt;/p&gt;
    &lt;p id=&quot;9mdz&quot;&gt;Репозиторий на &lt;a href=&quot;https://github.com/Nighty3098/MY_NOTES/tree/main&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;anh5&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/63/6d/636dea67-eee2-4a91-80e0-906d7b7acb42.jpeg&quot; width=&quot;1080&quot; /&gt;
    &lt;figcaption&gt;Homepage 1/2&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;nURu&quot; data-align=&quot;center&quot;&gt;Инструкция по установке&lt;/h2&gt;
  &lt;ol id=&quot;qT1P&quot;&gt;
    &lt;li id=&quot;vF8n&quot;&gt;Скачиваем &lt;a href=&quot;https://github.com/Nighty3098/MY_NOTES/tree/main&quot; target=&quot;_blank&quot;&gt;репозиторий&lt;/a&gt; с GitHub&lt;/li&gt;
    &lt;li id=&quot;oK7M&quot;&gt;Переносим в свое хранилище файл &lt;em&gt;Home.md&lt;/em&gt;&lt;/li&gt;
    &lt;li id=&quot;XehG&quot;&gt;Находим .obsidian. Копируем папки snippets, themes и plugins в свою корневую папку .obsidian&lt;/li&gt;
    &lt;li id=&quot;baiC&quot;&gt;Запускаем &lt;em&gt;Obsidian&lt;/em&gt;. Включаем все &lt;em&gt;Сторонние плагины &lt;/em&gt;и &lt;em&gt;Фрагменты CSS&lt;/em&gt;. Готово ✅&lt;/li&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;6nte&quot;&gt;Ваше хранилище/.obsidian/snippets&lt;/pre&gt;
  &lt;pre id=&quot;vibx&quot;&gt;Ваше хранилище/.obsidian/themes&lt;/pre&gt;
  &lt;pre id=&quot;8ovE&quot;&gt;Ваше хранилище/.obsidian/plugins&lt;/pre&gt;
  &lt;figure id=&quot;eYUV&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7c/f0/7cf06b09-fdf9-4fd0-8167-55bc0bef2220.jpeg&quot; width=&quot;2100&quot; /&gt;
    &lt;figcaption&gt;Homepage 2/2&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;MQB9&quot;&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/ed_knowledgebase&quot; target=&quot;_blank&quot;&gt;Обучение и базы знаний&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Vc81&quot;&gt;&lt;em&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/second_brain_ru&quot; target=&quot;_blank&quot;&gt;Second Brain&lt;/a&gt; про управление личными знаниями&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;yPMq&quot;&gt;&lt;em&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/obsidianrus&quot; target=&quot;_blank&quot;&gt;Pro Obsidian&lt;/a&gt; про Obsidian и заметковедение&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;2PJ9&quot;&gt;&lt;em&gt;✔ Официальный &lt;a href=&quot;https://second-brain.ru/&quot; target=&quot;_blank&quot;&gt;сайт&lt;/a&gt; сообщества Second Brain&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;N8ZQ&quot;&gt;✔ Youtube-канал &lt;a href=&quot;https://www.youtube.com/@second-brain&quot; target=&quot;_blank&quot;&gt;Second brain&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>zakirov_edtech:WAG_7yK8F0P</id><link rel="alternate" type="text/html" href="https://teletype.in/@zakirov_edtech/WAG_7yK8F0P?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zakirov_edtech"></link><title>SQ3R. Продуктивное чтение</title><published>2025-01-17T18:51:14.053Z</published><updated>2025-02-03T10:15:03.904Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f6/6f/f66f4172-8781-4fdb-b6c2-7908431aec01.png"></media:thumbnail><category term="learning" label="learning"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/3b/84/3b84a34f-9344-41dc-aacb-0bc2bc183b60.png&quot;&gt;Подробности можно узнать в telegram-канале Second Brain</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h2 id=&quot;pFMg&quot;&gt;Насколько эффективен метод? &lt;/h2&gt;
  &lt;/section&gt;
  &lt;p id=&quot;97pL&quot;&gt;Работает ли метод? Подробности можно узнать в telegram-канале &lt;a href=&quot;https://t.me/second_brain_ru/291&quot; target=&quot;_blank&quot;&gt;Second Brain&lt;/a&gt;&lt;/p&gt;
  &lt;figure id=&quot;AknU&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/95/53/955373fa-da25-4eeb-8dbb-0e0dd0e897bc.png&quot; width=&quot;1000&quot; /&gt;
    &lt;figcaption&gt;SQ3R&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h2 id=&quot;QGKb&quot;&gt;Для кого этот метод?&lt;/h2&gt;
  &lt;/section&gt;
  &lt;ul id=&quot;rbjf&quot;&gt;
    &lt;li id=&quot;F0Zl&quot;&gt;&lt;strong&gt;Работники науки/исследователи. &lt;/strong&gt;Это, собственно, главная целевая аудитория SQ3R. Все дело в постановке конкретных вопросов, которые помогают продвигать исследование в своей сфере. Порой ученым нужна конкретная информация из прочитанной книги&lt;/li&gt;
    &lt;li id=&quot;9iyx&quot;&gt;&lt;strong&gt;Студенты/школьники/самообразованцы&lt;/strong&gt;. Часто студентам в университетах, техникумах требуется найти конкретный информацию из научной литературы. Если обучающийся серьезно настроен к написанию своего исследованию, то он неизбежно будет так или иначе касаться метода SQ3R&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h2 id=&quot;mb5z&quot;&gt;Специфика и описание SQ3R&lt;/h2&gt;
  &lt;/section&gt;
  &lt;p id=&quot;gTKI&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Поверхностное чтение (Survey)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;ridQ&quot;&gt;Просмотрите текст, обращая внимание на заголовки, подзаголовки и иллюстрации. Это поможет вам понять, о чём идёт речь. Некая предподготовка и восприятию информацию. На этом же этапе можно оценить, зачем вам это читать и нужно ли вообще&lt;/p&gt;
  &lt;p id=&quot;4QRX&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Задаем себе вопросы (Question)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;Chuu&quot;&gt;Прежде чем начать читать, сформулируйте вопросы, на которые вы хотите получить ответы. Особенно полезными в этом могут быть заголовки, выделенные жирным слова, цитаты и прочие моменты. В начале и в конце текста, главы, книги обычно находится концентрат авторской мысли&lt;/p&gt;
  &lt;p id=&quot;qPJx&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Чтение (Read)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;jX80&quot;&gt;Теперь, когда вы примерно представляете себе содержание статьи, можно приступать к чтению. Ваша цель: найти информацию, которая поможет ответить на поставленные себе вопросы&lt;/p&gt;
  &lt;p id=&quot;1Y0q&quot;&gt;&lt;strong&gt;Это главный минус метода&lt;/strong&gt;. Да, когда есть конкретная задача, проще ориентироваться в потоке информации, однако вы можете упустить другие интересные мысли и рассуждения. Тут все зависит от запроса&lt;/p&gt;
  &lt;p id=&quot;X26B&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Повторение = вспоминание (Recite)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;UY1T&quot;&gt;Прочитав раздел, перескажите его содержание так, будто вы рассказываете его кому-то другому. Постарайтесь выразить свои мысли как можно более сжато и лаконично. После этого подумайте, отвечает ли этот раздел на какой-либо из ваших вопросов&lt;/p&gt;
  &lt;p id=&quot;Hutz&quot;&gt;Можно в прямом смысле постараться пересказать другому человеку прочитанное, но своими словами. Этот метод имеет научное обоснование эффективности, он действительно работает. Это часть &lt;a href=&quot;https://t.me/second_brain_ru/245&quot; target=&quot;_blank&quot;&gt;метода обучения Фейнмана&lt;/a&gt;. Главное, не скатиться в перечитывание и зубрежка – это безрезультативно.&lt;/p&gt;
  &lt;p id=&quot;vVlt&quot;&gt;Если вы ведете заметки – это тоже действенный способ повторения и закрепления информации. Просто записывайте своими словами то, что поняли из прочитанного. Цитирование допускается, но лучше не злоупотреблять&lt;/p&gt;
  &lt;p id=&quot;NgiC&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Возвращаемся к материалу (Review)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;1x5q&quot;&gt;Главное, не скатиться в перечитывание и зубрежку – это безрезультативно. Нужно уделить особое внимание поставленным вопросам и полученным ответам. Можно повторять по &lt;a href=&quot;https://t.me/second_brain_ru/243&quot; target=&quot;_blank&quot;&gt;схеме Кривой Эббингауза&lt;/a&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;h2 id=&quot;hNte&quot;&gt;С чего начать?&lt;/h2&gt;
  &lt;/section&gt;
  &lt;ol id=&quot;VLXP&quot;&gt;
    &lt;li id=&quot;nvC8&quot;&gt;Повышение осознанности. Стоит начать с понимания того, что вы вообще читаете. Нужно ли вам это? Для какого проекта? Кто автор?&lt;/li&gt;
    &lt;li id=&quot;H63r&quot;&gt;Стараться войти в состояние потока, про которое писал &lt;a href=&quot;https://www.litres.ru/book/mihay-chiksentmihayi/potok-psihologiya-optimalnogo-perezhivaniya-4244565/&quot; target=&quot;_blank&quot;&gt;Михай Чиксентмихайи&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;zN2u&quot;&gt;Применять шаги из метода&lt;/li&gt;
  &lt;/ol&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;MQB9&quot;&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/ed_knowledgebase&quot; target=&quot;_blank&quot;&gt;Обучение и базы знаний&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Vc81&quot;&gt;&lt;em&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/second_brain_ru&quot; target=&quot;_blank&quot;&gt;Second Brain&lt;/a&gt; про управление личными знаниями&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;yPMq&quot;&gt;&lt;em&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/obsidianrus&quot; target=&quot;_blank&quot;&gt;Pro Obsidian&lt;/a&gt; про Obsidian и заметковедение&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;2PJ9&quot;&gt;&lt;em&gt;✔ Официальный &lt;a href=&quot;https://second-brain.ru/&quot; target=&quot;_blank&quot;&gt;сайт&lt;/a&gt; сообщества Second Brain&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;N8ZQ&quot;&gt;✔ Youtube-канал &lt;a href=&quot;https://www.youtube.com/@second-brain&quot; target=&quot;_blank&quot;&gt;Second brain&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>zakirov_edtech:2ZHhng6dtpr</id><link rel="alternate" type="text/html" href="https://teletype.in/@zakirov_edtech/2ZHhng6dtpr?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zakirov_edtech"></link><title>Миграция текстовых заметок из Word в Obsidian</title><published>2025-01-07T15:24:58.781Z</published><updated>2025-02-03T10:16:30.850Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/f4/bb/f4bb9444-a864-4cc3-8fb6-5ff3b35a4f09.png"></media:thumbnail><category term="obsidian" label="Obsidian"></category><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/b2/63/b2634fc2-8651-4d4e-8355-2c1fbbc72da7.jpeg&quot;&gt;Форматы: почти все текстовые</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;BZxL&quot;&gt;&lt;strong&gt;Форматы:&lt;/strong&gt; почти все текстовые&lt;/p&gt;
    &lt;p id=&quot;ugi7&quot;&gt;&lt;strong&gt;Источник: &lt;/strong&gt;Илья Шабанов в &lt;a href=&quot;https://x.com/Artifexx/status/1606455384147128320&quot; target=&quot;_blank&quot;&gt;twitter/x&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;ljxL&quot;&gt;1. Поместите все ваши документы Word (*.docx, *.txt, *.rtf ...) в ОДНУ плоскую папку (т. е. без подпапок) на вашем компьютере&lt;/p&gt;
  &lt;p id=&quot;sXCf&quot;&gt;2. Теперь все наши файлы в одном месте! Пришло время скачать малоизвестный скрипт &lt;a href=&quot;https://pandoc.org/installing.html&quot; target=&quot;_blank&quot;&gt;Pandoc&lt;/a&gt;. Это инструмент, который преобразует любой документ в формат, который понимает Obsidian: Markdown&lt;/p&gt;
  &lt;h3 id=&quot;d4JM&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Mac/OS &lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;OD87&quot;&gt;Щёлкните правой кнопкой мыши по нашей папке и выберите «Службы» &amp;gt; «Новый терминал в папке». Скопируйте и вставьте это в терминал: &lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;hSEd&quot;&gt;&lt;code&gt;for f in *.docx; do pandoc &amp;quot;$f&amp;quot; -s -t markdown -o &amp;quot;${f%.docx}.md&amp;quot;; done&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;figure id=&quot;LPjk&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/dd/78/dd788a45-fb53-4c81-9eb3-fea7c9d2839d.jpeg&quot; width=&quot;1148&quot; /&gt;
    &lt;figcaption&gt;MacOS 2/3&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;WL74&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/c8/2c/c82cbbc8-7eca-4bf0-a1c0-a630490099ad.jpeg&quot; width=&quot;1610&quot; /&gt;
    &lt;figcaption&gt;MacOS 3/3&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;CyFX&quot;&gt;Это команда для pandoc, которая преобразует все файлы *.docx в &amp;quot;markdown&amp;quot;. (Повторите, заменив &amp;quot;docx&amp;quot; на &amp;quot;txt&amp;quot; или &amp;quot;rtf&amp;quot;, для любых других форматов файлов, которые у вас есть)&lt;/p&gt;
  &lt;h3 id=&quot;vxtc&quot; data-align=&quot;center&quot;&gt;Windows&lt;/h3&gt;
  &lt;p id=&quot;DKFS&quot;&gt;Скачиваем папку для Windows с &lt;a href=&quot;https://github.com/jgm/pandoc/releases/tag/3.6.1&quot; target=&quot;_blank&quot;&gt;github&lt;/a&gt;. Переносим файл &lt;em&gt;pandoc.exe&lt;/em&gt; в нашу папку с &lt;em&gt;.docx файлами &lt;/em&gt;&lt;/p&gt;
  &lt;figure id=&quot;XxSU&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4e/35/4e35b2a4-b341-4784-adfe-a16ce2c2bc9b.jpeg&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Windows 1/3&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;gWHP&quot;&gt;Переходим в свою папку, чтобы скопировать её путь. Нажимаем на адресную строку и нажмите CTRL + C. Открываем приложение «командная строка». Вводим «cd» и вставляем путь, который вы скопировали на предыдущем шаге (нажмите CTRL + V для вставки). Теперь вы внутри терминала находитесь в своей папке с текстовыми файлами&lt;/p&gt;
  &lt;figure id=&quot;gghp&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/d5/9f/d59f219b-a9bc-4215-8e51-303c4ad3ff6a.jpeg&quot; width=&quot;1668&quot; /&gt;
    &lt;figcaption&gt;Windows 2/3&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;JqxL&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/23/a6/23a6bb76-937f-4e55-8c88-334238aa89be.jpeg&quot; width=&quot;1920&quot; /&gt;
    &lt;figcaption&gt;Windows 3/3&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2jIC&quot;&gt;Когда вы уже внутри своей папки (вы видите это в командной строке). Вводим команду:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;cn97&quot;&gt;&lt;code&gt;pandoc input.docx -t markdown -o output.md&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;K1T5&quot;&gt;&lt;strong&gt;input.docx&lt;/strong&gt; — название вашего файла&lt;/p&gt;
    &lt;p id=&quot;8m78&quot;&gt;&lt;strong&gt;output.md &lt;/strong&gt;— конечное название файла в markdown-формате&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;5QAo&quot;&gt;Конвертация в обратную сторону:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;pre id=&quot;ryeV&quot;&gt;pandoc input.md -o output.docx&lt;/pre&gt;
  &lt;/section&gt;
  &lt;p id=&quot;K1T5&quot;&gt;&lt;strong&gt;input.md&lt;/strong&gt; — название вашего файла&lt;/p&gt;
  &lt;p id=&quot;8m78&quot;&gt;&lt;strong&gt;output.docx &lt;/strong&gt;— конечное название файла в markdown-формате&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;C67B&quot;&gt;Ура, мы преобразовали все наши файлы в Markdown, который может читать Obsidian. Последний шаг: Если вы раньше не работали с Obsidian. Запустите его сейчас, нажмите кнопку «Открыть папку как хранилище» и выберите нашу папку. ИЛИ: если у вас есть хранилище, скопируйте наши файлы в него&lt;/p&gt;
  &lt;/section&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;MQB9&quot;&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/ed_knowledgebase&quot; target=&quot;_blank&quot;&gt;Обучение и базы знаний&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Vc81&quot;&gt;&lt;em&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/second_brain_ru&quot; target=&quot;_blank&quot;&gt;Second Brain&lt;/a&gt; про управление личными знаниями&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;yPMq&quot;&gt;&lt;em&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/obsidianrus&quot; target=&quot;_blank&quot;&gt;Pro Obsidian&lt;/a&gt; про Obsidian и заметковедение&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;2PJ9&quot;&gt;&lt;em&gt;✔ Официальный &lt;a href=&quot;https://second-brain.ru/&quot; target=&quot;_blank&quot;&gt;сайт&lt;/a&gt; сообщества Second Brain&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;N8ZQ&quot;&gt;✔ Youtube-канал &lt;a href=&quot;https://www.youtube.com/@second-brain&quot; target=&quot;_blank&quot;&gt;Second brain&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>zakirov_edtech:RoJcD3gq3Ck</id><link rel="alternate" type="text/html" href="https://teletype.in/@zakirov_edtech/RoJcD3gq3Ck?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zakirov_edtech"></link><title>Система SCTO в Obsidian</title><published>2025-01-04T19:58:35.922Z</published><updated>2025-02-03T10:19:02.453Z</updated><category term="pkm" label="PKM"></category><summary type="html">Автор: Илья Шабанов в twitter/x</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Zeuf&quot;&gt;&lt;strong&gt;Автор:&lt;/strong&gt; Илья Шабанов в &lt;a href=&quot;https://x.com/Artifexx?t=xj0NmH3exzVH9dpY5JnRQQ&amp;s=09&quot; target=&quot;_blank&quot;&gt;twitter/x&lt;/a&gt;&lt;/p&gt;
    &lt;p id=&quot;aDeS&quot;&gt;&lt;strong&gt;Ссылка на хранилище:&lt;/strong&gt; &lt;a href=&quot;https://github.com/lnilya/scto_obsidian&quot; target=&quot;_blank&quot;&gt;https://github.com/lnilya/scto_obsidian&lt;/a&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;blockquote id=&quot;XIDj&quot;&gt;Моя практика написания заметок со временем развилась из структуры Zettelkasten. В науке большинство наших знаний изначально поступает из чтения статей, которые мы должны тщательно отслеживать, поскольку мы сжимаем и объединяем эти знания. Система SCTO разработана для того, чтобы отражать этот процесс и облегчать сжимание идей из него&lt;/blockquote&gt;
  &lt;p id=&quot;jN4r&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;yMac&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Sources/Источники&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;jPNf&quot;&gt;В большинстве случаев мы создаем одну заметку на каждую прочитанную мной статью. Эта заметка содержит резюме, мои мысли и заметки, а также включает файл PDF с хайлайтами. Сохранение некоторых метаданных, таких как DOI, теги и т. д., позволит легко цитировать заметку в дальнейшем&lt;/p&gt;
  &lt;p id=&quot;2fb6&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Compendium/Компендиум&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;xuB6&quot;&gt;Это сборник результатов, которые либо напрямую извлечены из первоисточников, либо являются моими собственными идеями. Вывод — это короткий абзац или предложение, написанное моими собственными словами. Каждый вывод всегда имеет ссылку на свой первоисточник. Когда в компендиуме слишком много фактов, я разбиваю его на несколько подкомпендиумов&lt;/p&gt;
  &lt;p id=&quot;hyFn&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Thinking/Размышления&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;r6Zo&quot;&gt;Очень часто при чтении научной статьи у нас возникает идея или вопрос, например: «Что, если я применю эту технику к этой проблеме?». Чаще всего кто-то на самом деле это делал, но для собственного мышления крайне важно продолжать записывать эти вопросы. Это развивает вашу способность быть научно креативным. Никакие идеи не бывают слишком глупыми, просто запишите их&lt;/p&gt;
  &lt;p id=&quot;tWwI&quot; data-align=&quot;center&quot;&gt;&lt;strong&gt;Ontologies/Онтологии&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;SsGf&quot;&gt;Это мои собственные мысли, которые развиваются при просмотре компендиумов и сравнении их с заметками для размышлений. Готовая онтология должна стремиться стать главой обзорной статьи или предложением для проекта&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;tUx2&quot; data-align=&quot;center&quot;&gt;Источники → Компендиумы → Размышления → Онтология&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;4sGA&quot;&gt;Вы собираете свои первичные источники и создаете заметку для каждого источника. Постарайтесь сделать ее краткой и всегда следите за своими метаданными, это будет иметь большое значение, когда ваша коллекция вырастет.&lt;br /&gt;Когда вы найдете небольшой «атомарный» фрагмент информации, поместите его в заметку-конспект и продолжайте объединять их, пока они не станут большими. На этом этапе разделите их на несколько заметок.&lt;br /&gt;Запишите вопросы и идеи в заметках-размышлениях, которые у вас есть по всей теме. Сделайте ссылки и сравнения с вашими первичными источниками. Не пытайтесь ответить на них сразу, просто запишите.&lt;br /&gt;Как только чтение ваших первичных источников замедлится, чтобы дать вам новое понимание, переходите к просмотру своих заметок-размышлений, сокращая те вопросы, на которые уже даны ответы, или идеи, которые были признаны недействительными.&lt;br /&gt;Начните писать онтологии, резюме и ответы на свои собственные вопросы по мере продвижения.&lt;br /&gt;Стремитесь сделать онтологии публикуемыми и читаемыми — то, что вы можете отправить коллеге, который еще не знаком с вашей темой. Эти онтологии станут основой вашей следующей публикации&lt;/p&gt;
  &lt;/section&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;RglU&quot;&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/ed_knowledgebase&quot; target=&quot;_blank&quot;&gt;Обучение и базы знаний&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Vc81&quot;&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/second_brain_ru&quot; target=&quot;_blank&quot;&gt;Second Brain&lt;/a&gt; про управление личными знаниями&lt;/p&gt;
  &lt;p id=&quot;yPMq&quot;&gt;✔ Telegram-канал &lt;a href=&quot;https://t.me/obsidianrus&quot; target=&quot;_blank&quot;&gt;Pro Obsidian&lt;/a&gt; про Obsidian и заметковедение&lt;/p&gt;
  &lt;p id=&quot;2PJ9&quot;&gt;✔ Официальный &lt;a href=&quot;https://second-brain.ru/&quot; target=&quot;_blank&quot;&gt;сайт&lt;/a&gt; сообщества Second Brain&lt;/p&gt;
  &lt;p id=&quot;N8ZQ&quot;&gt;✔ Youtube-канал &lt;a href=&quot;https://www.youtube.com/@second-brain&quot; target=&quot;_blank&quot;&gt;Second brain&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>zakirov_edtech:0tIanB1IIDx</id><link rel="alternate" type="text/html" href="https://teletype.in/@zakirov_edtech/0tIanB1IIDx?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zakirov_edtech"></link><title>habit tracker in Obsidian</title><published>2024-11-30T19:33:57.046Z</published><updated>2025-01-22T11:49:41.121Z</updated><category term="obsidian" label="Obsidian"></category><summary type="html">code dataviewjs</summary><content type="html">
  &lt;p id=&quot;s2a7&quot;&gt;&lt;strong&gt;code dataviewjs&lt;/strong&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(55,  86%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;fQrD&quot;&gt;const startOfWeek = moment().startOf(&amp;quot;isoWeek&amp;quot;).format(&amp;quot;YYYY-MM-DD&amp;quot;);&lt;/p&gt;
    &lt;p id=&quot;O8vY&quot;&gt;const endOfWeek = moment().endOf(&amp;quot;isoWeek&amp;quot;).format(&amp;quot;YYYY-MM-DD&amp;quot;);&lt;/p&gt;
    &lt;p id=&quot;izFU&quot;&gt;// Enhanced color palette with harmonious colors&lt;/p&gt;
    &lt;p id=&quot;Qqzv&quot;&gt;const colorPalette = [&lt;/p&gt;
    &lt;p id=&quot;sJT2&quot;&gt;&amp;quot;#9C27B0&amp;quot;, // Deep Purple for early wake-up and sleep&lt;/p&gt;
    &lt;p id=&quot;iUrK&quot;&gt;&amp;quot;#4CAF50&amp;quot;, // Green for meals and smoothie&lt;/p&gt;
    &lt;p id=&quot;7urA&quot;&gt;&amp;quot;#2196F3&amp;quot;, // Blue for university and gym&lt;/p&gt;
    &lt;p id=&quot;a7m3&quot;&gt;&amp;quot;#FF5722&amp;quot;, // Deep Orange for studying/coding&lt;/p&gt;
    &lt;p id=&quot;GVG4&quot;&gt;];&lt;/p&gt;
    &lt;p id=&quot;U2a7&quot;&gt;// Habit definitions remain the same, but with updated color indices&lt;/p&gt;
    &lt;p id=&quot;BNgA&quot;&gt;const habits = [&lt;/p&gt;
    &lt;p id=&quot;4VcH&quot;&gt;{&lt;/p&gt;
    &lt;p id=&quot;kd9D&quot;&gt;name: &amp;quot;Levantarme temprano&amp;quot;,&lt;/p&gt;
    &lt;p id=&quot;aBI5&quot;&gt;colorIndex: 0, // Deep Purple&lt;/p&gt;
    &lt;p id=&quot;tTyb&quot;&gt;filter: (task) =&amp;gt; task.text.includes(&amp;quot;Levantarme temprano&amp;quot;),&lt;/p&gt;
    &lt;p id=&quot;7Lpf&quot;&gt;},&lt;/p&gt;
    &lt;p id=&quot;4wbl&quot;&gt;{&lt;/p&gt;
    &lt;p id=&quot;xMXV&quot;&gt;name: &amp;quot;Bañarme&amp;quot;,&lt;/p&gt;
    &lt;p id=&quot;fdEa&quot;&gt;colorIndex: 2, // Green&lt;/p&gt;
    &lt;p id=&quot;N1aX&quot;&gt;filter: (task) =&amp;gt; task.text.includes(&amp;quot;Bañarme&amp;quot;),&lt;/p&gt;
    &lt;p id=&quot;qa5o&quot;&gt;},&lt;/p&gt;
    &lt;p id=&quot;AqPw&quot;&gt;{&lt;/p&gt;
    &lt;p id=&quot;dcYf&quot;&gt;name: &amp;quot;Desayunar&amp;quot;,&lt;/p&gt;
    &lt;p id=&quot;ydVI&quot;&gt;colorIndex: 1, // Green&lt;/p&gt;
    &lt;p id=&quot;flRd&quot;&gt;filter: (task) =&amp;gt; task.text.includes(&amp;quot;Desayunar&amp;quot;),&lt;/p&gt;
    &lt;p id=&quot;RYlF&quot;&gt;},&lt;/p&gt;
    &lt;p id=&quot;vklL&quot;&gt;{&lt;/p&gt;
    &lt;p id=&quot;b7HY&quot;&gt;name: &amp;quot;Ir a la u&amp;quot;,&lt;/p&gt;
    &lt;p id=&quot;AJ29&quot;&gt;colorIndex: 2, // Blue&lt;/p&gt;
    &lt;p id=&quot;VWw6&quot;&gt;filter: (task) =&amp;gt; task.text.includes(&amp;quot;Ir a la u&amp;quot;),&lt;/p&gt;
    &lt;p id=&quot;8pEG&quot;&gt;},&lt;/p&gt;
    &lt;p id=&quot;htVK&quot;&gt;{&lt;/p&gt;
    &lt;p id=&quot;mLQh&quot;&gt;name: &amp;quot;Almorzar&amp;quot;,&lt;/p&gt;
    &lt;p id=&quot;vayL&quot;&gt;colorIndex: 1, // Green&lt;/p&gt;
    &lt;p id=&quot;m9t5&quot;&gt;filter: (task) =&amp;gt; task.text.includes(&amp;quot;Almorzar&amp;quot;),&lt;/p&gt;
    &lt;p id=&quot;9nar&quot;&gt;},&lt;/p&gt;
    &lt;p id=&quot;JaQk&quot;&gt;{&lt;/p&gt;
    &lt;p id=&quot;LVfu&quot;&gt;name: &amp;quot;Estudiar/codear/hacer tareas&amp;quot;,&lt;/p&gt;
    &lt;p id=&quot;O5R0&quot;&gt;colorIndex: 3, // Deep Orange&lt;/p&gt;
    &lt;p id=&quot;dSOH&quot;&gt;filter: (task) =&amp;gt;&lt;/p&gt;
    &lt;p id=&quot;FraX&quot;&gt;task.text.includes(&amp;quot;Estudiar&amp;quot;) ||&lt;/p&gt;
    &lt;p id=&quot;xCT1&quot;&gt;task.text.includes(&amp;quot;codear&amp;quot;) ||&lt;/p&gt;
    &lt;p id=&quot;W6iy&quot;&gt;task.text.includes(&amp;quot;hacer tareas&amp;quot;),&lt;/p&gt;
    &lt;p id=&quot;43OY&quot;&gt;},&lt;/p&gt;
    &lt;p id=&quot;1B4L&quot;&gt;{&lt;/p&gt;
    &lt;p id=&quot;WM6Y&quot;&gt;name: &amp;quot;Ir al gym&amp;quot;,&lt;/p&gt;
    &lt;p id=&quot;9dwB&quot;&gt;colorIndex: 2, // Blue&lt;/p&gt;
    &lt;p id=&quot;1iMz&quot;&gt;filter: (task) =&amp;gt; task.text.includes(&amp;quot;Ir al gym&amp;quot;),&lt;/p&gt;
    &lt;p id=&quot;cwA3&quot;&gt;},&lt;/p&gt;
    &lt;p id=&quot;AZvi&quot;&gt;{&lt;/p&gt;
    &lt;p id=&quot;DNpY&quot;&gt;name: &amp;quot;Batido&amp;quot;,&lt;/p&gt;
    &lt;p id=&quot;AoyE&quot;&gt;colorIndex: 1, // Green&lt;/p&gt;
    &lt;p id=&quot;kaJ5&quot;&gt;filter: (task) =&amp;gt; task.text.includes(&amp;quot;Batido&amp;quot;),&lt;/p&gt;
    &lt;p id=&quot;sSNd&quot;&gt;},&lt;/p&gt;
    &lt;p id=&quot;1J7h&quot;&gt;{&lt;/p&gt;
    &lt;p id=&quot;ziob&quot;&gt;name: &amp;quot;Dormir&amp;quot;,&lt;/p&gt;
    &lt;p id=&quot;chQ2&quot;&gt;colorIndex: 0, // Deep Purple&lt;/p&gt;
    &lt;p id=&quot;2pMP&quot;&gt;filter: (task) =&amp;gt; task.text.includes(&amp;quot;Dormir&amp;quot;),&lt;/p&gt;
    &lt;p id=&quot;7Yar&quot;&gt;},&lt;/p&gt;
    &lt;p id=&quot;Kxyj&quot;&gt;];&lt;/p&gt;
    &lt;p id=&quot;eM8b&quot;&gt;// Initialize weekData if not already defined&lt;/p&gt;
    &lt;p id=&quot;2gbt&quot;&gt;if (!weekData) {&lt;/p&gt;
    &lt;p id=&quot;TxMl&quot;&gt;var weekData = {&lt;/p&gt;
    &lt;p id=&quot;ZyaH&quot;&gt;habits: []&lt;/p&gt;
    &lt;p id=&quot;ESW4&quot;&gt;};&lt;/p&gt;
    &lt;p id=&quot;zddk&quot;&gt;}&lt;/p&gt;
    &lt;p id=&quot;iHiX&quot;&gt;// Filter completed tasks&lt;/p&gt;
    &lt;p id=&quot;8w0m&quot;&gt;for (const habit of habits) {&lt;/p&gt;
    &lt;p id=&quot;rTEI&quot;&gt;const entries = [];&lt;/p&gt;
    &lt;p id=&quot;LeJw&quot;&gt;for (let page of dv.pages(&amp;#x27;&amp;quot;ZZZ Journal&amp;quot;&amp;#x27;)&lt;/p&gt;
    &lt;p id=&quot;I3Id&quot;&gt;.where((p) =&amp;gt; p.file.name &amp;gt;= startOfWeek &amp;amp;&amp;amp; p.file.name &amp;lt;= endOfWeek)) {&lt;/p&gt;
    &lt;p id=&quot;oQpa&quot;&gt;const tasks = page.file.tasks.filter((t) =&amp;gt; habit.filter(t) &amp;amp;&amp;amp; t.checked);&lt;/p&gt;
    &lt;p id=&quot;lrjr&quot;&gt;entries.push({&lt;/p&gt;
    &lt;p id=&quot;j9mU&quot;&gt;date: page.file.name,&lt;/p&gt;
    &lt;p id=&quot;2HDu&quot;&gt;value: tasks.length &amp;gt; 0 // Simplified entry creation&lt;/p&gt;
    &lt;p id=&quot;FbbG&quot;&gt;});&lt;/p&gt;
    &lt;p id=&quot;eFKr&quot;&gt;}&lt;/p&gt;
    &lt;p id=&quot;ru5Y&quot;&gt;weekData.habits.push({&lt;/p&gt;
    &lt;p id=&quot;q91X&quot;&gt;name: habit.name,&lt;/p&gt;
    &lt;p id=&quot;K9Hj&quot;&gt;color: colorPalette[habit.colorIndex],&lt;/p&gt;
    &lt;p id=&quot;eaN3&quot;&gt;entries: entries,&lt;/p&gt;
    &lt;p id=&quot;mgS9&quot;&gt;});&lt;/p&gt;
    &lt;p id=&quot;P8PH&quot;&gt;}&lt;/p&gt;
    &lt;p id=&quot;A1jN&quot;&gt;// Enhanced Habit Tracker Rendering Function&lt;/p&gt;
    &lt;p id=&quot;iwFK&quot;&gt;function renderHabitTracker(container, weekData) {&lt;/p&gt;
    &lt;p id=&quot;QE43&quot;&gt;// Create main container with modern styling&lt;/p&gt;
    &lt;p id=&quot;zWry&quot;&gt;const trackerContainer = dv.el(&amp;quot;div&amp;quot;);&lt;/p&gt;
    &lt;p id=&quot;RPMM&quot;&gt;trackerContainer.style.cssText = &amp;#x60;&lt;/p&gt;
    &lt;p id=&quot;f6G2&quot;&gt;font-family: &amp;#x27;Arial&amp;#x27;, sans-serif;&lt;/p&gt;
    &lt;p id=&quot;tKvF&quot;&gt;background-color: #f4f4f4;&lt;/p&gt;
    &lt;p id=&quot;t7nT&quot;&gt;border-radius: 12px;&lt;/p&gt;
    &lt;p id=&quot;cEBP&quot;&gt;box-shadow: 0 4px 6px rgba(0,0,0,0.1);&lt;/p&gt;
    &lt;p id=&quot;7rnB&quot;&gt;padding: 20px;&lt;/p&gt;
    &lt;p id=&quot;EOPk&quot;&gt;max-width: 900px;&lt;/p&gt;
    &lt;p id=&quot;IO24&quot;&gt;margin: 0 auto;&lt;/p&gt;
    &lt;p id=&quot;iXeS&quot;&gt;&amp;#x60;;&lt;/p&gt;
    &lt;p id=&quot;nXQ7&quot;&gt;const table = dv.el(&amp;quot;table&amp;quot;);&lt;/p&gt;
    &lt;p id=&quot;uM0Y&quot;&gt;table.style.cssText = &amp;#x60;&lt;/p&gt;
    &lt;p id=&quot;w9tP&quot;&gt;width: 100%;&lt;/p&gt;
    &lt;p id=&quot;yUQm&quot;&gt;border-collapse: separate;&lt;/p&gt;
    &lt;p id=&quot;X12G&quot;&gt;border-spacing: 0;&lt;/p&gt;
    &lt;p id=&quot;LWRg&quot;&gt;overflow: hidden;&lt;/p&gt;
    &lt;p id=&quot;6B3V&quot;&gt;&amp;#x60;;&lt;/p&gt;
    &lt;p id=&quot;Frmq&quot;&gt;// Create header&lt;/p&gt;
    &lt;p id=&quot;ScIK&quot;&gt;const header = table.createTHead();&lt;/p&gt;
    &lt;p id=&quot;kHVS&quot;&gt;const headerRow = header.insertRow();&lt;/p&gt;
    &lt;p id=&quot;jIxg&quot;&gt;headerRow.style.backgroundColor = &amp;quot;#3f51b5&amp;quot;;&lt;/p&gt;
    &lt;p id=&quot;rt9s&quot;&gt;headerRow.style.color = &amp;quot;white&amp;quot;;&lt;/p&gt;
    &lt;p id=&quot;O8vL&quot;&gt;// Habit header cell&lt;/p&gt;
    &lt;p id=&quot;Ygnp&quot;&gt;const habitHeaderCell = headerRow.insertCell();&lt;/p&gt;
    &lt;p id=&quot;iZmt&quot;&gt;habitHeaderCell.textContent = &amp;quot;Hábitos&amp;quot;;&lt;/p&gt;
    &lt;p id=&quot;GXp6&quot;&gt;habitHeaderCell.style.cssText = &amp;#x60;&lt;/p&gt;
    &lt;p id=&quot;if4h&quot;&gt;padding: 12px;&lt;/p&gt;
    &lt;p id=&quot;1NTQ&quot;&gt;text-align: left;&lt;/p&gt;
    &lt;p id=&quot;JfJW&quot;&gt;font-weight: bold;&lt;/p&gt;
    &lt;p id=&quot;s0rb&quot;&gt;border-right: 1px solid rgba(255,255,255,0.2);&lt;/p&gt;
    &lt;p id=&quot;hVBo&quot;&gt;&amp;#x60;;&lt;/p&gt;
    &lt;p id=&quot;0NBb&quot;&gt;// Days of week&lt;/p&gt;
    &lt;p id=&quot;1bn8&quot;&gt;const daysOfWeek = [&lt;/p&gt;
    &lt;p id=&quot;Wc9y&quot;&gt;&amp;quot;Lunes&amp;quot;, &amp;quot;Martes&amp;quot;, &amp;quot;Miércoles&amp;quot;, &amp;quot;Jueves&amp;quot;,&lt;/p&gt;
    &lt;p id=&quot;3WVg&quot;&gt;&amp;quot;Viernes&amp;quot;, &amp;quot;Sábado&amp;quot;, &amp;quot;Domingo&amp;quot;&lt;/p&gt;
    &lt;p id=&quot;PsDT&quot;&gt;];&lt;/p&gt;
    &lt;p id=&quot;tfRR&quot;&gt;// Create day header cells&lt;/p&gt;
    &lt;p id=&quot;Yykq&quot;&gt;daysOfWeek.forEach(day =&amp;gt; {&lt;/p&gt;
    &lt;p id=&quot;5Yss&quot;&gt;const headerCell = headerRow.insertCell();&lt;/p&gt;
    &lt;p id=&quot;fAMn&quot;&gt;headerCell.textContent = day;&lt;/p&gt;
    &lt;p id=&quot;CJla&quot;&gt;headerCell.style.cssText = &amp;#x60;&lt;/p&gt;
    &lt;p id=&quot;NjL4&quot;&gt;padding: 12px;&lt;/p&gt;
    &lt;p id=&quot;6u3n&quot;&gt;text-align: center;&lt;/p&gt;
    &lt;p id=&quot;YetT&quot;&gt;font-weight: bold;&lt;/p&gt;
    &lt;p id=&quot;opmY&quot;&gt;border-left: 1px solid rgba(255,255,255,0.2);&lt;/p&gt;
    &lt;p id=&quot;eTch&quot;&gt;&amp;#x60;;&lt;/p&gt;
    &lt;p id=&quot;loak&quot;&gt;});&lt;/p&gt;
    &lt;p id=&quot;nf7L&quot;&gt;// Create table body&lt;/p&gt;
    &lt;p id=&quot;yPly&quot;&gt;const body = table.createTBody();&lt;/p&gt;
    &lt;p id=&quot;dmSf&quot;&gt;// Render habit rows&lt;/p&gt;
    &lt;p id=&quot;W5jo&quot;&gt;weekData.habits.forEach(habit =&amp;gt; {&lt;/p&gt;
    &lt;p id=&quot;S9Dz&quot;&gt;const row = body.insertRow();&lt;/p&gt;
    &lt;p id=&quot;5s6f&quot;&gt;row.style.backgroundColor = &amp;quot;#ffffff&amp;quot;;&lt;/p&gt;
    &lt;p id=&quot;urPH&quot;&gt;// Habit name cell&lt;/p&gt;
    &lt;p id=&quot;CaRw&quot;&gt;const habitCell = row.insertCell();&lt;/p&gt;
    &lt;p id=&quot;2h0C&quot;&gt;habitCell.textContent = habit.name;&lt;/p&gt;
    &lt;p id=&quot;nrUu&quot;&gt;habitCell.style.cssText = &amp;#x60;&lt;/p&gt;
    &lt;p id=&quot;cx4E&quot;&gt;padding: 12px;&lt;/p&gt;
    &lt;p id=&quot;VTX7&quot;&gt;font-weight: bold;&lt;/p&gt;
    &lt;p id=&quot;AlCi&quot;&gt;background-color: #f0f0f0;&lt;/p&gt;
    &lt;p id=&quot;K3ek&quot;&gt;border-right: 1px solid #e0e0e0;&lt;/p&gt;
    &lt;p id=&quot;wKW8&quot;&gt;&amp;#x60;;&lt;/p&gt;
    &lt;p id=&quot;Hpw2&quot;&gt;// Create cells for each day&lt;/p&gt;
    &lt;p id=&quot;Jksp&quot;&gt;for (let i = 0; i &amp;lt; 7; i++) {&lt;/p&gt;
    &lt;p id=&quot;lTCG&quot;&gt;const dayDate = moment(startOfWeek).add(i, &amp;quot;days&amp;quot;).format(&amp;quot;YYYY-MM-DD&amp;quot;);&lt;/p&gt;
    &lt;p id=&quot;zDP2&quot;&gt;const entry = habit.entries.find((e) =&amp;gt; e.date === dayDate);&lt;/p&gt;
    &lt;p id=&quot;bSfW&quot;&gt;const cell = row.insertCell();&lt;/p&gt;
    &lt;p id=&quot;C2tr&quot;&gt;cell.style.cssText = &amp;#x60;&lt;/p&gt;
    &lt;p id=&quot;gcWY&quot;&gt;text-align: center;&lt;/p&gt;
    &lt;p id=&quot;2RUX&quot;&gt;padding: 12px;&lt;/p&gt;
    &lt;p id=&quot;OtHf&quot;&gt;border: 1px solid #e0e0e0;&lt;/p&gt;
    &lt;p id=&quot;UAEU&quot;&gt;transition: background-color 0.3s ease;&lt;/p&gt;
    &lt;p id=&quot;CrDs&quot;&gt;&amp;#x60;;&lt;/p&gt;
    &lt;p id=&quot;al3T&quot;&gt;if (entry &amp;amp;&amp;amp; entry.value) {&lt;/p&gt;
    &lt;p id=&quot;myol&quot;&gt;// Completed task&lt;/p&gt;
    &lt;p id=&quot;NMI7&quot;&gt;cell.style.backgroundColor = habit.color;&lt;/p&gt;
    &lt;p id=&quot;VvT0&quot;&gt;cell.style.opacity = &amp;quot;0.7&amp;quot;;&lt;/p&gt;
    &lt;p id=&quot;vfqy&quot;&gt;cell.innerHTML = &amp;quot;✓&amp;quot;;&lt;/p&gt;
    &lt;p id=&quot;rpEs&quot;&gt;cell.style.color = &amp;quot;white&amp;quot;;&lt;/p&gt;
    &lt;p id=&quot;r90s&quot;&gt;cell.style.fontWeight = &amp;quot;bold&amp;quot;;&lt;/p&gt;
    &lt;p id=&quot;ivEp&quot;&gt;} else {&lt;/p&gt;
    &lt;p id=&quot;gpLl&quot;&gt;// Incomplete or no task&lt;/p&gt;
    &lt;p id=&quot;Fuxn&quot;&gt;cell.style.backgroundColor = &amp;quot;white&amp;quot;;&lt;/p&gt;
    &lt;p id=&quot;fK7e&quot;&gt;}&lt;/p&gt;
    &lt;p id=&quot;ezxr&quot;&gt;}&lt;/p&gt;
    &lt;p id=&quot;WceX&quot;&gt;});&lt;/p&gt;
    &lt;p id=&quot;ol4G&quot;&gt;// Append table to container&lt;/p&gt;
    &lt;p id=&quot;KEeO&quot;&gt;trackerContainer.appendChild(table);&lt;/p&gt;
    &lt;p id=&quot;tgd4&quot;&gt;container.appendChild(trackerContainer);&lt;/p&gt;
    &lt;p id=&quot;DE4Y&quot;&gt;}&lt;/p&gt;
    &lt;p id=&quot;cADa&quot;&gt;// Render the Habit Tracker&lt;/p&gt;
    &lt;p id=&quot;pgq5&quot;&gt;renderHabitTracker(this.container, weekData);&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>zakirov_edtech:ZplUupVCYJT</id><link rel="alternate" type="text/html" href="https://teletype.in/@zakirov_edtech/ZplUupVCYJT?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=zakirov_edtech"></link><title>Критика школьного образования | Radical education reform</title><published>2024-11-12T14:31:02.983Z</published><updated>2025-01-22T11:50:56.855Z</updated><category term="education" label="education"></category><summary type="html">Аргументы от известных научных деятелей:</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(170, 33%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;lXXg&quot;&gt;&lt;strong&gt;Аргументы от известных научных деятелей: &lt;/strong&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;E3IF&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Neil_Postman&quot; target=&quot;_blank&quot;&gt;Нил Постман&lt;/a&gt; и Чарльз Вейнгартнер в своей книге &lt;em&gt;«Преподавание как подрывная деятельность»&lt;/em&gt; выступали за метод обучения, не связанный с учебной программой. В &lt;a href=&quot;https://en.wikipedia.org/wiki/Inquiry_education&quot; target=&quot;_blank&quot;&gt;исследовательском обучении&lt;/a&gt; учащимся предлагается задавать вопросы, которые имеют для них значение и на которые не всегда есть простые ответы; учителям рекомендуется избегать давать ответы&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Iwom&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Murray_N._Rothbard&quot; target=&quot;_blank&quot;&gt;Мюррей Н. Ротбард&lt;/a&gt; утверждает, что история стремления к &lt;a href=&quot;https://en.wikipedia.org/wiki/Compulsory_schooling&quot; target=&quot;_blank&quot;&gt;обязательному школьному образованию&lt;/a&gt; обусловлена не &lt;a href=&quot;https://en.wikipedia.org/wiki/Altruism&quot; target=&quot;_blank&quot;&gt;альтруизмом&lt;/a&gt;, а желанием подчинить население господствующим в обществе силам&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;hEzA&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/John_Caldwell_Holt&quot; target=&quot;_blank&quot;&gt;Джон Колдуэлл Холт&lt;/a&gt; утверждает, что молодёжь должна иметь право контролировать и направлять своё собственное обучение и что нынешняя система обязательного школьного образования нарушает основное фундаментальное право человека: право решать, что проникает в наш разум. Он считает, что свобода обучения является частью &lt;a href=&quot;https://en.wikipedia.org/wiki/Freedom_of_thought&quot; target=&quot;_blank&quot;&gt;свободы мысли&lt;/a&gt;, которая является даже более фундаментальным правом человека, чем &lt;a href=&quot;https://en.wikipedia.org/wiki/Freedom_of_speech&quot; target=&quot;_blank&quot;&gt;свобода слова&lt;/a&gt;. Он особенно подчёркивает, что принудительное обучение, независимо от того, учится ли ученик чему-либо вообще или может ли он более эффективно учиться в другом месте и другими способами, является грубым нарушением гражданских свобод&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;oYNY&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Nathaniel_Branden&quot; target=&quot;_blank&quot;&gt;Натаниэль Бранден&lt;/a&gt; утверждает, что правительство не должно иметь права насильно изымать детей из их домов с согласия родителей или без него и подвергать детей обучению и процедурам, которые родители могут одобрять или не одобрять. Он также утверждает, что у граждан не должно отнимать их имущество для поддержки образовательной системы, которую они могут одобрять или не одобрять, и для оплаты обучения неродных им детей. Он слцели это должно быть верно для тех, кто понимает и последовательно привержен принципу &lt;a href=&quot;https://en.wikipedia.org/wiki/Individual_rights&quot; target=&quot;_blank&quot;&gt;личные права&lt;/a&gt;. Он, какутверждает, что позорно низкий уровень образования в сегодняшней Америке является предсказуемым результатом школьной системы, контролируемой государством, и что решение состоит в том, чтобы вывести сферу образования на рынок&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;YnFY&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Jean-Jacques_Rousseau&quot; target=&quot;_blank&quot;&gt;Жан-Жак Руссо&lt;/a&gt; написал в своей книге &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Emile:_or,_On_Education&quot; target=&quot;_blank&quot;&gt;«Эмиль, или О воспитании»&lt;/a&gt;&lt;/em&gt; (впервые опубликованной в 1762 году), что все дети — это идеально устроенные организмы, готовые учиться у своего окружения, чтобы вырасти в добродетельных взрослых, но из-за пагубного влияния порочного общества они часто не достигают этого. Руссо выступал за метод воспитания, который заключался в том, чтобы изолировать ребёнка от общества — например, в загородном доме — и поочерёдно приучать его к изменениям в окружающей среде, а также ставить перед ним задачи и головоломки, которые он должен был решать или преодолевать&lt;/p&gt;
    &lt;p id=&quot;AHIi&quot;&gt;Руссо был необычен тем, что признавал и рассматривал потенциальную проблему легитимизации обучения. Он выступал за то, чтобы взрослые всегда были честны с детьми, и, в частности, за то, чтобы взрослые заявляли, что их авторитет в обучении основан на физическом принуждении: «Я сильнее тебя». Как только дети достигали возраста рассудка, примерно в 12 лет, они становились свободными личностями и участвовали в собственном процессе обучения&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;BdjF&quot;&gt;В &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Deschooling_Society&quot; target=&quot;_blank&quot;&gt;Обществе дешулинга&lt;/a&gt;&lt;/em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Ivan_Illich&quot; target=&quot;_blank&quot;&gt; Иван Ильич&lt;/a&gt; призывает к упразднению школ. Он утверждает, что школьное образование путает преподавание с обучением, оценки с образованием, дипломы с компетентностью, посещаемость с достижениями и, особенно, процесс с содержанием. Он пишет, что школы не поощряют реальные достижения, только процессы. Школы подавляют волю и способность человека к самообучению, что в конечном итоге приводит к психологической импотенции. Он clстремится к тому, чтобы принудительное школьное обучение извращало естественную склонность жертв к росту и обучению и заменяло ее требованием обучения. Далее, тнынешняя модель школьного образования, изобилующая верительными грамотами, предает ценность человека-самоучки. Более того,, институционализированное школьное образование стремится количественно оценить не поддающееся количественному измерению развитие человека&lt;/p&gt;
  &lt;/section&gt;

</content></entry></feed>