shikhalev.org

Рубрикатор

Последние записи

ТехнологииПрограммированиеСофт

2021.09.12 • Иван Шихалев

xbash

Скриншот командной строки с xbash

Давно собирался и таки стартанул пет-проект — https://github.com/shikhalev/xbash.

Навеяно gitsh, который я когда-то активно использовал, но у него были проблемы с русской локалью, новыми версиями Git и так далее. При этом, на мой взгляд, gitsh сильно переусложнен, да и использование Ruby, при всей моей любви к этому языку, тут лишнее. Посему я решил сделать что-то подобное, но попроще, на чистом bash, и более универсальное.

Что делает?

Итак, что этот скрипт (набор скриптов) делает?

  1. Позволяет использовать субкоманды того же git, как непосредственные команды. Помимо git, так же можно коротким образом вводить субкоманды cargo1.

  2. Отображает в приглашении командной строки репозиторий, ветку, путь внутри репозитория и значок статуса (звездочка разных цветов на данный момент). Кроме того, вместо имени локального пользователя показывается e-mail пользователя, под которым идет запись в репозиторий2.

  3. Другие системы управления версиями, сборки и управления зависимостями могут быть добавлены просто и единообразно. Для Mer­cu­ri­al и Ruby­gems планирую сделать, как только руки дойдут.

Стадия разработки пока самая ранняя (хотя я уже пользуюсь и отлаживаю «наживую»), поэтому инсталлятора нет, есть инструкция по ус­та­нов­ке в фай­ле README.md.

  1. Если кто не знает, cargo — это система сборки и управления зависимостями языка Rust. 

  2. Для меня отображение именно пользователя репозитория, а не ло­каль­но­го, довольно существенно, поскольку на дан­ный момент я работаю из до­ма и у ме­ня имеются как личные, так и рабочие проекты, которые нужно вести под раз­ны­ми аккаунтами. 


Читать далее »

Linuxbashcargogitxbashкомандная строкапрограммированиепроекты

Нет комментариев   Добавить комментарий

ТехнологииWebПрограммированиеО себе

2021.07.09 • Иван Шихалев

Отчет о рефакторинге

Скриншот с официального сайта Jekyll
Скриншот с официального сайта Jekyll

Итак, я таки отрефакторил и обновил данный сайт. Почему нельзя было сразу делать правильно? Ну, в основном потому, что я впервые имел дело с Jekyll, изрядно подзабыл (а что-то и не знал) базовые приемы верстки… И так далее, и тому подобное.

Вторая (в моем случае) причина — это то, что, как это часто бывает, представление о желаемом результате уточнялось и формировалось в процессе достижения результата просто работающего. Соответственно, решение «исторически сложилось», если вы понимаете, о чем я. Любой проект ставит разработчика перед выбором: или бесконечное (и потому бесплодное) делание «как надо», или движение к идеалу через неидеальные, зато рабочие, варианты, которые, впрочем, без регулярного рефакторинга быстро становятся неулучшаемым и иногда не совсем рабочим болотом.

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


Читать далее »

CSSFont AwesomeGitHubGoogle FontsGoogle MapsHTMLJavaScriptJekyllLiquidPNGSASSSCSSSVGaspect-ratiodisplayflexgridkramdownmarkdownshikhalev.orgstickyблогивеб-шрифтыверсткаграблииконкимедиа-селекторыпробелырефакторингсайтыстатическая генерацияшрифты

Нет комментариев   Добавить комментарий

ТехнологииПрограммированиеRust

2021.03.16 • Иван Шихалев

Небольшой подводный камень в Rust

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

Опасность подстерегает нас, когда мы читаем данные из файла посредством std::​fs::​File.read()1, не используя при этом std::io::BufReader2, а самостоятельно выделяя блок памяти и читая в него.

Подводный камень тут вот в чем, цитирую документацию:

if n is 0, then it can indicate one of two scenarios:

  • This reader has reached its “end of file” and will likely no longer be able to produce bytes. Note that this does not mean that the reader will always no longer be able to produce bytes.
  • The buffer specified was 0 bytes in length.

Подчеркивание мое. Итак, если мы передаем методу read() буфер нулевой длины, то результат будет ровно тот же самый, что и если мы достигли конца файла, т.е. Ok(0).


Читать далее »

грабли

Нет комментариев   Добавить комментарий

ТехнологииПрограммированиеRubyПубликации«Системный администратор»Web

2020.01.11 • Иван Шихалев

Rack — основа веб-фреймворков в Ruby

Оригинал этой статьи опубликован в журнале «Системный администратор» №5 (150) за май 2015. Прошу обратить внимание на год — какие-то моменты могут расходиться с современными версиями языка и библиотек…

Библиотека Rack — простой объектный интерфейс для написания веб-приложений.

Слово «rack» в английском языке имеет множество значений, включая такие, как «пытка» и «разрушение»… Однако, надо полагать, название рассматриваемой библиотеки произошло от другой группы смыслов: «стойка», «штатив», «каркас» и т.д. Rack обеспечивает простой и в то же время удобный интерфейс, обеспечивающий взаимодействие между веб-сервером и приложением, позволяя программисту сосредоточиться исключительно на логике последнего.

Этот интерфейс достаточно низкоуровневый и не ограничивает разработчика каким-либо заранее заданным способом организации приложения и высокоуровневыми абстракциями. Соответственно, он и не предоставляет таких абстракций — это уже дело фреймворков, которые работают поверх него: Rails, Sinatra и других.


Читать далее »

Rack

Нет комментариев   Добавить комментарий

ТехнологииПрограммированиеБД

2019.03.04 • Иван Шихалев

Всё для людей!

Ковыряюсь тут с PostgreSQL и вот какую замечательную штуку обнаружил…

Собственно, про существование «updatable views» я знал, и давно. Но пока не доводилось использовать. И я думал, что для того, чтобы они заработали, нужно прописывать правила для всех действий. Однако нет — простые представления делаются изменяемыми автоматически, т.е. пишем, например:

create table something_data (
       id      bigint       not null,
       name    varchar(200) not null,
       deleted boolean      not null default false,
       constraint pk_something primary key (id)
);
create unique index uq_something_name on something_data(name)
                                   where (deleted = false);

create view something as
       select id, name from something_data
        where deleted = false;

… и всё, этого достаточно — можно обращаться к представлению something так же, как к таблице — вставлять, изменять, удалять по id.


Читать далее »

PostgreSQLSQL

Нет комментариев   Добавить комментарий

ТехнологииПрограммированиеRubyПубликации«Системный администратор»

2016.03.09 • Иван Шихалев

Средства самопознания в Ruby

Оригинал этой статьи опубликован в журнале «Системный администратор» №1-2 (146-147) за февраль 2015.

Что программа может знать о самой себе?

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

В данной статье я планирую рассмотреть те средства «самопознания», которые доступны для программ на Ruby.


Читать далее »

интроспекцияметапрограммирование

Нет комментариев   Добавить комментарий

ТехнологииПрограммированиеRubyПубликации«Системный администратор»

2016.01.27 • Иван Шихалев

Мета­программи­ро­вание в Ruby: разбор примера

Оригинал этой статьи опубликован в журнале «Системный администратор» №12 (145) за декабрь 2014.

Добавление собственных абстракций в объектную модель — это просто. И интересно.

Авторы книги «Programming Ruby: The Pragmatic Programmers’ Guide» называют метапрограммированием расширение и изменение абстракций языка (тогда как собственно программирование пользуется теми, что есть). Конечно, можно поспорить о том, что считать такой абстракцией, а что нет, однако нельзя не заметить, что в современных динамических языках, таких как Ruby или, например, Python, легко делаются некоторые вещи, которые в классических языках находились именно на языковом уровне и жестко определялись компилятором. Тут можно вспомнить, для примера, декораторы, о которых я писал в сентябре прошлого года1. И сейчас мы рассмотрим нечто подобное. В процессе я буду делать обобщающие отступления, переходя от частного примера к общим принципам программирования в Ruby.

  1. Статья «Декораторы в Ruby». «Системный администратор» № 9 (130), сентябрь 2013. Стр. 68–71. 


Читать далее »

метапрограммирование

Нет комментариев   Добавить комментарий

ТехнологииПрограммированиеRubyПубликации«Системный администратор»

2015.04.04 • Иван Шихалев

Ruby и многозадачность

Оригинал этой статьи опубликован в журнале «Системный администратор» №3 (136) за март 2014.

В статье рассматриваются основные средства работы с потоками (threads) и процессами в языке и стандартной библиотеке Ruby

Немного о терминологии: англоязычный термин «thread» на русский переводится в двух вариантах — как «поток» и как «нить». Второй вариант точнее и не вызывает неоднозначности с потоками данных (streams), однако первый уже прижился в качестве основного. Кроме того, есть еще производные термины и варианты вроде «многонитевость» (или «многонитность»), но они мне не встречались и, честно говоря, режут глаз. Поэтому я буду использовать «поток».

Прежде, чем перейти к описаниям имеющегося инструментария, хотелось бы заметить, что Ruby создавался не как специальный язык параллельного программирования, при этом во время его создания и становления многозадачность уже стала привычной и необходимой. Из этих двух посылок, в об­щем-то, можно вывести текущую картину: никаких специфических концепций мы в нем не увидим, только поддержку привычной для всех языков общего назначения модели с некоторыми нюансами реализации.


Читать далее »

многозадачностьмногопоточностьоптимизация

Нет комментариев   Добавить комментарий

ТехнологииПрограммированиеRubyПубликации«Системный администратор»

2015.04.01 • Иван Шихалев

Блоки и контекст в Ruby

Оригинал этой статьи опубликован в журнале «Системный администратор» №1–2 (134–135) за январь–февраль 2014.

Что стоит за конкретным идентификатором в данном окружении

Давайте разберемся с программным контекстом в Ruby: какие переменные и другие объекты доступны в конкретном месте программы, и как интерпретатор их ищет? Что обозначает конкретный идентификатор, откуда он берется? Почему отсюда, а не оттуда? И чему, наконец, в этом трижды перекинутом блоке будет равен self?

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


Читать далее »

замыканияконтекст

Нет комментариев   Добавить комментарий

ТехнологииПрограммированиеRubyПубликации«Системный администратор»

2015.03.31 • Иван Шихалев

Распределенный Ruby

Оригинал этой статьи опубликован в журнале «Системный администратор» №12 (133) за декабрь 2013.

Технология распределенного Ruby, или dRuby (Dis­­t­­ri­­bu­­ted Ruby), позволяет вызывать методы объектов, находящихся в другом процессе и/или на другом компьютере. При этом установка соединения, передача необходимых данных и тому подобное — скрыты от программиста, и использование удаленных объектов мало чем отличается от работы с объектами, заданными внутри программы.

Это не единственная технология RPC, доступная при про­­г­­рам­­ми­­ро­­ва­­нии на Ruby, однако более универсальные средства, такие как CORBA или XML-RPC, более сложны в использовании и требуют бо́льших накладных расходов (кроме того, поддержка CORBA не входит в стандартную библиотеку Ruby, соответственно, в сопровождении требует дополнительного внимания к совместимости версий и т.д.). В общем, если не требуется взаимодействие с программами, написанными на других языках, dRuby — очень хороший выбор, а с чем его едят и как правильно готовить, мы и рассмотрим в данной статье.


Читать далее »

RPCdRubyсериализациясети

Нет комментариев   Добавить комментарий