Push 163 file(s) from Obsidian
This commit is contained in:
Vendored
+4
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"attachmentFolderPath": "files",
|
||||
"alwaysUpdateLinks": true
|
||||
}
|
||||
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"cssTheme": "Material 3"
|
||||
}
|
||||
Vendored
+9
@@ -0,0 +1,9 @@
|
||||
[
|
||||
"templater-obsidian",
|
||||
"dataview",
|
||||
"calendar",
|
||||
"obsidian-languagetool-plugin",
|
||||
"obsidian-kanban",
|
||||
"remotely-save",
|
||||
"git-file-sync"
|
||||
]
|
||||
Vendored
+33
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"file-explorer": true,
|
||||
"global-search": true,
|
||||
"switcher": true,
|
||||
"graph": true,
|
||||
"backlink": true,
|
||||
"canvas": true,
|
||||
"outgoing-link": true,
|
||||
"tag-pane": true,
|
||||
"footnotes": false,
|
||||
"properties": false,
|
||||
"page-preview": true,
|
||||
"daily-notes": true,
|
||||
"templates": true,
|
||||
"note-composer": true,
|
||||
"command-palette": true,
|
||||
"slash-command": true,
|
||||
"editor-status": true,
|
||||
"bookmarks": true,
|
||||
"markdown-importer": false,
|
||||
"zk-prefixer": false,
|
||||
"random-note": false,
|
||||
"outline": true,
|
||||
"word-count": true,
|
||||
"slides": false,
|
||||
"audio-recorder": false,
|
||||
"workspaces": false,
|
||||
"file-recovery": true,
|
||||
"publish": false,
|
||||
"sync": true,
|
||||
"bases": true,
|
||||
"webviewer": false
|
||||
}
|
||||
Vendored
+22
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"collapse-filter": false,
|
||||
"search": "",
|
||||
"showTags": true,
|
||||
"showAttachments": false,
|
||||
"hideUnresolved": false,
|
||||
"showOrphans": true,
|
||||
"collapse-color-groups": true,
|
||||
"colorGroups": [],
|
||||
"collapse-display": true,
|
||||
"showArrow": false,
|
||||
"textFadeMultiplier": 0,
|
||||
"nodeSizeMultiplier": 1,
|
||||
"lineSizeMultiplier": 1,
|
||||
"collapse-forces": true,
|
||||
"centerStrength": 0.518713248970312,
|
||||
"repelStrength": 10,
|
||||
"linkStrength": 1,
|
||||
"linkDistance": 250,
|
||||
"scale": 0.44779660127771026,
|
||||
"close": true
|
||||
}
|
||||
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"shouldConfirmBeforeCreate": true,
|
||||
"weekStart": "locale",
|
||||
"wordsPerDot": 250,
|
||||
"showWeeklyNote": false,
|
||||
"weeklyNoteFormat": "",
|
||||
"weeklyNoteTemplate": "",
|
||||
"weeklyNoteFolder": "",
|
||||
"localeOverride": "system-default"
|
||||
}
|
||||
Vendored
+4459
File diff suppressed because it is too large
Load Diff
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "calendar",
|
||||
"name": "Calendar",
|
||||
"description": "Calendar view of your daily notes",
|
||||
"version": "1.5.10",
|
||||
"author": "Liam Cain",
|
||||
"authorUrl": "https://github.com/liamcain/",
|
||||
"isDesktopOnly": false,
|
||||
"minAppVersion": "0.9.11"
|
||||
}
|
||||
Vendored
+27
@@ -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": false,
|
||||
"enableInlineDataviewJs": false,
|
||||
"prettyRenderInlineFields": true,
|
||||
"prettyRenderInlineFieldsInLivePreview": true,
|
||||
"dataviewJsKeyword": "dataviewjs"
|
||||
}
|
||||
Vendored
+20876
File diff suppressed because one or more lines are too long
+11
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "dataview",
|
||||
"name": "Dataview",
|
||||
"version": "0.5.68",
|
||||
"minAppVersion": "0.13.11",
|
||||
"description": "Complex data views for the data-obsessed.",
|
||||
"author": "Michael Brenan <blacksmithgu@gmail.com>",
|
||||
"authorUrl": "https://github.com/blacksmithgu",
|
||||
"helpUrl": "https://blacksmithgu.github.io/obsidian-dataview/",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
+141
@@ -0,0 +1,141 @@
|
||||
.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(--nav-item-color-selected);
|
||||
}
|
||||
|
||||
.dataview.inline-field-value {
|
||||
padding-left: 8px;
|
||||
padding-right: 8px;
|
||||
font-family: var(--font-monospace);
|
||||
background-color: var(--background-secondary-alt);
|
||||
color: var(--nav-item-color-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(--nav-item-color-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: ")";
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"serviceType": "gitea",
|
||||
"gitlabToken": "",
|
||||
"gitlabBaseUrl": "https://gitlab.com",
|
||||
"projectId": "",
|
||||
"githubToken": "",
|
||||
"githubOwner": "",
|
||||
"githubRepo": "",
|
||||
"giteaToken": "049fca33d7a9bba4cebf68c5bb0a9f8f0bc02ae5",
|
||||
"giteaBaseUrl": "https://gitea.romario.su/",
|
||||
"giteaOwner": "roman",
|
||||
"giteaRepo": "obsidian",
|
||||
"rootPath": "",
|
||||
"branch": "main",
|
||||
"syncMetadata": {
|
||||
"🤖ЛОКАЛЬНЫЙ ИИ-ЭКСПЕРТ ПО БАНКОМАТНОМУ ПО.md": {
|
||||
"lastSyncedSha": "e45190f782843893d90fe2a2e5c7e310a01cc54e",
|
||||
"lastSyncedAt": 1790238140611,
|
||||
"lastKnownPath": "🤖ЛОКАЛЬНЫЙ ИИ-ЭКСПЕРТ ПО БАНКОМАТНОМУ ПО.md"
|
||||
},
|
||||
"🤖 ЛОКАЛЬНЫЙ ИИ-ЭКСПЕРТ ПО БАНКОМАТНОМУ ПО.md": {
|
||||
"lastSyncedSha": "e79aae8b484ed55ba5e7b1791630754c94088c44",
|
||||
"lastSyncedAt": 1790238140612,
|
||||
"lastKnownPath": "🤖 ЛОКАЛЬНЫЙ ИИ-ЭКСПЕРТ ПО БАНКОМАТНОМУ ПО.md"
|
||||
},
|
||||
"Тесто (балиш, курник).md": {
|
||||
"lastSyncedSha": "20b794f28087a9b5300897026ab93ccaf79a52bf",
|
||||
"lastSyncedAt": 1790238140612,
|
||||
"lastKnownPath": "Тесто (балиш, курник).md"
|
||||
},
|
||||
"Поиск и удаление старых файлов в Linux.md": {
|
||||
"lastSyncedSha": "d3314d5d28303c0f97e37f61612647d8e59150e6",
|
||||
"lastSyncedAt": 1790238140612,
|
||||
"lastKnownPath": "Поиск и удаление старых файлов в Linux.md"
|
||||
}
|
||||
},
|
||||
"vaultFolder": "",
|
||||
"symlinkHandling": "real",
|
||||
"ignorePatterns": "",
|
||||
"lastSeenVersion": "1.6.2",
|
||||
"bannerDismissedVersion": "",
|
||||
"language": "system",
|
||||
"autoRefreshOnStartup": true
|
||||
}
|
||||
+31
File diff suppressed because one or more lines are too long
+10
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "git-file-sync",
|
||||
"name": "Git File Sync",
|
||||
"version": "1.6.2",
|
||||
"minAppVersion": "1.11.0",
|
||||
"description": "Selectively sync individual notes with GitLab or GitHub. Push, pull, diff, and resolve conflicts — file by file, on mobile and desktop.",
|
||||
"author": "ClaudiaFang",
|
||||
"authorUrl": "https://firstsun.heavenfortress.com/en/",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
+1753
File diff suppressed because it is too large
Load Diff
+3
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"show-checkboxes": true
|
||||
}
|
||||
+153
File diff suppressed because one or more lines are too long
+11
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "obsidian-kanban",
|
||||
"name": "Kanban",
|
||||
"version": "2.0.51",
|
||||
"minAppVersion": "1.0.0",
|
||||
"description": "Create markdown-backed Kanban boards in Obsidian.",
|
||||
"author": "mgmeyers",
|
||||
"authorUrl": "https://github.com/mgmeyers/obsidian-kanban",
|
||||
"helpUrl": "https://publish.obsidian.md/kanban/Obsidian+Kanban+Plugin",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"serverUrl": "https://api.languagetool.org",
|
||||
"urlMode": "standard",
|
||||
"glassBg": false,
|
||||
"shouldAutoCheck": false,
|
||||
"autoCheckDelay": 3000,
|
||||
"pickyMode": false,
|
||||
"staticLanguage": "auto",
|
||||
"englishVeriety": "en-US"
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"id": "obsidian-languagetool-plugin",
|
||||
"name": "LanguageTool Integration",
|
||||
"version": "0.3.7",
|
||||
"minAppVersion": "0.15.2",
|
||||
"description": "Inofficial LanguageTool plugin",
|
||||
"author": "Clemens Ertle",
|
||||
"authorUrl": "https://github.com/Clemens-E",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
@@ -0,0 +1,204 @@
|
||||
.lt-underline {
|
||||
cursor: pointer;
|
||||
transition: background-color 100ms ease-out;
|
||||
}
|
||||
|
||||
.lt-underline.lt-minor {
|
||||
box-shadow: inset 0 -2px #e9b35f;
|
||||
}
|
||||
|
||||
.lt-underline.lt-major {
|
||||
box-shadow: inset 0 -2px #da615c;
|
||||
}
|
||||
|
||||
.lt-underline.lt-style {
|
||||
box-shadow: inset 0 -2px #8981f3;
|
||||
}
|
||||
|
||||
.lt-underline.lt-minor:hover {
|
||||
background-color: #e9b35f21;
|
||||
}
|
||||
|
||||
.lt-underline.lt-major:hover {
|
||||
background-color: #da615c21;
|
||||
}
|
||||
|
||||
.lt-underline.lt-style:hover {
|
||||
background-color: #8981f321;
|
||||
}
|
||||
|
||||
@keyframes lineInserted {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.lt-predictions-container-glass.cm-tooltip,
|
||||
.lt-predictions-container.cm-tooltip,
|
||||
.lt-predictions-container-glass,
|
||||
.lt-predictions-container {
|
||||
position: absolute;
|
||||
animation-duration: 150ms;
|
||||
animation-name: lineInserted;
|
||||
font-family: var(--default-font);
|
||||
font-size: 0.93rem;
|
||||
padding: 12px 0 0;
|
||||
background-color: var(--background-primary);
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 6px;
|
||||
width: 300px;
|
||||
line-height: 1.5;
|
||||
z-index: var(--layer-popover);
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.lt-predictions-container-glass {
|
||||
background: hsla(0, 0%, 100%, 0.25);
|
||||
backdrop-filter: blur(12px);
|
||||
}
|
||||
|
||||
.lt-predictions-container > button {
|
||||
transition-delay: 0.5s;
|
||||
}
|
||||
|
||||
.lt-buttoncontainer:not(:empty) {
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.lt-buttoncontainer > button {
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
font-size: 1rem;
|
||||
margin-right: 4px;
|
||||
margin-bottom: 4px;
|
||||
padding: 4px 10px;
|
||||
}
|
||||
|
||||
.lt-title {
|
||||
display: block;
|
||||
font-weight: 600;
|
||||
margin-bottom: 6px;
|
||||
padding: 0 12px;
|
||||
}
|
||||
|
||||
.lt-message {
|
||||
padding: 0 12px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.lt-bottom {
|
||||
min-height: 10px;
|
||||
padding-left: 12px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.lt-info-container {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.lt-info-button {
|
||||
color: var(--text-faint);
|
||||
}
|
||||
|
||||
.lt-info-box {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
animation-duration: 150ms;
|
||||
animation-name: lineInserted;
|
||||
font-family: var(--default-font);
|
||||
font-size: 0.93rem;
|
||||
padding: 12px 0;
|
||||
background-color: var(--background-primary);
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
border-radius: 6px;
|
||||
line-height: 1.5;
|
||||
z-index: var(--layer-popover);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.lt-info {
|
||||
padding: 0 12px;
|
||||
display: block;
|
||||
font-size: 0.8rem;
|
||||
color: var(--text-muted);
|
||||
user-select: text;
|
||||
-webkit-user-select: text;
|
||||
}
|
||||
|
||||
.lt-ignorecontainer {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.lt-status-bar-btn {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
cursor: pointer;
|
||||
line-height: 1;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.lt-status-bar-check-icon {
|
||||
display: block;
|
||||
text-decoration: underline;
|
||||
text-decoration-style: dotted;
|
||||
}
|
||||
|
||||
.lt-ignore-btn {
|
||||
margin: 0;
|
||||
padding: 12px;
|
||||
display: flex;
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
border-radius: 0;
|
||||
align-items: center;
|
||||
line-height: 1;
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.lt-ignore-btn > span {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.lt-ignore-btn > span:last-child {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.lt-minor .lt-title > span {
|
||||
box-shadow: inset 0 -2px #e9b35f88;
|
||||
}
|
||||
|
||||
.lt-major .lt-title > span {
|
||||
box-shadow: inset 0 -2px #da615c88;
|
||||
}
|
||||
|
||||
.lt-style .lt-title > span {
|
||||
box-shadow: inset 0 -2px #8981f388;
|
||||
}
|
||||
|
||||
.lt-loading > svg {
|
||||
animation-name: spin;
|
||||
animation-duration: 1s;
|
||||
animation-iteration-count: infinite;
|
||||
animation-timing-function: linear;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
data.json
|
||||
+235
File diff suppressed because one or more lines are too long
+11
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "remotely-save",
|
||||
"name": "Remotely Save",
|
||||
"version": "0.5.25",
|
||||
"minAppVersion": "0.13.21",
|
||||
"description": "Yet another unofficial plugin allowing users to synchronize notes between local device and the cloud service.",
|
||||
"author": "fyears",
|
||||
"authorUrl": "https://github.com/fyears",
|
||||
"isDesktopOnly": false,
|
||||
"fundingUrl": "https://remotelysave.com"
|
||||
}
|
||||
+244
@@ -0,0 +1,244 @@
|
||||
/* set the styles */
|
||||
|
||||
.password-second-confirm {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.password-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.encryptionmethod-second-confirm {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.settings-auth-related {
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
padding-top: 18px;
|
||||
}
|
||||
|
||||
.settings-percentage-custom-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.settings-encryption-method-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.s3-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.s3-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dropbox-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.dropbox-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dropbox-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dropbox-revoke-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.onedrive-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.onedrive-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.onedrive-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.onedrive-revoke-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.onedrivefull-allow-to-use-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.onedrivefull-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.onedrivefull-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.onedrivefull-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.onedrivefull-revoke-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.webdav-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.webdav-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.webdav-customheaders-textarea {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.webdis-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.webdis-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.googledrive-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.googledrive-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.googledrive-allow-to-use-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.googledrive-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.googledrive-revoke-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.box-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.box-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.box-allow-to-use-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.box-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.box-revoke-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pcloud-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.pcloud-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pcloud-allow-to-use-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pcloud-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pcloud-revoke-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.yandexdisk-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.yandexdisk-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.yandexdisk-allow-to-use-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.yandexdisk-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.yandexdisk-revoke-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.koofr-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.koofr-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.koofr-allow-to-use-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.koofr-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.koofr-revoke-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.azureblobstorage-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.azureblobstorage-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.azureblobstorage-allow-to-use-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.qrcode-img {
|
||||
width: 350px;
|
||||
height: 350px;
|
||||
}
|
||||
|
||||
.ignorepaths-textarea {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.onlyallowpaths-textarea {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
.logtohttpserver-warning {
|
||||
color: red;
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
.setting-need-wrapping .setting-item-control {
|
||||
/* flex-wrap: wrap; */
|
||||
display: grid;
|
||||
}
|
||||
|
||||
.pro-disclaimer {
|
||||
font-weight: bold;
|
||||
}
|
||||
.pro-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pro-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pro-revoke-auth-button-hide {
|
||||
display: none;
|
||||
}
|
||||
+37
File diff suppressed because one or more lines are too long
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"id": "templater-obsidian",
|
||||
"name": "Templater",
|
||||
"version": "2.14.1",
|
||||
"description": "Create and use templates",
|
||||
"minAppVersion": "1.5.0",
|
||||
"author": "SilentVoid",
|
||||
"authorUrl": "https://github.com/SilentVoid13",
|
||||
"helpUrl": "https://silentvoid13.github.io/Templater/",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
+220
@@ -0,0 +1,220 @@
|
||||
.templater_search {
|
||||
width: calc(100% - 20px);
|
||||
}
|
||||
|
||||
.templater_div {
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.templater_div > .setting-item {
|
||||
border-top: none !important;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.templater_div > .setting-item > .setting-item-control {
|
||||
justify-content: space-around;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.templater_div
|
||||
> .setting-item
|
||||
> .setting-item-control
|
||||
> .setting-editor-extra-setting-button {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.templater_donating {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.templater_title {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
margin-top: 5px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.templater_template {
|
||||
align-self: center;
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
width: 70%;
|
||||
}
|
||||
|
||||
.templater_cmd {
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
font-size: 14px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.templater_div2 > .setting-item {
|
||||
align-content: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.templater-prompt-div {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.templater-prompt-form {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.templater-prompt-input {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.templater-button-div {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
textarea.templater-prompt-input {
|
||||
height: 10rem;
|
||||
}
|
||||
|
||||
textarea.templater-prompt-input:focus {
|
||||
border-color: var(--interactive-accent);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .templater-command-bg {
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
background-color: var(--background-primary-alt);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command {
|
||||
font-size: 0.85em;
|
||||
font-family: var(--font-monospace);
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .templater-inline .cm-templater-command {
|
||||
background-color: var(--background-primary-alt);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-opening-tag {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-closing-tag {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag {
|
||||
color: var(--code-property, #008bff);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-execution-tag {
|
||||
color: var(--code-function, #c0d700);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-keyword {
|
||||
color: var(--code-keyword, #00a7aa);
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-atom {
|
||||
color: var(--code-normal, #f39b35);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-value,
|
||||
.cm-s-obsidian .cm-templater-command.cm-number,
|
||||
.cm-s-obsidian .cm-templater-command.cm-type {
|
||||
color: var(--code-value, #a06fca);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-def,
|
||||
.cm-s-obsidian .cm-templater-command.cm-type.cm-def {
|
||||
color: var(--code-normal, var(--text-normal));
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-property,
|
||||
.cm-s-obsidian .cm-templater-command.cm-property.cm-def,
|
||||
.cm-s-obsidian .cm-templater-command.cm-attribute {
|
||||
color: var(--code-function, #98e342);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-variable,
|
||||
.cm-s-obsidian .cm-templater-command.cm-variable-2,
|
||||
.cm-s-obsidian .cm-templater-command.cm-variable-3,
|
||||
.cm-s-obsidian .cm-templater-command.cm-meta {
|
||||
color: var(--code-property, #d4d4d4);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-callee,
|
||||
.cm-s-obsidian .cm-templater-command.cm-operator,
|
||||
.cm-s-obsidian .cm-templater-command.cm-qualifier,
|
||||
.cm-s-obsidian .cm-templater-command.cm-builtin {
|
||||
color: var(--code-operator, #fc4384);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-tag {
|
||||
color: var(--code-tag, #fc4384);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-comment,
|
||||
.cm-s-obsidian .cm-templater-command.cm-comment.cm-tag,
|
||||
.cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute {
|
||||
color: var(--code-comment, #696d70);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-string,
|
||||
.cm-s-obsidian .cm-templater-command.cm-string-2 {
|
||||
color: var(--code-string, #e6db74);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-header,
|
||||
.cm-s-obsidian .cm-templater-command.cm-hr {
|
||||
color: var(--code-keyword, #da7dae);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-link {
|
||||
color: var(--code-normal, #696d70);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-error {
|
||||
border-bottom: 1px solid #c42412;
|
||||
}
|
||||
|
||||
.CodeMirror-hints {
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
overflow: hidden;
|
||||
list-style: none;
|
||||
|
||||
margin: 0;
|
||||
padding: 2px;
|
||||
|
||||
-webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
|
||||
-moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
|
||||
border-radius: 3px;
|
||||
border: 1px solid silver;
|
||||
|
||||
background: white;
|
||||
font-size: 90%;
|
||||
font-family: monospace;
|
||||
|
||||
max-height: 20em;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.CodeMirror-hint {
|
||||
margin: 0;
|
||||
padding: 0 4px;
|
||||
border-radius: 2px;
|
||||
white-space: pre;
|
||||
color: black;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
li.CodeMirror-hint-active {
|
||||
background: #08f;
|
||||
color: white;
|
||||
}
|
||||
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"folder": "Templates"
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"name": "Material 3",
|
||||
"version": "1.9.1",
|
||||
"minAppVersion": "1.0.0",
|
||||
"author": "HarmfulBreeze",
|
||||
"authorUrl": "https://github.com/HarmfulBreeze"
|
||||
}
|
||||
+1
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"name": "Material Flat",
|
||||
"version": "1.4.3",
|
||||
"minAppVersion": "1.1.0",
|
||||
"author": "Threethan, Joschua",
|
||||
"authorUrl": "https://github.com/Threethan/"
|
||||
}
|
||||
+2597
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"name": "Material Gruvbox",
|
||||
"version": "1.1.0",
|
||||
"minAppVersion": "0.15.0",
|
||||
"author": "AllJavi",
|
||||
"authorUrl": "https://github.com/AllJavi"
|
||||
}
|
||||
+814
@@ -0,0 +1,814 @@
|
||||
:root {
|
||||
/* DEFAULTS */
|
||||
--dark0-hard-x: 29,32,33;
|
||||
--dark0-hard: rgb(var(--dark0-hard-x));
|
||||
--dark0-x: 40,40,40;
|
||||
--dark0: rgb(var(--dark0-x));
|
||||
--dark0-soft-x: 50,48,47;
|
||||
--dark0-soft: rgb(var(--dark0-soft-x));
|
||||
--dark1-x: 60,56,54;
|
||||
--dark1: rgb(var(--dark1-x));
|
||||
--dark2-x: 80,73,69;
|
||||
--dark2: rgb(var(--dark2-x));
|
||||
--dark3-x: 102,92,84;
|
||||
--dark3: rgb(var(--dark3-x));
|
||||
--dark4-x: 124,111,100;
|
||||
--dark4: rgb(var(--dark4-x));
|
||||
--gray-x: 146,131,116;
|
||||
--gray: rgb(var(--gray-x));
|
||||
--dark-text-x: 101,71,53;
|
||||
--dark-text: rgb(var(--dark-text-x));
|
||||
--dark-text-faint-x: 179,126,93;
|
||||
--dark-text-faint: rgb(var(--dark-text-faint-x));
|
||||
--dark-text-muted-x: 115,81,69;
|
||||
--dark-text-muted: rgb(var(--dark-text-muted-x));
|
||||
|
||||
--light0-hard-x: 249,245,215;
|
||||
--light0-hard: rgb(var(--light0-hard-x));
|
||||
--light0-x: 251,241,199;
|
||||
--light0: rgb(var(--light0-x));
|
||||
--light0-soft-x: 242,229,188;
|
||||
--light0-soft: rgb(var(--light0-soft-x));
|
||||
--light1-x: 235,219,178;
|
||||
--light1: rgb(var(--light1-x));
|
||||
--light2-x: 213,196,161;
|
||||
--light2: rgb(var(--light2-x));
|
||||
--light3-x: 189,174,147;
|
||||
--light3: rgb(var(--light3-x));
|
||||
--light4-x: 168,153,132;
|
||||
--light4: rgb(var(--light4-x));
|
||||
--light-text-x: 212,190,152;
|
||||
--light-text: rgb(var(--light-text-x));
|
||||
|
||||
--neutral-red-x: 234,105,98;
|
||||
--neutral-red: rgb(var(--neutral-red-x));
|
||||
--neutral-green-x: 169,182,101;
|
||||
--neutral-green: rgb(var(--neutral-green-x));
|
||||
--neutral-yellow-x: 231,138,78;
|
||||
--neutral-yellow: rgb(var(--neutral-yellow-x));
|
||||
--neutral-blue-x: 125,174,163;
|
||||
--neutral-blue: rgb(var(--neutral-blue-x));
|
||||
--neutral-purple-x: 211,134,155;
|
||||
--neutral-purple: rgb(var(--neutral-purple-x));
|
||||
--neutral-aqua-x: 137,180,130;
|
||||
--neutral-aqua: rgb(var(--neutral-aqua-x));
|
||||
|
||||
--faded-red-x: 193,74,74;
|
||||
--faded-red: rgb(var(--faded-red-x));
|
||||
--faded-green-x: 108,120,46;
|
||||
--faded-green: rgb(var(--faded-green-x));
|
||||
--faded-yellow-x: 195,94,10;
|
||||
--faded-yellow: rgb(var(--faded-yellow-x));
|
||||
--faded-blue-x: 69,112,122;
|
||||
--faded-blue: rgb(var(--faded-blue-x));
|
||||
--faded-purple-x: 148,94,128;
|
||||
--faded-purple: rgb(var(--faded-purple-x));
|
||||
--faded-aqua-x: 76,122,93;
|
||||
--faded-aqua: rgb(var(--faded-aqua-x));
|
||||
|
||||
/* @settings
|
||||
name: Gruvbox Material Color Overrides
|
||||
id: gruvbox-material-theme-override
|
||||
settings:
|
||||
- id: section-dark
|
||||
title: Dark Theme
|
||||
type: heading
|
||||
level: 2
|
||||
collapsed: true
|
||||
|
||||
- id: dark0-hard
|
||||
title: Dark 0 Hard
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#1d2021'
|
||||
alt-format:
|
||||
- id: dark0-hard-x
|
||||
format: hex
|
||||
|
||||
- id: dark0
|
||||
title: Dark 0
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#282828'
|
||||
alt-format:
|
||||
- id: dark0-x
|
||||
format: hex
|
||||
|
||||
- id: dark0-soft
|
||||
title: Dark 0 Soft
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#282828'
|
||||
alt-format:
|
||||
- id: dark0-soft-x
|
||||
format: hex
|
||||
|
||||
- id: dark1
|
||||
title: Dark 1
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#3c3836'
|
||||
alt-format:
|
||||
- id: dark1-x
|
||||
format: hex
|
||||
|
||||
- id: dark2
|
||||
title: Dark 2
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#504945'
|
||||
alt-format:
|
||||
- id: dark2-x
|
||||
format: hex
|
||||
|
||||
- id: dark3
|
||||
title: Dark 3
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#665c54'
|
||||
alt-format:
|
||||
- id: dark3-x
|
||||
format: hex
|
||||
|
||||
- id: dark4
|
||||
title: Dark 4
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#7c6f64'
|
||||
alt-format:
|
||||
- id: dark4-x
|
||||
format: hex
|
||||
|
||||
- id: section-light
|
||||
title: Light Theme
|
||||
type: heading
|
||||
level: 2
|
||||
collapsed: true
|
||||
|
||||
- id: light0-hard
|
||||
title: Light 0 Hard
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#f9f5d7'
|
||||
alt-format:
|
||||
- id: light0-hard-x
|
||||
format: hex
|
||||
|
||||
- id: light0
|
||||
title: Light 0
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#fbf1c7'
|
||||
alt-format:
|
||||
- id: light0-x
|
||||
format: hex
|
||||
|
||||
- id: light0-soft
|
||||
title: Light 0 Soft
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#f2e5bc'
|
||||
alt-format:
|
||||
- id: light0-soft-x
|
||||
format: hex
|
||||
|
||||
- id: light1
|
||||
title: Light 1
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#ebdbb2'
|
||||
alt-format:
|
||||
- id: light1-x
|
||||
format: hex
|
||||
|
||||
- id: light2
|
||||
title: Light 2
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#d5c4a1'
|
||||
alt-format:
|
||||
- id: light2-x
|
||||
format: hex
|
||||
|
||||
- id: light3
|
||||
title: Light 3
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#bdae93'
|
||||
alt-format:
|
||||
- id: light3-x
|
||||
format: hex
|
||||
|
||||
- id: light4
|
||||
title: Light 4
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#a89984'
|
||||
alt-format:
|
||||
- id: light4-x
|
||||
format: hex
|
||||
|
||||
- id: section-general
|
||||
title: General Colors
|
||||
type: heading
|
||||
level: 2
|
||||
collapsed: false
|
||||
|
||||
- id: gray
|
||||
title: Gray
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#928374'
|
||||
alt-format:
|
||||
- id: gray-x
|
||||
format: hex
|
||||
|
||||
- id: section-general-text
|
||||
title: Text Colors
|
||||
type: heading
|
||||
level: 3
|
||||
collapsed: true
|
||||
|
||||
- id: dark-text
|
||||
title: Dark Text
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#654735'
|
||||
alt-format:
|
||||
- id: dark-text-x
|
||||
format: hex
|
||||
|
||||
- id: dark-text-faint
|
||||
title: Dark Text Faint
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#b37e5d'
|
||||
|
||||
- id: dark-text-muted
|
||||
title: Dark Text Muted
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#73513c'
|
||||
alt-format:
|
||||
- id: dark-text-muted-x
|
||||
format: hex
|
||||
|
||||
- id: light-text
|
||||
title: Light Text
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#d4be98'
|
||||
alt-format:
|
||||
- id: light-text-x
|
||||
format: hex
|
||||
|
||||
- id: light-text-faint
|
||||
title: Light Text Faint
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#b37e5d'
|
||||
alt-format:
|
||||
- id: light-text-faint-x
|
||||
format: hex
|
||||
|
||||
- id: light-text-muted
|
||||
title: Light Text Muted
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#73513c'
|
||||
alt-format:
|
||||
- id: light-text-muted-x
|
||||
format: hex
|
||||
|
||||
- id: section-general-neutral
|
||||
title: Neutral Colors
|
||||
type: heading
|
||||
level: 3
|
||||
collapsed: true
|
||||
|
||||
- id: neutral-red
|
||||
title: Red
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#ea6962'
|
||||
alt-format:
|
||||
- id: neutral-red-x
|
||||
format: hex
|
||||
|
||||
- id: neutral-green
|
||||
title: Green
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#a9b665'
|
||||
alt-format:
|
||||
- id: neutral-green-x
|
||||
format: hex
|
||||
|
||||
- id: neutral-yellow
|
||||
title: Yellow
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#e78a4e'
|
||||
alt-format:
|
||||
- id: neutral-yellow-x
|
||||
format: hex
|
||||
|
||||
- id: neutral-blue
|
||||
title: Blue
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#7daea3'
|
||||
alt-format:
|
||||
- id: neutral-blue-x
|
||||
format: hex
|
||||
|
||||
- id: neutral-purple
|
||||
title: Purple
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#d3869b'
|
||||
alt-format:
|
||||
- id: neutral-purple-x
|
||||
format: hex
|
||||
|
||||
- id: neutral-aqua
|
||||
title: Aqua
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#89b482'
|
||||
alt-format:
|
||||
- id: neutral-aqua-x
|
||||
format: hex
|
||||
|
||||
- id: section-general-faded
|
||||
title: Faded Colors
|
||||
type: heading
|
||||
level: 3
|
||||
collapsed: true
|
||||
|
||||
- id: faded-red
|
||||
title: Red
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#c14a4a'
|
||||
alt-format:
|
||||
- id: faded-red-x
|
||||
format: hex
|
||||
|
||||
- id: faded-green
|
||||
title: Green
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#6c782e'
|
||||
alt-format:
|
||||
- id: faded-green-x
|
||||
format: hex
|
||||
|
||||
- id: faded-yellow
|
||||
title: Yellow
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#c35e0a'
|
||||
alt-format:
|
||||
- id: faded-yellow-x
|
||||
format: hex
|
||||
|
||||
- id: faded-blue
|
||||
title: Blue
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#45707a'
|
||||
alt-format:
|
||||
- id: faded-blue-x
|
||||
format: hex
|
||||
|
||||
- id: faded-purple
|
||||
title: Purple
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#945e80'
|
||||
alt-format:
|
||||
- id: faded-purple-x
|
||||
format: hex
|
||||
|
||||
- id: faded-aqua
|
||||
title: Aqua
|
||||
type: variable-color
|
||||
format: rgb
|
||||
default: '#4c7a5d'
|
||||
alt-format:
|
||||
- id: faded-aqua-x
|
||||
format: hex
|
||||
*/
|
||||
}
|
||||
|
||||
body {
|
||||
--accent-h: 166; /* --neutral-blue #7daea3 */
|
||||
--accent-s: 23%;
|
||||
--accent-l: 58%;
|
||||
|
||||
--link-decoration: none;
|
||||
--link-decoration-hover: none;
|
||||
--link-external-decoration: none;
|
||||
--link-external-decoration-hover: none;
|
||||
|
||||
--tag-decoration: none;
|
||||
--tag-decoration-hover: underline;
|
||||
--tag-padding-x: .5em;
|
||||
--tag-padding-y: .2em;
|
||||
--tag-radius: .5em;
|
||||
|
||||
--tab-font-weight: 600;
|
||||
--bold-weight: 600;
|
||||
|
||||
--checkbox-radius: 0;
|
||||
|
||||
/* --list-indent: 2em; */
|
||||
|
||||
--embed-border-left: 6px double var(--interactive-accent);
|
||||
}
|
||||
|
||||
.theme-dark {
|
||||
--color-red-rgb: var(--neutral-red-x);
|
||||
--color-red: var(--neutral-red);
|
||||
--color-purple-rgb: var(--neutral-purple-x);
|
||||
--color-purple: var(--neutral-purple);
|
||||
--color-green-rgb: var(--neutral-green-x);
|
||||
--color-green: var(--neutral-green);
|
||||
--color-cyan-rgb: var(--neutral-blue-x);
|
||||
--color-cyan: var(--neutral-blue);
|
||||
--color-blue-rgb: var(--faded-blue-x);
|
||||
--color-blue: var(--faded-blue);
|
||||
--color-yellow-rgb: var(--neutral-yellow-x);
|
||||
--color-yellow: var(--neutral-yellow);
|
||||
--color-orange-rgb: var(--faded-yellow-x);
|
||||
--color-orange: var(--faded-yellow);
|
||||
--color-pink-rgb: var(--neutral-purple-x);
|
||||
--color-pink: var(--neutral-purple);
|
||||
|
||||
--background-primary: var(--dark0);
|
||||
--background-primary-alt: var(--dark0-soft);
|
||||
--background-secondary: var(--dark0-hard);
|
||||
--background-secondary-alt: var(--dark1);
|
||||
--background-modifier-border: var(--dark1);
|
||||
--background-accent: var(--dark0-soft);
|
||||
|
||||
--cursor-line-background: rgba(var(--dark1-x), 0.5);
|
||||
|
||||
--text-normal: var(--light-text);
|
||||
--text-faint: var(--light1);
|
||||
--text-muted: var(--light2);
|
||||
|
||||
--h1-color: var(--neutral-red);
|
||||
--h2-color: var(--neutral-yellow);
|
||||
--h3-color: var(--neutral-green);
|
||||
--h4-color: var(--neutral-aqua);
|
||||
--h5-color: var(--neutral-blue);
|
||||
--h6-color: var(--neutral-purple);
|
||||
|
||||
--text-highlight-bg: var(--neutral-yellow);
|
||||
--text-highlight-fg: var(--dark0-hard);
|
||||
|
||||
--text-accent: var(--neutral-yellow);
|
||||
--text-accent-hover: var(--faded-yellow);
|
||||
|
||||
--tag-color: var(--neutral-aqua);
|
||||
--tag-background: var(--dark2);
|
||||
--tag-background-hover: var(--dark1);
|
||||
|
||||
--titlebar-text-color-focused: var(--neutral-red);
|
||||
|
||||
--inline-title-color: var(--neutral-yellow);
|
||||
|
||||
--bold-color: var(--neutral-yellow);
|
||||
--italic-color: var(--neutral-yellow);
|
||||
|
||||
--checkbox-color: var(--light4);
|
||||
--checkbox-color-hover: var(--light4);
|
||||
--checkbox-border-color: var(--light4);
|
||||
--checkbox-border-color-hover: var(--light4);
|
||||
--checklist-done-color: rgba(var(--light2-x), 0.5);
|
||||
|
||||
--table-header-background: rgba(var(--dark0-x), 0.2);
|
||||
--table-header-background-hover: var(--dark2);
|
||||
--table-row-even-background: rgba(var(--dark2-x), 0.2);
|
||||
--table-row-odd-background: rgba(var(--dark2-x), 0.4);
|
||||
--table-row-background-hover: var(--dark2);
|
||||
|
||||
--text-selection: rgba(var(--neutral-red-x), 0.6);
|
||||
--flashing-background: rgba(var(--neutral-red-x), 0.3);
|
||||
|
||||
--code-normal: var(--neutral-blue);
|
||||
--code-background: var(--dark1);
|
||||
|
||||
--mermaid-note: var(--neutral-blue);
|
||||
--mermaid-actor: var(--dark2);
|
||||
--mermaid-loopline: var(--neutral-blue);
|
||||
|
||||
--icon-color-hover: var(--neutral-red);
|
||||
--icon-color-focused: var(--neutral-blue);
|
||||
|
||||
--nav-item-color-hover: var(--neutral-red);
|
||||
--nav-item-color-active: var(--neutral-aqua);
|
||||
--nav-file-tag: rgba(var(--neutral-yellow-x), 0.9);
|
||||
|
||||
--graph-line: var(--dark2);
|
||||
--graph-node: var(--light3);
|
||||
--graph-node-tag: var(--neutral-red);
|
||||
--graph-node-attachment: var(--neutral-green);
|
||||
|
||||
--calendar-hover: var(--neutral-red);
|
||||
--calendar-background-hover: var(--dark1);
|
||||
--calendar-week: var(--neutral-orange);
|
||||
--calendar-today: var(--neutral-orange);
|
||||
|
||||
--dataview-key: var(--text-faint);
|
||||
--dataview-key-background: rgba(var(--faded-red-x), 0.5);
|
||||
--dataview-value: var(--text-faint);
|
||||
--dataview-value-background: rgba(var(--neutral-green-x), 0.3);
|
||||
|
||||
--tab-text-color-focused-active: var(--neutral-yellow);
|
||||
--tab-text-color-focused-active-current: var(--neutral-red);
|
||||
}
|
||||
|
||||
.theme-light {
|
||||
--color-red-rgb: var(--faded-red-x);
|
||||
--color-red: var(--faded-red);
|
||||
--color-purple-rgb: var(--faded-purple-x);
|
||||
--color-purple: var(--faded-purple);
|
||||
--color-green-rgb: var(--faded-green-x);
|
||||
--color-green: var(--faded-green);
|
||||
--color-cyan-rgb: var(--neutral-blue-x);
|
||||
--color-cyan: var(--neutral-blue);
|
||||
--color-blue-rgb: var(--faded-blue-x);
|
||||
--color-blue: var(--faded-blue);
|
||||
--color-yellow-rgb: var(--neutral-yellow-x);
|
||||
--color-yellow: var(--neutral-yellow);
|
||||
--color-orange-rgb: var(--faded-yellow-x);
|
||||
--color-orange: var(--faded-yellow);
|
||||
--color-pink-rgb: var(--faded-purple-x);
|
||||
--color-pink: var(--faded-purple);
|
||||
|
||||
--background-primary: var(--light0-hard);
|
||||
--background-primary-alt: var(--light0-hard);
|
||||
--background-secondary: var(--light1);
|
||||
--background-secondary-alt: var(--light1);
|
||||
--background-modifier-border: var(--light2);
|
||||
--background-accent: var(--light0-soft);
|
||||
|
||||
--cursor-line-background: rgba(var(--light1-x), 0.5);
|
||||
|
||||
--text-normal: var(--dark-text);
|
||||
--text-faint: var(--dark-text-faint);
|
||||
--text-muted: var(--dark-text-muted);
|
||||
|
||||
--h1-color: var(--faded-red);
|
||||
--h2-color: var(--faded-yellow);
|
||||
--h3-color: var(--faded-green);
|
||||
--h4-color: var(--faded-aqua);
|
||||
--h5-color: var(--faded-blue);
|
||||
--h6-color: var(--faded-purple);
|
||||
|
||||
--text-highlight-bg: var(--faded-yellow);
|
||||
--text-highlight-fg: var(--light0-hard);
|
||||
|
||||
--text-accent: var(--neutral-yellow);
|
||||
--text-accent-hover: var(--faded-yellow);
|
||||
|
||||
--tag-color: var(--faded-aqua);
|
||||
--tag-background: var(--light1);
|
||||
--tag-background-hover: rgba(var(--light1-x), 0.6);
|
||||
|
||||
--titlebar-text-color-focused: var(--bright-red);
|
||||
|
||||
--inline-title-color: var(--neutral-yellow);
|
||||
|
||||
--bold-color: var(--faded-yellow);
|
||||
--italic-color: var(--faded-yellow);
|
||||
|
||||
--checkbox-color: var(--light4);
|
||||
--checkbox-color-hover: var(--light4);
|
||||
--checkbox-border-color: var(--light4);
|
||||
--checkbox-border-color-hover: var(--light4);
|
||||
--checklist-done-color: rgba(var(--dark2-x), 0.4);
|
||||
|
||||
--table-header-background: rgba(var(--light3-x), 0.4);
|
||||
--table-header-background-hover: var(--light2);
|
||||
--table-row-even-background: rgba(var(--light1-x), 0.2);
|
||||
--table-row-odd-background: rgba(var(--light1-x), 0.7);
|
||||
--table-row-background-hover: var(--light2);
|
||||
|
||||
--text-selection: rgba(var(--neutral-red-x), 0.6);
|
||||
--flashing-background: rgba(var(--neutral-red-x), 0.3);
|
||||
|
||||
--code-normal: var(--neutral-blue);
|
||||
--code-background: var(--light1);
|
||||
|
||||
--mermaid-note: var(--neutral-blue);
|
||||
--mermaid-actor: var(--light3);
|
||||
--mermaid-loopline: var(--faded-blue);
|
||||
|
||||
--icon-color-hover: var(--neutral-red);
|
||||
--icon-color-focused: var(--neutral-blue);
|
||||
|
||||
--nav-item-color-hover: var(--neutral-red);
|
||||
--nav-item-color-active: var(--faded-blue);
|
||||
--nav-file-tag: rgba(var(--faded-blue-x), 0.9);
|
||||
|
||||
--graph-line: var(--light3);
|
||||
--graph-node: var(--gray);
|
||||
--graph-node-tag: var(--faded-red);
|
||||
--graph-node-attachment: var(--neutral-green);
|
||||
|
||||
--calendar-hover: var(--neutral-red);
|
||||
--calendar-background-hover: var(--light1);
|
||||
--calendar-week: var(--neutral-red);
|
||||
--calendar-today: var(--neutral-red);
|
||||
|
||||
--dataview-key: var(--text-faint);
|
||||
--dataview-key-background: rgba(var(--faded-red-x), 0.3);
|
||||
--dataview-value: var(--text-faint);
|
||||
--dataview-value-background: rgba(var(--neutral-green-x), 0.2);
|
||||
|
||||
--tab-text-color-focused-active: var(--neutral-yellow);
|
||||
--tab-text-color-focused-active-current: var(--neutral-red);
|
||||
}
|
||||
|
||||
table {
|
||||
border: 1px solid var(--background-secondary) !important;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
thead {
|
||||
border-bottom: 2px solid var(--background-modifier-border) !important;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: 600 !important;
|
||||
border: 1px solid var(--background-secondary) !important;
|
||||
}
|
||||
|
||||
td {
|
||||
border-left: 1px solid var(--background-secondary) !important;
|
||||
border-right: 1px solid var(--background-secondary) !important;
|
||||
border-bottom: 1px solid var(--background-secondary) !important;
|
||||
}
|
||||
|
||||
.markdown-rendered tbody tr:nth-child(even) {
|
||||
background-color: var(--table-row-even-background) !important;
|
||||
}
|
||||
|
||||
.markdown-rendered tbody tr:nth-child(odd) {
|
||||
background-color: var(--table-row-odd-background) !important;
|
||||
}
|
||||
|
||||
.markdown-rendered tbody tr:nth-child(even):hover,
|
||||
.markdown-rendered tbody tr:nth-child(odd):hover
|
||||
{
|
||||
background-color: var(--table-row-background-hover) !important;
|
||||
}
|
||||
|
||||
.markdown-rendered mark {
|
||||
background-color: var(--text-highlight-bg) !important;
|
||||
color: var(--text-highlight-fg) !important;
|
||||
}
|
||||
|
||||
.markdown-rendered mark a {
|
||||
color: var(--red) !important;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.search-result-file-matched-text {
|
||||
color: var(--text-highlight-fg) !important;
|
||||
}
|
||||
|
||||
.cm-hashtag-begin:hover,
|
||||
.cm-hashtag-end:hover
|
||||
{
|
||||
color: var(--text-accent);
|
||||
/* background-color: var(--tag-background-hover); */
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
input[type=checkbox] {
|
||||
border: 1px solid var(--checkbox-color);
|
||||
}
|
||||
|
||||
input[type=checkbox]:checked {
|
||||
background-color: var(--checkbox-color);
|
||||
box-shadow: inset 0 0 0 2px var(--background-primary);
|
||||
}
|
||||
|
||||
input[type=checkbox]:checked:after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"]
|
||||
{
|
||||
line-height: var(--line-height-tight) !important;
|
||||
}
|
||||
|
||||
/* Keep highlight/marks the same between viewer and editor. */
|
||||
.cm-highlight {
|
||||
color: var(--text-highlight-fg) !important;
|
||||
}
|
||||
|
||||
/* Keep inline code the same between viewer and editor. */
|
||||
.cm-inline-code {
|
||||
border-radius: var(--radius-s);
|
||||
font-size: var(--code-size);
|
||||
padding: 0.1em 0.25em;
|
||||
}
|
||||
|
||||
/* Keep list bullet padding the same between viewer and editor. */
|
||||
.cm-formatting-list {
|
||||
padding-right: 4px !important;
|
||||
}
|
||||
|
||||
/*
|
||||
Keep sub-list indenting the same between viewer and editor.
|
||||
This assumes --list-indent is default at 2em.
|
||||
*/
|
||||
/*
|
||||
.cm-indent
|
||||
{
|
||||
text-indent: 1em !important;
|
||||
}
|
||||
*/
|
||||
|
||||
.mermaid .note {
|
||||
fill: var(--mermaid-note) !important;
|
||||
}
|
||||
|
||||
.mermaid .actor {
|
||||
fill: var(--mermaid-actor) !important;
|
||||
}
|
||||
|
||||
.mermaid .loopLine {
|
||||
stroke: var(--mermaid-loopline) !important;
|
||||
}
|
||||
|
||||
.calendar .week-num {
|
||||
color: var(--calendar-week) !important;
|
||||
}
|
||||
|
||||
.calendar .today {
|
||||
color: var(--calendar-today) !important;
|
||||
}
|
||||
|
||||
.calendar .week-num:hover,
|
||||
.calendar .day:hover
|
||||
{
|
||||
color: var(--calendar-hover) !important;
|
||||
background-color: var(--calendar-background-hover) !important;
|
||||
}
|
||||
|
||||
.markdown-embed-title {
|
||||
color: var(--yellow);
|
||||
font-weight: 600 !important;
|
||||
}
|
||||
|
||||
.cm-active {
|
||||
background-color: var(--cursor-line-background) !important;
|
||||
}
|
||||
|
||||
.nav-file-tag {
|
||||
color: var(--nav-file-tag) !important;
|
||||
}
|
||||
|
||||
.is-flashing {
|
||||
background-color: var(--flashing-background) !important;
|
||||
}
|
||||
|
||||
.dataview.inline-field-key {
|
||||
border-top-left-radius: var(--radius-s);
|
||||
border-bottom-left-radius: var(--radius-s);
|
||||
padding-left: 4px;
|
||||
font-family: var(--font-monospace);
|
||||
font-size: var(--font-smaller);
|
||||
color: var(--dataview-key) !important;
|
||||
background-color: var(--dataview-key-background) !important;
|
||||
}
|
||||
|
||||
.dataview.inline-field-value {
|
||||
border-top-right-radius: var(--radius-s);
|
||||
border-bottom-right-radius: var(--radius-s);
|
||||
padding-right: 4px;
|
||||
font-family: var(--font-monospace);
|
||||
font-size: var(--font-smaller);
|
||||
color: var(--dataview-value) !important;
|
||||
background-color: var(--dataview-value-background) !important;
|
||||
}
|
||||
|
||||
.suggestion-highlight {
|
||||
color: var(--bright-red);
|
||||
}
|
||||
|
||||
.cm-line .cm-strong {
|
||||
color: var(--bold-color) !important;
|
||||
}
|
||||
|
||||
.cm-line .cm-em {
|
||||
color: var(--italic-color) !important;
|
||||
}
|
||||
Vendored
+233
@@ -0,0 +1,233 @@
|
||||
{
|
||||
"main": {
|
||||
"id": "b16a1174288e0bd1",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "611108d8f145acf6",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "9c6ad9364f5a4daa",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "Команды htop.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "Команды htop"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "vertical"
|
||||
},
|
||||
"left": {
|
||||
"id": "a289d6f011207259",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "adda80a0459191fd",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "668a17190aa7b5aa",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "file-explorer",
|
||||
"state": {
|
||||
"sortOrder": "alphabetical",
|
||||
"autoReveal": false,
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
},
|
||||
"icon": "lucide-folder-closed",
|
||||
"title": "Файловый менеджер"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "56db8df2a74839e2",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "search",
|
||||
"state": {
|
||||
"query": "",
|
||||
"matchingCase": false,
|
||||
"explainSearch": false,
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical"
|
||||
},
|
||||
"icon": "lucide-search",
|
||||
"title": "Поиск"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "da6478727b1917c8",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "bookmarks",
|
||||
"state": {},
|
||||
"icon": "lucide-bookmark",
|
||||
"title": "Закладки"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 300
|
||||
},
|
||||
"right": {
|
||||
"id": "bb94eecdba5c39a5",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "4ac6c5ee0953bc66",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "968bb1b18ea42ffe",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "backlink",
|
||||
"state": {
|
||||
"file": "Коврижка.md",
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical",
|
||||
"showSearch": false,
|
||||
"searchQuery": "",
|
||||
"backlinkCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
"icon": "links-coming-in",
|
||||
"title": "Обратные ссылки для Коврижка"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "f71e47e84765d3cf",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outgoing-link",
|
||||
"state": {
|
||||
"file": "Коврижка.md",
|
||||
"linksCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
"icon": "links-going-out",
|
||||
"title": "Исходящие ссылки из Коврижка"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "b4763c15284c11e0",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "tag",
|
||||
"state": {
|
||||
"sortOrder": "frequency",
|
||||
"useHierarchy": true,
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
},
|
||||
"icon": "lucide-tags",
|
||||
"title": "Теги"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "45e6b4e47adf7b9a",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outline",
|
||||
"state": {
|
||||
"file": "Коврижка.md",
|
||||
"followCursor": false,
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
},
|
||||
"icon": "lucide-list",
|
||||
"title": "Структура Коврижка"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "475f88c8df9be40e",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "calendar",
|
||||
"state": {},
|
||||
"icon": "calendar-with-checkmark",
|
||||
"title": "Calendar"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "689bf50c228bd682",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "sync-status-view",
|
||||
"state": {},
|
||||
"icon": "git-compare",
|
||||
"title": "Source control"
|
||||
}
|
||||
}
|
||||
],
|
||||
"currentTab": 5
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 612.5
|
||||
},
|
||||
"left-ribbon": {
|
||||
"hiddenItems": {
|
||||
"switcher:Меню быстрого перехода": false,
|
||||
"graph:Граф": false,
|
||||
"canvas:Создать новый холст": false,
|
||||
"daily-notes:Сегодняшняя заметка": false,
|
||||
"templates:Вставить шаблон": false,
|
||||
"command-palette:Открыть палитру команд": false,
|
||||
"bases:Создать новую базу": false,
|
||||
"templater-obsidian:Templater": false,
|
||||
"obsidian-kanban:Create new board": false,
|
||||
"remotely-save:Remotely Save": false,
|
||||
"git-file-sync:Open source control": false,
|
||||
"git-file-sync:Push to GitLab": false
|
||||
}
|
||||
},
|
||||
"active": "689bf50c228bd682",
|
||||
"lastOpenFiles": [
|
||||
"Блины.md",
|
||||
"Без названия.base",
|
||||
"Work/План перехода в PROD.md",
|
||||
"Work/Докатка.md",
|
||||
"Work/ВТБ Армения.md",
|
||||
"Work/Банкомат сообщил об ошибке в принятом из Центра сообщении..md",
|
||||
"nix/Vim.md",
|
||||
"Prog/Автоконфигурация.md",
|
||||
"nix/Port Knocking.md",
|
||||
"nix/Чистка логов в linux.md",
|
||||
"Prog/Абстракция в Java.md",
|
||||
"Work/Реализации сервиса DCC для VBAM.md",
|
||||
"files/Pasted image 20260918200036.png",
|
||||
"files/Pasted image 20260918195611.png",
|
||||
"Work/Без названия.md",
|
||||
"Work/Test Case 33 для иностранного участника.md",
|
||||
"Work/Test Case 18.md",
|
||||
"Гпт.md",
|
||||
"Для антенны.md",
|
||||
"Для радио.md",
|
||||
"OpenVPN OpenWRT.md",
|
||||
"Work/Test Case 253.md",
|
||||
"Work/TranzAxis.md",
|
||||
"Work/VBAM Оценка погашения кредитов (доработка).md",
|
||||
"Безопастность.md",
|
||||
"🤖ЛОКАЛЬНЫЙ ИИ-ЭКСПЕРТ ПО БАНКОМАТНОМУ ПО.md",
|
||||
"Work/сервис код.md",
|
||||
"Work/Смена паролей.md",
|
||||
"files/Pasted image 20260421163929.png",
|
||||
"nix",
|
||||
"files/Pasted image 20260406121204.png"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
---
|
||||
title: 10 продвинутых советов по Git
|
||||
source: https://nuancesprog.ru/p/24223/
|
||||
author:
|
||||
published: 2025-05-27
|
||||
created: 2025-08-24
|
||||
description: Git — один из самых широко применяемых инструментов совместной работы при разработке ПО. Даже разработчики программного обеспечения, работающие в одиночку, часто используют Git как систему контроля версий. Большинство людей работают с Git через командную строку, но многие редакторы кода и IDE имеют интеграцию Git со встроенными инструментами, упрощающими рабочий процесс. Git используется широко, но многие разработчики имеют лишь поверхностное представление обо всем, что он может предложить. Сегодня делимся некоторыми секретами инструмента.
|
||||
tags:
|
||||
- clippings
|
||||
- "#git"
|
||||
---
|
||||
Git — один из самых широко применяемых инструментов совместной работы при разработке ПО. Даже разработчики программного обеспечения, работающие в одиночку, часто используют Git как систему контроля версий. Большинство людей работают с Git через командную строку, но многие редакторы кода и IDE имеют интеграцию Git со встроенными инструментами, упрощающими рабочий процесс. Git используется широко, но многие разработчики имеют лишь поверхностное представление обо всем, что он может предложить. Сегодня делимся некоторыми секретами инструмента.
|
||||
|
||||
Поскольку вы здесь, то, наверное, вы готовы выйти за рамки простого (но полноценного!) рабочего процесса:
|
||||
|
||||
```nginx
|
||||
git add .
|
||||
git commit -m "fix"
|
||||
git push
|
||||
```
|
||||
|
||||
Надеюсь, эти советы и рекомендации по Git повысят вашу эффективность и продуктивность. Если вы станете лучше применять инструменты, которые вам приходится использовать так же часто, как и Git, то вы сможете тратить больше времени на программирование. Разве не здорово тратить меньше времени в попытках решить, использовать `git merge` или `git rebase`?
|
||||
|
||||
## 10\. Пустые коммиты
|
||||
|
||||
Вы когда-нибудь вносили небольшие изменения в README, чтобы можно было запустить сборку CI (или какую-нибудь другую интеграцию) и попытаться отладить какую-то проблему? Раньше я делала это довольно часто, пока не узнала о следующей полезной команде:
|
||||
|
||||
```nginx
|
||||
git commit --allow empty -m 'it works!'
|
||||
```
|
||||
|
||||
Этот флаг git позволяет инициировать коммит без содержимого и миновать обычную ошибку, говорящую, что у вас нет подготовленных файлов. Этот прием особенно полезен для того, чтобы запустить рабочий процесс без мелких изменений в README или какого-нибудь другого файла. Команда `git diff` не покажет никаких изменений, но коммит полезен, когда нужно запустить CI-прогон или даже развертывание в продакшне, а отправлять какой-то произвольный код не нужно.
|
||||
|
||||
## 9\. Приятный лог
|
||||
|
||||
Команда `git log` — очень полезный способ просмотреть последние изменения кодовой базы, но глаза быстро разбегаются, если запускать ее в проекте с большим количеством веток. Еще одна хитрость git — сделать `git log` интереснее, добавив немного цвета, чтобы помочь глазам и мозгу лучше читать вывод на экране.
|
||||
|
||||
Чтобы получить улучшенный вывод `git log`, не меняя конфигурацию Git, просто запустите эту команду:
|
||||
|
||||
```sql
|
||||
git log --pretty=oneline --graph --decorate --all</span >
|
||||
```
|
||||
|
||||
Вот пример того, что можно ожидать:
|
||||
|
||||
Вы заметите как цветовое кодирование, так и разумное применение `|` и `\\`, чтобы обозначить ветки. Хотя эти флаги ничего не меняют в логе функционально, они, безусловно, значительно облегчают понимание вывода `git log`.
|
||||
|
||||
## 8\. Очистка локальных веток
|
||||
|
||||
Если вы похожи на меня, то вам нравится поддерживать относительный порядок на рабочем месте, в том числе на компьютере.
|
||||
|
||||
Разработка ПО способна быстро привести к замешательству, особенно если вы работаете с большим количеством репозиториев. Ситуацию усугубляет работа с Git, который в каждом репозитории может оставить несколько ветвей на долгое время уже после того, когда эти ветки не нужны.
|
||||
|
||||
Наверное, со временем вы добавили в конфигурацию Git разные вещи, чтобы изменить свои ощущения от работы. А мне очень понравился параметр `git config`, при выполнении `fetch` или `pull` удаляющий любую локальную ветку, которая удалена из репозитория на сервере.
|
||||
|
||||
Быстро установить этот параметр можно, выполнив:
|
||||
|
||||
```nginx
|
||||
git config --global fetch.prune true
|
||||
```
|
||||
|
||||
Еще один совет по Git, кроме изменения конфигурации, — пойти дальше и удалить локальные ветки, которые уже влиты в `master`.
|
||||
|
||||
Выполните эту команду:
|
||||
|
||||
```nginx
|
||||
git branch --merged master | grep -v "master" | xargs -n 1 git branch -d
|
||||
```
|
||||
|
||||
## 7\. Поиск убранного коммита через git reflog
|
||||
|
||||
Выполнять `git rebase` крайне полезно, особенно с флагом `--interactive`. Однако перебазирование может быть опасно. При локальном `git rebase` вам придется принудительно перезаписать изменения в репозитории на сервере. Выполняя перебазирование достаточно часто, вы в конечном счете случайно удалите коммит или несколько.
|
||||
|
||||
Если вам не повезло так же, как и мне, или вы не информированы, то можете даже случайно удалить работу, выполненную за неделю. Один из моих любимых советов — выполните `git reflog`, чтобы вернуть недостающие коммиты из мертвых.
|
||||
|
||||
Поскольку вы закоммитили свою работу, она все еще находится в вашей локальной рабочей копии репозитория вне зависимости от того, делали ли вы `git rebase`. С помощью `git reflog` можно найти хеш SHA1, который вам нужен. Затем запустите `git checkout <SHA1>`, скопируйте все, что вам нужно, и запустите `git checkout HEAD`, чтобы вернуться к самому последнему коммиту в локальной ветке. И кризис предотвращен!
|
||||
|
||||
## 6\. Алиас для git blame
|
||||
|
||||
Время от времени возникает ошибка, которую вы не сможете обнаружить самостоятельно. А иногда захочется или будет нужно обратиться к человеку, который, похоже, написал неработающий код. Возможно, вам даже захочется поговорить с автором, чтобы лучше понять контекст кода.
|
||||
|
||||
Чтобы выяснить, кто написал строку кода, часто используют `git blame`. Команда `git blame` показывает, кто на самом деле написал строку кода, когда написал ее и в каком коммите она добавлена в кодовую базу. Эта функциональность встроена во многие редакторы кода и IDE — имена отображаются рядом с каждой строкой кода!
|
||||
|
||||
Это недооцененная функция Git, но запускать `git blame` не очень приятно. Важно, чтобы команды разработчиков ПО формировали культуру без обвинений, а формулировка `git blame` может создать неподходящий прецедент.
|
||||
|
||||
И вот хорошая новость! На самом деле вы можете переименовать команду, используя алиас из вашей конфигурации Git. Это самый подвижнический из советов здесь. Чтобы создать псевдоним `git balme`, который будет вызываться как `git investigate`, выполните команду:
|
||||
|
||||
```cs
|
||||
git config --global alias.investigate blame
|
||||
```
|
||||
|
||||
`investigate` можно заменить на любое слово! Ваша конфигурация Git также может содержать псевдонимы для других команд, а не только `git blame`, если захотите.
|
||||
|
||||
## 5\. Команда git add -p для поэтапного коммита
|
||||
|
||||
В начале статьи я обещала, что мы оставим `git add` в прошлом. Наверное, вы уже знаете, что все изменения можно в локальном репозитории можно подготовить к коммиту через `git add`.
|
||||
|
||||
И, вероятно, *еще* вы знаете, что это делается более многословно. С просмотром того, какие изменены файлы, через `git status` и с проверкой изменения файла с помощью `git diff <filename>`, а также с подготовкой файлов по отдельности с помощью `git add <filename>`. Нормально, если вы готовите к коммиту один файл, но это может быстро стать проблемой, когда у вас большой набор локальных изменений.
|
||||
|
||||
Эта опция многословнее, но это важный шаг, чтобы проверить, что вы подготовили локальные изменения, которые собираетесь закоммитить. Нет ничего хуже, чем закоммитить что-нибудь случайно, особенно если код содержит конфиденциальные данные, например секрет приложения. К счастью, есть способ внести изменения еще лучше!
|
||||
|
||||
Вносить изменения можно *по кусочку*, выполнив:
|
||||
|
||||
```nginx
|
||||
git add -p
|
||||
```
|
||||
|
||||
Вероятно, этот совет сильнее всего ускорит вашу работу. При такой подготовке коммитов в Git открывается интерактивная подсказка. Она показывает разделы каждого файла, которые были изменены. Это дает возможности подготовить их к коммиту или пропустить и многие другие возможности.
|
||||
|
||||
Команда упрощает поэтапную обработку изменений валидацией каждого изменения, а еще она полезна, если вы хотите закоммитить только часть изменений файла. Иногда я увлекаюсь до степени понимания того, что изменений у меня в файле гораздо больше, чем имеет смысл коммитить вместе.
|
||||
|
||||
Вот пример:
|
||||
|
||||
## 4\. Кусочки кода в git stash
|
||||
|
||||
Флаг `-p` предназначен не только для подготовки кода! Его можно использовать с `git stash`, если не хочется выполнять `git stash` *на всех файлах* или на одном файле с изменениями целиком.
|
||||
|
||||
Чтобы поэтапно выполнить `git stash` для кода в рабочем каталоге, выполните:
|
||||
|
||||
```nginx
|
||||
git stash -p
|
||||
```
|
||||
|
||||
При запуске вы увидите интерактивный экран, аналогичный экрану команды `git add -p`, который шаг за шагом проведет вас через каждое изменение по одному разделу за раз.
|
||||
|
||||
## 3\. Автоматизация git bisect
|
||||
|
||||
Хотя это самый сложный из приемов Git, автоматизация `git bisect` со временем может принести пользу. Если вы уже понимаете, [как использовать git bisect](https://www.metaltoad.com/blog/beginners-guide-git-bisect-process-elimination), то знаете, что работа с `git bisect` может потребовать большого количества команд. А это, в свою очередь, может сделать ее не такой практичной.
|
||||
|
||||
Она сложная, поэтому вам может быть интересно узнать, что на самом деле можно написать скрипт, который автоматизирует часть процесса. [Написав скрипт git bisect](https://git-scm.com/docs/git-bisect#_bisect_run), для запуска скрипта вы сможете использовать простую команду:
|
||||
|
||||
`git bisect run my_script аргументы`
|
||||
|
||||
## 2\. Эмоджи в Git
|
||||
|
||||
Хотя это, наверное, самый бесполезный из этих советов этой статьи, эмоджи в сообщениях о коммитах — простой способ добавить веселья вам и вашим коллегам! Можно легко вставлять смайлы в сообщения о коммитах, если знаете их названия. Воспользуйтесь шпаргалкой [Gitmoji](https://gitmoji.dev/), чтобы выбрать подходящий смайлик и вставить его в виде текста в сообщение о коммите:
|
||||
|
||||
```nginx
|
||||
git commit -m ":package: Add a docker container to the app"
|
||||
```
|
||||
|
||||
## 1\. Справочная документация Git
|
||||
|
||||
Меня всегда удивляет, как быстро я забываю о встроенных справочных инструментах в ряде приложений и интерфейсах командной строки. Я буду пытаться найти ответ в бесконечном количестве ответов на Stack Overflow, чтобы решить свою проблему.
|
||||
|
||||
И, наконец, вспомню, что могу получить помощь, просто запустив:
|
||||
|
||||
```nginx
|
||||
git help
|
||||
```
|
||||
|
||||
Вся документация Git у вас под рукой как часть интерфейса командной строки Git! Если вы новичок в Git или просто хотите освежить знания, то командой ниже можете даже перейти к руководству:
|
||||
|
||||
```nginx
|
||||
git help tutorial
|
||||
```
|
||||
|
||||
В этом руководстве вы познакомитесь с основами.
|
||||
|
||||
Наконец, если вы хотите получить документацию по конкретной команде, то можете использовать `man`, чтобы получить мануал. Например, выполните `man git-log`, если хотите больше узнать о команде `git log`.
|
||||
|
||||
## Еще больше советов по Git
|
||||
|
||||
Вот и мои десять любимых советов и приемов с Git. Будь то настройка конфигурации, подготовка изменений через `git add -p`, `-p` с `git stash` или `git reflog`, эти трюки сделают Git полезнее для вас и вашей команды. Надеюсь, вы наткнулись на что-нибудь новое или освежили память о команде, которую забыли.
|
||||
|
||||
Git — удивительно мощный инструмент, и мы должны использовать его по максимуму. Если вы нашли какой-то трюк с Git полезным, поделитесь им со своими коллегами!
|
||||
|
||||
Читайте также:
|
||||
|
||||
- [Git: простое руководство о том, как стать мастером контроля версий](https://nuancesprog.ru/p/16934/)
|
||||
- [Руководство по Git для новичков](https://nuancesprog.ru/p/21021/)
|
||||
- [7 полезных репозиториев GitHub для JS-программистов](https://nuancesprog.ru/p/17131/)
|
||||
|
||||
Читайте нас в [Telegram](https://t.me/nuancesprog), [VK](https://vk.com/nuancesprog) и [Дзен](https://dzen.ru/nuancesprog.ru)
|
||||
|
||||
---
|
||||
|
||||
*Перевод статьи* [Julie Kent](https://nuancesprog.ru/p/24223/%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0_%D0%BD%D0%B0_%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B0):
|
||||
@@ -0,0 +1,372 @@
|
||||
---
|
||||
title: Linux Bash Справочник
|
||||
source: https://www.glukhov.org/ru/post/2024/04/bash-cheat-sheet/
|
||||
author:
|
||||
- "[[Рост Глухов | Персональный сайт и технический блог]]"
|
||||
published: 2024-04-18
|
||||
created: 2025-08-23
|
||||
description: "Bash: Справочник"
|
||||
tags:
|
||||
- clippings
|
||||
- "#linux"
|
||||
- "#bash"
|
||||
---
|
||||
Не очень подробный список, просто несколько полезных для меня пунктов
|
||||
|
||||

|
||||
|
||||
## Проверка версии Linux Ubuntu
|
||||
|
||||
Метод 1
|
||||
|
||||
```bash
|
||||
lsb_release -a
|
||||
```
|
||||
|
||||
выдаст что-то вроде
|
||||
|
||||
```bash
|
||||
Нет доступных модулей LSB.
|
||||
Идентификатор дистрибутива: Linuxmint
|
||||
Описание: Linux Mint 22.1
|
||||
Версия: 22.1
|
||||
Кодовое имя: xia
|
||||
```
|
||||
|
||||
Метод 2
|
||||
|
||||
```bash
|
||||
cat /etc/os-release
|
||||
```
|
||||
|
||||
выдаст что-то вроде
|
||||
|
||||
```bash
|
||||
NAME="Linux Mint"
|
||||
VERSION="22.1 (Xia)"
|
||||
ID=linuxmint
|
||||
ID_LIKE="ubuntu debian"
|
||||
PRETTY_NAME="Linux Mint 22.1"
|
||||
VERSION_ID="22.1"
|
||||
HOME_URL="https://www.linuxmint.com/"
|
||||
SUPPORT_URL="https://forums.linuxmint.com/"
|
||||
BUG_REPORT_URL="http://linuxmint-troubleshooting-guide.readthedocs.io/en/latest/"
|
||||
PRIVACY_POLICY_URL="https://www.linuxmint.com/"
|
||||
VERSION_CODENAME=xia
|
||||
UBUNTU_CODENAME=noble
|
||||
```
|
||||
|
||||
## Архивирование и распаковка
|
||||
|
||||
Сжатие
|
||||
|
||||
```bash
|
||||
tar -zcvf archive-name.tgz directory-name
|
||||
```
|
||||
|
||||
Распаковка
|
||||
|
||||
```bash
|
||||
tar -zxvf archive-name.tgz
|
||||
```
|
||||
|
||||
## Удалённые серверы
|
||||
|
||||
Передача идентификатора пользователя на удалённый сервер
|
||||
|
||||
```bash
|
||||
ssh-copy-id user@10.0.0.225
|
||||
```
|
||||
|
||||
Это позволит войти без пароля в следующий раз, например:
|
||||
|
||||
```bash
|
||||
ssh user@10.0.0.225
|
||||
```
|
||||
|
||||
Загрузка файла
|
||||
|
||||
```bash
|
||||
scp ~/file.ext user@host-ip:/home/user/file.ext
|
||||
```
|
||||
|
||||
Загрузка папки с вложенными элементами рекурсивно
|
||||
|
||||
```bash
|
||||
scp -r user@host-ip:/home/user/dir ~/dir
|
||||
```
|
||||
|
||||
## Папки и файлы
|
||||
|
||||
Проверка на существование
|
||||
|
||||
```bash
|
||||
# создать папку, если она не существует, со всеми промежуточными папками
|
||||
[ -d $repdir ] || mkdir -p $repdir
|
||||
|
||||
# или
|
||||
if [ -d $fname ]; then
|
||||
echo "Файл не существует: $fname"
|
||||
return
|
||||
fi
|
||||
```
|
||||
|
||||
Создание папки для определённого пользователя
|
||||
|
||||
```bash
|
||||
sudo mkdir dir1
|
||||
sudo chown specific_user dir1
|
||||
sudo chown :specific_group dir1
|
||||
```
|
||||
|
||||
Итерация по файлам в папке
|
||||
|
||||
```bash
|
||||
# этот пример конвертирует все jpg файлы в некоторой папке в fits
|
||||
for f in some-folder/*.jpg
|
||||
do
|
||||
convert "$f" "${f/.jpg/.fits}"
|
||||
done
|
||||
```
|
||||
|
||||
Объединение всех файлов в один
|
||||
|
||||
```bash
|
||||
cat ./* > merged.txt
|
||||
```
|
||||
|
||||
## Добавление выполнения команды в crontab
|
||||
|
||||
```bash
|
||||
(crontab -l 2>/dev/null | \
|
||||
grep -v control-marker-1; \
|
||||
echo '*/15 * * * * /bin/bash /home/user/stest/stest.sh /home/user/stest >> /home/user/stest/stest.log 2>&1 #control-marker-1') | \
|
||||
crontab -
|
||||
```
|
||||
|
||||
здесь:
|
||||
|
||||
- \*/15 - выполняется каждые 15 минут
|
||||
- control-marker-1 - идентификатор этой команды в конфигурации cron для обновления её в следующий раз с тем же скриптом
|
||||
- /bin/bash - команда для выполнения
|
||||
- /home/user/stest/stest.sh - параметр bash - bash выполнит этот скрипт
|
||||
- /home/user/stest - параметр скрипта - будет доступен как $1
|
||||
- /home/user/stest/stest.log - файл журнала с выводом консоли stest.sh
|
||||
|
||||
Проверка
|
||||
|
||||
```bash
|
||||
grep /home/user/stest/stest.sh /var/log/syslog
|
||||
crontab -e
|
||||
```
|
||||
|
||||
## Журналы
|
||||
|
||||
Просмотр журнала в режиме реального времени
|
||||
|
||||
```bash
|
||||
sudo tail -f /var/log/megalog.log
|
||||
```
|
||||
|
||||
## Код состояния curl
|
||||
|
||||
```bash
|
||||
response=$(curl --write-out '%{http_code}' --silent --output /dev/null servername)
|
||||
|
||||
# или
|
||||
|
||||
url='http://localhost:8080/'
|
||||
status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})
|
||||
|
||||
[[ $status == 500 ]] || [[ $status == 000 ]] && echo restarting ${url} # выполнить логику запуска/перезапуска
|
||||
```
|
||||
|
||||
## Оставить команду ssh работающей после выхода
|
||||
|
||||
[https://stackoverflow.com/questions/954302/how-to-make-a-program-continue-to-run-after-log-out-from-ssh](https://stackoverflow.com/questions/954302/how-to-make-a-program-continue-to-run-after-log-out-from-ssh)
|
||||
|
||||
Предположим, у вас запущена программа в переднем плане, нажмите
|
||||
|
||||
- ctrl-Z, затем:
|
||||
|
||||
\[1\]+ Остановлено myprogram
|
||||
|
||||
- disown -h %1
|
||||
- bg 1
|
||||
|
||||
\[1\]+ myprogram &
|
||||
|
||||
- logout
|
||||
|
||||
## Генерация JSON
|
||||
|
||||
Установите jo
|
||||
|
||||
```bash
|
||||
sudo apt-get install jo
|
||||
```
|
||||
```bash
|
||||
a="123"
|
||||
b="45语
|
||||
jo "model=a" "prompt=b" "stream=false"
|
||||
```
|
||||
|
||||
выдаст
|
||||
|
||||
```bash
|
||||
{"model":"a", "prompt":"b", "stream":false}
|
||||
```
|
||||
|
||||
Сlightly более сложный пример:
|
||||
|
||||
```bash
|
||||
jo -p name=Jane point[]=1 point[]=2 geo[lat]=10 geo[lon]=20
|
||||
{
|
||||
"name": "Jane",
|
||||
"point": [
|
||||
1,
|
||||
2
|
||||
],
|
||||
"geo": {
|
||||
"lat": 10,
|
||||
"lon": 20
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Форматирование JSON
|
||||
|
||||
Используйте
|
||||
|
||||
```bash
|
||||
| jq .
|
||||
```
|
||||
|
||||
Для форматирования JSON, созданного выше:
|
||||
|
||||
```bash
|
||||
a="123"
|
||||
b="456"
|
||||
jo "model=$a" "prompt=$b" "stream=false" | jq .
|
||||
```
|
||||
|
||||
Форматированный JSON будет:
|
||||
|
||||
```bash
|
||||
{
|
||||
"model": 123,
|
||||
"prompt": 456,
|
||||
"stream": false
|
||||
}
|
||||
```
|
||||
|
||||
## Парсинг JSON и возврат значения определённого поля
|
||||
|
||||
Сначала установите jq
|
||||
|
||||
```bash
|
||||
sudo apt-get install jq
|
||||
```
|
||||
|
||||
Используйте
|
||||
|
||||
```bash
|
||||
| jq -r '.fieldName'
|
||||
```
|
||||
|
||||
Например, парсинг вывода вызова Ollama:
|
||||
|
||||
```bash
|
||||
curl http://localhost:11434/api/generate -d '{
|
||||
"model": "llama3",
|
||||
"prompt": "Why is the sky blue?",
|
||||
"stream": false
|
||||
}' | jq -r '.response'
|
||||
```
|
||||
|
||||
## Подсчёт слов в файле
|
||||
|
||||
Подсчёт слов:
|
||||
|
||||
```bash
|
||||
wc -w filename.txt
|
||||
```
|
||||
|
||||
вернёт что-то вроде
|
||||
|
||||
```bash
|
||||
261 filename.txt
|
||||
```
|
||||
|
||||
Если вы хотите просто число, вы можете вырезать первое слово, которое является числом
|
||||
|
||||
```bash
|
||||
words=\`wc -w filename.txt | cut -f1 -d' '\`
|
||||
echo "$words слов"
|
||||
```
|
||||
|
||||
Или используйте wc так:
|
||||
|
||||
```bash
|
||||
words=\`wc -w < filename.txt\`
|
||||
echo "$words слов"
|
||||
```
|
||||
|
||||
## Проверка, сколько места занимает директория на HDD
|
||||
|
||||
```bash
|
||||
du ~/dirname
|
||||
```
|
||||
|
||||
## Получение имени папки, в которой находится выполняемый скрипт
|
||||
|
||||
```bash
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
```
|
||||
|
||||
## Измерение времени выполнения скрипта
|
||||
|
||||
Один из вариантов - использовать функцию time
|
||||
|
||||
```bash
|
||||
time your_script.sh
|
||||
```
|
||||
|
||||
Другой способ немного сложнее:
|
||||
|
||||
```bash
|
||||
start=\`date +%s\`
|
||||
|
||||
# очень важный код
|
||||
# здесь
|
||||
|
||||
end=\`date +%s\`
|
||||
|
||||
runtime=$((end-start))
|
||||
```
|
||||
|
||||
## Сравнение двух файлов с помощью VS Code
|
||||
|
||||
```bash
|
||||
code -d <файл 1> <файл 2>
|
||||
```
|
||||
|
||||
## Проверка доступных пакетов в репозитории Ubuntu
|
||||
|
||||
```bash
|
||||
sudo apt-cache policy <packageName>
|
||||
```
|
||||
|
||||
## Полезные ссылки
|
||||
|
||||
- [Справочник по Python](https://www.glukhov.org/ru/post/2024/08/python-cheat-sheet/)
|
||||
- [Справочник по Conda](https://www.glukhov.org/ru/post/2024/10/conda-cheatsheet/ "Справочник по Conda")
|
||||
- [Синхронизация закладок с Floccus](https://www.glukhov.org/ru/post/2024/08/sync-bookmarks-floccus/)
|
||||
- [Переустановка Linux](https://www.glukhov.org/ru/post/2024/04/reinstall-linux/)
|
||||
- [Справочник по Ollama](https://www.glukhov.org/ru/post/2024/12/ollama-cheatsheet/ "Справочник по Ollama")
|
||||
- [Справочник по Docker](https://www.glukhov.org/ru/post/2024/10/docker-cheatsheet/ "список и описание наиболее часто используемых и полезных команд Docker - справочник по Docker")
|
||||
- [Справочник по Kubernetes](https://www.glukhov.org/ru/post/2024/10/kubernetes-cheatsheet/ "список и описание наиболее часто используемых и полезных команд k8s - справочник по k8s")
|
||||
- [Справочник по Markdown](https://www.glukhov.org/ru/post/2024/03/markdown-cheatsheet/ "Полный справочник по Markdown")
|
||||
- [Кодирование и декодирование Base64 в Windows, Linux и Mac](https://www.glukhov.org/ru/post/2025/04/base64/ "Справочник по кодированию/декодированию Base64 в Linux, Windows и Mac")
|
||||
- [Декодирование и вывод JWT токена](https://www.glukhov.org/ru/post/2025/04/decode-and-print-jwt-token/ "Как декодировать и вывести полезную нагрузку JWT токена в Linux bash")
|
||||
- [Параметры командной строки MinIO](https://www.glukhov.org/ru/post/2025/05/minio-cheatsheet/ "Справочник по параметрам командной строки MinIO")
|
||||
@@ -0,0 +1,341 @@
|
||||
---
|
||||
title: "XML-формат: что это такое и как открыть файл — журнал «Код»"
|
||||
source: https://thecode.media/chto-takoe-xml/
|
||||
author:
|
||||
published: 2025-06-30
|
||||
created: 2025-08-24
|
||||
description: Рассказываем и показываем на примерах, что такое XML-формат файлов, как он устроен и где применяется.
|
||||
tags:
|
||||
- clippings
|
||||
- "#XML"
|
||||
---
|
||||
Когда мы говорили [о разметке в Маркдауне](https://thecode.media/markdown/), то там смысл был такой: есть текст, а мы его размечаем специальными символами, чтобы он хорошо выглядел. Теперь перейдём на этап выше — будем форматировать данные на уровне логики с помощью XML.
|
||||
|
||||
👉 XML нужен для работы с техническим текстом, где всё строго, упорядоченно и логично. Его, конечно, можно применить и к художественному тексту, но выйдет так себе.
|
||||
|
||||
## Что такое XML-формат
|
||||
|
||||
XML — это сокращение от eXtensible Markup Language, а переводится это как «расширяемый язык разметки». Смысл XML в том, чтобы выстроить внутри документа логическую структуру — чтобы было видно, что к чему относится и как всё связано между собой, в каком формате представлены данные.
|
||||
|
||||
### Зачем нужен
|
||||
|
||||
С помощью XML можно:
|
||||
|
||||
- записать оргструктуру компании или любую другую иерархию — «этот подчиняется тому»;
|
||||
- разметить текст по смыслу — «тут важное, там второстепенное, вот это поясняет вон то»;
|
||||
- хранить типовые данные — например, имена артистов, названия их альбомов и треки, или настройку какой-нибудь программы, или скрипты;
|
||||
- разметить веб-страницу по смыслу и отдать эту разметку алгоритму, который сам нарисует дизайн;
|
||||
- разметить текст для дальнейшего машинного обучения;
|
||||
- хранить результаты работы программ, которые работают с текстом, — например, ничто не мешает текстовым редакторам хранить документы со всем оформлением в формате XML.
|
||||
|
||||
И многое другое, где нужен порядок, структура и работа с текстовыми данными.
|
||||
|
||||

|
||||
|
||||
Что такое XML-формат и для чего он нужен
|
||||
|
||||
## В чём сила XML
|
||||
|
||||
Сила XML в том, что данные здесь представляются как обычный текст, размеченный тегами (как в HTML). Например, чтобы записать оргструктуру компании в XML, не нужно рисовать схему в графическом редакторе, достаточно правильно разметить текст с именами и должностями. Файлики получаются маленькими, их легко обрабатывать.
|
||||
|
||||
[База по вёрстке: основы HTML](https://thecode.media/baza-po-vyorstke-osnovy-html/)
|
||||
|
||||
И ещё сила XML в том, что эти данные может прочитать и обработать компьютер. Например, если мы передаём ему оргструктуру компании, компьютер поймёт её: кто кому подчиняется, что куда входит и т. д. Для сравнения: если скормить компьютеру схему, нарисованную в графическом редакторе, он её не поймёт.
|
||||
|
||||
А вот если XML хорошо составлен, его также может понять человек.
|
||||
|
||||
Вам может быть интересно:
|
||||
|
||||
[ Markdown: что это и кому нужно](https://thecode.media/markdown/)
|
||||
|
||||
## Из чего состоит XML
|
||||
|
||||
Внешне XML очень похож на HTML: в нём тоже всё пишется в угловых скобках, есть закрывающие теги и параметры — аналоги классов и стилей. Но, в отличие от HTML, здесь нет обязательных тегов или вообще каких-то обязательных элементов. Объясним, как это работает, на примере.
|
||||
|
||||
[Самые частые ошибки в HTML-вёрстке](https://thecode.media/samye-chastye-oshibki-v-html-vyorstke/)
|
||||
|
||||
Допустим, у нас есть такой текст, из которого нужно сделать XML-документ:
|
||||
|
||||
*«По состоянию на 22 мая 2025 журнал „Код“ работает и в редакции есть главред Михаил Полянин и авторы Кристина Тульцева и Игорь Росляков».*
|
||||
|
||||
### Теги и атрибуты
|
||||
|
||||
Основное тело XML-документа состоит из тегов и атрибутов.
|
||||
|
||||
Теги образуют всю структуру файла. Если вы немного знакомы с HTML, то увидите, что здесь они выглядят так же. В основном теги бывают открывающие (`<tag>`) и закрывающие (`</tag>`). Но, в отличие от HTML, в XML можно использовать любые теги, которые нужны по логике создания файла.
|
||||
|
||||
Атрибуты — это дополнительные параметры тега, которые записываются внутри открывающего тега. Они заключены в кавычки. Может выглядеть так:
|
||||
|
||||
```markup
|
||||
<tag attr="value">
|
||||
```
|
||||
|
||||
### Комментарии и специальные символы
|
||||
|
||||
Комментарии в XML такие же, как в HTML. Это текстовые пометки, которые не влияют на остальной файл:
|
||||
|
||||
```markup
|
||||
<!-- это комментарий, он не влияет на файл -->
|
||||
```
|
||||
|
||||
Спецсимволы — это символы вроде угловых обозначений тегов. Мы не можем их использовать между настоящими тегами в чистом виде, потому что тогда файл сломается: он подумает, что мы открываем новый тег или делаем ещё какое-то действие, а нам на самом деле нужно просто поставить символ в текст.
|
||||
|
||||
[Что такое формат JSON и как с ним работать](https://thecode.media/json/)
|
||||
|
||||
Для работы со спецсимволами нужно использовать соответствующие им наборы других символов, которые ещё называются сущности. Если мы поставим в текст сущности, машина на выходе выведет как раз тот спецсимвол, который нам нужен.
|
||||
|
||||
Например, амперсанд `&` относится к числу спецсимволов, поэтому нельзя сделать так:
|
||||
|
||||
```markup
|
||||
<title> Sanford&Son</title>
|
||||
```
|
||||
|
||||
Вместо этого нужно так:
|
||||
|
||||
```markup
|
||||
<title> Sanford&Son</title>
|
||||
```
|
||||
|
||||
Длиннее, зато работает.
|
||||
|
||||
Вот основные спецсимволы и соответствующие им сущности:
|
||||
|
||||

|
||||
|
||||
Источник: developer.mozilla.org
|
||||
|
||||
### Пролог
|
||||
|
||||
Любой XML начинается с пролога, это первая строка документа. В ней нужно написать, что перед нами именно XML:
|
||||
|
||||
```markup
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
```
|
||||
|
||||
Пролог говорит, что ниже будет XML-разметка. Иначе программа-обработчик не будет знать, что с ним делать — рисовать как HTML или выводить как просто текст?
|
||||
|
||||
[Делаем сами себе игру для Android](https://thecode.media/stack-game-3/)
|
||||
|
||||
Что есть в прологе:
|
||||
|
||||
- Версия XML. Обычно 1.0.
|
||||
- Кодировка для корректной работы с символами текста. В нашем примере это UTF-8.
|
||||
|
||||
### Корневой элемент
|
||||
|
||||
Внутри XML-документа всегда есть корневой тег-элемент — внутри него лежит всё остальное. Так как в XML мы придумываем названия для разметки сами, то пусть этот элемент будет называться `actual` (это название может быть любым):
|
||||
|
||||
```markdown
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<actual>
|
||||
<!-- содержимое корневого элемента -->
|
||||
</actual>
|
||||
```
|
||||
|
||||
### Содержимое внутри корневого элемента
|
||||
|
||||
Теперь разбираем содержимое. Первое, что мы видим в документе, — это дата, поэтому можем сделать отдельный раздел со статусом издания. В него будет входить значение `Active` (издание работает) и два параметра — дата последней проверки и статус этой проверки. Сам элемент мы назовём `status`:
|
||||
|
||||
```markdown
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<actual>
|
||||
<!-- содержимое корневого элемента -->
|
||||
<status lastUpd = "22.05.2025" checked = "true">
|
||||
Active
|
||||
</status>
|
||||
</actual>
|
||||
```
|
||||
|
||||
Это очень похоже на стили и классы в HTML, но работает иначе: мы просто указываем параметры и их значения, а не подключаем какие-то внешние данные или правила.
|
||||
|
||||
Ещё вы могли заметить, что мы пишем дату в нестандартном формате (с точки зрения компьютера). Так можно: если мы потом будем писать обработчик этого XML, мы сможем научить его читать именно этот формат даты.
|
||||
|
||||
[Почему программистам сложно работать со временем в программах](https://thecode.media/timezone/)
|
||||
|
||||
👉 Это история о том, что XML — это просто полочки, на которые мы раскладываем данные. Какие там данные — ему не важно.
|
||||
|
||||
Добавим ниже сведения про название журнала:
|
||||
|
||||
```markdown
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<actual>
|
||||
<!-- содержимое корневого элемента -->
|
||||
<status lastUpd = "22.05.2025" checked = "true">
|
||||
Active
|
||||
</status>
|
||||
<media type = "online">
|
||||
Журнал «Код»
|
||||
</media>
|
||||
</actual>
|
||||
```
|
||||
|
||||
Новый элемент мы назвали `media` — так человеку будет проще прочитать и понять, что внутри, а компьютеру всё равно. Последнее — добавим информацию о составе редакции. Обратите внимание, что появилась вложенная структура: внутри элемента person есть три дочерних элемента: `name`, `lastname` и `role`. Это значит, что они относятся к родительскому элементу, а не живут сами по себе:
|
||||
|
||||
```markdown
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<actual>
|
||||
<!-- содержимое корневого элемента -->
|
||||
<status lastUpd = "22.05.2025" checked = "true">
|
||||
Active
|
||||
</status>
|
||||
<media type = "online">
|
||||
Журнал «Код»
|
||||
</media>
|
||||
<!-- редакция -->
|
||||
<person>
|
||||
<name>
|
||||
Михаил
|
||||
</name>
|
||||
<lastname>
|
||||
Полянин
|
||||
</lastname>
|
||||
<role>
|
||||
главред
|
||||
</role>
|
||||
</person>
|
||||
<person>
|
||||
<name>
|
||||
Кристина
|
||||
</name>
|
||||
<lastname>
|
||||
Тульцева
|
||||
</lastname>
|
||||
<role>
|
||||
редактор
|
||||
</role>
|
||||
</person>
|
||||
<person>
|
||||
<name>
|
||||
Игорь
|
||||
</name>
|
||||
<lastname>
|
||||
Росляков
|
||||
</lastname>
|
||||
<role>
|
||||
редактор
|
||||
</role>
|
||||
</person>
|
||||
</actual>
|
||||
```
|
||||
|
||||
Таким способом можно разобрать на логические составляющие любой технический или информационный документ — от инструкции к чайнику до ежегодного отчёта для инвесторов. Главное, не запутаться в элементах и чётко понимать, что от чего зависит и куда вкладывается.
|
||||
|
||||
### Секции CDATA
|
||||
|
||||
Это блок с дополнительными тегами внутри тега. Внутри можно вставить любой текст, даже спецсимволы. Выглядит так:
|
||||
|
||||
```markdown
|
||||
<cdata_example>
|
||||
<![CDATA[
|
||||
Внутри CDATA можно писать <, >, & без экранирования
|
||||
]]>
|
||||
</cdata_example>
|
||||
```
|
||||
|
||||
CDATA — способ сказать машине, чтобы она не обрабатывала этот блок как XML. Получается что-то вроде больших комментариев, но не совсем. CDATA затрудняет работу: поиск по этому разделу становится сложнее, он может мешать созданным шаблонам.
|
||||
|
||||
Главное, что XML создан для работы со структурированными данными, а CDATA работает как бы против этой идеи: это чёрный ящик, внутри которого может быть что угодно. Его нельзя проверить схемой, и он не поддерживает механизмы для усиления надёжности работы XML.
|
||||
|
||||
Иногда CDATA бывает полезен, но это особые случаи. Например, нужно встроить в файл фрагмент текста с большим количеством спецсимволов, такой как код.
|
||||
|
||||
## Где нужен XML-формат
|
||||
|
||||
XML применяют везде, где нужно выделить логическое содержимое документа, чтобы потом его можно было как-то обработать. Например, если у вас есть размеченный XML-файл с названием и характеристиками товаров, то можно научить сервер обрабатывать его как угодно: выводить название в заголовке или простым текстом, понимать, где лежит цена, откуда брать описание и к какому разделу отнести этот товар.
|
||||
|
||||
Ещё XML применяют в API, когда идёт ответ от сервера в виде XML-файлов.
|
||||
|
||||
## Как открыть XML-файл
|
||||
|
||||
Способов несколько. Всё зависит от того, что вы потом хотите сделать с файлом.
|
||||
|
||||
### На компьютере
|
||||
|
||||
Если файл нужно только открыть и просмотреть, проще всего перетащить его в поле адресной строки браузера. Редактировать нельзя, зато вся структура сразу видна:
|
||||
|
||||

|
||||
|
||||
Что такое XML-формат и для чего он нужен
|
||||
|
||||
Самый простой инструмент для редактирования — Блокнот на Windows и TextEdit на MacOS. Можно менять содержимое, но просматривать его не так удобно, потому что нет подсветки синтаксиса:
|
||||
|
||||

|
||||
|
||||
Что такое XML-формат и для чего он нужен
|
||||
|
||||
Более продвинутый вариант — использовать текстовые редакторы кода. Так будет выглядеть открытый файл в редакторе Sublime Text:
|
||||
|
||||

|
||||
|
||||
Что такое XML-формат и для чего он нужен
|
||||
|
||||
Самый мощный вариант — поставить IDE и всё делать в ней. Например, бесплатный настраиваемый Visual Studio Code:
|
||||
|
||||

|
||||
|
||||
Что такое XML-формат и для чего он нужен
|
||||
|
||||
### На мобильных устройствах
|
||||
|
||||
По умолчанию XML на смартфоне можно открыть в браузере, так же как на компьютере:
|
||||
|
||||

|
||||
|
||||
Что такое XML-формат и для чего он нужен
|
||||
|
||||
Если скачать отдельное приложение (их много, можно выбрать), файл можно открывать и редактировать в нём:
|
||||
|
||||

|
||||
|
||||
Что такое XML-формат и для чего он нужен
|
||||
|
||||
## Создание и редактирование XML файлов
|
||||
|
||||
Понадобится любой текстовый редактор или редактор кода. Минус текстового редактора в том, что там нет подсветки, поэтому лучше поставить что-нибудь для программирования.
|
||||
|
||||
Если не хотите разбираться в средах разработки, поставьте Sublime Text — он простой и удобный, там можно работать с любым текстом, его достаточно для всех простых задач, а если прокачать дополнительными плагинами, то можно спокойно писать и запускать код.
|
||||
|
||||
[Почему настоящие мастера пишут всё в Sublime Text](https://thecode.media/sublime-one-love/)
|
||||
|
||||
Для простого XML-файла нужно запомнить несколько правил.
|
||||
|
||||
Сначала пишем пролог:
|
||||
|
||||
```markup
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
```
|
||||
|
||||
Потом ставим корневой тег:
|
||||
|
||||
```markup
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<root>
|
||||
<!-- тут будет всё содержимое XML -->
|
||||
</root>
|
||||
```
|
||||
|
||||
Внутри корневого тега можно создавать любые другие, но нужно помнить:
|
||||
|
||||
- Не забывайте ставить парные теги — один открывающий, другой закрывающий. Если работаете в IDE, для этого можно установить дополнительный плагин, который будет делать это за вас.
|
||||
- Регистр важен: нельзя написать один тег заглавными буквами, а другой строчными.
|
||||
- Все атрибуты внутри тегов должны быть указаны в кавычках: `<book id="101">`.
|
||||
- Спецсимволы, такие как угловые кавычки или амперсанд, нужно экранировать.
|
||||
|
||||
Созданный XML можно проверить валидаторами. Например, [jsonformatter.org](https://jsonformatter.org/xml-validator):
|
||||
|
||||

|
||||
|
||||
Что такое XML-формат и для чего он нужен
|
||||
|
||||
Или [w3schools.com](https://www.w3schools.com/xml/xml_validator.asp):
|
||||
|
||||

|
||||
|
||||
Что такое XML-формат и для чего он нужен
|
||||
|
||||
## Что дальше
|
||||
|
||||
В другой статье придумаем свой XML-формат и научим сервер с ним работать. Так тоже можно. В конце концов, это ИТ, тут можно вообще почти всё.
|
||||
|
||||
## Вам слово
|
||||
|
||||
Приходите к нам в соцсети поделиться своим мнением о формате XML и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте — шпаргалки, опросы и разная дурка. В общем, вот [тележка](https://v.thecode.media/gfjty), вот [ВК](https://v.thecode.media/lmw36) — велком!
|
||||
@@ -0,0 +1,50 @@
|
||||
---
|
||||
title: "Кабель FT8 для Xiegu G90/G106"
|
||||
source: "https://dzen.ru/a/aPVQ38CKA00Bm47l"
|
||||
author:
|
||||
- "[[RAZA Аномальные зоны России]]"
|
||||
published:
|
||||
created: 2026-01-27
|
||||
description: "Статья автора «RAZA Аномальные зоны России» в Дзене ✍: Трансивер Xiegu G106 весьма привлекателен своей компактностью. При его 5 ваттах на выходе, вас прекрасно слышат в SSB."
|
||||
tags:
|
||||
- "clippings"
|
||||
---
|
||||
[RAZA Аномальные зоны России](https://dzen.ru/razaward)
|
||||
|
||||
Трансивер Xiegu G106 весьма привлекателен своей компактностью. При его 5 ваттах на выходе, вас прекрасно слышат в SSB. Но на нем можно и работать в FT8 через кабель со смартфона. Причем стандартные...
|
||||
|
||||
Трансивер Xiegu G106 весьма привлекателен своей компактностью. При его 5 ваттах на выходе, вас прекрасно слышат в SSB. Но на нем можно и работать в FT8 через кабель со смартфона. Причем стандартные кабеля, которые продаются на маркетах не определяются смартфоном. Я попробовал разобраться в этом вопросе и нашел простое решение.
|
||||
|
||||

|
||||
|
||||
Готовый кабель
|
||||
|
||||
Разъем гарнитуры в смартфоне называется миниджек TRRS. Он имеет 4 контакта и отличается от обычного TRS тем, что корпусной контакт расположен не на основании разъема. Правильную распайку разъема вы видите на картинке.
|
||||
|
||||

|
||||
|
||||
Распайка TRRS
|
||||
|
||||
Наша задача подать на микрофон смартфона сигнал AF-OUT и сигнал наушников на AF-IN. Все просто, да не просто. Если просто вставить джек в смартфон - ничего не произойдет и звук не пойдет в этот разъем. Все потому, что смартфон отпределяет по сопротивлению микрофона и наушников подключение гарнитуры. Как это обойти? Да просто припаять резисторы параллельно. 1.5 килоома к микрофону и 1 килоом к наушникам.
|
||||
|
||||

|
||||
|
||||
Правильная распайка кабеля
|
||||
|
||||
После этого провод будет определяться смартфоном и звук пойдет куда нужно. Разъем ACC в трансивере имеет маркировку MDN-8M.
|
||||
|
||||

|
||||
|
||||
Распайки на XIEGU
|
||||
|
||||
Я припаял резисторы прямо на разъем, используя типоразмер 0805. А как сделаете вы?
|
||||
|
||||

|
||||
|
||||
Резисторы типоразмера 0805 на разъеме trrs 3.5
|
||||
|
||||
Если нема такого разъема в телефоне ? через звуковую карту получится в USB перейти ?
|
||||
|
||||
Dima V, https://www.ozon.ru/product/usb-a-na-3-5-mm-trrs-adapter-belyy-port-tipa-c-2882482086/?at=99trQpqgqcD7x2OgHNZvZ7jU9jAGmwINOOlgxtjyO6kX
|
||||
|
||||
для юсб звуковухи синий общий провод на два разъема, красный в гнездо микрофона, зеленый в гнездо наушников.
|
||||
@@ -0,0 +1,73 @@
|
||||
---
|
||||
title: "Как передать реальный ip клиента через nginx proxy manager lcx?"
|
||||
source: "https://qna.habr.com/q/1253998"
|
||||
author:
|
||||
- "[[Хабр Q&A — вопросы и ответы]]"
|
||||
published: 2023-02-18
|
||||
created: 2026-02-10
|
||||
description: "Всем привет!На роутере проброшен 80 и 44 порт на контейнер lxc (не докер) с nginx proxy manager, он в свою очередь перенаправляет на виртуалку с Xpenology, как в Xpenology получать реальные адреса пользователей ? В Xpenology все клиенты, которые подключаются через домен, им присваивается адрес контейнера с nginx Пробовал добавить вот такие \"префиксы\", все равно никакАдрес сети 192.168.8.0/24Адрес контейнера 192.168.8.9/24Адрес Xpenology 192.168.8.3/24Адрес роутера 192.168.8.1/24Ip бе"
|
||||
tags:
|
||||
- "clippings"
|
||||
---
|
||||
Всем привет!
|
||||
На роутере проброшен 80 и 44 порт на контейнер lxc (не докер) с nginx proxy manager, он в свою очередь перенаправляет на виртуалку с Xpenology, как в Xpenology получать реальные адреса пользователей? В Xpenology все клиенты, которые подключаются через домен, им присваивается адрес контейнера с nginx
|
||||

|
||||

|
||||
Пробовал добавить вот такие "префиксы", все равно никак
|
||||

|
||||
|
||||
Адрес сети 192.168.8.0/24
|
||||
Адрес контейнера 192.168.8.9/24
|
||||
Адрес Xpenology 192.168.8.3/24
|
||||
Адрес роутера 192.168.8.1/24
|
||||
Ip белый
|
||||
|
||||
- 4407 просмотров
|
||||
|
||||
Подписаться 1 Простой
|
||||
|
||||
[Реклама](https://company.habr.com/ru/advertising/ "Медийная реклама")
|
||||
|
||||
Решение проблемы
|
||||
необходимо
|
||||
на роутере с Openwrt (как в других - не подскажу)
|
||||
1.Либо отключить Маскарадинг из WAN либо создать правило НАТ, которое бы разрешало для proxy сервера получать ip внешние, а не роутера
|
||||

|
||||
или
|
||||

|
||||
2\. Если вы используете Nginx Proxy Manager (в докере или в lxc контейнере), то в проксируемом хосте, вкладка advansed необходимо добавить следующее
|
||||
proxy\_set\_header Host $http\_host;
|
||||
proxy\_set\_header X-Real-IP $remote\_addr;
|
||||
proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for;
|
||||
proxy\_set\_header X-Forwarded-Proto $scheme;
|
||||
(конфиг фаил править не нужно)
|
||||

|
||||
3\. в самом Synology (или Xpenology, разницы нет) необходимо зайти
|
||||
Панель управления - Безопасность - вкладка Безопасность
|
||||

|
||||
В самом низу "Доверенные Прокси-серверы" и там указать адрес вашего прокси сервера с маской через слэш
|
||||

|
||||
|
||||
Ответ написан
|
||||
|
||||
[Пригласить эксперта](https://qna.habr.com/q/#)
|
||||
|
||||
### Войдите, чтобы написать ответ
|
||||
|
||||
[Middle FullStack Developer (PHP / Laravel / Vue)](https://career.habr.com/vacancies/1000164345?utm_source=tm_toster&utm_medium=tm_section&utm_campaign=vacancies_post)
|
||||
|
||||
[ЛЕДДЕР](https://career.habr.com/companies/ledder?utm_source=tm_toster&utm_medium=tm_section&utm_campaign=vacancies_post) • Казань
|
||||
|
||||
от 150 000 ₽
|
||||
|
||||
[SRE / DevOps инженер (bare metal, highload media platform)](https://career.habr.com/vacancies/1000164894?utm_source=tm_toster&utm_medium=tm_section&utm_campaign=vacancies_post)
|
||||
|
||||
[Karma8](https://career.habr.com/companies/karma8?utm_source=tm_toster&utm_medium=tm_section&utm_campaign=vacancies_post)
|
||||
|
||||
от 350 000 ₽
|
||||
|
||||
[ML / NLP Engineer (чат-боты, LLM)](https://career.habr.com/vacancies/1000164752?utm_source=tm_toster&utm_medium=tm_section&utm_campaign=vacancies_post)
|
||||
|
||||
[FIN](https://career.habr.com/companies/fin?utm_source=tm_toster&utm_medium=tm_section&utm_campaign=vacancies_post) • Лимассол
|
||||
|
||||
от 4 000 до 6 000 $
|
||||
+209
@@ -0,0 +1,209 @@
|
||||
---
|
||||
title: "Что такое Swagger: инструмент для подготовки документации к API и проведения тестов API — журнал «Код»"
|
||||
source: https://thecode.media/chto-takoe-swagger-i-kak-on-oblegchaet-rabotu-s-api/
|
||||
author:
|
||||
published: 2024-11-20
|
||||
created: 2025-08-24
|
||||
description: Swagger — инструмент, который умеет автоматически создавать описание для каждого ресурса в REST API, показывать доступные методы, параметры запроса и ответы.
|
||||
tags:
|
||||
- clippings
|
||||
- "#swagger"
|
||||
---
|
||||
Мы уже рассказывали, что такое [API](https://thecode.media/api/), но на всякий случай напомним: это то, что может делать приложение по просьбе других приложений. Чтобы функциями API могли пользоваться другие люди, они должны знать, какие запросы можно отправлять, что нужно передавать в ответах и что вернётся. Всю эту информацию разработчики API указывают в документации. Но обычно вручную делать такие описания долго, особенно если API большой и функциональный, поэтому разработчики используют специальные инструменты для создания документации. Один из них — Swagger — мы сегодня и разберём.
|
||||
|
||||
## Что такое Swagger и как он связан с REST API
|
||||
|
||||
API — это набор команд, которые разработчики добавляют в приложение, чтобы другие программы могли с этим приложением взаимодействовать. Допустим, есть [сервис](https://github.com/alexwohlbruck/cat-facts) для получения фактов о кошках, и нужно, чтобы другие приложения тоже могли запрашивать эти факты. Для этого используется API, который задаёт правила для взаимодействия. С помощью запросов к этому API можно получить случайные факты о кошках.
|
||||
|
||||
Есть несколько подходов к созданию API. Один из самых популярных — архитектура REST API (Representational State Transfer). Она описывает, как должен быть устроен API, чтобы с ним всем было удобно работать.
|
||||
|
||||
В этой архитектуре каждый объект или ресурс в приложении («пользователи», «факты», «задачи») имеет свой уникальный URL, который называется эндпоинтом. Эндпоинт — это адрес, по которому отправляется запрос к API, и для работы с ним используются стандартные HTTP-методы: GET для получения данных или POST — для создания новых данных. REST API работает по принципу «без сохранения состояния» — то есть каждый запрос обрабатывается как самостоятельное действие, не зависящее от предыдущих запросов.
|
||||
|
||||
Чтобы объяснить другим принцип работы своего API, разработчики пишут документацию. Там они описывают, какие действия поддерживает API, как отправлять запросы, какие данные можно получить в ответ и так далее. Получается что-то вроде этого:
|
||||
|
||||

|
||||
|
||||
Что такое Swagger и как он облегчает работу с API
|
||||
|
||||
Пример документации API для приложения Cat Facts: указан основной URL, эндпоинты и модели данных
|
||||
|
||||
Чтобы упростить себе жизнь, разработчики используют разные инструменты, которые помогают создавать документацию. Один из них — [Swagger](https://swagger.io/). Он умеет автоматически создавать описание для каждого ресурса в REST API, показывать доступные методы, параметры запроса и ответы, поскольку заточен под REST API и работает с теми же стандартами URL и HTTP-методов.
|
||||
|
||||
Swagger берёт все ресурсы, методы и параметры, заданные в API, и превращает их в наглядное описание. В результате мы можем увидеть, какие запросы поддерживаются, какие данные нужно передавать и что возвращается в ответ. Документация, которую создаёт Swagger, будет выглядеть так:
|
||||
|
||||

|
||||
|
||||
Что такое Swagger и как он облегчает работу с API
|
||||
|
||||
Пользователь сразу видит структуру API. Можно раскрыть запрос и протестировать его выполнение прямо в браузере:
|
||||
|
||||

|
||||
|
||||
Что такое Swagger и как он облегчает работу с API
|
||||
|
||||
## Для чего используется Swagger
|
||||
|
||||
Мощь Swagger — в его интерактивности. Инструмент создаёт документацию, где каждый запрос, параметры и ответ можно сразу протестировать. Это позволяет быстро проверить, как работает каждый метод, и если нужно, то сразу сделать отладку.
|
||||
|
||||
Swagger стал настолько популярным, что сейчас разные разработчики и компании воспринимают его как стандартный инструмент для работы с API. Его используют для создания и документирования API как для внутренних целей, так и для внешних клиентов.
|
||||
|
||||
Инструмент могут использовать разные специалисты, которые работают с API: разработчики, системные аналитики, тестировщики, а также проектные и продуктовые менеджеры. В зависимости от роли и задач использование будет разным.
|
||||
|
||||
Теперь разберём подробнее.
|
||||
|
||||
### ➡️ Как используют Swagger разработчики API
|
||||
|
||||
**Создают и поддерживают документацию.** Это обязательный этап при проектировании API, особенно если он будет использоваться другими командами или клиентами. В Swagger разработчик может описать каждый эндпоинт, добавить методы, параметры и возможные ответы.
|
||||
|
||||
**Тестируют API.** Можно выбрать эндпоинт, задать параметры и отправить запрос, чтобы увидеть, как API обрабатывает данные. Это позволяет сразу проверить, правильно ли работает каждый метод. Swagger показывает, какой ответ приходит от API — формат JSON и коды ошибок.
|
||||
|
||||
**Генерируют клиентский код для API.** Если API нужно подключить к приложению, Swagger Codegen позволяет создать клиентский код для работы с этим API на более чем 40 языках программирования. Swagger также может создавать серверные заглушки, которые представляют API, но без фактической бизнес-логики. Это позволяет начать разработку клиентской части параллельно с серверной, так как клиент может тестировать API, даже если сервер ещё не готов.
|
||||
|
||||
**Синхронизируют работу в команде.** Swagger помогает командам избегать путаницы при разработке API и иметь доступ к актуальной документации. Если один разработчик добавляет новый эндпоинт, это сразу же видно всем, кто работает с этим API. Клиентская и серверная команды могут одновременно тестировать API и проверять, что все методы и параметры работают как нужно.
|
||||
|
||||
В общем, если нужно создавать с нуля свой API, то Swagger точно пригодится.
|
||||
|
||||
### ➡️ Как используют Swagger системные аналитики
|
||||
|
||||
У аналитиков всё несколько по-другому: их задача не столько в написании кода, сколько в анализе и координации работы API, а также в проверке соответствия требованиям. Вот что они делают.
|
||||
|
||||
**Анализируют текущее состояние API.** Swagger позволяет изучить структуру API и понять, какие данные он обрабатывает и какие функции поддерживает. Это помогает на этапе планирования: можно оценить, насколько API соответствует целям проекта, и сразу увидеть, какие ресурсы и методы уже реализованы, а какие нужно добавить.
|
||||
|
||||
**Взаимодействуют с разработчиками и заказчиками.** Документацию Swagger удобно демонстрировать заказчикам: используя Swagger, аналитики могут показать, какие возможности есть у API, и объяснить его работу простыми словами, не вдаваясь в технические аспекты.
|
||||
|
||||
**Проверяют соответствие API требованиям.** Аналитики проверяют, что каждый метод, ресурс и параметр соответствует установленным задачам. Если API меняется, аналитик может сразу увидеть, соответствует ли новое решение изначальным ожиданиям, и вовремя внести корректировки и передать задачи команде разработки.
|
||||
|
||||
Вам может быть интересно:
|
||||
|
||||
[ Что такое API](https://thecode.media/chto-takoe-api/) [ Что такое вебхук](https://thecode.media/webhook/) [ Космическая Python-программа: следим за МКС](https://thecode.media/kosmicheskaya-python-programma-sledim-za-mks/) [ Делаем HTTP-запросы на Python с библиотеками requests, aiohttp и httpx](https://thecode.media/delaem-http-zaprosy-na-python-s-bibliotekami-requests-aiohttp-i-httpx/)
|
||||
|
||||
## Компоненты Swagger
|
||||
|
||||
В Swagger есть два вида компонентов: компоненты-инструменты и компоненты спецификации.
|
||||
|
||||
Разные инструменты решают разные задачи. Допустим, если нужно только создать документацию, достаточно Swagger Editor, а если надо ещё и полноценно протестировать разные сценарии использования — то Swagger UI. Инструменты доступны через официальный сайт [https://swagger.io/](https://swagger.io/)
|
||||
|
||||

|
||||
|
||||
Что такое Swagger и как он облегчает работу с API
|
||||
|
||||
Разберём три основных.
|
||||
|
||||
- [**Swagger Editor**](https://editor.swagger.io/)**:** позволяет писать документацию, проектировать и описывать новые API, а также редактировать существующие. Инструмент работает в браузере, визуально отображает документацию и подсвечивает ошибки. Можно сделать базовое тестирование запросов. Также можно установить и запустить локально.
|
||||
- [**Swagger UI**](https://swagger.io/tools/swagger-ui/)**:** настраиваемый инструмент, который визуализирует документацию для API. Подключается к API и позволяет взаимодействовать с ним прямо в браузере. С его помощью можно изучить структуру API и полноценно протестировать его, задавая параметры и отправляя запросы в режиме реального времени.
|
||||
- [**Swagger Codegen**](https://github.com/swagger-api/swagger-codegen)**:** создаёт готовый клиентский код для работы с уже описанным API. Если у вас есть документация, созданная вручную или с помощью Swagger UI, то Swagger Codegen может использовать эту документацию для автоматической генерации клиентских библиотек на разных языках. Codegen можно сразу подключить к проекту и использовать его как модуль для работы с API.
|
||||
|
||||
Компоненты спецификации — это то, из чего состоит документация API. Это разделы, которые организуют и структурируют описание:
|
||||
|
||||
Такая структура называется спецификацией OpenAPI:
|
||||
|
||||

|
||||
|
||||
Что такое Swagger и как он облегчает работу с API
|
||||
|
||||
Когда в документации мы выносим общие описания в отдельные компоненты, это сокращает код. Получается, что, описав один раз параметры или ответы, можно использовать их в разных местах. Если нужно что-то изменить, достаточно обновить компонент один раз, и изменения сразу отразятся во всех запросах, где он используется.
|
||||
|
||||
## Как начать работать со Swagger
|
||||
|
||||
Самый простой способ — использовать [онлайн-версию](https://editor.swagger.io/) Swagger Editor. При запуске редактор автоматически загружает пример API — шаблон в формате YAML, разбитый на компоненты. В формате YAML используются отступы и структура с вложенностью, а не скобки или кавычки, поэтому он выглядит более простым для восприятия — сразу понятно, что к чему относится.
|
||||
|
||||
Можно использовать его как основу, удаляя ненужные компоненты и добавляя свои данные. Swagger Editor сразу покажет, как будет выглядеть документация на основе описания.
|
||||
|
||||

|
||||
|
||||
Шаблон OpenAPI по умолчанию
|
||||
|
||||
Если есть файл документации в формате OpenAPI (файл с расширением.yaml или.json), его можно загрузить в редактор. Для этого нажимаем на вкладку File, выбираем Import File и загружаем файл со своего компьютера:
|
||||
|
||||

|
||||
|
||||
Что такое Swagger и как он облегчает работу с API
|
||||
|
||||
Если мы сделаем ошибку в структуре или синтаксисе файла, то инструмент подсветит её и даст рекомендации по исправлению. Например, есть убрать какое-то обязательное поле в документации (в примере ниже — `version`), то Swagger Editor укажет нам на ошибку в структуре:
|
||||
|
||||

|
||||
|
||||
Что такое Swagger и как он облегчает работу с API
|
||||
|
||||
Если хотите работать локально, скачайте Swagger Editor с [GitHub](https://github.com/swagger-api/swagger-editor) и запустите его на своём компьютере.
|
||||
|
||||
Чтобы генерировать документацию из проекта, понадобится Swagger UI. Он умеет создавать спецификации OpenAPI, читая аннотации исходного кода API. Чтобы его установить, нужно скачать Swagger UI с GitHub. Для этого переходим на [GitHub Swagger UI](https://github.com/swagger-api/swagger-ui) и скачиваем репозиторий. Дальше в зависимости от того, на каком языке написан проект, можно либо подключить Swagger UI через фреймворк ([Flask-RESTX](https://flask-restx.readthedocs.io/en/latest/) для Python, [Springfox](https://springfox.github.io/springfox/) для Java), либо использовать Swagger UI как статическое веб-приложение и подключить к нему файл спецификации OpenAPI нашего API.
|
||||
|
||||
Дальше разберём более подробно, как это работает, на примере Python-проекта.
|
||||
|
||||
## Методы создания документации
|
||||
|
||||
Документацию в Swagger можно создавать двумя способами: вручную и через генератор.
|
||||
|
||||
Вручную документация пишется в [Swagger Editor](https://swagger.io/tools/swagger-editor/). Там мы подробно описываем весь наш API в компонентах OpenAPI: какие в нём есть команды, какие данные можно передавать, что API вернёт в ответ.
|
||||
|
||||
Второй способ — это генерация через [Swagger UI](https://github.com/swagger-api/swagger-ui). В исходном коде API разработчики добавляют специальные аннотации, которые описывают функции API: какие команды доступны, какие параметры принимают и что возвращают. Для создания таких аннотаций обычно подключают сторонние библиотеки.
|
||||
|
||||
Допустим, у нас есть Python-код какого-то API, который мы хотим задокументировать. В свой проект мы подключаем библиотеку Flask и расширение для аннотирования flask\_restx, чтобы с помощью аннотации `@api.doc` добавить описание для каждого метода. Swagger UI прочитает все аннотации и автоматически отобразит документацию по ним.
|
||||
|
||||
Сначала добавляем Flask и расширение Flask-RESTX, которые позволят дальше работать со Swagger. Открываем терминал и пишем команду:
|
||||
|
||||
```markup
|
||||
pip install flask flask-restx
|
||||
```
|
||||
|
||||
Теперь возьмём код нашего API и аннотируем метод:
|
||||
|
||||
```python
|
||||
# Импортируем Flask для создания веб-приложения
|
||||
from flask import Flask, request, jsonify
|
||||
# Импортируем Api и Resource из flask_restx для создания и документирования API
|
||||
from flask_restx import Api, Resource
|
||||
# Создаём экземпляр приложения Flask
|
||||
app = Flask(__name__)
|
||||
# Создаём объект API с названием и описанием
|
||||
api = Api(app, title="Главред API", description="API для проверки текста")
|
||||
# Определяем маршрут /check для обработки запросов по этому URL
|
||||
@api.route('/check')
|
||||
# Создаём класс TextCheck, который наследует Resource
|
||||
class TextCheck(Resource):
|
||||
# Аннотация для Swagger с описанием, что делает этот метод
|
||||
@api.doc(description="Проверка текста на стилистические ошибки")
|
||||
# Определяем метод POST для маршрута /check
|
||||
def post(self):
|
||||
# Логика проверки текста
|
||||
return jsonify({"result": "Текст проверен"})
|
||||
# Проверяем, запущен ли этот файл напрямую
|
||||
if __name__ == '__main__':
|
||||
# Запускаем приложение Flask с включённым режимом отладки (debug)
|
||||
app.run(debug=True)
|
||||
```
|
||||
|
||||
Здесь мы создаём маршрут /check и добавляем к нему аннотацию `@api.doc`, которая автоматически включит описание этого маршрута в Swagger-документацию.
|
||||
|
||||
После этого запускаем наше приложение командой `python имя_файла.py`.
|
||||
|
||||
Чтобы увидеть документацию, нужно открыть приложение в браузере: его адрес будет в командной строке при запуске. В браузере увидим интерфейс Swagger и метод, который он нашёл в нашем коде. Там же можно просмотреть и протестировать API:
|
||||
|
||||

|
||||
|
||||
Что такое Swagger и как он облегчает работу с API
|
||||
|
||||
## Преимущества и недостатки Swagger
|
||||
|
||||
Swagger хорошо подходит для создания понятной документации к API, особенно если нужно, чтобы ею могли пользоваться не только разработчики, но и менеджеры или клиенты.
|
||||
|
||||
**Преимущества Swagger**
|
||||
|
||||
- Удобный интерфейс: Swagger UI показывает API в структурированном виде — сразу понятно, что к чему.
|
||||
- Понятность: Swagger-документация понятна не только разработчикам, но и не техническим специалистам.
|
||||
- Интерактивность: с помощью Swagger UI можно тестировать API прямо в документации, отправляя запросы и проверяя ответы.
|
||||
- Просто редактировать: документация создаётся в форматах JSON и YAML, которые удобно читать и редактировать.
|
||||
- Автоматизация процессов: Swagger помогает автоматизировать документирование, тестирование и поддержку API.
|
||||
|
||||
**Недостатки Swagger**
|
||||
|
||||
- Ограничения для сложных API: Swagger лучше всего подходит для простых REST API, но может ограничивать гибкость для более сложных сценариев.
|
||||
- Не подходит для других архитектур: Swagger предназначен для REST API и не работает с gRPC или GraphQL.
|
||||
- Громоздкие файлы: для больших API файлы спецификации могут быть громоздкими и трудными в поддержке.
|
||||
- Порог входа: требует времени на изучение.
|
||||
- Ограничения OpenAPI: ограничен функциями, поддерживаемыми стандартом OpenAPI, что не всегда удобно для специфичных требований.
|
||||
|
||||
## Аналоги Swagger
|
||||
|
||||
Если Swagger кажется сложным, или наоборот, его функций недостаточно, то можно рассмотреть другие подобные инструменты.
|
||||
@@ -0,0 +1,230 @@
|
||||
---
|
||||
title: "Шпаргалка по Markdown - Самые полезные структуры и форматирование"
|
||||
source: "https://www.glukhov.org/ru/post/2024/03/markdown-cheatsheet/"
|
||||
author:
|
||||
- "[[Рост Глухов | Персональный сайт и технический блог]]"
|
||||
published: 2023-03-20
|
||||
created: 2025-08-23
|
||||
description: "Шпаргалка по Markdown - Самые полезные структуры и форматирование"
|
||||
tags:
|
||||
- "clippings"
|
||||
---
|
||||
Язык разметки [Markdown](https://www.glukhov.org/ru/post/2024/03/markdown-cheatsheet/ "Справочник по Markdown") используется в Википедии и [Hugo](https://www.glukhov.org/ru/post/2024/06/deploy-hugo-site-to-aws/ "Развертывание сайта Hugo на AWS S3"). Он поддерживает заголовки, списки, изменения стиля шрифта, изображения, цитаты кода и таблицы. Здесь я сохраняю краткое резюме форматирования Markdown.
|
||||
|
||||
 Это изображение выше создано [Flux - AI для генерации изображений по тексту](https://www.glukhov.org/ru/post/2024/09/flux-text-to-image/ "Flux 1 dev - AI для генерации изображений по тексту").
|
||||
|
||||
Markdown — это [легковесный](https://www.glukhov.org/ru/ "сайт, сгенерированный с помощью Hugo, очень легковесный") язык разметки, который можно использовать для добавления элементов форматирования в текстовые документы с обычным текстом. Это руководство предоставляет всесторонний обзор наиболее часто используемого [синтаксиса Markdown](https://www.glukhov.org/ru/post/2024/03/markdown-cheatsheet/ "Справочник по Markdown"), помогая вам создавать хорошо структурированные и визуально привлекательные документы.
|
||||
|
||||
## Заголовки
|
||||
|
||||
Заголовки в Markdown создаются с помощью символа решетки (#). Количество решеток перед текстом заголовка указывает уровень заголовка.
|
||||
|
||||
```md
|
||||
# H1
|
||||
## H2
|
||||
### H3
|
||||
#### H4
|
||||
##### H5
|
||||
###### H6
|
||||
```
|
||||
|
||||
## Выделение
|
||||
|
||||
Markdown предоставляет несколько способов выделения текста. Вы можете использовать звездочки (\*) или подчеркивания (\_) для курсива и двойные звездочки (\*\*) или двойные подчеркивания (\_\_) для жирного.
|
||||
|
||||
Курсив
|
||||
|
||||
```md
|
||||
*Курсив* или _курсив_
|
||||
```
|
||||
|
||||
Жирный
|
||||
|
||||
```md
|
||||
**Жирный** или __жирный__
|
||||
```
|
||||
|
||||
Жирный и курсив
|
||||
|
||||
```md
|
||||
***Жирный и курсив*** или ___жирный и курсив___
|
||||
```
|
||||
|
||||
## Списки
|
||||
|
||||
Markdown поддерживает как нумерованные, так и ненумерованные списки.
|
||||
|
||||
Ненумерованный список
|
||||
|
||||
```md
|
||||
- Пункт 1
|
||||
- Пункт 2
|
||||
- Подпункт 1
|
||||
- Подпункт 2
|
||||
```
|
||||
|
||||
Нумерованный список
|
||||
|
||||
```md
|
||||
1. Первый пункт
|
||||
2. Второй пункт
|
||||
1. Подпункт 1
|
||||
2. Подпункт 2
|
||||
```
|
||||
|
||||
## Ссылки
|
||||
|
||||
Ссылки создаются путем заключения текста ссылки в квадратные скобки (\[\]) и затем заключения URL в круглые скобки (()).
|
||||
|
||||
```md
|
||||
[Текст ссылки](URL)
|
||||
```
|
||||
|
||||
Пример
|
||||
|
||||
```md
|
||||
Посетите [Руководство по Markdown](https://www.markdownguide.org/) для получения дополнительной информации.
|
||||
```
|
||||
|
||||
## Изображения
|
||||
|
||||
Изображения добавляются с помощью восклицательного знака (!), за которым следует альтернативный текст в квадратных скобках и URL изображения в круглых скобках.
|
||||
|
||||
```md
|
||||

|
||||
```
|
||||
|
||||
Пример
|
||||
|
||||
```md
|
||||

|
||||
```
|
||||
|
||||
## Блочные цитаты
|
||||
|
||||
Блочные цитаты создаются с помощью символа больше чем (>).
|
||||
|
||||
```md
|
||||
> Это блочная цитата.
|
||||
```
|
||||
|
||||
Вложенные блочные цитаты
|
||||
|
||||
```md
|
||||
> Это первый уровень цитирования.
|
||||
>> Это вложенная блочная цитата.
|
||||
```
|
||||
|
||||
## Встроенный код и блоки кода
|
||||
|
||||
Встроенный код можно добавить, заключив его в обратные кавычки (\`). Для блоков кода используйте тройные обратные кавычки (\`\`\`) до и после кода.
|
||||
|
||||
Встроенный код
|
||||
|
||||
```md
|
||||
Используйте \`printf()\` для вывода текста в C.
|
||||
```
|
||||
|
||||
Блоки кода
|
||||
|
||||
```md
|
||||
\`\`\`python
|
||||
def hello_world():
|
||||
print("Hello, World!")
|
||||
\`\`\`
|
||||
```
|
||||
|
||||
Больше о блоках кода в Markdown — см. отдельный пост: [Использование блоков кода Markdown](https://www.glukhov.org/ru/post/2025/07/markdown-codeblocks/ "Блоки кода Markdown - подробное описание")
|
||||
|
||||
## Горизонтальные правила
|
||||
|
||||
Горизонтальные правила создаются с помощью трех или более тире (—), звездочек (\*\*\*) или подчеркиваний (\_\_).
|
||||
|
||||
```markdown
|
||||
---
|
||||
```
|
||||
|
||||
## Таблицы
|
||||
|
||||
Таблицы в Markdown создаются с помощью вертикальных линий (|) и тире (-).
|
||||
|
||||
```md
|
||||
Пример
|
||||
| Заголовок 1 | Заголовок 2 |
|
||||
|-------------|-------------|
|
||||
| Ячейка 1 | Ячейка 2 |
|
||||
| Ячейка 3 | Ячейка 4 |
|
||||
```
|
||||
|
||||
## Списки задач
|
||||
|
||||
Списки задач — это специальный тип списков, который позволяет создавать флажки.
|
||||
|
||||
```md
|
||||
Пример
|
||||
- [x] Выполненная задача
|
||||
- [ ] Незавершенная задача
|
||||
```
|
||||
|
||||
## Зачеркнутый текст
|
||||
|
||||
Зачеркнутый текст создается с помощью двойных тильд (~~).
|
||||
|
||||
```md
|
||||
~~Это зачеркнутый текст.~~
|
||||
```
|
||||
|
||||
## Выделение
|
||||
|
||||
Выделение текста не поддерживается нативно в Markdown, но некоторые рендереры поддерживают его с использованием синтаксиса ==.
|
||||
|
||||
Пример
|
||||
|
||||
```md
|
||||
==Это выделенный текст.==
|
||||
```
|
||||
|
||||
## Подстрочные и надстрочные индексы
|
||||
|
||||
Подстрочные индексы создаются с помощью символа caret (^) перед текстом, а надстрочные индексы — с помощью символа тильда (~) перед текстом.
|
||||
|
||||
Пример
|
||||
|
||||
```md
|
||||
H 2 O — это вода.
|
||||
E = mc^2
|
||||
```
|
||||
|
||||
## Математические формулы
|
||||
|
||||
Математические формулы можно добавлять с использованием синтаксиса LaTeX внутри знаков доллара ($).
|
||||
|
||||
Пример
|
||||
|
||||
```md
|
||||
$$ E = mc^2 $$
|
||||
```
|
||||
|
||||
## Экранирование символов
|
||||
|
||||
Для экранирования специальных символов используйте обратную косую черту ().
|
||||
|
||||
Пример
|
||||
|
||||
```md
|
||||
\*Курсив\* или \_курсив\_
|
||||
```
|
||||
|
||||
Это всесторонний справочник, который охватывает основной синтаксис Markdown, необходимый для создания хорошо отформатированных документов. Для более сложных функций и настраиваемых параметров обратитесь к документации конкретного рендерера или дополнительным ресурсам.
|
||||
|
||||
## Полезные ссылки
|
||||
|
||||
- [Использование блоков кода Markdown](https://www.glukhov.org/ru/post/2025/07/markdown-codeblocks/ "Блоки кода Markdown - подробное описание")
|
||||
- [Справочник по Hugo](https://www.glukhov.org/ru/post/2022/hugo-cheatsheet/ "Справочник по Hugo - список и описание полезных команд статического генератора сайтов Hugo")
|
||||
- [Отправка формы Google в сайте Hugo](https://www.glukhov.org/ru/post/2025/04/submit-form-in-hugo-website/ "Инструкции по отправке формы в сайте Hugo с использованием Google Forms")
|
||||
- [Использование Gitea Actions для развертывания сайта Hugo на AWS S3](https://www.glukhov.org/ru/post/2025/06/using-gitea-actions-deploy-hugo-to-s3/ "Использование Gitea Actions для развертывания сайта Hugo на AWS S3")
|
||||
- [Справочник по Bash](https://www.glukhov.org/ru/post/2024/04/bash-cheat-sheet/)
|
||||
- [Справочник по LaTeX](https://www.glukhov.org/ru/post/2024/12/latex-cheat-sheet/ "Справочник по LaTeX - добавление таблиц, диаграмм, изображений, оглавления и других полезных примеров")
|
||||
- [Справочник по Ollama](https://www.glukhov.org/ru/post/2024/12/ollama-cheatsheet/ "Справочник по Ollama")
|
||||
- [Справочник по Docker](https://www.glukhov.org/ru/post/2024/10/docker-cheatsheet/ "список и описание наиболее частых и полезных команд Docker - справочник по Docker")
|
||||
- [Самые популярные темы для Hugo](https://www.glukhov.org/ru/post/2025/05/top-hugo-themes/ "Лучшие темы для Hugo")
|
||||
@@ -0,0 +1,126 @@
|
||||
`apk update`
|
||||
`apk add luci-app-openvpn openvpn-easy-rsa openvpn-openssl`
|
||||
|
||||
**Создание сертификатов.**
|
||||
|
||||
`easyrsa init-pki`
|
||||
`easyrsa build-ca nopass`
|
||||
`easyrsa build-server-full ovpn_server nopass`
|
||||
`easyrsa build-client-full ovpn_client_1 nopass`
|
||||
`easyrsa gen-dh`
|
||||
В моем случае при выполнении команд сертификаты и ключи сохранились по указанным ниже путям:
|
||||
build-ca - /root/pki/ca.crt, /root/pki/private/ca.key
|
||||
build-server-full - /root/pki/issued/ovpn_server.crt, /root/pki/private/ovpn_server.key
|
||||
build-client-full - /root/pki/issued/ovpn_client_1.crt, /root/pki/private/ovpn_client_1.key
|
||||
gen-dh - /root/pki/dh.pem
|
||||
|
||||
**Подготовка конфигурации сервера.**
|
||||
`nano /etc/config/openvpn`
|
||||
```
|
||||
config openvpn 'ovpn_home'
|
||||
option proto 'udp'
|
||||
option cipher 'AES-256-GCM'
|
||||
option client_to_client '1'
|
||||
option comp_lzo 'no'
|
||||
option dev 'tun_ovpn'
|
||||
option duplicate_cn '1'
|
||||
option enabled '1'
|
||||
option keepalive '10 120'
|
||||
option mode 'server'
|
||||
option mssfix '1450'
|
||||
option persist_key '1'
|
||||
option persist_tun '1'
|
||||
option port '7500'
|
||||
option remote_cert_tls 'client'
|
||||
option reneg_sec '0'
|
||||
option server '10.100.0.0 255.255.255.0'
|
||||
option topology 'subnet'
|
||||
option verb '3'
|
||||
option ca '/root/pki/ca.crt'
|
||||
option cert '/root/pki/issued/ovpn_server.crt'
|
||||
option dh '/root/pki/dh.pem'
|
||||
option key '/root/pki/private/ovpn_server.key'
|
||||
list push 'comp-lzo no'
|
||||
list push 'redirect-gateway def1'
|
||||
list push 'route 192.168.1.0 255.255.255.0'
|
||||
option log_append '/etc/openvpn/logs/openvpn.log'
|
||||
```
|
||||
|
||||
Добавляем новый интерфейс tun_ovpn как неуправляемый
|
||||
Запустить vpn сервер.
|
||||
|
||||
**Настройки клиента.**
|
||||
|
||||
```
|
||||
client
|
||||
dev tunrw
|
||||
remote "ваш внешний ip" 7500
|
||||
auth-nocache
|
||||
cipher AES-256-GCM
|
||||
comp-lzo no
|
||||
connect-retry 5 60
|
||||
keepalive 10 120
|
||||
mssfix 1450
|
||||
nobind
|
||||
persist-key
|
||||
persist-tun
|
||||
proto udp
|
||||
pull
|
||||
remote-cert-tls server
|
||||
reneg-sec 0
|
||||
verb 3
|
||||
# Uncomment below to force Internet traffic over VPN, instead of just accessing devices.
|
||||
redirect-gateway def1
|
||||
<ca></ca>
|
||||
<cert></cert>
|
||||
<key></key>
|
||||
```
|
||||
Добавляем в разделы содержимое файлов:
|
||||
```
|
||||
<ca></ca>
|
||||
|
||||
`cat /root/pki/ca.crt`
|
||||
|
||||
<cert></cert>
|
||||
|
||||
`cat /root/pki/issued/ovpn_client_1.crt`
|
||||
|
||||
<key></key>
|
||||
|
||||
`cat /root/pki/private/ovpn_client_1.key`
|
||||
```
|
||||
Создать зону межсетевого экрана (с именем vpn) для новой vpn0 сети. Это разрешит входящие и исходящие соединения, необходимые для VPN туннеля. Измените значение по умолчанию в соответствии с требованиями. Это (пока) не разрешит получить доступ к LAN или WAN сетям, но разрешит клиентам взаимодействовать с сервисами на маршрутизаторе и может разрешить соединения VPN клиентам, если это позволяет конфигурация вашего OpenVPN сервера:
|
||||
```
|
||||
uci set firewall.vpn=zone
|
||||
uci set firewall.vpn.name=vpn
|
||||
uci set firewall.vpn.network=vpn0
|
||||
uci set firewall.vpn.input=ACCEPT
|
||||
uci set firewall.vpn.forward=REJECT
|
||||
uci set firewall.vpn.output=ACCEPT
|
||||
uci set firewall.vpn.masq=1
|
||||
```
|
||||
Если планируется разрешить клиентам подключаться к компьютерам в вашей локальной сети, вам необходимо разрешить перенаправление трафика VPN и LAN зонами межсетевого экрана:
|
||||
```
|
||||
uci set firewall.vpn_forwarding_lan_in=forwarding
|
||||
uci set firewall.vpn_forwarding_lan_in.src=vpn
|
||||
uci set firewall.vpn_forwarding_lan_in.dest=lan
|
||||
```
|
||||
Вероятно, понадобится разрешить LAN компьютерам общаться с VPN клиентами:
|
||||
```
|
||||
uci set firewall.vpn_forwarding_lan_out=forwarding
|
||||
uci set firewall.vpn_forwarding_lan_out.src=lan
|
||||
uci set firewall.vpn_forwarding_lan_out.dest=vpn
|
||||
```
|
||||
Если необходимо, чтобы ваши VPN клиенты имели доступ к интернету (WAN) через туннель, вы должны разрешить перенаправление трафика межу VPN и WAN зонами межсетевого экрана:
|
||||
```
|
||||
uci set firewall.vpn_forwarding_wan=forwarding
|
||||
uci set firewall.vpn_forwarding_wan.src=vpn
|
||||
uci set firewall.vpn_forwarding_wan.dest=wan
|
||||
```
|
||||
Фиксируем изменения:
|
||||
```
|
||||
uci commit network
|
||||
/etc/init.d/network reload
|
||||
uci commit firewall
|
||||
/etc/init.d/firewall reload
|
||||
```
|
||||
@@ -0,0 +1,8 @@
|
||||
#firewall #ufw
|
||||
|
||||
```shell
|
||||
sudo ufw allow 22/tcp
|
||||
sudo ufw allow 80/tcp
|
||||
sudo ufw allow 443/tcp
|
||||
sudo ufw enable
|
||||
```
|
||||
@@ -0,0 +1,10 @@
|
||||
Теплый пол ванна
|
||||
ip 192.168.88.203
|
||||
"local_key": "56fae9e9510a3bf7"
|
||||
Теплый пол прихожая
|
||||
ip 192.168.88.190
|
||||
"local_key": "l_?Hqd:W&Y{w1{6n"
|
||||
Теплый пол балкон:
|
||||
ip 192.168.88.107
|
||||
"id": "57616806a4e57c90959d"
|
||||
"local_key": "rf{dWB_fd515vT_R"
|
||||
@@ -0,0 +1,14 @@
|
||||
#### Доступны одна или несколько миграций mimetype. Используйте команду `occ maintenance:repair --include-expensive` для выполнения миграций.
|
||||
|
||||
Для решения необходимо:
|
||||
```sh
|
||||
sudo -u www-data php --define apc.enable_cli=1 ./occ maintenance:repair --include-expensive
|
||||
sudo -u www-data php --define apc.enable_cli=1 ./occ db:add-missing-indices
|
||||
```
|
||||
|
||||
#### Обнаружены некоторые отсутствующие необязательные индексы. После добавления индексов запросы к этим таблицам должны выполняться быстрее. Используйте команду `occ db:add-missing-indices`, чтобы добавить их.
|
||||
|
||||
Для решения необходимо:
|
||||
```sh
|
||||
sudo -u www-data php occ db:add-missing-indices
|
||||
```
|
||||
@@ -0,0 +1,9 @@
|
||||
Creating /var/log/gohttp
|
||||
Tidying up Go HTTP Server Install
|
||||
Created symlink /etc/systemd/system/multi-user.target.wants/gohttpserver.service -> /etc/systemd/system/gohttpserver.service.
|
||||
Your IP/DNS Address is 46.191.234.171
|
||||
Your public key is s8lkk5BS7tVPYCeaZ0S+L1+EpaNrkCOFuHxLYI8aYFI=
|
||||
Install Rustdesk on your machines and change your public key and IP/DNS name to the above
|
||||
You can access your install scripts for clients by going to http://46.191.234.171:8000
|
||||
Username is admin and password is 6DjHOcDamlR4spxm
|
||||
Press any key to finish install
|
||||
@@ -0,0 +1,7 @@
|
||||
Подготовка к распаковке …/gitlab-ce_18.10.1-ce.0_amd64.deb …
|
||||
gitlab preinstall: It seems you are upgrading from 18.5 to 18.10.
|
||||
gitlab preinstall: It is required to upgrade to the latest 18.8.x version first before proceeding.
|
||||
gitlab preinstall: Please follow the upgrade documentation at https://docs.gitlab.com/ee/update/index.html#upgrade-paths
|
||||
dpkg: ошибка при обработке архива /var/cache/apt/archives/gitlab-ce_18.10.1-ce.0_amd64
|
||||
|
||||
Для решения необходимо обновить промежуточные версии
|
||||
@@ -0,0 +1,7 @@
|
||||
#RustDesk #RustDesk Server
|
||||
|
||||
```sh
|
||||
wget https://raw.githubusercontent.com/techahold/rustdeskinstall/master/update.sh
|
||||
chmod +x update.sh
|
||||
./update.sh
|
||||
```
|
||||
@@ -0,0 +1,22 @@
|
||||
#RustDesk
|
||||
|
||||
[https://rustdesk.com/docs/en/self-host/install/](https://4pda.to/stat/go?u=https%3A%2F%2Frustdesk.com%2Fdocs%2Fen%2Fself-host%2Finstall%2F&e=115120088 "Ссылка")
|
||||
но он какой-то невразумительный, имхо...Алгоритм - это мой опыт, не претендую на истину.
|
||||
1. Для сервера нужна отдельная машина. ПК или впс-вдс. У меня не получилось заставить работать клиент и сервер на одной машине. Оптимальный вариант, имхо, - vps kvm под ubuntu, debian или cent os. подойдет практически любой vps с минимально разумными ттх. я буду писать про установку сервера на vps под управлением ubuntu.
|
||||
2. Скачиваем свежий релиз здесь [https://github.com/rus…stdesk-server/releases](https://4pda.to/stat/go?u=https%3A%2F%2Fgithub.com%2Frustdesk%2Frustdesk-server%2Freleases&e=115120088 "Ссылка") распаковываем архив.
|
||||
```sh
|
||||
1. chmod +x hbbr chmod +x hbbs
|
||||
2. npm install pm2 -g - устанавливаем pm2
|
||||
3. pm2 start hbbs -- -r server_ip:21116 -k_
|
||||
pm2 start hbbr -- -k_
|
||||
```
|
||||
|
||||
Порт 21116 указан в оф туториале. Этот порт на машине нужно открыть. Аргумент -k_ запрещает подключение без ключа.
|
||||
В папке с файлами hbbr и hbbs при запуске сервера создается файл публичного ключа вида id_ed25519.pub. Нам нужно содержимое этого файла. Получаем его так:
|
||||
cat ./id_ed25519.pub
|
||||
|
||||
Либо заходим в нужную папку в приложении winscp - кому как удобнее.
|
||||
Открываем клиент - неважно, на винде, ведре... Суть одна. В поле id сервер вписываем айпи _сервера:порт. В поле key вводим содержимое файла публичного ключа.
|
||||
Всё, можно пользоваться.
|
||||
Самый простой способ проверить, что сервер работает - убрать ключ. При попытке подключения выскочит ошибка "несоответствие ключей".
|
||||
Посмотреть, кто подключался, можно командой Pm2 log.
|
||||
@@ -0,0 +1,25 @@
|
||||
Для проброса реально IP от NPM в Nextcloud необходимо добавить в config.php следующие поля:
|
||||
```
|
||||
'trusted_proxies' =>
|
||||
array (
|
||||
0 => '192.168.88.126',
|
||||
),
|
||||
|
||||
'forwarded_for_headers' =>
|
||||
array (
|
||||
0 => 'HTTP_X_FORWARDED_FOR',
|
||||
),
|
||||
```
|
||||
|
||||
При этом в сам NPM добавить следующие параметры
|
||||
```
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_hide_header Upgrade;
|
||||
```
|
||||
|
||||
В роутере (Openwrt):
|
||||
создать правило NAT, которое бы разрешало для proxy сервера получать внешние IP:
|
||||
![[Pasted image 20260406121204.png]]
|
||||
@@ -0,0 +1,14 @@
|
||||
**Проверяем конфиг файл, если его нет создаем:**
|
||||
/etc/apache2/conf-available/remoteip.conf
|
||||
|
||||
```xml
|
||||
<IfModule mod_remoteip.c>
|
||||
RemoteIPHeader X-Forwarded-For
|
||||
RemoteIPTrustedProxy 172.18.0.2
|
||||
</IfModule>
|
||||
```
|
||||
```xml
|
||||
a2enmod remoteip
|
||||
a2enconf remoteip
|
||||
systemctl restart apache2
|
||||
```
|
||||
@@ -0,0 +1,21 @@
|
||||
#linux #terminal
|
||||
|
||||
Информация о материнской плате:
|
||||
```sh
|
||||
cat /sys/devices/virtual/dmi/id/board_{vendor,name,version}
|
||||
```
|
||||
|
||||
О процессоре:
|
||||
```sh
|
||||
lscpu
|
||||
```
|
||||
|
||||
Информация о PCI:
|
||||
```sh
|
||||
lspci
|
||||
```
|
||||
|
||||
Информация о USB:
|
||||
```sh
|
||||
lsusb
|
||||
```
|
||||
@@ -0,0 +1,12 @@
|
||||
#java #SpringBoot
|
||||
|
||||
Сценарий: В приложении есть и традиционные веб-эндпоинты с Thymeleaf, и REST API.
|
||||
Нужно централизовать обработку ошибок (например, перехват ResourceNotFoundException):
|
||||
|
||||
Как вернуть страницу 404 для обычных web-эндпоинтов?
|
||||
|
||||
Как вернуть JSON с ошибкой 404 для REST API?
|
||||
|
||||
→
|
||||
@ControllerAdvice — используется с @Controller, возвращает view.
|
||||
@RestControllerAdvice — сочетает @ControllerAdvice + @ResponseBody (для REST API).
|
||||
@@ -0,0 +1,67 @@
|
||||
#java #абстракции
|
||||
|
||||
Одна из ключевых концепций ООП – абстракция. Мы постоянно используем её в [[Java]], даже не задумываясь. Но давайте разберёмся, зачем она нужна и как правильно применять.
|
||||
|
||||
📌 Что такое абстракция?
|
||||
Абстракция – это процесс выделения существенных характеристик объекта, скрывая при этом детали реализации. Это позволяет нам работать с объектами через их интерфейсы, а не конкретные реализации.
|
||||
|
||||
Пример из жизни:
|
||||
Когда вы едете на машине, вам не нужно знать, как работает двигатель. Достаточно уметь жать на газ, тормозить и поворачивать руль. Вот это и есть абстракция – вам доступен только необходимый интерфейс, а детали скрыты.
|
||||
|
||||
🔹 Как реализуется абстракция в Java?
|
||||
В Java абстракция достигается двумя способами:
|
||||
1. Абстрактные классы (abstract class)
|
||||
2. Интерфейсы (interface)
|
||||
|
||||
🚀 Абстрактные классы
|
||||
Абстрактный класс может содержать как реализованные, так и абстрактные (без реализации) методы. Его нельзя создать через new, он служит основой для дочерних классов.
|
||||
```java
|
||||
abstract class Vehicle {
|
||||
abstract void start(); // абстрактный метод, без реализации
|
||||
|
||||
void stop() {
|
||||
System.out.println("Машина остановилась");
|
||||
}
|
||||
}
|
||||
|
||||
class Car extends Vehicle {
|
||||
@Override
|
||||
void start() {
|
||||
System.out.println("Запуск двигателя...");
|
||||
}
|
||||
}
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
Vehicle car = new Car();
|
||||
car.start();
|
||||
car.stop();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
💡 Тут start() – это абстрактный метод, его реализация будет в Car. А вот stop() реализован в базовом классе.
|
||||
|
||||
🚀 Интерфейсы
|
||||
Интерфейсы содержат только сигнатуры методов (до Java 8), а с Java 8 можно добавлять default и static методы.
|
||||
|
||||
```java
|
||||
interface Engine {
|
||||
void start();
|
||||
}
|
||||
|
||||
class ElectricCar implements Engine {
|
||||
@Override
|
||||
public void start() {
|
||||
System.out.println("Электродвигатель включен!");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
📌 Разница между интерфейсом и абстрактным классом в том, что интерфейсы описывают, что класс ДОЛЖЕН делать, а абстрактные классы – как он МОЖЕТ это делать.
|
||||
|
||||
🎯 Где применять абстракцию?
|
||||
- Если у вас иерархия классов с общими методами – используйте абстрактный класс.
|
||||
- Если вам нужно гибкое поведение без наследования – используйте интерфейсы.
|
||||
|
||||
👉 Абстракция позволяет писать гибкий, расширяемый и поддерживаемый код, уменьшая зависимость от конкретных реализаций.
|
||||
@@ -0,0 +1,8 @@
|
||||
#java #SpringBoot
|
||||
|
||||
Сценарий: Ты добавил в проект стороннюю библиотеку (например, кастомный логгер) и просто положил её JAR в classpath.
|
||||
Без написания конфигурационных классов Spring автоматически подхватывает нужные бины.
|
||||
Объясни, как Spring Boot определяет и подключает их при старте.
|
||||
|
||||
→
|
||||
Использует SpringFactoriesLoader, который читает META-INF/spring.factories и конфигурирует бины в зависимости от содержимого classpath.
|
||||
@@ -0,0 +1,18 @@
|
||||
#java #поиск
|
||||
```java
|
||||
public class BinarySearch {
|
||||
public static int binarySearch(int[] arr, int target) {
|
||||
int left = 0, right = arr.length - 1;
|
||||
|
||||
while (left <= right) {
|
||||
int mid = (left + right) / 2;
|
||||
|
||||
if (arr[mid] == target) return mid;
|
||||
if (arr[mid] < target) left = mid + 1;
|
||||
else right = mid - 1;
|
||||
}
|
||||
|
||||
return -1; // элемент не найден
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,17 @@
|
||||
#java #коллекции
|
||||
|
||||
Коллекции [[Java]] и производительность
|
||||
🍩List (Списки)
|
||||
🟣ArrayList – быстрый доступ к элементам и их обход, но вставка/удаление в середине списка требует сдвига элементов.
|
||||
🟣LinkedList – удобен для вставки и удаления, но случайный доступ медленный, так как элементы обходятся с начала или конца.
|
||||
|
||||
🍩Set (Множества)
|
||||
🟣HashSet – быстрые операции добавления, удаления и поиска (за O(1)), но не сохраняет порядок элементов.
|
||||
🟣LinkedHashSet – сохраняет порядок вставки и быстрее перебирается, чем HashSet.
|
||||
🟣TreeSet – поддерживает сортировку, но операции добавления, удаления и поиска имеют логарифмическую сложность O(log n).
|
||||
|
||||
🍩Map (Словари/Отображения)
|
||||
🟣HashMap – обеспечивает O(1) доступ по ключу, но не сохраняет порядок. Возможны коллизии, которые могут замедлить работу.
|
||||
🟣LinkedHashMap – сохраняет порядок вставки и перебирается быстрее, чем HashMap.
|
||||
🟣TreeMap – хранит ключи в отсортированном порядке, но операции выполняются за O(log n).
|
||||
![[collection.jpg]]
|
||||
@@ -0,0 +1,23 @@
|
||||
#docker
|
||||
`docker compose up -d` Запуск всех сервисов в фоновом режиме.
|
||||
`docker compose down` Остановка и удаление контейнеров, сетей и служебных ресурсов проекта.
|
||||
`docker compose restart` Перезапуск всех сервисов проекта.
|
||||
`docker compose stop` Остановка сервисов без удаления контейнеров.
|
||||
`docker compose start` Запуск ранее остановленных контейнеров.
|
||||
`docker ps` Просмотр запущенных контейнеров.
|
||||
`docker ps -a` Просмотр всех контейнеров, включая остановленные.
|
||||
`docker compose ps` Просмотр состояния контейнеров текущего проекта.
|
||||
`docker stats` Мониторинг потребления CPU, RAM и сетевых ресурсов контейнерами в реальном времени.
|
||||
`docker compose logs` Просмотр журналов всех сервисов проекта.
|
||||
`docker compose logs -f` Просмотр журналов в режиме реального времени.
|
||||
`docker compose logs <service>` Просмотр журналов конкретного сервиса.
|
||||
`docker logs <container>` Просмотр журналов конкретного контейнера.
|
||||
`docker inspect <container>` Получение полной информации о контейнере (сеть, тома, переменные окружения и др.).
|
||||
`docker exec -it <container> bash` Подключение к оболочке контейнера для диагностики и выполнения команд.
|
||||
`docker exec -it <container> sh` Аналогично для контейнеров без Bash.
|
||||
`docker top <container>` Просмотр процессов внутри контейнера.
|
||||
`docker images` Список локальных Docker-образов.
|
||||
`docker image inspect <image>` Информация об образе.
|
||||
`docker system df` Статистика использования диска Docker.
|
||||
`docker volume ls` Список томов Docker.
|
||||
`docker network ls` Список сетей Docker.
|
||||
@@ -0,0 +1,7 @@
|
||||
#java #SpringBoot
|
||||
|
||||
Сценарий: Твой публичный API перегружен — один клиент шлет слишком много запросов, мешая остальным.
|
||||
Какой практичный, независимый от технологий подход можно применить для ограничения, например, 100 запросов в минуту на клиента, и где обычно реализуется такая логика?
|
||||
|
||||
→
|
||||
Bucket4j / Resilience4j, счетчики в Redis, лимитирование на уровне API Gateway.
|
||||
@@ -0,0 +1,11 @@
|
||||
```java
|
||||
public class MaxInArray {
|
||||
public static int findMax(int[] arr) {
|
||||
int max = arr[0];
|
||||
for (int num : arr) {
|
||||
if (num > max) max = num;
|
||||
}
|
||||
return max;
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,3 @@
|
||||
#java
|
||||
|
||||
Потому что интерфейс описывает контракт, а не состояние. Все поля интерфейса — это константы, доступные без создания экземпляра. Они автоматически public static final, даже без явного указания.
|
||||
@@ -0,0 +1,15 @@
|
||||
```java
|
||||
public class PalindromeCheck {
|
||||
public static boolean isPalindrome(String str) {
|
||||
int left = 0, right = str.length() - 1;
|
||||
|
||||
while (left < right) {
|
||||
if (str.charAt(left++) != str.charAt(right--)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,7 @@
|
||||
#java #SpringBoot
|
||||
|
||||
Сценарий: В микросервисной архитектуре оформление заказа включает два шага — списание товара в Inventory Service и списание денег через Payment Service.
|
||||
Если списание товара прошло успешно, а оплата — нет, какой шаблон проектирования поможет откатить изменения в Inventory и обеспечить согласованность данных?
|
||||
|
||||
→
|
||||
Шаблон Saga (хореография или оркестрация), либо двухфазный коммит (2PC, но редко используется на практике).
|
||||
@@ -0,0 +1,10 @@
|
||||
#java #SpringBoot
|
||||
|
||||
Сценарий: У тебя есть OrderService с методом createOrder(), помеченным @Transactional.
|
||||
Внутри он вызывает updateInventory() (тоже в OrderService и тоже с @Transactional).
|
||||
Если updateInventory() выбрасывает runtime-исключение, что произойдет с транзакцией, начатой в createOrder()?
|
||||
Как изменить дизайн, если нужно, чтобы оба метода выполнялись в отдельных, независимых транзакциях?
|
||||
|
||||
→
|
||||
Транзакция не будет распространяться (прокси не сработает при внутреннем вызове).
|
||||
Решение — self-injection (внедрение самого себя как зависимости) или использование AOP.
|
||||
@@ -0,0 +1,8 @@
|
||||
#java #SpringBoot
|
||||
|
||||
Сценарий: Нужно хранить товары пользователя в корзине и управлять временным списком поисковых фильтров, который очищается после каждого HTTP-запроса.
|
||||
Какой скоуп ты выберешь для ShoppingCart и какой — для SearchFilter, и почему?
|
||||
|
||||
→
|
||||
@SessionScope — для корзины (привязано к пользовательской сессии),
|
||||
@RequestScope — для поискового фильтра (новый бин на каждый HTTP-запрос).
|
||||
@@ -0,0 +1,17 @@
|
||||
```java
|
||||
public class BubbleSort {
|
||||
public static void bubbleSort(int[] arr) {
|
||||
int n = arr.length;
|
||||
for (int i = 0; i < n - 1; i++) {
|
||||
for (int j = 0; j < n - i - 1; j++) {
|
||||
if (arr[j] > arr[j + 1]) {
|
||||
// обмен
|
||||
int temp = arr[j];
|
||||
arr[j] = arr[j + 1];
|
||||
arr[j + 1] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,10 @@
|
||||
#Java #SpringBoot
|
||||
|
||||
Сценарий: Представь, что ты проектируешь сложную e-commerce платформу. Где ты используешь интерфейс с аннотацией
|
||||
@Repository, а где — с аннотацией @Service? Приведи конкретный пример, какую роль каждая из этих аннотаций играет в процессе оформления заказа пользователем.
|
||||
|
||||
→
|
||||
@Component — универсальный бин,
|
||||
@Service — бизнес-логика,
|
||||
@Repository — DAO + перевод исключений в DataAccessException,
|
||||
@Controller — контроллер уровня MVC.
|
||||
@@ -0,0 +1,8 @@
|
||||
```java
|
||||
public class Factorial {
|
||||
public static long factorial(int n) {
|
||||
if (n <= 1) return 1;
|
||||
return n * factorial(n - 1);
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,9 @@
|
||||
Ключевое слово final в [[Java]] — это модификатор, который может применяться к переменным, методам и классам. Когда оно используется с переменной, это делает её неизменяемой, другими словами — константой. Например, переменная PI объявлена как final в классе ниже:
|
||||
```java
|
||||
public class CircleCalculator {
|
||||
private final double PI = 3.14159;
|
||||
public double calculateArea(double radius) {
|
||||
return PI * radius * radius;
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,8 @@
|
||||
#java #SpringBoot
|
||||
|
||||
Сценарий: Коллега добавил новую фичу, и теперь твое Spring-приложение не стартует, выдавая BeanCurrentlyInCreationException из-за циклической зависимости между ServiceA и ServiceB.
|
||||
Предположим, что быстро переработать бизнес-логику невозможно. Какое минимальное изменение кода ты бы предложил, чтобы приложение хотя бы запустилось, и почему это считается временным решением?
|
||||
|
||||
→
|
||||
Spring по умолчанию может использовать проксирование и конструкторную/сеттерную инъекцию.
|
||||
Лучшее решение — перепроектировать зависимости или использовать @Lazy.
|
||||
@@ -0,0 +1,3 @@
|
||||
#java
|
||||
Объект - это объединение данных и кода, который эти данные обрабатывает ()
|
||||
Класс - это шаблон описания объектов. В классе могут описываться поля, методы, конструкторы и другие классы.
|
||||
@@ -0,0 +1,81 @@
|
||||
#PostgreSQL #PostgreSQL #SQL
|
||||
|
||||
-- ***********************************
|
||||
-- Редактирование таблиц, расширенные возможности SELECT, функции
|
||||
-- ***********************************
|
||||
|
||||
-- Добавление поля в таблицу
|
||||
```sql
|
||||
ALTER TABLE table_name ADD COLUMN new_field
|
||||
BOOLEAN NOT NULL DEFAULT TRUE;
|
||||
```
|
||||
|
||||
-- добавление поля с автоинкрементом и primary key в таблицу
|
||||
```sql
|
||||
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
|
||||
```
|
||||
|
||||
-- Удаление поля из таблицы
|
||||
```sql
|
||||
ALTER TABLE table_name DROP COLUMN new_field;
|
||||
```
|
||||
|
||||
-- переименовать поле
|
||||
```sql
|
||||
ALTER TABLE table_name RENAME old_field TO new_field;
|
||||
```
|
||||
|
||||
-- сменить тип данных
|
||||
```sql
|
||||
ALTER TABLE table_name ALTER COLUMN any_field SET
|
||||
DATA TYPE VARCHAR(255);
|
||||
```
|
||||
|
||||
-- изменить значение по умолчанию
|
||||
```sql
|
||||
ALTER TABLE table_name ALTER COLUMN any_field SET
|
||||
DEFAULT 'new value';
|
||||
```
|
||||
|
||||
-- добавить/удалить constraint NOT NULL
|
||||
```sql
|
||||
ALTER TABLE table_name ALTER COLUMN any_field
|
||||
SET|DROP NOT NULL;
|
||||
```
|
||||
|
||||
-- переименовать таблицу
|
||||
```sql
|
||||
ALTER TABLE table_name RENAME TO new_table_name;
|
||||
```
|
||||
|
||||
-- Расширенные возможности SELECT
|
||||
```sql
|
||||
SELECT * FROM table WHERE field1 LIKE 'value'; -- field1 = 'value'
|
||||
SELECT * FROM table WHERE field1 LIKE 'val%'; -- field1 начинается с 'val'
|
||||
SELECT * FROM table WHERE field1 LIKE '%lue'; -- field1 заканчивается на 'lue'
|
||||
SELECT * FROM table WHERE field1 LIKE '%e%'; -- field1 содержит 'e'
|
||||
```
|
||||
несколько условий
|
||||
```sql
|
||||
SELECT * FROM table WHERE field1 = 'value' AND field2 > 'value2';
|
||||
SELECT * FROM table WHERE field1 = 'value' OR field2 > 'value2';
|
||||
```
|
||||
|
||||
|
||||
-- вывод уникальных записей
|
||||
```sql
|
||||
SELECT DISTINCT field1 FROM table;
|
||||
```
|
||||
|
||||
-- группирование записей
|
||||
```sql
|
||||
SELECT field1, COUNT(field1) FROM table GROUP BY field1;
|
||||
```
|
||||
|
||||
|
||||
-- сгруппирует записи таблицы table по полю field и выведет уникальные значения field и количество повторений
|
||||
```sql
|
||||
```
|
||||
SELECT field1, COUNT(field1) FROM table GROUP BY field1
|
||||
HAVING COUNT(field) > 3;
|
||||
-- сгруппирует записи таблицы table по полю field и выведет уникальные значения field и количество повторений, где количество повторений больше 3
|
||||
@@ -0,0 +1,107 @@
|
||||
#PostgreSQL #PostgreSQL #SQL
|
||||
|
||||
Перенес в my-mans
|
||||
|
||||
-- подключиться к postgres (утилита psql)
|
||||
```bash
|
||||
psql -U postgres
|
||||
```
|
||||
|
||||
-- команды помощи
|
||||
help
|
||||
\h -- помощь по командам SQL
|
||||
\? -- помощь по командам psql
|
||||
|
||||
-- выход из консоли postgres
|
||||
\q
|
||||
|
||||
-- создать базу
|
||||
```sql
|
||||
CREATE DATABASE my_database;
|
||||
```
|
||||
|
||||
-- подключиться к базе
|
||||
```
|
||||
\connect my_database;
|
||||
```
|
||||
|
||||
-- создать таблицу my_table с полями field1 (тип целочисленный, обязательное для заполнения), field2 (тип строка 255 символов)
|
||||
```sql
|
||||
CREATE TABLE my_table (field1 INT NOT NULL, field2 VARCHAR(255));
|
||||
```
|
||||
|
||||
-- вывести все таблицы
|
||||
```sh
|
||||
\d
|
||||
```
|
||||
|
||||
-- удалить таблицу my_table
|
||||
```sql
|
||||
DROP TABLE my_table;
|
||||
```
|
||||
|
||||
-- внести в таблицу запись
|
||||
```sql
|
||||
INSERT INTO my_table(field1, field2) VALUES(1,'Any text value');
|
||||
```
|
||||
|
||||
-- вывести записи
|
||||
```sql
|
||||
SELECT * FROM my_table; -- все записи
|
||||
SELECT * FROM my_table WHERE field1 = 1; -- все, где field1 = 1
|
||||
SELECT * FROM my_table WHERE field1 != 1; -- и т д
|
||||
SELECT * FROM my_table WHERE field1 > 1;
|
||||
SELECT * FROM my_table LIMIT 100; -- первые 100 записей;
|
||||
SELECT * FROM my_table LIMIT 100 OFFSET 200; -- запись с 201 по 300;
|
||||
```
|
||||
|
||||
-- сортировка при выводе
|
||||
```sql
|
||||
SELECT * FROM my_table ORDER BY field1 ASC; -- вывести отсортировав в возрастающем порядке
|
||||
SELECT * FROM my_table ORDER BY field1 DESC; -- вывести отсортировав в убывающем порядке
|
||||
```
|
||||
|
||||
-- изменить запись таблицы (поле field2 строки, где field1 = 1);
|
||||
```sql
|
||||
UPDATE my_table SET field2 = 'Other text value' WHERE field1 = 1;
|
||||
```
|
||||
|
||||
-- удаление данных
|
||||
```sql
|
||||
DELETE FROM my_table; -- удалить все записи;
|
||||
DELETE FROM my_table WHERE field1 = 1; -- удалить запись где field1 = 1;
|
||||
```
|
||||
|
||||
|
||||
-- ***********************************
|
||||
-- нормализация (разбиение таблиц на несколько)
|
||||
-- ***********************************
|
||||
|
||||
-- Constraints - ограничения типов данных
|
||||
```sql
|
||||
CREATE TABLE my_table (
|
||||
field1 INT NOT NULL, -- запись обязательна
|
||||
field2 VARCHAR(255) NOT NULL UNIQUE, -- запись должна быть уникальной
|
||||
field3 BOOLEAN NOT NULL DEFAULT TRUE -- значение по умолчанию - true
|
||||
...
|
||||
);
|
||||
```
|
||||
|
||||
-- Первичный и внешние ключи
|
||||
-- при создании записи таблицы с отсутствующим внешним ключом выведется запись об ошибке. будут выводится ошибки и в иных случаях, когда будут нарушаться связи.
|
||||
CREATE TABLE IF NOT EXISTS my_table ( -- ключ IF NOT EXISTS проверяет, существует ли таблица.
|
||||
field1 SERIAL INT PRIMARY KEY, -- при добавлении PRIMARY KEY поле автоматически наследует ограничения NOT NULL и UNIQUE, и создается индекс. SERIAL тип данных являющийся автоматически увеличивающимся счетчиком (аналог ключа AUTOINCREMENT в Sqlite)
|
||||
field2 VARCHAR(255) NOT NULL UNIQUE,
|
||||
field3 INT NOT NULL,
|
||||
FOREIGN KEY(field3) REFERENCES other_table(field_name) -- поле ссылается на внешнюю таблицу other_table на поле field_name, которое обязательно должно быть с PRIMARY KEY
|
||||
);
|
||||
|
||||
-- вывод данных из нескольких таблиц со связанными полями
|
||||
```sql
|
||||
SELECT * FROM table_1 LEFT JOIN table_2 ON (table_2.field = table_1.field);
|
||||
```
|
||||
|
||||
-- алиасы, нужны для удобства. Также, при выводе наименование таблиц или полей выводится алиасом, при его наличии.
|
||||
```sql
|
||||
SELECT * FROM table_1 as tab1 LEFT JOIN table_2 as tab2 ON (tab1.field = tab2.field);
|
||||
```
|
||||
@@ -0,0 +1,18 @@
|
||||
#ATMError
|
||||
ATM fitness returned to normal
|
||||
Command rejected: No reason provided
|
||||
Update failed. Command rejected
|
||||
Request close
|
||||
Fetch hardware start
|
||||
ATM fitness returned to normal. Can open
|
||||
|
||||
Для решения в ПО TellME поправили SecurityFlag
|
||||
```
|
||||
было неправильно:
|
||||
0000000010
|
||||
|
||||
Стало:
|
||||
1100000010
|
||||
```
|
||||
|
||||
Иногда (замечено на dvl) кончается лицензия TellMe
|
||||
@@ -0,0 +1,13 @@
|
||||
#ATMError #wincor #TWO
|
||||
|
||||
В промежуточном запросе (например уведомление о комиссии) не посылаются EMV данные, что вызывало ошибку на АТМ wincor
|
||||
Sending 43 bytes at Thu Oct 02 16:59:56 2025:
|
||||
|
||||
`22[FS]000104010[FS][FS]8[FS]e1[FS]2[FS]29F0607A0000006581010[FS]`
|
||||
|
||||
`Solicited Status`
|
||||
`Device Fault`
|
||||
`EMV`
|
||||
|
||||
Для ее решения необходимо в TWO установить признак отправки EMV-данных:
|
||||
![[Pasted image 20251003185028.png]]
|
||||
@@ -0,0 +1 @@
|
||||
92586171 4267 -> 4420
|
||||
@@ -0,0 +1 @@
|
||||
![[Pasted image 20260421163929.png|697]]
|
||||
@@ -0,0 +1,4 @@
|
||||
#ddc #ndc #tellme
|
||||
Конфигурации в проде:
|
||||
5514 - Прио-Внешторгбанк+NewPINchange +MIR+MasterCard+Visa+pictures+jpg
|
||||
5515 - Прио-Внешторгбанк+NewPINchange+MIR+MasterCard+Visa+jpg+CashIn
|
||||
@@ -0,0 +1,15 @@
|
||||
#ATM #tellme
|
||||
Security Flags – флаги безопасности
|
||||
|
||||
Параметр, определяющий настройки безопасности. Может принимать следующие значения: ABXXXXXCDE
|
||||
|
||||
A = 0 — не проверять TVN в TR Reply;
|
||||
A = 1 — проверять TVN в TR Reply;
|
||||
B = 0 — не отсылать TVN и MAC в TR Request;
|
||||
B = 1 — отсылать TVN и MAC в TR Request;
|
||||
C = 0 — не проверять Security Terminal Number в TR Reply;
|
||||
C = 1 — проверять Security Terminal Number в TR Reply;
|
||||
D = 0 — вычислять MAC по всему сообщению;
|
||||
D = 1 — вычислять MAC по выборочным полям;
|
||||
E = 0 — не отсылать TVN и MAC в Solicited Status;
|
||||
E = 1 — отсылать TVN и MAC в Solicited Status
|
||||
@@ -0,0 +1,6 @@
|
||||
[[Карты]]
|
||||
[[Статусы карт в TWO]]
|
||||
[[Функции АТМ]]
|
||||
[[Номер УС в TWO]]
|
||||
[[Функции АТМ]]
|
||||
[[Безкарточные операции]]
|
||||
@@ -0,0 +1,3 @@
|
||||
#СИТЭС
|
||||
Коллеги, в логе теста 18 во второй команде GenAC TVR = 8000048020, Вы демонстрируете значение из первой команды, до выполнения эмитентского скрипта. Просьба прокомментировать.
|
||||
В чеке гвоздями прибил значение 8000048020, после этого тест прошли.
|
||||
@@ -0,0 +1,2 @@
|
||||
#СИТЭС
|
||||
![[Pasted image 20250902133154.png]]В данном случае значение берется из четвёртого поля. Сообщили в НСПК, они поправили на своей стороне, тест пройден.
|
||||
@@ -0,0 +1,7 @@
|
||||
#СИТЭС
|
||||
1. Вычистить AID A0000006581099 из конфигурации.
|
||||
2. Очистить содержимое каталога C:\scs\atm_h\ConfigNDC\NDC\CAM (в частности acc_aids.ini).
|
||||
3. Вычистить упоминания об AID A0000006581099 из файла C:\scs\atm_h\DataNdc\emv_ndc.cfg.
|
||||
4. Перезагрузить АТМ.
|
||||
5. Прогрузить конфигурацию и пройти тест.
|
||||
Готовые файлы лежат в облаке \work\docs\СИТЭС.
|
||||
@@ -0,0 +1,4 @@
|
||||
#Tx #TranzAxis
|
||||
В дочерних конфигурациях необходимо как минимум перекрыть конфигурационные параметры.
|
||||
|
||||
Интерфейс разделен на 2. В верхней части ==групповые команды!== В нижней части ==по выбранному бвнкомату==
|
||||
@@ -0,0 +1,6 @@
|
||||
#webius #экран_атм
|
||||
Для вертикального разделения экрана (сверху реклама, снизу ndc) идут картинки со своим разрешением:
|
||||
- ndc - картинки с разрешением 1080х816;
|
||||
- верхний рекламный блок - 1080х1104.
|
||||
Команда экрана "вывести графический файл"
|
||||
C:\webiusbrowser\advertising\pic\idle1.png
|
||||
@@ -0,0 +1,5 @@
|
||||
#ATM #tellme
|
||||
Для передачи маленьких сумм на хост, необходимо взять в кавычки:
|
||||
![[Pasted image 20250902154440.png]]
|
||||
Для передачи больших сумм (100 тысяч и выше), необходимо выставлять соответствующую букву:
|
||||
![[Pasted image 20250902154455.png]]
|
||||
@@ -0,0 +1,13 @@
|
||||
#TranzAxis
|
||||
В TX экран аналогичный BNATAKECASH задается в адаптере протокола в настройках операции **Cash/Cheque Deposit** (и других операций с вложением наличных) на вкладках **Response Parameters > Operation/Transaction Declined**. Это экран **Operation/Transaction Declined screen** (задается для любой причины отклонения на вкладке **General** и в зависимости от причины отклонения на вкладке **Details**). Обратите внимание еще на это примечание к данному экрану в спецификации AANDC:
|
||||
|
||||
> **Table Note 100**: If the screen referenced in the Transaction Reply
|
||||
> only contains nested screens, the first nested screen is displayed
|
||||
> when the notes are presented; and the second nested screen is
|
||||
> displayed when the notes are being retracted (if the customer has
|
||||
> not taken the notes and Advance NDC has been configured to
|
||||
> retract the notes). If the screen referenced in the Transaction Reply
|
||||
> contains more than nested screens, it is fully displayed when the
|
||||
> notes are presented.
|
||||
|
||||
Т.е. в нем можно передавать 2 экрана для случая нормального взятия возвращенных денег и для случая их ретракта по таймауту взятия.
|
||||
@@ -0,0 +1,7 @@
|
||||
#tellme #ndc
|
||||
Одну из причин можно увидеть в erl логе банкомата
|
||||
```
|
||||
NDPCA:00FD1007:10:8100O:CNdcProtocol::m_MsgSaveEnhConfigInfo inv option value!
|
||||
```
|
||||
|
||||
Для ее решения необходимо понизить 69 параметр до значения 003
|
||||
@@ -0,0 +1,12 @@
|
||||
````
|
||||
```dataview
|
||||
TABLE WITHOUT ID
|
||||
file.link AS Проект,
|
||||
Статус,
|
||||
(length(filter(file.tasks.completed, (t) => t = true))) / (length(file.tasks.text)) * 100 AS "% Завершено",
|
||||
(length(file.tasks.text)) AS Всего,
|
||||
(length(filter(file.tasks.completed, (t) => t = true))) AS Завершённых,
|
||||
(length(file.tasks.text)) - (length(filter(file.tasks.completed, (t) => t = true))) AS "Незавршенных"
|
||||
FROM #проекты
|
||||
```
|
||||
````
|
||||
@@ -0,0 +1,12 @@
|
||||
Если на терминале используется несколько типов бескарточных операций, то разным кнопкам можно назначить разные номера начальных стейтов. Для этого необходимо в каталоге C:\SCS\atm_h\ConfigNdc\NDC\Custom создать файл cardless.ini.
|
||||
|
||||
В секции CardlessEntryStates необходимо задать набор значений XXX=YYY, где
|
||||
|
||||
XXX — битовая маска соответствующей кнопки (3 десятичные цифры);
|
||||
YYY — номер начального стейта.
|
||||
|
||||
Например, для перехода по левой верхней кнопке на стейт 121, а по правой нижней — на стейт 122, необходимо задать следующие параметры:
|
||||
|
||||
[CardlessEntryStates]
|
||||
001=121
|
||||
128=122
|
||||
@@ -0,0 +1,148 @@
|
||||
#VBAM #PH2
|
||||
|
||||
| Провайдер | | Op. Code |
|
||||
| ------------------- | ------ | -------- |
|
||||
| ROSTELECOM | 279001 | GIDAA___ |
|
||||
| GASPROM CONSUMPTION | 279002 | B_ |
|
||||
| GASPROM SERVICE | 279003 | _C |
|
||||
| ELECTRICITY | 279004 | D_ |
|
||||
| UCOM MOBILE | 279005 | GID_G___ |
|
||||
| MOBILE | 279006 | GID_H___ |
|
||||
| IDRAM | 279007 | GID_I___ |
|
||||
| BEELINE FIXED | 279008 | GID_A___ |
|
||||
| BEELINE MOBILE | 279008 | GID_B___ |
|
||||
| VIVACELL MTS | 279008 | GIDA____ |
|
||||
| WATER EREVAN | 279012 | AC |
|
||||
| WATER REGIONG | 279013 | AD |
|
||||
|
||||
|
||||
В dvl
|
||||
добавлены экраны шаблонов приложений 531, 532, 533, 534. Добавлены экраны списка приложений 539, 540.
|
||||
Добавлены экраны выбора приложений.
|
||||
|
||||
- 07.02.2024
|
||||
Обновлен экран стейта 045 с 000 на 044.
|
||||
Обновлен таймер time-out с 60 до 30 секунд.
|
||||
Обновлен экран 077 - добавлена команда установки цвета.
|
||||
Добавлены экраны 39 и 40 "возьмите деньги" "не забудьте чек".
|
||||
Обновлена ветка "слабый пин" при смене пин-кода.
|
||||
Обновлена ветка "неверный пин" при смене пин-кода.
|
||||
Убраны ".00" из экрана 001
|
||||
|
||||
- 21.02.2024
|
||||
Добавлен st ;274
|
||||
Изменён st 261 теперь идет на 274
|
||||
Добавлен экран 41
|
||||
Обновлены служебные экраны на 041
|
||||
|
||||
- 22.02.2024
|
||||
Обновлен st 148
|
||||
Изменена последовательность языков в ICC параметрах.
|
||||
|
||||
- 28.02.2024
|
||||
Обновлены st 095 и 096 - добавлена отмена.
|
||||
Заменена картинка 178-en для экрана 178 армянского языка.
|
||||
Обновлен st 062F062141137255075062028007. Вместо экранной отмены - переход в главное меню.
|
||||
Обновлен st 174 -> 052 ;052021000000000000000000
|
||||
|
||||
- 05.03.2024
|
||||
Добавлен st 275Y и st 276W
|
||||
В st F (кнопка позиции F) и H (кнопка позиции F) экраная кнопка "отмена" переходит на 275Y
|
||||
st F 062, 077, 105, 106, 107, 108, 192, 707, 751, 800, 801, 802, 803.
|
||||
st H 103, 126, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 214, 215, 217, 217, 230, 232.
|
||||
При p2p сделать переход на экран 3.10 (не отмена а шаг назад)
|
||||
p2p после ввод суммы при отменен показать 3.10
|
||||
з2з итр 14,6 есть ли возможность сделать шаг назад
|
||||
17,6 тоже посмотреть
|
||||
17,16 тоже посмотреть
|
||||
|
||||
- 12.03.2024
|
||||
Добавлен st 278/
|
||||
Платежи по Ростелекому идут с 192А -> 278/ вместо 046I
|
||||
добавлен st 281W (W231231255255028255255255)
|
||||
st 233Y теперь идет на 281W вместо 231D
|
||||
|
||||
- 13.03.2024
|
||||
Обновить экран 751 в проде
|
||||
Обновить чеки в prod (payment и bill payment)
|
||||
Добавить st282F000141137255166282275000 (UNABLEPROCAMNT)
|
||||
Добавить st283;282282000000000000000000
|
||||
Добавить экран 282
|
||||
|
||||
- 21.03.2024
|
||||
Добавить st778j и экран 778
|
||||
|
||||
178 187
|
||||
|
||||
Rostelecom 001 AA
|
||||
002 B_
|
||||
003 _C
|
||||
004 D_
|
||||
Ucom Mobile 005 _G
|
||||
Ucom 006 _H
|
||||
007 _I
|
||||
Telecom Armenia Mobile (Beeline) 008 _A
|
||||
Telecom Armenia Fixed (Beeline) 009 _B
|
||||
010 _D
|
||||
011 A_
|
||||
012 AC
|
||||
013 AD
|
||||
|
||||
- 02.05.2024
|
||||
изменен стейт 95
|
||||
|
||||
13.05.2024
|
||||
Изменен экран 751:
|
||||
`было:`
|
||||
`@@PEC:\mk\751.jpg\[20;80mICZ#TI`
|
||||
`стало:`
|
||||
`@@PEC:\mk\751.jpg\[20;80mIAZ#TIILAMD`
|
||||
|
||||
- 17.05.2024
|
||||
Обновлен st122
|
||||
было стало
|
||||
D117225192032000001000000 D117225064032000001000000
|
||||
|
||||
- 09.08.2024
|
||||
dvl
|
||||
конфигурация 3013
|
||||
Для стейта 71 изменен стейт Z с номера 072 на 293
|
||||
|
||||
- 13.08.2024
|
||||
dvl
|
||||
конфигурация 3010
|
||||
добавлены стейты приема 296, 298.
|
||||
Добавлен стейт 295;
|
||||
Все стейты приема идут на 295, затем на 144
|
||||
|
||||
- 29.08.2024
|
||||
dvl
|
||||
Добавлен экран C05 (как C02)
|
||||
Z032 изменен на ВЕРНУТЬ ДЕНЬГИ
|
||||
145 изменен на Y
|
||||
Добавлен экран 145
|
||||
|
||||
- 03.04.2025
|
||||
Отключены все активные FDK кномпки на следующих стейтах:
|
||||
006m;
|
||||
044m;
|
||||
045m.
|
||||
Обновлено дополнение к стейту 199:
|
||||
Z201097201201201201201131
|
||||
|
||||
- 17.04.2025
|
||||
Добавлены
|
||||
Экран 130 @@PEc:\mk\131.jpg\
|
||||
Стейт 308 и помечен как Restricted Card
|
||||
J130000130003130000000000
|
||||
|
||||
- 15.09.2025
|
||||
В конфигурациях 3113 и 3312 внесены следующие изменения:
|
||||
В конфигурационных параметрах отключен переход на 410 стейт (параметр 77)
|
||||
В конфигурациях 3113 и 3111 внесены следующие изменения:
|
||||
Добавлен st 312W416416416416416255255255 (переход на отмену операции на st416 ):
|
||||
`было`
|
||||
`312W417417417417417255255255`
|
||||
`стало`
|
||||
`312W416416416416416255255255`
|
||||
st410 теперь ссылается на 312 (ранее на главное бескарточных операций).
|
||||
@@ -0,0 +1,6 @@
|
||||
#VBKZ #PH2
|
||||
|
||||
Клиентский путь:
|
||||
![[Monimax_8600S (002).png]]
|
||||
В новый сценарий встроить поддержку комиссий
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
#PH2 #VBKZ
|
||||
2 типи устройств:
|
||||
ITP
|
||||
- 200 - IPT KZ
|
||||
ATM:
|
||||
- 202 - VBKZ_8600s-virt-cards-ver4;
|
||||
- 2052 - Kazakh_Wincor_win7-Transfers+SMS+$+CUP+MIRи+Payment-New_Menu-Cash_after_card (cp 2055);
|
||||
- 2063 - Kazahstan NCR Win7 + VMT+CUP+Payment+MIR-new_menu+deposit+jpg-cash_after_card-NoNFC;
|
||||
- 2068 - VBKZ_Opteva_522_Agilis_NDC_lang_offset_300
|
||||
|
||||
2052 WincorNDC (Wincor 1500/2050)
|
||||
- используется подложка из pcx фоновых картинок с ndc текстом на трёх языках (с языковыми банками).
|
||||
|
||||
2063 NDC (NCR 6632/6634)
|
||||
- используется подложка из jpg фоновых картинок с ndc текстом на трёх языках (с языковыми банками).
|
||||
|
||||
2068 NDC (Diebold Opteva 522)
|
||||
- используется подложка из jpg фоновых картинок с ndc текстом на трёх языках путем языкового смещения(300).
|
||||
@@ -0,0 +1,16 @@
|
||||
#VBKZ
|
||||
|
||||
Недостающие картинки для [[ВТБ Казахстан МВПО]]
|
||||
- [ ] В следствии технической неисправности, ваш запрос не может быть выполнен.
|
||||
- [ ] Вы превысили лимит на проведение данной операции.
|
||||
- [ ] Ваш запрос отклонен пожалуйста, возьмите карту.
|
||||
- [ ] Эта операция не разрешена вашим-эмитентом.
|
||||
|
||||
Конфигурация 2058
|
||||
|
||||
| состояние | экран | Текст |
|
||||
| --------- | ----- | ------------------------------------------------ |
|
||||
| 199 | 199 | Вы превысили лимит на проведение данной операции |
|
||||
| 155 | 144 | |
|
||||
| 150 | 150 | Ваш запрос отклонен пожалуйста, возьмите карту |
|
||||
| 158 | 158 | Ваш запрос отклонен пожалуйста, возьмите карту |
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user