Category: it

Category was added automatically. Read all entries about "it".

Перенос данных с мёртвого лаптопа на внешний диск

Несколько лет назад умер ASUS. Но было подозрение, что жёсткий диск ещё жив. На нём было 3 раздела, 1 — с NTFS, 2 — с ext4 (для / и для /home). Зачем-то ещё swap был, но это не важно. Сейчас есть Macbook с переходником USB-C для USB портов наружу. Т.к. дисков с данными было много, обзавёлся ещё AgeStar HDD Box. Ну и целевой внешний диск на 2 TB.

Диск был без изюминок, с S-ATA портом. Коробке подошёл.

Коробку подключил к USB порту, NTFS раздел был распознан с помощью драйвера, шедшего в комплекте с NTFS for Mac тулой, данные перенёс быстро.

С ext4 разделами вышло сложнее. 

  • Шаг 1. Поставил osxfuse. Смoнтирoвал к маку:

sudo ext4fuse /dev/disk2s6 /Volumes/m1 -o allow_other
sudo ext4fuse /dev/disk2s7 /Volumes/m2 -o allow_other

Тут обнаружилась засада: /home оказался зашифрован с помощью ecryptfs (Ubuntu 14.04 передаёт привет). Файлы зашифрованные видны, но их не посмотреть, утилиты cat и прочие говорили: Operation is not implemented.

  • Шаг 2. Настраиваю VirtualBox с Ubuntu 16.04 (я начал нервничать и только позже додумался посмотреть, какая версия была установлена). Ставлю ext pack, guest add-on на виртуалку. Настраиваем shared folder между Host Darwin (OSX) и Target Ubuntu. Ставим ecryptfs-utils.
  • Шаг 3. Монтирую диск с разделами на shared folder, пробрасываю диск внутрь виртуалки. Выясняю, чтo из Ubuntu нет возможности даже прочесть файлы: Operation is not permitted. 
  • Шаг 4. Добавляю юзера и root виртуалки в vboxsf vboxuser vboxusers. Не помогает.
Collapse )

Front Web Framework: часть 4

Запилил TODO пример с использованием servant, servant-auth-cookie, wai-websockets. Ниже краткий отчёт о ходе реализации.

  • В Yesod MonadHandler добавляет к каждому запросу контекст сессии, к которому в любой момент времени можно получить доступ.
  • В куках в каждую сессию можно положить произвольную мапу, и работать с ней, как из хэндлера, так и из вебсокета.
  • В Servant такого счастья нет, надо заворачивать маршруты в куки с двух сторон, добавляя ручную обработку заголовков запроса и ответа. 
  • В пакете servant-auth нет поддержки шифрования кук, не очень безопасно получается.
  • В servant-auth-cookie (альтернатива) можно из API пакета собирать своё уютненькое шифрование с ротирующимися ключами. Для себя взял простой пример. Забавно, к пакету приложили руки мои знакомые Stack Builders из Эквадора и @mrkkrp, чьи пакеты я успешно юзал в прошлом. Пользуясь случаем, передаю привет и респект.
  • (Хотя zip он когда-то давно патчить отказался, чтобы обеспечить поддержку распаковки архива, созданного 7-Zip, как не RFC-compliant archive. Впрочем, я не в обиде).
  • servant-websockets оказался нежизнеспособным в плане анализа прилетающего реквеста, а точнее — его заголовков. Последовал совету @qnikst, взял wai-websockets и не пожалел! Респект!

Пока всё это делал, нашёл способ не завозить в Fay классы типов. 

Collapse )

Ещё одна интеграция

Опыт интеграций и миграций не проходит бесследно.

Запилена интеграция с ресурсом с посещаемостью 60K в день. Поставка аналитики туда работает в штатном режиме. А нам обратно — трафик. 

Простора для оптимизаций там масса. Например, выпилить d3 и делать SVG на сервере, а можно вообще cгенерировать и отдавать статику. Yesod должен выдержать, когда на него свалится всего 1 rps.

Это локальный успех. Даже если 0.1% будет переходить к нам, это +120 посетителей в день. Скоро будет видно. Пуск намечен на воскресенье.

Со следующей недели возобновляю разработку Front.

Front Web Framework: часть 3

28 февраля я в дичайшем угаре выступил на конференции #fprog_spb. В последний момент собрал пример для презентации, но демку не успел сделать (а зря). Слайды на коленке намутил из скриншотов. Невротик — он невротик и есть. Речь сквозила словами-паразитами, ссутулился до неузнаваемости, пережил этот вечер. Первый блин всегда комом, чего уж там.


Разгрёб фоновые задачи, начал лечение, остановил лечение, переболел. И наконец, допилил пример, поняв, что не понимаю, где рамки между клиентом и сервером, как выглядит абстракция, которую следует выделить для front.

Поэтому перехожу ко второй размерности фреймворка (из трёх задуманных пока), логичному решению, на мой взгляд: интеграции с серверными фреймворками. К имеющемуся Yesod добавляю Servant и иду далее по списку, чтобы отделить по крайней мере с одной стороны front от других.

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

Успех неизбежен.

Метамоделирование: часть 2

Дописал клиентскую часть и оглянулся. Очень тяжелая отладка. Был бы MVC framework, как в PureScript, — было бы легче. Но тут он добавляет лишних телодвижений. Зачем, если есть модель на сервере. Хотел было уже взяться прикручивать N2O, как тут меня осенило.

  • Типы можно шарить без выпендрёжа между GHC (сервером) и Fay (клиентом).
  • Декодер уже заложен в самом Fay (Fay.Convert): конструкторы типов вместе с данными замечательно раскладываются в JSON (в соответствующие слоты). Подсмотрел даже у Сноймана пример реализации!
  • Запилил пакет для вебсокетов на Fay (опубликую на Hackage, когда моя страничка заработает).
  • Затащил поддержку различных протоколов.
  • Переписываю рендеринг на сервере, хочу посмотреть, что выйдет в итоге.

Получается эдакий FRP на коленке. Вообще, я очень доволен тем, что вырисовывается. Открытым вопросом пока является проброс новых событий для новых элементов страницы, которым ещё предстоит появиться. Либо дернуть на стороне Fay, либо прямо JS на сервере сгенерировать. Там видно будет. Пока не хочу забивать этим голову.

Метамоделирование: часть 1

Число таблиц в базе данных стало зашкаливать. Было принято жёсткое решение — не позволять их числу расти. И тут приходят на помощь метамодели. Есть всякие. 

  • Есть метаописание SOA с генератором запросов. В таком случае в каком-нибудь Oracle используют пакет dbms_sql, а в таблицах лежат нарезанными куски запросов или запросы с макросами.
  • Есть графы и гиперграфы, вырождающиеся в нечто подобное тому, что творится в Facebook.
  • Есть иерархические метамодельки, которые на первый взгляд дружат с ООП, но на деле порождают ад, когда попытаешься натянуть на них подсистему с Workflow внутри. 
  • И ещё что-то, чего я не видел, конечно.

Как водится, я в сторонке стоял по большей части, когда другие метамоделировали! Но некоторые вещи всё же умудрился пощупать вплотную. 

Взял иерархическую метамодельку за основу и решил натянуть её на Haskell с его интересными ADT. СУБД в проекте — PostgreSQL. Да, с текущими драйверами постгреса в хаскеле пока дела обстоят туговато. Все они завязаны на libpq, в недрах которого синхронно гоняются строки. 

Нативных драйверов готовых нет, есть два экспериментальных: 

  • Hasql >= 0.20.
  • postgresql-wire (нет на Hackage).

А они уже очень скоро понадобятся. Потому как уже очень скоро я упрусь в тормоза.

Завёл пока «строку», «число» и «время» в кач-ве типов атрибутов. Завёл парочку объектных типов. Завёл рута-родителя. И начал собирать грабельки.

Collapse )

10 KLoC: achievement unlocked

Хобби-проект, стартовавший как сайтик-эксперимент, постепенно превратился в распределенную систему. Состав примерно такой...

Окружения 

  • лаптопа (DEV);
  • двух серверов (STAGING, PRODUCTION).

Компоненты

  • собственно, application server;
  • бот, работающий в режиме интеграции (см. сериалы «Web Scraper», «Парсер»);
  • телеграм-бот, про который я расскажу чуть ниже;
  • билд-деплой-тула, умеющая в матрицу «компонент» × «окружений» и билдить, чистить, деплоить, перезапускать.

Телеграм-бот

Бот работает по двум направлениям: 

  • шлёт админам ресурса баг-репорты (5XX коды, + некоторые критические уведомления (самодельная наколеночная Capacity management system: alarms, thresholds, metrics);
  • шлёт менеджерам уведомления о человеческих заявках.

Особенность бота в том, что в него ещё воткнут сервер с самописным API, удовлетворяющим исключительно мои требования — уметь принимать сообщения с разных окружений и доставлять разным пользовательским группам и всё с этим связанное. Так решена проблема с блокировкой телеграма, нет нужды слать запросы напрямую. 

Благодаря Servant, API прекрасно шарится без лишних движений между сайтом (клиент) и ботом (сервер).

А 10 KLoC — блин, это всё трехэтажные SQL, и hamlet (html) шаблоны, опердень ведь должна быть динамической, не так ли?

FProg November Meetup 2015

Оригинал данной статьи лежит по адресу: http://an-pro.org/posts/fprog-november-meetup.html


Общие слова


С ещё большим удовольствием посетил FProg November Meetup.


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

Collapse )

Web-программирование на Haskell

Туториал по Yesod


автор: Yann Esposito
Переводчики: swamp_agr, ownclo.

01_flying_neo
upd: обновлено для Yesod 1.2
TL;DR: Простое пособие по Yesod. Yesod - это web-фреймворк на Haskell. Вам даже не нужно знать Haskell.

Почему Haskell?

Collapse )

Построение графиков eps в gnuplot с динамическим размером шрифта

 Ниже приведена многоэтапная процедура построения графика в формате Encapsulated PostScript с помощью программы gnuplot. Главная особенность данной процедуры заключена в том, что числовые и текстовые надписи на изображении могут быть, вообще говоря, с произвольным размером шрифта.

I этап. Построение графика в Gnuplot.
 

Создадим простой график

$ gnuplot

set terminal epslatex newstyle color solid size 9cm, 8cm # размеры рисунка можно варьировать как угодно
set output "testplot.tex"
unset key
set format xy "$%g$"
set xtics 2.5
set ytics 2.5
set xlabel '$x$'
set ylabel offset +3.0 '$y$'
set xrange [0:5.5]
set yrange [-5.5:5.5]
plot sqrt(x) lt -1, -sqrt(x) lt -1


При желании можно создать файл с расширением .gnu (например, test1.gnu), поместив в него необходимые для построения графика команды, тогда в командной строке достаточно выполнить следующий код:

$ gnuplot test1.gnu

На выходе имеем два файла: testplot.eps, testplot.tex. В первом - содержатся только линии, подписей нет!!! Во втором - информация о подписях осей, а также числовые значения возле насечек на осях. 


II этап. Компиляция изображения.

Для того, чтобы собрать эти два файла в один, создадим файл build.tex. Его содержимое приведено ниже:

\documentclass[a4paper]{extreport}
\usepackage{graphics}
\usepackage{graphicx}
\usepackage{nopageno}
\usepackage{txfonts} % данный пакет позволяет вносить текст в изображение
\usepackage[usenames]{color}
\usepackage[14pt]{extsizes} % данный пакет подключает отличные от 11 и 12 размеры шрифта, [в скобках]

\begin{document}
\begin{center}
\input{testplot}
\end{center}
\end{document}


Теперь скомпилируем dvi-файл командой

$ latex build.tex

После выполнения данной команды, мы должны получить страницу в начале которой по центру находится рисунок с надписями и подписями.

III этап. Редактирование изображения.

$ dvipdf build.dvi # переводим в pdf
$ pdfrcop build.pdf # обрезаем pdf до 9x8 см
$ pdf2ps build.pdf img1.ps # конвертируем в PostScript
$ ps2eps img1.ps # переводим в Encapsulated PostScript
$ rm build.dvi build.aux build.log # удаляем мусор


На выходе получился eps-файл с текстом 14-го шрифта.

Для автоматизации процесса можно создать Makefile или написать скрипт.