Pull to refresh

Comments 81

Приложение может и хорошее, но выкладывать скомпилированный бинарник и давать на него ссылку в то время когда все говорят, что не стоит скачивать и тем более устанавливать файлы из непроверенных источников - это не очень хорошая идея. А если в это приложение украдет все мои пароли?

Вот если бы в статье было описание исходников и ссылка на них тогда можно и посмотреть, что у вас получилось.

выкладывать скомпилированный бинарник и давать на него ссылку в то время когда все говорят, что не стоит скачивать и тем более устанавливать файлы из непроверенных источников - это не очень хорошая идея.

Ну мало ли, а вдруг кто и поведётся?/s

Возможно, что автор просто еще не дошел до изучения git и сервисов для хранения открытых исходников.

Слушай. Ты антивирусом не умеешь пользоваться что ли. А прикинь, если апп вообще без исходников было б и платное и - что?

Ты антивирусом не умеешь пользоваться что ли

Антивирусом пользуешься не ты, а тебя пользуют. В большинстве случаев.

Когда я раньше баловался vb а потом шарпом, то сам удивлялся что ни один антивирусник ничего не говорит на приложение которое например берет твои куки браузеров и отправляет их по сети.

Да даже на кейлоггер не ругались.

Если антивирус ничего не нашёл, это значит только, что антивирус ничего не нашёл.

Ну да, и virustotal если ничего не нашёл - то если нет исходников и тонны времени ковырятся в чужом коде - то лучше не запускать приложение, а то ещё вирус подхватишь. Ну его...

Спасибо вам за критику.
Есть несколько причин, по которым я не выкладываю исходники в открытый доступ:

  • В приложении есть возможность шифрования содержимого документов, если логика дешифрования станет доступна, можно будет ею воспользоваться, а я сам храню в Data Organizer важную информацию. Понимаю что любые данные при желании можно вскрыть, но все же, вдруг приложение станет востребованным и просто не хочется кого-то подставить.

  • Я использую проприетарные компоненты от Telerik (сам купил лицензию) и Syncfusion (комьюнити лицензия). У Syncfusion странная система лицензирования компонентов, вынуждающая прописывать ключ прямо в коде, не хотелось бы его светить, на всякий случай, чтобы мой аккаунт не заблокировали.

Если у кого-нибудь есть идеи, как это можно обойти, то я бы с радостью выложил исходники в открытый доступ.

В приложении есть возможность шифрования содержимого документов, если логика дешифрования станет доступна, можно будет ею воспользоваться,

У вас в приложении своя собственная логика шифрования? LOL, удачи вам и творческих успехов :)))

В приложении есть возможность шифрования содержимого документов, если логика дешифрования станет доступна, можно будет ею воспользоваться

Ну вот, приехали )))) Security through obscurity на самописных велосипедах? Если так, то можете считать, что никакого шифрования у вас нет.

Если так, то можете считать, что никакого шифрования у вас нет.

Теоретически, можно что-нибудь и своё интересное придумать, но со "своим интересным" тогда можно и неприятностей, как когда-то Циммерман, себе нажить.

Раньше был такой анекдот:

Когда поздно вечером в дверь англичанина раздаётся стук, он, конечно, может предположить, что это королева пришла провести с ним ночь, но, скорее всего, это у соседа кончилась соль.

С самописной системой шифрования обычно что-то похожее происходит. Циммерман более 10 лет специализировался на криптографии, прежде чем PGP написал. Это то самое исключение, подтверждающее правило.

  1. Логика шифрования/дешифрования должна опираться на стандартные, проверенные и открытые решения. Тогда и самому писать ее не нужно, и причин прятать нет. Я с гораздо большим недоверием отношусь к программе, алгоритм шифрования которой мне неизвестен, чем к открытой программе вообще без шифрования. Так как программа хранит мои текстовые данные, я хочу иметь доступ к этим данным независимо от существования этой программы, на том простом основании, что данные - мои. Как только данные зашифрованы неизвестным алгоритмом, я немедленно теряю контроль над ними, мне просто дают ими попользоваться. Однажды могут и не дать, письменных гарантий я не получал))) В общем банально прикрутить RSA и дать пользователям хранить у себя ключик было бы маленькой задачей для программиста, но огромным скачком для программы)

  2. Прямо в коде теоретически можно вызвать переменную окружения или другой механизм передачи приватных данных (Vault первым приходит в голову, хотя это явно оверхед). Ключ виден только в окружении сборки, но не в исходниках.

А вообще интересный опыт, дерзайте! Я сам дважды в одиночку писал приложения подобного рода (на разном стеке), прежде чем появился Obsidian, в котором все мои хотелки были воплощены)

Спасибо за развернутый комментарий. Я пересмотрю свой подход к шифрованию данных. Была мысль использовать переменные окружения, но посчитал этот подход менее безопасным) Также ради комментариев была создана мною статья.

Секретность шифрования должна определяться только секретностью ключа, использованного при шифровании. При этом следует предполагать, что алгоритм шифрования известен злоумышленнику.

Да, и гляньте на википедии "Принцип Керкгоффса".

Нельзя все чувствительные куски кода загнать в библиотеки?

Основная логика шифрования в том, что в шифровании логично не полагаться на "секрет" знание которого скомпрометирует все шифрование.

Обойти это очень просто - все личные данные надо вынести в конфигурационный файл сборки, и не включать его в репозиторий.

И правильно вам говорят - если вы боитесь, что исходный код шифрования позволит кому-то расшифровать ваши записи, значит, у вас очень плохое шифрование. Тем более, программы на .NET весьма дружественно декомпилируются.

А ключи от лицензий? Их тогда покупать всем, кто захочет пользоваться?

надеюсь это вы исправите

Насчёт алгоритмов шифрования и опенсурса - современные алгоритмы шифрования позволяют и с наличием опенсурс вполне надёжно шифровать данные, WireGuard тому пример

А почему решили писать свое? Не смотрели уже существующее разработки, тот же Obsidian например.

Ад зависимостей? Не, не слышал.

Написал свое, так как, хотелось назначать документам глобальные горячие клавиши, для максимально быстрого копирования текста в буфер обмена. И еще хотелось иметь особый минималистичный режим работы, который реализован в приложении как режим «Избранное». Я добавил описание этого режима в статью.

Обсидиан поддерживает markdown (оформление кода с подсветкой синтаксиса, вставка изображений, заголовки и прочее), перекрестные ссылки между документами.

Копировать текст кода из блока кода, который может находиться в целом смешанном гайде - 1 клик.

Есть вкладка "закладки" (bookmarks), где будут только "избранные" файлы. Ну, а история буфера обмена уже встроена с вин10, если войти в учётку Майкрософт, а не через локальную сидеть.

Синхронизация настраивается, учитывая, что это просто папки с файлами ".md" - хоть через Гугл/Яндекс/чтоугодно диск, хоть через гит.

А ещё там есть плагины...

В общем, рекомендую ознакомиться с софтиной. Скорее всего отпадет желание продолжать делать свою.

Ищу нормальное (не монструозное) апп. До сих пор ищу, так как еще не нашел.

Приложение - заметки, которое имело бы версии на андроид, линукс desktop и windows с возможностью синхронизации и не весило бы миллиард гигобайтов.

UpNote попробуйте, купил про и не жалею
Был и WizNote и Nimbus и Обсидиан

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

Обсиданыч не зависит от какой-либо серверной инфраструктуры. Конечно, есть у него действительно недостаток, это то что он closed-source, Но от чего либо, кроме самого его инсталлятора он не зависит.

Его пока и использую. Подкупает тем, что заметки точно никуда не денутся по независимым от меня причинам.

Обсидиан, но там для синхронизации придется чутка пострадать. А вообще, если хотите локальную БД с заметками и связями - очень рекомендую посмотреть в сторону anytype. Ребята пилят notion, но с локальной БД

Что в вашем представлении "не монструозное"?

То же самое, что в представлении "не монструозное" для нормальных людей.

А не как это, напр.: https://imgur.com/a/bYVSBAY

А пару лет назад оно весило около 10мб, а то и меньше.

Я тоже. В итоге остановился на My Note Keeper, андроидом пришлось пожертвовать. Второй вариант -EPIM, с локальной синхронизацией с андроидом.

Отличный пет-проект ?
Обязательно освой гитхаб и публикуй его как опенсорс. Никто в здравом уме не пойдёт скачивать и запускать не подписанный бинарник от нонейма

Зачем делать ненужный pet-проект? Я, например, мог бы подкинуть несколько идей, которые были бы полезны не только мне, но (я думаю) и другим, которые, в принципе, не так уж и сложно реализовать, и для которых я даже пути реализации знаю - просто у меня самого всё время либо времени нет, либо не доходят руки это полноценно в виде проекта сделать (т.е. на таком уровне, что "скачал и пользуйся").

Так подкиньте же, уважаемый, не томите скорбным ожиданием) Возможно не автор поста, но кто-нибудь другой загорится идеей.

Ну, вот, смотрите, вот такая давно уже идея. Кастомизируемый web-clipper. Фоновый процесс (возможно, сервис, или демон). Расширение для браузера передаёт в него просто какой-то URL страницы (или же содержимое страницы). Фоновый процесс по паттерну URL выбирает некоторую процедуру её разбора (которая заранее задаётся пользовательским скриптом), разбирает её, а потом отправляет в некоторое назначение (а возможные "места назначения" опять таки можно подключать в виде уже готовых плагинов - например, "сохранить как файл", "сохранить в буфер обмена", "отправить по почте" - это тоже надо сделать расширяемо, т.е. эти плагины можно делать, устанавливать, и подключать отдельно).

Вот, как пример. Читаю я статью Хабра и мне хочется её сохранить как текст MаrkDown - нажимаю в браузере кнопку, сервис по шаблону URL: "https://habr.com/ru/articles/(\d)+/?" находит (по наличию привязки к моему собственному скрипту) что речь идет о статье с Хабра, потом он загружает её HTML, разбирает его (например с помощью HTML Agility Pack) и передаёт её моему скрипту в виде разобранного объекта. Скрипт в свою очередь выбирает из объекта всё нужное (саму статью), форматирует её и отправляет на сохранение.

Или смотрю я какой-нибудь рецепт на "Еде", хочу сохранить. Снова нажимаю кнопку, и происходит то же самое, только скрипт уже выбирается другой - для этого случая.

Движок для различных скриптов тоже следует делать плагинами, чтобы подключать разные скрипты (например, PowerShell, Lua, JS, и т.п. - кому что больше по душе).

Читаю я статью Хабра и мне хочется её сохранить как текст MаrkDown

А вообще, существуют ли подобные инструменты, позволяющие статью Хабра сохранить, например, в MarkDown, а ещё лучше в PDF с картинками?

Да клипперы-то есть всевозможные. С ними беда в том, что они из страницы делают (допустим текст) так, как они считают нужным, и если хочешь чтобы все цивильно было, то после них все равно приходится руками всё подправлять и чистить. А мне вот хочется, чтобы я для тех страниц, что регулярно хочу сохранять, зная их структуру (просто посмотрев её в Dev Tools) мог запрограммировать (скриптом) то как мне её в тот же текст превратить. "На коленке" для какой-то страницы я могу это сделать вообще без проблем, но хочется чтобы все это было удобно и автоматизировано - зашел в какие-то настройки, задал там регулярное выражение для URL и вписал туда скрипт, а потом просто на такой же странице вызывал весь этот процесс одним нажатием кнопки расширения браузера.

Ну а всё-таки, есть готовый инструмент для сохранения статьи в PDF? Видел вроде на Хабре статью про это, но там было что-то не очень простое - чуть ли не какой-то скрипт на Питоне, который ещё надо установить, и к нему ещё какие-то дополнения вроде прослойки для создания PDF. Чего-то однокнопочного нет?

Хром расширение "PDF mage" для PDF и MarkDownload для md соответственно.

Просто распечатать страницу в PDF можно с помощью Print to PDF. Хочется, чтобы была только статья - без шапок сайта (которые сверху/справа/снизу), рекламы, комментариев и вообще всего лишнего.

Ну вот я выше предложил кому-нибудь это сделать, если так хочется pet-проект, и мне в комменты минусов поставили. Ничего странного, ведь писать свой собственный notepad с сохранением в БД и самописным шифрованием это гораздо интересней :)

А просто "распечатать в PDF" не подходит? :)

Хочется без лишнего - "шапки" сайта, комментариев и т.д.

Можно выделить текст и по правой кнопке на выделенный текст / печать.
Либо как вариант во многих браузерах (Firefox и т.д.) есть встроенное переключение на режим чтения, которое убирает все лишнее.
Бывают сайты с кривой версткой где приходится сперва через просмотр кода убирать все лишнее и потом уже на печать.

Ну, вот, примитивное "на коленке" (в MarkDown):

Hidden text
$ErrorActionPreference = "Stop"

[System.Reflection.Assembly]::LoadFrom((Join-Path $PSScriptRoot "HtmlAgilityPack.dll"))

function Get-HabrArticle {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory, Position = 0, ValueFromPipeline)]
        [ValidatePattern('^\d+$')]
        [string[]]
        $Id
    )

    process {
        $Id | ForEach-Object {
                Invoke-WebRequest "https://habr.com/articles/$_" -ErrorAction SilentlyContinue
            } |
            Select-Object Content |
            ForEach-Object {
                $doc = [HtmlAgilityPack.HtmlDocument]::new()
                $doc.LoadHtml($_.Content)
                Write-Output $doc.DocumentNode
            } |
            ForEach-Object {
                $h1 = $_.SelectSingleNode("//h1")
                Write-Output "# $($h1.InnerText)"
                Write-Output ""

                $_.SelectNodes("//div[@id='post-content-body']/div/div/div/*") |
                    ForEach-Object {
                        $el = $_
                        switch($el.Name) {
                            'h2' {
                                Write-Output "## $($el.InnerText)"
                            }
                            'h3' {
                                Write-Output "### $($el.InnerText)"
                            }
                            'p' {
                                Write-Output "$($el.InnerText)"
                            }
                            'figure' {
                                $img = $el.SelectSingleNode('./img')
                                if($img) {
                                    $attr = $img.Attributes
                                    Write-Output "![$($attr['alt'].Value)]($($attr['src'].Value) `"$($attr['title'].Value)`")"
                                }
                            }
                        }
                        Write-Output ""
                    }
            }
    }
}

Ссылки в тексте не понимает, но, в принципе, легко можно добавить. А, ну еще стоит, конечно, добавить списки (нумерованные и ненумерованные). Хотите - доделаю, на гитхаб потом ссылку дам :)

Было бы неплохо, спасибо :-)

Я думаю, проект все же нужен. Как минимум автору поста. Этого более чем достаточно)

Храните куски текста произвольного и, скорее всего, большого размера, прямо в бд? И не просто храните, а осуществляете по нему полнотекстовый поиск?

Может хотя бы индекс какой используете для этого? И SQLite точно не самый лучший вариант в таком случае

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

Но это чисто замечания, а так главное - чтобы самому нравилось, потому что народ не особо жалует попенсорс: то им не так, это им не так

Судя по скрину у вас Win10? Я тестировал запуск на Win10, все работало. Можно вас попросить прислать мне в личку запись из журнала событий Windows? Наверняка соответствующая запись об ошибке должна быть там.

Самая обычная win10 LTSB (Microsoft Windows [Version 10.0.17763.5696]). В журналах событий по времени запуска ничего нет.

x86? x64? arm? Этот бинарник только в Win x64 запустится.

Такой большой объем обусловлен включением в сборку целевой платформы .NET 8 и это с учетом компрессии (p:EnableCompressionInSingleFile=true), без компрессии сборка будет весить еще больше.

Если у вас .NET 8, то м.б. попробовать собрать как "Native AOT"?

Было бы здорово, но к сожалению приложение на WPF нельзя собрать как Native AOT. На данный момент это можно сделать с консольным приложением и ASP.NET Core.

Можно попробовать MAUI вместо WPF (которое, как мне сдаётся, у MS что-то не особо взлетело). Но, я просто вебный погроммист, поэтому мне сложновато сразу судить.

У меня есть урезанная версия Data Organizer на .NET MAUI, ее еще ни где не публиковал. Честно сказать, оно такое себе. Под Windows в платформе много чего нет. Под мобильные платформы, еще более-менее. В будущем хотелось бы реализовать его на Avalonia, но нужно будет как то компенсировать недостаток компонентов, которые в обилии имеются в WPF.

Тогда уж Avalonia. Там и AOT, и поддержка Linux.

Говорите, как будто приложений на электроне не видели. Там бы ещё в ОЗУ 1гб+ отожрали, а не только 200мб на накопителе.

Или нативных приложений на андроид, все клиентики банков по 200-500мб, хотя там ничего сложного и целиком джаву они с собой вроде как даже не несут.

Но желательно конечно поставлять приложение и без NET8, тогда вес был бы 1-20мб наверное

Раньше приходилось хранить все это в отдельных файлах в системе, но со временем их становилось все больше, и я начал забывать, что и где находится.

Не понял, как перенос иерархии папок из файловой системы ОС в иерархию папок внутри приложения помог поиску? А глобальный поиск по файлам есть в виндах давно. Что же поменялось? Быстрое превью заметок? А в Total Commander и прочих прогах этого нет?

Безумству храбрых поём мы славу!

Песню же)

UPD.: А, там в тексте оба варианта есть. Прошу прощения.

Ох, не так просто в эту сферу войти. Вот есть признанный обществом Obsidian и плагин postgresql-obsidian, если кому нужно именно хранение в базе. Зачем еще что-то нужно, когда есть решение одобренное комьюнити и имеющее сотни плагинов на разный вкус?

Возможно что open source-аналог Obsidian и взлетел бы, однако чтобы общемировое IT-комьюнити его одобрило, обязательным условием должна быть кроссплатформенность - многие работают на MacOS и даже Ubuntu.

Как то офлайн приложения для такого уже прошлый век. Тут по идее же сразу захочется в поездке доступ к своим файликам с телефона.

Плюсую. Главное сейчас - синхронизация между устройствами, а это без облака никак по-простому не сделать. Ну, и клиенты нужны под каждую крупную платформу. В идеале нативные, но даже для корпораций это непозволительная роскошь!

Ну да, есть уже 10+ лет OneNote.

Но тут-то разработчик хотел свое и именно локально хранить

А чому какой-то Material design, а не WinUI 3.0 или Fluent design

Планируете сделать синхронизацию через dropbox?

Хорошая идея, спасибо. Как исправлю свои ошибки в подходе к шифрованию, займусь изучением данного вопроса.

Интересное приложение. Неэлегантное (тяжёлое, тормознутое - бррр), но функционал в правильном направлении, если всё это оптимизировать и избавиться от бремени .net - то получится очень достойный конкурент остальным записникам.

Выделение текста по буквам и слова по двойному клику (плюс "жадное" выделение по словам), увеличение-уменьшение шрифта по Ctrl+MMB, открытие папки по двойному щелчку, родная кнопочка "Поверх всех окон" - прям то, чего сильно не хватает во многих альтернативах.

Казалось бы, подобных программ много, а на деле выбора и нет - всё сводится или к онлайну (кто в здравом уме будет хранить все свои записи в онлайне без возможности даже посмотреть без интернета?) или к глючному примитиву в стиле Обсидан или к разным уровням корявостей. Пока остановился на OneNote (с его странными блоками и непонятной базой), MyNotes Keeper (близок к идеалу, кроме страшного устаревшего интерфейса и некоторых шероховатостей) и EPIM (тоже куча шероховатостей) как наиболее удобных.

Не знаю, планируется ли дальнейшее развитие публичной версии, но удачи в разработке.

Советую на руборде создать тему.

В первую очередь не хватает поиска и замены как по отдельно взятой заметке, так и в целом по всем, импорта и экспорта простых txt-файлов, базового форматирования текста в обычном режиме, интерфейса под современные мониторы (часть букв в интерфейсе - совсем милиписечные и едва видимые), настройки цветов фона и текста в самом редакторе.

Спасибо за рекомендации, учту их в дальнейшем.

Аналоги: mempad, treepad, winguide

Всем привет! В настоящее время занимаюсь решением проблемы с безопасностью хранения зашифрованных данных, с которыми работает приложение. Нахожусь в поисках оптимального, сбалансированного решения. Есть следующие варианты:

  • Мастер-пароль больше не будет вшит в коде, а будет храниться в пользовательской переменной окружения (в реестре по пути HKEY_CURRENT_USER\Environment) в виде Base64 строки (понимаю что Base64 легко прочитать, но все же лучше, чем в открытом виде). Задавать значение переменной пользователь будет в приложении, в специальном диалоге. Для шифрования используется AES алгоритм взятый из статьи https://tomrucki.com/posts/aes-encryption-in-csharp/.

  • Есть вариант, который мне подсказали, использовать в алгоритме соль на основе уникальных характеристик девайса (сейчас соль фиксированная). Но в этом случае острой гранью встает вопрос с переносимостью приложения на другое устройство.

Буду благодарен советам по данной теме.

Чем не устроил Joplin? Или OneNote? Или ворох других?

Sign up to leave a comment.

Articles