Pull to refresh
81
0

Программист-фрилансер

Send message

Интернет на магнитах 6 — Децентрализованные комментарии

Reading time 3 min
Views 2.9K

На редите я наткнулся на вопрос: Как комментировать торренты? (how do i comment on torrents?)


Из предложенных решений было только комментировать на сайте где торрент файл был взят. Но это вариант далеко не всегда доступен. Особенно когда это поисковик по типу BtDigg.


На этом вопрос был закрыт и дать другой ответ на него стало не возможно.


Но есть ещё одно простое решение. Это комментировать где угодно просто указывая хеш того что комментируешь и по этому хешу искать комментарии.

Читать дальше →
Total votes 19: ↑18 and ↓1 +17
Comments 19

Горизонтальный блог

Reading time 3 min
Views 6.8K

image


Всё больше новостные сайты и блоги превращаются в длинную портянку которую от статьи к статье надо долго мотать по вертикали. Чтобы облегчить прокрутку одни сайты скрывают часть статьи под спойлером. Другие сайты отображают часть статьи в ленте а для прочтения её заставляют перейти на отдельную страницу.


Я подумал почему бы не воспользоваться горизонталью? Разработчики браузеров дали достаточно CSS инструментов чтобы выстроить статьи по горизонтали и сделать удобный переход между ними.


Я создал минимальную демку которая работает за счёт CSS и имеет такие свойства:


  1. Статьи выстраиваются по горизонтали.
  2. Часть статьи не надо скрывать под спойлером так как вертикальная прокрутка для каждой статьи индивидуальна.
  3. На следующую статью можно перейти из любого места предыдущей прокрутив колёсико мышки с зажатым Shift или смахнув статью влево на планшете.

В статье я разберу СSS используемый для горизонтального блога.

Читать дальше →
Total votes 14: ↑12 and ↓2 +10
Comments 28

Прокачиваем адресную строку браузера

Reading time 7 min
Views 25K

С некоторых пор адресная строка не только отображает адрес текущей страницы но и позволяет открыть страницу поиска в разных поисковых системах. Но далеко не все сайты добавили OpenSearch чтобы можно было легко добавить внутренний поиск по сайту.


В первой части я расскажу как самостоятельно добавить поиск по сайту и другие сервисы. А во второй части расскажу какой сервис кроме поиска при помощи OpenSearch подсказок может организовать сайт.


OpenSearch — набор технологий, позволяющих веб-сайтам и поисковым системам публиковать результаты поиска в форматах, удобных для распространения и сбора.
Читать дальше →
Total votes 28: ↑27 and ↓1 +26
Comments 11

Прогрессивная загрузка XML страниц

Reading time 14 min
Views 3.4K
Прогрессивная загрузка XML страниц — это загрузка с одновременным показом уже загруженных и обработанных частей XML страницы пока XSLT шаблон всё ещё обрабатывает остальные части.

image


У нас есть очень большой XML. Это статья с очень большим количеством комментариев. На медленном и нестабильном мобильном интернете её загрузки можно и не дождаться. Во время загрузки случается обрыв связи и XML остаётся не догруженным. Казалось бы можно просто обновить страницу и браузер бы просто догрузил недостающую часть. Но нет. Браузер грузит страницу заново и снова это не удаётся и мы видим ошибку вместо страницы.


Но выход из этой ситуации есть. Мы разделим XML на маленькие кусочки которые будут успевать загрузиться на медленном канале и попадут в кеш. Бонусом мы получаем защиту от недогруза и прогрессивную загрузку.

Читать дальше →
Total votes 9: ↑8 and ↓1 +7
Comments 0

XML сайты в результатах поиска

Reading time 6 min
Views 6.3K

Что такое XML сайт


XML сайт это сайт, страницы которого являются простыми XML файлами с MIME типом "text/xml" "application/xml"(XML Media Types). Они содержат только уникальные данные для этой страницы.


В таком XML файле задаётся ссылка на XSLT шаблон, который преобразует XML в HTML или в XHTML в браузере пользователя.


Проблема


Для классических html веб страниц поисковики в качестве заголовка отображают содержимое тега title. В описании отображается кусочки текста с найденными ключевыми словами или содержимое тега meta description.


Поисковики обычно не исполняют скрипты на страницах которые индексируют и соответственно не видят конечный вариант страницы после их исполнения. Соответственно они не видят теги title и meta которые вставляются XSLT шаблоном. Они индексируют текст который есть в XML документе как есть.


Решение


Наша задача правильно добавить теги title и meta в XML чтобы браузер, поисковик и меседжер в котором отправляется ссылка на страницу их понимали.


Таким же образом можно будет добавить и другие HTML теги для поисковиков, меседжеров и даже браузера если он вдруг не исполнит XSLT шаблон.


результат
Google
image
Yandex Webmaster
image
Читать дальше →
Total votes 7: ↑6 and ↓1 +5
Comments 28

Межпланетная файловая система — Простой блог в IPFS при помощи XSLT

Reading time 13 min
Views 5.5K

Существует проблема: У сайта в IPFS нет возможности использовать серверные скрипты для формирования страницы. Если использовать генерацию страниц перед загрузкой то добавив новый пункт меню в каждую страницу мы изменим хеш этих страниц. Так что всю сборку страниц нужно производить силами браузера.


Обычно формируют содержание страниц при помощи JavaScript. Это знакомая технология но у неё есть свои недостатки.


Я буду использовать XSLT. Это древняя технология шаблонов которая давно встроена в браузеры но мало кто ей пользуется. Возможно потому что шаблоны заставляют писать много текста и из за путаницы с пространствами имён и множества ошибок без внятного объяснения. Также не смотря на то что есть уже XSLT 3.0 в браузерах по прежнему доступен только XSLT 1.0.


XSLT работает так:


  1. Пользователь открывает в браузере XML документ.
  2. В заголовке XML документ содержит ссылку на XSLT шаблон.
    <?xml-stylesheet href="xslt/запись.xslt" type="text/xsl" ?>
  3. Шаблон в браузере на основе XML документа и других данных формирует xHTML документ.
  4. Браузер отображает полученный xHTML документ.

Привязав множество страниц к одному шаблону можно менять отображаемый xHTML документ не меняя XML документы. Таким образом при смене дизайна не будет меняться хеш XML документов а значит старые их копии будут источниками для новых в IPFS.


Для поисковиков в данном способе тоже есть плюсы. Они ограничиваются обработкой XML документа получая только уникальный контент страницы без элементов навигации и остальных блоков которые повторяются на каждой странице.


image

Читать дальше →
Total votes 9: ↑9 and ↓0 +9
Comments 8

Качаем 16GB торрент через планшет с 4GB свободного места

Reading time 3 min
Views 11K


Задача:


Есть ПК без интернета но есть возможность перекинуть файл по USB. Есть планшет с интернетом с которого этот файл можно перекинуть. На планшет можно скачать нужный торрент но не достаточно свободного места. Файл в торренте один и большой.


Путь к решению:


Я запустил торрент на загрузку. Когда свободное место почти подошло к концу я поставил загрузку на паузу. Подключил планшет к ПК и переместил файл с планшета на ПК. Отжал паузу и к моему удивлению файл был снова создан и торрент продолжил качаться дальше как ни в чем не бывало.


Благодаря тому что торрент клиент устанавливает sparse флаг файлу в который записывает полученные данные система не пытается зарезервировать сразу 16GB и не возникнет ошибки при попытке записи в файл дальше 4GB.


Повторив процедуру четыре раза я получил на ПК четыре файла в котором разные части одного и того же торрента. Теперь осталось собрать их воедино. Процедура по сути простая. Нужно заменить нуль байты на другое значение если оно есть в данной позиции в одном из четырёх файлов.


Мне казалось что такая простая программка должна быть в интернете. Неужели никто не сталкивался с такой задачей? Но я понял что даже не знаю по каким ключевым словам её искать. Поэтому я быстро накидал Lua скрипт под эту задачу а теперь уже и оптимизировал его. Им и хочу поделиться.

Читать дальше →
Total votes 30: ↑27 and ↓3 +24
Comments 44

Хватит качать и хранить нули

Reading time 13 min
Views 15K

Скачиваемый файл заполнен нулями


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


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


Свойства файла заполненного нулями

Файл размером 16MB занимает на диске 4KB


Также, показывая что участки скачиваемого файла заполнены нулями, можно мотивировать пользователя отказаться от скачивания и распространения битого файла. В моей версии Shareaza эти участки помечаются красной полосой сверху на полосе прогресса загрузки файла.


Откуда берутся нуль-блоки в файле


  1. Раздающий не дождался полного скачивания и проверки файла и выложил неполный(partial) файл.
  2. Результат повреждения сектора диска раздающего.

Это те варианты, которые пришли в голову.


Почему эти файлы продолжают распространяться


  1. Видео/аудио файл может иметь нуль-блок в середине и спокойно воспроизводится, просто перескакивая то место, где попался нуль-блок. Тем самым он может казаться целым.
  2. Образ диска также может иметь нуль-блоки в разных местах и это проявит себя только при попытке чтения файлов из этих блоков.
Читать дальше →
Total votes 30: ↑22 and ↓8 +14
Comments 90

DNS over TLS — Шифруем наши DNS запросы с помощью Stunnel и Lua

Reading time 5 min
Views 20K


источник изображения


DNS (англ. Domain Name System — система доменных имён) — компьютерная распределённая система для получения информации о доменах.

TLS (англ. transport layer security — Протокол защиты транспортного уровня) — обеспечивает защищённую передачу данных между Интернет узлами.

После новости "Google Public DNS тихо включили поддержку DNS over TLS" я решил попробовать его. У меня есть Stunnel который создаст шифрованный TCP туннель. Но программы обычно общаются с DNS по UDP протоколу. Поэтому нам нужен прокси который будет пересылать UDP пакеты в TCP поток и обратно. Мы напишем его на Lua.


Вся разница между TCP и UDP DNS пакетами:


4.2.2. TCP usage
Messages sent over TCP connections use server port 53 (decimal). The message is prefixed with a two byte length field which gives the message length, excluding the two byte length field. This length field allows the low-level processing to assemble a complete message before beginning to parse it.

RFC1035: DOMAIN NAMES — IMPLEMENTATION AND SPECIFICATION


То есть делаем туда:


  1. берём пакет из UDP
  2. добавляем к нему в начале пару байт в которых указан размер этого пакета
  3. отправляем в TCP канал

И в обратную сторону:


  1. читаем из TCP пару байт тем самым получаем размер пакета
  2. читаем пакет из TCP
  3. отправляем его получателю по UDP
Читать дальше →
Total votes 27: ↑22 and ↓5 +17
Comments 21

Межпланетная файловая система — тривиальный хеш (identity), DAG блок и Protocol Buffers

Reading time 7 min
Views 6K

Недавно в IPFS добавили поддержу тривиального (identity) хеша. В своей статье я расскажу о нём и покажу как его можно использовать.


Напомню: InterPlanetary File System — это новая децентрализованная сеть обмена файлами (HTTP-сервер, Content Delivery Network). О ней я начал рассказ в статье "Межпланетная файловая система IPFS".

Обычно при хешировании проходя через хеш-функцию данные необратимо "сжимаются" и в результате получается короткий идентификатор. Этот идентификатор позволяет найти данные в сети и проверить их целостность.


Тривиальный хеш — это сами данные. Данные никак не изменяются и соответственно размер "хеша" равен размеру данных.


Тривиальный хеш выполняет ту же функцию что и Data: URL. Идентификатор контента в этом случае содержит сами данные вместо хеша. Это позволяет вкладывать дочерние блоки в родительский делая их доступными сразу после получения родительского. Также можно включать данные сайта непосредственно в DNS запись.


Для примера закодируем текстовую строку "Привет мир" в идентификатор контета(CID) с тривиальным хешем.
image

Читать дальше →
Total votes 21: ↑20 and ↓1 +19
Comments 6

Получаем разницу между бинарными файлами при помощи vcdiff

Reading time 2 min
Views 6K

tortoise.jpg tortoise_bad.jpg


Понадобилось мне это для того чтобы понять в каком месте и как файл JPEG испорчен в процессе передачи.


VCDIFF — формат и алгоритм для дельта кодирования. Описан в RFC 3284.

Дельта-кодирование (англ. Delta encoding) — способ представления данных в виде разницы (дельты) между последовательными данными вместо самих данных.

Для примера я использую текстовые файлы в кодировке Windows-1251 для наглядности. Но с таким же успехом это могут быть и бинарные файлы.


Исходники:


"копия    текст    копия"       ( source.txt )
"копия    изменения    копия"   ( target.txt )

Нужно получить разницу между файлами:


"         изменения         "   ( source.txt -> target.txt )
"         текст         "       ( target.txt -> source.txt )

Я пользуюсь программой xdelta3 но думаю подойдёт любая которая работает с форматом vcdiff.


Как получить


Нам понадобится ещё один файл заполненный пробелами:


"                           " ( spaces.txt )

Он должен быть больше или равен по размеру файлу источнику ( source.txt )


Команда:


xdelta3 -e -A -n -s source.txt target.txt | xdelta3 -d -s spaces.txt

Результат:


         изменения         

Использованные флаги:
-e — создание дельты
-A — убирает лишние заголовки
-n — убирает crc (он не даёт применить дельту с другим источником)
-s [файл] — источник с которым сравнивается целевой файл и восстанавливается
-d — получение целевого файла из дельты и источника

Как это работает
Total votes 14: ↑12 and ↓2 +10
Comments 25

Compact varint — уникальность и большие значения за ту же стоимость

Reading time 9 min
Views 7K

UPD 2018.03.15: Git давно использует свой вариант compact varint. Различия в послесловии.


Внимание: Код представленный в статье немного отличается от оригинальных EncodeVarint и DecodeVarint и даёт другие результаты. Будьте внимательны.


В multiformats/unsigned-varint обсуждении правильной записи числа в varint было замечено что многие числа в оригинальном varint могут быть записаны в последовательности разной длинны. Это даст разные блоки и их хеши при идентичных значениях кодированных в протобуфер.


Оригинальный varint


Оригинальный varint просто делит число на кусочки по 7 бит. И записывает их в порядке от младшего к старшему добавляя к каждому кусочку старший 8ой бит (MSB — most significant bit). Значение этого бита зависит от того последний это кусочек (0) или нет (1).


Таким образом например значение 0 мы можем записать во многих вариантах:


  1. 0000 0000 (0x00) varint = 0
  2. 1000 0000 0000 0000 (0x8000) varint = 0
  3. 1000 0000 1000 0000 0000 0000 (0x808000) varint = 0
    и так далее.

Compact varint


Я подумал что можно начинать значения контейнера большего размера от максимального значения предыдущего контейнера + 1. Ведь если мы используем контейнер такого размера то число должно быть больше максимума предыдущего контейнера.

Читать дальше →
Total votes 13: ↑12 and ↓1 +11
Comments 18

Делаем дырки в торрентах освобождая место и оставаясь на раздаче (часть 1)

Reading time 8 min
Views 6.3K

image
Предупреждение: Этот график сделан для скрипта второй части статьи за которую я ещё не брался. Поэтому не очень обращайте внимание на данные в нём. Графики для этой статьи в конце.


Информацию из этой статьи используйте на свой страх и риск. Мы будем стирать данные из файлов. Статья написана под операционную систему Windows и файловую систему NTFS. Также в статье много изображений.


Что такое разреженный файл


Разрежённый файл (англ. sparse file) — файл, в котором последовательности нулевых байтов[1] заменены на информацию об этих последовательностях (список дыр).

Дыра (англ. hole) — последовательность нулевых байт внутри файла, не записанная на диск. Информация о дырах (смещение от начала файла в байтах и количество байт) хранится в метаданных ФС.

На Geektimes также есть небольшая статья о них: "Разреженные файлы в NTFS"


Операционная система по умолчанию не создаёт разреженные файлы. Этот флаг можно установить файлу программно или при помощи утилиты.


Устанавливаем флаг при помощи утилиты:


fsutil sparse setflag <имя файла>
Читать дальше →
Total votes 13: ↑12 and ↓1 +11
Comments 19

Межпланетная файловая система — Переключаем свой сайт на localhost (локальный шлюз IPFS)

Reading time 5 min
Views 11K

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


Пользователю это даст быстрый доступ к его локальной копии нашего сайта.


Напомню: InterPlanetary File System — это новая децентрализованная сеть обмена файлами (HTTP-сервер, Content Delivery Network). О ней я начал рассказ в статье "Межпланетная файловая система IPFS".


image

Читать дальше →
Total votes 12: ↑12 and ↓0 +12
Comments 5

Межпланетная файловая система — Локализуем глобальный шлюз или сайты в IPFS

Reading time 4 min
Views 2.2K

Мы научимся переключать на свой локальный шлюз IPFS сайты, которые этого ещё не делают сами автоматически. Создадим им общий SSL сертификат при помощи OpenSSL в комплекте со Stunnel.


Напоминаю: InterPlanetary File System — это новая децентрализованная сеть обмена файлами (HTTP-сервер, Content Delivery Network). О ней я рассказывал в статье "Межпланетная файловая система IPFS".

image

Читать дальше →
Rating 0
Comments 1

А давайте включим Encrypted SNI на своих сайтах

Reading time 1 min
Views 1.5K
Server Name Indication (SNI) — расширение компьютерного протокола TLS[1], которое позволяет клиентам сообщать имя хоста, с которым он желает соединиться во время процесса «рукопожатия».

Проблема SNI была в том что имя сайта идёт в открытом виде. И провайдер используя его может заблокировать сайт или анализировать интересы пользователей.


ESNI — тот же SNI только зашифрованный открытым ключом хостинг провайдера.


О нём уже было пара статей на хабре:


  1. CloudFlare реализовала поддержку Encrypted SNI
  2. Стандарт Encrypted SNI реализован в Firefox Nightly
Читать дальше →
Rating 0
Comments 0

Межпланетная файловая система — больше нет необходимости копировать в сеть

Reading time 3 min
Views 19K

Всем хороша идея IPFS но вот только был один недостаток у неё. Данные загружаемые в сеть копировались в хранилище блоков удваивая занимаемое ими место. Более того файл резался на блоки которые мало пригодны для повторного использования.


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


Также появился новый тип идентификаторов. Его мы тоже разберём.


Напомню: InterPlanetary File System — это новая децентрализованная сеть обмена файлами (HTTP-сервер, Content Delivery Network). О ней я начал рассказ в статье "Межпланетная файловая система IPFS".

image

Читать дальше →
Total votes 24: ↑22 and ↓2 +20
Comments 15

Интернет на магнитах 5 — Маяки и сообщения (личные, публичные и обновления)

Reading time 8 min
Views 4.2K

Я вспомнил что не рассказал важную часть для обеспечения возможности общения и обновления контента в P2P сетях.


Не все P2P сети имеют возможность отправки и приёма личных сообщений. Также не всегда сообщение можно оставить в оффлайн. Мы исправим этот недостаток используя три возможности P2P сетей: поиск файла, просмотр шары(списка опубликованных файлов) или комментарии к файлу.


Как это работает


Шаблон маяка создаётся однократно и используется для создания маяков для связи с автором.


Общий алгоритм получения


  1. Публикуется шаблон маяка.
  2. Формируется маяк.
  3. Поиск этого маяка и файла с хешем маяка в имени.
  4. Загрузка найденных файлов или просмотр шары источников маяка.

Общий алгоритм отправки такой


  1. Пишем сообщение.
  2. Шифруем открытым ключом адресата.
  3. Формируем маяк по шаблону адресата.
  4. Получаем хеш от маяка и вставляем в имя файла с сообщением.
  5. Публикуем маяк и файл с сообщением в p2p сетях.

Наше сообщение и маяк свободно могут копировать другие участники сети. Так как оно зашифровано они не смогут его прочитать но помогут его держать онлайн пока его не получит адресат.

Читать дальше →
Total votes 13: ↑13 and ↓0 +13
Comments 0

Хочу отказаться от услуг РосКомНадзора по защите меня от информации (в сети). Как это сделать?

Reading time 3 min
Views 94K

"Какая форма заявления должна быть? Куда подавать?"


Я задал (кеш гугла) такой вопрос на Тостере. Его удалили через некоторое время, так как он "вне тематики ресурса". Далее я попросил у модератора разъяснить поподробней и он ответил: "Это вопрос дискуссионный и на него не существует однозначного ответа".


За время пока вопрос существовал я получил несколько ответов:


1 Обратиться в Конституционный суд.
2 Оформить визу и выехать из юрисдикции полномочий РосКомНадзора.


Задав такой же вопрос интернету, оказалось, что не я один задался этим вопросом. Пользователь zakabum сайта RuTracker.org выложил на форуме образец заявления (зеркало) которое необходимо подать провайдеру. А также выкладывает новые свои заявления в ходе переписки со своим провайдером.

Читать дальше →
Total votes 168: ↑126 and ↓42 +84
Comments 686

Хостим сайт в межпланетной файловой системе IPFS под Windows

Reading time 5 min
Views 12K

Прошло некоторое время от начала моих экспериментов с хостингом простых сайтов в IPFS. Запустил я свой IPFS клиент под Windows и у меня есть теперь что дополнить к предыдущей статье "Публикуем сайт в межпланетной файловой системе IPFS"


  1. Решение проблемы c utf-8 в консоли Windows XP.
  2. Своя страница 404
  3. Корректная загрузка сайта с разных URL

Напомню: InterPlanetary File System — это новая децентрализованная сеть обмена файлами (HTTP-сервер, Content Delivery Network). О ней я начал рассказ в статье "Межпланетная файловая система IPFS".

image

Читать дальше →
Total votes 14: ↑14 and ↓0 +14
Comments 3

Information

Rating
Does not participate
Registered
Activity