TelenkovDmitry 1 年之前
父節點
當前提交
2ef695455d

+ 5 - 0
.obsidian/community-plugins.json

@@ -0,0 +1,5 @@
+[
+  "habit-calendar",
+  "dataview",
+  "obsidian-emoji-toolbar"
+]

+ 10 - 1
.obsidian/hotkeys.json

@@ -1 +1,10 @@
-{}
+{
+  "obsidian-emoji-toolbar:emoji-picker:open-picker": [
+    {
+      "modifiers": [
+        "Alt"
+      ],
+      "key": "E"
+    }
+  ]
+}

+ 27 - 0
.obsidian/plugins/dataview/data.json

@@ -0,0 +1,27 @@
+{
+  "renderNullAs": "\\-",
+  "taskCompletionTracking": false,
+  "taskCompletionUseEmojiShorthand": false,
+  "taskCompletionText": "completion",
+  "taskCompletionDateFormat": "yyyy-MM-dd",
+  "recursiveSubTaskCompletion": false,
+  "warnOnEmptyResult": true,
+  "refreshEnabled": true,
+  "refreshInterval": 2500,
+  "defaultDateFormat": "MMMM dd, yyyy",
+  "defaultDateTimeFormat": "h:mm a - MMMM dd, yyyy",
+  "maxRecursiveRenderDepth": 4,
+  "tableIdColumnName": "File",
+  "tableGroupColumnName": "Group",
+  "showResultCount": true,
+  "allowHtml": true,
+  "inlineQueryPrefix": "=",
+  "inlineJsQueryPrefix": "$=",
+  "inlineQueriesInCodeblocks": true,
+  "enableInlineDataview": true,
+  "enableDataviewJs": true,
+  "enableInlineDataviewJs": true,
+  "prettyRenderInlineFields": true,
+  "prettyRenderInlineFieldsInLivePreview": true,
+  "dataviewJsKeyword": "dataviewjs"
+}

文件差異過大導致無法顯示
+ 7494 - 0
.obsidian/plugins/dataview/main.js


+ 10 - 0
.obsidian/plugins/dataview/manifest.json

@@ -0,0 +1,10 @@
+{
+  "id": "dataview",
+  "name": "Dataview",
+  "version": "0.5.64",
+  "minAppVersion": "0.13.11",
+  "description": "Complex data views for the data-obsessed.",
+  "author": "Michael Brenan <blacksmithgu@gmail.com>",
+  "authorUrl": "https://github.com/blacksmithgu",
+  "isDesktopOnly": false
+}

+ 146 - 0
.obsidian/plugins/dataview/styles.css

@@ -0,0 +1,146 @@
+/** Live Preview padding fixes, specifically for DataviewJS custom HTML elements. */
+.is-live-preview .block-language-dataviewjs > p, .is-live-preview .block-language-dataviewjs > span {
+    line-height: 1.0;
+}
+
+.block-language-dataview {
+    overflow-y: auto;
+}
+
+/*****************/
+/** Table Views **/
+/*****************/
+
+/* List View Default Styling; rendered internally as a table. */
+.table-view-table {
+    width: 100%;
+}
+
+.table-view-table > thead > tr, .table-view-table > tbody > tr {
+    margin-top: 1em;
+    margin-bottom: 1em;
+    text-align: left;
+}
+
+.table-view-table > tbody > tr:hover {
+    background-color: var(--table-row-background-hover);
+}
+
+.table-view-table > thead > tr > th {
+    font-weight: 700;
+    font-size: larger;
+    border-top: none;
+    border-left: none;
+    border-right: none;
+    border-bottom: solid;
+
+    max-width: 100%;
+}
+
+.table-view-table > tbody > tr > td {
+    text-align: left;
+    border: none;
+    font-weight: 400;
+    max-width: 100%;
+}
+
+.table-view-table ul, .table-view-table ol {
+    margin-block-start: 0.2em !important;
+    margin-block-end: 0.2em !important;
+}
+
+/** Rendered value styling for any view. */
+.dataview-result-list-root-ul {
+    padding: 0em !important;
+    margin: 0em !important;
+}
+
+.dataview-result-list-ul {
+    margin-block-start: 0.2em !important;
+    margin-block-end: 0.2em !important;
+}
+
+/** Generic grouping styling. */
+.dataview.result-group {
+    padding-left: 8px;
+}
+
+/*******************/
+/** Inline Fields **/
+/*******************/
+
+.dataview.inline-field-key {
+    padding-left: 8px;
+    padding-right: 8px;
+    font-family: var(--font-monospace);
+    background-color: var(--background-primary-alt);
+    color: var(--text-nav-selected);
+}
+
+.dataview.inline-field-value {
+    padding-left: 8px;
+    padding-right: 8px;
+    font-family: var(--font-monospace);
+    background-color: var(--background-secondary-alt);
+    color: var(--text-nav-selected);
+}
+
+.dataview.inline-field-standalone-value {
+    padding-left: 8px;
+    padding-right: 8px;
+    font-family: var(--font-monospace);
+    background-color: var(--background-secondary-alt);
+    color: var(--text-nav-selected);
+}
+
+/***************/
+/** Task View **/
+/***************/
+
+.dataview.task-list-item, .dataview.task-list-basic-item {
+    margin-top: 3px;
+    margin-bottom: 3px;
+    transition: 0.4s;
+}
+
+.dataview.task-list-item:hover, .dataview.task-list-basic-item:hover {
+    background-color: var(--text-selection);
+    box-shadow: -40px 0 0 var(--text-selection);
+    cursor: pointer;
+}
+
+/*****************/
+/** Error Views **/
+/*****************/
+
+div.dataview-error-box {
+    width: 100%;
+    min-height: 150px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    border: 4px dashed var(--background-secondary);
+}
+
+.dataview-error-message {
+    color: var(--text-muted);
+    text-align: center;
+}
+
+/*************************/
+/** Additional Metadata **/
+/*************************/
+
+.dataview.small-text {
+    font-size: smaller;
+    color: var(--text-muted);
+    margin-left: 3px;
+}
+
+.dataview.small-text::before {
+	content: "(";
+}
+
+.dataview.small-text::after {
+	content: ")";
+}

+ 14 - 0
.obsidian/plugins/habit-calendar/data.json

@@ -0,0 +1,14 @@
+{
+  "startOfWeek": "1",
+  "monthFormat": "MM-YYYY",
+  "displayHead": true,
+  "enableHTML": true,
+  "enableMarkdown": true,
+  "Sunday": "SUN",
+  "Monday": "MON",
+  "Tuesday": "TUE",
+  "Wednesday": "WED",
+  "Thursday": "THU",
+  "Friday": "FRI",
+  "Saturday": "SAT"
+}

+ 367 - 0
.obsidian/plugins/habit-calendar/main.js

@@ -0,0 +1,367 @@
+/*
+THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
+if you want to view the source visit the plugins github repository
+*/
+
+'use strict';
+
+var obsidian = require('obsidian');
+
+/******************************************************************************
+Copyright (c) Microsoft Corporation.
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+***************************************************************************** */
+
+function __awaiter(thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+}
+
+const DEFAULT_SETTINGS = {
+    startOfWeek: '0',
+    monthFormat: 'YYYY-MM',
+    displayHead: true,
+    enableHTML: false,
+    enableMarkdown: true,
+    Sunday: 'SUN',
+    Monday: 'MON',
+    Tuesday: 'TUE',
+    Wednesday: 'WED',
+    Thursday: 'THU',
+    Friday: 'FRI',
+    Saturday: 'SAT'
+};
+class HabitTrackerPlugin extends obsidian.Plugin {
+    onload() {
+        return __awaiter(this, void 0, void 0, function* () {
+            yield this.loadSettings();
+            this.addSettingTab(new HabitTrackerSettingTab(this.app, this));
+            //@ts-ignore
+            window.renderHabitCalendar = (el, dv, calendarParam) => {
+                dv.current().file.path;
+                let calendarData = param2CalendarData(dv, calendarParam);
+                let ctx = fromCalendarData(calendarData, this.settings);
+                const styles = ctx.tableWidth ? `width: ${ctx.tableWidth};` : '';
+                const table = createEl('table', { cls: 'habitt', attr: { style: styles } });
+                table.appendChild(renderHead(ctx));
+                table.appendChild(renderBody(ctx));
+                el.appendChild(table);
+            };
+        });
+    }
+    loadSettings() {
+        return __awaiter(this, void 0, void 0, function* () {
+            this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
+        });
+    }
+    saveSettings() {
+        return __awaiter(this, void 0, void 0, function* () {
+            yield this.saveData(this.settings);
+        });
+    }
+}
+function createContext(calendarData, settings) {
+    return {
+        startOfWeek: parseInt(settings.startOfWeek, 10),
+        startDay: 0,
+        monthDays: 0,
+        displayMonth: '',
+        tableWidth: '',
+        marks: new Map(),
+        settings,
+        error: '',
+        calendarData,
+        filepath: calendarData.filepath
+    };
+}
+function isTableData(data) {
+    return data.successful && data.value && data.value.type == 'table';
+}
+function param2CalendarData(dv, params) {
+    const calendarData = {
+        year: params.year,
+        month: params.month,
+        filepath: dv.current().file.path,
+        width: params.width || "100%",
+        entries: params.data,
+        format: params.format || 'text',
+        date_pattern: params.date_pattern || params.note_pattern || 'YYYY-MM-DD'
+    };
+    if (isTableData(params.data)) {
+        const headers = params.data.value.headers;
+        const values = params.data.value.values;
+        const dataDict = {};
+        for (let ri = 0; ri < values.length; ri += 1) {
+            // fill calendar day
+            const value = values[ri];
+            const link = value[0];
+            const date = obsidian.moment(link.fileName(), calendarData.date_pattern);
+            if (!date.isValid()) {
+                continue;
+            }
+            const dateString = link.fileName();
+            let entry = dataDict[dateString];
+            if (!entry) {
+                entry = {
+                    'date': dateString,
+                    'content': '',
+                    'link': link.path
+                };
+                dataDict[dateString] = entry;
+            }
+            // fill content
+            for (let ci = 1; ci < value.length; ci++) {
+                if (value[ci]) {
+                    // if the header contains a "|", use the string after "|" as label
+                    const splited = headers[ci].split("|");
+                    const label = splited[splited.length - 1];
+                    entry.content += `${label} ${value[ci]}\n`;
+                }
+            }
+        }
+        calendarData.entries = Object.values(dataDict);
+        calendarData.format = 'text';
+    }
+    return calendarData;
+}
+function fromCalendarData(calendarData, settings) {
+    const ctx = createContext(calendarData, settings);
+    const mon = obsidian.moment(`${calendarData.year}-${calendarData.month}`, 'YYYY-M');
+    if (!mon.isValid()) {
+        ctx.error = `Fail: Invalid Date ${calendarData.year}-${calendarData.month}`;
+        return ctx;
+    }
+    ctx.displayMonth = mon.format(settings.monthFormat);
+    ctx.startDay = mon.startOf('month').day();
+    ctx.monthDays = mon.endOf('month').date();
+    // table width (optional)
+    if (calendarData.width) {
+        ctx.tableWidth = calendarData.width;
+    }
+    // punch in
+    calendarData.entries.forEach(entry => {
+        const d = obsidian.moment(entry.date, calendarData.date_pattern);
+        if (d.year() == calendarData.year && d.month() + 1 == calendarData.month) {
+            ctx.marks.set(d.date(), entry);
+        }
+    });
+    return ctx;
+}
+function renderHead(ctx) {
+    const { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } = ctx.settings;
+    const WEEK = [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday];
+    const thead = createEl('thead');
+    if (ctx.settings.displayHead) {
+        const tr = thead.createEl('tr');
+        tr.createEl('th', { cls: 'habitt-head', attr: { colspan: 7 }, text: ctx.displayMonth });
+    }
+    const tr = thead.createEl('tr');
+    for (let i = 0; i < 7; i++) {
+        tr.createEl('th', { cls: `habitt-th habitt-th-${i}`, text: WEEK[(i + ctx.startOfWeek) % 7] });
+    }
+    return thead;
+}
+function renderBody(ctx) {
+    const startHolds = ctx.startDay >= ctx.startOfWeek ? ctx.startDay - ctx.startOfWeek : 7 - ctx.startOfWeek + ctx.startDay;
+    let days = (new Array(ctx.monthDays)).fill(0).map((v, i) => i + 1);
+    const weeks = [];
+    if (startHolds) {
+        const startWeekDays = 7 - startHolds;
+        const firstWeek = (new Array(startHolds)).fill(0);
+        weeks.push(firstWeek.concat(days.slice(0, startWeekDays)));
+        days = days.slice(startWeekDays);
+    }
+    let i = 0;
+    while (i < days.length) {
+        weeks.push(days.slice(i, i + 7));
+        i = i + 7;
+    }
+    const lastWeek = weeks[weeks.length - 1];
+    if (lastWeek.length < 7) {
+        const pad = 7 - lastWeek.length;
+        for (let i = 0; i < pad; i++) {
+            lastWeek.push(0);
+        }
+    }
+    const tbody = createEl('tbody');
+    const { enableHTML } = ctx.settings;
+    for (let i = 0; i < weeks.length; i++) {
+        const tr = tbody.createEl('tr');
+        for (let j = 0; j < weeks[i].length; j++) {
+            const d = weeks[i][j];
+            const hasOwn = ctx.marks.has(d);
+            const td = tr.createEl('td', { cls: `habitt-td habitt-td--${d || 'disabled'} ${hasOwn ? 'habitt-td--checked' : ''}` });
+            const div = td.createDiv({ cls: 'habitt-c' });
+            // create link to file
+            if (hasOwn) {
+                const day_div = div.createDiv({ cls: 'habitt-date' });
+                const link = ctx.marks.get(d).link ? ctx.marks.get(d).link : ctx.marks.get(d).date;
+                day_div.createEl('a', { text: `${d || ''}`, cls: "internal-link", href: link, attr: { "data-href": link, "target": "_blank", "rel": "noopener" } });
+            }
+            else {
+                div.createDiv({ cls: 'habitt-date', text: `${d || ''}` });
+            }
+            const dots = div.createDiv({ cls: 'habitt-dots' });
+            if (hasOwn) {
+                const input = ctx.marks.get(d).content;
+                // treat as HTML
+                if (enableHTML && ctx.calendarData.format == 'html') {
+                    dots.innerHTML = `<div>${input}</div>`;
+                }
+                else if (ctx.settings.enableMarkdown && ctx.calendarData.format == 'markdown') {
+                    const md_div = dots.createDiv();
+                    obsidian.MarkdownRenderer.renderMarkdown(input, md_div, ctx.filepath, this);
+                }
+                else {
+                    dots.createDiv({ cls: 'habit-content', text: input });
+                }
+            }
+        }
+    }
+    return tbody;
+}
+class HabitTrackerSettingTab extends obsidian.PluginSettingTab {
+    constructor(app, plugin) {
+        super(app, plugin);
+        this.plugin = plugin;
+    }
+    display() {
+        const { containerEl } = this;
+        containerEl.empty();
+        // containerEl.createEl('h2', {text: 'Settings for my awesome plugin.'});
+        const weeks = {
+            '0': 'Sunday',
+            '1': 'Monday',
+            '2': 'Tuesday',
+            '3': 'Wednesday',
+            '4': 'Thursday',
+            '5': 'Friday',
+            '6': 'Saturday'
+        };
+        new obsidian.Setting(containerEl)
+            .setName('Start Of Week')
+            .setDesc('The day a week begins.')
+            .addDropdown(dropdown => dropdown
+            .addOptions(weeks)
+            .setValue(this.plugin.settings.startOfWeek)
+            .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+            this.plugin.settings.startOfWeek = value;
+            yield this.plugin.saveSettings();
+        })));
+        new obsidian.Setting(containerEl)
+            .setName('Display Table Header')
+            .addToggle(dropdown => dropdown
+            .setValue(this.plugin.settings.displayHead)
+            .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+            this.plugin.settings.displayHead = value;
+            yield this.plugin.saveSettings();
+        })));
+        new obsidian.Setting(containerEl)
+            .setName('Enable HTML')
+            .setDesc('Treat your input text as HTML. Be careful, it may cause DOM injection attacks')
+            .addToggle(dropdown => dropdown
+            .setValue(this.plugin.settings.enableHTML)
+            .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+            this.plugin.settings.enableHTML = value;
+            yield this.plugin.saveSettings();
+        })));
+        new obsidian.Setting(containerEl)
+            .setName('Enable Markdown Rendering')
+            .setDesc('Treat your input text as Markdown.')
+            .addToggle(dropdown => dropdown
+            .setValue(this.plugin.settings.enableMarkdown)
+            .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+            this.plugin.settings.enableMarkdown = value;
+            yield this.plugin.saveSettings();
+        })));
+        new obsidian.Setting(containerEl)
+            .setName('Month Format')
+            .setDesc('To format the month text which displays in the header')
+            .addText(text => text
+            .setValue(this.plugin.settings.monthFormat)
+            .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+            this.plugin.settings.monthFormat = value;
+            yield this.plugin.saveSettings();
+        })));
+        new obsidian.Setting(containerEl)
+            .setName('Sunday Label')
+            .setDesc('Default is SUN')
+            .addText(text => text
+            .setValue(this.plugin.settings.Sunday)
+            .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+            this.plugin.settings.Sunday = value || DEFAULT_SETTINGS.Sunday;
+            yield this.plugin.saveSettings();
+        })));
+        new obsidian.Setting(containerEl)
+            .setName('Monday Label')
+            .setDesc('Default is MON')
+            .addText(text => text
+            .setValue(this.plugin.settings.Monday)
+            .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+            this.plugin.settings.Monday = value || DEFAULT_SETTINGS.Monday;
+            yield this.plugin.saveSettings();
+        })));
+        new obsidian.Setting(containerEl)
+            .setName('Tuesday Label')
+            .setDesc('Default is TUE')
+            .addText(text => text
+            .setValue(this.plugin.settings.Tuesday)
+            .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+            this.plugin.settings.Tuesday = value || DEFAULT_SETTINGS.Tuesday;
+            yield this.plugin.saveSettings();
+        })));
+        new obsidian.Setting(containerEl)
+            .setName('Wednesday Label')
+            .setDesc('Default is WED')
+            .addText(text => text
+            .setValue(this.plugin.settings.Wednesday)
+            .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+            this.plugin.settings.Wednesday = value || DEFAULT_SETTINGS.Wednesday;
+            yield this.plugin.saveSettings();
+        })));
+        new obsidian.Setting(containerEl)
+            .setName('Thursday Label')
+            .setDesc('Default is THU')
+            .addText(text => text
+            .setValue(this.plugin.settings.Thursday)
+            .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+            this.plugin.settings.Thursday = value || DEFAULT_SETTINGS.Thursday;
+            yield this.plugin.saveSettings();
+        })));
+        new obsidian.Setting(containerEl)
+            .setName('Friday Label')
+            .setDesc('Default is FRI')
+            .addText(text => text
+            .setValue(this.plugin.settings.Friday)
+            .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+            this.plugin.settings.Friday = value || DEFAULT_SETTINGS.Friday;
+            yield this.plugin.saveSettings();
+        })));
+        new obsidian.Setting(containerEl)
+            .setName('Saturday Label')
+            .setDesc('Default is SAT')
+            .addText(text => text
+            .setValue(this.plugin.settings.Saturday)
+            .onChange((value) => __awaiter(this, void 0, void 0, function* () {
+            this.plugin.settings.Saturday = value || DEFAULT_SETTINGS.Saturday;
+            yield this.plugin.saveSettings();
+        })));
+    }
+}
+
+module.exports = HabitTrackerPlugin;

+ 10 - 0
.obsidian/plugins/habit-calendar/manifest.json

@@ -0,0 +1,10 @@
+{
+	"id": "habit-calendar",
+	"name": "Habit Calendar",
+	"version": "1.2.0",
+	"minAppVersion": "0.9.12",
+	"description": "Monthly Habit Calendar for DataviewJS. This plugin helps you render a calendar inside DataviewJS code block, showing your habit status within a month.",
+	"author": "Hedonihilist",
+	"authorUrl": "https://github.com/hedonihilist",
+	"isDesktopOnly": false
+}

+ 60 - 0
.obsidian/plugins/habit-calendar/styles.css

@@ -0,0 +1,60 @@
+.habitt {
+    border-collapse: collapse;
+    text-align: center;
+    table-layout: auto;
+    width: 100%;
+}
+.habitt-head {
+    font-size: .8em;
+    text-align: center !important;
+}
+.habitt td {
+    padding: 0 4px;
+    vertical-align: top;
+}
+.habitt .habitt-th {
+    color: var(--text-normal);
+    font-size: .6em;
+    text-align: center;
+}
+.habitt .habitt-td {
+    position: relative;
+    color: var(--text-muted);
+    font-size: .8em;
+    min-width: 2em;
+    min-height: 2em;
+    width: 14.28%;
+    opacity: .5;
+}
+.habitt-c {
+    position: relative;
+    height: 100%;
+}
+.habitt-date {
+    padding-top: 4px;
+}
+.habitt-date a {
+    display: block;
+}
+.habitt .habitt-td--disabled {
+    opacity: .5;
+    color: var(--text-muted);
+}
+.habitt .habitt-td--checked {
+    opacity: 1;
+    color: var(--text-normal);
+}
+.habitt-dots {
+    min-height: 20px;
+    padding: 0 0 4px;
+}
+.habitt-error {
+    background-color: var(--background-primary-alt);
+    padding: 1em;
+    margin: 0.5em 0;
+    overflow: auto;
+    border-radius: 0.3em;
+}
+.habit-content {
+    white-space: pre;
+}

文件差異過大導致無法顯示
+ 5137 - 0
.obsidian/plugins/obsidian-emoji-toolbar/main.js


+ 9 - 0
.obsidian/plugins/obsidian-emoji-toolbar/manifest.json

@@ -0,0 +1,9 @@
+{
+  "id": "obsidian-emoji-toolbar",
+  "name": "Emoji Toolbar",
+  "version": "0.4.1",
+  "description": "Quickly search for and insert emojis into your notes.",
+  "author": "oliveryh",
+  "authorUrl": "https://github.com/oliveryh/obsidian-emoji-toolbar",
+  "isDesktopOnly": false
+}

+ 505 - 0
.obsidian/plugins/obsidian-emoji-toolbar/styles.css

@@ -0,0 +1,505 @@
+img.emoji {
+  height: 1em;
+  width: 1em;
+  margin: 0 0.05em 0 0.1em;
+  vertical-align: -0.1em;
+  display: inline-block;
+}
+
+.emoji-mart,
+.emoji-mart * {
+  box-sizing: border-box;
+  line-height: 1.15;
+}
+
+.emoji-mart {
+  font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", sans-serif;
+  font-size: 16px;
+  display: inline-block;
+  color: #222427;
+  border: 1px solid #d9d9d9;
+  border-radius: 5px;
+  background: #fff;
+}
+
+.emoji-mart .emoji-mart-emoji {
+  padding: 6px !important;
+}
+
+.emoji-mart-bar {
+  border: 0 solid #d9d9d9;
+}
+.emoji-mart-bar:first-child {
+  border-bottom-width: 1px;
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+}
+.emoji-mart-bar:last-child {
+  border-top-width: 1px;
+  border-bottom-left-radius: 5px;
+  border-bottom-right-radius: 5px;
+}
+
+.emoji-mart-anchors {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  padding: 0 6px;
+  line-height: 0;
+}
+
+.emoji-mart-anchor {
+  position: relative;
+  display: block;
+  flex: 1 1 auto;
+  color: #858585;
+  text-align: center;
+  padding: 12px 4px !important;
+  overflow: hidden;
+  transition: color .1s ease-out;
+  margin: 0  !important;
+  box-shadow: none !important;
+  background: none !important;
+  border: none  !important;
+}
+.emoji-mart-anchor:focus { outline: 0 }
+.emoji-mart-anchor:hover,
+.emoji-mart-anchor:focus,
+.emoji-mart-anchor-selected {
+  color: #464646;
+}
+
+.emoji-mart-anchor-selected .emoji-mart-anchor-bar {
+  bottom: 0;
+}
+
+.emoji-mart-anchor-bar {
+  position: absolute;
+  bottom: -3px; left: 0;
+  width: 100%; height: 3px;
+  background-color: #464646;
+}
+
+.emoji-mart-anchors i {
+  display: inline-block;
+  width: 100%;
+  max-width: 22px;
+}
+
+.emoji-mart-anchors svg,
+.emoji-mart-anchors img {
+  fill: currentColor;
+  height: 18px;
+  width: 18px;
+}
+
+.emoji-mart-scroll {
+  overflow-y: scroll;
+  overflow-x: hidden;
+  height: 270px;
+  padding: 0 6px 6px 6px;
+  will-change: transform; /* avoids "repaints on scroll" in mobile Chrome */
+}
+
+.emoji-mart-search {
+  margin-top: 6px;
+  padding: 0 6px;
+  position: relative;
+}
+
+.emoji-mart-search input {
+  font-size: 16px;
+  display: block;
+  width: 100%;
+  padding: 5px 25px 6px 10px;
+  border-radius: 5px;
+  border: 1px solid #d9d9d9;
+  outline: 0;
+}
+
+.emoji-mart-search input,
+.emoji-mart-search input::-webkit-search-decoration,
+.emoji-mart-search input::-webkit-search-cancel-button,
+.emoji-mart-search input::-webkit-search-results-button,
+.emoji-mart-search input::-webkit-search-results-decoration {
+  /* remove webkit/blink styles for <input type="search">
+   * via https://stackoverflow.com/a/9422689 */
+  -webkit-appearance: none;
+}
+
+.emoji-mart-search-icon {
+  position: absolute;
+  top: 7px;
+  right: 11px;
+  z-index: 2;
+  padding: 2px 5px 1px;
+  border: none !important;
+  box-shadow: none !important;
+  background: none !important;
+}
+
+.emoji-mart-category .emoji-mart-emoji span {
+  z-index: 1;
+  position: relative;
+  text-align: center;
+  cursor: default;
+}
+
+.emoji-mart-category .emoji-mart-emoji:focus { outline: 0 }
+
+.emoji-mart-category .emoji-mart-emoji:hover:before, 
+.emoji-mart-category .emoji-mart-emoji:focus:before {
+  z-index: 0;
+  content: "";
+  position: absolute;
+  top: 0; left: 0;
+  width: 100%; height: 100%;
+  background-color: #c5c5c5;
+  border-radius: 100%;
+}
+
+.emoji-mart-category-label {
+  z-index: 2;
+  position: relative;
+  position: -webkit-sticky;
+  position: sticky;
+  top: 0;
+}
+
+.emoji-mart-category-label span {
+  display: block;
+  width: 100%;
+  font-weight: 500;
+  padding: 5px 6px;
+  background-color: #fff;
+  background-color: rgba(255, 255, 255, .95);
+}
+
+.emoji-mart-category-list {
+  border-spacing: 0;
+  margin: 0;
+  padding: 0;
+}
+
+.emoji-mart-category-list td {
+  margin: 0;
+  padding: 0;
+}
+
+.emoji-mart-emoji {
+  position: relative;
+  display: inline-block;
+  font-size: 0;
+  margin: 0 !important;
+  padding: 0 !important;
+  border: none !important;
+  background: none !important;
+  box-shadow: none !important;
+}
+
+.emoji-mart-emoji-native {
+  font-family: "Segoe UI Emoji", "Segoe UI Symbol", "Segoe UI", "Apple Color Emoji", "Twemoji Mozilla", "Noto Color Emoji", "Android Emoji";
+}
+
+.emoji-mart-no-results {
+  font-size: 14px;
+  text-align: center;
+  padding-top: 70px;
+  color: #858585;
+}
+.emoji-mart-no-results-img {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+  width: 50%;
+}
+.emoji-mart-no-results .emoji-mart-category-label {
+  display: none;
+}
+.emoji-mart-no-results .emoji-mart-no-results-label {
+  margin-top: .2em;
+}
+.emoji-mart-no-results .emoji-mart-emoji:hover:before {
+  content: none;
+}
+
+.emoji-mart-preview {
+  position: relative;
+  height: 70px;
+}
+
+.emoji-mart-preview-emoji,
+.emoji-mart-preview-data,
+.emoji-mart-preview-skins {
+  position: absolute;
+  top: 50%;
+  transform: translateY(-50%);
+}
+
+.emoji-mart-preview-emoji {
+  left: 12px;
+}
+
+.emoji-mart-preview-data {
+  left: 68px; right: 12px;
+  word-break: break-all;
+}
+
+.emoji-mart-preview-skins {
+  right: 30px;
+  text-align: right;
+}
+
+.emoji-mart-preview-skins.custom {
+  right: 10px;
+  text-align: right;
+}
+
+.emoji-mart-preview-name {
+  font-size: 14px;
+}
+
+.emoji-mart-preview-shortname {
+  font-size: 12px;
+  color: #888;
+}
+.emoji-mart-preview-shortname + .emoji-mart-preview-shortname,
+.emoji-mart-preview-shortname + .emoji-mart-preview-emoticon,
+.emoji-mart-preview-emoticon + .emoji-mart-preview-emoticon {
+  margin-left: .5em;
+}
+
+.emoji-mart-preview-emoticon {
+  font-size: 11px;
+  color: #bbb;
+}
+
+.emoji-mart-title span {
+  display: inline-block;
+  vertical-align: middle;
+}
+
+.emoji-mart-title .emoji-mart-emoji {
+  padding: 0;
+}
+
+.emoji-mart-title-label {
+  color: #999A9C;
+  font-size: 26px;
+  font-weight: 300;
+}
+
+.emoji-mart-skin-swatches {
+  font-size: 0;
+  padding: 2px 0;
+  border: 1px solid #d9d9d9;
+  border-radius: 12px;
+  background-color: #fff;
+}
+
+.emoji-mart-skin-swatches.custom {
+  font-size: 0;
+  border: none;
+  background-color: #fff;
+}
+
+.emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch {
+  width: 16px;
+  padding: 0 2px;
+}
+
+.emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch.selected:after {
+  opacity: .75;
+}
+
+.emoji-mart-skin-swatch {
+  display: inline-block;
+  width: 0;
+  vertical-align: middle;
+  transition-property: width, padding;
+  transition-duration: .125s;
+  transition-timing-function: ease-out;
+}
+
+.emoji-mart-skin-swatch:nth-child(1) { transition-delay: 0s }
+.emoji-mart-skin-swatch:nth-child(2) { transition-delay: .03s }
+.emoji-mart-skin-swatch:nth-child(3) { transition-delay: .06s }
+.emoji-mart-skin-swatch:nth-child(4) { transition-delay: .09s }
+.emoji-mart-skin-swatch:nth-child(5) { transition-delay: .12s }
+.emoji-mart-skin-swatch:nth-child(6) { transition-delay: .15s }
+
+.emoji-mart-skin-swatch.selected {
+  position: relative;
+  width: 16px;
+  padding: 0 2px;
+}
+
+.emoji-mart-skin-swatch.selected:after {
+  content: "";
+  position: absolute;
+  top: 50%; left: 50%;
+  width: 4px; height: 4px;
+  margin: -2px 0 0 -2px;
+  background-color: #fff;
+  border-radius: 100%;
+  pointer-events: none;
+  opacity: 0;
+  transition: opacity .2s ease-out;
+}
+
+.emoji-mart-skin-swatch.custom {
+  display: inline-block;
+  width: 0;
+  height: 38px;
+  overflow: hidden;
+  vertical-align: middle;
+  transition-property: width, height;
+  transition-duration: .125s;
+  transition-timing-function: ease-out;
+  cursor: default;
+}
+
+.emoji-mart-skin-swatch.custom.selected {
+  position: relative;
+  width: 36px;
+  height: 38px;
+  padding: 0 2px 0 0;
+}
+
+.emoji-mart-skin-swatch.custom.selected:after {
+  content: "";
+  width: 0;
+  height: 0;
+}
+
+.emoji-mart-skin-swatches.custom .emoji-mart-skin-swatch.custom:hover {
+  background-color: #f4f4f4;
+  border-radius: 10%;
+}
+
+.emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom {
+  width: 36px;
+  height: 38px;
+  padding: 0 2px 0 0;
+}
+
+.emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom.selected:after {
+  opacity: .75;
+}
+
+.emoji-mart-skin-text.opened {
+  display: inline-block;
+  vertical-align: middle;
+  text-align: left;
+  color: #888;
+  font-size: 11px;
+  padding: 5px 2px;
+  width: 95px;
+  height: 40px;
+  border-radius: 10%;
+  background-color: #fff;
+}
+
+.emoji-mart-skin {
+  display: inline-block;
+  width: 100%;
+  padding-top: 100%;
+  max-width: 12px;
+  border-radius: 100%;
+}
+
+.emoji-mart-skin-tone-1 { background-color: #ffc93a }
+.emoji-mart-skin-tone-2 { background-color: #fadcbc }
+.emoji-mart-skin-tone-3 { background-color: #e0bb95 }
+.emoji-mart-skin-tone-4 { background-color: #bf8f68 }
+.emoji-mart-skin-tone-5 { background-color: #9b643d }
+.emoji-mart-skin-tone-6 { background-color: #594539 }
+
+/* For screenreaders only, via https://stackoverflow.com/a/19758620 */
+.emoji-mart-sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+
+/*
+ * Dark mode styles
+ */
+
+.emoji-mart-dark {
+  color: #fff;
+  border-color: #555453;
+  background-color: #222;
+}
+
+.emoji-mart-dark .emoji-mart-bar {
+  border-color: #555453;
+}
+
+.emoji-mart-dark .emoji-mart-search input {
+  color: #fff;
+  border-color: #555453;
+  background-color: #2f2f2f;
+}
+
+.emoji-mart-dark .emoji-mart-search-icon svg {
+  fill: #fff;
+}
+
+.emoji-mart-category .emoji-mart-emoji {
+  background-color: unset !important;
+}
+
+.emoji-mart-anchor {
+  background-color: unset !important;
+}
+
+.emoji-mart-search-icon {
+  background-color: unset !important;
+}
+
+.emoji-mart-dark .emoji-mart-category .emoji-mart-emoji:hover:before,
+.emoji-mart-dark .emoji-mart-category .emoji-mart-emoji:focus:before {
+  background-color: #888;
+}
+
+.emoji-mart-dark .emoji-mart-category-label span {
+  background-color: #222;
+  color: #fff;
+}
+
+.emoji-mart-dark .emoji-mart-skin-swatches {
+  border-color: #555453;
+  background-color: #222;
+}
+
+.emoji-mart-dark .emoji-mart-anchor:hover,
+.emoji-mart-dark .emoji-mart-anchor:focus,
+.emoji-mart-dark .emoji-mart-anchor-selected {
+  color: #bfbfbf;
+}
+
+#emoji-modal {
+  padding: 0px;
+  min-width: unset;
+  width: unset !important;
+}
+
+#emoji-modal > .modal-content {
+  margin-top: 0px;
+}
+
+#emoji-modal > button {
+  background-color: unset;
+  border: 0px !important;
+  box-shadow: 0px !important;
+}
+
+#emoji-modal > .modal-close-button {
+  visibility: hidden;
+}

+ 183 - 173
.obsidian/workspace.json

@@ -1,174 +1,184 @@
-{
-  "main": {
-    "id": "b266890f0c3ff372",
-    "type": "split",
-    "children": [
-      {
-        "id": "0724a9a43f5c4e0f",
-        "type": "tabs",
-        "children": [
-          {
-            "id": "346e47daf4a356f0",
-            "type": "leaf",
-            "state": {
-              "type": "markdown",
-              "state": {
-                "file": "proGit.md",
-                "mode": "source",
-                "source": false
-              }
-            },
-            "group": "5ae634d88a8a295c"
-          }
-        ]
-      },
-      {
-        "id": "541102ee0a74a50a",
-        "type": "tabs",
-        "children": [
-          {
-            "id": "b1c0471cbfdb71bf",
-            "type": "leaf",
-            "state": {
-              "type": "markdown",
-              "state": {
-                "file": "proGit.md",
-                "mode": "preview",
-                "source": false
-              }
-            },
-            "group": "5ae634d88a8a295c"
-          }
-        ]
-      }
-    ],
-    "direction": "vertical"
-  },
-  "left": {
-    "id": "38e075dd31ff8adb",
-    "type": "split",
-    "children": [
-      {
-        "id": "aa544a1476f258b3",
-        "type": "tabs",
-        "children": [
-          {
-            "id": "8ba77c810766b520",
-            "type": "leaf",
-            "state": {
-              "type": "file-explorer",
-              "state": {
-                "sortOrder": "alphabetical"
-              }
-            }
-          },
-          {
-            "id": "b71a6ef4ea258338",
-            "type": "leaf",
-            "state": {
-              "type": "search",
-              "state": {
-                "query": "",
-                "matchingCase": false,
-                "explainSearch": false,
-                "collapseAll": false,
-                "extraContext": false,
-                "sortOrder": "alphabetical"
-              }
-            }
-          },
-          {
-            "id": "0a44d6178b5d79a8",
-            "type": "leaf",
-            "state": {
-              "type": "bookmarks",
-              "state": {}
-            }
-          }
-        ]
-      }
-    ],
-    "direction": "horizontal",
-    "width": 200
-  },
-  "right": {
-    "id": "22baf11b84f2becb",
-    "type": "split",
-    "children": [
-      {
-        "id": "3ebf2f88c333ddfb",
-        "type": "tabs",
-        "children": [
-          {
-            "id": "016cd6639f5f7c6e",
-            "type": "leaf",
-            "state": {
-              "type": "backlink",
-              "state": {
-                "file": "proGit.md",
-                "collapseAll": false,
-                "extraContext": false,
-                "sortOrder": "alphabetical",
-                "showSearch": false,
-                "searchQuery": "",
-                "backlinkCollapsed": false,
-                "unlinkedCollapsed": true
-              }
-            }
-          },
-          {
-            "id": "a1fda84e12066836",
-            "type": "leaf",
-            "state": {
-              "type": "all-properties",
-              "state": {
-                "sortOrder": "frequency"
-              }
-            }
-          }
-        ]
-      }
-    ],
-    "direction": "horizontal",
-    "width": 300,
-    "collapsed": true
-  },
-  "left-ribbon": {
-    "hiddenItems": {
-      "switcher:Open quick switcher": false,
-      "graph:Open graph view": false,
-      "canvas:Create new canvas": false,
-      "command-palette:Open command palette": false,
-      "markdown-importer:Open format converter": false
-    }
-  },
-  "active": "b1c0471cbfdb71bf",
-  "lastOpenFiles": [
-    "metrolog/IRQ + FreeRTOS.md",
-    "metrolog/M3 artery + stm32.md",
-    "bt67xx/common.md",
-    "linux/Arbiter.md",
-    "Счета.md",
-    "Artery testing.md",
-    "TODO.md",
-    "BT7000/BT-7000 Artery.md",
-    "linux/Tmux.md",
-    "Разное.md",
-    "links.md",
-    "web",
-    "proGit.md",
-    "linux/linux common.md",
-    "docs/CAN megmeet Communication Protocol.pdf",
-    "docs/3KW Rectifier Can Communication Protocal V2 20220818 (1).pdf",
-    "docs/LT8920datasheetEngversion201701191.pdf",
-    "linux/Raspberry PI.md",
-    "metrolog/Текучка Метролог.md",
-    "FlyElectronics/LED Controller.md",
-    "bt67xx",
-    "metrolog/M3 artery.md",
-    "metrolog/readme.md",
-    "Greenstar/FPGA Blaster.md",
-    "FlyElectronics/Grinding machine.md",
-    "img/sch04.JPG"
-  ]
+{
+  "main": {
+    "id": "b266890f0c3ff372",
+    "type": "split",
+    "children": [
+      {
+        "id": "9f5d5ca1dbbe7210",
+        "type": "tabs",
+        "dimension": 50.38880248833593,
+        "children": [
+          {
+            "id": "2e32c5a6e9f28052",
+            "type": "leaf",
+            "state": {
+              "type": "markdown",
+              "state": {
+                "file": "proGit.md",
+                "mode": "source",
+                "source": false
+              }
+            },
+            "group": "5cfac0e29502b01e"
+          }
+        ]
+      },
+      {
+        "id": "af790371e55e7c76",
+        "type": "tabs",
+        "dimension": 49.61119751166407,
+        "children": [
+          {
+            "id": "f4f8feb3f8a62cd0",
+            "type": "leaf",
+            "state": {
+              "type": "markdown",
+              "state": {
+                "file": "proGit.md",
+                "mode": "source",
+                "source": false
+              }
+            },
+            "group": "5cfac0e29502b01e"
+          }
+        ]
+      }
+    ],
+    "direction": "vertical"
+  },
+  "left": {
+    "id": "38e075dd31ff8adb",
+    "type": "split",
+    "children": [
+      {
+        "id": "aa544a1476f258b3",
+        "type": "tabs",
+        "children": [
+          {
+            "id": "8ba77c810766b520",
+            "type": "leaf",
+            "state": {
+              "type": "file-explorer",
+              "state": {
+                "sortOrder": "alphabetical"
+              }
+            }
+          },
+          {
+            "id": "b71a6ef4ea258338",
+            "type": "leaf",
+            "state": {
+              "type": "search",
+              "state": {
+                "query": "",
+                "matchingCase": false,
+                "explainSearch": false,
+                "collapseAll": false,
+                "extraContext": false,
+                "sortOrder": "alphabetical"
+              }
+            }
+          },
+          {
+            "id": "0a44d6178b5d79a8",
+            "type": "leaf",
+            "state": {
+              "type": "bookmarks",
+              "state": {}
+            }
+          }
+        ]
+      }
+    ],
+    "direction": "horizontal",
+    "width": 200
+  },
+  "right": {
+    "id": "22baf11b84f2becb",
+    "type": "split",
+    "children": [
+      {
+        "id": "3ebf2f88c333ddfb",
+        "type": "tabs",
+        "children": [
+          {
+            "id": "016cd6639f5f7c6e",
+            "type": "leaf",
+            "state": {
+              "type": "backlink",
+              "state": {
+                "file": "proGit.md",
+                "collapseAll": false,
+                "extraContext": false,
+                "sortOrder": "alphabetical",
+                "showSearch": false,
+                "searchQuery": "",
+                "backlinkCollapsed": false,
+                "unlinkedCollapsed": true
+              }
+            }
+          },
+          {
+            "id": "a1fda84e12066836",
+            "type": "leaf",
+            "state": {
+              "type": "all-properties",
+              "state": {
+                "sortOrder": "frequency",
+                "showSearch": false,
+                "searchQuery": ""
+              }
+            }
+          }
+        ]
+      }
+    ],
+    "direction": "horizontal",
+    "width": 300,
+    "collapsed": true
+  },
+  "left-ribbon": {
+    "hiddenItems": {
+      "switcher:Open quick switcher": false,
+      "graph:Open graph view": false,
+      "canvas:Create new canvas": false,
+      "command-palette:Open command palette": false,
+      "markdown-importer:Open format converter": false
+    }
+  },
+  "active": "f4f8feb3f8a62cd0",
+  "lastOpenFiles": [
+    "bt67xx/common.md",
+    "linux/linux common.md",
+    "linux/Arbiter.md",
+    "BT7000/BT-7000 Artery.md",
+    "Кодинг.md",
+    "links.md",
+    "Список литературы.md",
+    "Разное.md",
+    "linux/Tmux.md",
+    "linux/Raspberry PI.md",
+    "linux/GS server.md",
+    "Счета.md",
+    "Тренировки и занятия.md",
+    "TODO.md",
+    "2024-01-03.md",
+    "proGit.md",
+    "Artery testing.md",
+    "web hardcore",
+    "metrolog/M3 artery + stm32.md",
+    "web",
+    "docs/CAN megmeet Communication Protocol.pdf",
+    "docs/3KW Rectifier Can Communication Protocal V2 20220818 (1).pdf",
+    "docs/LT8920datasheetEngversion201701191.pdf",
+    "metrolog/Текучка Метролог.md",
+    "metrolog/IRQ + FreeRTOS.md",
+    "FlyElectronics/LED Controller.md",
+    "bt67xx",
+    "metrolog/M3 artery.md",
+    "metrolog/readme.md",
+    "Greenstar/FPGA Blaster.md",
+    "FlyElectronics/Grinding machine.md",
+    "img/sch04.JPG"
+  ]
 }
 }

二進制
Database.kdbx


+ 6 - 2
bt67xx/common.md

@@ -1,6 +1,10 @@
+Общее:
+* Проект ==bt-67xx_universal_hw==
+* IP устройства по умолчанию 192.168.0.254
+* login/pas - admin/12345
 Сборка:
 Сборка:
-Опция DEBUG=0 включает защиту flash памяти контроллера.
-Релиз выпускается с DEBUG=0
+* Опция DEBUG=0 включает защиту flash памяти контроллера.
+* Релиз выпускается с DEBUG=0
 ```bash
 ```bash
 $ make HARDWARE=bt6711_v1 VERBOSE=1 DEBUG=1 PRINTF=custom MAC=EC-4C-4D-00-78-89 CROSS="/home/dtelenkov/soft/tools/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/arm-none-eabi"
 $ make HARDWARE=bt6711_v1 VERBOSE=1 DEBUG=1 PRINTF=custom MAC=EC-4C-4D-00-78-89 CROSS="/home/dtelenkov/soft/tools/Sourcery_CodeBench_Lite_for_ARM_EABI/bin/arm-none-eabi"
 ```
 ```

+ 0 - 2
links.md

@@ -1,2 +0,0 @@
-- HTTP https://habr.com/ru/companies/avito/articles/710660/
-- 

+ 12 - 0
linux/linux common.md

@@ -11,3 +11,15 @@ $ sudo apt install python3-svn
 ```bash
 ```bash
 $ sudo arp-scan --interface=eno1 --localnet
 $ sudo arp-scan --interface=eno1 --localnet
 ```
 ```
+Добавить сетевой интерфейс
+```bash
+sudo ifconfig eno1:1 192.168.24.30
+```
+##### <font color = "#1D8571">О системе</font>
+https://losst.pro/sbor-informatsii-o-sisteme-ubuntu
+```bash
+$ hostnamectl # версия ОС, ядра
+$ cat /proc/cpuinfo
+$ lsb_release -a
+$ uname -a # версия ядра
+```

+ 5 - 1
Кодинг.md

@@ -11,4 +11,8 @@ scp: https://losst.pro/kopirovanie-fajlov-scp
 Docker: https://habr.com/ru/companies/ruvds/articles/438796/
 Docker: https://habr.com/ru/companies/ruvds/articles/438796/
 VSC: https://code.visualstudio.com/docs/editor/variables-reference
 VSC: https://code.visualstudio.com/docs/editor/variables-reference
 VSC: http://microsin.net/programming/arm/vscode-faq.html
 VSC: http://microsin.net/programming/arm/vscode-faq.html
-terminal hotkeys: https://losst.pro/goryachie-klavishi-terminala-linux
+terminal hotkeys: https://losst.pro/goryachie-klavishi-terminala-linux
+#### <font color = "MediumSeaGreen">Python</font>
+- "Указатели" в Python https://habr.com/ru/companies/vk/articles/454324/ 
+#### <font color = "MediumSeaGreen">HTTP</font>
+* https://habr.com/ru/companies/avito/articles/710660/

+ 0 - 1
Разное.md

@@ -62,7 +62,6 @@ https://gitlab.com/omprussia
 Поддерживается Qt 5.6
 Поддерживается Qt 5.6
 Приложение как rpm пакет
 Приложение как rpm пакет
 
 
-28 ноября - начало курса
 
 
 
 
 
 

+ 67 - 0
Список литературы.md

@@ -0,0 +1,67 @@
+##### <font color = "#1D8571">Основные</font>
+- **Тони Гэддис, «Начинаем программировать на Python», 5-е издание.** Эту книгу можно рекомендовать как первую книгу по программированию для полных новичков, хотя и умеющим программировать это тоже будет полезно, знакомые части просто пролистаете быстрее.
+    
+- **Билл Любанович, «Простой Python», 2-е издание**. Я по этой книге (первого еще издания, правда) изучал Python. Эта книга хорошо подойдет тем, кто либо уже прочел Гэддиса, либо уверенно программирует на других языках.
+    
+- **Мэттью Фаулер, «Asyncio и конкурентное программирование на Python»**. Примерно единственная и лучшая книга по асинхронной разработке в Python. Must have. Покупать и прорабатывать.
+    
+- Мой скромный труд «[Типизированный Python](https://to.digital/typed-python/)»
+    
+- **Лусиану Рамальо, «Python К вершинам мастерства», 2 издание.** Лучшая книга по углубленному изучению Python. Чтобы овладеть Python на хорошем уровне, вам необходима эта книга.
+    
+- **Макконнелл Стив, «Совершенный код»**. Фундаментальная большая настольная книга о том, как писать качественный код.
+    
+- **Роберт Мартин, «Чистый код»**. Это уже классика, с которой надо быть знакомым всем разработчикам вне зависимости от используемого языка программирования. Примеры на Java, но это не должно вас пугать. В Telegram скину небольшое вводное видео по Java для тех, кто пишет на Python
+    
+- **Роберт Мартин, «Чистая архитектура»**. Возможно, лучшая книга в качестве первой по вопросам архитектуры ПО. Не идеальна, но в дополнение с материалом курса — нормально:)
+    
+- **Гарри Персиваль, Бор Грегори, «Паттерны разработки на Python: TDD, DDD и событийно-ориентированная архитектура»**. А это замечательное продолжение Чистой архитектуры с кодом на Python
+    
+- **Адитья Бхаргава, «Грокаем алгоритмы»**. Простейшее введение в тему алгоритмов и структур данных с примерами на Python. Понятие сложности алгоритма, принципы работы разных структур данных и как правильно выбирать структуру под задачу и тп — обязательно к прочтению, и для реальной работы, и для собеседований.
+    
+- [**MDN**](https://developer.mozilla.org/ru/) — HTML, CSS, JS документация
+    
+- [**javascript.ru**](https://javascript.ru) — учебник JS
+
+##### <font color = "#1D8571">Факультатив</font>
+- **Рогов Е. В. , «PostgreSQL 15 изнутри»**. [Ссылка](https://postgrespro.ru/education/books/internals). Книга о том, как работает СУБД PostgreSQL, наиболее востребованная сейчас в веб-разработке
+    
+- **Brett Slatkin, «Effective Python: 90 Specific Ways to Write Better Python», 2nd Edition**. Отличная книга с лайфхаками и советами касательно того, как писать Pythonic-код. Английский простой и не должен вас смущать. Просто берите и читайте, поначалу со словарём возможно. [Моё видео про английский для программиста](https://www.youtube.com/watch?v=QO2EkfxKdAE).
+    
+- **Чарльз Петцольд, «Код»**. Отличная книга о том, как развивалась техника от телеграфа до современного компьютера, книга может рассматриваться не только как увлекательное чтиво, но и полезный материал, который помогает понять принципы работы процессора.
+    
+- **Ганди Раджу, «Head First. Git»**. В дополнение к главе о Git в курсе. Книги Head First это картинки, схемы, простой язык и шутеечки. Кому-то нравится, кому-то нет. Полистайте, сложите своё мнение.
+    
+- **Алекс Сюй, «System Design»**. Подготовка к сложному интервью» — неплохая книга о системном дизайне, вопросы об этом иногда всплывают на собеседованиях. Книга показывает, как можно проектировать большие системы — по нагрузке, по количеству данных — и исходя из чего принимаются те или иные решения в таких системах.
+    
+- **Уильям Шоттс, «Командная строка Linux. Полное руководство», 2 издание**. Неплохой вводный материал о работе с командной строкой в Linux. Если материала курса вам будет недостаточно, можете также обратиться к этой книге.
+    
+- **Дмитрий Колисниченко, «Командная строка Linux»**. Тоненькая книга с командами и приёмами работы с Linux
+    
+- **Скотт Граннеман, «Linux. Необходимый код и команды»**. Тоже неплохой материал по работе с Linux.
+    
+- [**Debian Handbook**](https://debian-handbook.info/get/). Годная документация по операционной системе Debian.
+    
+- **Дэн Макин, Бэн Уэйл и др., «Unix и Linux: руководство системного администратора», 4 издание**. Название говорит за себя, как и номер издания.
+    
+- **Альтхофф Кори, «Computer Science для программиста-самоучки. Все что нужно знать о структурах данных и алгоритмах»**. Из названия понятно, о чём речь, после «Грокаем алгоритмы» можно почитать и это.
+    
+- **Луридас Панос, «Алгоритмы для начинающих. Теория и практика для разработчика»**. Продолжаем тему алгоритмов
+    
+- **Томас Кормен, «Алгоритмы: построение и анализ», 3-е издание**. Классика темы алгоритмов. Готовы к особому хардкору — вам сюда.
+    
+- **Эндрю Таненбаум, «Современные операционные системы», 4 издание**. Книгу изучают студенты технических ВУЗов ИТ-специальностей. Если вам интересны темы работы ОС, вы хотите заниматься низкоуровневым программирование или просто интересуетесь тем, как всё работает — материал для вас.
+    
+- **Эндрю Таненбаум, «Архитектура компьютера», 6 издание**. Аналогично, увлекательный подробный материал по компьютерному железу.
+    
+- **Эндрю Таненбаум, «Компьютерные сети». 6-е изд**. Для тех, кто хочет прокачаться в вопросе работы сетей.
+    
+- **Виктор Олифер и Наталия Олифер, «Компьютерные сети. Принципы, технологии, протоколы»**. В какой-то мере аналог предыдущей книги. Кому-то больше нравится Таненбаум, кому-то — Олиферы.
+    
+- [**RFC 2616**](https://www.rfc-editor.org/rfc/rfc2616). Спецификация HTTP/1.1.
+    
+- **Поллард Б, «HTTP/2 в действии»**. Книга описывает нововведения и особенности второй версии протокола HTTP.
+    
+- **Зонке Аренс, «Как делать полезные заметки»**. Упоминалась здесь в первой главе курса, о том, как делать заметки в процессе качественной проработки материала. Главную суть я уже отразил в видео, но если захочется познакомиться с идеями поближе — welcome. Для задач курса достаточно того, что я рассказал здесь.
+    
+- **Уолтер Айзексон, «Инноваторы»**. История развития вычислительных устройств и всего того, чем мы сейчас, не задумываясь, пользуемся. В конкретных лицах, проектах, исторических фактах. Очень интересный материал, есть также в аудио-формате. Программировать лучше после этой книги вы не станете, но если вам интересны технологии — рекомендую!

+ 23 - 3
Счета.md

@@ -1,3 +1,23 @@
+# 2024
+#### <font color = "MediumSeaGreen">Январь</font>
+##### <font color = "#1D8571">Коммунальные услуги</font>
+- [x] Широкая электричество 576 
+- [x] Широкая платежка (декабрь 9510)
+- [ ] Подрезково (декабрь )
+- [x] Нина электричество + ТКО на планерной (1571)
+
+##### <font color = "#1D8571">Передача показаний с 15-ого числа</font>
+- [ ] Широкая вода. хол - , гор - 
+- [ ] Широкая электричество  
+- [ ] Подрезково: хол , гор , эл  (Новый счетчик горячей воды, передал по старому )
+- [ ] Химки: 583 - , 473 - , 450 - , 402 - , эл -  (Проблемы по 402)
+- [ ] Планерная Нина электричество: 
+- [ ] Планерная Батя электричество: 
+##### <font color = "#1D8571">Дополнительно</font>
+- [ ] Отдать Нине ()
+- [ ] Домашний интернет ()
+- [x] Сотовый телефон (700)
+- [ ] Продленка 
 # 2023
 # 2023
 #### <font color = "MediumSeaGreen">Декабрь</font>
 #### <font color = "MediumSeaGreen">Декабрь</font>
 ##### <font color = "#1D8571">Коммунальные услуги</font>
 ##### <font color = "#1D8571">Коммунальные услуги</font>
@@ -7,12 +27,12 @@
 - [x] Нина электричество + ТКО на планерной (866)
 - [x] Нина электричество + ТКО на планерной (866)
 
 
 ##### <font color = "#1D8571">Передача показаний с 15-ого числа</font>
 ##### <font color = "#1D8571">Передача показаний с 15-ого числа</font>
-- [ ] Широкая вода. хол - , гор - 
-- [ ] Широкая электричество  7010, 7697, 9827 
+- [x] Широкая вода. хол - 719, гор - 544
+- [x] Широкая электричество  7045, 7729, 9892 
 - [ ] Подрезково: хол , гор , эл  (Новый счетчик горячей воды, передал по старому 420)
 - [ ] Подрезково: хол , гор , эл  (Новый счетчик горячей воды, передал по старому 420)
 - [ ] Химки: 583 - , 473 - , 450 - , 402 - , эл -  (Проблемы по 402)
 - [ ] Химки: 583 - , 473 - , 450 - , 402 - , эл -  (Проблемы по 402)
 - [ ] Планерная Нина электричество: 11826  
 - [ ] Планерная Нина электричество: 11826  
-- [ ] Планерная Батя электричество: 
+- [x] Планерная Батя электричество: 
 
 
 ##### <font color = "#1D8571">Дополнительно</font>
 ##### <font color = "#1D8571">Дополнительно</font>
 - [x] Отдать Нине (16000)
 - [x] Отдать Нине (16000)

+ 177 - 0
Тренировки и занятия.md

@@ -0,0 +1,177 @@
+#### <font color = "MediumSeaGreen">Январь 2024</font>
+```dataviewjs
+renderHabitCalendar(this.container, dv, {
+  year: 2024,
+  month: 1,
+  format: 'html',   // set the format to html
+  data: [ 
+  {
+    date: '2024-01-02',
+    content: '🦵', 
+  },
+  {
+    date: '2024-01-03',
+    content: '💪solo \r  ', 
+  },
+  {
+    date: '2024-01-05',
+    content: '💪solo \r  ', 
+  },
+  {
+    date: '2024-01-08',
+    content: '💪\r🦵',
+  },
+  {
+    date: '2024-01-09',
+    content: '🏊‍♀️💲1600\r🇬🇧',
+  },
+  ]
+})
+```
+#### <font color = "MediumSeaGreen">Декабрь 2023</font>
+```dataviewjs
+renderHabitCalendar(this.container, dv, {
+  year: 2023,
+  month: 12,
+  format: 'html',
+  data: [ 
+  {
+    date: '2023-12-05',
+    content: '🇬🇧', 
+  },
+  {
+    date: '2023-12-07',
+    content: '💪\r🇬🇧💲10000', 
+  },
+  {
+    date: '2023-121-10',
+    content: '💪solo \r  ', 
+  },
+  {
+    date: '2023-12-12',
+    content: '💪\r🇬🇧', 
+  },
+  {
+    date: '2023-12-13',
+    content: '🦵💲21000', 
+  },
+  {
+    date: '2023-12-14',
+    content: '💪\r🇬🇧',
+  },
+  {
+    date: '2023-12-16',
+    content: '🦵', 
+  },
+  {
+    date: '2023-12-17',
+    content: '💪solo', 
+  },
+  {
+    date: '2023-12-19',
+    content: '💪\r🇬🇧', 
+  },
+  {
+    date: '2023-12-20',
+    content: '🦵', 
+  },
+  {
+    date: '2023-12-21',
+    content: '💪solo\r🇬🇧', 
+  },
+  {
+    date: '2023-12-23',
+    content: '💪\r🦵', 
+  },
+  {
+    date: '2023-12-26',
+    content: '💪', 
+  },
+  {
+    date: '2023-12-27',
+    content: '🦵\r🇬🇧', 
+  },
+  {
+    date: '2023-12-28',
+    content: '💪', 
+  },
+  {
+    date: '2023-12-29',
+    content: '🇬🇧', 
+  },
+  {
+    date: '2023-12-30',
+    content: '🦵', 
+  },
+  ]
+})
+```
+#### <font color = "MediumSeaGreen">Ноябрь 2023</font>
+```dataviewjs
+renderHabitCalendar(this.container, dv, {
+  year: 2023,
+  month: 11,
+  format: 'html',
+  data: [ 
+  {
+    date: '2023-11-02',
+    content: '💪', 
+  },
+  {
+    date: '2023-11-04',
+    content: '💪solo', 
+  },
+  {
+    date: '2023-11-06',
+    content: '🇬🇧💲start', 
+  },
+  {
+    date: '2023-11-07',
+    content: '💪\r🇬🇧', 
+  },
+  {
+    date: '2023-11-09',
+    content: '💪', 
+  },
+  {
+    date: '2023-11-12',
+    content: '💪solo', 
+  },
+  {
+    date: '2023-11-14',
+    content: '🇬🇧', 
+  },
+  {
+    date: '2023-11-15',
+    content: '💪', 
+  },
+  {
+    date: '2023-11-16',
+    content: '💪\r🇬🇧', 
+  },
+  {
+    date: '2023-11-19',
+    content: '💪solo', 
+  },
+  {
+    date: '2023-11-21',
+    content: '💪\r🇬🇧', 
+  },
+  {
+    date: '2023-11-23',
+    content: '💪\r🇬🇧', 
+  },
+  {
+    date: '2023-11-28',
+    content: '💪\r🇬🇧', 
+  },
+  {
+    date: '2023-11-30',
+    content: '💪💲21000\r🇬🇧', 
+  },
+  ]
+})
+```
+
+
+

部分文件因文件數量過多而無法顯示